From eed6da0b44d93eef707694bf14bfa53936585be8 Mon Sep 17 00:00:00 2001 From: Mukesh Murugan Date: Sat, 6 Sep 2025 15:23:25 +0530 Subject: [PATCH 1/4] initial cleanup --- .github/release-drafter.yml | 61 - .github/workflows/blazor.yml | 55 - .github/workflows/changelog.yml | 24 - .github/workflows/nuget.yml | 23 - .github/workflows/webapi.yml | 57 - .template.config/icon.png | Bin 153939 -> 0 bytes .template.config/ide.host.json | 5 - .template.config/template.json | 62 - FSH.StarterKit.nuspec | 24 - README-template.md | 0 README.md | 95 - assets/fullstackhero-dotnet-starter-kit.png | Bin 103945 -> 0 bytes compose/.env | 11 - compose/docker-compose.yml | 195 - compose/grafana/config/grafana.ini | 16 - .../provisioning/dashboards/default.yml | 11 - .../provisioning/datasources/default.yml | 69 - .../dashboards/aspnet-core-endpoint.json | 933 - compose/grafana/dashboards/aspnet-core.json | 1332 - .../dashboards/dotnet-otel-dashboard.json | 2031 -- .../grafana/dashboards/logs-dashboard.json | 334 - compose/grafana/dashboards/node-exporter.json | 23870 ---------------- compose/jaeger/jaeger-ui.json | 8 - compose/loki/loki.yml | 44 - compose/otel-collector/otel-config.yaml | 78 - compose/prometheus/prometheus.yml | 24 - src/.dockerignore | 32 - src/.editorconfig | 402 +- src/Core/Core.csproj | 13 + src/Core/Domain/Entities/AuditableEntity.cs | 32 + src/Core/Domain/Entities/Entity.cs | 12 + src/Core/Domain/Interfaces/IAuditable.cs | 8 + src/Core/Domain/Interfaces/IDomainEvent.cs | 5 + .../Domain/Interfaces/IHasDomainEvents.cs | 7 + src/Core/Domain/Interfaces/ISoftDelete.cs | 7 + src/Core/Domain/Interfaces/ITenantOwned.cs | 6 + src/Core/Storage/FileType.cs | 24 + src/Core/Storage/FileUploadRequest.cs | 7 + src/Core/Storage/IStorageService.cs | 10 + src/Data/Data.csproj | 6 + src/Directory.Build.props | 64 +- src/Directory.Packages.props | 84 +- src/Dockerfile.Blazor | 13 - src/FSH.Framework.slnx | 12 + src/FSH.Starter.sln | 287 - src/GetToken.http | 10 - src/Infrastructure/Infrastructure.csproj | 14 + src/Shared/Authorization/AppConstants.cs | 16 - .../ClaimsPrincipalExtensions.cs | 41 - src/Shared/Authorization/FshActions.cs | 13 - src/Shared/Authorization/FshClaims.cs | 11 - src/Shared/Authorization/FshPermissions.cs | 77 - src/Shared/Authorization/FshResources.cs | 15 - src/Shared/Authorization/FshRoles.cs | 17 - src/Shared/Authorization/IdentityConstants.cs | 6 - src/Shared/Authorization/TenantConstants.cs | 16 - src/Shared/Constants/SchemaNames.cs | 7 - src/Shared/Shared.csproj | 11 +- .../Abstractions/IEndpointDefinition.cs | 8 + src/Web/Endpoints/Extensions.cs | 25 + .../Logging/Enrichers/TenantIdEnricher.cs | 39 + .../Logging/SerilogExtensions.cs | 28 + src/Web/Web.csproj | 17 + src/api/framework/Core/Audit/AuditTrail.cs | 13 - src/api/framework/Core/Audit/IAuditService.cs | 5 - src/api/framework/Core/Audit/TrailDto.cs | 37 - src/api/framework/Core/Audit/TrailType.cs | 8 - src/api/framework/Core/Auth/Jwt/JwtOptions.cs | 19 - .../framework/Core/Caching/CacheOptions.cs | 6 - .../Core/Caching/CacheServiceExtensions.cs | 42 - .../framework/Core/Caching/ICacheService.cs | 16 - src/api/framework/Core/Core.csproj | 19 - .../framework/Core/Domain/AuditableEntity.cs | 18 - src/api/framework/Core/Domain/BaseEntity.cs | 23 - .../Core/Domain/Contracts/IAggregateRoot.cs | 7 - .../Core/Domain/Contracts/IAuditable.cs | 9 - .../Core/Domain/Contracts/IEntity.cs | 14 - .../Core/Domain/Contracts/ISoftDeletable.cs | 7 - .../Core/Domain/Events/DomainEvent.cs | 7 - .../Core/Domain/Events/IDomainEvent.cs | 4 - .../Core/Exceptions/CustomException.cs | 17 - .../Core/Exceptions/ForbiddenException.cs | 14 - .../framework/Core/Exceptions/FshException.cs | 21 - .../Core/Exceptions/NotFoundException.cs | 11 - .../Core/Exceptions/UnauthorizedException.cs | 15 - src/api/framework/Core/FshCore.cs | 5 - .../CreateOrUpdateRoleCommand.cs | 8 - .../CreateOrUpdateRoleValidator.cs | 11 - .../UpdatePermissionsCommand.cs | 6 - .../UpdatePermissionsValidator.cs | 13 - .../Core/Identity/Roles/IRoleService.cs | 16 - .../framework/Core/Identity/Roles/RoleDto.cs | 9 - .../Generate/TokenGenerationCommand.cs | 18 - .../Features/Refresh/RefreshTokenCommand.cs | 14 - .../Core/Identity/Tokens/ITokenService.cs | 11 - .../Identity/Tokens/Models/TokenResponse.cs | 2 - .../Users/Abstractions/ICurrentUser.cs | 19 - .../Abstractions/ICurrentUserInitializer.cs | 9 - .../Users/Abstractions/IUserService.cs | 39 - .../Core/Identity/Users/Dtos/UserDetail.cs | 21 - .../Identity/Users/Dtos/UserRoleDetail.cs | 8 - .../AssignUserRole/AssignUserRoleCommand.cs | 7 - .../ChangePassword/ChangePasswordCommand.cs | 7 - .../ChangePassword/ChangePasswordValidator.cs | 18 - .../ForgotPassword/ForgotPasswordCommand.cs | 5 - .../ForgotPassword/ForgotPasswordValidator.cs | 12 - .../RegisterUser/RegisterUserCommand.cs | 17 - .../RegisterUser/RegisterUserResponse.cs | 2 - .../ResetPassword/ResetPasswordCommand.cs | 9 - .../ResetPassword/ResetPasswordValidator.cs | 13 - .../ToggleUserStatusCommand.cs | 6 - .../Features/UpdateUser/UpdateUserCommand.cs | 14 - src/api/framework/Core/Jobs/IJobService.cs | 40 - src/api/framework/Core/Mail/IMailService.cs | 5 - src/api/framework/Core/Mail/MailOptions.cs | 15 - src/api/framework/Core/Mail/MailRequest.cs | 27 - .../framework/Core/Origin/OriginOptions.cs | 6 - src/api/framework/Core/Paging/BaseFilter.cs | 19 - src/api/framework/Core/Paging/Extensions.cs | 18 - src/api/framework/Core/Paging/Filter.cs | 34 - src/api/framework/Core/Paging/IPageRequest.cs | 9 - src/api/framework/Core/Paging/IPagedList.cs | 18 - src/api/framework/Core/Paging/PagedList.cs | 21 - .../framework/Core/Paging/PaginationFilter.cs | 15 - src/api/framework/Core/Paging/Search.cs | 7 - .../Core/Persistence/DatabaseOptions.cs | 16 - .../Persistence/IConnectionStringValidator.cs | 5 - .../Core/Persistence/IDbInitializer.cs | 6 - .../framework/Core/Persistence/IRepository.cs | 13 - .../EntitiesByBaseFilterSpec.cs | 16 - .../EntitiesByPaginationFilterSpec.cs | 17 - .../SpecificationBuilderExtensions.cs | 348 - .../File/Features/FileUploadCommand.cs | 11 - .../File/Features/FileUploadResponse.cs | 7 - .../File/Features/FileUploadValidator.cs | 21 - .../framework/Core/Storage/File/FileType.cs | 9 - .../framework/Core/Storage/IStorageService.cs | 12 - .../Tenant/Abstractions/ITenantService.cs | 23 - .../Core/Tenant/Dtos/TenantDetail.cs | 11 - .../ActivateTenant/ActivateTenantCommand.cs | 4 - .../ActivateTenant/ActivateTenantHandler.cs | 12 - .../ActivateTenant/ActivateTenantResponse.cs | 2 - .../ActivateTenant/ActivateTenantValidator.cs | 9 - .../CreateTenant/CreateTenantCommand.cs | 8 - .../CreateTenant/CreateTenantHandler.cs | 12 - .../CreateTenant/CreateTenantResponse.cs | 2 - .../CreateTenant/CreateTenantValidator.cs | 30 - .../DisableTenant/DisableTenantCommand.cs | 4 - .../DisableTenant/DisableTenantHandler.cs | 12 - .../DisableTenant/DisableTenantResponse.cs | 2 - .../DisableTenant/DisableTenantValidator.cs | 9 - .../GetTenantById/GetTenantByIdHandler.cs | 12 - .../GetTenantById/GetTenantByIdQuery.cs | 5 - .../Features/GetTenants/GetTenantsHandler.cs | 12 - .../Features/GetTenants/GetTenantsQuery.cs | 5 - .../UpgradeSubscriptionCommand.cs | 8 - .../UpgradeSubscriptionHandler.cs | 17 - .../UpgradeSubscriptionResponse.cs | 2 - .../UpgradeSubscriptionValidator.cs | 11 - .../Auth/CurrentUserMiddleware.cs | 14 - .../Auth/Jwt/ConfigureJwtBearerOptions.cs | 75 - .../Infrastructure/Auth/Jwt/Extensions.cs | 33 - .../Auth/Jwt/JwtAuthConstants.cs | 6 - .../Auth/Policy/EndpointExtensions.cs | 12 - .../PermissionAuthorizationRequirement.cs | 4 - .../Policy/RequiredPermissionAttribute.cs | 14 - ...quiredPermissionAuthorizationExtensions.cs | 32 - .../RequiredPermissionAuthorizationHandler.cs | 31 - .../Behaviours/ValidationBehavior.cs | 23 - .../Caching/DistributedCacheService.cs | 161 - .../Infrastructure/Caching/Extensions.cs | 34 - .../Common/Extensions/EnumExtensions.cs | 27 - .../Common/Extensions/RegexExtensions.cs | 12 - .../Constants/QueryStringKeys.cs | 6 - .../Infrastructure/Cors/CorsOptions.cs | 12 - .../Infrastructure/Cors/Extensions.cs | 25 - .../Exceptions/CustomExceptionHandler.cs | 51 - .../framework/Infrastructure/Extensions.cs | 114 - .../Infrastructure/FshInfrastructure.cs | 5 - .../HealthChecks/HealthCheckEndpoint.cs | 39 - .../HealthChecks/HealthCheckMiddleware.cs | 36 - .../Identity/Audit/AuditPublishedEvent.cs | 13 - .../Audit/AuditPublishedEventHandler.cs | 24 - .../Identity/Audit/AuditService.cs | 17 - .../Endpoints/GetUserAuditTrailEndpoint.cs | 22 - .../Infrastructure/Identity/Extensions.cs | 66 - .../Persistence/IdentityConfiguration.cs | 86 - .../Identity/Persistence/IdentityDbContext.cs | 47 - .../Persistence/IdentityDbInitializer.cs | 136 - .../Identity/RoleClaims/FshRoleClaim.cs | 8 - .../Endpoints/CreateOrUpdateRoleEndpoint.cs | 23 - .../Roles/Endpoints/DeleteRoleEndpoint.cs | 23 - .../Identity/Roles/Endpoints/Extensions.cs | 18 - .../Roles/Endpoints/GetRoleEndpoint.cs | 23 - .../Endpoints/GetRolePermissionsEndpoint.cs | 21 - .../Roles/Endpoints/GetRolesEndpoint.cs | 21 - .../UpdateRolePermissionsEndpoint.cs | 30 - .../Infrastructure/Identity/Roles/FshRole.cs | 14 - .../Identity/Roles/RoleService.cs | 126 - .../Identity/Tokens/Endpoints/Extensions.cs | 28 - .../Tokens/Endpoints/RefreshTokenEndpoint.cs | 28 - .../Endpoints/TokenGenerationEndpoint.cs | 28 - .../Identity/Tokens/TokenService.cs | 188 - .../Endpoints/AssignRolesToUserEndpoint.cs | 28 - .../Users/Endpoints/ChangePasswordEndpoint.cs | 43 - .../Users/Endpoints/ConfirmEmailEndpoint.cs | 20 - .../Users/Endpoints/DeleteUserEndpoint.cs | 21 - .../Identity/Users/Endpoints/Extensions.cs | 27 - .../Users/Endpoints/ForgotPasswordEndpoint.cs | 45 - .../Users/Endpoints/GetUserEndpoint.cs | 21 - .../Endpoints/GetUserPermissionsEndpoint.cs | 27 - .../Users/Endpoints/GetUserProfileEndpoint.cs | 27 - .../Users/Endpoints/GetUserRolesEndpoint.cs | 21 - .../Users/Endpoints/GetUsersListEndpoint.cs | 21 - .../Users/Endpoints/RegisterUserEndpoint.cs | 26 - .../Users/Endpoints/ResetPasswordEndpoint.cs | 34 - .../Endpoints/SelfRegisterUserEndpoint.cs | 30 - .../Endpoints/ToggleUserStatusEndpoint.cs | 35 - .../Users/Endpoints/UpdateUserEndpoint.cs | 30 - .../Infrastructure/Identity/Users/FshUser.cs | 14 - .../Users/Services/CurrentUserService.cs | 61 - .../Users/Services/UserService.Password.cs | 74 - .../Users/Services/UserService.Permissions.cs | 53 - .../Identity/Users/Services/UserService.cs | 313 - .../Infrastructure/Infrastructure.csproj | 82 - .../Infrastructure/Jobs/Extensions.cs | 71 - .../Infrastructure/Jobs/FshJobActivator.cs | 64 - .../Infrastructure/Jobs/FshJobFilter.cs | 41 - ...HangfireCustomBasicAuthenticationFilter.cs | 121 - .../Infrastructure/Jobs/HangfireOptions.cs | 7 - .../Infrastructure/Jobs/HangfireService.cs | 59 - .../Infrastructure/Jobs/LogJobFilter.cs | 51 - .../Logging/Serilog/Extensions.cs | 58 - .../Logging/Serilog/StaticLogger.cs | 19 - .../Infrastructure/Mail/Extensions.cs | 13 - .../Infrastructure/Mail/SmtpMailService.cs | 93 - .../OpenApi/ConfigureSwaggerOptions.cs | 49 - .../Infrastructure/OpenApi/Extensions.cs | 82 - .../OpenApi/SwaggerDefaultValues.cs | 62 - .../AppendGlobalQueryFilterExtension.cs | 36 - .../Infrastructure/Persistence/DbProviders.cs | 6 - .../Infrastructure/Persistence/Extensions.cs | 56 - .../Persistence/FshDbContext.cs | 60 - .../Interceptors/AuditInterceptor.cs | 145 - .../Services/ConnectionStringValidator.cs | 44 - .../Infrastructure/RateLimit/Extensions.cs | 63 - .../RateLimit/RateLimitOptions.cs | 9 - .../SecurityHeaders/Extensions.cs | 69 - .../SecurityHeaders/SecurityHeaderOptions.cs | 7 - .../SecurityHeaders/SecurityHeaders.cs | 12 - .../Infrastructure/Storage/Files/Extension.cs | 25 - .../Storage/Files/LocalFileStorageService.cs | 133 - .../Tenant/Abstractions/IFshTenantInfo.cs | 7 - .../Endpoints/ActivateTenantEndpoint.cs | 19 - .../Tenant/Endpoints/CreateTenantEndpoint.cs | 19 - .../Tenant/Endpoints/DisableTenantEndpoint.cs | 19 - .../Tenant/Endpoints/Extensions.cs | 19 - .../Tenant/Endpoints/GetTenantByIdEndpoint.cs | 19 - .../Tenant/Endpoints/GetTenantsEndpoint.cs | 19 - .../Endpoints/UpgradeSubscriptionEndpoint.cs | 20 - .../Infrastructure/Tenant/Extensions.cs | 136 - .../Infrastructure/Tenant/FshTenantInfo.cs | 68 - .../Tenant/Persistence/TenantDbContext.cs | 22 - .../Tenant/Services/TenantService.cs | 120 - ...41123030623_Add Catalog Schema.Designer.cs | 138 - .../20241123030623_Add Catalog Schema.cs | 86 - .../Catalog/CatalogDbContextModelSnapshot.cs | 135 - ...1123030737_Add Identity Schema.Designer.cs | 401 - .../20241123030737_Add Identity Schema.cs | 296 - .../IdentityDbContextModelSnapshot.cs | 398 - src/api/migrations/MSSQL/MSSQL.csproj | 17 - ...241123030647_Add Tenant Schema.Designer.cs | 69 - .../20241123030647_Add Tenant Schema.cs | 52 - .../Tenant/TenantDbContextModelSnapshot.cs | 66 - ...20241123030700_Add Todo Schema.Designer.cs | 75 - .../Todo/20241123030700_Add Todo Schema.cs | 47 - .../MSSQL/Todo/TodoDbContextModelSnapshot.cs | 72 - ...41123024839_Add Catalog Schema.Designer.cs | 138 - .../20241123024839_Add Catalog Schema.cs | 86 - .../Catalog/CatalogDbContextModelSnapshot.cs | 135 - ...1123024818_Add Identity Schema.Designer.cs | 399 - .../20241123024818_Add Identity Schema.cs | 295 - .../IdentityDbContextModelSnapshot.cs | 396 - .../migrations/PostgreSQL/PostgreSQL.csproj | 17 - ...241123024825_Add Tenant Schema.Designer.cs | 69 - .../20241123024825_Add Tenant Schema.cs | 52 - .../Tenant/TenantDbContextModelSnapshot.cs | 66 - ...20241123024832_Add Todo Schema.Designer.cs | 75 - .../Todo/20241123024832_Add Todo Schema.cs | 47 - .../Todo/TodoDbContextModelSnapshot.cs | 72 - .../Brands/Create/v1/CreateBrandCommand.cs | 8 - .../Create/v1/CreateBrandCommandValidator.cs | 11 - .../Brands/Create/v1/CreateBrandHandler.cs | 21 - .../Brands/Create/v1/CreateBrandResponse.cs | 4 - .../Brands/Delete/v1/DeleteBrandCommand.cs | 5 - .../Brands/Delete/v1/DeleteBrandHandler.cs | 22 - .../EventHandlers/BrandCreatedEventHandler.cs | 16 - .../Brands/Get/v1/BrandResponse.cs | 2 - .../Brands/Get/v1/GetBrandHandler.cs | 28 - .../Brands/Get/v1/GetBrandRequest.cs | 8 - .../Brands/Search/v1/SearchBrandSpecs.cs | 15 - .../Brands/Search/v1/SearchBrandsCommand.cs | 11 - .../Brands/Search/v1/SearchBrandsHandler.cs | 24 - .../Brands/Update/v1/UpdateBrandCommand.cs | 7 - .../Update/v1/UpdateBrandCommandValidator.cs | 11 - .../Brands/Update/v1/UpdateBrandHandler.cs | 24 - .../Brands/Update/v1/UpdateBrandResponse.cs | 2 - .../Catalog.Application.csproj | 10 - .../Catalog.Application/CatalogMetadata.cs | 6 - .../Create/v1/CreateProductCommand.cs | 9 - .../v1/CreateProductCommandValidator.cs | 11 - .../Create/v1/CreateProductHandler.cs | 21 - .../Create/v1/CreateProductResponse.cs | 2 - .../Delete/v1/DeleteProductCommand.cs | 5 - .../Delete/v1/DeleteProductHandler.cs | 22 - .../ProductCreatedEventHandler.cs | 17 - .../Products/Get/v1/GetProductHandler.cs | 29 - .../Products/Get/v1/GetProductRequest.cs | 8 - .../Products/Get/v1/GetProductSpecs.cs | 14 - .../Products/Get/v1/ProductResponse.cs | 4 - .../Products/Search/v1/SearchProductSpecs.cs | 18 - .../Search/v1/SearchProductsCommand.cs | 12 - .../Search/v1/SearchProductsHandler.cs | 26 - .../Update/v1/UpdateProductCommand.cs | 9 - .../v1/UpdateProductCommandValidator.cs | 11 - .../Update/v1/UpdateProductHandler.cs | 24 - .../Update/v1/UpdateProductResponse.cs | 2 - .../modules/Catalog/Catalog.Domain/Brand.cs | 51 - .../Catalog.Domain/Catalog.Domain.csproj | 9 - .../Catalog.Domain/Events/BrandCreated.cs | 7 - .../Catalog.Domain/Events/BrandUpdated.cs | 7 - .../Catalog.Domain/Events/ProductCreated.cs | 7 - .../Catalog.Domain/Events/ProductUpdated.cs | 7 - .../Exceptions/BrandNotFoundException.cs | 10 - .../Exceptions/ProductNotFoundException.cs | 10 - .../modules/Catalog/Catalog.Domain/Product.cs | 68 - .../Catalog.Infrastructure.csproj | 15 - .../Catalog.Infrastructure/CatalogModule.cs | 50 - .../Endpoints/v1/CreateBrandEndpoint.cs | 26 - .../Endpoints/v1/CreateProductEndpoint.cs | 26 - .../Endpoints/v1/DeleteBrandEndpoint.cs | 26 - .../Endpoints/v1/DeleteProductEndpoint.cs | 26 - .../Endpoints/v1/GetBrandEndpoint.cs | 26 - .../Endpoints/v1/GetProductEndpoint.cs | 26 - .../Endpoints/v1/SearchBrandsEndpoint.cs | 30 - .../Endpoints/v1/SearchProductsEndpoint.cs | 31 - .../Endpoints/v1/UpdateBrandEndpoint.cs | 27 - .../Endpoints/v1/UpdateProductEndpoint.cs | 27 - .../Persistence/CatalogDbContext.cs | 30 - .../Persistence/CatalogDbInitializer.cs | 34 - .../Persistence/CatalogRepository.cs | 24 - .../Configurations/BrandConfigurations.cs | 16 - .../Configurations/ProductConfiguration.cs | 16 - src/api/modules/Catalog/CatalogModule.cs | 32 - .../Todo/Domain/Events/TodoItemCreated.cs | 22 - .../Todo/Domain/Events/TodoItemUpdated.cs | 22 - src/api/modules/Todo/Domain/TodoItem.cs | 46 - src/api/modules/Todo/Domain/TodoMetrics.cs | 13 - .../Exceptions/TodoItemNotFoundException.cs | 10 - .../Features/Create/v1/CreateTodoCommand.cs | 10 - .../Features/Create/v1/CreateTodoEndpoint.cs | 26 - .../Features/Create/v1/CreateTodoHandler.cs | 22 - .../Features/Create/v1/CreateTodoResponse.cs | 2 - .../Features/Create/v1/CreateTodoValidator.cs | 12 - .../Features/Delete/v1/DeleteTodoCommand.cs | 8 - .../Features/Delete/v1/DeleteTodoEndpoint.cs | 27 - .../Features/Delete/v1/DeleteTodoHandler.cs | 22 - .../Todo/Features/Get/v1/GetTodoEndpoint.cs | 24 - .../Todo/Features/Get/v1/GetTodoHandler.cs | 28 - .../Todo/Features/Get/v1/GetTodoRequest.cs | 8 - .../Todo/Features/Get/v1/GetTodoResponse.cs | 2 - .../GetList/v1/GetTodoListEndpoint.cs | 27 - .../Features/GetList/v1/GetTodoListHandler.cs | 25 - .../Features/GetList/v1/GetTodoListRequest.cs | 5 - .../Todo/Features/GetList/v1/TodoDto.cs | 2 - .../Features/Update/v1/UpdateTodoCommand.cs | 10 - .../Features/Update/v1/UpdateTodoEndpoint.cs | 28 - .../Features/Update/v1/UpdateTodoHandler.cs | 24 - .../Features/Update/v1/UpdateTodoResponse.cs | 3 - .../Features/Update/v1/UpdateTodoValidator.cs | 12 - .../Configurations/TodoItemConfiguration.cs | 16 - .../modules/Todo/Persistence/TodoDbContext.cs | 27 - .../Todo/Persistence/TodoDbInitializer.cs | 32 - .../Todo/Persistence/TodoRepository.cs | 24 - src/api/modules/Todo/Todo.csproj | 10 - src/api/modules/Todo/TodoModule.cs | 45 - src/api/server/Extensions.cs | 70 - src/api/server/Program.cs | 30 - src/api/server/Properties/launchSettings.json | 17 - src/api/server/Server.csproj | 37 - src/api/server/Server.http | 6 - src/api/server/appsettings.Development.json | 65 - src/api/server/appsettings.json | 68 - .../assets/defaults/profile-picture.webp | Bin 1448664 -> 0 bytes src/apps/blazor/client/App.razor | 23 - src/apps/blazor/client/Client.csproj | 27 - .../blazor/client/Components/ApiHelper.cs | 70 - .../Components/Common/CustomValidation.cs | 51 - .../Common/DialogServiceExtensions.cs | 19 - .../Components/Common/FshCustomError.razor | 1 - .../client/Components/Common/FshTable.cs | 40 - .../client/Components/Common/TablePager.razor | 1 - .../Dialogs/DeleteConfirmation.razor | 29 - .../client/Components/Dialogs/Logout.razor | 39 - .../Components/EntityTable/AddEditModal.razor | 49 - .../EntityTable/AddEditModal.razor.cs | 47 - .../EntityTable/EntityClientTableContext.cs | 67 - .../Components/EntityTable/EntityField.cs | 34 - .../EntityTable/EntityServerTableContext.cs | 66 - .../Components/EntityTable/EntityTable.razor | 150 - .../EntityTable/EntityTable.razor.cs | 287 - .../EntityTable/EntityTableContext.cs | 197 - .../Components/EntityTable/IAddEditModal.cs | 8 - .../EntityTable/PaginationResponse.cs | 9 - .../blazor/client/Components/FshValidation.cs | 51 - .../Components/General/PageHeader.razor | 16 - .../blazor/client/Components/PersonCard.razor | 21 - .../client/Components/PersonCard.razor.cs | 44 - .../Components/ThemeManager/ColorPanel.razor | 27 - .../ThemeManager/ColorPanel.razor.cs | 24 - .../ThemeManager/DarkModePanel.razor | 17 - .../ThemeManager/DarkModePanel.razor.cs | 24 - .../Components/ThemeManager/RadiusPanel.razor | 15 - .../ThemeManager/RadiusPanel.razor.cs | 28 - .../TableCustomizationPanel.razor | 19 - .../TableCustomizationPanel.razor.cs | 74 - .../Components/ThemeManager/ThemeButton.razor | 16 - .../ThemeManager/ThemeButton.razor.cs | 10 - .../Components/ThemeManager/ThemeDrawer.razor | 28 - .../ThemeManager/ThemeDrawer.razor.cs | 96 - .../blazor/client/Directory.Packages.props | 22 - .../blazor/client/Layout/BaseLayout.razor | 29 - .../blazor/client/Layout/BaseLayout.razor.cs | 61 - .../blazor/client/Layout/MainLayout.razor | 101 - .../blazor/client/Layout/MainLayout.razor.cs | 55 - .../blazor/client/Layout/MainLayout.razor.css | 81 - src/apps/blazor/client/Layout/NavMenu.razor | 32 - .../blazor/client/Layout/NavMenu.razor.cs | 40 - .../blazor/client/Layout/NavMenu.razor.css | 83 - src/apps/blazor/client/Layout/NotFound.razor | 47 - .../blazor/client/Layout/NotFound.razor.cs | 34 - .../client/Pages/Auth/ForgotPassword.razor | 41 - .../client/Pages/Auth/ForgotPassword.razor.cs | 30 - src/apps/blazor/client/Pages/Auth/Login.razor | 46 - .../blazor/client/Pages/Auth/Login.razor.cs | 71 - .../blazor/client/Pages/Auth/Logout.razor | 11 - .../client/Pages/Auth/SelfRegister.razor | 71 - .../client/Pages/Auth/SelfRegister.razor.cs | 57 - .../blazor/client/Pages/Catalog/Brands.razor | 44 - .../client/Pages/Catalog/Brands.razor.cs | 50 - .../client/Pages/Catalog/Products.razor | 64 - .../client/Pages/Catalog/Products.razor.cs | 108 - src/apps/blazor/client/Pages/Counter.razor | 18 - src/apps/blazor/client/Pages/Home.razor | 95 - .../Pages/Identity/Account/Account.razor | 31 - .../Pages/Identity/Account/Profile.razor | 84 - .../Pages/Identity/Account/Profile.razor.cs | 102 - .../Pages/Identity/Account/Security.razor | 39 - .../Pages/Identity/Account/Security.razor.cs | 71 - .../Identity/Roles/RolePermissions.razor | 73 - .../Identity/Roles/RolePermissions.razor.cs | 109 - .../client/Pages/Identity/Roles/Roles.razor | 28 - .../Pages/Identity/Roles/Roles.razor.cs | 60 - .../client/Pages/Identity/Users/Audit.razor | 122 - .../Pages/Identity/Users/Audit.razor.cs | 89 - .../Pages/Identity/Users/UserProfile.razor | 147 - .../Pages/Identity/Users/UserProfile.razor.cs | 73 - .../Pages/Identity/Users/UserRoles.razor | 66 - .../Pages/Identity/Users/UserRoles.razor.cs | 78 - .../client/Pages/Identity/Users/Users.razor | 47 - .../Pages/Identity/Users/Users.razor.cs | 99 - .../client/Pages/Multitenancy/Tenants.razor | 86 - .../Pages/Multitenancy/Tenants.razor.cs | 121 - .../UpgradeSubscriptionModal.razor | 57 - .../blazor/client/Pages/Todos/Todos.razor | 39 - .../blazor/client/Pages/Todos/Todos.razor.cs | 51 - src/apps/blazor/client/Program.cs | 11 - .../client/Properties/launchSettings.json | 15 - src/apps/blazor/client/_Imports.razor | 34 - .../blazor/client/wwwroot/appsettings.json | 3 - .../client/wwwroot/appsettings.json.TEMPLATE | 4 - src/apps/blazor/client/wwwroot/css/fsh.css | 7 - src/apps/blazor/client/wwwroot/favicon.png | Bin 1148 -> 0 bytes .../client/wwwroot/full-stack-hero-logo.png | Bin 160036 -> 0 bytes src/apps/blazor/client/wwwroot/icon-192.png | Bin 2626 -> 0 bytes src/apps/blazor/client/wwwroot/icon-512.png | Bin 6311 -> 0 bytes src/apps/blazor/client/wwwroot/index.html | 72 - .../client/wwwroot/manifest.webmanifest | 22 - .../blazor/client/wwwroot/service-worker.js | 4 - .../wwwroot/service-worker.published.js | 55 - .../blazor/infrastructure/Api/ApiClient.cs | 6267 ---- src/apps/blazor/infrastructure/Api/nswag.json | 99 - .../Auth/AuthorizationServiceExtensions.cs | 13 - .../blazor/infrastructure/Auth/Extensions.cs | 34 - .../Auth/IAuthenticationService.cs | 15 - .../Auth/Jwt/AccessTokenProviderAccessor.cs | 17 - .../Auth/Jwt/AccessTokenProviderExtensions.cs | 12 - .../Jwt/JwtAuthenticationHeaderHandler.cs | 34 - .../Auth/Jwt/JwtAuthenticationService.cs | 242 - .../blazor/infrastructure/Auth/UserInfo.cs | 31 - .../infrastructure/Directory.Packages.props | 22 - src/apps/blazor/infrastructure/Extensions.cs | 45 - .../infrastructure/Infrastructure.csproj | 30 - .../Notifications/ConnectionState.cs | 8 - .../Notifications/ConnectionStateChanged.cs | 5 - .../Notifications/Extensions.cs | 35 - .../Notifications/INotificationPublisher.cs | 8 - .../Notifications/NotificationPublisher.cs | 24 - .../Notifications/NotificationWrapper.cs | 12 - .../Preferences/ClientPreference.cs | 14 - .../Preferences/ClientPreferenceManager.cs | 136 - .../Preferences/FshTablePreference.cs | 11 - .../Preferences/IClientPreferenceManager.cs | 14 - .../infrastructure/Preferences/IPreference.cs | 6 - .../Preferences/IPreferenceManager.cs | 10 - .../Storage/StorageConstants.cs | 13 - .../infrastructure/Themes/CustomColors.cs | 42 - .../infrastructure/Themes/CustomTypography.cs | 114 - .../blazor/infrastructure/Themes/FshTheme.cs | 57 - src/apps/blazor/nginx.conf | 19 - src/apps/blazor/scripts/nswag-regen.ps1 | 20 - .../shared/Notifications/BasicNotification.cs | 15 - .../Notifications/INotificationMessage.cs | 5 - .../shared/Notifications/JobNotification.cs | 8 - .../Notifications/NotificationConstants.cs | 6 - .../Notifications/StatsChangedNotification.cs | 5 - src/apps/blazor/shared/Shared.csproj | 11 - src/aspire/Host/Host.csproj | 26 - src/aspire/Host/Program.cs | 26 - .../Host/Properties/launchSettings.json | 17 - src/aspire/Host/appsettings.Development.json | 8 - src/aspire/Host/appsettings.json | 9 - src/aspire/service-defaults/Extensions.cs | 152 - .../service-defaults/MetricsConstants.cs | 7 - .../service-defaults/ServiceDefaults.csproj | 32 - src/global.json | 6 - terraform/.gitignore | 38 - terraform/README.md | 43 - terraform/bootstrap/database.tf | 10 - terraform/bootstrap/storage.tf | 10 - terraform/environments/dev/compute.tf | 45 - terraform/environments/dev/database.tf | 9 - terraform/environments/dev/main.tf | 8 - terraform/environments/dev/network.tf | 3 - terraform/environments/dev/outputs.tf | 7 - terraform/environments/dev/providers.tf | 16 - terraform/environments/dev/terraform.tfvars | 5 - terraform/environments/dev/variables.tf | 31 - terraform/modules/cloudwatch/main.tf | 4 - terraform/modules/cloudwatch/variables.tf | 8 - terraform/modules/ecs/cluster/main.tf | 13 - terraform/modules/ecs/cluster/outputs.tf | 3 - terraform/modules/ecs/cluster/variables.tf | 3 - terraform/modules/ecs/iam.tf | 41 - terraform/modules/ecs/outputs.tf | 3 - terraform/modules/ecs/service.tf | 70 - terraform/modules/ecs/task-definition.tf | 38 - terraform/modules/ecs/variables.tf | 75 - terraform/modules/rds/main.tf | 33 - terraform/modules/rds/outputs.tf | 11 - terraform/modules/rds/variables.tf | 39 - terraform/modules/s3/main.tf | 0 terraform/modules/s3/variables.tf | 0 terraform/modules/vpc/main.tf | 59 - terraform/modules/vpc/outputs.tf | 15 - terraform/modules/vpc/variables.tf | 23 - 566 files changed, 485 insertions(+), 55656 deletions(-) delete mode 100644 .github/release-drafter.yml delete mode 100644 .github/workflows/blazor.yml delete mode 100644 .github/workflows/changelog.yml delete mode 100644 .github/workflows/nuget.yml delete mode 100644 .github/workflows/webapi.yml delete mode 100644 .template.config/icon.png delete mode 100644 .template.config/ide.host.json delete mode 100644 .template.config/template.json delete mode 100644 FSH.StarterKit.nuspec delete mode 100644 README-template.md delete mode 100644 README.md delete mode 100644 assets/fullstackhero-dotnet-starter-kit.png delete mode 100644 compose/.env delete mode 100644 compose/docker-compose.yml delete mode 100644 compose/grafana/config/grafana.ini delete mode 100644 compose/grafana/config/provisioning/dashboards/default.yml delete mode 100644 compose/grafana/config/provisioning/datasources/default.yml delete mode 100644 compose/grafana/dashboards/aspnet-core-endpoint.json delete mode 100644 compose/grafana/dashboards/aspnet-core.json delete mode 100644 compose/grafana/dashboards/dotnet-otel-dashboard.json delete mode 100644 compose/grafana/dashboards/logs-dashboard.json delete mode 100644 compose/grafana/dashboards/node-exporter.json delete mode 100644 compose/jaeger/jaeger-ui.json delete mode 100644 compose/loki/loki.yml delete mode 100644 compose/otel-collector/otel-config.yaml delete mode 100644 compose/prometheus/prometheus.yml delete mode 100644 src/.dockerignore create mode 100644 src/Core/Core.csproj create mode 100644 src/Core/Domain/Entities/AuditableEntity.cs create mode 100644 src/Core/Domain/Entities/Entity.cs create mode 100644 src/Core/Domain/Interfaces/IAuditable.cs create mode 100644 src/Core/Domain/Interfaces/IDomainEvent.cs create mode 100644 src/Core/Domain/Interfaces/IHasDomainEvents.cs create mode 100644 src/Core/Domain/Interfaces/ISoftDelete.cs create mode 100644 src/Core/Domain/Interfaces/ITenantOwned.cs create mode 100644 src/Core/Storage/FileType.cs create mode 100644 src/Core/Storage/FileUploadRequest.cs create mode 100644 src/Core/Storage/IStorageService.cs create mode 100644 src/Data/Data.csproj delete mode 100644 src/Dockerfile.Blazor create mode 100644 src/FSH.Framework.slnx delete mode 100644 src/FSH.Starter.sln delete mode 100644 src/GetToken.http create mode 100644 src/Infrastructure/Infrastructure.csproj delete mode 100644 src/Shared/Authorization/AppConstants.cs delete mode 100644 src/Shared/Authorization/ClaimsPrincipalExtensions.cs delete mode 100644 src/Shared/Authorization/FshActions.cs delete mode 100644 src/Shared/Authorization/FshClaims.cs delete mode 100644 src/Shared/Authorization/FshPermissions.cs delete mode 100644 src/Shared/Authorization/FshResources.cs delete mode 100644 src/Shared/Authorization/FshRoles.cs delete mode 100644 src/Shared/Authorization/IdentityConstants.cs delete mode 100644 src/Shared/Authorization/TenantConstants.cs delete mode 100644 src/Shared/Constants/SchemaNames.cs create mode 100644 src/Web/Endpoints/Abstractions/IEndpointDefinition.cs create mode 100644 src/Web/Endpoints/Extensions.cs create mode 100644 src/Web/Observability/Logging/Enrichers/TenantIdEnricher.cs create mode 100644 src/Web/Observability/Logging/SerilogExtensions.cs create mode 100644 src/Web/Web.csproj delete mode 100644 src/api/framework/Core/Audit/AuditTrail.cs delete mode 100644 src/api/framework/Core/Audit/IAuditService.cs delete mode 100644 src/api/framework/Core/Audit/TrailDto.cs delete mode 100644 src/api/framework/Core/Audit/TrailType.cs delete mode 100644 src/api/framework/Core/Auth/Jwt/JwtOptions.cs delete mode 100644 src/api/framework/Core/Caching/CacheOptions.cs delete mode 100644 src/api/framework/Core/Caching/CacheServiceExtensions.cs delete mode 100644 src/api/framework/Core/Caching/ICacheService.cs delete mode 100644 src/api/framework/Core/Core.csproj delete mode 100644 src/api/framework/Core/Domain/AuditableEntity.cs delete mode 100644 src/api/framework/Core/Domain/BaseEntity.cs delete mode 100644 src/api/framework/Core/Domain/Contracts/IAggregateRoot.cs delete mode 100644 src/api/framework/Core/Domain/Contracts/IAuditable.cs delete mode 100644 src/api/framework/Core/Domain/Contracts/IEntity.cs delete mode 100644 src/api/framework/Core/Domain/Contracts/ISoftDeletable.cs delete mode 100644 src/api/framework/Core/Domain/Events/DomainEvent.cs delete mode 100644 src/api/framework/Core/Domain/Events/IDomainEvent.cs delete mode 100644 src/api/framework/Core/Exceptions/CustomException.cs delete mode 100644 src/api/framework/Core/Exceptions/ForbiddenException.cs delete mode 100644 src/api/framework/Core/Exceptions/FshException.cs delete mode 100644 src/api/framework/Core/Exceptions/NotFoundException.cs delete mode 100644 src/api/framework/Core/Exceptions/UnauthorizedException.cs delete mode 100644 src/api/framework/Core/FshCore.cs delete mode 100644 src/api/framework/Core/Identity/Roles/Features/CreateOrUpdateRole/CreateOrUpdateRoleCommand.cs delete mode 100644 src/api/framework/Core/Identity/Roles/Features/CreateOrUpdateRole/CreateOrUpdateRoleValidator.cs delete mode 100644 src/api/framework/Core/Identity/Roles/Features/UpdatePermissions/UpdatePermissionsCommand.cs delete mode 100644 src/api/framework/Core/Identity/Roles/Features/UpdatePermissions/UpdatePermissionsValidator.cs delete mode 100644 src/api/framework/Core/Identity/Roles/IRoleService.cs delete mode 100644 src/api/framework/Core/Identity/Roles/RoleDto.cs delete mode 100644 src/api/framework/Core/Identity/Tokens/Features/Generate/TokenGenerationCommand.cs delete mode 100644 src/api/framework/Core/Identity/Tokens/Features/Refresh/RefreshTokenCommand.cs delete mode 100644 src/api/framework/Core/Identity/Tokens/ITokenService.cs delete mode 100644 src/api/framework/Core/Identity/Tokens/Models/TokenResponse.cs delete mode 100644 src/api/framework/Core/Identity/Users/Abstractions/ICurrentUser.cs delete mode 100644 src/api/framework/Core/Identity/Users/Abstractions/ICurrentUserInitializer.cs delete mode 100644 src/api/framework/Core/Identity/Users/Abstractions/IUserService.cs delete mode 100644 src/api/framework/Core/Identity/Users/Dtos/UserDetail.cs delete mode 100644 src/api/framework/Core/Identity/Users/Dtos/UserRoleDetail.cs delete mode 100644 src/api/framework/Core/Identity/Users/Features/AssignUserRole/AssignUserRoleCommand.cs delete mode 100644 src/api/framework/Core/Identity/Users/Features/ChangePassword/ChangePasswordCommand.cs delete mode 100644 src/api/framework/Core/Identity/Users/Features/ChangePassword/ChangePasswordValidator.cs delete mode 100644 src/api/framework/Core/Identity/Users/Features/ForgotPassword/ForgotPasswordCommand.cs delete mode 100644 src/api/framework/Core/Identity/Users/Features/ForgotPassword/ForgotPasswordValidator.cs delete mode 100644 src/api/framework/Core/Identity/Users/Features/RegisterUser/RegisterUserCommand.cs delete mode 100644 src/api/framework/Core/Identity/Users/Features/RegisterUser/RegisterUserResponse.cs delete mode 100644 src/api/framework/Core/Identity/Users/Features/ResetPassword/ResetPasswordCommand.cs delete mode 100644 src/api/framework/Core/Identity/Users/Features/ResetPassword/ResetPasswordValidator.cs delete mode 100644 src/api/framework/Core/Identity/Users/Features/ToggleUserStatus/ToggleUserStatusCommand.cs delete mode 100644 src/api/framework/Core/Identity/Users/Features/UpdateUser/UpdateUserCommand.cs delete mode 100644 src/api/framework/Core/Jobs/IJobService.cs delete mode 100644 src/api/framework/Core/Mail/IMailService.cs delete mode 100644 src/api/framework/Core/Mail/MailOptions.cs delete mode 100644 src/api/framework/Core/Mail/MailRequest.cs delete mode 100644 src/api/framework/Core/Origin/OriginOptions.cs delete mode 100644 src/api/framework/Core/Paging/BaseFilter.cs delete mode 100644 src/api/framework/Core/Paging/Extensions.cs delete mode 100644 src/api/framework/Core/Paging/Filter.cs delete mode 100644 src/api/framework/Core/Paging/IPageRequest.cs delete mode 100644 src/api/framework/Core/Paging/IPagedList.cs delete mode 100644 src/api/framework/Core/Paging/PagedList.cs delete mode 100644 src/api/framework/Core/Paging/PaginationFilter.cs delete mode 100644 src/api/framework/Core/Paging/Search.cs delete mode 100644 src/api/framework/Core/Persistence/DatabaseOptions.cs delete mode 100644 src/api/framework/Core/Persistence/IConnectionStringValidator.cs delete mode 100644 src/api/framework/Core/Persistence/IDbInitializer.cs delete mode 100644 src/api/framework/Core/Persistence/IRepository.cs delete mode 100644 src/api/framework/Core/Specifications/EntitiesByBaseFilterSpec.cs delete mode 100644 src/api/framework/Core/Specifications/EntitiesByPaginationFilterSpec.cs delete mode 100644 src/api/framework/Core/Specifications/SpecificationBuilderExtensions.cs delete mode 100644 src/api/framework/Core/Storage/File/Features/FileUploadCommand.cs delete mode 100644 src/api/framework/Core/Storage/File/Features/FileUploadResponse.cs delete mode 100644 src/api/framework/Core/Storage/File/Features/FileUploadValidator.cs delete mode 100644 src/api/framework/Core/Storage/File/FileType.cs delete mode 100644 src/api/framework/Core/Storage/IStorageService.cs delete mode 100644 src/api/framework/Core/Tenant/Abstractions/ITenantService.cs delete mode 100644 src/api/framework/Core/Tenant/Dtos/TenantDetail.cs delete mode 100644 src/api/framework/Core/Tenant/Features/ActivateTenant/ActivateTenantCommand.cs delete mode 100644 src/api/framework/Core/Tenant/Features/ActivateTenant/ActivateTenantHandler.cs delete mode 100644 src/api/framework/Core/Tenant/Features/ActivateTenant/ActivateTenantResponse.cs delete mode 100644 src/api/framework/Core/Tenant/Features/ActivateTenant/ActivateTenantValidator.cs delete mode 100644 src/api/framework/Core/Tenant/Features/CreateTenant/CreateTenantCommand.cs delete mode 100644 src/api/framework/Core/Tenant/Features/CreateTenant/CreateTenantHandler.cs delete mode 100644 src/api/framework/Core/Tenant/Features/CreateTenant/CreateTenantResponse.cs delete mode 100644 src/api/framework/Core/Tenant/Features/CreateTenant/CreateTenantValidator.cs delete mode 100644 src/api/framework/Core/Tenant/Features/DisableTenant/DisableTenantCommand.cs delete mode 100644 src/api/framework/Core/Tenant/Features/DisableTenant/DisableTenantHandler.cs delete mode 100644 src/api/framework/Core/Tenant/Features/DisableTenant/DisableTenantResponse.cs delete mode 100644 src/api/framework/Core/Tenant/Features/DisableTenant/DisableTenantValidator.cs delete mode 100644 src/api/framework/Core/Tenant/Features/GetTenantById/GetTenantByIdHandler.cs delete mode 100644 src/api/framework/Core/Tenant/Features/GetTenantById/GetTenantByIdQuery.cs delete mode 100644 src/api/framework/Core/Tenant/Features/GetTenants/GetTenantsHandler.cs delete mode 100644 src/api/framework/Core/Tenant/Features/GetTenants/GetTenantsQuery.cs delete mode 100644 src/api/framework/Core/Tenant/Features/UpgradeSubscription/UpgradeSubscriptionCommand.cs delete mode 100644 src/api/framework/Core/Tenant/Features/UpgradeSubscription/UpgradeSubscriptionHandler.cs delete mode 100644 src/api/framework/Core/Tenant/Features/UpgradeSubscription/UpgradeSubscriptionResponse.cs delete mode 100644 src/api/framework/Core/Tenant/Features/UpgradeSubscription/UpgradeSubscriptionValidator.cs delete mode 100644 src/api/framework/Infrastructure/Auth/CurrentUserMiddleware.cs delete mode 100644 src/api/framework/Infrastructure/Auth/Jwt/ConfigureJwtBearerOptions.cs delete mode 100644 src/api/framework/Infrastructure/Auth/Jwt/Extensions.cs delete mode 100644 src/api/framework/Infrastructure/Auth/Jwt/JwtAuthConstants.cs delete mode 100644 src/api/framework/Infrastructure/Auth/Policy/EndpointExtensions.cs delete mode 100644 src/api/framework/Infrastructure/Auth/Policy/PermissionAuthorizationRequirement.cs delete mode 100644 src/api/framework/Infrastructure/Auth/Policy/RequiredPermissionAttribute.cs delete mode 100644 src/api/framework/Infrastructure/Auth/Policy/RequiredPermissionAuthorizationExtensions.cs delete mode 100644 src/api/framework/Infrastructure/Auth/Policy/RequiredPermissionAuthorizationHandler.cs delete mode 100644 src/api/framework/Infrastructure/Behaviours/ValidationBehavior.cs delete mode 100644 src/api/framework/Infrastructure/Caching/DistributedCacheService.cs delete mode 100644 src/api/framework/Infrastructure/Caching/Extensions.cs delete mode 100644 src/api/framework/Infrastructure/Common/Extensions/EnumExtensions.cs delete mode 100644 src/api/framework/Infrastructure/Common/Extensions/RegexExtensions.cs delete mode 100644 src/api/framework/Infrastructure/Constants/QueryStringKeys.cs delete mode 100644 src/api/framework/Infrastructure/Cors/CorsOptions.cs delete mode 100644 src/api/framework/Infrastructure/Cors/Extensions.cs delete mode 100644 src/api/framework/Infrastructure/Exceptions/CustomExceptionHandler.cs delete mode 100644 src/api/framework/Infrastructure/Extensions.cs delete mode 100644 src/api/framework/Infrastructure/FshInfrastructure.cs delete mode 100644 src/api/framework/Infrastructure/HealthChecks/HealthCheckEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/HealthChecks/HealthCheckMiddleware.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Audit/AuditPublishedEvent.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Audit/AuditPublishedEventHandler.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Audit/AuditService.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Audit/Endpoints/GetUserAuditTrailEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Extensions.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Persistence/IdentityConfiguration.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Persistence/IdentityDbContext.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Persistence/IdentityDbInitializer.cs delete mode 100644 src/api/framework/Infrastructure/Identity/RoleClaims/FshRoleClaim.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Roles/Endpoints/CreateOrUpdateRoleEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Roles/Endpoints/DeleteRoleEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Roles/Endpoints/Extensions.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Roles/Endpoints/GetRoleEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Roles/Endpoints/GetRolePermissionsEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Roles/Endpoints/GetRolesEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Roles/Endpoints/UpdateRolePermissionsEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Roles/FshRole.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Roles/RoleService.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Tokens/Endpoints/Extensions.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Tokens/Endpoints/RefreshTokenEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Tokens/Endpoints/TokenGenerationEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Tokens/TokenService.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Users/Endpoints/AssignRolesToUserEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Users/Endpoints/ChangePasswordEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Users/Endpoints/ConfirmEmailEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Users/Endpoints/DeleteUserEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Users/Endpoints/Extensions.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Users/Endpoints/ForgotPasswordEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Users/Endpoints/GetUserEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Users/Endpoints/GetUserPermissionsEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Users/Endpoints/GetUserProfileEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Users/Endpoints/GetUserRolesEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Users/Endpoints/GetUsersListEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Users/Endpoints/RegisterUserEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Users/Endpoints/ResetPasswordEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Users/Endpoints/SelfRegisterUserEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Users/Endpoints/ToggleUserStatusEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Users/Endpoints/UpdateUserEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Users/FshUser.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Users/Services/CurrentUserService.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Users/Services/UserService.Password.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Users/Services/UserService.Permissions.cs delete mode 100644 src/api/framework/Infrastructure/Identity/Users/Services/UserService.cs delete mode 100644 src/api/framework/Infrastructure/Infrastructure.csproj delete mode 100644 src/api/framework/Infrastructure/Jobs/Extensions.cs delete mode 100644 src/api/framework/Infrastructure/Jobs/FshJobActivator.cs delete mode 100644 src/api/framework/Infrastructure/Jobs/FshJobFilter.cs delete mode 100644 src/api/framework/Infrastructure/Jobs/HangfireCustomBasicAuthenticationFilter.cs delete mode 100644 src/api/framework/Infrastructure/Jobs/HangfireOptions.cs delete mode 100644 src/api/framework/Infrastructure/Jobs/HangfireService.cs delete mode 100644 src/api/framework/Infrastructure/Jobs/LogJobFilter.cs delete mode 100644 src/api/framework/Infrastructure/Logging/Serilog/Extensions.cs delete mode 100644 src/api/framework/Infrastructure/Logging/Serilog/StaticLogger.cs delete mode 100644 src/api/framework/Infrastructure/Mail/Extensions.cs delete mode 100644 src/api/framework/Infrastructure/Mail/SmtpMailService.cs delete mode 100644 src/api/framework/Infrastructure/OpenApi/ConfigureSwaggerOptions.cs delete mode 100644 src/api/framework/Infrastructure/OpenApi/Extensions.cs delete mode 100644 src/api/framework/Infrastructure/OpenApi/SwaggerDefaultValues.cs delete mode 100644 src/api/framework/Infrastructure/Persistence/AppendGlobalQueryFilterExtension.cs delete mode 100644 src/api/framework/Infrastructure/Persistence/DbProviders.cs delete mode 100644 src/api/framework/Infrastructure/Persistence/Extensions.cs delete mode 100644 src/api/framework/Infrastructure/Persistence/FshDbContext.cs delete mode 100644 src/api/framework/Infrastructure/Persistence/Interceptors/AuditInterceptor.cs delete mode 100644 src/api/framework/Infrastructure/Persistence/Services/ConnectionStringValidator.cs delete mode 100644 src/api/framework/Infrastructure/RateLimit/Extensions.cs delete mode 100644 src/api/framework/Infrastructure/RateLimit/RateLimitOptions.cs delete mode 100644 src/api/framework/Infrastructure/SecurityHeaders/Extensions.cs delete mode 100644 src/api/framework/Infrastructure/SecurityHeaders/SecurityHeaderOptions.cs delete mode 100644 src/api/framework/Infrastructure/SecurityHeaders/SecurityHeaders.cs delete mode 100644 src/api/framework/Infrastructure/Storage/Files/Extension.cs delete mode 100644 src/api/framework/Infrastructure/Storage/Files/LocalFileStorageService.cs delete mode 100644 src/api/framework/Infrastructure/Tenant/Abstractions/IFshTenantInfo.cs delete mode 100644 src/api/framework/Infrastructure/Tenant/Endpoints/ActivateTenantEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Tenant/Endpoints/CreateTenantEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Tenant/Endpoints/DisableTenantEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Tenant/Endpoints/Extensions.cs delete mode 100644 src/api/framework/Infrastructure/Tenant/Endpoints/GetTenantByIdEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Tenant/Endpoints/GetTenantsEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Tenant/Endpoints/UpgradeSubscriptionEndpoint.cs delete mode 100644 src/api/framework/Infrastructure/Tenant/Extensions.cs delete mode 100644 src/api/framework/Infrastructure/Tenant/FshTenantInfo.cs delete mode 100644 src/api/framework/Infrastructure/Tenant/Persistence/TenantDbContext.cs delete mode 100644 src/api/framework/Infrastructure/Tenant/Services/TenantService.cs delete mode 100644 src/api/migrations/MSSQL/Catalog/20241123030623_Add Catalog Schema.Designer.cs delete mode 100644 src/api/migrations/MSSQL/Catalog/20241123030623_Add Catalog Schema.cs delete mode 100644 src/api/migrations/MSSQL/Catalog/CatalogDbContextModelSnapshot.cs delete mode 100644 src/api/migrations/MSSQL/Identity/20241123030737_Add Identity Schema.Designer.cs delete mode 100644 src/api/migrations/MSSQL/Identity/20241123030737_Add Identity Schema.cs delete mode 100644 src/api/migrations/MSSQL/Identity/IdentityDbContextModelSnapshot.cs delete mode 100644 src/api/migrations/MSSQL/MSSQL.csproj delete mode 100644 src/api/migrations/MSSQL/Tenant/20241123030647_Add Tenant Schema.Designer.cs delete mode 100644 src/api/migrations/MSSQL/Tenant/20241123030647_Add Tenant Schema.cs delete mode 100644 src/api/migrations/MSSQL/Tenant/TenantDbContextModelSnapshot.cs delete mode 100644 src/api/migrations/MSSQL/Todo/20241123030700_Add Todo Schema.Designer.cs delete mode 100644 src/api/migrations/MSSQL/Todo/20241123030700_Add Todo Schema.cs delete mode 100644 src/api/migrations/MSSQL/Todo/TodoDbContextModelSnapshot.cs delete mode 100644 src/api/migrations/PostgreSQL/Catalog/20241123024839_Add Catalog Schema.Designer.cs delete mode 100644 src/api/migrations/PostgreSQL/Catalog/20241123024839_Add Catalog Schema.cs delete mode 100644 src/api/migrations/PostgreSQL/Catalog/CatalogDbContextModelSnapshot.cs delete mode 100644 src/api/migrations/PostgreSQL/Identity/20241123024818_Add Identity Schema.Designer.cs delete mode 100644 src/api/migrations/PostgreSQL/Identity/20241123024818_Add Identity Schema.cs delete mode 100644 src/api/migrations/PostgreSQL/Identity/IdentityDbContextModelSnapshot.cs delete mode 100644 src/api/migrations/PostgreSQL/PostgreSQL.csproj delete mode 100644 src/api/migrations/PostgreSQL/Tenant/20241123024825_Add Tenant Schema.Designer.cs delete mode 100644 src/api/migrations/PostgreSQL/Tenant/20241123024825_Add Tenant Schema.cs delete mode 100644 src/api/migrations/PostgreSQL/Tenant/TenantDbContextModelSnapshot.cs delete mode 100644 src/api/migrations/PostgreSQL/Todo/20241123024832_Add Todo Schema.Designer.cs delete mode 100644 src/api/migrations/PostgreSQL/Todo/20241123024832_Add Todo Schema.cs delete mode 100644 src/api/migrations/PostgreSQL/Todo/TodoDbContextModelSnapshot.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Brands/Create/v1/CreateBrandCommand.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Brands/Create/v1/CreateBrandCommandValidator.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Brands/Create/v1/CreateBrandHandler.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Brands/Create/v1/CreateBrandResponse.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Brands/Delete/v1/DeleteBrandCommand.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Brands/Delete/v1/DeleteBrandHandler.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Brands/EventHandlers/BrandCreatedEventHandler.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Brands/Get/v1/BrandResponse.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Brands/Get/v1/GetBrandHandler.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Brands/Get/v1/GetBrandRequest.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Brands/Search/v1/SearchBrandSpecs.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Brands/Search/v1/SearchBrandsCommand.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Brands/Search/v1/SearchBrandsHandler.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Brands/Update/v1/UpdateBrandCommand.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Brands/Update/v1/UpdateBrandCommandValidator.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Brands/Update/v1/UpdateBrandHandler.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Brands/Update/v1/UpdateBrandResponse.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Catalog.Application.csproj delete mode 100644 src/api/modules/Catalog/Catalog.Application/CatalogMetadata.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Products/Create/v1/CreateProductCommand.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Products/Create/v1/CreateProductCommandValidator.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Products/Create/v1/CreateProductHandler.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Products/Create/v1/CreateProductResponse.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Products/Delete/v1/DeleteProductCommand.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Products/Delete/v1/DeleteProductHandler.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Products/EventHandlers/ProductCreatedEventHandler.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Products/Get/v1/GetProductHandler.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Products/Get/v1/GetProductRequest.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Products/Get/v1/GetProductSpecs.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Products/Get/v1/ProductResponse.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Products/Search/v1/SearchProductSpecs.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Products/Search/v1/SearchProductsCommand.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Products/Search/v1/SearchProductsHandler.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Products/Update/v1/UpdateProductCommand.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Products/Update/v1/UpdateProductCommandValidator.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Products/Update/v1/UpdateProductHandler.cs delete mode 100644 src/api/modules/Catalog/Catalog.Application/Products/Update/v1/UpdateProductResponse.cs delete mode 100644 src/api/modules/Catalog/Catalog.Domain/Brand.cs delete mode 100644 src/api/modules/Catalog/Catalog.Domain/Catalog.Domain.csproj delete mode 100644 src/api/modules/Catalog/Catalog.Domain/Events/BrandCreated.cs delete mode 100644 src/api/modules/Catalog/Catalog.Domain/Events/BrandUpdated.cs delete mode 100644 src/api/modules/Catalog/Catalog.Domain/Events/ProductCreated.cs delete mode 100644 src/api/modules/Catalog/Catalog.Domain/Events/ProductUpdated.cs delete mode 100644 src/api/modules/Catalog/Catalog.Domain/Exceptions/BrandNotFoundException.cs delete mode 100644 src/api/modules/Catalog/Catalog.Domain/Exceptions/ProductNotFoundException.cs delete mode 100644 src/api/modules/Catalog/Catalog.Domain/Product.cs delete mode 100644 src/api/modules/Catalog/Catalog.Infrastructure/Catalog.Infrastructure.csproj delete mode 100644 src/api/modules/Catalog/Catalog.Infrastructure/CatalogModule.cs delete mode 100644 src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/CreateBrandEndpoint.cs delete mode 100644 src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/CreateProductEndpoint.cs delete mode 100644 src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/DeleteBrandEndpoint.cs delete mode 100644 src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/DeleteProductEndpoint.cs delete mode 100644 src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/GetBrandEndpoint.cs delete mode 100644 src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/GetProductEndpoint.cs delete mode 100644 src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/SearchBrandsEndpoint.cs delete mode 100644 src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/SearchProductsEndpoint.cs delete mode 100644 src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/UpdateBrandEndpoint.cs delete mode 100644 src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/UpdateProductEndpoint.cs delete mode 100644 src/api/modules/Catalog/Catalog.Infrastructure/Persistence/CatalogDbContext.cs delete mode 100644 src/api/modules/Catalog/Catalog.Infrastructure/Persistence/CatalogDbInitializer.cs delete mode 100644 src/api/modules/Catalog/Catalog.Infrastructure/Persistence/CatalogRepository.cs delete mode 100644 src/api/modules/Catalog/Catalog.Infrastructure/Persistence/Configurations/BrandConfigurations.cs delete mode 100644 src/api/modules/Catalog/Catalog.Infrastructure/Persistence/Configurations/ProductConfiguration.cs delete mode 100644 src/api/modules/Catalog/CatalogModule.cs delete mode 100644 src/api/modules/Todo/Domain/Events/TodoItemCreated.cs delete mode 100644 src/api/modules/Todo/Domain/Events/TodoItemUpdated.cs delete mode 100644 src/api/modules/Todo/Domain/TodoItem.cs delete mode 100644 src/api/modules/Todo/Domain/TodoMetrics.cs delete mode 100644 src/api/modules/Todo/Exceptions/TodoItemNotFoundException.cs delete mode 100644 src/api/modules/Todo/Features/Create/v1/CreateTodoCommand.cs delete mode 100644 src/api/modules/Todo/Features/Create/v1/CreateTodoEndpoint.cs delete mode 100644 src/api/modules/Todo/Features/Create/v1/CreateTodoHandler.cs delete mode 100644 src/api/modules/Todo/Features/Create/v1/CreateTodoResponse.cs delete mode 100644 src/api/modules/Todo/Features/Create/v1/CreateTodoValidator.cs delete mode 100644 src/api/modules/Todo/Features/Delete/v1/DeleteTodoCommand.cs delete mode 100644 src/api/modules/Todo/Features/Delete/v1/DeleteTodoEndpoint.cs delete mode 100644 src/api/modules/Todo/Features/Delete/v1/DeleteTodoHandler.cs delete mode 100644 src/api/modules/Todo/Features/Get/v1/GetTodoEndpoint.cs delete mode 100644 src/api/modules/Todo/Features/Get/v1/GetTodoHandler.cs delete mode 100644 src/api/modules/Todo/Features/Get/v1/GetTodoRequest.cs delete mode 100644 src/api/modules/Todo/Features/Get/v1/GetTodoResponse.cs delete mode 100644 src/api/modules/Todo/Features/GetList/v1/GetTodoListEndpoint.cs delete mode 100644 src/api/modules/Todo/Features/GetList/v1/GetTodoListHandler.cs delete mode 100644 src/api/modules/Todo/Features/GetList/v1/GetTodoListRequest.cs delete mode 100644 src/api/modules/Todo/Features/GetList/v1/TodoDto.cs delete mode 100644 src/api/modules/Todo/Features/Update/v1/UpdateTodoCommand.cs delete mode 100644 src/api/modules/Todo/Features/Update/v1/UpdateTodoEndpoint.cs delete mode 100644 src/api/modules/Todo/Features/Update/v1/UpdateTodoHandler.cs delete mode 100644 src/api/modules/Todo/Features/Update/v1/UpdateTodoResponse.cs delete mode 100644 src/api/modules/Todo/Features/Update/v1/UpdateTodoValidator.cs delete mode 100644 src/api/modules/Todo/Persistence/Configurations/TodoItemConfiguration.cs delete mode 100644 src/api/modules/Todo/Persistence/TodoDbContext.cs delete mode 100644 src/api/modules/Todo/Persistence/TodoDbInitializer.cs delete mode 100644 src/api/modules/Todo/Persistence/TodoRepository.cs delete mode 100644 src/api/modules/Todo/Todo.csproj delete mode 100644 src/api/modules/Todo/TodoModule.cs delete mode 100644 src/api/server/Extensions.cs delete mode 100644 src/api/server/Program.cs delete mode 100644 src/api/server/Properties/launchSettings.json delete mode 100644 src/api/server/Server.csproj delete mode 100644 src/api/server/Server.http delete mode 100644 src/api/server/appsettings.Development.json delete mode 100644 src/api/server/appsettings.json delete mode 100644 src/api/server/assets/defaults/profile-picture.webp delete mode 100644 src/apps/blazor/client/App.razor delete mode 100644 src/apps/blazor/client/Client.csproj delete mode 100644 src/apps/blazor/client/Components/ApiHelper.cs delete mode 100644 src/apps/blazor/client/Components/Common/CustomValidation.cs delete mode 100644 src/apps/blazor/client/Components/Common/DialogServiceExtensions.cs delete mode 100644 src/apps/blazor/client/Components/Common/FshCustomError.razor delete mode 100644 src/apps/blazor/client/Components/Common/FshTable.cs delete mode 100644 src/apps/blazor/client/Components/Common/TablePager.razor delete mode 100644 src/apps/blazor/client/Components/Dialogs/DeleteConfirmation.razor delete mode 100644 src/apps/blazor/client/Components/Dialogs/Logout.razor delete mode 100644 src/apps/blazor/client/Components/EntityTable/AddEditModal.razor delete mode 100644 src/apps/blazor/client/Components/EntityTable/AddEditModal.razor.cs delete mode 100644 src/apps/blazor/client/Components/EntityTable/EntityClientTableContext.cs delete mode 100644 src/apps/blazor/client/Components/EntityTable/EntityField.cs delete mode 100644 src/apps/blazor/client/Components/EntityTable/EntityServerTableContext.cs delete mode 100644 src/apps/blazor/client/Components/EntityTable/EntityTable.razor delete mode 100644 src/apps/blazor/client/Components/EntityTable/EntityTable.razor.cs delete mode 100644 src/apps/blazor/client/Components/EntityTable/EntityTableContext.cs delete mode 100644 src/apps/blazor/client/Components/EntityTable/IAddEditModal.cs delete mode 100644 src/apps/blazor/client/Components/EntityTable/PaginationResponse.cs delete mode 100644 src/apps/blazor/client/Components/FshValidation.cs delete mode 100644 src/apps/blazor/client/Components/General/PageHeader.razor delete mode 100644 src/apps/blazor/client/Components/PersonCard.razor delete mode 100644 src/apps/blazor/client/Components/PersonCard.razor.cs delete mode 100644 src/apps/blazor/client/Components/ThemeManager/ColorPanel.razor delete mode 100644 src/apps/blazor/client/Components/ThemeManager/ColorPanel.razor.cs delete mode 100644 src/apps/blazor/client/Components/ThemeManager/DarkModePanel.razor delete mode 100644 src/apps/blazor/client/Components/ThemeManager/DarkModePanel.razor.cs delete mode 100644 src/apps/blazor/client/Components/ThemeManager/RadiusPanel.razor delete mode 100644 src/apps/blazor/client/Components/ThemeManager/RadiusPanel.razor.cs delete mode 100644 src/apps/blazor/client/Components/ThemeManager/TableCustomizationPanel.razor delete mode 100644 src/apps/blazor/client/Components/ThemeManager/TableCustomizationPanel.razor.cs delete mode 100644 src/apps/blazor/client/Components/ThemeManager/ThemeButton.razor delete mode 100644 src/apps/blazor/client/Components/ThemeManager/ThemeButton.razor.cs delete mode 100644 src/apps/blazor/client/Components/ThemeManager/ThemeDrawer.razor delete mode 100644 src/apps/blazor/client/Components/ThemeManager/ThemeDrawer.razor.cs delete mode 100644 src/apps/blazor/client/Directory.Packages.props delete mode 100644 src/apps/blazor/client/Layout/BaseLayout.razor delete mode 100644 src/apps/blazor/client/Layout/BaseLayout.razor.cs delete mode 100644 src/apps/blazor/client/Layout/MainLayout.razor delete mode 100644 src/apps/blazor/client/Layout/MainLayout.razor.cs delete mode 100644 src/apps/blazor/client/Layout/MainLayout.razor.css delete mode 100644 src/apps/blazor/client/Layout/NavMenu.razor delete mode 100644 src/apps/blazor/client/Layout/NavMenu.razor.cs delete mode 100644 src/apps/blazor/client/Layout/NavMenu.razor.css delete mode 100644 src/apps/blazor/client/Layout/NotFound.razor delete mode 100644 src/apps/blazor/client/Layout/NotFound.razor.cs delete mode 100644 src/apps/blazor/client/Pages/Auth/ForgotPassword.razor delete mode 100644 src/apps/blazor/client/Pages/Auth/ForgotPassword.razor.cs delete mode 100644 src/apps/blazor/client/Pages/Auth/Login.razor delete mode 100644 src/apps/blazor/client/Pages/Auth/Login.razor.cs delete mode 100644 src/apps/blazor/client/Pages/Auth/Logout.razor delete mode 100644 src/apps/blazor/client/Pages/Auth/SelfRegister.razor delete mode 100644 src/apps/blazor/client/Pages/Auth/SelfRegister.razor.cs delete mode 100644 src/apps/blazor/client/Pages/Catalog/Brands.razor delete mode 100644 src/apps/blazor/client/Pages/Catalog/Brands.razor.cs delete mode 100644 src/apps/blazor/client/Pages/Catalog/Products.razor delete mode 100644 src/apps/blazor/client/Pages/Catalog/Products.razor.cs delete mode 100644 src/apps/blazor/client/Pages/Counter.razor delete mode 100644 src/apps/blazor/client/Pages/Home.razor delete mode 100644 src/apps/blazor/client/Pages/Identity/Account/Account.razor delete mode 100644 src/apps/blazor/client/Pages/Identity/Account/Profile.razor delete mode 100644 src/apps/blazor/client/Pages/Identity/Account/Profile.razor.cs delete mode 100644 src/apps/blazor/client/Pages/Identity/Account/Security.razor delete mode 100644 src/apps/blazor/client/Pages/Identity/Account/Security.razor.cs delete mode 100644 src/apps/blazor/client/Pages/Identity/Roles/RolePermissions.razor delete mode 100644 src/apps/blazor/client/Pages/Identity/Roles/RolePermissions.razor.cs delete mode 100644 src/apps/blazor/client/Pages/Identity/Roles/Roles.razor delete mode 100644 src/apps/blazor/client/Pages/Identity/Roles/Roles.razor.cs delete mode 100644 src/apps/blazor/client/Pages/Identity/Users/Audit.razor delete mode 100644 src/apps/blazor/client/Pages/Identity/Users/Audit.razor.cs delete mode 100644 src/apps/blazor/client/Pages/Identity/Users/UserProfile.razor delete mode 100644 src/apps/blazor/client/Pages/Identity/Users/UserProfile.razor.cs delete mode 100644 src/apps/blazor/client/Pages/Identity/Users/UserRoles.razor delete mode 100644 src/apps/blazor/client/Pages/Identity/Users/UserRoles.razor.cs delete mode 100644 src/apps/blazor/client/Pages/Identity/Users/Users.razor delete mode 100644 src/apps/blazor/client/Pages/Identity/Users/Users.razor.cs delete mode 100644 src/apps/blazor/client/Pages/Multitenancy/Tenants.razor delete mode 100644 src/apps/blazor/client/Pages/Multitenancy/Tenants.razor.cs delete mode 100644 src/apps/blazor/client/Pages/Multitenancy/UpgradeSubscriptionModal.razor delete mode 100644 src/apps/blazor/client/Pages/Todos/Todos.razor delete mode 100644 src/apps/blazor/client/Pages/Todos/Todos.razor.cs delete mode 100644 src/apps/blazor/client/Program.cs delete mode 100644 src/apps/blazor/client/Properties/launchSettings.json delete mode 100644 src/apps/blazor/client/_Imports.razor delete mode 100644 src/apps/blazor/client/wwwroot/appsettings.json delete mode 100644 src/apps/blazor/client/wwwroot/appsettings.json.TEMPLATE delete mode 100644 src/apps/blazor/client/wwwroot/css/fsh.css delete mode 100644 src/apps/blazor/client/wwwroot/favicon.png delete mode 100644 src/apps/blazor/client/wwwroot/full-stack-hero-logo.png delete mode 100644 src/apps/blazor/client/wwwroot/icon-192.png delete mode 100644 src/apps/blazor/client/wwwroot/icon-512.png delete mode 100644 src/apps/blazor/client/wwwroot/index.html delete mode 100644 src/apps/blazor/client/wwwroot/manifest.webmanifest delete mode 100644 src/apps/blazor/client/wwwroot/service-worker.js delete mode 100644 src/apps/blazor/client/wwwroot/service-worker.published.js delete mode 100644 src/apps/blazor/infrastructure/Api/ApiClient.cs delete mode 100644 src/apps/blazor/infrastructure/Api/nswag.json delete mode 100644 src/apps/blazor/infrastructure/Auth/AuthorizationServiceExtensions.cs delete mode 100644 src/apps/blazor/infrastructure/Auth/Extensions.cs delete mode 100644 src/apps/blazor/infrastructure/Auth/IAuthenticationService.cs delete mode 100644 src/apps/blazor/infrastructure/Auth/Jwt/AccessTokenProviderAccessor.cs delete mode 100644 src/apps/blazor/infrastructure/Auth/Jwt/AccessTokenProviderExtensions.cs delete mode 100644 src/apps/blazor/infrastructure/Auth/Jwt/JwtAuthenticationHeaderHandler.cs delete mode 100644 src/apps/blazor/infrastructure/Auth/Jwt/JwtAuthenticationService.cs delete mode 100644 src/apps/blazor/infrastructure/Auth/UserInfo.cs delete mode 100644 src/apps/blazor/infrastructure/Directory.Packages.props delete mode 100644 src/apps/blazor/infrastructure/Extensions.cs delete mode 100644 src/apps/blazor/infrastructure/Infrastructure.csproj delete mode 100644 src/apps/blazor/infrastructure/Notifications/ConnectionState.cs delete mode 100644 src/apps/blazor/infrastructure/Notifications/ConnectionStateChanged.cs delete mode 100644 src/apps/blazor/infrastructure/Notifications/Extensions.cs delete mode 100644 src/apps/blazor/infrastructure/Notifications/INotificationPublisher.cs delete mode 100644 src/apps/blazor/infrastructure/Notifications/NotificationPublisher.cs delete mode 100644 src/apps/blazor/infrastructure/Notifications/NotificationWrapper.cs delete mode 100644 src/apps/blazor/infrastructure/Preferences/ClientPreference.cs delete mode 100644 src/apps/blazor/infrastructure/Preferences/ClientPreferenceManager.cs delete mode 100644 src/apps/blazor/infrastructure/Preferences/FshTablePreference.cs delete mode 100644 src/apps/blazor/infrastructure/Preferences/IClientPreferenceManager.cs delete mode 100644 src/apps/blazor/infrastructure/Preferences/IPreference.cs delete mode 100644 src/apps/blazor/infrastructure/Preferences/IPreferenceManager.cs delete mode 100644 src/apps/blazor/infrastructure/Storage/StorageConstants.cs delete mode 100644 src/apps/blazor/infrastructure/Themes/CustomColors.cs delete mode 100644 src/apps/blazor/infrastructure/Themes/CustomTypography.cs delete mode 100644 src/apps/blazor/infrastructure/Themes/FshTheme.cs delete mode 100644 src/apps/blazor/nginx.conf delete mode 100644 src/apps/blazor/scripts/nswag-regen.ps1 delete mode 100644 src/apps/blazor/shared/Notifications/BasicNotification.cs delete mode 100644 src/apps/blazor/shared/Notifications/INotificationMessage.cs delete mode 100644 src/apps/blazor/shared/Notifications/JobNotification.cs delete mode 100644 src/apps/blazor/shared/Notifications/NotificationConstants.cs delete mode 100644 src/apps/blazor/shared/Notifications/StatsChangedNotification.cs delete mode 100644 src/apps/blazor/shared/Shared.csproj delete mode 100644 src/aspire/Host/Host.csproj delete mode 100644 src/aspire/Host/Program.cs delete mode 100644 src/aspire/Host/Properties/launchSettings.json delete mode 100644 src/aspire/Host/appsettings.Development.json delete mode 100644 src/aspire/Host/appsettings.json delete mode 100644 src/aspire/service-defaults/Extensions.cs delete mode 100644 src/aspire/service-defaults/MetricsConstants.cs delete mode 100644 src/aspire/service-defaults/ServiceDefaults.csproj delete mode 100644 src/global.json delete mode 100644 terraform/.gitignore delete mode 100644 terraform/README.md delete mode 100644 terraform/bootstrap/database.tf delete mode 100644 terraform/bootstrap/storage.tf delete mode 100644 terraform/environments/dev/compute.tf delete mode 100644 terraform/environments/dev/database.tf delete mode 100644 terraform/environments/dev/main.tf delete mode 100644 terraform/environments/dev/network.tf delete mode 100644 terraform/environments/dev/outputs.tf delete mode 100644 terraform/environments/dev/providers.tf delete mode 100644 terraform/environments/dev/terraform.tfvars delete mode 100644 terraform/environments/dev/variables.tf delete mode 100644 terraform/modules/cloudwatch/main.tf delete mode 100644 terraform/modules/cloudwatch/variables.tf delete mode 100644 terraform/modules/ecs/cluster/main.tf delete mode 100644 terraform/modules/ecs/cluster/outputs.tf delete mode 100644 terraform/modules/ecs/cluster/variables.tf delete mode 100644 terraform/modules/ecs/iam.tf delete mode 100644 terraform/modules/ecs/outputs.tf delete mode 100644 terraform/modules/ecs/service.tf delete mode 100644 terraform/modules/ecs/task-definition.tf delete mode 100644 terraform/modules/ecs/variables.tf delete mode 100644 terraform/modules/rds/main.tf delete mode 100644 terraform/modules/rds/outputs.tf delete mode 100644 terraform/modules/rds/variables.tf delete mode 100644 terraform/modules/s3/main.tf delete mode 100644 terraform/modules/s3/variables.tf delete mode 100644 terraform/modules/vpc/main.tf delete mode 100644 terraform/modules/vpc/outputs.tf delete mode 100644 terraform/modules/vpc/variables.tf diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml deleted file mode 100644 index 2a843320ca..0000000000 --- a/.github/release-drafter.yml +++ /dev/null @@ -1,61 +0,0 @@ -name-template: $NEXT_PATCH_VERSION -tag-template: $NEXT_PATCH_VERSION -categories: - - title: 💥 Breaking changes - labels: - - breaking - - title: 🚀 New features and improvements - labels: - - enhancement - - feat - - feature - - title: 🐛 Bug fixes - labels: - - bug - - fix - - title: 📦 Dependency updates - labels: - - dependencies - - deps - collapse-after: 15 - - title: 📝 Documentation updates - labels: - - documentation - - docs - - doc - - title: 🌐 Localization and translation - labels: - - localization - - title: 🌐 Community-related changes - labels: - - community - - title: 👻 Maintenance - labels: - - chore - - maintenance - - title: 🚦 Tests - labels: - - test - - title: ✍ Other changes -exclude-labels: - - skip-changelog - - invalid -template: | - $CHANGES - -autolabeler: - - label: 'documentation' - files: - - '*.md' - branch: - - '/docs{0,1}\/.+/' - - label: 'bug' - branch: - - '/fix\/.+/' - - label: 'deps' - branch: - - '/deps\/.+/' - - label: 'enhancement' - branch: - - '/feature\/.+/' - - '/feat\/.+/' diff --git a/.github/workflows/blazor.yml b/.github/workflows/blazor.yml deleted file mode 100644 index 1939d2b8db..0000000000 --- a/.github/workflows/blazor.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: Build / Publish Blazor WebAssembly Project - -on: - workflow_dispatch: - - push: - branches: - - main - paths: - - "src/apps/blazor/**" - - "src/Directory.Packages.props" - - "src/Dockerfile.Blazor" - - pull_request: - branches: - - main - paths: - - "src/apps/blazor/**" - - "src/Directory.Packages.props" - - "src/Dockerfile.Blazor" - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: setup dotnet - uses: actions/setup-dotnet@v4 - with: - dotnet-version: 9.x - - name: restore dependencies - run: dotnet restore ./src/apps/blazor/client/Client.csproj - - name: build - run: dotnet build ./src/apps/blazor/client/Client.csproj --no-restore - - name: test - run: dotnet test ./src/apps/blazor/client/Client.csproj --no-build --verbosity normal - - publish: - needs: build - if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' - runs-on: ubuntu-latest - steps: - - name: checkout - uses: actions/checkout@v4 - - name: docker login - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - name: build and publish to github container registry - working-directory: ./src/ - run: | - docker build -t ghcr.io/${{ github.repository_owner }}/blazor:latest -f Dockerfile.Blazor . - docker push ghcr.io/${{ github.repository_owner }}/blazor:latest diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml deleted file mode 100644 index 7a88fcb9b4..0000000000 --- a/.github/workflows/changelog.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Release Drafter - -on: - workflow_dispatch: - push: - branches: - - main - -permissions: - contents: read - -jobs: - update_release_draft: - permissions: - # write permission is required to create a github release - contents: write - # write permission is required for autolabeler - # otherwise, read permission is required at least - pull-requests: write - runs-on: ubuntu-latest - steps: - - uses: release-drafter/release-drafter@v6 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/nuget.yml b/.github/workflows/nuget.yml deleted file mode 100644 index 4ee62a6ff5..0000000000 --- a/.github/workflows/nuget.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: Publish Package to NuGet.org -on: - push: - branches: - - main - paths: - - "FSH.StarterKit.nuspec" -jobs: - publish: - name: publish nuget - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - name: checkout code - - uses: nuget/setup-nuget@v2 - name: setup nuget - with: - nuget-version: "latest" - nuget-api-key: ${{ secrets.NUGET_API_KEY }} - - name: generate package - run: nuget pack FSH.StarterKit.nuspec -NoDefaultExcludes - - name: publish package - run: nuget push *.nupkg -Source 'https://api.nuget.org/v3/index.json' -SkipDuplicate diff --git a/.github/workflows/webapi.yml b/.github/workflows/webapi.yml deleted file mode 100644 index a84e28f03a..0000000000 --- a/.github/workflows/webapi.yml +++ /dev/null @@ -1,57 +0,0 @@ -name: Build / Publish .NET WebAPI Project - -on: - workflow_dispatch: - - push: - branches: - - main - paths: - - "src/api/**" - - "src/Directory.Packages.props" - - pull_request: - branches: - - main - paths: - - "src/api/**" - - "src/Directory.Packages.props" - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - name: setup dotnet - uses: actions/setup-dotnet@v4 - with: - dotnet-version: 9.x - - name: restore dependencies - run: dotnet restore ./src/api/server/Server.csproj - - name: build - run: dotnet build ./src/api/server/Server.csproj --no-restore - - name: test - run: dotnet test ./src/api/server/Server.csproj --no-build --verbosity normal - - publish: - needs: build - if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' - runs-on: ubuntu-latest - steps: - - name: checkout - uses: actions/checkout@v4 - - name: setup dotnet - uses: actions/setup-dotnet@v4 - with: - dotnet-version: 9.x - - name: docker login - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - name: publish to github container registry - working-directory: ./src/api/server/ - run: | - dotnet publish -c Release -p:ContainerRepository=ghcr.io/${{ github.repository_owner}}/webapi -p:RuntimeIdentifier=linux-x64 - docker push ghcr.io/${{ github.repository_owner}}/webapi --all-tags diff --git a/.template.config/icon.png b/.template.config/icon.png deleted file mode 100644 index fd9fa41873a242c485b6b8570e273e8246be3259..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153939 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%0A&u zgHfC3y6UH%g19#QTb^Sk zABB%<2SG#^Z8iHw$`>@C!d;4`$olldHw0%ctxMt-G8*Vr<8xs}Vajd={(g)MXZ5Gf zBO^>nXWo5dc&8;O1H1^yepAgt=K z23)_ld7*cw8H%p@ra**ChPtedOy3=YwsVbU0rrAM0Tw(rqM7kQ71(g#n!PWL**2aX zmO{~>M!&!WX+C?-2L&onJu5d8*14J;J_ld_LZL(|2heKW0v2ux#(y#7x6I zo`{>@Y!CFS|E1R3>x8QUCib^531e>P3B}~ts*0y-LdELU%PXi^+;+LI^UoZQ7&S0* zconE<{~N9ZXOwfn$S8w=z`!rG{A-=|$_02+ zzf}(KjngZ4?N)s2TkT=9B!6-WM2gCiK;*X=#FE_vJz$uO5JsZiO&b#Ja7W#@RwVK~ zJ&&6|l#gi+l!=+CZ526>t;q1L)m}D@|hZy;2V;#oD&^D8U22 z?rjBtTV5fM(F#$02yzR*2~O?66jiK2a8J?0t(?W?UOhba_CW^pgliAKnu%|Cna}64 zrlEn_bi3~lkHci}qC982zhC`~5tn`b!iC+K>Qa=(s{X&&dJCwkwk~Y=V2g@Z0Wm<7 zkWQ5@1Cd6$JEXf)QMe$29N+-bDSZg(RHQ+alm;meDJ}iaeek~D_l@y0?sYisxNGmV z*P8R0&z$pF3tE+XaGHwI|4nKJ--UgvDG_SOn5GM{6f(TJkY>e+&jjC$_n!LoHy5u{ zM!YNWI(QcgnQQ|{c7HjGBFIev*&Mi7?(t7YWG9#cngYw;>(`LR)RFHiX5;bVap-5i z&Ya}GE;j26E_NLspNPfddEHzN@S^ZKW#pdFL^cw<;v@LVlDwLdy$Lj@f3!}I-NPI; zc9H8M22%WIo$*Lka!lv!2~;AM#8*7`S*m+so?!Bg=6a)+|pb_>O@#WV>q~G(6f+(^&2-y?a;Hv+r1B?RwQdD_L3$>>TWBd!3 z^OT=lyq6XH=xIKJm_CQ#RyKIRWZht(iFQ5;VwVJwLXSLYvX%ux$+K<2f9KI!ni7Z? za;0OT)Td2Tj1=ymi|bTtEl>%Xwf}Svd=Qp|k&*Z=ZvG{NME>{|*tlx;0W^5bF8ZYP z?$-z0-I*Zu7a#b|^M#O7g3}YA>N|ij{up50lb>hd)1;IBPcSN`%Dv%_kcmdD^?%H# z9fDWw^7GxYSz|zmi&n7&P@Mf=I)2o|HG+O0#G>KWZ>&gp`su0*+61808!yU89K+Ae z0V$G(Bj{a)M{giKpfy-?nWKjM58P%9i7P)LuGAn1AyS*A0;x5sPm)75wU53_a6od) zkPW94_pcWhgro_zrI8^9|P>)oL6pl!ICTR-63Z}2gYwn?yojv@Zm`;ipc8}dJnxGjyN;3X2}7y~b5PptA6Dy(padB` z{}Y89h}IJhya>Y1{edxBNU7R~(N+H#N>`FG2Ci0#c;xg2_*_31@aq<-8Y7y*32wJ>@ zndB^&&&8`Ye9L>WQ0|F`%|hJwKvK8|rW|Z41TjWDrOqD}ASD2CKo!)+{&F0zzZ_>= zj!;$=;W!8Q*gNL^(X$F)=TT*|a$-x;#?C=YDz+4<{r0>Ug|reE=XAHpoauC%MXe(u zeJlDs5BayZkP>q08Ii4RGr@ix?i5pwZP%(${Mz`92irdfU_7ysN2*Uz;MvL?-?EJQ zp;S6AIC<^AQt9H4iAmX;{2qJwgFJN&sQ`jLYe?>(Zq%xWw1Xx*-!4?AL|B#vrCPWw z=)dMiOHsoA-xN$CB!sWTlwB3rh9u%7J(51?%OQ;J$cX^C8nKo~P9#gi>$LEDWfw** zZIc6#(5ixauF0Zc22?32$rk*z0$19J!G_UAGpet_%MD6-ptuKYv2*YzNE>)vOsdM5A=O zZMRO&*Y`tf98QL!?fyWD`Bs0Mp>NvlZFUYRQp-m?sWI>7`Kr%P(PHR!3PF#(P7vSd zKKkX`2{$x=Dio>6fxtitNn0Nyaw#RKm~L~wHR>#tG5pO5#p}eTpHHWkwu31x z@KmVgJ;?ULrNszPC8@v`(Aq^$A@CnngP;Xn;<^8{5o?~l7ER2%vJ07lDWa!v9$TXj z{?qR@(JlOkDRQZFQ|jD0+g%co4Wu08BMEH$|JV7P1>RzSdVut34w=OVWEKMWs!%>S zEsC`uITXKlMIJR_*eN@rM=D%}vzt#2rhc?I9Mqq~)l5O~v(rFt4X;sLJTyd89=w)4 z{D!~T?}pC}8&x8LYx^4LN#{#eG*>$QI%7JG z?ATg?e?rx)!9^XsD6ixcen{vM^04BOr}@Q`&C&0md*P1lBIH%BfCF`clKs7Hw5 z{6j!))P5F#Jyf(H^gx&P25ZqIs4v!%l>ciTd&B8%#7{z}S*F{;l6)yh)i7%i%l=9X%cKkjqRN8ZfSzr4v zE9o?Hjj8rWCiVzvAnQ&-HyBm-#10y%5LLd*LGljtr40&1qd)=OHgplJKw8M0p75R; ze8u(XcK9DYf$H)%*yLmAk;?8|iV>^uJt*lXJe@?`El*-~3i%iuvU*7Jj?y*2Bg`q~ z^UPQ$M!Yx)k?}7t<}P?NJ#S6NcPRE6kwFE>AUr|JFZg3NMB9_i2f;c<`8%`x4dyP- zq{vZm=lIx1p+QI4t|w~K@F3vd;a>}svNxD%?T!Z0P30TbBBNYuMp$Q(J|PM z@TtbnXrRwKn2M+ic~y;vSf~fwO_=IcxDd-S1yLYP=Lpz}HNMY$!v}E@u9zdm+Z#Ca za&>2<&V{9Nlp7>s6i3|)IDCzaNZ{-Ho9O=1L0sZT>i!8PoZKO z#u)CX0-tCaY|=nhC-KlF5b|B=y#GU&@a0vc&9sN)?m>UctCZ%HhhGgAClR}1v$uyo zH69!_m7~v-;7_?}ix#zSmcE^7y;#f%1oStOb<{&O#GDf8U-;1UdOQ8E%Y?GHEh?BP zO_KSRH2##Tl7WU`<)|>Ey{-bs4UUKt4&Ei~o#W|&Z!c#kR|8H%trJQ_ncRVhXxB4o zc0MJx8}`9(OKK)0B(|MQ7>y#F{9Hnkvd&?cHn&2k5)ap6T7;$BGT4uMeYp@LK)RK4Q~;YCH^9SFsnMu48n z=R5a#j~JYbv?xpFTQb-e27GCyx2aY0Ud zwADD&4$c5PW*Z@MhpRvmB3k}zbOdSlHd6{ZbLzbJyj^Y8oAiqsIW4n&w~5I6pjLXd zyWeYX6;YDr8!qzh8j<1 zniJ1eO6O8`nbXBnD%eGU@D)6z0wq(eu-l(CS#p@9C*DGPx4+&->fC{!s5YL2F11(z zt&({@6Z-^fWoS5Nh@`zWe};fj-TRMG@eUsB!Bypun6L?}+1^RS{%IfoPhF3y+d*Wf zQs1R2=qezVpG~mOATzCYtNLJN|+sJl_=Df#lxm#;p`U2ti7ZdMOi<6!^< zt62E(Pr>Fa7HLM*DbH8|&(3%}z$~ATlSa;%6%1+tbb)yc!UxrL?#BMFMP1Z1nBYCG zy1RzIm%u_4S@=XgQTgETOzA%Pd*NqdH8|v^3gJqEQ7B0d{I5+-Y3_Z1KcoM{4hiid z)A*34aDz>uCrbv=Z};16S2h*xmaN=Uhbd}?O?mV69qb(@RP%>~Wi$RhIIQ04)9!_z zU9{)e*?-O?zr1xmaDnmV(7*GE!NKQWP6|vipMP}Of!xH!IBb@?Q{ZzDVTNxYfAYdB z+IR0#`3#q3mdzcNtd+L5#7ve``EQSSW@QU4_s^qKE6^T~WUR(&#@xTUG8fdiX5yg4 zfO`GefKNnEPr(rWuFH&(weu(`G*uZ0Z==1}NRqLVxul-pRH12C->Z&&_AP}0VXq{C_@YqdEtrLWY3YpHR#mBs;&^yu?0$G@7@1RN zRi-~qQr~p`OmBo<3R}0+_iStMD?&w`=lxy&uK}6})s5#}@M2?E8am^a0QH6CSGKMO z!C9;!S*z%bs%NLpKT%`Ft$f+Rh+Ur7n2AAdvUw+qa3K^*>KtYat)SmVq;Z*PQIC8= zO{k-cE4}N!-heg?E0^h-fnk*}j4B=64>ffhF#{B;+n;vewq!idF8>4x4<<13^!>@5 z%c5kb=oxJVYE!Wi5;X9MX!u0rjx3(zh#{a*>699UZ-|zbr|wgnD*t+RfU%N2xguMi zP?24iU7|R3msT)Nb*!+@0VF~`IJl?1ZEeFzA2Mq?J7`E zV^oYERvwg%%ba=-#U>PrgsAPVJfG37mXShU`2Dyu<;-$8rIB8ajXp56v~W(-Q|E(i z3sT<(Y_J^O!FjV(RVR1Y0Fn2Jtv`?70oM*9)z$DHg}%&1{e#3KxE!A}iv%X;chjeB>`KOzaqsh! z-yAdZzMa`K`T((Tee_bq`pOr-88&$Hs)^qk>YsDxCLB2QeOl^{-hZ;*4z`k{*pN59 z`&Pee3YZ&{h!KVyW#(er4c!0b@;7A1ya%)A^Ln8=@J4ea+y zT3P?i*qkeSsU*~G`_8?UX8#Q=@P!Vt8_3mO>}f}qAcCF_jfIU3ZBUW88j1b#Y@;$z z$yHo&lzx|AFT59hQ`X|S7kxpJYdU^Y6<)BVAX6Nt#~hAxy59yz{qwnKFRQZT@k-I7 z!sy%n->u$#WGP76&V%Lr7e6Mf1pw!^t@LSRpp6-G3!$3bF-)On-Y`MljIABUfT4sj zr}?E1pN>RkY0a1e%@igPoN7l^|Iu24#Ln``QWZOS_(E6zqb;@JEHNZgD>Nu!zS&>T zBXC=6+L}eaBZ6a_sVaT))>h9`H@U9vjT`U#-y@64{{84fb;&VeFlONle3!=yLaZ4! zDD!7>M(jVwPo?DaKE*kB@B7V|b?d<#?+|wWLRPenq3{@nyf)2ZP>E}?(2A>(Bz|7y zxu2{SHod2sHrK+Bz_*@Ry!5G?H_TKJy`<&hKJ7Chg_2|c6LemR=w>mjGs>r1Pu!^) z+{S2|x!d&JBr`S*ZT~r|GU+j(53(^-=q2<=URW_c{L8)F&yIK}TLE%wkVnhh5U*gPh&v-g=z#fmHTbd=v8fuQa>8-hFd zA{O#Ha(0vw4DfQSijsHoA@DWOWX4S+5FfT){8}f^ z;x0T!i2ff`9S^1lmJsE0Ru@qIXYj(Uwgo+M42c%WxAq(QjM_KDjqV!ToDWIWKv16B zTd1HW+W$4ANFR|xBm59IpcnpSp7X^2?8a^JLzy-;u`S(TZ`vd&(sjvylV?BJ?(?@ zJ%@i?6d@SlfSrVenzs6hppKOxMt8}_#VQRXIjir3eTNljabDs#VDy+39uWTi4m5?< zRaHCvlGuz66~n8MwLK|w&ZOBt(HR1INYrA%l?H5dT)flA-FXjzcoMEW(4>PMqT0M| zqN~{v%MC?BR?>gYW}t?)LW8^2Y-2Ca$M~khl}bLJ|Gq0-6-{xSA)Z;7_E@7aFGfH6 zVOC|$>E} zyk9ptkWa+}$cL{R!k*zBMPveG_Aoymay?fTUfPlcDg+LWk>2dpzNWDK`V#ML_$pTf zbv8P-z&=#)v3QkIB^6oucLob}fXy%4oj(5wymIOugwzIQKf{5bYvlD9hc~H1jg^`nPrHFO@=_`Apgn&zh*PJF8pegd3t1pw zL+mFziv3Zim=kE}mYRcqTqcfZ57v#4Emmn#a(eK%B!O+8qm>lR1w%$6RmT+dk)3Y7 zsOgBTN!>mD(*t8?KQtDm0dgA;%O(HnN@QL_jjP@iFGUCg_Xu#JDGsEqDP^rGB}E%~ zpBmY0DHMce3=*-rBKW`bU+3X%vd&)E`#1T`%Q+XJOvU;{+|y55f*G5<89n zTo-9PT|X^G@Z*=c`yBBcG7H`JMIM;g%NkBU5MIF~(2cDymn6|4#w<>jpb(;j*}2f+ ztx}uBi~s5D{nFk$m0`pSI@msbXN*E7NL#UY8LGX8*TvJXD$u- zH>&*Y5m2nYn+{!wVySHY$s`=qrZe}fqtYO&jGj?8ioo|--&3~=uSaXX5C%-}VZe^K zvl96*k()((81jTPi&nsNi9FonW}^vSuh+&qJ=MHvc`Ds@ch6rXHx{oD?^1%X%c1LU zA^fCYFgZqK&#Oh?V=GXC2e$36=!JY**C#?h3K9yI(AzGmTlCMna7tZ5sulj6!|hS?}Z7~5B$PxN(V*ES}&+ z!Nu0dpp%WO>UI)85L?ojP+C-?WvqnjNdAS7WW{_efR8MNA(40j(LNyo0$X@bIK@>p z<4&T&_M44*;-cq{fs^F@Dtz}JSz^tsfpM1bfu4BF$^84O*X;n;v~*T&tIw!(ElT?3 zfhn0`S)M(=6L;)MfOv%pe%n>9A_O8GUowRS#ZdD$V1Pnk4EQeC#c|JNtfKXmw3V54 zf?$d>l5RQhDg$^`Bz_;#PgQy${(&Mw46F=^ttD(s<>|z?BVU_U6Dmh$aDT^sB~xf6 zGDhNC`NJ;$`F?J1$*wWxKXyiu69UcV9-lv(>XxCx;BGDCLF|DP9}RaYj1<(2x`!h^ zwWyVlXpzgg1k1*;rS-)8ij-V_MJ<4?p}~QFcj$zzTSF4VYr#Y8bF3-i0z0p&JaS7R z%0?e-&;me=nGImpB6v)B;N+!VZG~jr;(i4AIK{Wb-5|bg>(_%yr;g?b`A|VE{{i}e z%+*M?nT(x4`1s2a+^w*s*|dW3s$+Xk0WU3(*k1PqX)?f1?BzD=76w~Gf6IWgvRB1i zFtU#QjU>W!G%?rgt}gP4V*xD3B2>r7IS?d@0`m%#3hTVU6XncJDtzg&|Pyj)A7V?l<_T=|lU#76X zqmV$wf;)_eRH=+PuRs)JE~+>qLw)WVpL~KDD0+0IEnQC&LQb!iO7f4^cg+3- zzSIvV^t0U>3%7c|s^;4t3U3@3>3iCLbGUIbd&JS_5;f&-f^qkn9Y-@#THD?zxw;m3aKQfBkYigJXWQchmva)Fh7(+?yga)-x}zbVM|Wo{z9*BSP?TMI!{Ag2^_0q<*lh$xXt-U?L?n_Y$px~ z_sGj$tMlLT&R%K59UNG*{jnpZPJQ>A;RGsZvfvheI%?p(mb|tx`*G~75HB4pANMXZ zJWCARkF$AY#Lvi(%M{OH(p#&n*kd)Yy@7F#`g#H-a$C=@Tk)s(IphgE3~dEdBpP<7 zHI2|}0p(|}`U)>S+aUcLG11qTjOuh>HO;H2^;R`ZJm0n+tgSxu<^z#K?f7O^b-FzP z>fLhG(Wf;tK#>6$15pt;99cY0Wu(|PB9;QZXjC`;uP%L7Rt2p}e}}r_*q_eodBE=1 z(qJdI67XeZ6v{4yb|5MAXUnPrKroUUapqLOzDCb;Q=H~)kpEcL#ci;uR;tq9?rN~b zJtU-Bn-mZR#pN)3qXB4D<^MzB=%zCE7N7NMUJI)oHs>R<`_~dyBjy>e`RLqoIQYG0 zZ4yos*_meUzdIXi@|VoTU=2A~y~|bZgX15RP$6tC`1kfpMyz(e+1I^@&eFZ1y5j)s zS@`+u*z_Vcj*8;K)4GQUt)p7QM;^TAbNEufOo~$Cx8Lq4zI$cKq6|CR2_L_WIEiir zay$@zq}VV3ioB2>DCoMgz@jOS6w?xRq$<=sW0q{7ReBL^|8*y(H7nYBVeiTOMmjJi z_PDmr$(Wq8jS-`E<$4`)S1eH)EXkUkg=Y4rn(P zcP>a9rNcc4>~S_m_z!PB=ky!+1Sx`d_pXMB!bVeNX4rv z-Rj`0->zGY9Bdon(Xq!^Gm$SxZ3E^tHy_BXs@c&J1&7@%=~UjU%Fn_EGpV*6$nbnF zv}pKwU(~Tk*`uhc&}#Rq^+!!TKH^5>9goi(u1H=&cQ2jf!&Br@QG^(3*FYAd)2UGP z;5Oj9WETyQX|+&4?Z&Cz6;1g^fwDwLr7GW$bcV>G^VNu19 z9lh1hUXPE?@3t1+(empubVn+cB=pkR*kM>iBTte>FRL^)hNCz3nN>NJ><$i#(w=`D zRv-!RuE|bWnW;Yf_B-Omi%+|Ndz|Kc*HTT{ecnl4Wvxpcw?#xZC=tDU+7Hc`4_`3T zMisCKkXmY8eb%AGaWV_30r;zyq@WA0rQMy)IVcSb9Ax3I9d&zw;NR4-qgX2Ppg;g4 zz@Z`2gK1D{xayDXNy&m#Y%iJ0^)mwJ8{10C_pMjj2bdDf_TiUI^kA*yP5B`6yHk*g zTzrd4yfxq@SyXYG>x&k=i~EJ0^cNGSLIACnMGf>xWPqnmiMzQc|)6t z@{?rJG2D{bpNIOMlOJI1=Zw0`5p!Y|!bjA)2bg}Oddgb39e8bWRmDYVH~w;jmMRV1 z7w`}vZ;|PUwZ8WEm3s{sZ=83cm#0D+vgT4;d49-DP&~mD`BRXh`(kkP&5jtwkL-yR z^OKC)m(WNV;W3ZAes8oEG-n=9SX#PN$LcT(ptuBG4WDyV|dxBGa1Cp`^6m(c&_auU;t zCU$8#&-59$q*3LU++5qWQ$H|=*%iv2l$Td9xPZ8vB@QpfTja=o?>YaJL3L8tEV zcp$zI=F^STR3soroGgO6IZsB#4GAEw;SE|>$jy^X3vKJ2j=j< zjAGBV%|r?^s5)FBZDlitxKwP@`B>xl9}9SM#tanu?gMsGGq=f$n@X<)@n#<+B^Nr) zf5nzo)gugRlsO(>TsnV-mp~1@S0Wp1)Mny7#cO6C7xNXqrz(!jQ#ILQONV%O+0A# zk+0vEFgZnZbAPUFohbsRGGXIg4L`k)g@xut|Sh7);s-AFKlI7^Q6^Gd_+HD zp!HXnqmapTrcaBXNOkku>EY_hOrlo$TE-1hrX@DzVKSuvwk#^^$G2tc9KOVouAU%SJ)tP{byvRL)bS#1uV9qo zmM*r!&#jl^N6O|WtKthz1z#u$eIZNLaQdcn2iIz}N!U34iX5Cg^%pvEFhSfbF=CD8 z$&Zp0m+hdgKF<*uwPhCTJt$+`vsF4Np)?bc z$t;(AS*Jjt#DGs*`y55=S!D_V+xrnWmsFZ`L-k~ z6Q`Gibot0osHPN~_YwjT0qH=6O7ZNomtfI^k*Wf|#j#B#ZG ziGy+t9N5ad?D(YA!P6Bz9N%&=2Qn1Dth)~!-s}|l`gI*6uHV!s^bF?A%qcXD#9rV? z|E*bz5ct7x`A*Eo;q%8&QGX8AXCh&(0mQd!@E3ONuTW$xUV`b!#2^lE8_%+$xLyY9 z*gx!je<@2|D??uC6Q^j^?d}400_L{s19#h0Qp-i}25+nO>tfY+`Fmom`d=Jy-A~o% z;rvD$S-BY{!`yOqsL)rQD_Y6PXXQ;;5xFF-iNDfEdRUa*o>KcdsG*-}Lnjvmij>hG z6fXrgc6y9oJp5^YxKHW5{|*W8$bGax`t+0z%4WojpBtB{-%qlO*fB__{^S#deafK| zdgZYRg_k8ge@@AP%>6Vm!VE#r(>*-j@^acPD>hs9CGE%gK}+PG)XJ-{wO14owSrm6 zuOA^Ls!zds&{Ux&Zvq=>Z+-gl=WfEzXJLW<(Y`&gi^4WrZ3tT?yn#|WAJ-hD~> zo-DIF$EMi$RW=x?bkoD&)xn!e{;f(BjQwUTq4(q;-v2Pv8)f#rMzLr!l_6pUe8`j6Ef;T2+sELtQ<8LFB z5mtA>M&+XDV|`5Xx+wdrY;ti|QS7+OE!Ac>7Pu&m6EiQpHM9NB+`;xfX&_Ynq#!|e zDEnJi%aFOx5n1O{<^*!z(WKoy&iBr&ceLjCU~hk-mgnhvQ=E@<;a6SEYpLWBr4AK; z$QAcxXuQ*?D;|3Ch3_tZT5sij7Vft5ypZ5Yz~WIMivuHfC^i3uk@Cg2tQ5U_Wg77d6u_dzsDx?VVdhx z&+&P6uw-=)C-Z6L+;1(rM)9=R)Ow6yamifK(=K7Bh}T}2h)#~azp~nXXFc1`WTSnQ zrIm=&{Un{qu0=yX`S2L-b*lU>kH6k4BQ;2qf=NgtN4iG_en;OB-XSaX+B!VgFu?EE zY5acOQTjsMQS4ZB)D{yX(g-CTOhEahUj zb{||6y@=>&eqM}cW}k9SPsrAuOhCG)-Q9GB+mX;mV}w3hg`Qj-8_oS64L+aFgfwM$ ztqv5`hpr}g&4tu%KNb_4H@UgFOVu%5{d^oXl0`d^8ITNz-KO0T}W zDhZTU#8I<)sB6xRw&6T4`IR$%N=l`Fl5IZzEDrH@+OKtTc0SyO-()z%im;)-g=k`` zxwGaQNoWRnTFG#!C@+gPK7r$NmJzcV!gmt|Tb?Zb8u^f0UD^A!D?aKNhB=pBEu*2q zenWAsZKok`7OHs$g%I`cWi$)aR%pv)a))A|PURbzY%9xidDnv7Zu}AD!I!Z;wTjw9 z9pv*lA3`@J7$1nN-}kRRS6Vq1r&RdVK5)+PZrEAZJL7+fGhBkNkam8LaH|CH3jZ~l z(lNpxwf{g`qpn|8n?;744V&G^Y+^Cd`;D7uw(kHv(MG zbuqQHefDv$W+`|-p>`$ZaK3N(V64`4*nt%#;+16c{-K8&(2wW|d($P=fAYF{S7_Dc z1tJBb<>VyxIke<1b)O{7?%|GAPBsbAUiNyV;lA}e>Vh-7xPA>)wf7R`bIWOo{pYjR z#UF~*^sRupFs)?F1?s15Zf4sXB>1_dw`~VxSGUY;xG5>~n%I_QtaB&qO=1sIi&FOc z{A=vDw7biFGMlzfMV-eZ7!R!;UED>AgHLjbFUHYK)S{Lfl>6-?hu;##L+QHVQ`Wkunb&3x4+bPySmT*O z7NdfXPthbS_Wu0Ii+D(X8QJ{X(fz@m=x^qN{P&`amMNsjhYB5>aFdK-O1InstwnIZ* z-QO?#Zq<(j2rg=MVQsVmMKMtZJuhkW5q=bid!?mq4Od$DfA>w7M&VL&En!r(L z?8A$`+X$Xp3_TOa1r^$S+&gqEUf%8A^7`E=wD#?|v#>c|Kkn!GGpHGSCO)1|CHvHx zMJvr-B9igvh3MepQtm=S*`&1RJ|-K!0J1hXSgpY3Y}I|k^Q~R^eZRAEb0N@G%jGzrnbIz4alXn(guN(12(9sUB(-R@cz7Rf-ZnZD|=n~J|#z}FS{wnQ325YX6&T@u& z3WcEihDXyCOWZ(14qfb}rb0*UZ9*2NXzbWMA?(<)t7x>BF?M_k8pJ;a^hB?m?Ai8^ z&lGeZysD>$(Wi}gk^CIjU%`LTW3Mq}56kAUC44w@2|=WzhDai+gGdP%7cpz@<&ch} z7kN;`qH*qxiMig2#Rky^ZaUb~EzjW1;ORNkzg7r7JFJ!H4|5qWM;6W;+J+I$LP#&z4)og3JYqT{{x{WWf;6EL19EXIQ zAQL`4aPHj4TYPN}B&a5aRlkkRR{Qmm)}rDfliGMw?+7(n9%|B0WkNN7_$+e=GsT?u zWjZM0AYXy3-6N}}^~306b*R}x$8M0I{&%~Uw)fNN-Zx(_k||kKO!qk+mR45o1_Lp# z>~LTm@Ax@K7)6eUfRl-L9!6#^DER3Lod@^ zWv!tlF?BmcSe#C(e5SVtFx=?Nr%~@{2GSA2t-DI%PF-Q!XawE&i*j59-EzY^Il>vP zZjC+Fc!xa^x=4*-*7`>$ zPcploapCOy;N!Y42QX=A1+MDXV?K;jUvR53N-3e+iVA*hn!%-+DXhLJRIRLqO;~V~ zw~QMR=zqa+(i{rK>5r>5x`8q)JH4ZbWT*Nki2fhV^{=|A4)c^=Gs_2QrKMZmf{@&3 zA@-Gi6K`MfQ50ES_luY195aT&z7%wwp5+QDD`qz;zPV}b^#Hq3rN?&}@+l1Xz1g!B z3&DXsv{&)`$qVT}0)gxdV3OM&2DV?!SZfG(o9`xx;K`v^p9y#@A=E$OI-Y*fa}RsS zJTi8;2=)~NH|Z0edBX)eEMOd-UDGFZ zuLB3tQZG_=&e_iR8dLfh)6WS7m9LvajGmH@@2f=6%QfK3cN7g0^AhGJ*uDPM!1pZ6 zhs_DKBao8U_26@*sK!1FbHC*q;pC#9Z;S$Nyb`&cO%$OZFcI{{r#Qb}s~jClYpzh!RvU&frP`@E$%>1kV~@Lp!^{u3R}?fwvfKhCBI9EIVVox0Zx z3~}gHdq>;e>#mlp)2LWY%QAV&80TE4jir8r)A3!S4n?@9QBN$|x(3oDi)pxIWyxJ0 z)Q;?<{kpDo7eKeZNq(g@pK9&++>ak0YT}NkQ{OgG4ZNbVLnUhDyy?K@wa^%HfF1Jl z^P}{b`c#_|eZohe-opfX6Q;?-WZk)IV;|bgSQ9Od*|g4(^y2znbIx0nF(YL}AJg&NwCwe5QEt;GWvyV9-93TmlRI7Li}Uc`rNlnnQ-siVkxV;9 zHo-p5jH$IO#>aNMtvbugS;~m)O3PUeU7J^(WQwl6FMEq-b6r*p64bWpHn_dh1`*5n zGXDKX=9kCNIQ%L_;KjpjsL|k&9-bei`niu z$wG_kka$d-BzSGS+qTq7lKG5RSq5pC;)}};CoF*;oo9Ij%!y{prxO^Cp_ChsDyh|G?tserVq{~ z0OUJ2FDVsw^#jXT=l-^#xJBMf!hHozh0m+>OM1>p zr_yp9C+_-mw^pnx7d`5|-{I^f-Bl~NIxbj0d3bMJkwX{Mhz2wO!@Rnd9??Sg4^Oq; zL50mkm-I`Ci4goAys4$=nO9>sN;$`}7TLDSF#__zsuGE>Z1NjQw&k?P5n)2Oc!g|N z`n+|`8U-SQYDBKGL+QSwmF(};&Y3sXX2f&YTe8I)&Sn~RA-Jpbw;*{N<=^7;wCy;3 zuQpxzO2SWeBI|Z)XVc1IS_*mHg#c#yr;@b$GdnTM9#il~tTpIh#=qbbweu@O+9RB^ zjJYg2rpUr0$0eMv4668&|twy_T(u^Uzq;g2C5nzWnTZ;c^$JFGxYR6eTNk zy6z$~RYzL`;xhC|C zR6e$7{b1O>i##os4u@NuzkYMLCQr`~#FKK(_+?CQhOFOH|I-Gc+p+W%6#YNDJMTZ% z*7iD_AAf~l+ZvNl;tiD=1<{5F80q@5;nk0YCfsdt1Jna~pyy@5q{h%x*LZ5xtCV8R z&%7r(fqMP#>o5Y)aMZQ_@)+USy*O3i8g!$s$2D*9e)lCGjsZ;WTC2))(Uyn%n|0@Q zI`ZDOuA4|Vz2x{HM>T-vPf@WFmFQc_$m#nw)%3ZCuZWd{3dbs*Fz6*)zxZY;XM6OO z;lqQZqEmNH;%JtpO*;n%t{z@5k%SL&ClUVRHU0wqaRN;6s@Nf3FX{S)=ai}<^vsO zE=fBkh1U3Pno_P7i0$z#IAZi%=~%bR(5Cx!L{TGBgO}4qojCXTE`1E@s=`>27{wz& z_-2zY2K*KItIR+J4cvxaDiwMTf3D*pS6Pa+GEymRW|5AO@f{`(bHJu{z$B|a+gw34 zOWy2;y+W;awClbW5{N83>%-g0UU}A)X5s8y#Q@}3=Wt}Z2`YD@LFI7%O3-Z{W@mB# z;jcamTF)4!5wW$=i`1r)vF<;2#YV^7s>3zaxL8*kdtcdTB%` zV~6t&=H|;cyE%N$s{DM@x~aC>NWpt4#%Pnh2JHnCWaP(6u7a5J3FvatzX-nFy0c^& zgkMB__gVKPz-@)m()~b}M~I#3-WV!rCM^D|!vtNzmxy`Hdo%%v69 zQ%!Z3Ko2LLB|F^hV*WG!35FiTBXtqikg5Gv4L-2>s>HY=2FG0G>ii1p-O?xT!`w3U zB;%ar*xX`V@XYD-4nNrpqfGBlyphPZsvJ8eRo=NbU1WSh3KOtEWj@w!Q%{HflwEZ6QikiI#S&2740yY zcQk_ijib_aw=pcP$-z~$!OUzR=_Jxo21hVbDS0aT7ru79(eb0OObC44io|E|RcD2U zQbO9xD$x)G^s=ObJ|$dJ)5o^bnX44^%-)a7KuKkLhuPB#76R5<)9$w<^PA~#+&KNg zO8xC!-9cUC#0+T44RJGSD*4vLKC!D7L+0t!sBSbI6JT(hA{iK__*6Fh^Hb=4+>EpM zXby51gG|y*Z@0p4w*+fWkIYdD5v?TiG#Tn@63~8MYDUg7ug|<9`p*+o0Z8y;H{%hzximg4ZQ0nR!>c77i zk?O7PAhwtf0(SN^7e5n;Xzl%2YVV6E`V+>T#l0`eShM(?2@hgXHgnp~$EZ})qJ_ll zs^4UC1Q@j2O+RJ^eK<4a$zzQZw$op6&o*Bz==A&`hlQ$Qxjf6T`IMkEyP9B0Rx49K8CEE@SkS2jI8{qMaU6)GKD!} z{l})`1>pe*jx`V**-7z6-)Jk|P!4tZ_fRNra;cubK zmWvImgWBNM<5y41=MF~j>GGYDyK2!wTs-}Ds1WJ>t{6{$T~u~bdNcg<0UQr-Zw0Zd zse!&$J#y-)?iIes$P+OAyDrnVX$QWYuO9R&&Fq33ND)Y}xOl6hyK*N82 zXeJ&)*LPnaO0}Q88;%!6(c@VO-FN}HmX>oU((I6c&M6t64mZVddR3=7H1|^TS%52< z2d1?^9GLiv#E`kA4AYouz)Z9P9537kbQqVyqeE;RE$J-dObD{xDHdj9>7N$zaaTq3 zifHHr>F)YbQ;!Y}6X{B@p8R8$Fmd4d(D&f+X1 zfX5M_=++g7?sQ*5ksI;?b}|+ixt56q*}4?jkvT9_7Ajd?0Tv{sTyBQ$%$C^ zfQRhEXCXjUhx?5Os&|rEd$w^}6<+{6d6GOa{U*PF7y%VHsHc%3?quWh1ARuh}L!bF^amyUOJP!RMrIU<_Im7Mh9e5gL8&e4Ex_(n2d& z`NVC+ox4r9DVHpNSF?wRiq~(V56hmS8 zIo}o1i_KaiSqoLHEucQSIvocx_a)ORHd|SPXmC9n0aiya@Ozwx@9Lhm-2QoU;DJ>G9J*oZU1xB&3L74rY7Th;LR_nek1Q~u+yM9Mf+aCJiN9eSi037$bUEVenq1DHF(qH<+ zgC#Xa+$_w3Qhd0(+3zDNNWYa91dcAt89XW_4IMX8<+ySrwL-CrTh!7H&C-W`WejVV zcwJ+so^-g~q|k+3m?OZ6sBYF!nMTbv+Xl_kXhoNOSkXWqm`zaJ7YCL_a#QFo0m|p) z72B75*$xHxb=r@9AUL*C0e`;}M$3C!W0VsPO)%tZWpZUM@OA*Pyxb`@p(-Tqjfi>s zT_p9jsOd;i3V}$@dD@ZvZ_e4mJF6vE@=!ZQk_zV88~kdg=ux`C)rJk$U`+qyCroSx z3%?;lcUS~}c)#}`F=LhR%C+Cd)2zS3mBPY{i&T|M$DodcF%#dC+|kt6n#?`7l;PUv za0~VN1qMzPk}ykR`odZ7LI9MRYbjAdR-pk|%;8Y5G&`ve5Ay8mAGPK^S8#gfKh=o{ ziHp?X(AE5P${d}39t3r^Lz-L(P$HkyFU4g?37a81^DS@m6m-)8b$o6E>MU;I{YvTT zE`Ry!-~O>QRv?Gz`k3RFpW`Vi@3fOw+{6=QgCs9nF{=GGrKwo9suV6uo-o^>ySjFG zeHlqku@MtY&L_+bpSqx;jKyWXU`l(a`Pn_soshaT6u}Qj#G7l^cCJRY?)d|8Z)!ZI zNrUsl!51kWBpS)R(;xkJMpRAdn26OJ#awsW$OZ(E=1Yi*j>1)vTLg(6DY{jLykMH!tbmG<9RyU5ZPK%rg!`nclD3WibAVC02AKE zRkc+N-|Ayawc+odTmnzQLl~VOL{3fG6Fw<_+SLfi2zue`j1Y<5QI-h+T%0sjYN0~h z;Z>oPGQwpjj*Ac#`Ib}}-Q>OPZs>ev+>p5?SBk-1=FMAa9}oW|Ic!73Fm_6E#JFA#iP;q`m_pOWCFS6vylC8Bz|9wJ_*M z3kG$*-3V!Sdf(6Dio_nx+i*5atDYOyMIU(tKB9^|h`yGiIILrV|Cn=@8i-wXfD_el zhAjM3>cLLb7NIfn0Uw+d&`90YPppfK2F|A4hZD&C<8azWWNC8FfU%sMJj@0qk`$G= zHZ%9*GeZaw>VrNzf2zqKcT8dQ_v6rmBLxEZSqY!HsRvC-qQ(U;*_z z!^!0Q{}J^TP*Hww*YF@JiUL0cL|R2a8tD$DyStR`?o0n^fLrtRBc`pC2yRXj!cIkyj|_j97j z<}^44A=j{=B1NhzP!W0am(1|$cM*x;T-V>U+>24bjRBk>HhU~Pd-9KI{DsFi>UuoD zjWWC9oj<$9{gM=4KqM|Qa#D1v464#D7#;+f@6R1dZc($VOA1-u}=v2jPmB8~ilo{OyGv7s08gvU~1$d zyF&yPhST%vbW5fZm+(^KjA>1H)-xiC2eO2Z+;m@nEgFl1{xb8@^Vb-lv(#FTn+%OH zP7gPMSAaZ~zjD2nc*d4~wQdnbO+I<+=_Uc4 zZe(74nvp=t}R=Hpt1w4#do2)`>s-Jjh*|+6b8yK(| z2}p+6Jrk9!c{6{>eL+W7OX00l*d@)}kB2cb6HHs5Y^jT^Wkk_Cf_V3*GXCQAH)>wT z@WYR0nK*!$WUJuHfD8HktF3vcu&}-O1&vd{^0>p+bYYQ!=}5!8C^TP*1s5R+oFJIK z#9caDw!da$O)qJV6B=MHRsW@H!TD;}c5iQVVt#IE>-ukxKYNzU2ua2E5ZN>foirYh z4Bt&I=u52mSIJS|0?B)fl_Hu>o*!Om-=;V!&fb)7H4JRzA1h!5Cb&p3c8`-_+}(;MtJReDfWv3>|kWk;s$Dr}Bm15rp(42G~p0UEh$Yanv~`_sS`_Vev$8R7{9pkR~HD6KuB_;%WR-VhF6j};{jF%lj5^HuCR>YCLI^@qHC1ZXTxN_b8%K6o z*ob~Qc}emldnSi!c+E?{77TB@3`B+a(&{cCTPaW>pde#9x=)qdTKCea$n>P*HIueL z&a$gQvH~ER87~h#4Ri&&F#{A2IG+p5;7VlMC^RC;28KY|yix!x4tc9bJ!86Y>+CG3 z{DPImFLhXC`14vaA*RJLzb#odD$2^v)gxw2*1DMIKW=Jg4aeQt&stVrv2}qX0R1wG z)pTew^l||>d~Zli^#g1UIRC`H}D9WJN?S7*B8^Qc;9f9e_$JqUlJ_64K6R{-_Ldk>;mD^ z=a99R5P>b?0aph31>sN+dC+TzFV7Chu$9TNTi1EKt>$sw>f#{eBu9K>3ODdAoEl54RgX# zWxSXs@KK83%`rPG7hWJwrW zU@zSp04y)55Q%zsR9jw|2J#GIz?D8o6zDr??PK5ucroI~MPcD96*dVoG@oF?%!SRO zk>+2Lk9;sK;So>g8h*!2!$8&};5l|SA_0Pzs}^1#n2QjeT6S{##nspvZ1o>)c{^5a zw4)3?S5*j(Z}f(!+;v%}SF_SXx`O5&EL> zo%nVSS3yz)&R5gcG^KNFDk1Lg@jqC>j~@HNi&S7!_neQm$2c-fIRS*Q*uQx1&#$5; z{?bE*l+7=HUnkvo4b9IQSKKk={gr=-jmL;rhC0JK4gC2I;{7_W?l!Ot$T1tHCD*sg z=_vMKlk+PPgid?sHjJ12C8l%F>36}k6;3QKBc$yC3N%F}2p@WJ``PSOuGZ-I&ja5H z?hDR_i&kDnT=<@$j$Y4ffh;67#`Er^=dr~W3pj*d6RRA0nY^$d{5B=;?*akj&39U{ zvCp)55|E;^4X`;a8oZvVJxC`Kt~6eH>;V`QydDlmos-U%Sqk!D>J#T9-p%NC8DErd zolt|sdLlaA*ptNEx@?@EaR$d!iHHAg3`@7`pp@5WyL>4 z50!a&K~V*4|K#%1(YpBgZa6M*;R4vZYrvv*k*M6@*s?m#Sc`_5e+_x;tvBTD1V79& z1PE-;R|thH;|3`(n~D=rZFJ%~IJ+jnUKQG~9a64js)NwdQ4;#8_uc&({=_M~wpkTs zIQoy+dsU=Yf^Y0d@Yo~jXnlosl6Y5HN84(>2)^$%@Lg3|urs*exV_NLyIWvU^YOCB zRnxO4^t%o{O%QGaQG=g&rCX=H36E^thbov(VW1(YA5UCuiN^-QRUaXh;S)6`2_Y^* zfaF<%-wPwV2|or%9$0g|7W>C2IkcfXZR^_4nU3@PJ*U6lkmnYI{9jkD8o|D0Q^Tw` zSCS`%KzksBD&Di!4}i76v;;f6e{~98xdlMET{MCh$fo&fBOYSgC4j{ui}+tlaxhjv zP<2WjA^ZWpz*Ag77EiJL5YRiCE!zuZE1LIDfK0@8YnRC!;j{ngdg#j~i}ETizn=aBdY2j)UjF$DguPQ+791ABbT!XB&`Bg$xl!q!+wE~( zi92#dY_8)l*kdU9a(HZ@vRK@G&0kF%f$mGg!wm_rmfuTlR#+c0c;s6H+AiG)6T@nE zy3&?XsW%2W*#7Ht`O5;3^kYfSBqZ2s@l)e@%%sQlhZEf6)8_+)Ytu9pISWiTHep6=@4Tz_HK);TLWG))qdcj`M=e;OoOvp#9J zvnNuXa~ZI;Ca-W4a$3fq^%)De33NFv{2(2AzYO|{>Wx81X+`d0fRSJ1S ztQq)Mg5O?)FA4Z5l&l$v=Z@_v2v98J2*`Z3@+ElhPRAhia{vs$CXbY6tjbxli=s*g zM}Em2r;0Oz4P2i#wZ5CpbaA<8^D*MwYkZ-SUa@Q`s*Z8@st*nl9e?4f*%^5_8eMROFv&rn>2K<^0DYXI?*(yTXlu~j`(j)sJb0QrnEhPWtx5c2 zwP29pe!X;Q3m1DZ>Ezpog$ARTcs>QcvPD*j`K#fvZ-2F3H*A>n>a8T}9Ly+!FtCxKI{05?E z?akQC9)RSu3rg3c&p%LlF4shnMsoV!SiUoWU%WQ0L0U=Je^T@KVazM600EzTFcXsv z55XtADJ++6g)NF2dMCTvtL~8ofEMRl=Rk-Z0k-)96HQyfuJ<^$t2PiEXNUd?K}*GY zuoE=&TLf0-INC>gMdW}S-rob!w9mU4fm`}P*?cW|7?JfC8s!Hr-pXy|pRvU@W zANo5w%`>ue;>rT&Gpvr7`M_IcA$JAn7P1h!@7Avr&03Apm(NK#szC^RJ?b>~27af< zzHI3ZsfV5$9wa0{o8mn(KdNGsQ5R;IM6cePm;Phw+|ooFRwlLID7E^oN%Vs{dt#kB z*w9h}YaA%)VDZ&QVCVBJ6WDe=gaPq=34vZJ&G49uzq3kI6G8WrER9y}xW4d1#ogYT zH0lVT66G`k2$qfVOSk!clU#vCAML^F?dq8^^dL5Z5%8K`1ADPiq43b@C-%%*sROPV zTeNG@QI)91_7_0KWKy>YcP(mLh`?;CN(m3TOC&5Eqp+a*Il^sc|gcXn|Nq9zC00DHyy`PkJP%&AwaV6+FjpSe@7?G_ZrT={`T zt-qd5hH0!vsYp3~9?XJ15nmOK^AtUI(?H~@f5s;pT(iOeur%p0pxF)88z-CaUvJk8 zZbRQ3VCP71@Ji~QYI`2rw?M9mpzk`60%}w0K*S`vK$fRwl31Wk}pG zCdVG<<3J4?Dcc>u+q)k|rl$3pB&VQKPC>3kdNx@0&8x4t*ww$wm|6PTG_E2iu;jww zly)=kpf+_Mu+iV_10bPJqmFmxp=9}&40=Hzbyh7XDGN@3_Gxz0IqClsLm`*9#~y<# z<)a=$EXm?ls@2lPYh%&F*MW|!jK}TdDOKITYHmP((843g02EVbivpgUjD6+RD1WW} ziu+v)G)cs3IxI4Rs-t6Iu%cxxaEBA=;{pEHN_qBYF;Ffl-=ONiayF(vB-zP(+h}%s zi7r%YQ-^}`7382yocsnw;wG;7d<{+`s$Sw{S__|mG>z+`Ab_2r;kAN=^OG8G+=)p7 zzv4X-3d)|&(IF}0M`eg{65e4uT`O$(j7sl5m>H$OO>+C~IEF9Utzh$~;U=3(Sb~oS z4@gcTfj9FdWvP48E`jxC#Aha?hVNdpVttvmUL5dcutY68Mi%zp53!nc=)?l?q@%!E z*O167L6ZX=6lWMQgN|{NhUcP!u?gw{pb^#A+ZQ!>?2T8nGc+$T>3|(pA0{4dwQkp5 zPv(FFdWwmm;fW%7zX$6IC(w&Ha_suRN})074*S1c3LsMC(V*oZ?}xCVFuSHMpv>g- z!ig^^Pps|oC%(SqG`r>+ z7@Gf_#!N+;v%>I!X};946J}_T5k3oNYbH@8W{ zJ%>b(jso$7aVs7IPMj;FH&G-!E}7D`5W0C_G(|buH!5wQ-y*l?jitfVmw9(IptjYY zG^=(x{q&H6q@L&`{+isDiw2pz)GOyvO?Khgj);Psy&y>plh}~C0|*v3 ztk2+w3OVsJqi(gnk_e6 zGNsDh5;%ubF>6v=Jd6fK-U^^oS@yY7zcnG+FWu6`vEZGx-14)hfKL4pAD=>19 z#k4{eZ1pjlvPSaKZN_z`gW~O_R5T^t_~{D(hz9hJ=MNP8l<3079OF&+De(kEv3;dS zm7atrsWA|$PJ4fz)?%I7C_7KrV+zaJkLema(-|VUfFh@rGh2kk{-uH`8_)PVmLp^# zzm4KCA?8o?LRl?;mahLj<-!-I3u~48We0X0==-*w9kWH-kGOxkeq?!S%#1Xo(6_7X zx1sn=@~I1HrC3p{OQLF+wy&yR5$1O<}K#qJ7 zcJS^d#9d$rlFxh62rBQ)2H>7P1WFs|aGA#QWDXPy&Q*kKMV*}R+IpMjQ=H8Z6oJ7j z<5E4$Pj-MJOS3^r9C22_$G7{5*C8V&jB4$#V^XGRLC?}vOv{Y~8XO<7@;T^t;LxDU z!R|f$XSDWmjbH|u`8+nz;=#D@YCpX^CJl%8q`veyycAPnwX-RlJMoRZRuTxxy;3)o z;veXEL8e1Je7TK=c{MiH0AIGkc2c}_kUDyXh9AGq3HMK3jKTHKxHXwA9)1Jwzx78h9fSqbgehvR zXN1L;x&20RW=~uKam~^*$V(=yb=y=q>Yd=R-lFC6?UI9z4>et6BtVAkXR2C)0+gYb zKsR7nD0+MUh(I1C_ZnAk*~>TDOYSQHv;p0<7*$}KysgD2f9zi(9`hDXdp?3g!vTBp zh_~c(hcdZW$xVov#wm3Udu6MHbqd>vDoUhKH^WPw9Avw_|Dq15$wRHlJMsh#glRGF zW;NK5!tr87ah509yp(uhS5&kW7%Wh^W!U4^qX-|zN-L>S9y$$rTMN}`fARiG9Y+GL8oWX1de@*C!WTvCIpknhU!@ zp3X|l2}_cXulfV@m?98Fh0OQ}@ky^b1OCEi6w0y?H;@WzQC6rqHoaJZj85LI|Cp_ zk$8X@b)+uOZ)4$HFO_NFn&fytR!ETC{>*}3W=w)DUM67AhSZV0VBzRLg~ z=C2_eudvAXI^nG$0kZklU#lI;%Z*C33-274VTO>Aff9AdQsboAnGNP5Di z%EosAo%DZw^yksrdq=pnu4-~uJ1A+hVLy^L?e=@jCR+pG1UTR;hNAj-st4Z(Z?|AmO!7oS``kT%K3gJs>>bsXQd$iENs zuNR-Q6L<``OwQnq+4MvehxnXFhrGlqFFbyNpvR?%&vA=cV5Tx#nTfs;x@u+1?3#+j zNjoJU>Be8k-`8B?T>Q6&Q(1Nzem)YCu?rp~xxb~_9<#*`O&pw1WTX z?md?e=0GL@3DzU-eA`dn|Gv^?)ed}Ul)1Z-EDpZO6!G|Ie6xW8m+oFXfap(FWMfMA z02x%Y6)rSvDf9&3w+nkHuQFTb5~Gq!1jc{IM)Z*-Q?`p+_LHmZHn=mSg^z)E97{(v zFDdALiqQgN%pFcjywfYuGm?+gqGy1=Oa<7|b*y5h{Y!_QmhD0l$&1Un0UcV991{ETeEenoq;G4Csd-`G>JEe9{8?xcw$W`fDxIu8IFQd zFu$PnsVBK|sO^>N0m(<*md)erH0;p+tAN6}dX{Fp)_NjG5{s^K3E$4feA#5HH&fi~ z(1Aag7h3g>mV(p+yn2WDpPHa{|NL;ggLQZFi*tFm_w>@qVI=9aYD4{j3Jjy?u|G!w zDD+MC=;C)1k7(m<81|w6Y;pu>5kR#vKxqS@VFJ>C*ZYqMK2tiR4mK9sWIf3i^()^Z zIKGQYi@5~}xo0v{rf4@bwpr7KM$8x0S67=*G$?lqxsyCj_<4f(kY!ph{5H3RpMiJy z2bc-VGz0PFK$X#yriBYb@&NR3MSjk*6*0g{5uwF#Wlz&451fypowYr8a zUUt@|bhSAkqb>p&wep>c;V^jF(I3iK`(Rl-Fpg1bZ<1Y2=}w%VtORYhzNcxw-u??j zm!mx&i(ppEWpQ-Uw zIn}@(luF9%NoSP9{hVvh9{_dJX}O?iWKBI zM{Uz_oB%EL^iWugEox{o+Wk@@IB)ru=s9%kn{q|zT z+McyfBhES>W>9;O1lwzo?y<*JUP)99T_GzBMiJq)k0SoLkV7LZZvdk7xVwgzL+It? zuNFO1!(;immftsF^$vyKRlZ`&1qN;XN6=VSzgRICnpwLmKVEwOUG-^STd9w3T zWki$bNA(E>KgoZ61WCfBFQ9XPuQFrScydGo+V&wh4VLyn`%1>*XBwDQ{hW!SbL-l~kEHT4Z{g*rdhw{!`Hwoqq${nQ0=UwaWWiX*j8@CS&B{mpYm z{qdB5SYo7{0S8huzMU0`XSMu@466auZqbF!d_L9oCvR@o6hh5&zltu@=wH^OQlRFU z@$143$T{wLD5o?VM4o15q~>n`*gxGpHHFFs#v_X@23`V>)EJ#VP4hQGB1uoeJqEU; zz~h8nSWoWNl{ZWFX^1SYh}?@+;9#GS7|XqKTF)J@O`ibySUGfI0f&O$oDIdpu6RG} zRF8q3yA;o@er|-o83!|2xWFx%ai;15+U!$bq6|l~#_CUzU^LmN9cw z7`+gH6Pm7Sb|rx#og;o{efn0u5rb_)!P(O!^1*8_1-P+5h2ygc<-Qg`AcCw^362=d ziR>Apr~6bl=HO&i0c?;*d#o&JMKij=dXudBET&(d1G?p4O+imyZfQj99d^#10~N=8~}V|z;GM1_RX1F z>-1E{<5*l>r~+9%3r(9w=_+^@q;4v)LBZ`bA#WQv=JIxoTR}Tz21`kMZ>eu^&oq~G z|Hkxuy`i|RkHXm~8`K;Kmp!)YOhRveKq28L?`Y;u>xBF@HGS5T4S$TO=S~!rZZ^fw zXl(lO7H&UMOj&+7Dc_ z>J~`%0O1Ry_JEI>#6B7y-;8!#mciH!^;7KToO8Wzv8AXj>>2&^!aa1;kEvvw()Qwo zD-W1q(g(_oUUh|e5`4qykFofr8HBflp|CeV)0m|jKFFz@NeR@W%?=F1&MgE$7IX{n z?N>d?Hdxk!^9go*;_F%#;2=qQvU)&03zi4|J~$!m~2hn#`Ez#TA~1}%<|0$Ivz zt%=n|W{CCA8dmHq$y9$oqNQ~0#i?T@_Su!*-w)Q}X9K}g_{;#Fl=OeClOSKE{YKf< zcg+OR>VwHgbp?3z13Z~Gh~EVxHJR|dY?pgFaUpKe$it-!5g-I|tTEFde`#)!>G6B2Sav`^)Q1wt!RX_Afy_z-{q8rT_3Q4fb|F%nDD-(=jcttg}Ys%B5f- zaE=K_+VYaMt}al}rAc!IQ-h0F#)c>_poVg_`0sNWb6Kom%7Fcvn+zYv zO0lfIbL?7ppxxEFe2`Rg#3_?j5=Va$L}y#S$m(;|@q@%1Y^{;O6Ya1#G#a<7&RUsp za-dXHlpd4@@=3h!+VjAGUS9N({+_zF2(vzk>cfo6U-=(c6iI>=wY=UNjz3&|El&xM z(k0&=NHPg8cmY+Hsw=51!u!&Iyy;tr&T7MQ5#3}|!` zC~|0VZdAoH|0D(32%OiF+2BFEW$g!we-Jt^Ku3AKKWKYJX!$K5jHWp97{ks^d)(Kx zzYM3O1WFy!)q~Uo!ug7-e^O;+c4TIqEopUNvyOss%n;8_>GYL_q}kKTfKBeg~(1$EEC8z0G{`nxZPiv!5H<`$L~v2I~kt`VV4*2z%(29 zLfIdbqxJ6dpT&(2aoCDW;~jR-Ups&t5x85O)79s`QPfy{e$xeU z5W>g_^s<6?(9Ku?A_>HIu!a@O4ZN_}S7t_$X2jqEWO*rJ(pGG8hc2x+*3U{m)lu#g zIM)`_HZm@qIt8Mpv+X~h>B>z%MP|gmmPs%px#$8t*~}jm?YL;|&RX!m&;Ij_QwX#@ zji`fKRD%=)qSR!$e~KQf6)#4yim6^eYIT7~ZTyp{x1}w76~Nb~-ilfFc^W9G0q)2n zx_BrU5?l(N)%-8w&3fX-v?CUobtrxhVc}j9V;_*|snHl+j;D#^ z8FEQ}do@+$i~*Rci^FJI`)9%qfXsM}tG3v{)ZpYX+xzh}(6IhmkgBg$K2#piAy#w1 zMM`>#{Z#zHTg3;PO&^9Ldrr8(coYEk5I!^ zDv{>jU@HWuR&e2&hF*<_4&pTi(M$^`y)&f#Xqy*HF8{wKbJL4MTtHW>c;NsU%f>#bx$jU@rWN-2}DE?^8d00Yf$VYXijNaYZnh)eDh z0EQVDr1V=Grbcl4Ovm>&Tl3xX5%j8jo@4H-+;VS1VV_YIm0NNHnF*-h@3=$+k^ zqh-gANi{yKJYQ;tYf^w{;mR85y8Jr-`OFp|kkG>NNLgBR_@Y2q*uQ6E+OqPzq`b@r z!UWh4m*A#@qZ11GOMdBs?E~fducR_%<=f@{XdKaots8v|ADLi{rUT**x}ZV<51Y+` z?0CusF1-OF`kY841bYS__M_RtQkJ*o>)Fyt$i?u8M^3RRZmq+KF z=-7b{wQh+~pd4NGIp$S8CQp&NV@Dmzft6q#>W^oi=(+FbKOn>8fX&q*&Kkj9YADA` zu|i@9U0(ZpvDOt#I&~=z_A|#uxrdAPoKK_MFJ@8owMD(y&)k;KF&;W8U1g-Eu%X}q zuDeKnw3|MQ1?e4LD{(c7a*+Y+*W!GJI_{#URr3Y-U&4@U#3$E})4KNHm-6Rwkt^UL z00`vamgQ8SVwIH<2fo_#k%)^6FCflGg>93C+#VJkFAAPISzxWi`+6&9xzOVpWTjxO z-3xOTB|h57kC7@zI`vxKBvx@~63#y{^(?{Y8dL1j@PW5q_nh=xz-+t>4jxdYIh`Ps z_dELB(Wn&hz4~g~806dp%Fh~tO$h=At{yf*q3A}U3b?mmm_KoXs8Q^*=g@hI$=;Oz zHlA_H((Q=mmldE|grD2AjuKqarahV~&cc3TBH`jee>23zFG6F*j!+M}GQ9DF%9 zWBz;|?Oif){k*AI06)~wNP9!4xZaG{9oE(K%%ihnD@ZtN^R(Yo{3LkV!y>ftCGK+S z1X>O00r$Ur$2arnN~2Y&>dp42T}6=sHjt{y;;4nZ%?=T({v!mxu7JHBlq4110Bb>^ zh&DPJMJnds1Tk&JP*oJXOh{MppgN`@34a5X9<|8;GU7Sfjl}S6_}*#Kj|rU3+d*%3BGifjJh~HF?f$tD_x$8aQ6~LdhYE4iG@f z{R)~cfmS2_#{=a=rRG&YJ{=;FZLjEw94S}bTutVGO5JwHLEmjIG$AD>z1QQMB&_q< z1N;{ZY3l2DL=|=f?M^bvLUEV=c*iWZu-9hccT;x0#0@^FrN!*gBByX%H_jOSc7{-CiPyZW@H0^?wN}hY z6m0PFpx2Ku6>_DQM<$}sTxpB`roqSFmsRW0${3+uO!k5{26np z+dF^zh&#@MIW~S2ygQega0%ygAxa!P~Q(D)?3cy265lL1I7z%G$|0?Dc^ zXnA(n&shL(ZI-^NgxVOH463xIXrKz{ivL2#e<|DY=4IE|x3ks=D}HKL=t|3SvP#4r zzNV0}VVagq7RSl6v<=}=LcQI^C%vKqbb~@`dw-`8DzXfM;K3*-Ju}c_y&XPFWS6Hs zfBu;1#Fx{>R?-Ah?QASS(*zBwm>Au(sEr z3oeQ1gKD~-O9;%3-q!rbxBdVsYD|Z*_}IKf!aVoZ&i2-IGX)<9S=y{i8po*vYAh8J z#8Bv)loKcT%Z#9MF!}6x$Iu_YMU&QSLEWak-4bt^BZGXJ<)X@{WLh$3>nQ>RxUwHp zZ$eo0@$Se(e@y8tV{fTZDe@57P_+C;HsMfZXK6$#4c4nLRPHQupjf03XIejyegdEZjVXvWguqZBS*Tb;`=ab4+nh@ zn_McGM|R-by_{knAvEiAJKn+PYBI_=*!_isoKGljaL;u(rZR;auYdqQSx51OrkmXwoWffZrISmr`Z?3XV zdJ1a<&Y{FkGw^7sC@6Y126V%hF>TBJjHv4iuko>+Fv!D+9P;tY#zRJf8JObapkKr_ z8i4bM9L&ON*+);Z|0!64ycsvVwi6w=L@#=a|s(5hifpm6M4-ljz%acw3v>GPX6?5Iq zDOQKLyh@!ueKFEoONkkr|{#;n?TAuby*p!oP~t zSg9{x`Gw6U&F5&$a8pxkQVDHpZ@IX7{E?-Lv5oxsEQ=6!x*?kNQ|TLPkrA(m$dT0Y z#ZK_yW>m+l>z_hyrt|`Hl(o>v7Ngtw7X~Xq<>&ZCOh0;lVrkPoyqPJ3N;77$7q4be zM=>AZev=>Xth%=WIr$#V!w=Rrjz})ivGy*H#OM3IHy{kMnyMM?9s6W{&DAEOBhqjD zn>;9xH)lh`hI`tT8CkLjgU^RY{bW<*B22_D+V@8siMg}gCe(&LO=lz3>{K`Z*moyN z*Th_|6%%C@fO90;O^}ihdtZy^lxxRcksE^ ziKEcSUerHO<0o@a(V&7Pc>3n_)$Hg zPU^MGYvi^bGdwW~gKiYZGSntIdmfjNRIQ4wlLE~-kl1R9qdR)%W4BohU~0{pINNiw6Pe2rx0I;B?4p%x$`7$Yw#G-smOFv0u}4p>?Z%FtjqOxJOXG**#$2qpdpmM?Pnt z>s2Hc+${lcMg?nFMTTqKV7Z>qZs{7tMQ9?CV~lu!!#21Dd&Iv!EpbNVU zC!7wD$Rw(a-3l8^Tw1_kz+J|ds90>{AxCrB23n(rjy$#)jQJ0#)Ah9+h3wz)r(JlUZL#e zKP{OQTFa-;#^9PeqJ8tex!2&V(x5QQvDHBYeNd_^cn&9l=;VHj$>wZ@BJ&Wui+BCm3b=Uz zV!Z~gcNm*s1KY-#)$DeBJ~(*;1Q3InTVWsr;z^o`N?KaY`J>Jw#YP`*y}p0tca=0>I?0GT`>Ax; z2TBL4d1lXRcqX6640*6Z#ttZg zT5tis_}Sj>YcDMnEVw#38u|9x?U%X5gM2d^v-`e4m-`t&WDrNN77-`Oo0BRPY1+Js zzrr;txdTvG(9|D)OsQ`^dzp}`J&W$M-+z_6uW=F>o3tha{1r59_o9HtcQFNxsZeGN z9{WuBmoZ($V@0+*XnQ!;c&iwtA7LNbDee}_oH+ZkV^{9B=l9zzj32zl&o)RHRG}RC zF=RsUgbnI5uXCnj(INvL>eG$I=e%~|GoL4H+vc)VKE2Iz``%PB6A#iq^j`3xDUl_& zd3ohus1#j#npydxMTWj5z$%Lh}0lBlWdbD)~Or`MNP zQ;Bk95Ej${n2j3byV^XJYy#rfRpMFaC}oa|gB-&QRKZW51tf{GZ15%Udm{_9TRquJ zX9Aupx32O;k%Ym!8zVo9j%sm-Hp^F8jwkxy%y*JgV{VwGH`Sp8z_jJ>wXJ9!o&3a|&4BOijx^6Z5agMz*%@ere^(LB+Ok)n*59 z)mCipqJy5i>+3t$UQ3vZTr6()2~uU!cjGvi`=;`|?6%Eghih%$8Q|{)T1x^~HCz|w zs-t2}Mf}Z_)YlkoYT8lhb0j<-2b5gR#wmX9-w@xscW>mr_Whgl>7vn?TI)aGj)@k@ z8Ur9il^sL6`S?#ZO=G`w5E+I~m^Xa7<^N1dYK4;~=O?59@RY8G-s-n{5n*uS4Ao7XcxP;zI+F$d2FPZ>^e$(=!Ey<|S@3bi$g z8l1yyk9cQO?mu&E3^dt+vzT2wAF^_b>2$980V&0MC;%Sr9-Hg6Yu5Mk1ri>1C4WBt z`y-iXnJ#0#)5~A#X`y5%V`I>D@wP*&sh5wRJq}&qq#{}u65r+5~ zMo@w3EE6-C&z~@ZUEF6KT!KMtg~j%aHl?te1ZizCW#1Xr8)gDI-*4W#sUih_0((dp zRJtk`wazIfSPjE+n%71D{{AWJvXD;wiYWU1gOH?to!{1c?RXJuLlL4RPx9J5Z8vYW z2RqR2GFY$PFxD?Bsac@l;hijg3td}IRy-rhc=qXBismq4P5mQBh-Z2!Z~35IjpK8N z&G&B29%cu-NgSEN$3KhnzEE!Q2rl4dEf%0fj7~~+!~8<7EKWT~F{ReWeC_Fcs$isl za%I=h?BO%9s{MQ0dN9H5&-c{d)3io_f2sb^YE)gs-Gf#|*~Fd0?v;*am1p|)o~5KF zM(KmT@&v`qUtsGu@!Jyu)(MkT=^XMv*8UAVHmh3ux9=#Q_F@4?SzUKfc;HpRDoO}eS}C7SbJ zqOnUDO4^@mNtEAdDDE9k;o5t@TK-M(LjhS8@j_~xtfo-JL=Z)2(h_hz99dJRpgX-T zh+Djt+v_!JucNt>YVMMW7#GZY`k#1`#6iIQ?`i=l^Dly2TS^ze*5) z@m`BP1HD=OQruTTwVPyYzGYOba_)g&se5zux2>S!h<}G6Zd^<3Lyl5gH1<~(3;!Y= z<$M^*Dd5(Ot|Pv`jnp`9I&{&RA4bNZ8vPEtmGlE73^B6;QPwK$;acA;p$d4@>!&6~ zy*hNxIg>uOIm>$YfAR{M75`R&Aj^cnk>KQF|NQhfw@uCVJ}D0`^B2j49e3s0^z=|! zgiV_jueR9W`ggoqy6;A?$Pa*0^^`dJpiVSs8 zxc#5!ZCpm|VL9N5%jlMJqTx`Y`3?@UkHd27{yYKEYt)~Hst6e=2F<3Tktax2&i{g;JIQ~^_$d6=#|9{q`_$AQ6AGQmOIllI?p z;afC(DsG%J6c_l|&DTyDTd@#&Ho5(yrbl9`lP-^Ny4{bPkIgjd^fmML=l|}pF;zR< z7ZQm6J@&Xpo5mNQg235Vc4C><6%W2g_je<7!#jJRr^QsYl&s1Vu@9?m>yoO{Wr%% zORz24A9P#0otxj1UJ=E<7y8`^jAYU(CPMTsFo?&d>`TXYBKFU_yw$k+4)W9{Y~MPX z&VYkD&uN3NlKAFF^Y#1I_c;}JO>@r9?)8N-pb~79FY7SvWvx54=|bH3C2sg)WMV7s zi1A4k>cCTH;_8yNyo#jU-ct%53k~YSnHNJt4;_QDYSSNFzo{bn!zKxMKAcNbMeu6$ z{TS)W-+D**JT^WqK6qkPi;vs{lNFD zMpn^YW?4|bz}79E-k5xK^X9f?gA*KX8@uQry3h@|yOwkGiBg|vU;R1pO|R8Jhz)7% z2s^wU9>1y1{J^9waQRnCg|QGx(8P^k1jk95y7Gvuph z;I+x)+rM{lW@`i3<~uHM+U(~rJ}x`#U-bA$PX3GRDFT-9weQX2mAkRLbnoBGZF+fJ zTM$R%R}3zAa^Q27_0rkc1q?o?lZT6`)<)bM)mO)vu&sfgw&`B`a47wYHu5oln&!lf zboh9EZtns4pxx%}F&_58fscV}KNixSgN)@q~}V>-@DsLL?I`$1VhV zJ0BZPJtav0;{1^3IR3xaI;!360X~=9{{4k-OPG(V7uY-wTB&&~4%|(|&Ffwb*SS2u z3Ws^wTw#%A$kwLx_B$VO?UT!YoK1*^cvp7N5`CEq^X!l4qDl#nP=s)v zV2rNVLQ{75ruCOe&)JCcnAttJvT6MW-;H=OjrTbUU$s_lT?D<0&+RpE4sO~E8$9t* zz8CL8MYg+M;|TBGzQ=PswkO=A@i@nKbGBsi(#{L5Bcnd4GOXoKF#4i0iO;We%Qw1l zck=Rd?+z-z?!W&nzgl6xAXTKvkGKtK$k!86%KdCl)be6IYUxeAaJ3ua!zWoeDWWe3 z(v$z*zkd+szO1`{v>%wNAiH`4XVTW~rt%;{)@chw(Yg+m1jo$Gk@1FEp9hC~KhzYG zjqLquR5UgHMYaULlvp^{!t|9hM^;puwPwA&x0jYv2B{xvCZ66-|FQ?0UiYjG%g%9a zn%5My$-5DI6;JQ6J<~jW2t9b-Cg_e&!86<8$1)E)2@+{@;@>r{rS7K-eMJ;kyyu`_ ze{TyPAQV%%$5E#46L^1#AI8)7PmE`(cC5kheVx2gr_aa@%a6F zs-qVV#6|rfXB9MI$ca1bzlD@fs!9a^?6;~U?D&icDOUwTgPgj5H>qf@r%L1QYu+vx zEPAYj+8go*0Udm|_+V}c*}MOGzhwVC=n?kM8C>^xsl935VYor!VWnBNbF4LaNa0K! z3hj#g-@;LZdtw+N_t@Uz={R?H+Iua3s~2|NOW)CZ&Pj6cEHW7?YVUr>eId~L$ak0EnaV-(`7kn%0brrr=pcP&!^AP;+NhpTvHzi{EG&4 zHfi5~{PSXF`0v3DVcLd&cI#2vRubiiaNf|eP8x=h_$vG3iK++*sk%o->1}WJX#H<^ z$JZXb^_sMeZ)h*u-nWY_GAim742|64@iY$Nian)MCs~iG;QjU%`g3=!TR!ygJ-3|O zpq<;GP3fhkTLo0zRY!BCZ*?@Tw^di%|Kf-;{{xq}WWq5__pHsSVfc`naMIuIx^i9W z|J($9=ew_ZUN_AV=c)(!2%WlxlVy@;`8#D0 zlb78adP+_{>Jd(rI&^0Y!H;4jHD{E@9xBqW(TLYw;+=^o7y@@|ZKc`jc$9gTHJJco z-iv%SHu~*fDwte{cySFR`15JvL=Zh*PA#I`UCQ~GtWLu!k?)?l@7wMY+a~NM`ZhJsCFx2>yOZeA$vx%1ECa$ zyQMoqH?zieV zTKxuvKqp8B=R{&@GXn_rjSNi2-<+T?WSmV{oxOK6G{}jkI)$NGaXT@ZSTR z^S$5yy=N`Xa;+2da6kLr``XvOu07Zq0U}RRFbz(=!wiYu24%9?cK`h55>X!-S0sPH z(0O|;54>hq+`ELd1-`Ai|mNMh#2v zs)#7VD1l~HL}Ehy9!o}e{p;S;=eHU$aN(8(dF6dOR7yv80$0Si&9#m%AvTGSaoDw9 zCc9rc+p=CWBgurW<~>SNHSQwLM0Ty^YH@{ZJjB0QgWc^Wvpt$ch~jmEm>NpQKwa&9#i6TD4OsQ;~cqR$yPY6dXv;?K^JWf=&YtM{cGLJkH z8nsx~KJrxZ*#?!efnR_(T5YI|3^J_e7oeDJB&q!e6iRTdd<;Q!fxm{XJ^E4^8{5>= z{k-nx3^)!~b5|Bx>Yu?UBi8M`!`h%sKCQgYw46lva74-vEBRQtDmdsC3Hn>r3Qmw& z^;&h9={c7hg<*RYYx#r5V!cjqcMivgA!CmT(w=vgrMs*^)XLLJ;E+j?zg2MA1;sq; zN3)Kza#_z^xAwzIBJ^usOAmw$f@0*gF%0e7U}I`%ryqA-cMOk_Bpbd=KMczsYE@eN z=h<~0|IFT)ta2curTpm+vb@2;rn(>Pa~xw5_TW zTQjFeZlJEpIciayP(ii=xxfDT&2LYVfqUHZ%#PoyB@Cm?`iBH9PY4xE`Kqv0;)jRu z0nriK8|H%?OJ0%{ed5<`xs3UI`75FknR&mqy*#W!~z^2LYhUq@q$U~9hDT(i|bq3deUqqIu-Gr%PB?FTvedE1?S zcQhkIBEKNk!eY&~Z#gVm-C3iNoVOQbP_)6b{zxZye`c0`w4~}%ti-kyDJa=r-cuWL zW5V{t2;joW&pXT#t6#7G(qL&XNF#Sz!+@2ICef>YnA4loo69rmm*%@V8>#1zuF4P9 z{`gr>sOlwc&?0ij!(8%ehydaW1}T}l@y^rIH`dfzw^8uxnuy22gG6XOk?P;f+C~&8 zkJ7?-c~Fo79mw2rGsJ!W?yFd0S)04g3#qhY`*x_=iKroN+`BpGG9Pr~^Mhg+#~_;E z6bk+96-d?4X4Phz4hK!8$4QeJXM#xPae>__25jU&Z*8Y~9JD%uIvc@~WI|U5rzP>E zsj+p)Mn`cP3oSQ@;J2>TdaK9COhn+wbO^i7_4iWc&PU6r`a3`Q+~Gzawa?8A=KQML zWjs0Zq>wBC4Z7d`7KY)g-Pe@e-4rc$5e8t#sluaw=rDdwfDIHZTIs4j%WX1jr(cv=%XHlP>RsYK{{7;~?yGjs`VXEIZ7i#NX<85&;GbL)0_>PD ztT?IDU1uB`u>#q9r@|E}m>{t%h1c}z9O=nj)@Rf|By`DR*vZ{M{)sz^x6ORwwMsN` z#bk80B~9dmSNeb;-o3+#{z(e|W)?$=zs#o3Mo=}ImZIVL)SXp?h#w9F1qlA_4ZFvc zhpt;;Y3%Lxxg!hk_%=80DCnOw=r=>`{~TMKZVs(HzFEA@pf5?*j}r*q%xB;9q)zo_ zC-^OL^sfcWL9}5_-JGFL@a6MQy_S|YXiba?1JwxN69(k?;~52d!rPxkDmYqhIwhDR zmds3}X2xOOeJj-W{Fs+V?q$S2&l5C4i(eyqPfg{JH z%`{RcbO<0LVOP{Jvz-%>^L{VVspMnW^U9u z#dQoAjAdZ;ycGHfw)6p0g;p}kvzeP3N~K4TD#|0~cD7>{zEP9Ox*`o4lQn02G4Z)q zb(~l*a*WH;pThLAnz;R;s@&H1A(dP@>Ndb$VAEAD83rg1saR*pN#pm#(>6zhHv~kA z#7u=$SAj4JbVx{_@LsV8h1AicE)=xRu~c_VbX`C?^KN7UD8JB4j}v#WHcqkId$u1* zx4MIB_o}9|Zn;aEN(dFOc&MR*3h(`8O&=ir#QN9OW>HWtPAHtv&uSAtZYHpuzb??` zAk(G`8>^Z28VL#5Y0vTNvt!_96CfP;b)(g1g<%+tY`BcQj2}c}-m%vB_<%Hj97W6! z*Y{Un#A!8+g{Lo--u8SkIY#<#E5UNTf&q^YaWx^(a1b2O*8Y%=oO&Hmsf;p2TU-W?4oH zs69>>|J;w!i~lT)I020I=rRGzx@LKbZa6Mh-nL=gTr$ZR^ODh1osz+_J`Fw4MI&T|Xc&>!w z@)|CUmeXW6a#OtT!mudaL4AY!U$G&R;xcD2BlW04+5&Ok&xEt!kKo%LsG0|a_Z@Yz z2~s`XZB17lGi3Ed*Hj*ysFYIzHbG?iGEM!Z)9_=43Jh^v#kCi!8F``IF@+vN=&iCX zk{CIgk7(Zfm0cJp6Vmei?E(sh9V@cMwUn^@Z2T5yHXUNAKZM`8F3V#uK6AL(K#Pql z*mQU0K@fZ);ojroZrOqCr9#Z-QqPQzbOuG4XQ}h%^1Sg1#Hq<3(v>UJ$|FdY=b! z15b0y?ZpIR!%T`wQ(R2=@9~loRBb}!_;hm2*F4-<<_jB_Pth`y{|X_5o5uR2sPX6V zCO?R4BIW-!!rkMo1HpQhQ?xn=>H5Mx_Y@2E(Sr#sK;pL)X|SsO7p4P5giHTd_waZT zsy@8CY_pLIt=l5D)OPt!iCz5JAPEV{qIj|$p|j4NjGu=SQ{6AruXqMZo~&@U1OkYE9cNe!xCBpOdT+J&E`|C1;bv~jhFSbod#3?+kvn+DXou6!qw~0L* z2^3@0Y7AgF^F zPNFWo_%A^je8UeU%I{*Pwq_($!O5Q-|&>WGR=vC0Uc{#^=t;elBZz7e&gCxdi z*@$UdLcv8S{eCoW^r>(8UX4RlBlcS7K=nN17y>d4rZxuphwpS@q=-%_dQ za6AM7iVSR<8$3h~#MpZur+Y+pL2hb}&D$j~cjc7ymfuiiH!p_BI+piE4UgqBHDGTP z2FHU*(;|^vWZct&hkuY{pTszA(|Xu9atUuQtnEO?6xdW}b=n&D-4cx8ZE1g|4wu5| zkexwt79TWWdXiC2HBt0Yh!qb&s8};BlcMg1f^_v4$=VNi9uz}Mi`&74frSQMmM3z_ z7L+6GbZrfun{=~tlhDwmwi~~mEjy1rx@Y-O;Qb-pXkzQR^SO8||bA8?1S>45fzyUXH`^qG?C3mx~CC@(oyC;!98P21v&jh6#X zfXh5Z4^{L_rFGuVG`iTrp?U$aNL#;^tj>olha#?HI8UxRYxCW zC8ePlkvS?9iF}S5TS`1ph@SaA=sGS|~PhOI5k7sZsh#!us z&W%1lm$4O*R9!0@r6==a)*`>m=}zOEc1OekSXgQ8KkE#MkaNc;uU_sm=)nbj%_Dhl zS{S+=@2|WNFTJ%fUdXbV+<&cUqc$j$?ET+syPc3wPbT9BPnwuVImdHO5@x=REL$o3 zG>@)+QaJCqA*jKpNcwT#?emUs_-OuuIf8}FP<5?#k9)*YXFYhncuuG#Tv{dcL9cd(eVKad13$jzbQciB9QW z2$V9f&Ju$OtN}T}AF})8gP0}>8e@!kG2Q0Hy*dtgQMrRdq7T12+yE7uH_iCYK&pzd z9ncR=!-rb{z~M&?wu=6W-*NNU@Q(PQZpwEQJ3iF;;r`?Pd3R-kI9A0=^j!VN=%AKr z#mig1fsN;l{shwSbamulZgcleEsq3aUxLXmc>WJ;`R0EOCee-Km&FQyBEViu+G<@vns3w=3!Zk^Q5TW;+=v$rOnZd*i zpS#lQ-G6uNDF3x+Ev;BD?X#-zPyDxv4@fm$5GEH_3n%4m?uyf`uS=;b~s7R-h#r1kWt)omhi@1=eJ z%9MPvwVl&$YfC5Rs8K#+R29dky#QA!9B!a-buJhm*4OKBf1TG^?y}8j5#}4%61?+P22=U7fZmQd*zO^}@(o##;!# zhTO^3tQTHQe%hfZ^N@{!0gWpJYc~sm7hGH2uR&ojZ4;~c`zA!KuRtrK^GGv)ko-pE z;M00xG{1FH#{gEXDa)aG^GFRm}~=mwEEbi^hKl zGcLNI*+T$2HsE+eHhT7UxfjmG>lE|BEKs6uHHJzI&E>^yx228%?WNfsgq$b%Y`;Kg7#g2;f=?ED2V=s;wtN7tBi<- zQ)34Hye9?PxbXM_$w$n?+zsrzrx&d&`|GP{|D`%f`$#(E^}-b3b=&#H-$z)x6LGZK z{od;|s?1k@y`UwnBrr%u5RaqTY}9s*WG_vMfynCtVF`t((5nF1^0VkZf50d2iAEpL zR&e-{IhC-Q`i^O#>U;{22yDbyRdMx?Yra$_Z^nVqK2*W;indeJJEu`HaFc>3` zj~#ki&x1yyb{^{c4pyg|k>y4J$OoZx!+1nO)!DeJoR9kiiuWo-;lY2VOW9z$Bprfx z8S*zy4x@=)wiYKR>Ny^4@}K(9BKc0EezS1#INrcERl29vyZ@SCh;9)dltT%8iD>q{ zAe=XvJdv?V_vpH^@YPD-&rfLRBYDlUHypdQEGc+qB&V1E0AH%uB5CT#YPIMH}+!JlHnLj$mY)* zYft;1&kT}_R$;@URoy}(`}~R0q@X+VRjLI(PPV3sd-~m%{8wrJ4w+O{f`YSH!PW@3 zc}i>OC3?daE1xBqDtW0p*4$`de1~>&n-%rb_Cu8-RxBcQK!Fv$0Os8x@ry_s;yv8D zmhmX*v)nJ;_jo@CsF>R)Fb^Zu!IVX5W^D)b0d}z^B%e6t?()1xsIvGnPoh^Obr#F< z-A1waT;G*BC5jJ3onPnUM^9G@b`v*A9Oj5u1FpB^k+(1gL4yoW*bE1ZbviH``{?+^>-WU;4UP^4bxYGcR~ ziT{ZuSn9?p;YL&p# z<^2eMF^m~N_BOB2+8iR*PcS&zY=0e|G6B9Y;HfvS1jedX858R1et>jy?1#2Jz{aC0 z{LZj?)FRA%a(yCZ<64jY{v>p4Y>9vh?#qa-VDMFvtQW{tqFsmQ_7v2_)x-jAFfN8e z%t)uKShUa@67cxM+2_&ncOdfn6(kTL{_7yU^nnp~hzi?$V!h{V!nv^hl7rM`|F8$- zTWds=Jly6C#aBm*PK6b?h4i2WnDs3oAzQl~e*-q%_$e)8h;VPOesg5iPGwvizK40K zgjlVu#@M5z53TrFD6&UaUGa93@>j$8=~3@pEx8ONEPD^%8!g2`JrYZWFihHpIVyEe zmx-u&-3qD~H_XTeu1>F&NuBqaV|X&Zk4U$Kqw-oOQe$P4`_=^$X zje9~#05r%{2=#s2ZA|HJtf#p|gC+5!DObom+vlJFfICWv#m7F^@=?doFfiE)@37>` zCuoe{I=pj)8)wZ+#7=qc}K z*Mjlp5Yc5uFSFn(CJ?XLJ2NCoO)W3@8M>AuFgLn>A`_aH{)&VD{oFto0pfV7UBCzJ zf)2s*x6c1S;DIAOWC#kM;z~!43HmJ3%Ul5@@=8#O<`B0w_x6+s?Xw5KsrMfW{Ck?UkPSKI{bSvEa9T(pAy4ko`Wil4VVd~ z#(5`>af;`YP6Y5w#3eMf97H`wPIMkPSlwjF<})i76tLP9pFYP$JukgC4NHm!m%g!f zo;MGLW`O?q)<9vPBz~hcJuT{J{kDs!c~mVx-|GbT#Du;1Y7+~jf6h95IpAoA_1S>3 z0BBgum)RUeugz&;q@YzUVkUx4)Ddnf9=PaSThy?1V!JwemvQ!Ep^XOr>XId8KKrNQ znYcx2s?IO1FTFQ1KecuK_AhFp=#*jDM; zaJ1EJTB6mcwt{KsB=h6j%UWo36sKCo51ot&_HJvH7EV`K;v)|NeG>GmiO~!=ZsVh( zn!ylnevzl6*Z3}&$v>*8Q;LF^OQnUcK-ljx8%(`#tQ-LF?rQ@=OIt>6j1d>U>;d;> z!Gei>>|5Hkix=MC_EBz0SMwRSV={NB2V%zO?Y>}sj2hT8r{G<_c=m}p2VPn&7rU|M z7q8SgwBHihx?=$94+kk=_&XdLHZV`4^JJ=x(95?3aVt_Rr(#yW;Y8nHfmAm&)HkkI z2E|F1B@y>YBAzs}RkL8{>lcr@glHvuxrm{WhS9(a3*3xw!ygn}E8BCkwAqEAX<>x- z1JdVbJyQRBnA7hL~>``+t?p>w+As4T6PwgB_70rx1MxFT{eO zy<@T_4F?(&?a6&h1k3zEnoyhUvrDYFGxeWXF>yxoiFd@MAgMsq{Mc+bDY%c21Px26 zu2tMMC^IhJhn*oM|73WL4jeMRo^;4BB%jEub2!amV2$^UBM0<~XHgWepWj;NVTzkw zE0`-w>u%)d+sQsb3z6SYom|IsH`{r=%k_s#Px@I@S^vtIB)E)W$oJ33t9>>1 z*ATO{3eg~fm!_|D0ELNh0<$~~-xqnpg|6$wDiMgtm+Go#`YI6sn>Xmb{k~DYkN5nX zuRx4y*ye3pNq-Q3nWgi*SdP5;_FUMk#pztDp9SUZRL41li2eLg>c5b{rU5-_rVn(? z+lk(5h_l3Bj*pDnFYgAX6}HCgqc~b{LqmGsn>=#uYZF8L93r;lK?$>EZs&&A`sHNR ze7WD!O#5<1yUrRDx!{Fpy6h%O8*y-^hSbivc}dvGO~<88AB1_b<>ca%LdKm%e8CsO zx)krbm4j^c43^XT>IdAHdEAYr*}`_bw*`gfV5Z#0Mw1bqTyw zD+i)5mLynU^a7AACfC~5&?!dm5i`l?w)>_pXH5B~YZ+2Ws(KOmr7N-C+>XuQK=_>G zsFJ1Lm(fKrF?{A74+?j-e$B6#Q z*QGIs>RLdvhl9onX9~?Q0CO4t{b>$RJbcsL^R!PySB}`(ceN}~N(8<| z9gGD95**zvM=d38Vvc&y4u6=ry zde?!YC6a^9Zvu^0*G2qi!z{gMF%oL6Q^c`KKfvI~=ftu~PaNsbrD&Y)G@qim&{DuP zv7|Zr%iapXVpG9VSN<{-cF-d6EsPbtZ4aHI;@+EVZTp9SNkOo4Y+EAC{wAB9v-qX! zkxG3nj-A)171>>_*b$ocf*ZR`ER{`4DgO&Rg0wCRAM2Zgyh%R*jQ~({prF<9pLNPX zjUCI+z?oO+)RM|B%zf!&;fjkeN+*`C5oEfcXz8rQhiWes#_ z-mpGc27S>R2lc3pq%6IuFT>BhI;eT$;|s!PdCZqFQeSk4d97`CXsrLNC)OBpx@TT& zi=8k%e^Be)X5O3>oGEsCE{GC`UpxG~Mn~v@L*BUg>j42#eiP_q;=GhBuZs6V-j0+o3Db z4L}W~(ce!F880{K%XZ%+fY;*E7azqV%Ld!^j%9hcwVwic23;u-RDFAVjCRD z917Q__wuj+>>_t}`#mBGk%YS`mXie%G3A}81x<(0q9f6dMLSiSk3PLesk;(RL$pVg zd$N~3*X;nYmBSl<_d-!Kx_4Q`yMRCj`*I{r=WViL^n&&d0f5=kVlI64A|Tc5eSTK{ zu3H)}&01bFL+yA{$VGiu zNx82t+-rSkAV$gK(|07H6(6|GF4ZW-EJhUz!!p+;ilhZ`>uorR-9(E;qQc72W)~oa zky39Et@tPEJ~=5ZkbNkt7Fl;`ebh9&sad}oQ`+GeAh&l1*8A$43D&1Q-Vv3K<@iSx zbOuSkWXT~E8X)i<`^r5OFM)fO^;zBcGBvq$qzy>8p7h1oS3gjv$@uOIEMrmJXZ{zF zK7{bm-n-Jl3t5EZqjYD$0(&zo-@SS?@AX8vqKkp?U54cuui&!MFWz;yNFP->SKoxGTGM_CKH-F5Q+6`0(X2+Y&hSx0^sFCg#X|ZSDyML+YUr zP%6J!L^w5q+Rj(32@7|Mp9jL{YY!^u`E+AGeNX#cKPk|M9RITrDK8T{^Rx|!@|7z3 z{VvCcSTJdPoXdFfcPXg4EfQGq4rN?;8Xv9)lCQMFGa(IMXsoO}=YtjB3pLe)lU2iK zXAiQIvfOzp_T7L+#n}t!CF34zj9R>RKMmE29VY)F4D0=78NQTJgy{3X4Mg{{OKsvl zU`BE8Uvzp&Skdh!2L0oZR`+w=^xND84; zWnLpQpG>C<)SBt@)bCL@j4mHR@{03t6}m)M%I6p10Y52H)e)?%QxccTEKg)Yff6h< z{Ysgo7pMqSTZf?}PS-Er(Cvomv((dqhryY4VcmK-sMjOKt@{QV8xZM2^y>BwXi--H zi52$+3>R`G|A2G@!Z9~0P`nIW4%sNv^PmM$7%$w?&Z>`gweRC<6M*TSY^U7c)2>I& zX^8vGc6$$#8#g3}&iq3aNv;P6Nwr-x4HrXAX!Qb$r2r>lOdqz>sf~(P6<$1(KV%lD zX_~G=2^^3*AMf!{e%F8m-2uG}qOkMMekITeJzL2E55Q)gy*|3^H1g_+RekyE7q%yz zVHT7EV5-(f1NhAA7k062-jb{+ph`>X+z=xfxOOS^c>Fu2!V~Aw^)3(J$nPeq`eNMMzg1&j*M0>vUU73^T+#lM)yqWXXF0i+7-atT5*W@CzYWlz zLMC6F0UkZZ&qN_IP!VpWc|tsv5#TuJiu{$f3-7!3w=A_bvEAAcuXO&~p+8mU#hw5ETfOc;NZ4Oq zW)5oa#l!=H=KhJxw~-Uf-Azt<@iy-NmH888@yRh87l*@8H3?kPuSl^5F~yHP&rk-c z;@K|C4y6{LwPO|Gy4Kf+TP8op*LNg>l1(Kwket|E_ zIRC`e%a`>^*?W?4QcFgC0K!8*sav$eQmj1=HdZIK0AZ}{zfC4At1L{+hJeCMmGn0cB$pqsn@1S0ws3D%Q8E;3g z3E)x+9-Wo;If9Q$h>mH4kQbo3z7%RyWUB@dG**(lbyK)bAfw9)fT5KYVjT$eJoPM5 zGIFK!iCD6eL`A@={B;5#eh0LAUxgPzc0suZ)S@FkPz2REE+?m!c9(Y5yLLiy(kTjj7;# z_VXD;3z($-mGTaY&AQCE>Fn;t%wYH3QK7hOIMvR;M1dhi<`QY#P)0}&umRkig4xa% z+n+Jm(O&$$+8KC8%^*Tnx&A8aF!T$! z1x(sLSgWh50)axHk-F+A;EUa19o*Z=mFI(#fn8Otnxa2ScRpOZxEOropcBLtPx>B|zyd z>tx73dvt@@AY8^ER2I#|c_u3W zoM9GgK5SS|mZV2t*E0qB?+d@{w~D$V^s6@azoc|4U+TjP;@EeMN29`AB(Y)mFNviU zP})4;>h_?7oc`D+y0A+=B@boLOQb*%$M{l0`T@{LX%zrGJ{hX+X)E>|*?6*3WDn!X z;qwlN;%D9B8aCsw2;Z>`$YKZi(?>L__Y)eJg~S*ZwkZESp+AaJQ`4RX?n_?$r*+fw9vTGbL)bpDRAb|7gb( z2x3olW_A+257ydSU!EMqqez0GN2fcVf~v!OdWp*xi^7QJ5^t_t#@x?D(J+XazyQNQ zUc&|)4AWvE4g(0J6eTamDx$V)`L=gq~oqESCk4+aqQldo8z1 zlvK~S{L;h8-q^ETn{&sI62i^jOUgPL1S;9J7AVNPl%d*5ElKz9g6`exVEf4L+{yAK z_!>=-adSmWj|G#w14KccTUPp& zuKRiaRTKo4CtQ8{+47BETZR-Qc^6BO-Lfm7FP4Q;p9TOJ%l%nnqznQ)K<33G6BE;& zAQkxDS39Y_3mBI_KkQX`BL|+=Q@$0N+v5fP_b7$_=ST5-!)phYxbW-~8(@V{K!I;O zAOw0AJl+>kTX*2}FO6hNCAQ?fv}as^vXM#;&0J(8m6-`H!BD`OGlE~A#Q*nEkssGP z4}9*FG+7E}9$sOG9ZiW!AG(RbeK&B<*@zgR^$th>R6x{NnTP&e{DC$O9In6I4nWoK zyYC(^6lWDAf(1ZXp|qS?S7PskH=Qg0NOnm`F2z2_V+FS7tXQQN=yk}k;u)FXtvXUr z=iHg;x)^v90yHgw!mrUvJqnC&kJ0ypVZ$n&09{v3P2_T$TLzM#|^68^e$R{2dAjA3(sB(N{3wYOcp9R(fANae;jH9~8NHBNtT{`JMdQsR+*b&0sI0^kb&_X9kCkVVHTHUSr9zAlZ`4u#1{-9}l(EyYifeM>*i z=eoDNlo@~Xy2V7+S^RN$5KnGLaOx51gt8N&+$ot$`#;_B z-AX9HF;}O2=(w2vP`-b#k%ar<9Sn#AQG?3s2^X-qq&w?-E^~4`#*&$ARGCs#-B5*Z z-r)R~f#+htAhnEpfoL3ePGe*Xs1yFt`-p&2a%DBDAo68qSY`&!_g3+^;LORxC4xx0 zhT6FcFq*m4+pXIgJoXu&D>l$!uuIkH6)}Z?hmvmQvAvVmeU`hx0u9s*98P!X3?!1eLdB^WtuPC^s$VgobLKIgN01Q1g#DdY7U2A)Ru}DaGRV21Z zA>e4zv%K`!%`GRQ1A%IG;@N}w5@lV%okjhgo=}skZuTx}&XAf>jS3%dB~?VO^5csd z>zmNhBi)O@$w0lY$Ggu^DLY7tC!+f~r7Zm^NIV&NLWV0$f7x&`4Y zcdt^4IwST=Px=q&(fhxl$7yKuULxvqS*`+hD`%3f+2Ebe8GQHRUqLBxP+2t!#{~9ej6!qr?m54E$&Qz&tAQ zU!B>~L-$YH`~jPN+{9ypCf=~;ckyeQ0i#6L!0kw0JVPS?O!mK?SmHuk!inNOPgRDc z`k#-F@3z*R@4H1un@IwEf(Z*3Ab|Ulfqs_ct-ZEm1Rh!`IfSq7v1!h5#RBL;kbl1n z8^?8`?BM_N;*I&EPPez3#odGvgKC3}lNN~E|I3sOZVlvu0~@;SZNGEERqLsS;`x_j zN7uuDX}ODndR5lVMOf=(fiWX?OuCygNokyi4UE7Duz;f@&x>}{0xuG+TZDvSlrJbH zyB}4vtpJ;!@CD?bZq{24$`N`($DeB|INNSsIL$P`(vs6&+ij1_Jq7@(G+hu2$4xBd zK8%37B-!gOJETaY6DJ3GL(AFll(K%WSNYXL=)$vE8VLHwLXg?mg&4GK5HZir;)Q{3 zr<{6i#~sYQJx_c1&U(4N%Q0{0ovpT(ocwpq3jk~vvN3kI4ebi-Ne#OjC`2rVdi!Am zOY}o$UxRLa9e+(eBYa35{^D{n_H27;uA|M6CkI7Uw6VLb!lqjAN^)f=Ix7^ANY8XMRVEviK*~( z9kvZGCB;lnL;y$A_{$rd@t*j7310XngC-U?3pQn5NTH#7jNPLw`Cxrs>b+$*S&RX@ z7M3K@NGm1OYejV(4M(p3`I+b1iUFwQGxfCljty7_Ln9VEYX0oN^u+mb+;Yz*f3TGJ zlJFK_39sD@`>*)Hd&z*$e7Qng8PJgzNXlG(vgkK$tw(brie(rg6R+N)1p5U*9g4I| z=dw56g&>g$h`X_)3o=l%qr+IWubM6|%;GSBHPWG5`2-~-)m;3FDvIDcM!-x_bH!Lv z)hGvaF_vXn!NNrH5d>4PK-wtp)3c zFHpF4Iar`A;`gtqBk*kVlfzlsha;1HvlFMf2Ml!RpUfKW4<zAJpUzh+siswu@B=e8@r7*%-)!c1;&e3u2$BHdzJIaa27f}T&#Km`!D}<* zQ~@lGz_|)c%6^7Je;c}s21A!GCS*1z#^>F~r{4Dz$RE&SgwKcu+R?bv4!SGq4FS<4 z%rN35(DUAMgMnREoht#lXkiorBujD**u)T;(Vj zSe{lWh)Y-J9!Jy!H}Ua{zXjh6W~B3_>aX5VlQ1kFhypyL(HfC%KbHG2hXv2ISyP|~oiuc~D43}mb$?-VI7GZf2YP4! zX?288gXX7?RS<8;HlALUXG`6*k;vK(IVibpz=@KmeG@Vsq2SAGmUj}CX;&H%>qgcY z#r;R)^;CsfNeYhyU^kQS;1ANmHDS?!Gq6e+9&+fPrvN%*WvL)n*@*L)NSA$N;XmAo z6idToUg^M&FiP3MWe$w0mkM8Yp$$C`PG>?p!i$?0$-cBT!-*sYHX0zc8TxAdY3ta( z`EY$8=EK9=^D@(b5IatvTY+fyS=|ZQfl@#)SrqSj-S=66r^bJe z@NU8|qcv|#>G9HX3EXn&8L)m-D(>w>FEt$rEj^7lD&2^gdXC6J>OArH+|PP=d**0) zx5fN>jZW2!m9uI;*lcBAU~?fxUS>mb1y}oBRu-X#>bcYl5cRNlK@_>z#0wnyH^3%8 zm{Npplj??O;MRP6tpPV!2vq4^H*&^Y3(js~eUVt4Qs%y%L*5o19PZ2tBm#cvPqK_; zqtA^N} z8i_O2MZ5C?iH9Mh5wv2<{Cjzq=9q1fn$8X2oHOnRwzx}oj24f#+e%>JO9QtHc=p8= z>fcbkdA*zbH^7cKXs_&FlFx`9ve~v~%wsCNN?=~GZHKvnywRn+NK6%+LeB2~{E2t? zTcC1}uKTQu4?3?@uIvmkw;E-mYw&3=rb`grZ#y_Y3}%@^hP+ootp%{HxL74~ z@)GqVm>2D{7AXTf0N9ykFVFz@V65BeaI4t|*1xC+Df!Eq2;F7)S?|_Xml+3C%ga?t zgT5LgU5}|l=pCC^`tnE2_}s8Tm-P|k_WXSnP;#jrJ-VJHR->_|(4&7gIdhgLUY*Z+ z)foRTset+YtAK7oEsdj6&%MY7G~Dn?zjONqP2(`Bu}8_!7|xrUr=0?ubG&vb*43rb zV7C&mKI4A{)@R|EH(bwW5H*-jKAd}cmGzZ0*xdk(4%6BW{1K{+IHT}mw$qY+I9+2j zJW%#1iv@aM<|D`hh3Yxqw*mcBeK{%ckmg*>gFpy@XqUN)_QTIKD9r*xO1L1uBf9dm zD`q+ua8K=Vt9}vWai^RSJ{3(F|5R&EU)JZ?Yk4^eO63uF%^2SLbYz+bLjq{f4{Cb& z9p8oLp{5S-3zEM~Y48nap)QX59Q8%#ftCC|qjjtuxy%JXn+G-1 zE&;oJK=n<0(0iL$1QOAdJ8G>s-pv$K!Ja#4eDVV9nzU52MvT%lH~S3|tx~)1PyIcc zL9WuB_LQdl<8JxK?F^POknCN*XedhmocSf7)RW*rI;mtl4<@<bYP4qC;levC~qGMS{?<8Yk%?O8I{}V zpJW&GUB`m`;PEJ&r-7&)D1bH|c>W^-Bvn@!A|Jc8kKAP0(2VlY+Nsf2uB1QvuBjpKLmSN?-;Q{)ccCgpLZmPt- zHEddYb6P{seX**}S+0s8{(y~`f1?6&;d0f<6jOV(C}Ai7vNZ=NNU@iwqD>6LN9^de3o%3Dz4KKyGc zQTGw&RIT%BT*DdS+*9XYW(Mp}n_oIkJa|qN2io(?VT9JRT?g8k`YNK645eA0>7Dzc z#k2K=fzr~(WS~cM(a;A=3mJgTkM7CB>(f^tjy?b4yqi2|01g*bFfV**l{EjNxiilz zG1rR{I5lHp1tLXn`gt=E8ajhj2qiRnXPSjrihxMXmZL6-0rRZYb_$3a)r(u5GYyV= z-z2*|&xnv4;-Ybi%&?drU{D3N#aw9zFWv_bF$rK!ePUV*Kxo{jc`=@b01!k0E< zkAO-06X)&C)x3&V2Kzc=k2GH&9>nb@)H!1MxNNplDED^aqfAx86`C?&?b5nwuVc+9uS?*x&rPZlk2W`7$S72iRe zH+NQ52{oscQe9-qjDNSENlRN^)VjDW4xOPbdnfO2nitzT~NabnQ7j%pK}H;5#8l?5L# zTCMX01MV`LhAut|NSWf`-SVlDz_2xM{D!j~(1k|0&dBI% z)tDX~o{2=C{h2Qks6YREzT1+EDuEXUl!P0xr``WB1S(u$-_HAUDw*lVrT3P(J_zQN zyLhG~z-HZQHQ2rt%ud&m;p|Nir(uiZ@j|+^BOYECN;lS{pe}I|&KWVk2Ih2H`r@WliL1vW z9#64pJWY)W>Ov2T1d9c9OdE#poATkt;F&evTUCSaeZi72FZ0Z@|9^CScR1F4`@b|q z8b(A$_6pgXY|>>%cFLZWWK$tj$SjwP>`i8NX~^CrJLAd@+3RYc<#TR z0vf477&yr|Yq$l0e$X_}rSvTu6xbtj4ktcK~VridUEhA3uY*3VbcmXan%Zgo zXmav@dE&CdTS8FuBD-`_wBL-#(l-R;+gEknc3tQUH0~TvKcgVKdX1I|E z>(+9{$6lOyz4cLt)WMDJxUG?)>ulFdCGxbq8K)nDU*4O|tryacAWz>Q^ct5L*k3?? z^K(|L9W2LL=wB0A>vbFS4z}ODvXV7Gwvy+cR?8uiduM*Ov$w+0xm& z+5EAu_yl}fBE1K7;9+*ZkI~=?fxGik`8(IUreHUcz)=>1{#;P9I%>6Hhjdx$yw{wU z!FqCIO?<5WxJ!t9EBzb3pgeg&Y&u}a_|U1|r^+n)Mr3hJF@c25B4Xp~751J2eZ7a& zE9Js_hRVH72CD(CrO1#3W`5G7KaBVOv_ zF&Dt;z9T_d;j&~_myA$RSICoqQFN|;RzH8wI#(c5lBk1`Hlg|UaHrCi5f|+g|BjG! zr^aZni#ui_b8RPE;CDgvpm*HRhNtLz&ywxx-wX+|wxVL*q+bWW_I?h8S=VD?Ec=x6 z;&3omc6npUbSn^Db(8{MO++bmgOs)i!pj!mh+bH9%J-)ZNH}Z_3t4Zqj(raY83yh5 zIG$bwG@<}roQ@4-vzr;r@K}v_<@vjRu+oi)!_?DUcpapYfKud7*L}?dl)^u4e+5KP zlzthX0$u({+JQ9Ba$R?;z5DFXM7=?86q^9z>u=SjX+|YM>4w8}TN|0IqD0yh-KS^c zhC6+J_MU1NZ(*~@=-vQ&1v#Tmuue_`ToJhxoHU*fsMgCpyDin{?Kr_-{T}GwcEcO3 z)B|t8+HSS{OvQY*KGy}e-&N;1`%7J>=Djx0Ry)i8PkZ<|FTg)-bFb78IJUZT`C{g( z0+IhY(92!m(Zf%!8J!;=FBeXOQmfrY_O2=I-;)}|HEcU zuk!WQM4w)&qVD-yT4C89c_7#E;z7?a0Fne!1HeDD-t>8@tj||1lz1&{v?a<9q*U$c z{I{Q8x7!4>OXTe!!QJbKWDLykh?ws5+~t0FS~^71{ZFjZ$fxK*Unkr5)ZPR;jxU%m z!zzNy^=K}N;#1KdAbY$Oe*mkaow?!Qdm`fOoHrW*4#cUCPq$sKqxdPG!2IRevy9`! zyj^E4R&I}*ju$P;d$&CAdRo*l-(T(UdvkMWt&S&dXK+=Y#B&Kio*}oQmT9wnLpV@R z%E*jBMhRlSDW-WvX?Z!;YNW$&&gEFJ&HJ-^>{Kc>Bbdqr#T}01qNr+ZXb4vBrkzDG zm@Ukf#MOTLeteY{73LYi8q=jYYnp=lYFJ*=im#Te(3P532{2Q8x|i)XafQ^GbB_Ad z-P0nqbEAg1%&FI4Afs^-8C9F4i){x zMy&iBfkW#}dtl1{=&4hO`gf1_mj7ioEPZTKn9!bhMoiNTA29?z_y zqG}7}dG&nsTc^%UoRD{x8rVg3`sIJ2Fce&1T#0odGVORt>i8B+Q-Men3}CPsuh7?T zI;f8Up;s4euqT&rPf9P(x}1^>vo&}4J_;LjY8&^2Y{1xSAZfHe&F%L~d-dCa zJ@9kDg%?>c^{nBdlWusL^XYg)`G(mC5i#%vHyQpU;kD!lJ`wkd9OeDpwWVH3gg;uv zW3|s~X>n(J6W-bXA-z-sfn0`W-=zf+N$M*Oe2M5Z80OD&v7i*MSRfEBGd@dov*gsC zKApDh326hDv#Iif3>cMp1kre-DqhOj_n3(x8F@GZ1WgRaC~}Mxd5EZDgC%p;+%Za4Rn(@4^LOe zDh+M*4Q)zDc<{xw;KWQOqPaQ|Kg2`b1}z>LvJc!PCsZq0Xdz2T&b1&1JLbnc0T;0z zoo?_$A{mAarsqE)$swPf710Dk+yr>n$^GO|ZZxR*2KY^*`giGsJ+N?b^61*fI&C%H z{a}WS*pGzBHtH^}^d%4R$78+6WE7VL)xQE0-tXGIHuMa%p+Z@`VCaIFFCJHlk=(trW{$dxp{B7%JxTz z*Pq6r>cejIDYqwxXJV4aRt4$%5a~a+1ud=a*nYiZrvXE5GxO%*>?j^A)+3#p-P%9q zXLZVnkkuCDCAH`EDUUDKl?zf=J_f55g@}CPvjJ&y6Eg!KBD6YpN28!}`ePPjhEAo`-MPmG(h{Y7u3LK5%YI(s zIn1Yly~zfr64;I{rQiYkq#t^E_PhI6LS!B|hub&5`5MiWdIU>P+vY=g_uSW`)(?jV z`TE}3E;Hg=gn)Z4{VVqIdkmfzF}D*1DXW7j)bIf@;SbO!mk?g$HY|Jay)q3}q);bx zZD3cG?TCI;)GqR5x{~nL1PUtJ%c{`DwT%kj`1Gm{*ul+3;-Hqj168hAOhtV(4Vi(C zbBOztQ}qt@&MdXz4Cqpdw5$6-^&^2<=8@|XgWM$=)|c|V@myMSj6 zFw*_H=fHKi_|7WY7P@`MZ;45s3_c$WJWliw-Vvm(er!E?@AZ=*fwmfrz0Okvk~*|s zvYj831%l??PKzMUSziW){BA3908%w(KPQkgoFYiEXn43CqIp`+{4#+JZNpV98*&Jw1j94=)o zB&~s*`?%0t(JY@~i5s4e*BxM%LZ(ZC?A(VL9g3K0@P@EB!i>(?nU|5dFI(_JDVIz}pAZON0Jst; z$y+bzzU@67h$ONIVT(F(jghn-X{Mt%=@**y3FjLP(&qc#-KJZ?x38TW$^KsIda5{k z@N<-EXK0iSafwFQ`^XCK=K+2Gul@j1c&cA&ZPN~+E=Ngmjq|U^v)N`IHH9w1^yN+j26Kf$GwyQRj))UVat)WYBJl3`u4lwG)N*a!1Cs)Z#6Lm9 zuDQqj69UEnM|#e3Qe*vt^IW7Ba}5G}{XQ*IShHR3cQ(6qVt12zr`F4XG3t8R^39ol zZ`u&qjK2l$e#a@pt{BcOc%J%8`kIBu&?AzMIT6u$4qc2kMn$-K+IEQd#XHOK6Zmp# z+AYahw}`nSqH0ad&NwZTfoPvA7W^xn6bmolULtMUW3Osum3M%fKEzKfB=AvcgRwjw zP{d3SDOPK4N{A?dZ$WHF||#b!}h{&d_amBaqCs&1{^UUY#pms-rV z({@Ua39439@0ioWu%RX4+HbH~Nef=sokl3?2|-*w0q?404kCvSVP-AWa&%|5kP`Tttlb$Nh8)^VR;IyHfP335U# z+&5fd!J|occHy`0e!KiV|2|!D*3DqIr`;p)!sHo$(Y3jt`y6}_q{-~78zPtdF&eL1 z7_PhuzQZjNTsI>+XNFNFk%Nq;DZzavHBFQ@=|cxt37i6g)EWXgwK3l>;m(eUccBe6 z^_#(PM73!SWCPQEF(75BOcVzUT#Db0H-y4BFXcR6z7sgK6ZpUTKEA!fNVxB!JPFj`$0-A( z$QPu@9o7ZS7P+oZ+-_|!d_F+Lej1St{{n$e=k#1>^&Qfnf&8(nf>q(9k+;&-tk1@h zk7zo)?-VTAkcU&*C=tQNAi9ppw)OpnfhZ{*i^S?b_-bg?QOR(~SU?-Rj+mZ~gsm`ZU_FwT`*l zGC*pR_MS?kxKGTHY_~B1Ywi6x$Ne2Et#0e096<>W&-<7twQk#+;x7UldTxDMEV^0k z&i52Y+Zc4+#k+doN0@m+`__2=d8PZP^iUnS9Q~_@YVr^cvzM%yJ+JWM5b(K%~RTPH=m-!@a&4Ko7TvA z-jM4nPlG-y;L8>JCb8Vz6m^RLAr$%9$GK#vCI-mUVMQG+w$b&l#E^_e4{fjX7!Fo@ zRrht47=k3%@hQ=MH^K1;4w65~v*guXQv`-nGkQkq`1!f;BNn4&(5z<}6yt%{xUqBZ zHGFW;GuJU8iw6Bqg1sdY$m= z#btDhiQz1gan}>V)v^E}ulBMB+p4Pf*?n+3cUhx@bi~cY;zl=`K1B=?vk;r(LARpz zhW*&?T^w)5b+>6D{TjKth-l7+y!0E^ey>y{^4z`@V45k`R?K&o5Oi!i%M!d1{;hp>QVg9UMD9$A|d1T>P99I{x~JUADG^p#2Z5bLDog@bbET*$XAESc<*sY@n~Ff{c*CLqFqhrqfF@LsLnaHG8 zKS-}QX7wW(D!Xo=nfBi0XZJHGwmwnX#9?4%nX<%hX zE>sRn3L>vxAiV8|QF~oq@({agZz=RE+pyAo?(qOyY&CSS=|gLy64cs%qsBzYxYtXo zFpxt5g$1^|m7jN6;1l8B6l(#vw#3NUiDz=yfHH&DBERz+xU|IRolJiJ^nu(dbH1W4 zjnN9R&uAQAp;&zP$%ok`X!jgTc!6~54MbSm-u%Z~u>+rQa2nHdxBa{}sat&Wl)-Ts zk`421Av|n7#v9y@hVB6zeqd`4f9oHgb6|`X64ge7FMGcgsj6i1%Vi{>uXs0M4ec$W zjLb<25hU~f*pWV(4{EBzJ`^st&vhsJ8rN-d^d1+rN^smcWZs=I4mzA zJ;^#(I%VZa%5j^IXJ7iKo!u`+P)}vEU$cS?=jVHLd_wm1}wY$3dr-Q+HyV< zkf;{^GkKWW&dTVQ=pgjmlNE-NVS1;j@g?|k^kB!AV=Cc1+GXzb+najp(wzE)Q%cxh z&2r9a;RVnH(CP~QeToU19N{6c3U6QEk9Job*$^vFQLHxZ;yqo%U_ls3Zapnx0WJur z8g;tMm~*fZPaqN1RH56~sYaA6zT>gEudN*MQjlEQt`R`EQ@sxKnmF0h>~9w~b1E`- zcHsY+=dR^FzB(_Mx|Clt?wr^>?xJ(6hGO*DThj%R?N^=|Lgx_`=?vK zc9+Nz2L@Zht;83Ihqr&4ZOxUCsJcr6uYAwV?RrJBT7=H8*u|M=TOO0m2L4KRFGMbs z$q^q17`c^`Q4j6`hubfezK^X1^6xg&Y*4I|@^d>H!k$h5mMy}MkLC?7nbe@&!K zyrrcvMax{k#Xy?h5Db6;*J0g9`JlHQKEF)+CxEwJXt_*e5&wf%t0t%R2~@-nt!^aG zZKa{Sq{W)5;!k8+#+5Mnt-Hj@7F@s0!TtBmF8&>e)1jn3!)e`fCQu^J;kSHhQ1$wD z%hpGtf@kVFSVZ)Y*7{J`WRWMj&S_H=0r5In_U~i313z*RRotgft zD0g>yXeV*{S-TeadS&<;zPwxSBG#L^7z>_nAU!zf-T`Tme~sN6g`e+0cCur8Qxzrv zEG+3uF8q)Gz%BZF&cy(*s;W9iv{a&OVf(g-UvQ2=l;_W-xXo2MKpIS6wS%t-#<~@} zN*e6}nnZE|;m15!zQF5467DW~s3d+sYmxD4)dJ)jy`Ub}M5_9NApQWm^j%U|y`eD6 zdpevO=o9?~#$UQNon&G+noFuyY5?Qn;YdETj*PK;i&IzZ5a&>_2i;@-o~bJ#3qgQ)dCOvhYqOx^G zD%@RL=FYbm3OWq;#chsOM`?xEW552N#S)x`>BEmxOKS|p^+5c_QnRe>ky|o@Y7St9 zA|){1BL|qth4yJ<+MGD2EX`ULqhhP(0Pws|wG1P?pt-J1S>vtg-JR8)-?zo%Rz=(t zi-&-$ao~bmZy13XV}dZucW-3~?TW9|$;aRU(o2@pL7z#3qjAZD%NHgh8LqWe%qc*M zCcx%8`-T>YxIO3EeItQA;uyg)`5xs6x$#S-^1=96?dD0) za9Bl5^GZIvzL%9DKmIjefg(m;s0*~+Swl@do*LK@MnPD-)AlOg;*P{G2%!qz6s(gk z>Y!HKuZ9KLvRKcG3)t$rj1JBo9U53|KO5Iq?qp9pT&MTX$_2<`X{K8}K56@VbEFw- z312e(HOfM~oRH6<@Et79BXjOo_(LPVI6C$4xt(xvioihrm*y3D6D$RLRBI(gP>kFt%VP`f!g)+VEU@oT%KFr(cuUx(yN!E zXH80Tprg(j9ea^dJf3=Afg)C(MGbGOR~5jTCD-F9J3jX-Ti^5SENohG#wEV*eqCyD zpKu#`Uiv@Tl!)Wn9=97FD)LKpTZ7Fm;WNm3)bk9yxv-wX%x_`@A}ipbE%+&7)fqMtT+bvU7NR?r|Xd8 z0n0FdlD}7WCqd0QFprwZKlf}Hnw`h_9VPYpoJoGAQ>Y^_dns(5b0wk4PeGckexs@)FU>;Ij+2W6r4@5@v?o~ZK+ zu|%Z?<`31mpn)RJZR<^ID83#kgv7WY*3Hc6)(P(7(58NV_0EK5w(?CpUpk9(9Fk$9 zZnq|I=Z?YhI7FDhFT}Co-0%iZ;ntKs9&g<}c|d6La~GU%cvVK~pb}gRI7>d>pe7w3 z=9~PUma~|f1>k>%l1TBh)Yy&9-IeyY(ti1KT~#Y?MNJNU2tRAzG?m-J>Xg@YVk~OX zLskU5lk9AhvPrcX%orFuzcEFx#kFa28i9dYmqZ7z^CY|44ddcRpF^0RIlzHq-?jkb ziHa~8K8qg!-VQ1&4TqimM1gdv?C0uW7LDo!$paPOq^x)f=IX}YI z+B*yH{Q(lZA43P(p#+eejue6+2 z5W>qD^kqIcmON6g!(4?|l2M;{603LZ_mKF_m`eJ-`TjZ0Q)1O4;ZtS#Zo^r~JI8%^ zFNfG4%-3dnW~9=4zUc(KT`eOp2+aaAgJ*m)sf8&-IQkJYOO*taRn7JAS%D0l)wklk zXRNq%zf9BE^U2U$F*^}(hwFlCZ)F{?0 z&JR|tC130bQbBCDRsk1`frfeXAC9emV> zeFrK?mInKNxKrl4DB=!>fw!8>CUIr%JG0fX(WTjJ2hLaE#{x1q0FDPCN)ryWCfD65 zh8@Qzdwnj+dns-s$gUf%np1880W(P*j5+UNXn6xVQUu)vgmipN-5|9t`{~)I)Z_OT zy6VcctDTqIN4Wk`;T$G|Y>HQ7<3FCRd{|nB`xOb!Wf)H4wo3+VIJ;2`hLhl16bUBSy`4SrK;FLuG zG&pNWZR3yLdagmoDIU{ej(;OPc-!u+Mk|u!*`r~A$es3DtOFxy=o93zzsa&q^G2Dj zj>WG~x^)PoP{F0=3He=qcTO`PloJMeLSP8g5c1+qI~LZz=d}o&*2zI&{|UFyLBb=C zu>Lf_TK>ze2|c6Ky5(r6;1w6Cc5#)P$~GP+$UlZnypOdZiFLeA)l%5^9T)4xZLZZn zftj_{++c#Pe_(>nQ&2ZQ!&r^1GcKM$Rn}4q9{-5(J>+nJP%kRM&__I0Mrf!UG0X|1 z&z|R<m~q0<^0U)@f6ExrA>6%^9ck*4sAD zpjrEZY8w`^zMJ!<%YBSbcevg`p_B@lw4T38J^tEF{dbMqpgd^O5*UT4LZ^(?i=KjV=8T!*B}e`v+wRy>MR+QH=6t=LiNL^W*13+FC*xgyc8*r> z+q9R%#&@NmZ@&UU;r#8y1G^IUb;UnQ0s^%I` zbtOWlhmg)34CEJY63c0Y@D@?>c2z}}$X!p!PrhNuXB{(3b}rDiPj(hlIDx%V`+nUy zS*|M1rcs@%dUYj`$B3%j#SY@IGFM!(i~r^QrgUa^nPKY0;qg~eWzm563mKM7^dr^n zje+$TrP&6jk^WhKVjnRJY%72BK_!c@@?ciL-_f zR9!>_<8BTM2A@7yK7_KX%h$HWDqp+LJEgvu)gu2!o`+$}Nn_>7$?v1JXSc^>J9ssX zFeQH-0VBN`9~lEW8M2?v0T(aBRT$4o@$-3veI~&$9vN-vV5MhRYt^%GkypqLdcnIe zpNq%IOzC4MB(3dK=m9X43@GBfW3v_5V<@d7F&4=VI8`Ju7hC?v15mFPnKQm!JbcMy zb6$Rv2458BGH4J3VA#%qVA06YP`)>BMhKu_SN7k8Ql=KJ0eQ?p5XP+Xot6oF%vgS1 zN2b|X=2y=-2Pz#$PJ!#wYt4V!!!lp0f0nwmRz!b4F5?ZGWSqj=G|~u1$r?lrQdMgz z7pe!&Xm3V^A?L*LMbKMr8@!wgY_we5!8MwO2H)$0i=p7~1wR1?0&vQCzVK@dqeAWG z^7-EvW?jp&*q#`SV4nu-r9uPel{R4|%9JRIg|aj)qvJ+-0h$=9aUc+tf8hLpi~Sx@ zrk?ODGODNE`KGTZ`TAK+P$Tk)mq}lNao@o?ify9b*;;!WC#u0gdP7BFe-3DuYniS9 z+t?*NoT^J;R}Vkw-?Ie91&{mnNur|geMWXF?;?*d5lKnG41n+qvki;%$|ts3MBvUz zBz3hqTxwC1LMnpp0VpHv5K(aD5ioN{LX4Qt(;nFPVL2pJBZAv4fTB+UWb$Q=5}}iv8+7=p^z=jf1W|KnI1IU2=zC zYTIOqYub_iKe~BYqI8~nzevN7ZvG^V`nvu`Cd57eY0~E(7f0p8^8vNZzd7VGG5f|u z@Z}%ZHJd|_&8N$5xgDK<0@KYTe&Rd%X!RML3OXiJdD_tQB07zlbou2~&n*78vYOUb zkHfDf=RB;u#>|j$C+~$CR5^?Rm&#qHJ^bko*J~FT2-dgTgf-}lbBk@eK$}y_rwPsc zqxOvt-@mqt;-NICb2|lFqzTR5z1|!Qv}US0sBDO!&y2rFxV&zfJRi6ZQ#`2MKFOq- zTHiFby)+yOI^+eWjX-K!h?EefYA$Gq3}rVvrEgAA^iDZ!x{*mRhlWh$PDQB5oz^7H z*Yz}9gwia!nxrSz+l0Lt>zJmh)u7%f>1b?y^3^)0(Q5=I%M9enfvaEKiO@(y=su zCd}LNruM%SsDeMWHq6OV;-bmtZ9~Gq;gJ{u(!qY0-ygKwTeBBas|6n}^=D-?V?3*8 zm;RG~O~8KX5D#=sLv}+73E}sQQgQFDZ&a>~m*-X6qWNwsIcJPKek69C(8A|r^PSKZ zp}us>1fiR)Rz?d}-Aj63*~;1EPxqe3oKm2OlD}6R&w)?K&*v++Y^1+kxwLBF!enC_ zcvtae?8Q1xD)OxATgYA)C!Uah;iD>7Aeh~iF0{mmEdQ_!R_{HV-xUunDC{K;G`$-X zUYo=xsV^kh9W2ykI**#w`2fp6JW`{39UR$W$P$FiydS`B&svXH@6!1Dr;fLRqKC6m zhF`pSJQi>vKhbj8>GorDzPccbAol6`5V$X7_Wfa&z`tbkoh5k&Q__F91mJ@*%AW-L zusblIzrK%#82}5ua3P?OFAf~7d}eN0OiyL ztqA@BT4A=uA-5+&mv43mSryzc;n4*?bI;gUZUw66z-Kl}W%)fu-E&sZELF#hMTn`@ za^-X_K2wunR)wfJZ&9K?$6R!U+w$|oSMqbre}kX?`z0bg{0_odP+_T6pu*~jJO)>3 zVIX5!=|0E(2=))pty@hfU(>NckeEJ;n#^tbXEi?ZV5vgY88{z@Nzr+}i5rQrry8&G;0-Xy`f2dlRGGzhR%4dy?j7sm&By zYS7M~Nh$F}G-I#wrf4-{zZhn_NtW1TKbH&gK2Pwrv5-7Gu$>%7OfWoq3ojndSq)cJ_Au41g&2|I?LgI4Mka?j!ZSCI26T7=Mdkq)P7vr_6Y3`vF&NDT&3u8^m1j=ijmm0OgdFl)ZcKCKK0KJstlCVM z=2bISTf+e5p{>>AuM6ix?(JMBK2%j4IT9W&;IO$w+A>%D3s5=96NnS%e+a^Sy}kaN zJ9KcSr6rYXLta<$SnJtik@l0(a6D(VaZnNL^6~Vi!c1zX7%1@&`>|Ul^-$7ioHVq% z9X&xM_k`X)F12?M7EZyq#>!KZYp;SRU006hg7IifACfIZ|K`5oL0}eg37k6IGT^}e z*6e|ax#P(K-+5^WNMHV9E2q9J3%*%~{Zh;gT+_?_VEv~In~ZZ$akr%iCwXvBe%f}K z)P-z5_EYE#Jyb2svZ@?$9lM*pJoe&I*Bd9!I|946xd+k%r(O>sMGA>-fUCgr@G39~ z3C6%y=oaxn&%nK|+nb`6s$*@mx#I{>3F0XY`6*|7xs(~*jwr~Eg9)Tgmqo%(%xej- zAB|f7`{}=b4!lz`Did@e4X$Wd94roh+OA87vdC6A}#EllVXS^!m`sZn_vtfuh4US zxmq0*l3DEgtAC*7jmYwbWpMkY0(1qmlYeziNWLD_#K^-JtFxyu^a!k@^m+S!;JWXr zfQ!g`NL(UylnepneF%@M=Yr7DIwCHU+|+?YY+g^Fs%m2=%Q$lg01}BCU1gt==Q}BX z&eUT_RCqJlw_!mpW+IJ_iRQBnf7se$9UbS){|VeZg|UNOX3IMO!CxS>@zP$Ksw)V) z{ASaaQP)avaTW-6#sHrzR3YT%}746g1&^g+rOtna2qtr@KC# zfxoG~J6 zJ@3}wJy*26(glV&V;Q0g57NzQQ z%tn(}Z>)ix{eJ?0bvaBIa}oA37=P|3p@6JgPRK~kRW#ssMm)!ZCey;N+F5~?G7%-s zoEyHQr`*&|zsQo*q+`!7`qn|-@p=Y~&79DTxI~3td0DN4i#D7ijESnLB3T)pDNsJA zl?c)3cC^w8EATJ`S8dM^Mw_A~qk+OtQHB61p}wZ>&ir}zYH;B%S=ou(WYNK+1-Z4~ z{_K#KAwEdllPMfS#^H3{{3WtwQuT~@Mcq5N(QkNwR1$5CHs`$oy)~E8+9kbH^$UYS za?MtF&6m*%aY1wrLbz|84Qt@#@haZhC)a?L4oCDx{p1}^F@tZ1P-587ETGAC#Q^Xk z?+F3Hk%P9xf`#bnLvim$O+2$+j{(Y(6|=xfDc!`bl=GH>mQtX+2((m1cdyxu5(9&{ zEA_ID?m}0wb?s%0?5HbwR!>e$hw#H%;?#*~S{#~V`PvVXlxuHIh(O6T>5g8y<=}4; zrP%W)v#8N3gSsaP5Z`xAw*eZya53$|m)mob(TPme+%Buv4gtl#sfq~nxQL!@JjjJIyuJ-35CW*HV(j6jnTOiZ`+O{WN@1D1$v4?5C2B}M#2 z+KHz{Lq>d>Hp;IlBsJLY1wrQo;= zF2-^42LxZMWK^tG^^$A8_V_+8=rGgD-$LELINtNp_=Cb879D zGl7)JlF)W;ORW3yd_k0qA~-^Nwf;+TW3Y!z`BxlFfC;jkK)Dr*dZNSK|6CN>d39~0 zA96rVz4-QqH{;{4uhtVbj8R8@=&lnkt7hEGdT59d2|qpLQ$qns4PDffmp8=Io_{XJv;vZ&<)A3GZ8+knoA8 zf$HiIe}AsUq9HS7hn<{dg^fMN6DevX+zZAN03_!QJ^=Tl&T9_G>E$NW&}_`pPnxV2 z@t}gi=0_bI)TeNG-QF!(0TY!AqIzSaE4QPbo39%EW{&X4r9?O)#X#z?7aTu`$b^gj z$zeTv9;C(#gmhZ!vk)4q1kR+o-y3190?w;|qp5-0>=N{?<1tFGNn8Pkp~Dib3|@N) zmaH3W#bDc_!T#sT)9dUwD6CH~=F(c7KAIZ)bEs!;4f2EL`s2o|Aczn!X5I0m1XHj; z(prR0Moez}x|Ne2dAQ++Pu9&}vybT%I?EAOJoI}&<2sN14vLj4TD!9dO4+{@C?#_O zD_(}oXOLTf<)CFwkfot+pb-OB-5&rjM$6kL=6@Ak3%rb#=2=C+d*s~8iVK>KI8ROv z?TD|t{Q7R8W@ccn@R=r|l?_LaW2h~|o2(L%l7K@$HGG)8Kv`#jx`>*$efM_RX_gt# z&wTUikVy*?R&VB4c$`5)rGJv66H^&)IEt@sf^CvhWa!YrYHgYT$un?&1`!j7*bqtK zUMa`>Qs_Dma}})6BsG9-msP88#tx-a@Y*}t(Ao*LH|nUHxNr_Y_-S_>d8`0tW$d4> z_ZNau9y>Du9{)-j`De9;uy6>}QV(D5<8_y#6;zU5Mz>^~@-A*E7+0JF7&ouTBNoWL zUd3PH>$q;6Kz#&jvq>Hc09Z^f7W+_xPw5y?nbPTWtyhKGxeCEoz(bGe7d7a4VfVfy#lx zZ+M-?ga6FiMgn)$;w*=!sOH}L90i!9*`+a>$XToUcb!&ix7JiyN%B+V;kOhaGLhexE76x5XXhPlWqKLuEHla*o?gn7FYK1vYqKxZNr_fkLARTGYw4&CnM zUhwnQ3mfg(`Lhv`c;^{67|kqKYHwE9K?EhwnI5-|z!K;ps4vpe{yr;xC|m_n1puE4 zflO)&={*DK?iYu)jz6yOh)wgvaN;^s#598Be=4rvgj%<5llsvHn9A-MpT(YnUoTFf zAlNAE7+#ZrtQLTz=^-w}Uma%S8pRou?|(2Y4z=LOHc<`4`5Mc$4(9Mtgc$YI1rhGE zDV9Mgggi!q9$Vx8olUYFJ7rAN7W%dJ4fgP;)PaejKjdGe7{d;Sjwdy9mwFdcEAmlX zmf^i-TzrE9EieW*3uh{7P!zn7=1+W9fc`=EjIrJP=QsUp*tQQ_PW6ko2op7{X}Orp z7)LS?B(V56&H}xuk`8$+RVV!OZRA|h`62U&XuKEMijix)}HqEaoX#CGj~=H zr&Zt2%p^-HL*!!X5p@fh_hb$JS0Mr5&_O_~OsB?|2S?Hu=&uQVDH8zv8W^2Z3ns*VGD@d{*W0m!c%HLb^7)CRG51L?S5NdmL2vX?Xk@L1+C)KQRY4Hudjx zK)|-4TDT+7yDA@+BY9Hq2T2ihkQVQ7i!l{&|Lu!EGI;AgwPhmgV4VdC8AVO=<8Xp+ z7HJhQ;)Y(T_w2=zL|D2nu9KzTQ5&;2{UH%GeVx{^)ueBpke6>oClf@=(U#~tu2wq> zVe&@(;M{r*;*kIoywAPhW; z&MOgf*df9$ZdC|t)_+HlY1_r`d*^GI#S7`oz%C&UHHqg9l?iGp{0TNv60aV4(%@dO z-FXzwK8^O;EdJ20)=kWM!UD;Paey=tSRfTW$E-+1U2B}U0YSqJ#eGOb>y15Stift7 zoQ_?=w^g-Xxc>j#pJj|tuK7ZsTerj2IZ!JgqTeJ0OVfETOR|>{gR3^Z@PAo6nqp=bJu<|`1 zG7RSv4j6KKf~`QQM76`_7J{bkJnX|134g-fce99qj`PNEqm#4=zYkx=AU4xy3WF$M z+vk>#PCtJL6PYbL1E65#L2%UqO5|0%V*JWMkKYuP}^aa=~5;W8Y4-M5p9e-`-zs{1fF1-D=Ign~=Z%4@M~CFV1)fX9Mn- z4J;_y(`YLOz`;GKK%tGY#>;uf-TAi9j3BceYO` zvyR`fF4-g2q&sX$2xyZA+8nP|Q2nKUN|6Fi{5M7XKdGSp7Hx;E89R%q5^_0T&+Hk{ z$%Br}2#BBp^#Qb@bPmkQ<9!lQ-~fLv6mn&f<4JgN1+B2*)}hCqGlsg!2ma}dw>#n_ zoEEzX{u#WPKtb8Fill%8zweX8twWHaKJCZeddiUYsC zeZ~=w{Ur~^r!x_nn?rNQPNK6~LS_Y+V%kj7anJGA<=E$rdXLDSBxr%`Cn3JYpR4ub z3F(miG{pX3@!x6n$eZ-#@J(8WN^Pd)Cm!+C5)#1lH$x55+K)E~^9SnC7SUh*-lBHa z`@^dyU*Gc^uMstOJE!efWwxj|W`wa@5Uvy``u)^NBU_eKz0mvPf)!7K6<_FRghQwOhlg{nS7<7GYDr(&(U8N#Eq z{F`-Dn$uNm8?Ao6VD!RId~nNbYJwE@qoM}`)qgE5DQmpK{&hd;M=Y7r&oinjWB@F* zonR1FeXqF0TG+4Xcx=IOwC&TdlpUK{VmLfZFCO4d!j(O5(kG##1U8L&n66dfGqA~@ zk4kZ2i+H`=!NX)IKKy?Q|D^7H(R@5fhDeZVNAb45v-k+ zyCH>Sya4$$nK~a&#-PSz`c|`5(N%~kXtuf^^KJ|u{e};1TfKS(ln&Pr5cE%Oti<*Y zjo$0(e6!gX|98n*NPLJ(N6+Y=NDrWI%wGk2Bb+f2u-ytI1rUB{9NhF4dsDcqx}!J& z3u6&LOKq3{*lDqAB4!zvdIpX51DeWdv-EJUiSA$N5^)sO19uC_Bh!7 zY4eABI;^WS23PlHB0#_qFdj%By*jaK^gteN+=&fp}^rJ~B(G!_EeDIqPW zz~EZ9M9Hfo0ACHdX9`0E%#;vWSx0K`ALfYTS0oV)M=G4af+%<7%0QaI?E_AlS{%=_ z6Y5Sx-@Z81m*wPiXnLpt7i#}D4Pl}4pnbZ9s@x7My1?7DJNf4A#K}m=vH^}ZKTV^e z80BUS0NjR)aNKrxTL$AE>f9e&jlm3Qm>V`U3h|g5etOeEUX&Es3IBDaFADlYTV~#= z?nL_hcsy3XC3*rv8TFSwB(g7wB|~W6$KSlcn)mDm?igV}KM!4r|F;+0UkB!wr=y#^ z%cG*<-w;FhJVw&M$zh586T$P{`W-Wl+zcPXn7j3&akCvRDn2MItl^AHcd@asuyU9q zSSDv3lbu@6M?_Sg6$^7grz z*}7EvmEsBG@Ph?vim8!+Bi)Zb;KCPp|Kust(a8!sCGv=t@`7hB==-%ozAk99R0a#( z^xv{7WdavNSHi~6PVi;aZEa+iyHnAjBjZB_H{8vqKRT5dx);n(VS4BE#O=En{(R22 zDURw(JqHQF@O6UKa3vUrQzfh+jEFluP z*2;J5O9!{4Mpd+!Mf(cN%y0#MO^U3kjw@ztt;uO_XnjOZR$C9Nz@jyYlT%Ns#b&AW zOph1={}HT5Y=QfK2zI+*#9VX`e$ZyKr&0u1o1&J)8#^BCB!AL$Em1aE%PMgH66O1Z zF}sU^w`u29{G=vJ@)?}%mCcJryCdd`gr!q#92$_5S8Dfd%t5~|bt(2F8h)UYZ{Rw+Sd`X9lO0b!QKV+qSJ(ZX#3-q8OJDlji`A&PXpv%1cLKHZ zKyDF}B(+;j-gK01x2xFt$STJ-xtq!O+%+xf#h_Jj-OL^8E|ZD3_1{BV;;zM#jwLB> zeHn~ya*C5!cWr2EVzOxO$*jj@7x=`^x))C~SYSU=^0)u_!S$SA4DA;uZuo9*o|s%v zaw}(1a~hkwaBRg${b<_`Ufc=D%Dgt@j8NG05z|E1&ytK`dh2SBvKq0X0uWEwde@GX9fFOs1WhGkH0BMeT>;SIflN zF;HLqrXb~D8!kj2F#lu3EP84)r{Af0DwddhLWtS^I#+Gd$AQsQ@sL+b^9)Pdxuopvq)% zU!PP`!`70*x4LS5EORw@#pof$b|fx3C9aA_L&t64Wk5Xc`_F4<&to-HJtl(3boX)K zkGBsDOX$gjCkDXTd*XC)yk!OX*bh=%^w*{zX(^%cEMBg9f|9L;{%t#|WfIm3?a!v> zXD*1DSm#n@(|3D*5r0hlFyFQ~*6YV-?-4rGDCgN#!>Xk}Z7Kqk1MW{4Jt{NY2Zfb> zt?SEAiUD|oh1Ds&|HodfV-A^9R;uZ49k>^whBB4xNb;uQ9WU;Ck}@gjkcggmEHwaM z=Gu2n?e@TAr%{=j?48>JEC zF6hgfR+uFB!Krlmut5R#$szjylT%w_w>=EQi=?kupOwK*F2Wi0$dU}>-uT6&88*1_ zj(+#@cv`3$YKv0qTKe3TneF!NKx%jHUnP{E=zG+~?V}#0Pu(oGzRTXS1#ez5Mf4G@ zS0{!rj~(|fat{BG_l(Nyg+sr<@zqilw@+T;ZBjNRBQO=I8h6D-lkj|>QJB}#$TwE^ z!h~XyZ3ZZ^c@5cuRM{xIG@b1-<@h3ON~lhe=uiZU_qn*tZ^vZg_yu`pGRI+f@-5p4 zU5iK2wiC-*$Dnv%-6YpBIGyTcS5FUwU& zU9*jeT%Kq=;0TwHzjYA?n$(k97|E(Jl{~?+QwOlmi*51`Iq6>ya89?Czc);+tm+g zjKi$M)fQNS4#$+?Z~GvW$PHI*&YzX?1pTGCH(x|i9n#!LMGU>ZarQ@hc@JSg!3Itm zB`+${#z=q%{+7l#hT7wT-YGxF7jHSAlph&>MLoFP#_9B<+1UR1G1P?lz{|R#Y&+b_ zjOiG-cH#Fsi_HWdHB142Lef$hyJg{)D9Y?){F6&V>?gn4-zmDHKxW+b!0i%k{Yi8< z34NO7wJQz8Pu8Oim)0VuV+^fF*ss8Ex|YE?kQ>Y}&7(qur%5OuSKaIKXD}1v^w3~i zw9lgf!>%FKQfzR!!7SRP@)+vF`OjX%Sa(9r5b{pe zc0h#`fC|}2fGU{l@F?W3$HY8)&lNh?b2?zv?>XfMp^S9;e?2|B!>5;g7R}@~R8_s; z9ev(l`h`^n9{SI?snV|~Tk)QegY&XXw^x#zRmoG^Jvu@@-WwWtr`(!U61{ZUvLRx8 z3Ac?$PWPnPtXn;-qP#2OpudH!JC@|y-qDLSv++4E{er_ zae6_&+R?ML!)eKg+Y0C1xj%N&CeJXpte@GJo8kejJm-Vu?W=m(;2Vp&Wx8P9=Ue^9 zEq+PLcoF3=2k`vLpATPJrS(;_lw}i9KEW$?Ac#Bhb}nZ!=aq-5NuOxm71{P!mklhf z6;fUpjqp3c&SAA`ZvW}q&&KmoUB@Dvf2>P0ZQ6SICe>^@HM|)m?JgWYwdIM$);65J zypm1x<<>iH^bh&&fj-Z1V*4?pP&+w=$SM;(Is16H3%MyvFm61^4&M5uwJVG^pK<#x z@Txt2U1VBf@$~?c^n-J4Df2)2&uK<>X1XVE3tHVwz~4WKQEDTuD<+HkeLOJ8+M!F2 z8kGy;__|j?=S;jK>p+=VrIfOmo{m9rw;g-c{nbt;)2lEPuI`7^q4)TblP|u_PMi--KJW6<;KH+Gt#kXN^*yhtB z6zV{@vEO=Wn6hyBdnCh8jv;Q+H9!1B713*Ke2=1hVuF6p<3a-!u>~J#p>$nKiRmhz z)y`FKFBD7ZB!4Fje2oH%&*EnHY+a5w$e4C4HywngGC8b5oqu5a3zhMNZ)#~ul^?I8 zua!Yt2q;9h=@)6C>sg~w23M7@rE-%RS6Y3!({`f^RTZSWD%5)_uIo{v{pCk#a4)FB zdfR%D-Wr>pImzC|Xw1Sf6m*<51?Q=ZR#O`&NTN9a?KQE=-Fw`xQd~1`drs3#3`bX` z#Ce8I-4Bt3dh6(Uk>Ww&_LTPOU50c-r?W=H&?&;KZWISUZ(>ZMb*&s9uY3@uN~Zr7 z8z<$bxA(@ygr6KjYdl>EXxqp-Syz{_*(BzRC*sb~H?=v5!OI^>uO0@ZsAIXi=vGWU ztqHBmXccj&*QR-Vi6u?+?s8pP?wat?uhyCTP}W8@f%Dr4&H|(pubb_Cy8?PRfaCD zcqC(AxYRQ49C^=O=$WwTYs%iCdq07DE-5n~qG2&XXD0^Y;VTL0+r3Wp^HQT@3^{PS z1!aZ$YOybWtd^VN*)O_7r{nL57!KkVboE2k$9KU* zeA#cf%5lJvGbAR_C4Iihd;cimi&r+%jB>QsDo*zu+h6xsZ6lsZFfpC_DK@uL3tgoU z>GiTyxn+do>2Ry1blzyfzL#k4y>>Bru zbPl*h6Hu{nFh{t3;qv7^^q!l}0BiSxwVK%UpY1NMGUb>MMrehc>S-v`WbEIIUhhX^Hi^ldSl8Eo61}#f#E(M*J{z-Kz5-j`W zyw~T`*~N~P=PtR&CSleM#Le&7W*c3|n{>A%*L9(D0fOTcv1>!Uekl%mC59QBGH>Mc0+~Qo*`tZw{Q^zR$sc947n7y(d>J87(|Z1}Gv?nbM}UOfLP@A|Ir^Nn$z zyrL-io(n$R%eg1&C-w6H&5xUJOBL!|2fjO9N(rb7OuzWj{9ec%cdMMfQb(h+iUlIk zoALO4>@J_SIxW=CGS5uumR(0^} zxAo1aVmlLEPKzgJdX}nrM+IJ$6Bf@>V{c6j6Kz#Fv-{I)8;)d~+I%6=Vx4U=sHdUvgRT zCD;cd|AR>zinwStM{Jh&SzOlGuA?qqoxJ|z$Ib^@bT1pYYx>MlMp}7$_f_#2FXeMNqUKqLQPKVF0!U-6NmEAd z;sbtujk6Q8&Z$1%4!=2nd^N3pe1b!7DPNTi_hnO$RPPzP=$0K5qCGKSTQ_*ai1WUT zFh6sL?mpbToX#Z7cWrB39T>Q*PFiK*bx-f}VDIl;+pMMyknIwwa{|7h_))^tHaJ20 zCxx*fxw@1_xU0xcRA4l)0&<$|)99>)w*D9PYK@GiNwDbB*Ub6FiRUZLVRy7GNI_PF zr6-J6(V<$Uax)VCaf=niY}LSh;?iy99Y;p_N=mT+-mc)-g|5qmC1G|KNbHsOTK>@_ zJX_suBekBB?3vK~8Ly-wt{4Bo8D?FIru|h56gA!CiL)kJbTTycO?!mv;B%LB#SR&C z=c1Fp*5!{{YVAoFmMb~867b!3_ljFo>RnPKU7Yahcs61_GHbQr0;imLBi(ea4c$P6 z4xK5aVhiOnz!}TS^|+Dh{1Rmx9F3G(P#eZhpGVH(>VTV4K&oHI?_d06h&E;hW$}$w zsHi&IGr=B?SLkP%6YxI6o=qTzoC{1&RmSb7FF7D z?K>r17|(I!#w8=%!`q51dUvPyyadl;&2cjGMDc*!mt%1CQNRne$^Hzw*I2HTd?x|= zW54H_&y|BE)M&y63{0L^)VTe~0~4d#@li%5fabl8pLv-CSOV&)(Zg6n^7*?!tDqy6 zMwQY!n4+?}wKQx;l5kvJ`Y#3#dh#W5?Hg=kd9g3GvONNI*?O+ridb4og&uhkMlm8RH}U@g5P2lXd~%NPG$@(OoDTgdIPwwNvS za{T`Bv{glfGJGJqeQHra|WLjzVl-_U+O z%BQK3taah}`hM50SG&kSMo0!&+gX>i@-E48H=OST&yo9z?Vj?`RoQj3%-1pmEA1~U z{?Kb`H$R5fWo?bJ7No%~0;(gtRTg8&Yh**cJINYC#cnTGwy9P4TH4`n#A4h#iEYU) z>o4$t(n0Zx3>6(-?vLArnJMCAmK^KjJ+mJdb*A2&4V4L<;R@bZB5fzkzU|@#!*YB_ z!!ERDC8K*jXLc_~fex;@SWtAX%oi>87lm6Xw?vgw>9=qaTJ4Mb+o{99)$pQ!2(PRrRFiHJ#;_@I_B_Kn zRZR?>-94V`Pb|7^&gR8HiTBrEi{IlgbazLmFZoU|Y0ErGd)pVKRdTaGo_<9O&6N_g zQ)BD=F(dQXbj($jW~o!^(qYcuyCnt2o3Bf!;O=M`g*#T?QJrSZKP9Fj2Da;)G&n^c zHXAQrW6deIS6+hp^%;0|1FW2#IGy+Arnr2CN$Z=Y3_REwO-(F-vE3|Ng)>B#Lx1BRnZHSKv}wb!*g6WayK7 zG9qt$@t!2l^SW2om+Lhv8IJnJe3I2W8C?)lt5ZC#I3Q;<^e!Vg>dxa2v(&4|TRE&y zs@GwBZn$uI0KwYbSg+hxCrv27>c8@Lb^6sz963|O1nd-zdaBE}=%%<(^UPcDb3Fah zt}B(LMu)o{um@H-Rmr*({4mz+R08!wl*=#u_{4x+5R2r!M{se7hIcs)&5F8JhYVI8+!wY9XzRzQ z$vA!~*EuC(T6Jvba?YY#XHv#d6xuLk2D>5Hb+M(W0uZdbsW>M_X*B*SJi(fV`>bvh^e9FcUX0P6iMEgMGPSyF<7v$KDuZ_?3Z}$8AL-JXC z);(>tSc%XxX1wHjAmLJgik!7mai^Bm%5`&57toW_JQk7~c4sj$9rL{j8nw#D*rjSr z{h-31z8SS8MTO0~b;hdAeLeIJ)S|ucYTAyd$wxQlK2Q(*iqU-R7i#@{M5=zANO>uD zCihl%?z=a}&hY3cYShWY)1dJL`)b-onV`Wm(zD=K11vLhwb0YV+nknwis$1J{m$Cl z9<@Jm(c5|t?$guTYpF9gLhmfXJCFIb%({?u)jfnkrP!|4jqx2(`C4e}nX4%Z_j zsW!T67Nd7jF$8PAjP8$%zt|X-d3);?=ixivg8n5n%IqT_RX8TD%SWW1x#!|2Bdj;G zLXipc6jOsQH{qMcHo01WdfP97G|&(79#>jBR!pzO!)*U{@>!iFN+*8N&GYmQhY3Lu z9yW^no0ON+1KB;{tM0}`savOW`9(e~G$q1o$)B7Yx8lh0@s@qQdPW6>mdB^ycINnW zOManvDMIm73+-gFq3A9iX0cQN?XXKed4`E#)@ia2ho3Rr` zu0B6!ukk-O5U|1tV|Sy+UITNexF=4=+`zfI+m(=`vbyP*@(&KOp^+_Y9G9B>PSzE& z$e5hCi{e2xUx*H(7H)l$oxAMRlDe1ci{e*Td0X$e6D_2vhf%LhSbuWTXApVt-}juh zkXI4e5N!4idF$q5Q}Sph1HP@?4I1-hrRF;M^w@wh zF7j%~Qy*(S>LU}St$zFfb^I!nh#!TVfyb8_V)zor%Z(uiB$?YRRyK>Vbrsn0!rn9H z!hRW{->}Eb7Dz_vpX%di(!McF!Rp=ScJttCuR*qxe!Ovyxm7ntJ^E3Y6mk$oc}lKr zvA3SXeLm;QJ8+e?HFde3&i3Am^jE^81jd6Zt@8tRa_iml_6gJb{~#OnpMu)T%}!Oo zQG?Qo~BC^z!!ywdP0s@UOfc$7t5EZ5Ax6TfP*ME^~klSewE{M zRj$s~AlAViX+bhWR7~j3h0aSMvk-FVkN$I&kL?pOrG2A`-LaF?(51f{y9oLo2tQ(Cyidwd6+1Sf$*sKA5g+^&#GLhtd-c=lhZ|E0F|&H1Qo zkmR?jyFqgWPAZ7p=lR3`wAuTcrkAF$%?_G~4B45;YqDZ|)j>B^Z< zq3h-mtTult z%Jrc!bV(eSteg$^SPK97OjaFn+La1D>IMAD161gH%@R{@!n@7cLVU`As6zWvySO=@ zb>1;ikVa~x7W(KZnpnx-f|1er0>)O1iw)acJ}j23W|Sk4m>wf_mP8r3vCFnx&%n}3CUIBP6m&{V@t(CUoD_5=+JgNCHcHgX+#eBYC1UAOVxG{s9BTArmgq1h~ zgrT`2kWh!9WwSiGu@wV;hSqB415%@)#OeHp64y7kRdLToj=E{e2~Opp44L465VNUe z+LPBC@o5zFBSWH$mrp|m{$u@b-jIL82zbN5lrBDByqbntx5?4e+cMIHA+Y1-H+QJ< zqt!C6guQC(HmMc3Ly+N#AU^_qI8%y9ISdNqqIma^L_GKABe)Dqu&y-~rriwox6)L_ zrY_$>Rs`mJDZI^(GnQ5Qc`kJ%p%Ea{j-rWzLnvMVG4+vw-A;_NfimxSCHJPSF2Cli zy`j`Bwe?I-q22YZ=QBft7IQYI?Lp}xHtpEyTKlTyk$0N2`i^flmSIA|c?%iJHH*Jk zd>h*4v0m;YN`n)s9|&R^mD*vf=J|9d!dE*6t-YfL!XpBuo(3rKU7$w-e(`(FnVX*v zp+=Pj>M9c1P_Z1iPuGh!V$&zSTKJjEXtp=lDK!I*f|;o(Gz}iwEw>ik=?g7I0%>1o zlLp-9W^?Ae5-c*OG*gtoGXS=hJ~BvB9P#-TndowaTQ*UsXBj5&K}Rx1J)vTu4$XOD z)=AMKwCgFTaqe*jW0!>k@vC*a(UBYzFX>^L%0WfG^DBnqphQ20xu9?qu#vpmTDwm- z=Jv^MIach~EZCdhBnj1u5?caS81hS_Zg(Pw1((K7*}eQHL6ap@Sw zy|D^ysj@Am>qg3AFg$lZEp~4!zbjy{H9d~0w|y<=0qe87A2!0MCagxkvDrVBK4)89 zQ9ku^45+m!J*YM+yhJ;uhJxqVGw-uXd`Y2uU+=ptF}J=9 zL)C@Ii7KNS^@|#Z^UZPyC*(z|J8@b$ehz4AKCF!>bu>3SJ5g3Ul&YVfj2Jj z$^CNurDuYmRa>!sW4pQWEwdLN+(TgNiG}*(Fe%YBJTISfl#wy;e)YPO{2>4SJ+Nh6y$#Z!42v_t@S7Gz|iuP76o2Ii6cnKPO? z(FI!Q&_%b0Yp!(FBSxOAWA@*v3zR(J|o~X z)irAJqt*}tW)Vof)ugG-@_P7loMK<`*m|w7_=p0_>y;e5=%&tIM}KK0-0ex~&f(IB zj5^P~pr$d{#U*7%1!*&Xx2=c9%z0lH@Um!5l##xp=RskySiI#DT+TTw8G6&)N+LUy27$1K9f!{}4h&UIp;` zH4>Os^STHEYNAhO9J6<6(duDUoR==hRq=%|G_iKWTeI_Sb?Tk#$ zf$jqWt@HleQAA7!cOT2ccFYgWBNP<*R3OrUM9mojH}8cuQDzPtjMN0aM3t5z^%N%A zi2*6B%`*vi;wHy>$Q`M8HyrtMyumL45k%5E`R+b9&!1o+tg<0iD5*#QVGo>A7aPjU zo*uPO^8M)60r)%za$_$|O72%ho~kf;h82db^=tIwF#9Tj-)1*@IIN(?VX?XsIHYT$ zR`e%r7N1#6C{LNs<j-kd?YmEezl%RiljsCTj1D&@2#&p6uf^)Lhq};P ze?o6XrF|Vr8d#qNpW9+$p@7rIyMjx^3Sg8v_Qx_Fz$q$jHm!o!tv6@imJmggaMi^f zznS&Y6T0}+@`31C6P2i`%6XVd&HDsG^kp^MU1PzLLl@1cwUI8AKk}yB+VbM=wi$%dV3gjeBMXon-(bTi4>V7}GsBGlL{QZt9 zf@?gt4mBtr+Wko-Df;GD=jUF5yKMW8@}~b)Fr4~P;_8t5qFQ7pokbgJ^X6P*dr7fr zzt`~Jjrcz(X@|^(8Pe`Vf?`tU`Y99}Dtcj#RIF+H<-q1OJ0#W-q)S@w^Gvf=(*OuY|py)cUVZ z%Xg7Gk)TiRvvA&}$Tx5N3f8>MtuLbgMl)ifF)sp-jDe2Xe%x&m1CYlDp?H*xBs>E} zhuH?j<=Jxxq{!y$UO_4KJ1b>ddK;ASYB&D6ZkKBOarv5x;6#_s>*H?fnYSgTy&PPI zJ*pG9U;lwTULVr3S}#R4gI29EsK3MPID*9oK2cDd=i&mKtNQOoTMY`YO(MYmwiE%Y zdiE^HAA%nM&-r~?b?d5*?h7F|kp>xsV~d8fgJ=5ZhvyD0Nyz=9Ie1kGk#)1YH#bJdr$y*i_iM^0nbhu&g_QmA*&Ap*x zOsEj1hN{Qf^r+bQ803xU=M%KMvoDj@dg-c&L;t(u>hBtu-tk*;ei1Ivm`cKPRQl!e zbX7=O^CaqvY3kT{=n-Xr|7YNZ)#5+#& zCH};8Rf`%?WFKiA*kD3)J54&Ij#Wt>o)LIgdB&ECaYefPLxxyl2wM|Ix*b+g#V zqUA4BZzXk3&;Iatp90N4Sd3%nV>fRZol2-bc-FKVCYEtU>|ZHcr5lU0@^ari`u}dN z|E4PMd#+OdHYz&={cf!!D8k>A#SH3OyL*5VMawNMx)O3fYP(N8Pv>>14E4BR;(1hk zYwDKTWo3Q|9EX+Yx#!KD6V&LHTPK7Y+NMs|<_+|FE)`NUT(`{|{2z8h7<6hTPz&R9 z6cqYbS-7AY)yG)(V6 z^#AZBpqR@U^L&#s&!v5}tM2**C3b-1N5-;?{}7Aut4k%-YsEk2a&&5{&%h~XCHL`8 z)im`o4_gp=`UtbHJQBDyTB1zFOQs&`ZLU90$9U=D>gK(T9iNv6Mvb?=z?i`YK`0y^Ep%Wa8{$nza5x>@^k1LXNkD@b(9q zw;WaVNaw|jJa?%@yqxaXX4;}nF!A=-av`_rDrTwRv|sOjHBud%WPLd}3PSrp#TzHt zCsdUaCN~qZ6D`Z_i4}S=ErFH?AZ7uTtGYkMBzR_UTt4+fV|5{k`=Wn`~b z*;ZuS?n>Y5h3}Hu&%4-_P~IN_$L5@>d1-6Zyn*Fzl{k5w+dC>20&sSn7v9wsih2CC z^Ne`i(%UPMpm_%iq~*lmJM|%#aQlt< zz}|I?E4o?^_*(X8K4w|FhQT;&#y2gyRt+G@U#!sI|=lPm0~S7J2|a>%w-nVcEN+E5F&RIjicvk2`Db8rt$vc z7|~rX>$WHjeIN-TZB#!VOF)eZJp~R&si-gJUE|}_KG)qU1pdVFgmm7|vi7h_dqm(* zEnR#1VIyX)%Dw9K=-;)}Q)7rob>*hPx!x~RPE?3}m_mq(TuyiY_2HVK(P`01UC@Ut zb#(xM5k=thRmAif+eesCqs_6^j_>hhZC5!r;`Rp)lv2G~<2%-&`^!DLx!uuFA#&sB zXC1y?o00?I8?F@gx!Tc@(kE`!7NgHBN_%Y6ER^AU4 z(g;_1x8?fmbpz!Dp1QEBIJ+yNbTGsDJ~V6d={(!g#2iebQV^NTi#IB&dKi0gA zY&-NjndH-1`v}mgey#wbJhJp?JJ`%6(ByommRdx<0i@9FX@S+6*(XsPz8U z=F;sy>vo!mn;VKEreg{REizr9yQlYMQAr#<-F1Mf{-XZ$mI}}2&h4kD_XY0(c(SFN zfa*j#=Nz5IJWMS!R=ZWsCeWqGuD^Sub#`QJG75cG`%3H zPG+*;&jX%xiW{i(87B>7|6g8wxJzX8FJg}2jtBebaYrS|@xBFNdHm9>;gi&*^XD}v zqvW!9_uM9F?&3&ex1>k$=6EJld3DxGB+i`Mx#6B|&u}XF2S_xA^l~Z7a zZ}LW_%Nw;j6Q*Q*I)PVvvhpixDYNH5JY zg9tuq=BJ=&%F(jt%mIbQFU!s4PDMru7*+kx_nO0}Du60CBVo;(sDjuh{M)MU3e+vY z!-fRNqOE_WCge)lcexp0`=unkH|{sHnff4d9n*z>`X#1r(0uT%%BF3c*Vh2tZq?zddOuky)yGag#63cTvpx7j5H9!*%iOU`tBuEv zFba|N>?cHW`?QM$edM0EDV+Kcx1YIkQqYyMS3Z}IO8wNShkTD8_H>D`qtFR~#);?0 zOpQogWlKas8-97Ju_*0wKkunZY9I#O$S#U)f-nIVoJi%(uuZ4n@W512)VzJ4$5SJP zgo~;|c7V+^*`%AouG8`xFHMJl42DN1e@S_63 z#qOdN-Oq|lx7;!rQ0S|DK(V*mxOt5dTt#FM(N6xG*Ghj=HmUr#l?KcE(y~_wYf;!( zVPc7pRTP7hH1t{)yahbhx)X`Y^c+=# z;rYkLkgrNUrQBEq^Bz78OAF?X)ZirE)t~_&lRXl%W_aogrWMki=4Wc@ygdv5OT>FY zW{o6_ejWWsCVQYE{9DMgg72^>JRH(`@y_=fa<-R6rjAjbQr1Srdh}1(U&T zuWAf?e1Wn4=AKXJiB-z$=hQ7+Ns8|qn|xK~k9O#aExs!9Oklf)8&CG^$6QfA{`f-^ zX|oDn>X*d@~VDL0VGwXBKA9Q-N7xMv->9auUeRBS$M~p-_JR z(q80_Ve#2=*c$CM5}vh@EF;1lch@6UI3d|fpy^MMyMP%vFeMc2dQ`)@ocD&bvDH>v z%z}a&WFfv@NbBy;O~RCU?FJ+89xibU`^Tz1q2>;t*v*=~<0yU4y_LjU(wqr91#X?t z%(N-&mGmA*nwNE3O}lBKB`%X zSke9xK+Eb=y19*?@`@=hw=wEusLf*EtQ6J_MA7Yh4aF6Iq~;pi{KNhI0EE!F_h}PQ zEh2t+OdM2yK`TDi>Z9k6KsxP?&Z(4iTjqX@`Z=l7Fz>7jpUnycpJAH>n^zfOvY$GD zB#ist?tHjbo=9JPKx_S#ChcuUl7c@CVdv|6E7;^xFEYHC*!e)jND9^!7x4QV~-Y%bcjU@u;eZ#|0Y#7ppP+ zkyuqY^LDR?`r-}0Hn^M{Uz)Ay&IFUVHF?r*a(y77Y1oUE(v}+pCrxQdk!RgZg7b7{ z{ao6a5c zSsS)rs6iBkhg*kt=d&S>khxnx6TR~J4yRn=mbXs=<=U3ieJP=pnP1$ghHSCT>hkdFs)@X$;}QWfB2HbFeOl@bk1s9z;^lF$5~|XdPlkh{=}eW#{p%<9H+o;}S70O?ogi?I-%CEA#Kh4*!D2`+=>$TP%5|mrK^?n=w?BpJ3 zy;R(a?(_h42hKUwFWp_gt65VTsBLfBqZDopPV0+hWxmo8x*|HRU2lOVz_Xh^-)kbN z8QI^pkG06Z;KVD3R^%Lg(0zRDw5WT(!Tg?w7IojMU~7)d#ky|R6fC@BMn`>yZhdA> z?$=lVVv2D;{^mcpLGp-A@roP(mC)a&1Di~YqJ}HyW1;?>37IK;exq#qFz7w--U{u^ zi1`~v?@4H_I#B{j(wFN5_Z1O`!jd9u+x4nqZQS^2mSX1a{%oc~FfW@-G~=7AB116+?-@=#+b#G;6h02#xe zac^f#ZQ@d762w4PGHMvti`D`qqOEOAl}en2evXbw#@AXma=}UaQI zJ$XiL($kWpcr~I-t+O?hZ7?a7nWyN!mqybhIxBuX<#Wr-`Uu^GD1;>0i>J3!M(}rDK1}{yoz!_@fKDUeISdRpO;O1q9XtMdO+TdUDf%K4_=iE46nPXdPNR<-G4UF{M;UMb>@@%TufvKT!;R~p?^3%q{=!(FI+r`*j7NVp=PHTSQ@3T9{>D`AESS|D>$kEGRVb|c9XX(1d-7~0uH^(`Z|6#lz_?2QWsB1-^ z;b*xIepWKZHp>AQAy_bB(nw~_yQpsqX{`Bg%I?d6xh~ubiU;?}CfHZ# zxqSYaF2TA8i!qFLXXwK!F9;XJa9xQw7LOw7M&@HGys%u2%0lQ>9YXxhX!edHJi|%q zuXa2pdOw$W`GP($!NtP0{G>tY7a25P$<=RcJUMC8Q>XpM?Z4||=o&oZE|pAJ7E-Cz zdr0psfJV6vQ72)x*=no*WypshS8bj)GIv9(j6UWB78P->$@1|&UM&6L*heHU5ojRC65NHMoFo5f&56k)Ps9V765%28MKMvT1U;R{jSmYGVTBtnKU%y$z2(XaBVH!Xz%IGb@mbl35!IFx7>OBV;lBxbIh9-lOL%(1k2> zK)48s7nVo^lc$65b`)r5D~NXX1SF0^RhWu22ke3`x9!{kms)x(wGmeM)bdRmc_T_S z1X5i~cvDntwJ>gPKiU$+$@Q-&Hc<}Der&xyN`Fx*Bc$6E; zHd8!mae=$*+yEjUJtv57Ie@0MO4-EHd;-1;nPsferV6Qoqfa)gxWcxkjy5ec@%#xU z6uPHT3q86c+F4*KgWDIc7i6*mwAizvM1lMg=6$hqat*NAl0lKi_xomH6__Z!XEBj{ zQ<1$*enSdeYD**!>9B!r55iJQM{{9c2^cB=6xFWd2u3waTjQeL4npTY%MgzkbJj^t z@aR824k^p*gi*r1KK1(X=sA4`6tma87!3d;?xGQ!NQAtc>Q!l}vY4bYs#{#cjVQB~ zlv#vm2o?rqt#-53Z-_rFj{&DUM@4RyKt=w&s{=?02PCxbb9N_%P!-UHU`yFVV#p%v zAHH2F&Ipr&D5nLlUpk)Fumv?IKBKcQV@b}PC<7bX8Ne;`GKvK+T5!nu))1J z?i|q4?C!n;Kizen#1ceDb7&#@2Mqk0FBH(YUM(Pu*oElbpFX;zL51Ebzh^_$bhMf4 z0paP~mETG12Ta>m{=zQCQFmeE_0T@~J&+I6IB}SUy@c}@SQ8M7|Ep&Gm*7ZXKB|;5 zR1MC6F_oFIcQvi{|9>iOOaUnX6vmg}ls&0Fv4euCBVQ8nrbM)yA=3^y*xfrIGKgMn zg(QG4{=K(hugz;thZ9zYh82C0Lpg`l$`^Ke#8Ao=Ql%&vD2wr)W#4JMuDVzE_iNbHrUwKg@aHZ##ay$NC(39R|f9JsI`x-j30M zLvMA9kPSftBNWgoyHXYkfM09v5=gX^?Q|UYr4(h%p`dg9PL#SUaD45dPYg#k-f}=y z5Du`MHuI>0#xTvBhD*s`eTQf#m?Qgj^!3A53R>!1+`3^+g2iu$2~-F(85c+*GMPFA z_zJ$BnY;Y*%X5p1cCDThdAIo=@*EQDlQTKsTem2H(x%TaEB0bV@zzyN>qnm3xYnMH zo8=cBFmVnULr3@XD*`3t%=v3fu^^mZC1bBel3;_Ob4Aq`nP#S3NbOo&%^Hi`$&HB8i#j%G9%kjMAL(|@#M*) zoNZuWPzEj! z6f$kH2W$a@RY%Jq2~J=U1u)c69mm?CwG_gKkIeCgSOzu^xGV(e`PD<^h`W9^)*PA zkhC^>6Vn_QaIsU=RoMeWta!hNcjnqUQPvNiW#p?IsMuUiZ-?TfjfqXKn;t!c>Mmpc z5XzJ2GFAXQPj8>wlIDs_;&JK!5qyK&537%)(7z^VC?syB*zq9T-!2dewHFgAFSnq& zlc{(3gDa_O7SQAd-`ruH2`!!vuth?WS#Rmp*{r(FWnNGJS8h>fvM{#rW-RKX1p*sc z;Lz?Qq>HoZg8h%t7_tB5!t14(8%M6o%~fyt!8M=zRr$ysCfjS5xJmZDp-4_}TQFZ7a{!!VNFz%>j=zREP#3*Kf!<(c=fBZl|7I~z+tM=R+$@b}kZW`(h-ofon9*rfB5}L)fU1t9pk3ib&vhbFRiTH&Cm+0R!r4d+)1puzsbjS!h0n%=mif_(uZ!8Ic$n zvQ8H?HI{N?<|0Jc)gyiqK7iM{vfsOO>i1SF=pMy0+v3Ta{`P_AfIhv$vL9Qr!Gk6b zmd2tBCnCnO50gzPUypVawaB0gyq+s|(S>ELo|O|_j3XrKcBU8J3X%7gX^IF@CbEuv4Qxd?(iW+(R=zg_DEHZ85cX}r zww&$t%>Ce|>Eow`kULCl)h#<9Q;YoY;h!>L?@y|aE>yS>(BrSMV$A7qMb0WMoToY< z3C*bCi!ZQt{7%0JZ;WynR#a}5VvybN!+&S&>Z)C_Fdmjce;Uf^4Ns4f+85Bb%HFrp zYKdX_pVS?EvN$re2}uBLw^H8LZyTt7eD0zwywgF$O^=>}SN43HGAD0c%wIb08L*=v z_ZEi6w;+|K(|V~&UzJf`ordlUDXH9(Rs~K*4gfJ|722~t-aWEe9up_NWl-)U z@+T3;`?5rpS+hk^Wr5kMZBM+TD(s=%{cqrG*r%)4^4DOT}?n_cs z+__-%gYnlmWBECabc*lyjQro`<^30M=WRk2|#TJ7i)H>thI)) zxEeorgW%M`ok0kg0hfY4+&$I~)aHHB#mtpg+-ja&c=xLeavURnz!~g#jg@XFdnJ8tLEgNDMDwRACZ`{#sg?}4aSVdTPlfJbV*@@ODr*PA8Lr8sO!R9Z1h=q-!CK>6v665ckp++AL3;?GfY@9#zI;y!LkD9mzNg2^q zep=kUnDj7gRw*y!G)7KD&3}5$*$CFrMeu3AdDT}O#&5-!3!8$;J-@zfq?x5wT7GMi z_=jBlFY749wd2U`Y0Bih1TNyJ8-?H^wt!)}e!OuPM@}MmWa-Ri#ci`0;I)rIGB0&I z(dMpG*M7u%D>d&%)*I9n+`6k9$&8BSr$ncd+pl#c>1Tgf6;dev=bkK>GX!_0>-=R3 z$v}2s7~R?<`n~m|tl@JZ{pl{ZN>e1mBcBEFkfzty)Lg5{C?_-J`;Wb3x@{A%r{r+9= zVw>SBM}{eZ`Lc*H%;I>5A~*yW2nqY_*)0;uD1R zMavv6DpMZLTS=JCUIDjsYO35tw=@#irwP0B?pck{T&~mN8ESltnC~?k_PorhvQUV8 zE!YzCMGI{W3-6_Ce%k?!K+*TAPR^d`xJwq_tcWrL4)usZ3Bw3j>VZZG``YiaBykbI zEQm;c%3%IvOTjTFq+@!jMr6=$y&CVwc8!mw}^0KUu_Gx8>uAgS|CD6z?^FzMg+t;0+qMAg zv5m#bQn>ms&g60hg|cc0ysP#lVpGI6a?pbojOn_A%aQ*KFJVz4z}e-I_?#x$}LONCaa z!uM$g2>9k(Kf9NwPieZC~tn_m0e zyDyqiJ(GA}R625Vw;u5pH~}%5PnO+Iiu0t9W5(rSa~l)?XCpp;J*Zl8yXTmp!FAs| z2cb73#C2cV^aTGtXk=%~cL#beU7c=NZbqyyW4mx9EG<42UOZ93>x;jqUib5^(fe|= z7T}qDexKlA!7Ovd$OK6YiL!n=`?O-{UER0S8Q+?-zn^lv3tN(=E6P@f)P|jE|AxI; zg_U>S{@DeSFXA0ZNsfO%5ZeQ0e7ks6dRRlq+j;10hG)sIWA5NH7FCw!h5Qq{wTYaj zLH#&-CC&~Os_=oH+%qEX)zcian3D2Af1uyZ$^M@emP9N-oTPt29JAWIJroX|3@(7Ck+sDaDx zt)dJ%Dk2~)@H(&9^yIbA$KSJ|7=)iDWePD^ik9_8&8w+!=4>5%UjXz*E3k%ABW#}* zr!rjGKx~bf41WJ^+xno`D&pj{WR(ZoR{{EN$CzaZU0~R(*4$w5SLo_{h`!`PvVk)KILGG?uheC58v*5o^)|EZc8BizhBy4Dn?8)nT0<=3m6Wo+KYi$vsWQu-Y>;ZAFWcY2g}}=yGNwU>Q+m~#N6R!Bk=8|2MjLYM|`m?gI=$C z3-}5Yz)s<*)1nn#rxvpNFOY<#vv}n{f7XWeB@>r;qiyNjbLQmAwnn!XV2vW6=IqYj z3wnJv2wQp!9%mg)76y=-TaP5Yyv3;>(4zl10wK+0Kl!Dd@{m?wMC%4NnC*=c*Lb=o zLQ*o_IT-SoU3Q>i;cm4DeVLSdQ7<+I2@hZYEve;gZEj`Nm+X{aTAM@Yq60{kbv??u zieyPpE3gODllj(|TD#osEzA>CAGTrlPA~gIViUPzqYFE|NJXoT9zqV!ufR6gqM3Fj zi?^v)`MlGp4j=bul z0o!ck_$YFFAyywkTh)lJh3xztVm$EMv{D&fo+7v}A85&{;zhTyC)|~ZIi4m^PyC7T zOMc^BV0m*>yTv&Kz$TPGf$1ri1Y7f1!-+FraA^jq)Q)?4gAa1zNHEfP`tpn+M3o0svi7l?+5C1LsT$Z zvAJXQ8((NO6RofMlZ*8r2ckYDJ9BI#G+N$S4-7@w-$H#wf*!M1yH_n}r8`Od!7#|9 z-*%ml+iJehuZV~4t~a+6>}EH=v8q~U^VWSPBe%NZmm>Fg^Wk;&mkdE)>Rs_HcSYS2 z=$~l#>5S~i@)&4)t;CfQVDs>qtzvtrS0A|=LQM4I(B{*U0ULSGnZNax|FF%&&+VXu z&|$e1u#g#y2Pu~!4}RJP_CzX9#x%p6`~Ubl?|7>F|Noy$Lun`_C8J?SO7={N5V8_k z71=9$S4t_P%*-QugtE6Z2-!OsSqI06W1Yise$V%z>+18pKA)d|uj|%1=RID}*X#Lw zJnj#wwMok69C-O$&BVfg)w}|={FCLPK!hY&UyATI6A_V#{o*pnS^ue);7jsoGT3BV z!$$}pvYw5$oeyxVihSS`m!Erw-C(QuoW`cr653}C+OvHR-_MEaiPK zP4mtKcaqZe^(1X7)s~ZC!R2b2Oq$aZ4bNC-`J#Ta=(GypubvR8nWR?dQ{}}K{x5Xn zJfN2gbAQK-t*kXU^Oq3~IW1Or6{1Mb45nxF@d6&iwvqCzR<2T#4KT2Wc zWKC?$ehkZ;Djuh{q>}bcU)uVzS2!EdPys7SykowW*884fM#-=)FO&IJ?^>g>YA)jr zGlr)mCroDrb##Exmd+1j_Vk(}G6+U}a7|tfpe1|oK7`Q}`nC;7zH*s(?aY2I7?tNb z5WM#K3Kd}^FTSoPW#)p7x=u?HqrG5;{8%>6IbM#}`Zni!txIm;hzMLXS1j~rmTyv4 zT7D2o>P>}*zTM+s<1pByCvz)Rikp>tnP9)f{[YRGava~CQ`0J#idFCTB7Mm6Cy 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 b46BggvoE43D^m*Khv?fQGX5 diff --git a/.template.config/ide.host.json b/.template.config/ide.host.json deleted file mode 100644 index c98f871c6d..0000000000 --- a/.template.config/ide.host.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "$schema": "http://json.schemastore.org/vs-2017.3.host", - "order": 0, - "icon": "icon.png" -} \ No newline at end of file diff --git a/.template.config/template.json b/.template.config/template.json deleted file mode 100644 index a5415e836e..0000000000 --- a/.template.config/template.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "$schema": "http://json.schemastore.org/template", - "author": "Mukesh Murugan", - "classifications": [ - "WebAPI", - "Clean Architecture", - "Boilerplate", - "ASP.NET Core", - "Starter Kit", - "Cloud", - "Web" - ], - "tags": { - "language": "C#", - "type": "project" - }, - "identity": "FullStackHero.NET.StarterKit", - "name": "FullStackHero .NET Starter Kit", - "description": "The best way to start a full-stack .NET 9 Web App.", - "shortName": "fsh", - "sourceName": "FSH.Starter", - "preferNameDirectory": true, - "sources": [ - { - "source": "./", - "target": "./", - "exclude": [ - ".template.config/**", - ".idea/**", - ".vscode/**", - ".vs/**", - ".github/**", - "templates/**/*", - "**/*.filelist", - "**/*.user", - "**/images", - "**/*.lock.json", - "*.nuspec" - ], - "rename": { - "README-template.md": "README.md" - } - } - ], - "primaryOutputs": [ - { - "path": "./src" - } - ], - "postActions": [ - { - "description": "restore webapi project dependencies", - "manualInstructions": [ - { - "text": "Run 'dotnet restore'" - } - ], - "actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025", - "continueOnError": false - } - ] -} \ No newline at end of file diff --git a/FSH.StarterKit.nuspec b/FSH.StarterKit.nuspec deleted file mode 100644 index a96e4b69f1..0000000000 --- a/FSH.StarterKit.nuspec +++ /dev/null @@ -1,24 +0,0 @@ - - - - FullStackHero.NET.StarterKit - FullStackHero .NET Starter Kit - 2.0.4-rc - Mukesh Murugan - The best way to start a full-stack Multi-tenant .NET 9 Web App. - en-US - ./content/LICENSE - 2024 - ./content/README.md - https://fullstackhero.net/dotnet-starter-kit/general/getting-started/ - - - - - cleanarchitecture clean architecture WebAPI mukesh codewithmukesh fullstackhero solution csharp - ./content/icon.png - - - - - \ No newline at end of file diff --git a/README-template.md b/README-template.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/README.md b/README.md deleted file mode 100644 index 7682ba1331..0000000000 --- a/README.md +++ /dev/null @@ -1,95 +0,0 @@ -# FullStackHero .NET 9 Starter Kit 🚀 - -> With ASP.NET Core Web API & Blazor Client - -FullStackHero .NET Starter Kit is a starting point for your next `.NET 9 Clean Architecture` Solution that incorporates the most essential packages and features your projects will ever need including out-of-the-box Multi-Tenancy support. This project can save well over 200+ hours of development time for your team. - -![FullStackHero .NET Starter Kit](./assets/fullstackhero-dotnet-starter-kit.png) - -# Important - -This project is currently work in progress. The NuGet package is not yet available for v2. For now, you can fork this repository to try it out. [Follow @iammukeshm on X](https://x.com/iammukeshm) for project related updates. - -# Quick Start Guide - -As the project is still in beta, the NuGet packages are not yet available. You can try out the project by pulling the code directly from this repository. - -Prerequisites: - -- .NET 9 SDK installed. -- Visual Studio IDE. -- Docker Desktop. -- PostgreSQL instance running on your machine or docker container. - -Please follow the below instructions. - -1. Fork this repository to your local. -2. Open up the `./src/FSH.Starter.sln`. -3. This would up the FSH Starter solution which has 3 main components. - 1. Aspire Dashboard (set as the default project) - 2. Web API - 3. Blazor -4. Now we will have to set the connection string for the API. Navigate to `./src/api/server/appsettings.Development.json` and change the `ConnectionString` under `DatabaseOptions`. Save it. -5. Once that is done, run the application via Visual Studio, with Aspire as the default project. This will open up Aspire Dashboard at `https://localhost:7200/`. -6. API will be running at `https://localhost:7000/swagger/index.html`. -7. Blazor will be running at `https://localhost:7100/`. - -# 🔎 The Project - -# ✨ Technologies - -- .NET 9 -- Entity Framework Core 9 -- Blazor -- MediatR -- PostgreSQL -- Redis -- FluentValidation - -# 👨‍🚀 Architecture - -# 📬 Service Endpoints - -| Endpoint | Method | Description | -| -------- | ------ | ---------------- | -| `/token` | POST | Generates Token. | - -# 🧪 Running Locally - -# 🐳 Docker Support - -# ☁️ Deploying to AWS - -# 🤝 Contributing - -# 🍕 Community - -Thanks to the community who contribute to this repository! [Submit your PR and join the elite list!](CONTRIBUTING.md) - -[![FullStackHero .NET Starter Kit Contributors](https://contrib.rocks/image?repo=fullstackhero/dotnet-starter-kit "FullStackHero .NET Starter Kit Contributors")](https://github.com/fullstackhero/dotnet-starter-kit/graphs/contributors) - -# 📝 Notes - -## Add Migrations - -Navigate to `./api/server` and run the following EF CLI commands. - -```bash -dotnet ef migrations add "Add Identity Schema" --project .././migrations/postgresql/ --context IdentityDbContext -o Identity -dotnet ef migrations add "Add Tenant Schema" --project .././migrations/postgresql/ --context TenantDbContext -o Tenant -dotnet ef migrations add "Add Todo Schema" --project .././migrations/postgresql/ --context TodoDbContext -o Todo -dotnet ef migrations add "Add Catalog Schema" --project .././migrations/postgresql/ --context CatalogDbContext -o Catalog -``` - -## What's Pending? - -- Few Identity Endpoints -- Blazor Client -- File Storage Service -- NuGet Generation Pipeline -- Source Code Generation -- Searching / Sorting - -# ⚖️ LICENSE - -MIT © [fullstackhero](LICENSE) diff --git a/assets/fullstackhero-dotnet-starter-kit.png b/assets/fullstackhero-dotnet-starter-kit.png deleted file mode 100644 index d5ac1f26ff16c7f2bde5af76b6b291a20277f240..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103945 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

RCtiKmDlkW^IbqT)pSDH;-OEMKlCOPx ziZpg5ASkG9P~)J|p=j;m>q~YtFjd{=o=z*7bqp`@$9E~)JDr4-`p<=HOZ$8-r2X9* zu)gw)u?1dZ01(gx@`f`u#MW(`Q=!}6X;r#2wgOI-{=8<8#Kl>>dj#DMFlmaQk2A{v z$T|S7ce^PG3p(fo;9}?tF?nRV6{FDP zZL}3|3xT|Azlr@-Uju2OKX0MI;)3kMJU|>QV?mZ(h%^P|?&Y{>iUiOMfDilwo=uDM zXS-t#AZKR^t|>+W&T#y@cgIaV7S2JF=A)j}4lq{iqCX6|7&#fdLcdzXr& z7^|NSM)1h0IQ2h9>RuoQ2enb%liI}g^OMAo@d-1%WN-9k`_Q4fAtpTgy+^W>{0+eQ zbbevsOSL!1+W_LFGcx-qKz`ngn%dgh z=x9z0MzFLjfH1w5Ech*kN-RxWhb#fQ>G~I`0iIkSJ1;>u`lm8ooYtM)!fZ3#CLC~f zs*XRgLnBeHuh1nIul$udpm7vyQp(<&RMLE?_x&J$xc+Tc_4>|=|4-WnX2zEvCe3zp zg$vcDYDL}=-%campn;0={Y_79Al}{P&}Dy)6U_gf6m_OU&yn|K1!2)ZwP{#~l| zGe)xJWXlNf+sj|CuQehe^u&VaQ3 z0+^;!z{Z4Z99R?o=-vRx-woj@ldd}N08sl40E4Y$P6Jli_{6|XU|!M=VEh53D_QN0 z(nI>>L4_4HWdgj{(W&^{W)@LTnM42K?_;Ed_#A4wTAKPX3|~@|-t{hQXH_lG}p?;hwkh-I9!*2Ig0M;$Y=fC4fvoZuQ$^ulRv( z%rmKs{Kl-51OS>Zz@ESONqgkl!9Fl&b2G7Kvp~`O0UHP!P2VAKlZh!4Ck{9n;EX5s zICw7G;eN(!EaB2 zQ~&7@;sGX*{JUw%Z|#Ygk5G=7@aTdG4(ws0y1iy)ycX}LJ_bN!0MIRZ(te^#iR=Yf zqi9%0pCeGH=(VYkiziy8pgk~SJkL}*_%OqMqU54!}MI9t>-& z4uC!r1E4cRe0?`Wf-e~o2Ud9&fOww*V4b*GT@u7AA0Icp19++sZ3`%nR)7}ywb3dn zBs6W%VBzgsx5MWV6}EF%{MF(;7SSl(-|o%uX>vJV19ynL9BJP)Yrt$FZBJyU;~+62 zkNWj7e*{CpBKFNg@Sa+idG%(qd!PnA*wX;>Ivi;Au(_DlBtGG*LLBX#)QFint9N1t ztWF{|3|@pn|LqB>eHU&1@cowzT@T8ZxUM|2!>*1da`q(F=x-ZBFzT+#wX)wfz@9+F zLm+SS{QSyp@V+C}^7}eX!^T1{SSgQz&Tvywai5}+0*ThEqTg0O23wVlt*y*G*5e&B zFCY*;(B%W8l0rhnugDMSa`Jv&U!#zEiyFCg80q-XziP@t4Mu_IW5h^l$jjyV<1Z(A z=H%}5Wq!7ytUtMf!AqIjQlVYW^bcEDyY-pK-QQu4*2C|ZHddeoeKCGnJHIMiF;BNcmI3xGl;;f z?z56tZZ}x;NpKsSU_^y8$Gjd2eO_DkXX{Mr0_NE>DbY8+(!at+U_TYYLzu=h$T`;) zzl8))qrctxz81D9$yUQ4Ho*U`;ihO@kKV-Hs#N7K*q?2k$NIAOYzZtkMfqe{iiBH+ zpM2->0`D2JTEA*^=u$*G7(-@|C)`$w`7(@}qVe98r2({TO=}|#qP5Eo9twgxcV+gS z>w;D{4T#|DW5nC;J&La8IHY`jCHEicUQu#NcgjJIWQlxOHSE$3MoYX)PydUWe(bl* zZS`-3Vt6z6gca+O%TC+^XA5M<CK62m&jv>viYJ^0UX5F3Iidw?>uwR?`0QN-sp}nC`!QDT@jO`4 z((m5jqzag)_pIBs)32jp+%M?imMWcJU0m`8NBp>+u!TsR^+(m(r3HzyMeprpMAkL- zN!yfBA|*DY#BYqcWb`0jGx?vs8N}ze8Su!wIN~?z>^FYZ{6M*v+!=)UvwV!RY%eh{dLjHCku`Z-F zbmk^I5L)f`U9Rb`Y-+6WqRhGhz9(scG4_|1sPJ=Cz2B6QK5$UxY(u<^gXsIv_QAbv@xtDoOrR+WR&em9G3GX(ShJPJrJ> z61oP?$7z`*wm<2$bO?1ylUrouHBnB-(NP<(R;yb2WB*Q?ondm7deLu=)b%E*sy<0& zQ{%46^a>@vAZ*7)Dmm$)Be(mi_51@6T;n^qxqbU}a`W!v(g4Ukfep!S*={-f?1xK4 z=gYgvETW7bR&DGk8W!KK!I4S0P@YGbcCt%VNMWsIb@WNBEiV0STF_lyI+B;=U@Riv zR%eK>x_4YbD>Azqd|kS&^)>2S6{1y8hC`-y^U`81KQr<9BY}OHy1;GE0m5Dk?I6nS z4U0*bF__zJb&|o-WlyvY;Act}nMJ3^;~u~QSO_hT*tF;#`BN+86kdoPQI9@}>GQl? zG<8uGbIjjIt0?*tDom`dmW$+$2kYeO<{4n6x!Ki>GXF476>+D|5aP+vUSH3Y*UmB{ zPP?*``TvfSnGy5Edcz5MVT*r@LxOGQS!cIU>ViP<3t8u_)V7porZ7WpH08Lbom3<7 zRHK=@Y{vVp|MLKj>P|T~=R@83_hk{G#0^5g|H^<_8IA6C*dEN{Y|wl)jf5Pm&_rl z2xtT^u0sL>McVg?Og?y>i0pJ_r1C|Hs&1u>rqs;e%N7$A=w{4}ms+ORe-LI)7!g*QU8OtAPh((>ke8Zccr6~LdS?LSPhFj?Z!d^9B z=i&Kz)%KF`gH)hcpb~LR!rbIyKW7{9ILi6qpEOqrm#4^JSq%prW^*>bF#8|87xjE} zolPB+E9;`Mg*#qYonX34rzdP1@rrpPwK?@;+z&m(8$G8!r{YfT0|fvTB!}RY6V-mr zuDvn%G&!sit2Sy*`E$V7aae8n;9yK<)&onk8Fo+3OyXrVszK%XQYwWP*&O=EpEYy& z6ipRgyFEH4))2&^D13gZX3W|W?1%pqq@Hiu&}(3!X0}9PlQmWE^kI5lR`bGW@WsWA z#s=tMJH3&i& zepZHKBXW|T*SjLl9?%0t^{;H*5Og~+;I~QrV(3fRY*pLw4O*%$D3RG6EUrNB}R z_ALEo%^?ZopqAy!ix&z<%@sdQyyihjRK|z~-~M5K+E1p_Gf+xud}wwe{;-ijp|(CB zmCUVCPMr3;MqgIU=_xW;b0`{K$|Ycr^YFap7rdLR*`4NLjgm3Tmt>)jVIe-u-s7Po zx6F&v3z}<(mbVX%f|uKW1qt)BZ{npc<(~F<_5-gYDRZ*zz1Y_iL)w&Z^BJx4LjIWZ z&Hjy=RUT|VFK8b0=%X!U$2jQ@T(i3;vYYBZv03FcDcQ0iPxQ8(Z$6yjLejg2X3gjD zk=?F8BgY&C=t9fx1}#PCQJd4@BB`uK2@Q^hJDh!cFQ2tG{w#_R)7(;7qNA4ITd3<3 z>Eue1>N3iEyXrH?5OLJPpax~M@<^Bq_1X*xV^1Y}&d^ooIE5ev%fXYFe9>QOIHz8? zR>+TUe%-36Z94B#|Al!sd@)d-GV0r43;C}^g)zqrIdtTeb+N^mvoi5F1cC;7M8{M4@%pr9!_{d7^GsJzyIDftR>d@svNa)`E2HKl; z*oX>;;q}sI?Oh*#(@U_Nr}-e30dsPa3OmKLp7!heCno*a>ho^l%Mw%cs}6h@PVUQ@ zE0$AH^b21}WKqva0UM5g#kz!r_n_S~&W_o>@}T|c@UcGoUr$nF3t)MSWY;Y*Yh13V zKL)Q;be;P3MBm+fcA{DzXjI9Hi}~#?-LwKsLbU>MZsdvo(_KMG`j*WpuL!S7 zC37CVf((Hu(}Mo!u$|e!;HjSXTu4XO)Il2F%Ca~YI!{DbM^hv2dP~cdfgq{>&BRcC zgyG}rlYfbAR$0Fil5eoj+#d>RYG}_DgNb|R^7JoDVupT&Tue~sE4I@y{c!WxtAz*@ zn}vPJoFCYw{43n8NjgqG3@w{KQ&P1NG7{yyuQO?N?&!mDD?TB)W6z!#|-|bE15F`<{*0})<#E6EZjaELFc+|}wr!na=ddr+@tmD_d zZy{cDr+z{SDAS$QxY2l|^Ml%8{Nlw!!N7(*QLt`z&D^6Dqf6ScLBhwWS#cDZ)%=`^ zJsrH-oOJ0v3ru0H30!mE8#G&wG>ee5C<`#aIQggwzOp&1s7@r$VCFc6?O_;wL$db; z+PX18++Ik<_*BKhxnL*A^^Jsy;%fBN1Wyd_|M~p8ClX22dFiP_& zJIyT+QpcwAWOa{*=}D8=Caw5Ag4ElQJDw!v zwfHZZX2S0yC>unZHd_Z*nz$qgQmBPuH!G?C+w}m=QOddBWmrYP*WO9Bqt*n~aYmH#cbFuhB zZxmDEsaO7Y?*zu;BzE~4euODi} zGq=|93*~k9?fo0(3^WRI^?OhS7nyg(>@&(|t1g0j8{o!a%<-*5B$Sg741oRckie#^&@W@9Ge@mL|_!)Dgh^E&qL8_H0zU)xQn5{^|HZ0-(haD(H--*jC4|a zZCylE-}>s@gi(RZxL^94;?v? ze+_eDQ8%_aorqjMs~-j1Q9gX+an+0*>EU0l2y;&?vwhheLHcLshKvz1!{Er3P%qy@s{Uz8XcZ2JiM)jPJZBZY;pTDk;(&9 z5u2})@S$X0+ws%K?^WkzP4xC`uj)|Mq{8SxT@4|6eI+RfD;xa1K4%5;G2e-!#~4B) zizjZO2$!kGmm-d?Qs`e#&o2!P=Ux`Y&QaDKHMme+zk77TO0KIn2mfurIE7X8u+GJe z%U0a=V+qVVu4g_TR+lTc88znBFs&d+kT{Z8A1W-=HOVr`vMgQxm4xA;V41S@^kaNt zEWMC@gZXtnhk|j`bkuq!xuJ@pB<)k3*X-#VOH8Is|6-UACB z3ZjvR@x+j)gw)-`r-tR~m5Wc`d@yYh`PJB)?@)q+LtV6r6F+F}h?}vzl!rgB$jGs@ z!Apm0s~gYFs+zA!-#lzTZ2Os<<)TPD^x)+IGZYp3zcI&|j{F|5S(>9Xofxj{>J0Kd zZ12ARcuZbaH@C|Ny^MPog(&DTP}2xeIjBsZgv$EvXRRaUyj#}Fa2Dt~DQ5Twtzwrn z;&a~%+d0Ca#0eoNZKJU8_*P-88N;39A~Z+OU=DNru(@HqjdD_m+lf88S3oS<-A;OY zd%-?AQ3lh^chniTOVOsiTc6$+Yvk_scdaXO2>lzL2EW|0MI-IGc%pE(`>8_-VQ$@z z-+TUGTCq0f^RUC_!X3(^`r1%o%jGzd&-UFm?8f#W>(T8ZJtL7{QlBm)>S+@Bz?#%2iu`}!GfQFVROvi3fWMmf;?j*58EP|#WOwsSb8Rv;7 zD_Pd|HHf)j9-zqcdZ0i%hJQ`%%mwFrEANF zYrg@WK(v0)>yG-Nv3RGAh@c|X=hhvL18??&`?JM~%!Zvl2X#>xrC_h4>qVLw<$YiQ z3+sDhNzUQk`^=E0TprV~p}fJO`YTVv<`bMJk7(A%(A#A0JHS_iEnxF{t$8?J$8jQ5 zD`ZMj+X?uJtun*EHq-sg8L&nyDyH_0*WUeG2Qb>c zoWA*3)UVP`ReHg~PL@{S^avxuYp3h01@PZ||e;Xk6ZZDBRnyfAVBGRBssb!-rBGDnWs`! - $${Frontend_FSHStarterBlazorClient_Settings__AppSettingsJson} && find - /usr/share/nginx/html -type f | xargs chmod +r && exec nginx -g - 'daemon off;'", - ] - volumes: - - ~/.aspnet/https:/https:ro - ports: - - 7100:80 - depends_on: - postgres: - condition: service_healthy - restart: on-failure - - postgres: - container_name: postgres - image: postgres:15-alpine - networks: - - fullstackhero - environment: - POSTGRES_USER: pgadmin - POSTGRES_PASSWORD: pgadmin - PGPORT: 5433 - ports: - - 5433:5433 - volumes: - - postgres-data:/var/lib/postgresql/data - healthcheck: - test: ["CMD-SHELL", "pg_isready -U pgadmin"] - interval: 10s - timeout: 5s - retries: 5 - - prometheus: - image: prom/prometheus:latest - container_name: prometheus - restart: unless-stopped - networks: - - fullstackhero - volumes: - - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - - prometheus-data:/prometheus - ports: - - 9090:9090 - - grafana: - container_name: grafana - image: grafana/grafana:latest - user: "472" - environment: - GF_INSTALL_PLUGINS: "grafana-clock-panel,grafana-simple-json-datasource" - ports: - - 3000:3000 - volumes: - - grafana-data:/var/lib/grafana - - ./grafana/config/:/etc/grafana/ - - ./grafana/dashboards/:/var/lib/grafana/dashboards - depends_on: - - prometheus - restart: unless-stopped - networks: - - fullstackhero - - otel-collector: - image: otel/opentelemetry-collector-contrib:latest - container_name: otel-collector - command: --config /etc/otel/config.yaml - environment: - JAEGER_ENDPOINT: "jaeger:4317" - LOKI_ENDPOINT: "http://loki:3100/loki/api/v1/push" - volumes: - - $BASE_PATH/otel-collector/otel-config.yaml:/etc/otel/config.yaml - - $BASE_PATH/otel-collector/log:/log/otel - depends_on: - - jaeger - - loki - - prometheus - ports: - - 8888:8888 # Prometheus metrics exposed by the collector - - 8889:8889 # Prometheus metrics exporter (scrape endpoint) - - 13133:13133 # health_check extension - - "55679:55679" # ZPages extension - - 4317:4317 # OTLP gRPC receiver - - 4318:4318 # OTLP Http receiver (Protobuf) - networks: - - fullstackhero - - jaeger: - container_name: jaeger - image: jaegertracing/all-in-one:latest - command: --query.ui-config /etc/jaeger/jaeger-ui.json - environment: - - METRICS_STORAGE_TYPE=prometheus - - PROMETHEUS_SERVER_URL=http://prometheus:9090 - - COLLECTOR_OTLP_ENABLED=true - volumes: - - $BASE_PATH/jaeger/jaeger-ui.json:/etc/jaeger/jaeger-ui.json - depends_on: - - prometheus - ports: - - "16686:16686" - networks: - - fullstackhero - - loki: - container_name: loki - image: grafana/loki:3.1.0 - command: -config.file=/mnt/config/loki-config.yml - volumes: - - $BASE_PATH/loki/loki.yml:/mnt/config/loki-config.yml - ports: - - "3100:3100" - networks: - - fullstackhero - - node_exporter: - image: quay.io/prometheus/node-exporter:v1.5.0 - container_name: node_exporter - command: "--path.rootfs=/host" - pid: host - restart: unless-stopped - volumes: - - /proc:/host/proc:ro - - /sys:/host/sys:ro - - /:/rootfs:ro - networks: - - fullstackhero - -volumes: - postgres-data: - grafana-data: - prometheus-data: - -networks: - fullstackhero: diff --git a/compose/grafana/config/grafana.ini b/compose/grafana/config/grafana.ini deleted file mode 100644 index 4277397334..0000000000 --- a/compose/grafana/config/grafana.ini +++ /dev/null @@ -1,16 +0,0 @@ -[auth.anonymous] -enabled = true - -# Organization name that should be used for unauthenticated users -org_name = Main Org. - -# Role for unauthenticated users, other valid values are `Editor` and `Admin` -org_role = Admin - -# Hide the Grafana version text from the footer and help tooltip for unauthenticated users (default: false) -hide_version = true - -[dashboards] -default_home_dashboard_path = /var/lib/grafana/dashboards/aspnet-core.json - -min_refresh_interval = 1s \ No newline at end of file diff --git a/compose/grafana/config/provisioning/dashboards/default.yml b/compose/grafana/config/provisioning/dashboards/default.yml deleted file mode 100644 index d2f0a7ca80..0000000000 --- a/compose/grafana/config/provisioning/dashboards/default.yml +++ /dev/null @@ -1,11 +0,0 @@ -apiVersion: 1 - -providers: -- name: 'Prometheus' - orgId: 1 - folder: '' - type: file - disableDeletion: false - editable: true - options: - path: /var/lib/grafana/dashboards \ No newline at end of file diff --git a/compose/grafana/config/provisioning/datasources/default.yml b/compose/grafana/config/provisioning/datasources/default.yml deleted file mode 100644 index 428d40e2ed..0000000000 --- a/compose/grafana/config/provisioning/datasources/default.yml +++ /dev/null @@ -1,69 +0,0 @@ -# config file version -apiVersion: 1 - -# list of datasources that should be deleted from the database -deleteDatasources: - - name: Prometheus - orgId: 1 - -# list of datasources to insert/update depending -# whats available in the database -datasources: -- name: Prometheus - type: prometheus - access: proxy - # Access mode - proxy (server in the UI) or direct (browser in the UI). - url: http://host.docker.internal:9090 - uid: prom - -- name: Loki - uid: loki - type: loki - access: proxy - url: http://loki:3100 - # allow users to edit datasources from the UI. - editable: true - jsonData: - derivedFields: - - datasourceUid: jaeger - matcherRegex: (?:"traceid"):"(\w+)" - name: TraceID - url: $${__value.raw} - -- name: Jaeger - type: jaeger - uid: jaeger - access: proxy - url: http://jaeger:16686 - readOnly: false - isDefault: false - # allow users to edit datasources from the UI. - editable: true - jsonData: - tracesToLogsV2: - # Field with an internal link pointing to a logs data source in Grafana. - # datasourceUid value must match the uid value of the logs data source. - datasourceUid: 'loki' - spanStartTimeShift: '1h' - spanEndTimeShift: '-1h' - tags: [{ key: 'service.names', value: 'service_name' }] - filterByTraceID: false - filterBySpanID: false - customQuery: true - query: '{$${__tags}} |="$${__trace.traceId}"' - tracesToMetrics: - datasourceUid: 'prom' - spanStartTimeShift: '1h' - spanEndTimeShift: '-1h' - tags: [{ key: 'service.name', value: 'service' }, { key: 'job' }] - queries: - - name: 'Sample query' - query: 'sum(rate(traces_spanmetrics_latency_bucket{$$__tags}[5m]))' - nodeGraph: - enabled: true - traceQuery: - timeShiftEnabled: true - spanStartTimeShift: '1h' - spanEndTimeShift: '-1h' - spanBar: - type: 'None' \ No newline at end of file diff --git a/compose/grafana/dashboards/aspnet-core-endpoint.json b/compose/grafana/dashboards/aspnet-core-endpoint.json deleted file mode 100644 index 05b5496712..0000000000 --- a/compose/grafana/dashboards/aspnet-core-endpoint.json +++ /dev/null @@ -1,933 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": false, - "tags": [], - "type": "dashboard" - }, - "type": "dashboard" - } - ] - }, - "description": "ASP.NET Core endpoint metrics from OpenTelemetry", - "editable": true, - "fiscalYearStartMonth": 0, - "gnetId": 19925, - "graphTooltip": 0, - "id": 10, - "links": [ - { - "asDropdown": false, - "icon": "dashboard", - "includeVars": false, - "keepTime": true, - "tags": [], - "targetBlank": false, - "title": " ASP.NET Core", - "tooltip": "", - "type": "link", - "url": "/d/KdDACDp4z/asp-net-core-metrics" - } - ], - "liveNow": false, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "dark-green", - "mode": "continuous-GrYlRd", - "seriesBy": "max" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 50, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ - { - "options": { - "match": "null+nan", - "result": { - "index": 0, - "text": "0 ms" - } - }, - "type": "special" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "s" - }, - "overrides": [ - { - "__systemRef": "hideSeriesFrom", - "matcher": { - "id": "byNames", - "options": { - "mode": "exclude", - "names": [ - "p50" - ], - "prefix": "All except:", - "readOnly": true - } - }, - "properties": [ - { - "id": "custom.hideFrom", - "value": { - "legend": false, - "tooltip": false, - "viz": false - } - } - ] - } - ] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 40, - "options": { - "legend": { - "calcs": [ - "lastNotNull", - "min", - "max" - ], - "displayMode": "table", - "placement": "right", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(rate(http_server_request_duration_seconds_bucket{job=\"$job\", instance=\"$instance\", http_route=\"$route\", http_request_method=\"$method\"}[5m])) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "p50" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.75, sum(rate(http_server_request_duration_seconds_bucket{job=\"$job\", instance=\"$instance\", http_route=\"$route\", http_request_method=\"$method\"}[5m])) by (le))", - "hide": false, - "legendFormat": "p75", - "range": true, - "refId": "p75" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(rate(http_server_request_duration_seconds_bucket{job=\"$job\", instance=\"$instance\", http_route=\"$route\", http_request_method=\"$method\"}[5m])) by (le))", - "hide": false, - "legendFormat": "p90", - "range": true, - "refId": "p90" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.95, sum(rate(http_server_request_duration_seconds_bucket{job=\"$job\", instance=\"$instance\", http_route=\"$route\", http_request_method=\"$method\"}[5m])) by (le))", - "hide": false, - "legendFormat": "p95", - "range": true, - "refId": "p95" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.98, sum(rate(http_server_request_duration_seconds_bucket{job=\"$job\", instance=\"$instance\", http_route=\"$route\", http_request_method=\"$method\"}[5m])) by (le))", - "hide": false, - "legendFormat": "p98", - "range": true, - "refId": "p98" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(rate(http_server_request_duration_seconds_bucket{job=\"$job\", instance=\"$instance\", http_route=\"$route\", http_request_method=\"$method\"}[5m])) by (le))", - "hide": false, - "legendFormat": "p99", - "range": true, - "refId": "p99" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.999, sum(rate(http_server_request_duration_seconds_bucket{job=\"$job\", instance=\"$instance\", http_route=\"$route\", http_request_method=\"$method\"}[5m])) by (le))", - "hide": false, - "legendFormat": "p99.9", - "range": true, - "refId": "p99.9" - } - ], - "title": "Requests Duration - $method $route", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic", - "seriesBy": "max" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 50, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ - { - "options": { - "match": "null+nan", - "result": { - "index": 0, - "text": "0%" - } - }, - "type": "special" - } - ], - "max": 1, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "percentunit" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "All" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-orange", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "4XX" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "5XX" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 46, - "options": { - "legend": { - "calcs": [ - "lastNotNull", - "min", - "max" - ], - "displayMode": "table", - "placement": "right", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "sum(rate(http_server_request_duration_seconds_count{job=\"$job\", instance=\"$instance\", http_route=\"$route\", http_request_method=\"$method\", http_response_status_code=~\"4..|5..\"}[5m]) or vector(0)) / sum(rate(http_server_request_duration_seconds_count{job=\"$job\", instance=\"$instance\", http_route=\"$route\", http_request_method=\"$method\"}[5m]))", - "legendFormat": "All", - "range": true, - "refId": "All" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "sum(rate(http_server_request_duration_seconds_count{job=\"$job\", instance=\"$instance\", http_route=\"$route\", http_request_method=\"$method\", http_response_status_code=~\"4..\"}[5m]) or vector(0)) / sum(rate(http_server_request_duration_seconds_count{job=\"$job\", instance=\"$instance\", http_route=\"$route\", http_request_method=\"$method\"}[5m]))", - "hide": false, - "legendFormat": "4XX", - "range": true, - "refId": "4XX" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "sum(rate(http_server_request_duration_seconds_count{job=\"$job\", instance=\"$instance\", http_route=\"$route\", http_request_method=\"$method\", http_response_status_code=~\"5..\"}[5m]) or vector(0)) / sum(rate(http_server_request_duration_seconds_count{job=\"$job\", instance=\"$instance\", http_route=\"$route\", http_request_method=\"$method\"}[5m]))", - "hide": false, - "legendFormat": "5XX", - "range": true, - "refId": "5XX" - } - ], - "title": "Errors Rate - $method $route", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "custom": { - "align": "auto", - "cellOptions": { - "type": "auto" - }, - "inspect": false - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Requests" - }, - "properties": [ - { - "id": "custom.width", - "value": 300 - }, - { - "id": "custom.cellOptions", - "value": { - "mode": "gradient", - "type": "gauge" - } - }, - { - "id": "color", - "value": { - "mode": "continuous-YlRd" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Route" - }, - "properties": [ - { - "id": "links", - "value": [ - { - "title": "", - "url": "/d/NagEsjE4z/asp-net-core-endpoint-details?var-route=${__data.fields.Route}&var-method=${__data.fields.Method}&${__url_time_range}" - } - ] - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 9 - }, - "hideTimeOverride": false, - "id": 44, - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" - ], - "show": false - }, - "showHeader": true, - "sortBy": [ - { - "desc": true, - "displayName": "Value" - } - ] - }, - "pluginVersion": "11.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "exemplar": false, - "expr": "sum by (error_type) (\r\n max_over_time(http_server_request_duration_seconds_count{http_route=\"$route\", http_request_method=\"$method\", error_type!=\"\"}[$__rate_interval])\r\n)", - "format": "table", - "instant": true, - "interval": "", - "legendFormat": "{{route}}", - "range": false, - "refId": "A" - } - ], - "title": "Unhandled Exceptions", - "transformations": [ - { - "id": "organize", - "options": { - "excludeByName": { - "Time": true, - "method": false - }, - "indexByName": { - "Time": 0, - "Value": 2, - "error_type": 1 - }, - "renameByName": { - "Value": "Requests", - "error_type": "Exception", - "http_request_method": "Method", - "http_route": "Route" - } - } - } - ], - "type": "table" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "blue", - "mode": "fixed" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 12, - "x": 12, - "y": 9 - }, - "id": 42, - "options": { - "colorMode": "background", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "max" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "value_and_name", - "wideLayout": true - }, - "pluginVersion": "11.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "sum by (http_response_status_code) (\r\n max_over_time(http_server_request_duration_seconds_count{http_route=\"$route\", http_request_method=\"$method\"}[$__rate_interval])\r\n )", - "legendFormat": "Status {{http_response_status_code}}", - "range": true, - "refId": "A" - } - ], - "title": "Requests HTTP Status Code", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "green", - "mode": "fixed" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 12, - "y": 13 - }, - "id": 48, - "options": { - "colorMode": "background", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "max" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "value_and_name", - "wideLayout": true - }, - "pluginVersion": "11.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "sum by (url_scheme) (\r\n max_over_time(http_server_request_duration_seconds_count{job=\"$job\", instance=\"$instance\", http_route=\"$route\", http_request_method=\"$method\"}[$__rate_interval])\r\n )", - "legendFormat": "{{scheme}}", - "range": true, - "refId": "A" - } - ], - "title": "Requests Secured", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "purple", - "mode": "fixed" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 18, - "y": 13 - }, - "id": 50, - "options": { - "colorMode": "background", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "max" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "value_and_name", - "wideLayout": true - }, - "pluginVersion": "11.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "sum by (method_route) (\r\n label_replace(max_over_time(http_server_request_duration_seconds_count{job=\"$job\", instance=\"$instance\", http_route=\"$route\", http_request_method=\"$method\"}[$__rate_interval]), \"method_route\", \"http/$1\", \"network_protocol_version\", \"(.*)\")\r\n )", - "legendFormat": "{{protocol}}", - "range": true, - "refId": "A" - } - ], - "title": "Requests HTTP Protocol", - "type": "stat" - } - ], - "refresh": "", - "revision": 1, - "schemaVersion": 39, - "tags": [ - "dotnet", - "prometheus", - "aspnetcore" - ], - "templating": { - "list": [ - { - "current": { - "selected": false, - "text": "fullstackhero.api", - "value": "fullstackhero.api" - }, - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "definition": "label_values(http_server_active_requests,job)", - "hide": 0, - "includeAll": false, - "label": "Job", - "multi": false, - "name": "job", - "options": [], - "query": { - "query": "label_values(http_server_active_requests,job)", - "refId": "PrometheusVariableQueryEditor-VariableQuery" - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "type": "query" - }, - { - "current": { - "selected": false, - "text": "host.docker.internal:5000", - "value": "host.docker.internal:5000" - }, - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "definition": "label_values(http_server_active_requests{job=~\"$job\"},instance)", - "hide": 0, - "includeAll": false, - "label": "Instance", - "multi": false, - "name": "instance", - "options": [], - "query": { - "query": "label_values(http_server_active_requests{job=~\"$job\"},instance)", - "refId": "PrometheusVariableQueryEditor-VariableQuery" - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "type": "query" - }, - { - "current": { - "selected": false, - "text": "api/roles/", - "value": "api/roles/" - }, - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "definition": "label_values(http_server_request_duration_seconds_count,http_route)", - "description": "Route", - "hide": 0, - "includeAll": false, - "label": "Route", - "multi": false, - "name": "route", - "options": [], - "query": { - "query": "label_values(http_server_request_duration_seconds_count,http_route)", - "refId": "PrometheusVariableQueryEditor-VariableQuery" - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "type": "query" - }, - { - "current": { - "selected": false, - "text": "GET", - "value": "GET" - }, - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "definition": "label_values(http_server_request_duration_seconds_count{http_route=~\"$route\"},http_request_method)", - "hide": 0, - "includeAll": false, - "label": "Method", - "multi": false, - "name": "method", - "options": [], - "query": { - "query": "label_values(http_server_request_duration_seconds_count{http_route=~\"$route\"},http_request_method)", - "refId": "PrometheusVariableQueryEditor-VariableQuery" - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "type": "query" - } - ] - }, - "time": { - "from": "now-15m", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "1s", - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "", - "title": "ASP.NET Core Endpoint", - "uid": "NagEsjE4j", - "version": 2, - "weekStart": "" -} \ No newline at end of file diff --git a/compose/grafana/dashboards/aspnet-core.json b/compose/grafana/dashboards/aspnet-core.json deleted file mode 100644 index a0d2aa1740..0000000000 --- a/compose/grafana/dashboards/aspnet-core.json +++ /dev/null @@ -1,1332 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": false, - "tags": [], - "type": "dashboard" - }, - "type": "dashboard" - } - ] - }, - "description": "ASP.NET Core metrics from OpenTelemetry", - "editable": true, - "fiscalYearStartMonth": 0, - "gnetId": 19924, - "graphTooltip": 0, - "id": 9, - "links": [], - "liveNow": false, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "dark-green", - "mode": "continuous-GrYlRd", - "seriesBy": "max" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 50, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ - { - "options": { - "match": "null+nan", - "result": { - "index": 1, - "text": "0 ms" - } - }, - "type": "special" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "s" - }, - "overrides": [ - { - "__systemRef": "hideSeriesFrom", - "matcher": { - "id": "byNames", - "options": { - "mode": "exclude", - "names": [ - "p50" - ], - "prefix": "All except:", - "readOnly": true - } - }, - "properties": [ - { - "id": "custom.hideFrom", - "value": { - "legend": false, - "tooltip": false, - "viz": false - } - } - ] - } - ] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 40, - "options": { - "legend": { - "calcs": [ - "lastNotNull", - "min", - "max" - ], - "displayMode": "table", - "placement": "right", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(rate(http_server_request_duration_seconds_bucket{job=\"$job\", instance=\"$instance\"}[$__rate_interval])) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "p50" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.75, sum(rate(http_server_request_duration_seconds_bucket{job=\"$job\", instance=\"$instance\"}[$__rate_interval])) by (le))", - "hide": false, - "legendFormat": "p75", - "range": true, - "refId": "p75" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(rate(http_server_request_duration_seconds_bucket{job=\"$job\", instance=\"$instance\"}[$__rate_interval])) by (le))", - "hide": false, - "legendFormat": "p90", - "range": true, - "refId": "p90" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.95, sum(rate(http_server_request_duration_seconds_bucket{job=\"$job\", instance=\"$instance\"}[$__rate_interval])) by (le))", - "hide": false, - "legendFormat": "p95", - "range": true, - "refId": "p95" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.98, sum(rate(http_server_request_duration_seconds_bucket{job=\"$job\", instance=\"$instance\"}[$__rate_interval])) by (le))", - "hide": false, - "legendFormat": "p98", - "range": true, - "refId": "p98" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(rate(http_server_request_duration_seconds_bucket{job=\"$job\", instance=\"$instance\"}[$__rate_interval])) by (le))", - "hide": false, - "legendFormat": "p99", - "range": true, - "refId": "p99" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.999, sum(rate(http_server_request_duration_seconds_bucket{job=\"$job\", instance=\"$instance\"}[$__rate_interval])) by (le))", - "hide": false, - "legendFormat": "p99.9", - "range": true, - "refId": "p99.9" - } - ], - "title": "Requests Duration", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic", - "seriesBy": "max" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 50, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ - { - "options": { - "match": "null+nan", - "result": { - "index": 1, - "text": "0%" - } - }, - "type": "special" - } - ], - "max": 1, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "percentunit" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "All" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-orange", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "4XX" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "5XX" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 47, - "options": { - "legend": { - "calcs": [ - "lastNotNull", - "min", - "max" - ], - "displayMode": "table", - "placement": "right", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "sum(rate(http_server_request_duration_seconds_bucket{job=\"$job\", instance=\"$instance\", http_response_status_code=~\"4..|5..\"}[$__rate_interval]) or vector(0)) / sum(rate(http_server_request_duration_seconds_bucket{job=\"$job\", instance=\"$instance\"}[$__rate_interval]))", - "legendFormat": "All", - "range": true, - "refId": "All" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "sum(rate(http_server_request_duration_seconds_bucket{job=\"$job\", instance=\"$instance\", http_response_status_code=~\"4..\"}[$__rate_interval]) or vector(0)) / sum(rate(http_server_request_duration_seconds_bucket{job=\"$job\", instance=\"$instance\"}[$__rate_interval]))", - "hide": false, - "legendFormat": "4XX", - "range": true, - "refId": "4XX" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "sum(rate(http_server_request_duration_seconds_bucket{job=\"$job\", instance=\"$instance\", http_response_status_code=~\"5..\"}[$__rate_interval]) or vector(0)) / sum(rate(http_server_request_duration_seconds_bucket{job=\"$job\", instance=\"$instance\"}[$__rate_interval]))", - "hide": false, - "legendFormat": "5XX", - "range": true, - "refId": "5XX" - } - ], - "title": "Errors Rate", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 6, - "x": 0, - "y": 9 - }, - "id": 49, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "sum(kestrel_active_connections{job=\"$job\", instance=\"$instance\"})", - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Current Connections", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 6, - "x": 6, - "y": 9 - }, - "id": 55, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "sum(http_server_active_requests{job=\"$job\", instance=\"$instance\"})", - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Current Requests", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "blue", - "mode": "fixed" - }, - "mappings": [], - "noValue": "0", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 12, - "y": 9 - }, - "id": 58, - "options": { - "colorMode": "background", - "graphMode": "area", - "justifyMode": "center", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "text": {}, - "textMode": "value", - "wideLayout": true - }, - "pluginVersion": "11.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "exemplar": false, - "expr": "sum(http_server_request_duration_seconds_count{job=\"$job\", instance=\"$instance\"})", - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Total Requests", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "dark-red", - "mode": "fixed" - }, - "mappings": [], - "noValue": "0", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 18, - "y": 9 - }, - "id": 59, - "options": { - "colorMode": "background", - "graphMode": "area", - "justifyMode": "center", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "text": {}, - "textMode": "value", - "wideLayout": true - }, - "pluginVersion": "11.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "exemplar": false, - "expr": "sum(http_server_request_duration_seconds_count{job=\"$job\", instance=\"$instance\", error_type!=\"\"})", - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A" - } - ], - "title": "Total Unhandled Exceptions", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "green", - "mode": "fixed" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 12, - "y": 13 - }, - "id": 60, - "options": { - "colorMode": "background", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "max" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "value_and_name", - "wideLayout": true - }, - "pluginVersion": "11.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "sum by (url_scheme) (\r\n max_over_time(http_server_request_duration_seconds_count{job=\"$job\", instance=\"$instance\"}[$__rate_interval])\r\n )", - "legendFormat": "{{scheme}}", - "range": true, - "refId": "A" - } - ], - "title": "Requests Secured", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "purple", - "mode": "fixed" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 18, - "y": 13 - }, - "id": 42, - "options": { - "colorMode": "background", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "max" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "value_and_name", - "wideLayout": true - }, - "pluginVersion": "11.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "sum by (method_route) (\r\n label_replace(max_over_time(http_server_request_duration_seconds_count{job=\"$job\", instance=\"$instance\"}[$__rate_interval]), \"method_route\", \"http/$1\", \"network_protocol_version\", \"(.*)\")\r\n )", - "legendFormat": "{{protocol}}", - "range": true, - "refId": "A" - } - ], - "title": "Requests HTTP Protocol", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "custom": { - "align": "auto", - "cellOptions": { - "type": "auto" - }, - "inspect": false - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Requests" - }, - "properties": [ - { - "id": "custom.width", - "value": 300 - }, - { - "id": "custom.cellOptions", - "value": { - "mode": "gradient", - "type": "gauge" - } - }, - { - "id": "color", - "value": { - "mode": "continuous-BlPu" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Endpoint" - }, - "properties": [ - { - "id": "links", - "value": [ - { - "targetBlank": false, - "title": "Test", - "url": "/d/NagEsjE4z/asp-net-core-endpoint-details?var-route=${__data.fields.http_route}&var-method=${__data.fields.http_request_method}&${__url_time_range}" - } - ] - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "http_route" - }, - "properties": [ - { - "id": "custom.hidden", - "value": true - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "http_request_method" - }, - "properties": [ - { - "id": "custom.hidden", - "value": true - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 17 - }, - "hideTimeOverride": false, - "id": 51, - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" - ], - "show": false - }, - "showHeader": true, - "sortBy": [ - { - "desc": true, - "displayName": "Value" - } - ] - }, - "pluginVersion": "11.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "exemplar": false, - "expr": " topk(10,\r\n sum by (http_route, http_request_method, method_route) (\r\n label_join(max_over_time(http_server_request_duration_seconds_count{job=\"$job\", instance=\"$instance\", http_route!=\"\"}[$__rate_interval]), \"method_route\", \" \", \"http_request_method\", \"http_route\")\r\n ))", - "format": "table", - "instant": true, - "interval": "", - "legendFormat": "{{route}}", - "range": false, - "refId": "A" - } - ], - "title": "Top 10 Requested Endpoints", - "transformations": [ - { - "id": "organize", - "options": { - "excludeByName": { - "Time": true, - "method": false, - "route": false - }, - "indexByName": { - "Time": 0, - "Value": 4, - "method": 2, - "method_route": 3, - "route": 1 - }, - "renameByName": { - "Value": "Requests", - "method": "", - "method_route": "Endpoint", - "route": "" - } - } - } - ], - "type": "table" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "custom": { - "align": "auto", - "cellOptions": { - "type": "auto" - }, - "inspect": false - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Requests" - }, - "properties": [ - { - "id": "custom.width", - "value": 300 - }, - { - "id": "custom.cellOptions", - "value": { - "mode": "gradient", - "type": "gauge" - } - }, - { - "id": "color", - "value": { - "mode": "continuous-YlRd" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Endpoint" - }, - "properties": [ - { - "id": "links", - "value": [ - { - "title": "", - "url": "/d/NagEsjE4z/asp-net-core-endpoint-details?var-route=${__data.fields.http_route}&var-method=${__data.fields.http_request_method}&${__url_time_range}" - } - ] - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "http_route" - }, - "properties": [ - { - "id": "custom.hidden", - "value": true - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "http_request_method" - }, - "properties": [ - { - "id": "custom.hidden", - "value": true - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 17 - }, - "hideTimeOverride": false, - "id": 54, - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" - ], - "show": false - }, - "showHeader": true, - "sortBy": [ - { - "desc": true, - "displayName": "Value" - } - ] - }, - "pluginVersion": "11.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "exemplar": false, - "expr": " topk(10,\r\n sum by (http_route, http_request_method, method_route) (\r\n label_join(max_over_time(http_server_request_duration_seconds_count{job=\"$job\", instance=\"$instance\", http_route!=\"\", error_type!=\"\"}[$__rate_interval]), \"method_route\", \" \", \"http_request_method\", \"http_route\")\r\n ))", - "format": "table", - "instant": true, - "interval": "", - "legendFormat": "{{route}}", - "range": false, - "refId": "A" - } - ], - "title": "Top 10 Unhandled Exception Endpoints", - "transformations": [ - { - "id": "organize", - "options": { - "excludeByName": { - "Time": true, - "method": false - }, - "indexByName": { - "Time": 0, - "Value": 4, - "method": 2, - "method_route": 3, - "route": 1 - }, - "renameByName": { - "Value": "Requests", - "method": "", - "method_route": "Endpoint", - "route": "" - } - } - } - ], - "type": "table" - } - ], - "refresh": "", - "revision": 1, - "schemaVersion": 39, - "tags": [ - "dotnet", - "prometheus", - "aspnetcore" - ], - "templating": { - "list": [ - { - "current": { - "selected": false, - "text": "fullstackhero.api", - "value": "fullstackhero.api" - }, - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "definition": "label_values(http_server_active_requests,job)", - "hide": 0, - "includeAll": false, - "label": "Job", - "multi": false, - "name": "job", - "options": [], - "query": { - "query": "label_values(http_server_active_requests,job)", - "refId": "PrometheusVariableQueryEditor-VariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "type": "query" - }, - { - "current": { - "selected": false, - "text": "host.docker.internal:5000", - "value": "host.docker.internal:5000" - }, - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "definition": "label_values(http_server_active_requests{job=~\"$job\"},instance)", - "hide": 0, - "includeAll": false, - "label": "Instance", - "multi": false, - "name": "instance", - "options": [], - "query": { - "query": "label_values(http_server_active_requests{job=~\"$job\"},instance)", - "refId": "PrometheusVariableQueryEditor-VariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "type": "query" - } - ] - }, - "time": { - "from": "now-15m", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "1s", - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "", - "title": "ASP.NET Core", - "uid": "KdDACDp4z", - "version": 2, - "weekStart": "" -} \ No newline at end of file diff --git a/compose/grafana/dashboards/dotnet-otel-dashboard.json b/compose/grafana/dashboards/dotnet-otel-dashboard.json deleted file mode 100644 index 1b179c6791..0000000000 --- a/compose/grafana/dashboards/dotnet-otel-dashboard.json +++ /dev/null @@ -1,2031 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": false, - "tags": [], - "type": "dashboard" - }, - "type": "dashboard" - } - ] - }, - "description": "Shows ASP.NET metrics from OpenTelemetry NuGet", - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "id": 9, - "links": [], - "liveNow": false, - "panels": [ - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 15, - "panels": [], - "title": "Process", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 90, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "percentunit" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "system" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-orange", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "user" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-green", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 9, - "w": 11, - "x": 0, - "y": 1 - }, - "id": 19, - "options": { - "legend": { - "calcs": [ - "lastNotNull", - "min", - "max", - "mean" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "irate(process_cpu_time{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\"}[$__rate_interval])", - "legendFormat": "__auto", - "range": true, - "refId": "CPU Usage" - } - ], - "title": "CPU Usage", - "transformations": [ - { - "id": "labelsToFields", - "options": { - "keepLabels": [ - "state" - ], - "valueLabel": "state" - } - } - ], - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "dark-green", - "mode": "fixed" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 90, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineStyle": { - "fill": "solid" - }, - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 10, - "x": 11, - "y": 1 - }, - "id": 16, - "options": { - "legend": { - "calcs": [ - "lastNotNull", - "min", - "max", - "mean" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "max_over_time(process_memory_usage{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\"}[$__rate_interval])", - "legendFormat": "Memory Usage", - "range": true, - "refId": "Memory Usage" - } - ], - "title": "Memory Usage", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "dark-green", - "value": null - }, - { - "color": "dark-yellow", - "value": 50 - }, - { - "color": "dark-orange", - "value": 100 - }, - { - "color": "dark-red", - "value": 150 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 3, - "x": 21, - "y": 1 - }, - "id": 12, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "value" - }, - "pluginVersion": "10.0.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "max_over_time(process_threads{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\"}[$__rate_interval])", - "legendFormat": "Threads", - "range": true, - "refId": "Threads" - } - ], - "title": "Threads", - "type": "stat" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 10 - }, - "id": 2, - "panels": [], - "title": "Runtime", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "continuous-GrYlRd", - "seriesBy": "max" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 50, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineStyle": { - "fill": "solid" - }, - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 8, - "x": 0, - "y": 11 - }, - "id": 6, - "options": { - "legend": { - "calcs": [ - "lastNotNull", - "min", - "max", - "mean" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "max_over_time(process_runtime_dotnet_gc_committed_memory_size{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\"}[$__rate_interval])", - "hide": false, - "legendFormat": "Committed Memory Size", - "range": true, - "refId": "Committed Memory Size" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "max_over_time(process_runtime_dotnet_gc_committed_memory_size{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\"}[$__rate_interval])", - "legendFormat": "Objects Size", - "range": true, - "refId": "Objects Size" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "exemplar": false, - "expr": "irate(process_runtime_dotnet_gc_committed_memory_size{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\"}[$__rate_interval])", - "hide": false, - "instant": false, - "legendFormat": "Allocations Size", - "range": true, - "refId": "Allocations Size" - } - ], - "title": "General Memory Usage", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "text", - "mode": "fixed" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 60, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineWidth": 0, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "gen0" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "gen1" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "gen2" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-red", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "loh" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-orange", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "poh" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-blue", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 9, - "w": 8, - "x": 8, - "y": 11 - }, - "id": 8, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "max_over_time(process_runtime_dotnet_gc_heap_size{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\"}[$__rate_interval])", - "legendFormat": "__auto", - "range": true, - "refId": "Heap Size" - } - ], - "title": "Heap Generations (bytes)", - "transformations": [ - { - "id": "labelsToFields", - "options": { - "keepLabels": [ - "generation" - ], - "valueLabel": "generation" - } - } - ], - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "text", - "mode": "fixed" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 60, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineWidth": 0, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "gen0" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "gen1" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "gen2" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-red", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "loh" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-orange", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "poh" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-blue", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 9, - "w": 8, - "x": 16, - "y": 11 - }, - "id": 9, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "max_over_time(process_runtime_dotnet_gc_heap_fragmentation_size{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\"}[$__rate_interval])", - "legendFormat": "__auto", - "range": true, - "refId": "Heap Fragmentation" - } - ], - "title": "Heap Fragmentation (bytes)", - "transformations": [ - { - "id": "labelsToFields", - "options": { - "keepLabels": [ - "generation" - ], - "valueLabel": "generation" - } - } - ], - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "green", - "mode": "fixed" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": -1, - "drawStyle": "bars", - "fillOpacity": 100, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 0, - "pointSize": 1, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ - { - "options": { - "0": { - "color": "transparent", - "index": 0, - "text": "None" - } - }, - "type": "value" - } - ], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "gen0" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-green", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "gen1" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "gen2" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 9, - "w": 8, - "x": 0, - "y": 20 - }, - "id": 4, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.3.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "exemplar": false, - "expr": "idelta(process_runtime_dotnet_gc_collections_count{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\"}[$__rate_interval])", - "hide": false, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "gc" - } - ], - "title": "GC Collections", - "transformations": [ - { - "id": "labelsToFields", - "options": { - "keepLabels": [ - "generation" - ], - "mode": "columns", - "valueLabel": "generation" - } - } - ], - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "dark-red", - "mode": "fixed" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 90, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineStyle": { - "fill": "solid" - }, - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 8, - "x": 8, - "y": 20 - }, - "id": 13, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "increase(process_runtime_dotnet_exceptions_count{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\"}[$__rate_interval])", - "legendFormat": "Exceptions", - "range": true, - "refId": "Exceptions" - } - ], - "title": "Exceptions", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "dark-green", - "mode": "fixed" - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 4, - "x": 16, - "y": 20 - }, - "id": 11, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.0.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "max_over_time(process_runtime_dotnet_thread_pool_threads_count{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\"}[$__rate_interval])", - "legendFormat": "ThreadPool Threads", - "range": true, - "refId": "ThreadPool Threads" - } - ], - "title": "ThreadPool Threads", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "dark-green", - "mode": "fixed" - }, - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 4, - "x": 20, - "y": 20 - }, - "id": 17, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "textMode": "auto" - }, - "pluginVersion": "10.0.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "max_over_time(process_runtime_dotnet_thread_pool_queue_length{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\"}[$__rate_interval])", - "legendFormat": "ThreadPool Threads Queue Length", - "range": true, - "refId": "ThreadPool Threads Queue Length" - } - ], - "title": "ThreadPool Threads Queue Length", - "type": "stat" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 29 - }, - "id": 33, - "panels": [], - "title": "HTTP Server", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "dark-green", - "mode": "continuous-GrYlRd", - "seriesBy": "max" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 50, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - } - ] - }, - "unit": "ms" - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 30 - }, - "id": 40, - "options": { - "legend": { - "calcs": [ - "lastNotNull", - "min", - "max" - ], - "displayMode": "table", - "placement": "right", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(rate(http_server_duration_bucket{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\"}[$__rate_interval])) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "p50" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.75, sum(rate(http_server_duration_bucket{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\"}[$__rate_interval])) by (le))", - "hide": false, - "legendFormat": "p75", - "range": true, - "refId": "p75" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(rate(http_server_duration_bucket{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\"}[$__rate_interval])) by (le))", - "hide": false, - "legendFormat": "p90", - "range": true, - "refId": "p90" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.95, sum(rate(http_server_duration_bucket{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\"}[$__rate_interval])) by (le))", - "hide": false, - "legendFormat": "p95", - "range": true, - "refId": "p95" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.98, sum(rate(http_server_duration_bucket{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\"}[$__rate_interval])) by (le))", - "hide": false, - "legendFormat": "p98", - "range": true, - "refId": "p98" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(rate(http_server_duration_bucket{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\"}[$__rate_interval])) by (le))", - "hide": false, - "legendFormat": "p99", - "range": true, - "refId": "p99" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.999, sum(rate(http_server_duration_bucket{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\"}[$__rate_interval])) by (le))", - "hide": false, - "legendFormat": "p99.9", - "range": true, - "refId": "p99.9" - } - ], - "title": "Responses Duration", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic", - "seriesBy": "max" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 50, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - } - ] - }, - "unit": "percentunit" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "All" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-orange", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "4XX" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "5XX" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 30 - }, - "id": 47, - "options": { - "legend": { - "calcs": [ - "lastNotNull", - "min", - "max" - ], - "displayMode": "table", - "placement": "right", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "sum(rate(http_server_duration_count{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\", http_status_code!~\"2..\"}[$__rate_interval]) or vector(0)) / sum(rate(http_server_duration_count{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\"}[$__rate_interval]))", - "legendFormat": "All", - "range": true, - "refId": "All" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "sum(rate(http_server_duration_count{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\", http_status_code=~\"4..\"}[$__rate_interval]) or vector(0)) / sum(rate(http_server_duration_count{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\"}[$__rate_interval]))", - "hide": false, - "legendFormat": "4XX", - "range": true, - "refId": "4XX" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "sum(rate(http_server_duration_count{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\", http_status_code=~\"5..\"}[$__rate_interval]) or vector(0)) / sum(rate(http_server_duration_count{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\"}[$__rate_interval]))", - "hide": false, - "legendFormat": "5XX", - "range": true, - "refId": "5XX" - } - ], - "title": "Errors Rate", - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 39 - }, - "id": 21, - "panels": [], - "repeat": "http_client_peer_name", - "repeatDirection": "h", - "title": "HTTP Client ($http_client_peer_name)", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "dark-green", - "mode": "continuous-GrYlRd", - "seriesBy": "max" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 50, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - } - ] - }, - "unit": "ms" - }, - "overrides": [] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 40 - }, - "id": 23, - "options": { - "legend": { - "calcs": [ - "lastNotNull", - "min", - "max" - ], - "displayMode": "table", - "placement": "right", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.50, sum(rate(http_client_duration_bucket{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\", net_peer_name=\"$http_client_peer_name\"}[$__rate_interval])) by (le))", - "legendFormat": "p50", - "range": true, - "refId": "p50" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.75, sum(rate(http_client_duration_bucket{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\", net_peer_name=\"$http_client_peer_name\"}[$__rate_interval])) by (le))", - "hide": false, - "legendFormat": "p75", - "range": true, - "refId": "p75" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.90, sum(rate(http_client_duration_bucket{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\", net_peer_name=\"$http_client_peer_name\"}[$__rate_interval])) by (le))", - "hide": false, - "legendFormat": "p90", - "range": true, - "refId": "p90" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.95, sum(rate(http_client_duration_bucket{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\", net_peer_name=\"$http_client_peer_name\"}[$__rate_interval])) by (le))", - "hide": false, - "legendFormat": "p95", - "range": true, - "refId": "p95" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.98, sum(rate(http_client_duration_bucket{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\", net_peer_name=\"$http_client_peer_name\"}[$__rate_interval])) by (le))", - "hide": false, - "legendFormat": "p98", - "range": true, - "refId": "p98" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.99, sum(rate(http_client_duration_bucket{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\", net_peer_name=\"$http_client_peer_name\"}[$__rate_interval])) by (le))", - "hide": false, - "legendFormat": "p99", - "range": true, - "refId": "p99" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "histogram_quantile(0.999, sum(rate(http_client_duration_bucket{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\", net_peer_name=\"$http_client_peer_name\"}[$__rate_interval])) by (le))", - "hide": false, - "legendFormat": "p99.9", - "range": true, - "refId": "p99.9" - } - ], - "title": "Requests Duration", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic", - "seriesBy": "max" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 50, - "gradientMode": "opacity", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - } - ] - }, - "unit": "percentunit" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "All" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-orange", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "4XX" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "light-yellow", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "5XX" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 40 - }, - "id": 25, - "options": { - "legend": { - "calcs": [ - "lastNotNull", - "min", - "max" - ], - "displayMode": "table", - "placement": "right", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "sum(rate(http_client_duration_bucket{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\", net_peer_name=\"$http_client_peer_name\", http_status_code!~\"2..\"}[$__rate_interval]) or vector(0)) / sum(rate(http_client_duration_bucket{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\", net_peer_name=\"$http_client_peer_name\"}[$__rate_interval]))", - "legendFormat": "All", - "range": true, - "refId": "All" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "sum(rate(http_client_duration_bucket{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\", net_peer_name=\"$http_client_peer_name\", http_status_code=~\"4..\"}[$__rate_interval]) or vector(0)) / sum(rate(http_client_duration_bucket{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\", net_peer_name=\"$http_client_peer_name\"}[$__rate_interval]))", - "hide": false, - "legendFormat": "4XX", - "range": true, - "refId": "4XX" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "editorMode": "code", - "expr": "sum(rate(http_client_duration_bucket{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\", net_peer_name=\"$http_client_peer_name\", http_status_code=~\"5..\"}[$__rate_interval]) or vector(0)) / sum(rate(http_client_duration_bucket{exported_job=\"$exported_job\", exported_instance=\"$exported_instance\", net_peer_name=\"$http_client_peer_name\"}[$__rate_interval]))", - "hide": false, - "legendFormat": "5XX", - "range": true, - "refId": "5XX" - } - ], - "title": "Errors Rate", - "type": "timeseries" - } - ], - "refresh": "1m", - "schemaVersion": 38, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "current": { - "selected": false, - "text": "FST.TAG.Manager", - "value": "FST.TAG.Manager" - }, - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "definition": "label_values(process_runtime_dotnet_gc_collections_count,exported_job)", - "hide": 0, - "includeAll": false, - "label": "Job", - "multi": false, - "name": "exported_job", - "options": [], - "query": { - "query": "label_values(process_runtime_dotnet_gc_collections_count,exported_job)", - "refId": "PrometheusVariableQueryEditor-VariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "type": "query" - }, - { - "current": { - "selected": false, - "text": "39230ae2-5527-47b3-b546-6f8d4cfc9ab0", - "value": "39230ae2-5527-47b3-b546-6f8d4cfc9ab0" - }, - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "definition": "label_values(process_runtime_dotnet_gc_collections_count{exported_job=~\"$exported_job\"},exported_instance)", - "hide": 0, - "includeAll": false, - "label": "Instance", - "multi": false, - "name": "exported_instance", - "options": [], - "query": { - "query": "label_values(process_runtime_dotnet_gc_collections_count{exported_job=~\"$exported_job\"},exported_instance)", - "refId": "PrometheusVariableQueryEditor-VariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "type": "query" - }, - { - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "prometheus", - "uid": "prom" - }, - "definition": "label_values(http_client_duration_bucket{exported_job=~\"$exported_job\",exported_instance=~\"$exported_instance\"},net_peer_name)", - "hide": 2, - "includeAll": true, - "label": "HTTP Client Pear Name", - "multi": false, - "name": "http_client_peer_name", - "options": [], - "query": { - "query": "label_values(http_client_duration_bucket{exported_job=~\"$exported_job\",exported_instance=~\"$exported_instance\"},net_peer_name)", - "refId": "PrometheusVariableQueryEditor-VariableQuery" - }, - "refresh": 2, - "regex": "", - "skipUrlSync": false, - "sort": 5, - "type": "query" - } - ] - }, - "time": { - "from": "now-5m", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "ASP.NET OTEL Metrics", - "uid": "bc47b423-0b3c-4538-8e20-f84f84deefe5", - "version": 6, - "weekStart": "" -} \ No newline at end of file diff --git a/compose/grafana/dashboards/logs-dashboard.json b/compose/grafana/dashboards/logs-dashboard.json deleted file mode 100644 index f4ddf3b973..0000000000 --- a/compose/grafana/dashboards/logs-dashboard.json +++ /dev/null @@ -1,334 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": false, - "tags": [], - "type": "dashboard" - }, - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "links": [], - "liveNow": false, - "panels": [ - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 6, - "panels": [], - "title": "Logs by Level", - "type": "row" - }, - { - "datasource": { - "type": "loki", - "uid": "loki" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 1, - "drawStyle": "bars", - "fillOpacity": 100, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "stepBefore", - "lineStyle": { - "fill": "solid" - }, - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 24, - "x": 0, - "y": 1 - }, - "id": 3, - "interval": "1m", - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "loki", - "uid": "loki" - }, - "editorMode": "code", - "expr": "sum by (level) (count_over_time({service_name=\"$service_name\", level=~\"$level\"} [$__interval]))", - "legendFormat": "{{level}}", - "queryType": "range", - "refId": "A" - } - ], - "title": "Log Volume", - "type": "timeseries" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 9 - }, - "id": 5, - "panels": [], - "title": "Logs Detailed Information", - "type": "row" - }, - { - "datasource": { - "type": "loki", - "uid": "loki" - }, - "gridPos": { - "h": 11, - "w": 24, - "x": 0, - "y": 10 - }, - "id": 2, - "options": { - "dedupStrategy": "none", - "enableLogDetails": true, - "prettifyLogMessage": false, - "showCommonLabels": false, - "showLabels": false, - "showTime": true, - "sortOrder": "Descending", - "wrapLogMessage": false - }, - "pluginVersion": "9.3.2", - "targets": [ - { - "datasource": { - "type": "loki", - "uid": "loki" - }, - "editorMode": "code", - "expr": "{service_name=\"$service_name\", severity_text=~\"$level\"} |=\"$search\" | line_format `[{{ .severity_text }}] {{ .message_template_text }}`", - "queryType": "range", - "refId": "A" - } - ], - "title": "Logs", - "type": "logs" - }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 21 - }, - "id": 4, - "panels": [], - "title": "Logs with TraceId Link", - "type": "row" - }, - { - "datasource": { - "type": "loki", - "uid": "loki" - }, - "gridPos": { - "h": 13, - "w": 24, - "x": 0, - "y": 22 - }, - "id": 7, - "options": { - "dedupStrategy": "none", - "enableLogDetails": true, - "prettifyLogMessage": false, - "showCommonLabels": false, - "showLabels": false, - "showTime": false, - "sortOrder": "Descending", - "wrapLogMessage": false - }, - "targets": [ - { - "datasource": { - "type": "loki", - "uid": "loki" - }, - "editorMode": "code", - "expr": "{service_name=\"$service_name\", level=~\"$level\"} |=\"$search\" | json ", - "key": "Q-b242453d-acff-49f2-9239-12ceaf57fa43-0", - "queryType": "range", - "refId": "A" - } - ], - "title": "Log Entries with Trace Link", - "type": "logs" - } - ], - "refresh": "", - "schemaVersion": 39, - "tags": [], - "templating": { - "list": [ - { - "current": { - "selected": false, - "text": "FSH.Starter.WebApi.Host", - "value": "FSH.Starter.WebApi.Host" - }, - "datasource": { - "type": "loki", - "uid": "loki" - }, - "definition": "", - "hide": 0, - "includeAll": false, - "label": "Service", - "multi": false, - "name": "service_name", - "options": [], - "query": { - "label": "service_name", - "refId": "LokiVariableQueryEditor-VariableQuery", - "stream": "", - "type": 1 - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "type": "query" - }, - { - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": { - "type": "loki", - "uid": "loki" - }, - "definition": "", - "hide": 0, - "includeAll": true, - "multi": false, - "name": "level", - "options": [], - "query": { - "label": "severity_text", - "refId": "LokiVariableQueryEditor-VariableQuery", - "stream": "", - "type": 1 - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "type": "query" - }, - { - "current": { - "selected": false, - "text": "", - "value": "" - }, - "hide": 0, - "label": "Search Text", - "name": "search", - "options": [ - { - "selected": true, - "text": "", - "value": "" - } - ], - "query": "", - "skipUrlSync": false, - "type": "textbox" - } - ] - }, - "time": { - "from": "now-15m", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "Logs", - "uid": "f4463c33-40c8-4def-aac2-95d365040f2e", - "version": 1, - "weekStart": "" -} \ No newline at end of file diff --git a/compose/grafana/dashboards/node-exporter.json b/compose/grafana/dashboards/node-exporter.json deleted file mode 100644 index cb734d8060..0000000000 --- a/compose/grafana/dashboards/node-exporter.json +++ /dev/null @@ -1,23870 +0,0 @@ -{ - "annotations": { - "list": [ - { - "$$hashKey": "object:1058", - "builtIn": 1, - "datasource": { - "type": "datasource", - "uid": "grafana" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "target": { - "limit": 100, - "matchAny": false, - "tags": [], - "type": "dashboard" - }, - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "gnetId": 1860, - "graphTooltip": 1, - "id": 8, - "links": [ - { - "icon": "external link", - "tags": [], - "targetBlank": true, - "title": "GitHub", - "type": "link", - "url": "https://github.com/rfmoz/grafana-dashboards" - }, - { - "icon": "external link", - "tags": [], - "targetBlank": true, - "title": "Grafana", - "type": "link", - "url": "https://grafana.com/grafana/dashboards/1860" - } - ], - "liveNow": false, - "panels": [ - { - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 261, - "panels": [], - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "refId": "A" - } - ], - "title": "Quick CPU / Mem / Disk", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Resource pressure via PSI", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "decimals": 1, - "links": [], - "mappings": [], - "max": 1, - "min": 0, - "thresholds": { - "mode": "percentage", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "dark-yellow", - "value": 70 - }, - { - "color": "dark-red", - "value": 90 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 0, - "y": 1 - }, - "id": 323, - "options": { - "displayMode": "basic", - "maxVizHeight": 300, - "minVizHeight": 10, - "minVizWidth": 0, - "namePlacement": "auto", - "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showUnfilled": true, - "sizing": "auto", - "text": {}, - "valueMode": "color" - }, - "pluginVersion": "11.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "exemplar": false, - "expr": "irate(node_pressure_cpu_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "instant": true, - "intervalFactor": 1, - "legendFormat": "CPU", - "range": false, - "refId": "CPU some", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "exemplar": false, - "expr": "irate(node_pressure_memory_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "hide": false, - "instant": true, - "intervalFactor": 1, - "legendFormat": "Mem", - "range": false, - "refId": "Memory some", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "exemplar": false, - "expr": "irate(node_pressure_io_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "hide": false, - "instant": true, - "intervalFactor": 1, - "legendFormat": "I/O", - "range": false, - "refId": "I/O some", - "step": 240 - } - ], - "title": "Pressure", - "type": "bargauge" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Busy state of all CPU cores together", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "decimals": 1, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "rgba(50, 172, 45, 0.97)", - "value": null - }, - { - "color": "rgba(237, 129, 40, 0.89)", - "value": 85 - }, - { - "color": "rgba(245, 54, 54, 0.9)", - "value": 95 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 3, - "y": 1 - }, - "id": 20, - "options": { - "minVizHeight": 75, - "minVizWidth": 75, - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true, - "sizing": "auto" - }, - "pluginVersion": "11.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "exemplar": false, - "expr": "100 * (1 - avg(rate(node_cpu_seconds_total{mode=\"idle\", instance=\"$node\"}[$__rate_interval])))", - "hide": false, - "instant": true, - "intervalFactor": 1, - "legendFormat": "", - "range": false, - "refId": "A", - "step": 240 - } - ], - "title": "CPU Busy", - "type": "gauge" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "System load over all CPU cores together", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "decimals": 1, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "rgba(50, 172, 45, 0.97)", - "value": null - }, - { - "color": "rgba(237, 129, 40, 0.89)", - "value": 85 - }, - { - "color": "rgba(245, 54, 54, 0.9)", - "value": 95 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 6, - "y": 1 - }, - "id": 155, - "options": { - "minVizHeight": 75, - "minVizWidth": 75, - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true, - "sizing": "auto" - }, - "pluginVersion": "11.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "exemplar": false, - "expr": "scalar(node_load1{instance=\"$node\",job=\"$job\"}) * 100 / count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu))", - "format": "time_series", - "hide": false, - "instant": true, - "intervalFactor": 1, - "range": false, - "refId": "A", - "step": 240 - } - ], - "title": "Sys Load", - "type": "gauge" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Non available RAM memory", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "decimals": 1, - "mappings": [], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "rgba(50, 172, 45, 0.97)", - "value": null - }, - { - "color": "rgba(237, 129, 40, 0.89)", - "value": 80 - }, - { - "color": "rgba(245, 54, 54, 0.9)", - "value": 90 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 9, - "y": 1 - }, - "hideTimeOverride": false, - "id": 16, - "options": { - "minVizHeight": 75, - "minVizWidth": 75, - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true, - "sizing": "auto" - }, - "pluginVersion": "11.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "exemplar": false, - "expr": "((node_memory_MemTotal_bytes{instance=\"$node\", job=\"$job\"} - node_memory_MemFree_bytes{instance=\"$node\", job=\"$job\"}) / node_memory_MemTotal_bytes{instance=\"$node\", job=\"$job\"}) * 100", - "format": "time_series", - "hide": true, - "instant": true, - "intervalFactor": 1, - "range": false, - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "exemplar": false, - "expr": "(1 - (node_memory_MemAvailable_bytes{instance=\"$node\", job=\"$job\"} / node_memory_MemTotal_bytes{instance=\"$node\", job=\"$job\"})) * 100", - "format": "time_series", - "hide": false, - "instant": true, - "intervalFactor": 1, - "range": false, - "refId": "B", - "step": 240 - } - ], - "title": "RAM Used", - "type": "gauge" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Used Swap", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "decimals": 1, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "rgba(50, 172, 45, 0.97)", - "value": null - }, - { - "color": "rgba(237, 129, 40, 0.89)", - "value": 10 - }, - { - "color": "rgba(245, 54, 54, 0.9)", - "value": 25 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 12, - "y": 1 - }, - "id": 21, - "options": { - "minVizHeight": 75, - "minVizWidth": 75, - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true, - "sizing": "auto" - }, - "pluginVersion": "11.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "exemplar": false, - "expr": "((node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapFree_bytes{instance=\"$node\",job=\"$job\"}) / (node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"})) * 100", - "instant": true, - "intervalFactor": 1, - "range": false, - "refId": "A", - "step": 240 - } - ], - "title": "SWAP Used", - "type": "gauge" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Used Root FS", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "decimals": 1, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "rgba(50, 172, 45, 0.97)", - "value": null - }, - { - "color": "rgba(237, 129, 40, 0.89)", - "value": 80 - }, - { - "color": "rgba(245, 54, 54, 0.9)", - "value": 90 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 15, - "y": 1 - }, - "id": 154, - "options": { - "minVizHeight": 75, - "minVizWidth": 75, - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true, - "sizing": "auto" - }, - "pluginVersion": "11.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "exemplar": false, - "expr": "100 - ((node_filesystem_avail_bytes{instance=\"$node\",job=\"$job\",mountpoint=\"/\",fstype!=\"rootfs\"} * 100) / node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",mountpoint=\"/\",fstype!=\"rootfs\"})", - "format": "time_series", - "instant": true, - "intervalFactor": 1, - "range": false, - "refId": "A", - "step": 240 - } - ], - "title": "Root FS Used", - "type": "gauge" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Total number of CPU cores", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 2, - "w": 2, - "x": 18, - "y": 1 - }, - "id": 14, - "maxDataPoints": 100, - "options": { - "colorMode": "none", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "horizontal", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "11.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "exemplar": false, - "expr": "count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu))", - "instant": true, - "legendFormat": "__auto", - "range": false, - "refId": "A" - } - ], - "title": "CPU Cores", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "System uptime", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "decimals": 1, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "s" - }, - "overrides": [] - }, - "gridPos": { - "h": 2, - "w": 4, - "x": 20, - "y": 1 - }, - "hideTimeOverride": true, - "id": 15, - "maxDataPoints": 100, - "options": { - "colorMode": "none", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "horizontal", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "11.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "exemplar": false, - "expr": "node_time_seconds{instance=\"$node\",job=\"$job\"} - node_boot_time_seconds{instance=\"$node\",job=\"$job\"}", - "instant": true, - "intervalFactor": 1, - "range": false, - "refId": "A", - "step": 240 - } - ], - "title": "Uptime", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Total RootFS", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "decimals": 0, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "rgba(50, 172, 45, 0.97)", - "value": null - }, - { - "color": "rgba(237, 129, 40, 0.89)", - "value": 70 - }, - { - "color": "rgba(245, 54, 54, 0.9)", - "value": 90 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 2, - "w": 2, - "x": 18, - "y": 3 - }, - "id": 23, - "maxDataPoints": 100, - "options": { - "colorMode": "none", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "horizontal", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "11.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "exemplar": false, - "expr": "node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",mountpoint=\"/\",fstype!=\"rootfs\"}", - "format": "time_series", - "hide": false, - "instant": true, - "intervalFactor": 1, - "range": false, - "refId": "A", - "step": 240 - } - ], - "title": "RootFS Total", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Total RAM", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "decimals": 0, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 2, - "w": 2, - "x": 20, - "y": 3 - }, - "id": 75, - "maxDataPoints": 100, - "options": { - "colorMode": "none", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "horizontal", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "11.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "exemplar": false, - "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"}", - "instant": true, - "intervalFactor": 1, - "range": false, - "refId": "A", - "step": 240 - } - ], - "title": "RAM Total", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Total SWAP", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "decimals": 0, - "mappings": [ - { - "options": { - "match": "null", - "result": { - "text": "N/A" - } - }, - "type": "special" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 2, - "w": 2, - "x": 22, - "y": 3 - }, - "id": 18, - "maxDataPoints": 100, - "options": { - "colorMode": "none", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "horizontal", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "11.1.1", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "exemplar": false, - "expr": "node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"}", - "instant": true, - "intervalFactor": 1, - "range": false, - "refId": "A", - "step": 240 - } - ], - "title": "SWAP Total", - "type": "stat" - }, - { - "collapsed": false, - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 5 - }, - "id": 263, - "panels": [], - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "refId": "A" - } - ], - "title": "Basic CPU / Mem / Net / Disk", - "type": "row" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Basic CPU info", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 40, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "percent" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Busy Iowait" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#890F02", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Idle" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Busy Iowait" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#890F02", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Idle" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#7EB26D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Busy System" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Busy User" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A437C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Busy Other" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6D1F62", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 6 - }, - "id": 77, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true, - "width": 250 - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "exemplar": false, - "expr": "sum(irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"system\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", - "format": "time_series", - "hide": false, - "instant": false, - "intervalFactor": 1, - "legendFormat": "Busy System", - "range": true, - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum(irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"user\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "Busy User", - "range": true, - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum(irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"iowait\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Busy Iowait", - "range": true, - "refId": "C", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum(irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=~\".*irq\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Busy IRQs", - "range": true, - "refId": "D", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum(irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode!='idle',mode!='user',mode!='system',mode!='iowait',mode!='irq',mode!='softirq'}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Busy Other", - "range": true, - "refId": "E", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum(irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"idle\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Idle", - "range": true, - "refId": "F", - "step": 240 - } - ], - "title": "CPU Basic", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Basic memory usage", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 40, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Apps" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#629E51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Buffers" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#614D93", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6D1F62", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cached" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Committed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#508642", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A437C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#CFFAFF", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Inactive" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#584477", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "PageTables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Page_Tables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "RAM_Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0F9D7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "SWAP Used" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#806EB7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0752D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap Used" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#C15C17", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#2F575E", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Unused" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "RAM Total" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0F9D7", - "mode": "fixed" - } - }, - { - "id": "custom.fillOpacity", - "value": 0 - }, - { - "id": "custom.stacking", - "value": { - "group": false, - "mode": "normal" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "RAM Cache + Buffer" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "RAM Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#7EB26D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Available" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#DEDAF7", - "mode": "fixed" - } - }, - { - "id": "custom.fillOpacity", - "value": 0 - }, - { - "id": "custom.stacking", - "value": { - "group": false, - "mode": "normal" - } - } - ] - } - ] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 6 - }, - "id": 78, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true, - "width": 350 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "RAM Total", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"} - (node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"} + node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"} + node_memory_SReclaimable_bytes{instance=\"$node\",job=\"$job\"})", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "RAM Used", - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"} + node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"} + node_memory_SReclaimable_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "RAM Cache + Buffer", - "refId": "C", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "RAM Free", - "refId": "D", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "(node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapFree_bytes{instance=\"$node\",job=\"$job\"})", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "SWAP Used", - "refId": "E", - "step": 240 - } - ], - "title": "Memory Basic", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Basic network info per interface", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 40, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bps" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Recv_bytes_eth2" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#7EB26D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Recv_bytes_lo" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Recv_drop_eth2" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6ED0E0", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Recv_drop_lo" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0F9D7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Recv_errs_eth2" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Recv_errs_lo" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#CCA300", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Trans_bytes_eth2" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#7EB26D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Trans_bytes_lo" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Trans_drop_eth2" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6ED0E0", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Trans_drop_lo" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0F9D7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Trans_errs_eth2" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Trans_errs_lo" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#CCA300", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "recv_bytes_lo" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "recv_drop_eth0" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#99440A", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "recv_drop_lo" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#967302", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "recv_errs_eth0" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "recv_errs_lo" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#890F02", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "trans_bytes_eth0" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#7EB26D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "trans_bytes_lo" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "trans_drop_eth0" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#99440A", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "trans_drop_lo" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#967302", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "trans_errs_eth0" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "trans_errs_lo" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#890F02", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*trans.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - } - ] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 13 - }, - "id": 74, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_network_receive_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])*8", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "recv {{device}}", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_network_transmit_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])*8", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "trans {{device}} ", - "refId": "B", - "step": 240 - } - ], - "title": "Network Traffic Basic", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Disk space used of all filesystems mounted", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 40, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 13 - }, - "id": 152, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "100 - ((node_filesystem_avail_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'} * 100) / node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'})", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{mountpoint}}", - "refId": "A", - "step": 240 - } - ], - "title": "Disk Space Used Basic", - "type": "timeseries" - }, - { - "collapsed": true, - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 20 - }, - "id": 265, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "percentage", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 70, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "percent" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Idle - Waiting for something to happen" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Iowait - Waiting for I/O to complete" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Irq - Servicing interrupts" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Nice - Niced processes executing in user mode" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#C15C17", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Softirq - Servicing softirqs" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E24D42", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Steal - Time spent in other operating systems when running in a virtualized environment" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#FCE2DE", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "System - Processes executing in kernel mode" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#508642", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "User - Normal processes executing in user mode" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#5195CE", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 12, - "w": 12, - "x": 0, - "y": 21 - }, - "id": 3, - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 250 - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum(irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"system\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "System - Processes executing in kernel mode", - "range": true, - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum(irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"user\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "User - Normal processes executing in user mode", - "range": true, - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum(irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"nice\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Nice - Niced processes executing in user mode", - "range": true, - "refId": "C", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum by(instance) (irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"iowait\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Iowait - Waiting for I/O to complete", - "range": true, - "refId": "E", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum(irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"irq\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Irq - Servicing interrupts", - "range": true, - "refId": "F", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum(irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"softirq\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Softirq - Servicing softirqs", - "range": true, - "refId": "G", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum(irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"steal\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Steal - Time spent in other operating systems when running in a virtualized environment", - "range": true, - "refId": "H", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum(irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\", mode=\"idle\"}[$__rate_interval])) / scalar(count(count(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}) by (cpu)))", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "Idle - Waiting for something to happen", - "range": true, - "refId": "J", - "step": 240 - } - ], - "title": "CPU", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "bytes", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 40, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Apps" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#629E51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Buffers" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#614D93", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6D1F62", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cached" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Committed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#508642", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A437C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#CFFAFF", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Inactive" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#584477", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "PageTables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Page_Tables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "RAM_Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0F9D7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#806EB7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0752D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap - Swap memory usage" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#C15C17", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#2F575E", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Unused" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Unused - Free memory unassigned" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*Hardware Corrupted - *./" - }, - "properties": [ - { - "id": "custom.stacking", - "value": { - "group": false, - "mode": "normal" - } - } - ] - } - ] - }, - "gridPos": { - "h": 12, - "w": 12, - "x": 12, - "y": 21 - }, - "id": 24, - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 350 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_MemTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"} - node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"} - node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"} - node_memory_Slab_bytes{instance=\"$node\",job=\"$job\"} - node_memory_PageTables_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapCached_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "Apps - Memory used by user-space applications", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_PageTables_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "PageTables - Memory used to map between virtual and physical memory addresses", - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_SwapCached_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "SwapCache - Memory that keeps track of pages that have been fetched from swap but not yet been modified", - "refId": "C", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_Slab_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "Slab - Memory used by the kernel to cache data structures for its own use (caches like inode, dentry, etc)", - "refId": "D", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_Cached_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "Cache - Parked file data (file content) cache", - "refId": "E", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_Buffers_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "Buffers - Block device (e.g. harddisk) cache", - "refId": "F", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_MemFree_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "Unused - Free memory unassigned", - "refId": "G", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "(node_memory_SwapTotal_bytes{instance=\"$node\",job=\"$job\"} - node_memory_SwapFree_bytes{instance=\"$node\",job=\"$job\"})", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "Swap - Swap space used", - "refId": "H", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_HardwareCorrupted_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working", - "refId": "I", - "step": 240 - } - ], - "title": "Memory Stack", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "bits out (-) / in (+)", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 40, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bps" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "receive_packets_eth0" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#7EB26D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "receive_packets_lo" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E24D42", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "transmit_packets_eth0" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#7EB26D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "transmit_packets_lo" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E24D42", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*Trans.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - } - ] - }, - "gridPos": { - "h": 12, - "w": 12, - "x": 0, - "y": 33 - }, - "id": 84, - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_network_receive_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])*8", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{device}} - Receive", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_network_transmit_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])*8", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{device}} - Transmit", - "refId": "B", - "step": 240 - } - ], - "title": "Network Traffic", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "bytes", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 40, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 12, - "w": 12, - "x": 12, - "y": 33 - }, - "id": 156, - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'} - node_filesystem_avail_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{mountpoint}}", - "refId": "A", - "step": 240 - } - ], - "title": "Disk Space Used", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "IO read (-) / write (+)", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "iops" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Read.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#7EB26D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6ED0E0", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EF843C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E24D42", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#584477", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda2_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BA43A9", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda3_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F4D598", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0752D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#962D82", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#614D93", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#9AC48A", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#65C5DB", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F9934E", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0F9D7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#FCEACA", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F9E2D2", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 12, - "w": 12, - "x": 0, - "y": 45 - }, - "id": 229, - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_disk_reads_completed_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"}[$__rate_interval])", - "intervalFactor": 4, - "legendFormat": "{{device}} - Reads completed", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_disk_writes_completed_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"}[$__rate_interval])", - "intervalFactor": 1, - "legendFormat": "{{device}} - Writes completed", - "refId": "B", - "step": 240 - } - ], - "title": "Disk IOps", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "bytes read (-) / write (+)", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 40, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "Bps" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "io time" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#890F02", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*read*./" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#7EB26D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6ED0E0", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EF843C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E24D42", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byType", - "options": "time" - }, - "properties": [ - { - "id": "custom.axisPlacement", - "value": "hidden" - } - ] - } - ] - }, - "gridPos": { - "h": 12, - "w": 12, - "x": 12, - "y": 45 - }, - "id": 42, - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_disk_read_bytes_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"}[$__rate_interval])", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "{{device}} - Successfully read bytes", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_disk_written_bytes_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"}[$__rate_interval])", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "{{device}} - Successfully written bytes", - "refId": "B", - "step": 240 - } - ], - "title": "I/O Usage Read / Write", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "%util", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 40, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "io time" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#890F02", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byType", - "options": "time" - }, - "properties": [ - { - "id": "custom.axisPlacement", - "value": "hidden" - } - ] - } - ] - }, - "gridPos": { - "h": 12, - "w": 12, - "x": 0, - "y": 57 - }, - "id": 127, - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_disk_io_time_seconds_total{instance=\"$node\",job=\"$job\",device=~\"$diskdevices\"} [$__rate_interval])", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{device}}", - "refId": "A", - "step": 240 - } - ], - "title": "I/O Utilization", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "percentage", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "bars", - "fillOpacity": 70, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 3, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "max": 1, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/^Guest - /" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#5195ce", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/^GuestNice - /" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#c15c17", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 12, - "w": 12, - "x": 12, - "y": 57 - }, - "id": 319, - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum by(instance) (irate(node_cpu_guest_seconds_total{instance=\"$node\",job=\"$job\", mode=\"user\"}[1m])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[1m])))", - "hide": false, - "legendFormat": "Guest - Time spent running a virtual CPU for a guest operating system", - "range": true, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "sum by(instance) (irate(node_cpu_guest_seconds_total{instance=\"$node\",job=\"$job\", mode=\"nice\"}[1m])) / on(instance) group_left sum by (instance)((irate(node_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[1m])))", - "hide": false, - "legendFormat": "GuestNice - Time spent running a niced guest (virtual CPU for guest operating system)", - "range": true, - "refId": "B" - } - ], - "title": "CPU spent seconds in guests (VMs)", - "type": "timeseries" - } - ], - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "refId": "A" - } - ], - "title": "CPU / Memory / Net / Disk", - "type": "row" - }, - { - "collapsed": true, - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 21 - }, - "id": 266, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "bytes", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Apps" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#629E51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Buffers" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#614D93", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6D1F62", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cached" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Committed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#508642", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A437C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#CFFAFF", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Inactive" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#584477", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "PageTables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Page_Tables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "RAM_Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0F9D7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#806EB7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0752D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#C15C17", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#2F575E", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Unused" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 22 - }, - "id": 136, - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 350 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_Inactive_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Inactive - Memory which has been less recently used. It is more eligible to be reclaimed for other purposes", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_Active_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Active - Memory that has been used more recently and usually not reclaimed unless absolutely necessary", - "refId": "B", - "step": 240 - } - ], - "title": "Memory Active / Inactive", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "bytes", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Apps" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#629E51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Buffers" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#614D93", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6D1F62", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cached" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Committed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#508642", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A437C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#CFFAFF", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Inactive" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#584477", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "PageTables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Page_Tables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "RAM_Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0F9D7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#806EB7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0752D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#C15C17", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#2F575E", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Unused" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*CommitLimit - *./" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - }, - { - "id": "custom.fillOpacity", - "value": 0 - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 22 - }, - "id": 135, - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 350 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_Committed_AS_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Committed_AS - Amount of memory presently allocated on the system", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_CommitLimit_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "CommitLimit - Amount of memory currently available to be allocated on the system", - "refId": "B", - "step": 240 - } - ], - "title": "Memory Committed", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "bytes", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Apps" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#629E51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Buffers" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#614D93", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6D1F62", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cached" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Committed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#508642", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A437C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#CFFAFF", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Inactive" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#584477", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "PageTables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Page_Tables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "RAM_Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0F9D7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#806EB7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0752D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#C15C17", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#2F575E", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Unused" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 32 - }, - "id": 191, - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 350 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_Inactive_file_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "Inactive_file - File-backed memory on inactive LRU list", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_Inactive_anon_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "Inactive_anon - Anonymous and swap cache on inactive LRU list, including tmpfs (shmem)", - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_Active_file_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "Active_file - File-backed memory on active LRU list", - "refId": "C", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_Active_anon_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "Active_anon - Anonymous and swap cache on active least-recently-used (LRU) list, including tmpfs", - "refId": "D", - "step": 240 - } - ], - "title": "Memory Active / Inactive Detail", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "bytes", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Active" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#99440A", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Buffers" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#58140C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6D1F62", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cached" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Committed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#508642", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Dirty" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6ED0E0", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#B7DBAB", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Inactive" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Mapped" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "PageTables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Page_Tables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#C15C17", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total RAM" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total RAM + Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#614D93", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "VmallocUsed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 32 - }, - "id": 130, - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_Writeback_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Writeback - Memory which is actively being written back to disk", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_WritebackTmp_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "WritebackTmp - Memory used by FUSE for temporary writeback buffers", - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_Dirty_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Dirty - Memory which is waiting to get written back to the disk", - "refId": "C", - "step": 240 - } - ], - "title": "Memory Writeback and Dirty", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "bytes", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Apps" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#629E51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Buffers" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#614D93", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6D1F62", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cached" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Committed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#508642", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A437C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#CFFAFF", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Inactive" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#584477", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "PageTables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Page_Tables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "RAM_Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0F9D7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#806EB7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0752D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#C15C17", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#2F575E", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Unused" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "ShmemHugePages - Memory used by shared memory (shmem) and tmpfs allocated with huge pages" - }, - "properties": [ - { - "id": "custom.fillOpacity", - "value": 0 - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "ShmemHugePages - Memory used by shared memory (shmem) and tmpfs allocated with huge pages" - }, - "properties": [ - { - "id": "custom.fillOpacity", - "value": 0 - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 42 - }, - "id": 138, - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 350 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_Mapped_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Mapped - Used memory in mapped pages files which have been mapped, such as libraries", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_Shmem_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Shmem - Used shared memory (shared between several processes, thus including RAM disks)", - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_ShmemHugePages_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "ShmemHugePages - Memory used by shared memory (shmem) and tmpfs allocated with huge pages", - "refId": "C", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_ShmemPmdMapped_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "ShmemPmdMapped - Amount of shared (shmem/tmpfs) memory backed by huge pages", - "refId": "D", - "step": 240 - } - ], - "title": "Memory Shared and Mapped", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "bytes", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Active" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#99440A", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Buffers" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#58140C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6D1F62", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cached" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Committed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#508642", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Dirty" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6ED0E0", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#B7DBAB", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Inactive" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Mapped" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "PageTables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Page_Tables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#C15C17", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total RAM" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total RAM + Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#614D93", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "VmallocUsed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 42 - }, - "id": 131, - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_SUnreclaim_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "SUnreclaim - Part of Slab, that cannot be reclaimed on memory pressure", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_SReclaimable_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "SReclaimable - Part of Slab, that might be reclaimed, such as caches", - "refId": "B", - "step": 240 - } - ], - "title": "Memory Slab", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "bytes", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Active" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#99440A", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Buffers" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#58140C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6D1F62", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cached" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Committed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#508642", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Dirty" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6ED0E0", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#B7DBAB", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Inactive" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Mapped" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "PageTables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Page_Tables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#C15C17", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total RAM" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total RAM + Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "VmallocUsed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 52 - }, - "id": 70, - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_VmallocChunk_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "VmallocChunk - Largest contiguous block of vmalloc area which is free", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_VmallocTotal_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "VmallocTotal - Total size of vmalloc memory area", - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_VmallocUsed_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "VmallocUsed - Amount of vmalloc area which is used", - "refId": "C", - "step": 240 - } - ], - "title": "Memory Vmalloc", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "bytes", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Apps" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#629E51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Buffers" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#614D93", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6D1F62", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cached" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Committed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#508642", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A437C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#CFFAFF", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Inactive" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#584477", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "PageTables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Page_Tables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "RAM_Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0F9D7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#806EB7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0752D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#C15C17", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#2F575E", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Unused" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 52 - }, - "id": 159, - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 350 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_Bounce_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Bounce - Memory used for block device bounce buffers", - "refId": "A", - "step": 240 - } - ], - "title": "Memory Bounce", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "bytes", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Active" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#99440A", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Buffers" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#58140C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6D1F62", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cached" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Committed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#508642", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Dirty" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6ED0E0", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#B7DBAB", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Inactive" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Mapped" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "PageTables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Page_Tables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#C15C17", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total RAM" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total RAM + Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "VmallocUsed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*Inactive *./" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 62 - }, - "id": 129, - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_AnonHugePages_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "AnonHugePages - Memory in anonymous huge pages", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_AnonPages_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "AnonPages - Memory in user pages not backed by files", - "refId": "B", - "step": 240 - } - ], - "title": "Memory Anonymous", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "bytes", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Apps" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#629E51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Buffers" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#614D93", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6D1F62", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cached" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Committed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#508642", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A437C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#CFFAFF", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Inactive" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#584477", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "PageTables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Page_Tables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "RAM_Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0F9D7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#806EB7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0752D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#C15C17", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#2F575E", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Unused" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 62 - }, - "id": 160, - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 350 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_KernelStack_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "KernelStack - Kernel memory stack. This is not reclaimable", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_Percpu_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "PerCPU - Per CPU memory allocated dynamically by loadable modules", - "refId": "B", - "step": 240 - } - ], - "title": "Memory Kernel / CPU", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "pages", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Active" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#99440A", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Buffers" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#58140C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6D1F62", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cached" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Committed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#508642", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Dirty" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6ED0E0", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#B7DBAB", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Inactive" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Mapped" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "PageTables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Page_Tables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#C15C17", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total RAM" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#806EB7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total RAM + Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#806EB7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "VmallocUsed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 72 - }, - "id": 140, - "options": { - "legend": { - "calcs": [ - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_HugePages_Free{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "HugePages_Free - Huge pages in the pool that are not yet allocated", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_HugePages_Rsvd{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "HugePages_Rsvd - Huge pages for which a commitment to allocate from the pool has been made, but no allocation has yet been made", - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_HugePages_Surp{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "HugePages_Surp - Huge pages in the pool above the value in /proc/sys/vm/nr_hugepages", - "refId": "C", - "step": 240 - } - ], - "title": "Memory HugePages Counter", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "bytes", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Active" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#99440A", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Buffers" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#58140C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6D1F62", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cached" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Committed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#508642", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Dirty" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6ED0E0", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#B7DBAB", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Inactive" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Mapped" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "PageTables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Page_Tables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#C15C17", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total RAM" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#806EB7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total RAM + Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#806EB7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "VmallocUsed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 72 - }, - "id": 71, - "options": { - "legend": { - "calcs": [ - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_HugePages_Total{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "HugePages - Total size of the pool of huge pages", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_Hugepagesize_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Hugepagesize - Huge Page size", - "refId": "B", - "step": 240 - } - ], - "title": "Memory HugePages Size", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "bytes", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Active" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#99440A", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Buffers" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#58140C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6D1F62", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cached" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Committed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#508642", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Dirty" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6ED0E0", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#B7DBAB", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Inactive" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Mapped" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "PageTables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Page_Tables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#C15C17", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total RAM" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total RAM + Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "VmallocUsed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 82 - }, - "id": 128, - "options": { - "legend": { - "calcs": [ - "mean", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_DirectMap1G_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "DirectMap1G - Amount of pages mapped as this size", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_DirectMap2M_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "DirectMap2M - Amount of pages mapped as this size", - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_DirectMap4k_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "DirectMap4K - Amount of pages mapped as this size", - "refId": "C", - "step": 240 - } - ], - "title": "Memory DirectMap", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "bytes", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Apps" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#629E51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Buffers" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#614D93", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6D1F62", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cached" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Committed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#508642", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A437C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#CFFAFF", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Inactive" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#584477", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "PageTables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Page_Tables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "RAM_Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0F9D7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#806EB7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0752D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#C15C17", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#2F575E", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Unused" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 82 - }, - "id": 137, - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 350 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_Unevictable_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Unevictable - Amount of unevictable memory that can't be swapped out for a variety of reasons", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_Mlocked_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "MLocked - Size of pages locked to memory using the mlock() system call", - "refId": "B", - "step": 240 - } - ], - "title": "Memory Unevictable and MLocked", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "bytes", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Active" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#99440A", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Buffers" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#58140C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6D1F62", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cached" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Committed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#508642", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Dirty" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6ED0E0", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#B7DBAB", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Inactive" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Mapped" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "PageTables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Page_Tables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#C15C17", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total RAM" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total RAM + Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#614D93", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "VmallocUsed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 92 - }, - "id": 132, - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_memory_NFS_Unstable_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "NFS Unstable - Memory in NFS pages sent to the server, but not yet committed to the storage", - "refId": "A", - "step": 240 - } - ], - "title": "Memory NFS", - "type": "timeseries" - } - ], - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "refId": "A" - } - ], - "title": "Memory Meminfo", - "type": "row" - }, - { - "collapsed": true, - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 22 - }, - "id": 267, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "pages out (-) / in (+)", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*out/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 23 - }, - "id": 176, - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_vmstat_pgpgin{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Pagesin - Page in operations", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_vmstat_pgpgout{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Pagesout - Page out operations", - "refId": "B", - "step": 240 - } - ], - "title": "Memory Pages In / Out", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "pages out (-) / in (+)", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*out/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 23 - }, - "id": 22, - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_vmstat_pswpin{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Pswpin - Pages swapped in", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_vmstat_pswpout{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Pswpout - Pages swapped out", - "refId": "B", - "step": 240 - } - ], - "title": "Memory Pages Swap In / Out", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "faults", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Apps" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#629E51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Buffers" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#614D93", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6D1F62", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cached" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Committed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#508642", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A437C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#CFFAFF", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Inactive" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#584477", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "PageTables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Page_Tables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "RAM_Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0F9D7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#806EB7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0752D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#C15C17", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#2F575E", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Unused" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Pgfault - Page major and minor fault operations" - }, - "properties": [ - { - "id": "custom.fillOpacity", - "value": 0 - }, - { - "id": "custom.stacking", - "value": { - "group": false, - "mode": "normal" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 33 - }, - "id": 175, - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 350 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_vmstat_pgfault{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Pgfault - Page major and minor fault operations", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_vmstat_pgmajfault{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Pgmajfault - Major page fault operations", - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_vmstat_pgfault{instance=\"$node\",job=\"$job\"}[$__rate_interval]) - irate(node_vmstat_pgmajfault{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Pgminfault - Minor page fault operations", - "refId": "C", - "step": 240 - } - ], - "title": "Memory Page Faults", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Active" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#99440A", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Buffers" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#58140C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6D1F62", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Cached" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Committed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#508642", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Dirty" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6ED0E0", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Free" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#B7DBAB", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Inactive" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Mapped" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "PageTables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Page_Tables" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Slab_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Swap_Cache" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#C15C17", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#511749", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total RAM" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total RAM + Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#052B51", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total Swap" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#614D93", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "VmallocUsed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 33 - }, - "id": 307, - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_vmstat_oom_kill{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "oom killer invocations ", - "refId": "A", - "step": 240 - } - ], - "title": "OOM Killer", - "type": "timeseries" - } - ], - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "refId": "A" - } - ], - "title": "Memory Vmstat", - "type": "row" - }, - { - "collapsed": true, - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 23 - }, - "id": 293, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "seconds", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "s" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Variation*./" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#890F02", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 260, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_timex_estimated_error_seconds{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "Estimated error in seconds", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_timex_offset_seconds{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "Time offset in between local system and reference clock", - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_timex_maxerror_seconds{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "Maximum error in seconds", - "refId": "C", - "step": 240 - } - ], - "title": "Time Synchronized Drift", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 291, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_timex_loop_time_constant{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Phase-locked loop time adjust", - "refId": "A", - "step": 240 - } - ], - "title": "Time PLL Adjust", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Variation*./" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#890F02", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 34 - }, - "id": 168, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_timex_sync_status{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Is clock synchronized to a reliable server (1 = yes, 0 = no)", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_timex_frequency_adjustment_ratio{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Local clock frequency adjustment", - "refId": "B", - "step": 240 - } - ], - "title": "Time Synchronized Status", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "seconds", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "s" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 34 - }, - "id": 294, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_timex_tick_seconds{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Seconds between clock ticks", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_timex_tai_offset_seconds{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "International Atomic Time (TAI) offset", - "refId": "B", - "step": 240 - } - ], - "title": "Time Misc", - "type": "timeseries" - } - ], - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "refId": "A" - } - ], - "title": "System Timesync", - "type": "row" - }, - { - "collapsed": true, - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 24 - }, - "id": 312, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 73 - }, - "id": 62, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_procs_blocked{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Processes blocked waiting for I/O to complete", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_procs_running{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Processes in runnable state", - "refId": "B", - "step": 240 - } - ], - "title": "Processes Status", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Enable with --collector.processes argument on node-exporter", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 73 - }, - "id": 315, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_processes_state{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{ state }}", - "refId": "A", - "step": 240 - } - ], - "title": "Processes State", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "forks / sec", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 83 - }, - "id": 148, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_forks_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "Processes forks second", - "refId": "A", - "step": 240 - } - ], - "title": "Processes Forks", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "bytes", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "decbytes" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Max.*/" - }, - "properties": [ - { - "id": "custom.fillOpacity", - "value": 0 - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 83 - }, - "id": 149, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(process_virtual_memory_bytes{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "Processes virtual memory size in bytes", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "process_resident_memory_max_bytes{instance=\"$node\",job=\"$job\"}", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "Maximum amount of virtual memory available in bytes", - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(process_virtual_memory_bytes{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "Processes virtual memory size in bytes", - "refId": "C", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(process_virtual_memory_max_bytes{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "Maximum amount of virtual memory available in bytes", - "refId": "D", - "step": 240 - } - ], - "title": "Processes Memory", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Enable with --collector.processes argument on node-exporter", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "PIDs limit" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F2495C", - "mode": "fixed" - } - }, - { - "id": "custom.fillOpacity", - "value": 0 - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 93 - }, - "id": 313, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_processes_pids{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Number of PIDs", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_processes_max_processes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "PIDs limit", - "refId": "B", - "step": 240 - } - ], - "title": "PIDs Number and Limit", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "seconds", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "s" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*waiting.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 93 - }, - "id": 305, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_schedstat_running_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "CPU {{ cpu }} - seconds spent running a process", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_schedstat_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "CPU {{ cpu }} - seconds spent by processing waiting for this CPU", - "refId": "B", - "step": 240 - } - ], - "title": "Process schedule stats Running / Waiting", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Enable with --collector.processes argument on node-exporter", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Threads limit" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F2495C", - "mode": "fixed" - } - }, - { - "id": "custom.fillOpacity", - "value": 0 - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 103 - }, - "id": 314, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_processes_threads{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Allocated threads", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_processes_max_threads{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Threads limit", - "refId": "B", - "step": 240 - } - ], - "title": "Threads Number and Limit", - "type": "timeseries" - } - ], - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "refId": "A" - } - ], - "title": "System Processes", - "type": "row" - }, - { - "collapsed": true, - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 25 - }, - "id": 269, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 26 - }, - "id": 8, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_context_switches_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Context switches", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_intr_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "Interrupts", - "refId": "B", - "step": 240 - } - ], - "title": "Context Switches / Interrupts", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 26 - }, - "id": 7, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_load1{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 4, - "legendFormat": "Load 1m", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_load5{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 4, - "legendFormat": "Load 5m", - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_load15{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 4, - "legendFormat": "Load 15m", - "refId": "C", - "step": 240 - } - ], - "title": "System Load", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "hertz" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Max" - }, - "properties": [ - { - "id": "custom.lineStyle", - "value": { - "dash": [ - 10, - 10 - ], - "fill": "dash" - } - }, - { - "id": "color", - "value": { - "fixedColor": "blue", - "mode": "fixed" - } - }, - { - "id": "custom.fillOpacity", - "value": 10 - }, - { - "id": "custom.hideFrom", - "value": { - "legend": true, - "tooltip": false, - "viz": false - } - }, - { - "id": "custom.fillBelowTo", - "value": "Min" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Min" - }, - "properties": [ - { - "id": "custom.lineStyle", - "value": { - "dash": [ - 10, - 10 - ], - "fill": "dash" - } - }, - { - "id": "color", - "value": { - "fixedColor": "blue", - "mode": "fixed" - } - }, - { - "id": "custom.hideFrom", - "value": { - "legend": true, - "tooltip": false, - "viz": false - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 36 - }, - "id": 321, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "node_cpu_scaling_frequency_hertz{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "CPU {{ cpu }}", - "range": true, - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "avg(node_cpu_scaling_frequency_max_hertz{instance=\"$node\",job=\"$job\"})", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "Max", - "range": true, - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "avg(node_cpu_scaling_frequency_min_hertz{instance=\"$node\",job=\"$job\"})", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "Min", - "range": true, - "refId": "C", - "step": 240 - } - ], - "title": "CPU Frequency Scaling", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "https://docs.kernel.org/accounting/psi.html", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Memory some" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-red", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Memory full" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "light-red", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "I/O some" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "dark-blue", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "I/O full" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "light-blue", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 36 - }, - "id": 322, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "rate(node_pressure_cpu_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "CPU some", - "range": true, - "refId": "CPU some", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "rate(node_pressure_memory_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "Memory some", - "range": true, - "refId": "Memory some", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "rate(node_pressure_memory_stalled_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "Memory full", - "range": true, - "refId": "Memory full", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "rate(node_pressure_io_waiting_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "I/O some", - "range": true, - "refId": "I/O some", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "rate(node_pressure_io_stalled_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "I/O full", - "range": true, - "refId": "I/O full", - "step": 240 - } - ], - "title": "Pressure Stall Information", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Enable with --collector.interrupts argument on node-exporter", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Critical*./" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E24D42", - "mode": "fixed" - } - }, - { - "id": "custom.fillOpacity", - "value": 0 - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*Max*./" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EF843C", - "mode": "fixed" - } - }, - { - "id": "custom.fillOpacity", - "value": 0 - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 46 - }, - "id": 259, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_interrupts_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{ type }} - {{ info }}", - "refId": "A", - "step": 240 - } - ], - "title": "Interrupts Detail", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 46 - }, - "id": 306, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_schedstat_timeslices_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "CPU {{ cpu }}", - "refId": "A", - "step": 240 - } - ], - "title": "Schedule timeslices executed by each cpu", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 56 - }, - "id": 151, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_entropy_available_bits{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Entropy available to random number generators", - "refId": "A", - "step": 240 - } - ], - "title": "Entropy", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "seconds", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "s" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 56 - }, - "id": 308, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(process_cpu_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Time spent", - "refId": "A", - "step": 240 - } - ], - "title": "CPU time spent in user and system contexts", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Max*./" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#890F02", - "mode": "fixed" - } - }, - { - "id": "custom.fillOpacity", - "value": 0 - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 66 - }, - "id": 64, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "process_max_fds{instance=\"$node\",job=\"$job\"}", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Maximum open file descriptors", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "process_open_fds{instance=\"$node\",job=\"$job\"}", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Open file descriptors", - "refId": "B", - "step": 240 - } - ], - "title": "File Descriptors", - "type": "timeseries" - } - ], - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "refId": "A" - } - ], - "title": "System Misc", - "type": "row" - }, - { - "collapsed": true, - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 26 - }, - "id": 304, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "temperature", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "celsius" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Critical*./" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E24D42", - "mode": "fixed" - } - }, - { - "id": "custom.fillOpacity", - "value": 0 - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*Max*./" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EF843C", - "mode": "fixed" - } - }, - { - "id": "custom.fillOpacity", - "value": 0 - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 59 - }, - "id": 158, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_hwmon_temp_celsius{instance=\"$node\",job=\"$job\"} * on(chip) group_left(chip_name) node_hwmon_chip_names{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{ chip_name }} {{ sensor }} temp", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_hwmon_temp_crit_alarm_celsius{instance=\"$node\",job=\"$job\"} * on(chip) group_left(chip_name) node_hwmon_chip_names{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{ chip_name }} {{ sensor }} Critical Alarm", - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_hwmon_temp_crit_celsius{instance=\"$node\",job=\"$job\"} * on(chip) group_left(chip_name) node_hwmon_chip_names{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{ chip_name }} {{ sensor }} Critical", - "refId": "C", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_hwmon_temp_crit_hyst_celsius{instance=\"$node\",job=\"$job\"} * on(chip) group_left(chip_name) node_hwmon_chip_names{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{ chip_name }} {{ sensor }} Critical Historical", - "refId": "D", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_hwmon_temp_max_celsius{instance=\"$node\",job=\"$job\"} * on(chip) group_left(chip_name) node_hwmon_chip_names{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{ chip_name }} {{ sensor }} Max", - "refId": "E", - "step": 240 - } - ], - "title": "Hardware temperature monitor", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Max*./" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EF843C", - "mode": "fixed" - } - }, - { - "id": "custom.fillOpacity", - "value": 0 - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 59 - }, - "id": 300, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_cooling_device_cur_state{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "Current {{ name }} in {{ type }}", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_cooling_device_max_state{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Max {{ name }} in {{ type }}", - "refId": "B", - "step": 240 - } - ], - "title": "Throttle cooling device", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 69 - }, - "id": 302, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_power_supply_online{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{ power_supply }} online", - "refId": "A", - "step": 240 - } - ], - "title": "Power supply", - "type": "timeseries" - } - ], - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "refId": "A" - } - ], - "title": "Hardware Misc", - "type": "row" - }, - { - "collapsed": true, - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 27 - }, - "id": 296, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 46 - }, - "id": 297, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_systemd_socket_accepted_connections_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{ name }} Connections", - "refId": "A", - "step": 240 - } - ], - "title": "Systemd Sockets", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Failed" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F2495C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Inactive" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#FF9830", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Active" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#73BF69", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Deactivating" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#FFCB7D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Activating" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#C8F2C2", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 46 - }, - "id": 298, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"activating\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Activating", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"active\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Active", - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"deactivating\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Deactivating", - "refId": "C", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"failed\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Failed", - "refId": "D", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_systemd_units{instance=\"$node\",job=\"$job\",state=\"inactive\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Inactive", - "refId": "E", - "step": 240 - } - ], - "title": "Systemd Units State", - "type": "timeseries" - } - ], - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "refId": "A" - } - ], - "title": "Systemd", - "type": "row" - }, - { - "collapsed": true, - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 28 - }, - "id": 270, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "The number (after merges) of I/O requests completed per second for the device", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "IO read (-) / write (+)", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "iops" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Read.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#7EB26D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6ED0E0", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EF843C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E24D42", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#584477", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda2_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BA43A9", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda3_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F4D598", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0752D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#962D82", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#614D93", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#9AC48A", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#65C5DB", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F9934E", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0F9D7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#FCEACA", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F9E2D2", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 47 - }, - "id": 9, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_disk_reads_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "intervalFactor": 4, - "legendFormat": "{{device}} - Reads completed", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_disk_writes_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "intervalFactor": 1, - "legendFormat": "{{device}} - Writes completed", - "refId": "B", - "step": 240 - } - ], - "title": "Disk IOps Completed", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "The number of bytes read from or written to the device per second", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "bytes read (-) / write (+)", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "Bps" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Read.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#7EB26D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6ED0E0", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EF843C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E24D42", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#584477", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda2_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BA43A9", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda3_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F4D598", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0752D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#962D82", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#614D93", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#9AC48A", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#65C5DB", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F9934E", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0F9D7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#FCEACA", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F9E2D2", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 47 - }, - "id": 33, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_disk_read_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 4, - "legendFormat": "{{device}} - Read bytes", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_disk_written_bytes_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{device}} - Written bytes", - "refId": "B", - "step": 240 - } - ], - "title": "Disk R/W Data", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "The average time for requests issued to the device to be served. This includes the time spent by the requests in queue and the time spent servicing them.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "time. read (-) / write (+)", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "s" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Read.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#7EB26D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6ED0E0", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EF843C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E24D42", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#584477", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda2_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BA43A9", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda3_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F4D598", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0752D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#962D82", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#614D93", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#9AC48A", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#65C5DB", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F9934E", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0F9D7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#FCEACA", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F9E2D2", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 57 - }, - "id": 37, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_disk_read_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]) / irate(node_disk_reads_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "hide": false, - "interval": "", - "intervalFactor": 4, - "legendFormat": "{{device}} - Read wait time avg", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_disk_write_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval]) / irate(node_disk_writes_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{device}} - Write wait time avg", - "refId": "B", - "step": 240 - } - ], - "title": "Disk Average Wait Time", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "The average queue length of the requests that were issued to the device", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "aqu-sz", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "none" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#7EB26D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6ED0E0", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EF843C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E24D42", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#584477", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda2_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BA43A9", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda3_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F4D598", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0752D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#962D82", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#614D93", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#9AC48A", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#65C5DB", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F9934E", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0F9D7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#FCEACA", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F9E2D2", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 57 - }, - "id": 35, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_disk_io_time_weighted_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "interval": "", - "intervalFactor": 4, - "legendFormat": "{{device}}", - "refId": "A", - "step": 240 - } - ], - "title": "Average Queue Size", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "The number of read and write requests merged per second that were queued to the device", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "I/Os", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "iops" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Read.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#7EB26D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6ED0E0", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EF843C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E24D42", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#584477", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda2_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BA43A9", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda3_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F4D598", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0752D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#962D82", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#614D93", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#9AC48A", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#65C5DB", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F9934E", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0F9D7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#FCEACA", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F9E2D2", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 67 - }, - "id": 133, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_disk_reads_merged_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "intervalFactor": 1, - "legendFormat": "{{device}} - Read merged", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_disk_writes_merged_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "intervalFactor": 1, - "legendFormat": "{{device}} - Write merged", - "refId": "B", - "step": 240 - } - ], - "title": "Disk R/W Merged", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Percentage of elapsed time during which I/O requests were issued to the device (bandwidth utilization for the device). Device saturation occurs when this value is close to 100% for devices serving requests serially. But for devices serving requests in parallel, such as RAID arrays and modern SSDs, this number does not reflect their performance limits.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "%util", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "percentunit" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#7EB26D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6ED0E0", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EF843C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E24D42", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#584477", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda2_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BA43A9", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda3_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F4D598", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0752D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#962D82", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#614D93", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#9AC48A", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#65C5DB", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F9934E", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0F9D7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#FCEACA", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F9E2D2", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 67 - }, - "id": 36, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_disk_io_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "interval": "", - "intervalFactor": 4, - "legendFormat": "{{device}} - IO", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_disk_discard_time_seconds_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "interval": "", - "intervalFactor": 4, - "legendFormat": "{{device}} - discard", - "refId": "B", - "step": 240 - } - ], - "title": "Time Spent Doing I/Os", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "The number of outstanding requests at the instant the sample was taken. Incremented as requests are given to appropriate struct request_queue and decremented as they finish.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "Outstanding req.", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "none" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#7EB26D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6ED0E0", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EF843C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E24D42", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#584477", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda2_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BA43A9", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda3_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F4D598", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0752D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#962D82", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#614D93", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#9AC48A", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#65C5DB", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F9934E", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0F9D7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#FCEACA", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F9E2D2", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 77 - }, - "id": 34, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_disk_io_now{instance=\"$node\",job=\"$job\"}", - "interval": "", - "intervalFactor": 4, - "legendFormat": "{{device}} - IO now", - "refId": "A", - "step": 240 - } - ], - "title": "Instantaneous Queue Size", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "IOs", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "iops" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#7EB26D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EAB839", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#6ED0E0", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EF843C", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E24D42", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#584477", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda2_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BA43A9", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sda3_.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F4D598", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#0A50A1", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#BF1B00", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdb3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0752D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#962D82", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#614D93", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdc3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#9AC48A", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#65C5DB", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F9934E", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#EA6460", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde1.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E0F9D7", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sdd2.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#FCEACA", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*sde3.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F9E2D2", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 77 - }, - "id": 301, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_disk_discards_completed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "interval": "", - "intervalFactor": 4, - "legendFormat": "{{device}} - Discards completed", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_disk_discards_merged_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{device}} - Discards merged", - "refId": "B", - "step": 240 - } - ], - "title": "Disk IOps Discards completed / merged", - "type": "timeseries" - } - ], - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "refId": "A" - } - ], - "title": "Storage Disk", - "type": "row" - }, - { - "collapsed": true, - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 29 - }, - "id": 271, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "bytes", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 62 - }, - "id": 43, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_filesystem_avail_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "{{mountpoint}} - Available", - "metric": "", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_filesystem_free_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}", - "format": "time_series", - "hide": true, - "intervalFactor": 1, - "legendFormat": "{{mountpoint}} - Free", - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_filesystem_size_bytes{instance=\"$node\",job=\"$job\",device!~'rootfs'}", - "format": "time_series", - "hide": true, - "intervalFactor": 1, - "legendFormat": "{{mountpoint}} - Size", - "refId": "C", - "step": 240 - } - ], - "title": "Filesystem space available", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "file nodes", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 62 - }, - "id": 41, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_filesystem_files_free{instance=\"$node\",job=\"$job\",device!~'rootfs'}", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "{{mountpoint}} - Free file nodes", - "refId": "A", - "step": 240 - } - ], - "title": "File Nodes Free", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "files", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 72 - }, - "id": 28, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_filefd_maximum{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 4, - "legendFormat": "Max open files", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_filefd_allocated{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Open files", - "refId": "B", - "step": 240 - } - ], - "title": "File Descriptor", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "file Nodes", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 72 - }, - "id": 219, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_filesystem_files{instance=\"$node\",job=\"$job\",device!~'rootfs'}", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "{{mountpoint}} - File nodes total", - "refId": "A", - "step": 240 - } - ], - "title": "File Nodes Size", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "max": 1, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "/ ReadOnly" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#890F02", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 82 - }, - "id": 44, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_filesystem_readonly{instance=\"$node\",job=\"$job\",device!~'rootfs'}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{mountpoint}} - ReadOnly", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_filesystem_device_error{instance=\"$node\",job=\"$job\",device!~'rootfs',fstype!~'tmpfs'}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{mountpoint}} - Device error", - "refId": "B", - "step": 240 - } - ], - "title": "Filesystem in ReadOnly / Error", - "type": "timeseries" - } - ], - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "refId": "A" - } - ], - "title": "Storage Filesystem", - "type": "row" - }, - { - "collapsed": true, - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 30 - }, - "id": 272, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "packets out (-) / in (+)", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "pps" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "receive_packets_eth0" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#7EB26D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "receive_packets_lo" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E24D42", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "transmit_packets_eth0" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#7EB26D", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "transmit_packets_lo" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#E24D42", - "mode": "fixed" - } - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*Trans.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 47 - }, - "id": 60, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 300 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_network_receive_packets_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{device}} - Receive", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_network_transmit_packets_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{device}} - Transmit", - "refId": "B", - "step": 240 - } - ], - "title": "Network Traffic by Packets", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "packets out (-) / in (+)", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "pps" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Trans.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 47 - }, - "id": 142, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 300 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_network_receive_errs_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{device}} - Receive errors", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_network_transmit_errs_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{device}} - Transmit errors", - "refId": "B", - "step": 240 - } - ], - "title": "Network Traffic Errors", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "packets out (-) / in (+)", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "pps" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Trans.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 57 - }, - "id": 143, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 300 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_network_receive_drop_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{device}} - Receive drop", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_network_transmit_drop_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{device}} - Transmit drop", - "refId": "B", - "step": 240 - } - ], - "title": "Network Traffic Drop", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "packets out (-) / in (+)", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "pps" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Trans.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 57 - }, - "id": 141, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 300 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_network_receive_compressed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{device}} - Receive compressed", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_network_transmit_compressed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{device}} - Transmit compressed", - "refId": "B", - "step": 240 - } - ], - "title": "Network Traffic Compressed", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "packets out (-) / in (+)", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "pps" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Trans.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 67 - }, - "id": 146, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 300 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_network_receive_multicast_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{device}} - Receive multicast", - "refId": "A", - "step": 240 - } - ], - "title": "Network Traffic Multicast", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "packets out (-) / in (+)", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "pps" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Trans.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 67 - }, - "id": 144, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 300 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_network_receive_fifo_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{device}} - Receive fifo", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_network_transmit_fifo_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{device}} - Transmit fifo", - "refId": "B", - "step": 240 - } - ], - "title": "Network Traffic Fifo", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "packets out (-) / in (+)", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "pps" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Trans.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 77 - }, - "id": 145, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 300 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_network_receive_frame_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "hide": false, - "intervalFactor": 1, - "legendFormat": "{{device}} - Receive frame", - "refId": "A", - "step": 240 - } - ], - "title": "Network Traffic Frame", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 77 - }, - "id": 231, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 300 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_network_transmit_carrier_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{device}} - Statistic transmit_carrier", - "refId": "A", - "step": 240 - } - ], - "title": "Network Traffic Carrier", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Trans.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 87 - }, - "id": 232, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 300 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_network_transmit_colls_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{device}} - Transmit colls", - "refId": "A", - "step": 240 - } - ], - "title": "Network Traffic Colls", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "entries", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "NF conntrack limit" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#890F02", - "mode": "fixed" - } - }, - { - "id": "custom.fillOpacity", - "value": 0 - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 87 - }, - "id": 61, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_nf_conntrack_entries{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "NF conntrack entries", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_nf_conntrack_entries_limit{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "NF conntrack limit", - "refId": "B", - "step": 240 - } - ], - "title": "NF Conntrack", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "Entries", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 97 - }, - "id": 230, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_arp_entries{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{ device }} - ARP entries", - "refId": "A", - "step": 240 - } - ], - "title": "ARP Entries", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "bytes", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 0, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 97 - }, - "id": 288, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_network_mtu_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{ device }} - Bytes", - "refId": "A", - "step": 240 - } - ], - "title": "MTU", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "bytes", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 0, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 107 - }, - "id": 280, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_network_speed_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{ device }} - Speed", - "refId": "A", - "step": 240 - } - ], - "title": "Speed", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "packets", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 0, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 107 - }, - "id": 289, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_network_transmit_queue_length{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{ device }} - Interface transmit queue length", - "refId": "A", - "step": 240 - } - ], - "title": "Queue Length", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "packetes drop (-) / process (+)", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Dropped.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 117 - }, - "id": 290, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 300 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_softnet_processed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "CPU {{cpu}} - Processed", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_softnet_dropped_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "CPU {{cpu}} - Dropped", - "refId": "B", - "step": 240 - } - ], - "title": "Softnet Packets", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 117 - }, - "id": 310, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 300 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_softnet_times_squeezed_total{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "CPU {{cpu}} - Squeezed", - "refId": "A", - "step": 240 - } - ], - "title": "Softnet Out of Quota", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 127 - }, - "id": 309, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 300 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_network_up{operstate=\"up\",instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "{{interface}} - Operational state UP", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_network_carrier{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "instant": false, - "legendFormat": "{{device}} - Physical link state", - "refId": "B" - } - ], - "title": "Network Operational Status", - "type": "timeseries" - } - ], - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "refId": "A" - } - ], - "title": "Network Traffic", - "type": "row" - }, - { - "collapsed": true, - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 31 - }, - "id": 273, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 48 - }, - "id": 63, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 300 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_sockstat_TCP_alloc{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "TCP_alloc - Allocated sockets", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_sockstat_TCP_inuse{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "TCP_inuse - Tcp sockets currently in use", - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_sockstat_TCP_mem{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": "TCP_mem - Used memory for tcp", - "refId": "C", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_sockstat_TCP_orphan{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "TCP_orphan - Orphan sockets", - "refId": "D", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_sockstat_TCP_tw{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "TCP_tw - Sockets waiting close", - "refId": "E", - "step": 240 - } - ], - "title": "Sockstat TCP", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 48 - }, - "id": 124, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 300 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_sockstat_UDPLITE_inuse{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "UDPLITE_inuse - Udplite sockets currently in use", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_sockstat_UDP_inuse{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "UDP_inuse - Udp sockets currently in use", - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_sockstat_UDP_mem{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "UDP_mem - Used memory for udp", - "refId": "C", - "step": 240 - } - ], - "title": "Sockstat UDP", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 58 - }, - "id": 125, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 300 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_sockstat_FRAG_inuse{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "FRAG_inuse - Frag sockets currently in use", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_sockstat_RAW_inuse{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "RAW_inuse - Raw sockets currently in use", - "refId": "C", - "step": 240 - } - ], - "title": "Sockstat FRAG / RAW", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "bytes", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "bytes" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 58 - }, - "id": 220, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 300 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_sockstat_TCP_mem_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "mem_bytes - TCP sockets in that state", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_sockstat_UDP_mem_bytes{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "mem_bytes - UDP sockets in that state", - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_sockstat_FRAG_memory{instance=\"$node\",job=\"$job\"}", - "interval": "", - "intervalFactor": 1, - "legendFormat": "FRAG_memory - Used memory for frag", - "refId": "C" - } - ], - "title": "Sockstat Memory Size", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "sockets", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 68 - }, - "id": 126, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 300 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_sockstat_sockets_used{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Sockets_used - Sockets currently in use", - "refId": "A", - "step": 240 - } - ], - "title": "Sockstat Used", - "type": "timeseries" - } - ], - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "refId": "A" - } - ], - "title": "Network Sockstat", - "type": "row" - }, - { - "collapsed": true, - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 32 - }, - "id": 274, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "octets out (-) / in (+)", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Out.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 33 - }, - "id": 221, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 300 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_IpExt_InOctets{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "InOctets - Received octets", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_IpExt_OutOctets{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "OutOctets - Sent octets", - "refId": "B", - "step": 240 - } - ], - "title": "Netstat IP In / Out Octets", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "datagrams", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 33 - }, - "id": 81, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true, - "width": 300 - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_Ip_Forwarding{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Forwarding - IP forwarding", - "refId": "A", - "step": 240 - } - ], - "title": "Netstat IP Forwarding", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "messages out (-) / in (+)", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Out.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 43 - }, - "id": 115, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_Icmp_InMsgs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "InMsgs - Messages which the entity received. Note that this counter includes all those counted by icmpInErrors", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_Icmp_OutMsgs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "OutMsgs - Messages which this entity attempted to send. Note that this counter includes all those counted by icmpOutErrors", - "refId": "B", - "step": 240 - } - ], - "title": "ICMP In / Out", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "messages out (-) / in (+)", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Out.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 43 - }, - "id": 50, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_Icmp_InErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "InErrors - Messages which the entity received but determined as having ICMP-specific errors (bad ICMP checksums, bad length, etc.)", - "refId": "A", - "step": 240 - } - ], - "title": "ICMP Errors", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "datagrams out (-) / in (+)", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Out.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*Snd.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 53 - }, - "id": 55, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_Udp_InDatagrams{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "InDatagrams - Datagrams received", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_Udp_OutDatagrams{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "OutDatagrams - Datagrams sent", - "refId": "B", - "step": 240 - } - ], - "title": "UDP In / Out", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "datagrams", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 53 - }, - "id": 109, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_Udp_InErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "InErrors - UDP Datagrams that could not be delivered to an application", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_Udp_NoPorts{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "NoPorts - UDP Datagrams received on a port with no listener", - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_UdpLite_InErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "interval": "", - "legendFormat": "InErrors Lite - UDPLite Datagrams that could not be delivered to an application", - "refId": "C" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_Udp_RcvbufErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "RcvbufErrors - UDP buffer errors received", - "refId": "D", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_Udp_SndbufErrors{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "SndbufErrors - UDP buffer errors send", - "refId": "E", - "step": 240 - } - ], - "title": "UDP Errors", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "datagrams out (-) / in (+)", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Out.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - }, - { - "matcher": { - "id": "byRegexp", - "options": "/.*Snd.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 63 - }, - "id": 299, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_Tcp_InSegs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "InSegs - Segments received, including those received in error. This count includes segments received on currently established connections", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_Tcp_OutSegs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "OutSegs - Segments sent, including those on current connections but excluding those containing only retransmitted octets", - "refId": "B", - "step": 240 - } - ], - "title": "TCP In / Out", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 63 - }, - "id": 104, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_TcpExt_ListenOverflows{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "ListenOverflows - Times the listen queue of a socket overflowed", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_TcpExt_ListenDrops{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "ListenDrops - SYNs to LISTEN sockets ignored", - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_TcpExt_TCPSynRetrans{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "TCPSynRetrans - SYN-SYN/ACK retransmits to break down retransmissions in SYN, fast/timeout retransmits", - "refId": "C", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_Tcp_RetransSegs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "interval": "", - "legendFormat": "RetransSegs - Segments retransmitted - that is, the number of TCP segments transmitted containing one or more previously transmitted octets", - "refId": "D" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_Tcp_InErrs{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "interval": "", - "legendFormat": "InErrs - Segments received in error (e.g., bad TCP checksums)", - "refId": "E" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_Tcp_OutRsts{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "interval": "", - "legendFormat": "OutRsts - Segments sent with RST flag", - "refId": "F" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "irate(node_netstat_TcpExt_TCPRcvQDrop{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "hide": false, - "interval": "", - "legendFormat": "TCPRcvQDrop - Packets meant to be queued in rcv queue but dropped because socket rcvbuf limit hit", - "range": true, - "refId": "G" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "irate(node_netstat_TcpExt_TCPOFOQueue{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "hide": false, - "interval": "", - "legendFormat": "TCPOFOQueue - TCP layer receives an out of order packet and has enough memory to queue it", - "range": true, - "refId": "H" - } - ], - "title": "TCP Errors", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "connections", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*MaxConn *./" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#890F02", - "mode": "fixed" - } - }, - { - "id": "custom.fillOpacity", - "value": 0 - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 73 - }, - "id": 85, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_netstat_Tcp_CurrEstab{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "CurrEstab - TCP connections for which the current state is either ESTABLISHED or CLOSE- WAIT", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_netstat_Tcp_MaxConn{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "MaxConn - Limit on the total number of TCP connections the entity can support (Dynamic is \"-1\")", - "refId": "B", - "step": 240 - } - ], - "title": "TCP Connections", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter out (-) / in (+)", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*Sent.*/" - }, - "properties": [ - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 73 - }, - "id": 91, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_TcpExt_SyncookiesFailed{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "SyncookiesFailed - Invalid SYN cookies received", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_TcpExt_SyncookiesRecv{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "SyncookiesRecv - SYN cookies received", - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_TcpExt_SyncookiesSent{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "SyncookiesSent - SYN cookies sent", - "refId": "C", - "step": 240 - } - ], - "title": "TCP SynCookie", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "connections", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 83 - }, - "id": 82, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_Tcp_ActiveOpens{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "ActiveOpens - TCP connections that have made a direct transition to the SYN-SENT state from the CLOSED state", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "irate(node_netstat_Tcp_PassiveOpens{instance=\"$node\",job=\"$job\"}[$__rate_interval])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "PassiveOpens - TCP connections that have made a direct transition to the SYN-RCVD state from the LISTEN state", - "refId": "B", - "step": 240 - } - ], - "title": "TCP Direct Transition", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "Enable with --collector.tcpstat argument on node-exporter", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "connections", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 83 - }, - "id": 320, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "node_tcp_connection_states{state=\"established\",instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "established - TCP sockets in established state", - "range": true, - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "node_tcp_connection_states{state=\"fin_wait2\",instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "fin_wait2 - TCP sockets in fin_wait2 state", - "range": true, - "refId": "B", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "node_tcp_connection_states{state=\"listen\",instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "listen - TCP sockets in listen state", - "range": true, - "refId": "C", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "editorMode": "code", - "expr": "node_tcp_connection_states{state=\"time_wait\",instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "time_wait - TCP sockets in time_wait state", - "range": true, - "refId": "D", - "step": 240 - } - ], - "title": "TCP Stat", - "type": "timeseries" - } - ], - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "refId": "A" - } - ], - "title": "Network Netstat", - "type": "row" - }, - { - "collapsed": true, - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 33 - }, - "id": 279, - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "seconds", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "normal" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "s" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 66 - }, - "id": 40, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_scrape_collector_duration_seconds{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{collector}} - Scrape duration", - "refId": "A", - "step": 240 - } - ], - "title": "Node Exporter Scrape Time", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "counter", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 20, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineStyle": { - "fill": "solid" - }, - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "links": [], - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byRegexp", - "options": "/.*error.*/" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "#F2495C", - "mode": "fixed" - } - }, - { - "id": "custom.transform", - "value": "negative-Y" - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 66 - }, - "id": 157, - "links": [], - "options": { - "legend": { - "calcs": [ - "mean", - "lastNotNull", - "max", - "min" - ], - "displayMode": "table", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "none" - } - }, - "pluginVersion": "9.2.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_scrape_collector_success{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{collector}} - Scrape success", - "refId": "A", - "step": 240 - }, - { - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "expr": "node_textfile_scrape_error{instance=\"$node\",job=\"$job\"}", - "format": "time_series", - "hide": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{collector}} - Scrape textfile error (1 = true)", - "refId": "B", - "step": 240 - } - ], - "title": "Node Exporter Scrape", - "type": "timeseries" - } - ], - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "000000001" - }, - "refId": "A" - } - ], - "title": "Node Exporter", - "type": "row" - } - ], - "refresh": "1m", - "revision": 1, - "schemaVersion": 39, - "tags": [ - "linux" - ], - "templating": { - "list": [ - { - "current": { - "selected": false, - "text": "default", - "value": "default" - }, - "hide": 0, - "includeAll": false, - "label": "Datasource", - "multi": false, - "name": "datasource", - "options": [], - "query": "prometheus", - "queryValue": "", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "type": "datasource" - }, - { - "current": { - "selected": false, - "text": "node-exporter", - "value": "node-exporter" - }, - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "definition": "", - "hide": 0, - "includeAll": false, - "label": "Job", - "multi": false, - "name": "job", - "options": [], - "query": { - "query": "label_values(node_uname_info, job)", - "refId": "Prometheus-job-Variable-Query" - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "current": { - "selected": false, - "text": "node_exporter:9100", - "value": "node_exporter:9100" - }, - "datasource": { - "type": "prometheus", - "uid": "${datasource}" - }, - "definition": "label_values(node_uname_info{job=\"$job\"}, instance)", - "hide": 0, - "includeAll": false, - "label": "Host", - "multi": false, - "name": "node", - "options": [], - "query": { - "query": "label_values(node_uname_info{job=\"$job\"}, instance)", - "refId": "Prometheus-node-Variable-Query" - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "current": { - "selected": false, - "text": "[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+", - "value": "[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+" - }, - "hide": 2, - "includeAll": false, - "multi": false, - "name": "diskdevices", - "options": [ - { - "selected": true, - "text": "[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+", - "value": "[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+" - } - ], - "query": "[a-z]+|nvme[0-9]+n[0-9]+|mmcblk[0-9]+", - "skipUrlSync": false, - "type": "custom" - } - ] - }, - "time": { - "from": "now-15m", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "browser", - "title": "Node Exporter Full", - "uid": "rYdddlPWk", - "version": 3, - "weekStart": "" -} \ No newline at end of file diff --git a/compose/jaeger/jaeger-ui.json b/compose/jaeger/jaeger-ui.json deleted file mode 100644 index 0f06f2fcda..0000000000 --- a/compose/jaeger/jaeger-ui.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "monitor": { - "menuEnabled": true - }, - "dependencies": { - "menuEnabled": true - } - } \ No newline at end of file diff --git a/compose/loki/loki.yml b/compose/loki/loki.yml deleted file mode 100644 index a63d16c7ff..0000000000 --- a/compose/loki/loki.yml +++ /dev/null @@ -1,44 +0,0 @@ -auth_enabled: false - -limits_config: - allow_structured_metadata: true - -server: - http_listen_port: 3100 - grpc_listen_port: 9096 - -common: - instance_addr: localhost - path_prefix: /tmp/loki - storage: - filesystem: - chunks_directory: /tmp/loki/chunks - rules_directory: /tmp/loki/rules - replication_factor: 1 - ring: - kvstore: - store: inmemory - -query_range: - results_cache: - cache: - embedded_cache: - enabled: true - max_size_mb: 100 - -schema_config: - configs: - - from: 2020-10-24 - store: tsdb - object_store: filesystem - schema: v13 - index: - prefix: index_ - period: 24h - -storage_config: - boltdb: - directory: /tmp/loki/index - - filesystem: - directory: /tmp/loki/chunks diff --git a/compose/otel-collector/otel-config.yaml b/compose/otel-collector/otel-config.yaml deleted file mode 100644 index 191edae04c..0000000000 --- a/compose/otel-collector/otel-config.yaml +++ /dev/null @@ -1,78 +0,0 @@ -extensions: - health_check: - zpages: - endpoint: 0.0.0.0:55679 - -receivers: - otlp: - protocols: - grpc: - endpoint: 0.0.0.0:4317 - http: - endpoint: 0.0.0.0:4318 - zipkin: - endpoint: 0.0.0.0:9411 - -processors: - batch: - - resource: - attributes: - - action: insert - key: service_name - from_attribute: service.name - - action: insert - key: loki.resource.labels - value: service_name - -exporters: - debug: - verbosity: detailed - file/traces: - path: /log/otel/traces.log - file/metrics: - path: /log/otel/metrics.log - file/logs: - path: /log/otel/logs.log - otlp: - endpoint: "${JAEGER_ENDPOINT}" - tls: - insecure: true - prometheus: - endpoint: "0.0.0.0:8889" - otlphttp: - endpoint: "http://loki:3100/otlp" - -service: - telemetry: - logs: - level: debug - pipelines: - traces: - receivers: - - otlp - - zipkin - processors: [batch] - exporters: - - debug - - file/traces - - otlp - metrics: - receivers: - - otlp - processors: [batch] - exporters: - - debug - - file/metrics - - prometheus - logs: - receivers: - - otlp - processors: [batch, resource] - exporters: - - debug - - file/logs - - otlphttp - extensions: - - health_check - - zpages \ No newline at end of file diff --git a/compose/prometheus/prometheus.yml b/compose/prometheus/prometheus.yml deleted file mode 100644 index 647cfda1af..0000000000 --- a/compose/prometheus/prometheus.yml +++ /dev/null @@ -1,24 +0,0 @@ -global: - scrape_interval: 10s - -scrape_configs: - - job_name: 'fullstackhero.api' - static_configs: - - targets: ['host.docker.internal:5000'] - - - job_name: otel - static_configs: - - targets: - - 'otel-collector:8889' - - - job_name: otel-collector - static_configs: - - targets: - - 'otel-collector:8888' - - - job_name: 'node-exporter' - # Override the global default and scrape targets from this job every 5 seconds. - scrape_interval: 5s - static_configs: - - targets: - - 'node_exporter:9100' \ No newline at end of file diff --git a/src/.dockerignore b/src/.dockerignore deleted file mode 100644 index 3aae53927b..0000000000 --- a/src/.dockerignore +++ /dev/null @@ -1,32 +0,0 @@ -# Include any files or directories that you don't want to be copied to your -# container here (e.g., local build artifacts, temporary files, etc.). -# -# For more help, visit the .dockerignore file reference guide at -# https://docs.docker.com/engine/reference/builder/#dockerignore-file - -**/.DS_Store -**/.classpath -**/.dockerignore -**/.env -**/.git -**/.gitignore -**/.project -**/.settings -**/.toolstarget -**/.vs -**/.vscode -**/*.*proj.user -**/*.dbmdl -**/*.jfm -**/bin -**/charts -**/docker-compose* -**/compose* -**/Dockerfile* -**/node_modules -**/npm-debug.log -**/obj -**/secrets.dev.yaml -**/values.dev.yaml -LICENSE -README.md diff --git a/src/.editorconfig b/src/.editorconfig index b3fa9a701e..c23f336542 100644 --- a/src/.editorconfig +++ b/src/.editorconfig @@ -1,17 +1,6 @@ +# Remove the line below if you want to inherit .editorconfig settings from higher directories root = true -# All files -[*] -indent_style = space - -# Xml files -[*.{xml,csproj,props,targets,ruleset,nuspec,resx}] -indent_size = 2 - -# Json files -[*.{json,config,nswag}] -indent_size = 2 - # C# files [*.cs] @@ -19,115 +8,152 @@ indent_size = 2 # Indentation and spacing indent_size = 4 +indent_style = space tab_width = 4 # New line preferences -end_of_line = lf -insert_final_newline = true +end_of_line = crlf +insert_final_newline = false + +#### .NET Code Actions #### + +# Type members +dotnet_hide_advanced_members = false +dotnet_member_insertion_location = with_other_members_of_the_same_kind +dotnet_property_generation_behavior = prefer_throwing_properties + +# Symbol search +dotnet_search_reference_assemblies = true #### .NET Coding Conventions #### -[*.{cs,vb}] # Organize usings dotnet_separate_import_directive_groups = false -dotnet_sort_system_directives_first = true +dotnet_sort_system_directives_first = false file_header_template = unset # this. and Me. preferences -dotnet_style_qualification_for_event = false:silent -dotnet_style_qualification_for_field = false:silent -dotnet_style_qualification_for_method = false:silent -dotnet_style_qualification_for_property = false:silent +dotnet_style_qualification_for_event = false +dotnet_style_qualification_for_field = false +dotnet_style_qualification_for_method = false +dotnet_style_qualification_for_property = false # Language keywords vs BCL types preferences -dotnet_style_predefined_type_for_locals_parameters_members = true:silent -dotnet_style_predefined_type_for_member_access = true:silent +dotnet_style_predefined_type_for_locals_parameters_members = true +dotnet_style_predefined_type_for_member_access = true # Parentheses preferences -dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent -dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent -dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent -dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:suggestion +dotnet_style_parentheses_in_other_binary_operators = never_if_unnecessary:suggestion +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:suggestion +dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:suggestion # Modifier preferences -dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent +dotnet_style_require_accessibility_modifiers = for_non_interface_members # Expression-level preferences -dotnet_style_coalesce_expression = true:suggestion -dotnet_style_collection_initializer = true:suggestion -dotnet_style_explicit_tuple_names = true:suggestion -dotnet_style_null_propagation = true:suggestion -dotnet_style_object_initializer = true:suggestion +dotnet_prefer_system_hash_code = true +dotnet_style_coalesce_expression = true +dotnet_style_collection_initializer = true +dotnet_style_explicit_tuple_names = true +dotnet_style_namespace_match_folder = true +dotnet_style_null_propagation = true +dotnet_style_object_initializer = true dotnet_style_operator_placement_when_wrapping = beginning_of_line dotnet_style_prefer_auto_properties = true:suggestion -dotnet_style_prefer_compound_assignment = true:suggestion +dotnet_style_prefer_collection_expression = when_types_loosely_match +dotnet_style_prefer_compound_assignment = true:error dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion dotnet_style_prefer_conditional_expression_over_return = true:suggestion -dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion -dotnet_style_prefer_inferred_tuple_names = true:suggestion -dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion -dotnet_style_prefer_simplified_boolean_expressions = true:suggestion -dotnet_style_prefer_simplified_interpolation = true:suggestion +dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed +dotnet_style_prefer_inferred_anonymous_type_member_names = true +dotnet_style_prefer_inferred_tuple_names = true +dotnet_style_prefer_is_null_check_over_reference_equality_method = true +dotnet_style_prefer_simplified_boolean_expressions = true +dotnet_style_prefer_simplified_interpolation = true # Field preferences -dotnet_style_readonly_field = true:warning +dotnet_style_readonly_field = true # Parameter preferences -dotnet_code_quality_unused_parameters = all:suggestion +dotnet_code_quality_unused_parameters = all:error # Suppression preferences dotnet_remove_unnecessary_suppression_exclusions = none +# New line preferences +dotnet_style_allow_multiple_blank_lines_experimental = true +dotnet_style_allow_statement_immediately_after_block_experimental = true + #### C# Coding Conventions #### -[*.cs] # var preferences -csharp_style_var_elsewhere = false:silent -csharp_style_var_for_built_in_types = false:silent -csharp_style_var_when_type_is_apparent = false:silent +csharp_style_var_elsewhere = false +csharp_style_var_for_built_in_types = false +csharp_style_var_when_type_is_apparent = false # Expression-bodied members csharp_style_expression_bodied_accessors = true:silent csharp_style_expression_bodied_constructors = false:silent csharp_style_expression_bodied_indexers = true:silent -csharp_style_expression_bodied_lambdas = true:suggestion -csharp_style_expression_bodied_local_functions = false:silent +csharp_style_expression_bodied_lambdas = true:none +csharp_style_expression_bodied_local_functions = true:error csharp_style_expression_bodied_methods = false:silent csharp_style_expression_bodied_operators = false:silent csharp_style_expression_bodied_properties = true:silent # Pattern matching preferences -csharp_style_pattern_matching_over_as_with_null_check = true:suggestion -csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion -csharp_style_prefer_not_pattern = true:suggestion -csharp_style_prefer_pattern_matching = true:silent -csharp_style_prefer_switch_expression = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true +csharp_style_pattern_matching_over_is_with_cast_check = true +csharp_style_prefer_extended_property_pattern = true +csharp_style_prefer_not_pattern = true +csharp_style_prefer_pattern_matching = true +csharp_style_prefer_switch_expression = true # Null-checking preferences -csharp_style_conditional_delegate_call = true:suggestion +csharp_style_conditional_delegate_call = true # Modifier preferences -csharp_prefer_static_local_function = true:warning -csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:silent +csharp_prefer_static_anonymous_function = true +csharp_prefer_static_local_function = true:error +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async +csharp_style_prefer_readonly_struct = true +csharp_style_prefer_readonly_struct_member = true # Code-block preferences csharp_prefer_braces = true:silent csharp_prefer_simple_using_statement = true:suggestion +csharp_prefer_system_threading_lock = true:suggestion +csharp_style_namespace_declarations = file_scoped:silent +csharp_style_prefer_method_group_conversion = true:silent +csharp_style_prefer_primary_constructors = true:suggestion +csharp_style_prefer_top_level_statements = true:silent # Expression-level preferences -csharp_prefer_simple_default_expression = true:suggestion -csharp_style_deconstructed_variable_declaration = true:suggestion -csharp_style_inlined_variable_declaration = true:suggestion -csharp_style_pattern_local_over_anonymous_function = true:suggestion -csharp_style_prefer_index_operator = true:suggestion -csharp_style_prefer_range_operator = true:suggestion -csharp_style_throw_expression = true:suggestion -csharp_style_unused_value_assignment_preference = discard_variable:suggestion -csharp_style_unused_value_expression_statement_preference = discard_variable:silent +csharp_prefer_simple_default_expression = true +csharp_style_deconstructed_variable_declaration = true +csharp_style_implicit_object_creation_when_type_is_apparent = true +csharp_style_inlined_variable_declaration = true +csharp_style_prefer_index_operator = true:silent +csharp_style_prefer_local_over_anonymous_function = true +csharp_style_prefer_null_check_over_type_check = true +csharp_style_prefer_range_operator = true:silent +csharp_style_prefer_tuple_swap = true +csharp_style_prefer_utf8_string_literals = true +csharp_style_throw_expression = true +csharp_style_unused_value_assignment_preference = discard_variable +csharp_style_unused_value_expression_statement_preference = discard_variable # 'using' directive preferences csharp_using_directive_placement = outside_namespace:silent +# New line preferences +csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true +csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true +csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true +csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true +csharp_style_allow_embedded_statements_on_same_line_experimental = true + #### C# Formatting Rules #### # New line preferences @@ -174,224 +200,98 @@ csharp_space_between_square_brackets = false # Wrapping preferences csharp_preserve_single_line_blocks = true csharp_preserve_single_line_statements = true -csharp_style_namespace_declarations = file_scoped:silent -csharp_style_prefer_method_group_conversion = true:silent -csharp_style_prefer_top_level_statements = true:silent -csharp_style_prefer_primary_constructors = true:suggestion -csharp_style_prefer_null_check_over_type_check = true:suggestion -csharp_style_prefer_local_over_anonymous_function = true:suggestion -csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion -csharp_style_prefer_tuple_swap = true:suggestion -csharp_style_prefer_utf8_string_literals = true:suggestion -dotnet_diagnostic.CA1032.severity = none -dotnet_diagnostic.CA1812.severity = none -dotnet_diagnostic.S6667.severity = none #### Naming styles #### -[*.{cs,vb}] # Naming rules -dotnet_naming_rule.types_and_namespaces_should_be_pascalcase.severity = suggestion -dotnet_naming_rule.types_and_namespaces_should_be_pascalcase.symbols = types_and_namespaces -dotnet_naming_rule.types_and_namespaces_should_be_pascalcase.style = pascalcase - -dotnet_naming_rule.interfaces_should_be_ipascalcase.severity = suggestion -dotnet_naming_rule.interfaces_should_be_ipascalcase.symbols = interfaces -dotnet_naming_rule.interfaces_should_be_ipascalcase.style = ipascalcase - -dotnet_naming_rule.type_parameters_should_be_tpascalcase.severity = suggestion -dotnet_naming_rule.type_parameters_should_be_tpascalcase.symbols = type_parameters -dotnet_naming_rule.type_parameters_should_be_tpascalcase.style = tpascalcase - -dotnet_naming_rule.methods_should_be_pascalcase.severity = suggestion -dotnet_naming_rule.methods_should_be_pascalcase.symbols = methods -dotnet_naming_rule.methods_should_be_pascalcase.style = pascalcase - -dotnet_naming_rule.properties_should_be_pascalcase.severity = suggestion -dotnet_naming_rule.properties_should_be_pascalcase.symbols = properties -dotnet_naming_rule.properties_should_be_pascalcase.style = pascalcase - -dotnet_naming_rule.events_should_be_pascalcase.severity = suggestion -dotnet_naming_rule.events_should_be_pascalcase.symbols = events -dotnet_naming_rule.events_should_be_pascalcase.style = pascalcase - -dotnet_naming_rule.local_variables_should_be_camelcase.severity = suggestion -dotnet_naming_rule.local_variables_should_be_camelcase.symbols = local_variables -dotnet_naming_rule.local_variables_should_be_camelcase.style = camelcase - -dotnet_naming_rule.local_constants_should_be_camelcase.severity = suggestion -dotnet_naming_rule.local_constants_should_be_camelcase.symbols = local_constants -dotnet_naming_rule.local_constants_should_be_camelcase.style = camelcase - -dotnet_naming_rule.parameters_should_be_camelcase.severity = suggestion -dotnet_naming_rule.parameters_should_be_camelcase.symbols = parameters -dotnet_naming_rule.parameters_should_be_camelcase.style = camelcase - -dotnet_naming_rule.public_fields_should_be_pascalcase.severity = suggestion -dotnet_naming_rule.public_fields_should_be_pascalcase.symbols = public_fields -dotnet_naming_rule.public_fields_should_be_pascalcase.style = pascalcase +dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion +dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface +dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i -dotnet_naming_rule.private_fields_should_be__camelcase.severity = suggestion -dotnet_naming_rule.private_fields_should_be__camelcase.symbols = private_fields -dotnet_naming_rule.private_fields_should_be__camelcase.style = _camelcase +dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.types_should_be_pascal_case.symbols = types +dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case -dotnet_naming_rule.private_static_fields_should_be_s_camelcase.severity = suggestion -dotnet_naming_rule.private_static_fields_should_be_s_camelcase.symbols = private_static_fields -dotnet_naming_rule.private_static_fields_should_be_s_camelcase.style = s_camelcase - -dotnet_naming_rule.public_constant_fields_should_be_pascalcase.severity = suggestion -dotnet_naming_rule.public_constant_fields_should_be_pascalcase.symbols = public_constant_fields -dotnet_naming_rule.public_constant_fields_should_be_pascalcase.style = pascalcase - -dotnet_naming_rule.private_constant_fields_should_be_pascalcase.severity = suggestion -dotnet_naming_rule.private_constant_fields_should_be_pascalcase.symbols = private_constant_fields -dotnet_naming_rule.private_constant_fields_should_be_pascalcase.style = pascalcase - -dotnet_naming_rule.public_static_readonly_fields_should_be_pascalcase.severity = suggestion -dotnet_naming_rule.public_static_readonly_fields_should_be_pascalcase.symbols = public_static_readonly_fields -dotnet_naming_rule.public_static_readonly_fields_should_be_pascalcase.style = pascalcase - -dotnet_naming_rule.private_static_readonly_fields_should_be_pascalcase.severity = suggestion -dotnet_naming_rule.private_static_readonly_fields_should_be_pascalcase.symbols = private_static_readonly_fields -dotnet_naming_rule.private_static_readonly_fields_should_be_pascalcase.style = pascalcase - -dotnet_naming_rule.enums_should_be_pascalcase.severity = suggestion -dotnet_naming_rule.enums_should_be_pascalcase.symbols = enums -dotnet_naming_rule.enums_should_be_pascalcase.style = pascalcase - -dotnet_naming_rule.local_functions_should_be_pascalcase.severity = suggestion -dotnet_naming_rule.local_functions_should_be_pascalcase.symbols = local_functions -dotnet_naming_rule.local_functions_should_be_pascalcase.style = pascalcase - -dotnet_naming_rule.non_field_members_should_be_pascalcase.severity = suggestion -dotnet_naming_rule.non_field_members_should_be_pascalcase.symbols = non_field_members -dotnet_naming_rule.non_field_members_should_be_pascalcase.style = pascalcase +dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members +dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case # Symbol specifications -dotnet_naming_symbols.interfaces.applicable_kinds = interface -dotnet_naming_symbols.interfaces.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.interfaces.required_modifiers = - -dotnet_naming_symbols.enums.applicable_kinds = enum -dotnet_naming_symbols.enums.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.enums.required_modifiers = - -dotnet_naming_symbols.events.applicable_kinds = event -dotnet_naming_symbols.events.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.events.required_modifiers = - -dotnet_naming_symbols.methods.applicable_kinds = method -dotnet_naming_symbols.methods.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.methods.required_modifiers = +dotnet_naming_symbols.interface.applicable_kinds = interface +dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.interface.required_modifiers = -dotnet_naming_symbols.properties.applicable_kinds = property -dotnet_naming_symbols.properties.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.properties.required_modifiers = - -dotnet_naming_symbols.public_fields.applicable_kinds = field -dotnet_naming_symbols.public_fields.applicable_accessibilities = public, internal -dotnet_naming_symbols.public_fields.required_modifiers = - -dotnet_naming_symbols.private_fields.applicable_kinds = field -dotnet_naming_symbols.private_fields.applicable_accessibilities = private, protected, protected_internal, private_protected -dotnet_naming_symbols.private_fields.required_modifiers = - -dotnet_naming_symbols.private_static_fields.applicable_kinds = field -dotnet_naming_symbols.private_static_fields.applicable_accessibilities = private, protected, protected_internal, private_protected -dotnet_naming_symbols.private_static_fields.required_modifiers = static - -dotnet_naming_symbols.types_and_namespaces.applicable_kinds = namespace, class, struct, interface, enum -dotnet_naming_symbols.types_and_namespaces.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected -dotnet_naming_symbols.types_and_namespaces.required_modifiers = +dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum +dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.types.required_modifiers = dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected dotnet_naming_symbols.non_field_members.required_modifiers = -dotnet_naming_symbols.type_parameters.applicable_kinds = namespace -dotnet_naming_symbols.type_parameters.applicable_accessibilities = * -dotnet_naming_symbols.type_parameters.required_modifiers = - -dotnet_naming_symbols.private_constant_fields.applicable_kinds = field -dotnet_naming_symbols.private_constant_fields.applicable_accessibilities = private, protected, protected_internal, private_protected -dotnet_naming_symbols.private_constant_fields.required_modifiers = const - -dotnet_naming_symbols.local_variables.applicable_kinds = local -dotnet_naming_symbols.local_variables.applicable_accessibilities = local -dotnet_naming_symbols.local_variables.required_modifiers = - -dotnet_naming_symbols.local_constants.applicable_kinds = local -dotnet_naming_symbols.local_constants.applicable_accessibilities = local -dotnet_naming_symbols.local_constants.required_modifiers = const +# Naming styles -dotnet_naming_symbols.parameters.applicable_kinds = parameter -dotnet_naming_symbols.parameters.applicable_accessibilities = * -dotnet_naming_symbols.parameters.required_modifiers = +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case -dotnet_naming_symbols.public_constant_fields.applicable_kinds = field -dotnet_naming_symbols.public_constant_fields.applicable_accessibilities = public, internal -dotnet_naming_symbols.public_constant_fields.required_modifiers = const +dotnet_naming_style.begins_with_i.required_prefix = I +dotnet_naming_style.begins_with_i.required_suffix = +dotnet_naming_style.begins_with_i.word_separator = +dotnet_naming_style.begins_with_i.capitalization = pascal_case -dotnet_naming_symbols.public_static_readonly_fields.applicable_kinds = field -dotnet_naming_symbols.public_static_readonly_fields.applicable_accessibilities = public, internal -dotnet_naming_symbols.public_static_readonly_fields.required_modifiers = readonly, static +# Static code analysis rule customizations -dotnet_naming_symbols.private_static_readonly_fields.applicable_kinds = field -dotnet_naming_symbols.private_static_readonly_fields.applicable_accessibilities = private, protected, protected_internal, private_protected -dotnet_naming_symbols.private_static_readonly_fields.required_modifiers = readonly, static +# CA2007: Consider calling ConfigureAwait on the awaited task +dotnet_diagnostic.CA2007.severity = none -dotnet_naming_symbols.local_functions.applicable_kinds = local_function -dotnet_naming_symbols.local_functions.applicable_accessibilities = * -dotnet_naming_symbols.local_functions.required_modifiers = +# CA1515: Consider making public types internal +dotnet_diagnostic.CA1515.severity = none -# Naming styles +# CA1724: Type name conflicts with namespace +dotnet_diagnostic.CA1724.severity = none -dotnet_naming_style.pascalcase.required_prefix = -dotnet_naming_style.pascalcase.required_suffix = -dotnet_naming_style.pascalcase.word_separator = -dotnet_naming_style.pascalcase.capitalization = pascal_case +# S2094: Classes should not be empty +dotnet_diagnostic.S2094.severity = none -dotnet_naming_style.ipascalcase.required_prefix = I -dotnet_naming_style.ipascalcase.required_suffix = -dotnet_naming_style.ipascalcase.word_separator = -dotnet_naming_style.ipascalcase.capitalization = pascal_case +# IDE0058: Expression value is never used +dotnet_diagnostic.IDE0058.severity = none -dotnet_naming_style.tpascalcase.required_prefix = T -dotnet_naming_style.tpascalcase.required_suffix = -dotnet_naming_style.tpascalcase.word_separator = -dotnet_naming_style.tpascalcase.capitalization = pascal_case +# IDE0005: Remove unnecessary usings/imports +dotnet_diagnostic.IDE0005.severity = none -dotnet_naming_style._camelcase.required_prefix = _ -dotnet_naming_style._camelcase.required_suffix = -dotnet_naming_style._camelcase.word_separator = -dotnet_naming_style._camelcase.capitalization = camel_case +# CA1062: Validate arguments of public methods +dotnet_diagnostic.CA1062.severity = none -dotnet_naming_style.camelcase.required_prefix = -dotnet_naming_style.camelcase.required_suffix = -dotnet_naming_style.camelcase.word_separator = -dotnet_naming_style.camelcase.capitalization = camel_case +# S125: Remove commented out code +dotnet_diagnostic.S125.severity = none -dotnet_naming_style.s_camelcase.required_prefix = s_ -dotnet_naming_style.s_camelcase.required_suffix = -dotnet_naming_style.s_camelcase.word_separator = -dotnet_naming_style.s_camelcase.capitalization = camel_case +# IDE0053: Use expression body for lambda expression +dotnet_diagnostic.IDE0053.severity = none -dotnet_style_namespace_match_folder = true:suggestion +# IDE0130: Namespace should match project structure +dotnet_diagnostic.IDE0130.severity = none +dotnet_diagnostic.CA1032.severity = none +dotnet_diagnostic.S2326.severity = none -dotnet_diagnostic.CS1591.severity = none -dotnet_diagnostic.CA1724.severity = none -dotnet_diagnostic.CA1305.severity = none -dotnet_diagnostic.CA1040.severity = none -dotnet_diagnostic.CA1848.severity = none -dotnet_diagnostic.CA1034.severity = none +[*.{cs,vb}] +dotnet_style_operator_placement_when_wrapping = beginning_of_line tab_width = 4 indent_size = 4 -end_of_line = lf +end_of_line = crlf +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_auto_properties = true:suggestion +dotnet_style_object_initializer = true:suggestion +dotnet_diagnostic.CA1034.severity = none +dotnet_style_collection_initializer = true:suggestion +dotnet_style_prefer_simplified_boolean_expressions = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion +dotnet_style_prefer_conditional_expression_over_return = true:suggestion dotnet_diagnostic.CA1711.severity = none -dotnet_diagnostic.CA1716.severity = none -dotnet_diagnostic.CA1062.severity = none -dotnet_diagnostic.CA1031.severity = none -dotnet_diagnostic.CA1861.severity = none -dotnet_diagnostic.CA2007.severity = none \ No newline at end of file +dotnet_diagnostic.CA1040.severity = none +dotnet_diagnostic.CA1707.severity = none \ No newline at end of file diff --git a/src/Core/Core.csproj b/src/Core/Core.csproj new file mode 100644 index 0000000000..a1c3aa3eca --- /dev/null +++ b/src/Core/Core.csproj @@ -0,0 +1,13 @@ + + + FSH.Framework.Core + FSH.Framework.Core + + + + + + + + + \ No newline at end of file diff --git a/src/Core/Domain/Entities/AuditableEntity.cs b/src/Core/Domain/Entities/AuditableEntity.cs new file mode 100644 index 0000000000..e520273c34 --- /dev/null +++ b/src/Core/Domain/Entities/AuditableEntity.cs @@ -0,0 +1,32 @@ +using FSH.Framework.Core.Domain.Interfaces; + +namespace FSH.Framework.Core.Domain.Entities; +public abstract class AuditableEntity : Entity, IAuditable, ISoftDelete +{ + public string? CreatedBy { get; protected set; } + public DateTime CreatedOnUtc { get; protected set; } + public string? LastModifiedBy { get; protected set; } + public DateTime? LastModifiedOnUtc { get; protected set; } + public bool IsDeleted { get; protected set; } + public DateTime? DeletedOnUtc { get; protected set; } + public string? DeletedBy { get; protected set; } + public void SoftDelete(string? by, DateTime whenUtc) + { + if (IsDeleted) return; + IsDeleted = true; + DeletedBy = by; + DeletedOnUtc = whenUtc; + } + public void Restore() + { + if (!IsDeleted) return; + IsDeleted = false; + DeletedBy = null; + DeletedOnUtc = null; + } +} + +public abstract class AuditableEntity : AuditableEntity +{ + protected AuditableEntity() => Id = Guid.NewGuid(); +} \ No newline at end of file diff --git a/src/Core/Domain/Entities/Entity.cs b/src/Core/Domain/Entities/Entity.cs new file mode 100644 index 0000000000..31b71a9904 --- /dev/null +++ b/src/Core/Domain/Entities/Entity.cs @@ -0,0 +1,12 @@ +using FSH.Framework.Core.Domain.Interfaces; + +namespace FSH.Framework.Core.Domain.Entities; + +public abstract class Entity : IHasDomainEvents +{ + public TId Id { get; protected set; } = default!; + private readonly List _domainEvents = new(); + public IReadOnlyCollection DomainEvents => _domainEvents.AsReadOnly(); + protected void QueueDomainEvent(IDomainEvent @event) => _domainEvents.Add(@event); + public void ClearDomainEvents() => _domainEvents.Clear(); +} \ No newline at end of file diff --git a/src/Core/Domain/Interfaces/IAuditable.cs b/src/Core/Domain/Interfaces/IAuditable.cs new file mode 100644 index 0000000000..c8b0748f2d --- /dev/null +++ b/src/Core/Domain/Interfaces/IAuditable.cs @@ -0,0 +1,8 @@ +namespace FSH.Framework.Core.Domain.Interfaces; +public interface IAuditable +{ + string? CreatedBy { get; } + DateTime CreatedOnUtc { get; } + string? LastModifiedBy { get; } + DateTime? LastModifiedOnUtc { get; } +} \ No newline at end of file diff --git a/src/Core/Domain/Interfaces/IDomainEvent.cs b/src/Core/Domain/Interfaces/IDomainEvent.cs new file mode 100644 index 0000000000..61ea72b346 --- /dev/null +++ b/src/Core/Domain/Interfaces/IDomainEvent.cs @@ -0,0 +1,5 @@ +namespace FSH.Framework.Core.Domain.Interfaces; +public interface IDomainEvent +{ + DateTime OccurredOnUtc { get; } +} \ No newline at end of file diff --git a/src/Core/Domain/Interfaces/IHasDomainEvents.cs b/src/Core/Domain/Interfaces/IHasDomainEvents.cs new file mode 100644 index 0000000000..fae9cec771 --- /dev/null +++ b/src/Core/Domain/Interfaces/IHasDomainEvents.cs @@ -0,0 +1,7 @@ +namespace FSH.Framework.Core.Domain.Interfaces; + +public interface IHasDomainEvents +{ + IReadOnlyCollection DomainEvents { get; } + void ClearDomainEvents(); +} \ No newline at end of file diff --git a/src/Core/Domain/Interfaces/ISoftDelete.cs b/src/Core/Domain/Interfaces/ISoftDelete.cs new file mode 100644 index 0000000000..6ecbe7464c --- /dev/null +++ b/src/Core/Domain/Interfaces/ISoftDelete.cs @@ -0,0 +1,7 @@ +namespace FSH.Framework.Core.Domain.Interfaces; +public interface ISoftDelete +{ + bool IsDeleted { get; } + DateTime? DeletedOnUtc { get; } + string? DeletedBy { get; } +} \ No newline at end of file diff --git a/src/Core/Domain/Interfaces/ITenantOwned.cs b/src/Core/Domain/Interfaces/ITenantOwned.cs new file mode 100644 index 0000000000..672dac31f9 --- /dev/null +++ b/src/Core/Domain/Interfaces/ITenantOwned.cs @@ -0,0 +1,6 @@ +namespace FSH.Framework.Core.Domain.Interfaces; + +public interface ITenantOwned +{ + string? TenantId { get; } +} \ No newline at end of file diff --git a/src/Core/Storage/FileType.cs b/src/Core/Storage/FileType.cs new file mode 100644 index 0000000000..31d82817d7 --- /dev/null +++ b/src/Core/Storage/FileType.cs @@ -0,0 +1,24 @@ +namespace FSH.Framework.Core.Storage; +public enum FileType +{ + Image, + Document, + Pdf +} + +public class FileValidationRules +{ + public IReadOnlyList AllowedExtensions { get; init; } = Array.Empty(); + public int MaxSizeInMB { get; init; } = 5; +} + +public static class FileTypeMetadata +{ + public static FileValidationRules GetRules(FileType type) => + type switch + { + FileType.Image => new() { AllowedExtensions = [".jpg", ".jpeg", ".png"], MaxSizeInMB = 5 }, + FileType.Pdf => new() { AllowedExtensions = [".pdf"], MaxSizeInMB = 10 }, + _ => throw new NotSupportedException($"Unsupported file type: {type}") + }; +} \ No newline at end of file diff --git a/src/Core/Storage/FileUploadRequest.cs b/src/Core/Storage/FileUploadRequest.cs new file mode 100644 index 0000000000..6b7d529013 --- /dev/null +++ b/src/Core/Storage/FileUploadRequest.cs @@ -0,0 +1,7 @@ +namespace FSH.Framework.Core.Storage; +public class FileUploadRequest +{ + public string FileName { get; init; } = default!; + public string ContentType { get; init; } = default!; + public IReadOnlyList Data { get; init; } = Array.Empty(); +} \ No newline at end of file diff --git a/src/Core/Storage/IStorageService.cs b/src/Core/Storage/IStorageService.cs new file mode 100644 index 0000000000..ce166d4c4d --- /dev/null +++ b/src/Core/Storage/IStorageService.cs @@ -0,0 +1,10 @@ +namespace FSH.Framework.Core.Storage; +public interface IStorageService +{ + Task UploadAsync( + FileUploadRequest request, + FileType fileType, + CancellationToken cancellationToken = default) where T : class; + + Task RemoveAsync(string path, CancellationToken cancellationToken = default); +} \ No newline at end of file diff --git a/src/Data/Data.csproj b/src/Data/Data.csproj new file mode 100644 index 0000000000..7819fc3a63 --- /dev/null +++ b/src/Data/Data.csproj @@ -0,0 +1,6 @@ + + + FSH.Framework.Data + FSH.Framework.Data + + diff --git a/src/Directory.Build.props b/src/Directory.Build.props index cf4b4bb3de..88ecb41494 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,18 +1,48 @@ - - net9.0 - false - false - true - true - enable - enable - true - latest - All - 2.0.4-rc;latest - - - - - \ No newline at end of file + + + net9.0 + + + latest + enable + enable + + + true + true + true + latest + AllEnabledByDefault + + + true + 1591 + + + + 3.0.0-alpha;latest + + + true + + + + + + all + runtime; build; native; contentfiles; analyzers + + + + + + Mukesh Murugan + FullStackHero + 3.0.0 + https://github.com/fullstackhero/dotnet-starter-kit + FSH;Modular;CQRS;VerticalSlice + + true + + diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index 7015fadbab..a198ef0684 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -9,88 +9,10 @@ true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - + + \ No newline at end of file diff --git a/src/Dockerfile.Blazor b/src/Dockerfile.Blazor deleted file mode 100644 index 2438ffea64..0000000000 --- a/src/Dockerfile.Blazor +++ /dev/null @@ -1,13 +0,0 @@ -FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build-env -WORKDIR /app - -COPY . ./ -RUN dotnet publish ./apps/blazor/client/Client.csproj -c Release -o output - -FROM nginx:alpine -WORKDIR /usr/share/nginx/html -COPY --from=build-env /app/output/wwwroot . - -COPY ./apps/blazor/nginx.conf /etc/nginx/nginx.conf - -EXPOSE 80 \ No newline at end of file diff --git a/src/FSH.Framework.slnx b/src/FSH.Framework.slnx new file mode 100644 index 0000000000..bd888462c7 --- /dev/null +++ b/src/FSH.Framework.slnx @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/FSH.Starter.sln b/src/FSH.Starter.sln deleted file mode 100644 index 904c59f770..0000000000 --- a/src/FSH.Starter.sln +++ /dev/null @@ -1,287 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.0.31903.59 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Modules", "Modules", "{F3DF5AC5-8CDC-46D4-969D-1245A6880215}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A32CEFB3-4E50-401E-8835-787534414F41}" - ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig - Directory.Build.props = Directory.Build.props - Directory.Packages.props = Directory.Packages.props - README.md = README.md - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Catalog", "Catalog", "{93324D12-DE1B-4C1B-934A-92AA140FF6F6}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Todo", "Todo", "{79981A5A-207A-4A16-A21B-5E80394082F6}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Framework", "_Framework", "{05248A38-0F34-4E59-A3D1-B07097987AFB}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Migrations", "Migrations", "{12F8343D-20A6-4E24-B0F5-3A66F2228CF6}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebApi", "WebApi", "{CE64E92B-E088-46FB-9028-7FB6B67DEC55}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Blazor", "Blazor", "{2B1F75CE-07A6-4C19-A2E3-F9E062CFDDFB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Infrastructure", "api\framework\Infrastructure\Infrastructure.csproj", "{294D6FF8-9379-4AB8-A203-8D0CC85FBFBB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core", "api\framework\Core\Core.csproj", "{A1D828E4-6B83-4BA2-B8E9-B21CE3BE8A31}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Server", "api\server\Server.csproj", "{86BD3DF6-A3E9-4839-8036-813A20DC8AD6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MSSQL", "api\migrations\MSSQL\MSSQL.csproj", "{ECCEA352-8953-49D6-8F87-8AB361499420}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PostgreSQL", "api\migrations\PostgreSQL\PostgreSQL.csproj", "{D64AD07C-A711-42D8-8653-EDCD7A825A44}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Todo", "api\modules\Todo\Todo.csproj", "{B3866EEF-8F46-4302-ABAC-A95EE2F27331}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Catalog.Application", "api\modules\Catalog\Catalog.Application\Catalog.Application.csproj", "{8C7DAF8E-F792-4092-8BBF-31A6B898B39A}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Catalog.Domain", "api\modules\Catalog\Catalog.Domain\Catalog.Domain.csproj", "{B15705B5-041C-4F1E-8342-AD03182EDD42}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Catalog.Infrastructure", "api\modules\Catalog\Catalog.Infrastructure\Catalog.Infrastructure.csproj", "{89FE1C3B-29D3-48A8-8E7D-90C261D266C5}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Client", "apps\blazor\client\Client.csproj", "{BCE4A428-8B97-4B56-AE45-496EE3906667}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Infrastructure", "apps\blazor\infrastructure\Infrastructure.csproj", "{27BEF279-AE73-43DC-92A9-FD7021A999D0}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Shared", "apps\blazor\shared\Shared.csproj", "{34359707-CE66-4DF0-9EF4-D7544B615564}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Aspire", "Aspire", "{D36E77BC-4568-4BC8-9506-1EFB7B1CD335}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ServiceDefaults", "aspire\service-defaults\ServiceDefaults.csproj", "{990CA37A-86D3-4FE6-B777-3CF0DDAC6BF6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Host", "aspire\host\Host.csproj", "{2119CE89-308D-4932-BFCE-8CDC0A05EB9E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Shared", "Shared\Shared.csproj", "{49AA63BF-3DBA-4490-9470-5AE0EB7F49F0}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Docs", "Docs", "{FE1B1E84-F993-4840-9CAB-9082EB523FDD}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Auth", "Auth", "{F17769D7-0E41-4E80-BDD4-282EBE7B5199}" - ProjectSection(SolutionItems) = preProject - GetToken.http = GetToken.http - EndProjectSection -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 - {294D6FF8-9379-4AB8-A203-8D0CC85FBFBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {294D6FF8-9379-4AB8-A203-8D0CC85FBFBB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {294D6FF8-9379-4AB8-A203-8D0CC85FBFBB}.Debug|x64.ActiveCfg = Debug|Any CPU - {294D6FF8-9379-4AB8-A203-8D0CC85FBFBB}.Debug|x64.Build.0 = Debug|Any CPU - {294D6FF8-9379-4AB8-A203-8D0CC85FBFBB}.Debug|x86.ActiveCfg = Debug|Any CPU - {294D6FF8-9379-4AB8-A203-8D0CC85FBFBB}.Debug|x86.Build.0 = Debug|Any CPU - {294D6FF8-9379-4AB8-A203-8D0CC85FBFBB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {294D6FF8-9379-4AB8-A203-8D0CC85FBFBB}.Release|Any CPU.Build.0 = Release|Any CPU - {294D6FF8-9379-4AB8-A203-8D0CC85FBFBB}.Release|x64.ActiveCfg = Release|Any CPU - {294D6FF8-9379-4AB8-A203-8D0CC85FBFBB}.Release|x64.Build.0 = Release|Any CPU - {294D6FF8-9379-4AB8-A203-8D0CC85FBFBB}.Release|x86.ActiveCfg = Release|Any CPU - {294D6FF8-9379-4AB8-A203-8D0CC85FBFBB}.Release|x86.Build.0 = Release|Any CPU - {A1D828E4-6B83-4BA2-B8E9-B21CE3BE8A31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A1D828E4-6B83-4BA2-B8E9-B21CE3BE8A31}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A1D828E4-6B83-4BA2-B8E9-B21CE3BE8A31}.Debug|x64.ActiveCfg = Debug|Any CPU - {A1D828E4-6B83-4BA2-B8E9-B21CE3BE8A31}.Debug|x64.Build.0 = Debug|Any CPU - {A1D828E4-6B83-4BA2-B8E9-B21CE3BE8A31}.Debug|x86.ActiveCfg = Debug|Any CPU - {A1D828E4-6B83-4BA2-B8E9-B21CE3BE8A31}.Debug|x86.Build.0 = Debug|Any CPU - {A1D828E4-6B83-4BA2-B8E9-B21CE3BE8A31}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A1D828E4-6B83-4BA2-B8E9-B21CE3BE8A31}.Release|Any CPU.Build.0 = Release|Any CPU - {A1D828E4-6B83-4BA2-B8E9-B21CE3BE8A31}.Release|x64.ActiveCfg = Release|Any CPU - {A1D828E4-6B83-4BA2-B8E9-B21CE3BE8A31}.Release|x64.Build.0 = Release|Any CPU - {A1D828E4-6B83-4BA2-B8E9-B21CE3BE8A31}.Release|x86.ActiveCfg = Release|Any CPU - {A1D828E4-6B83-4BA2-B8E9-B21CE3BE8A31}.Release|x86.Build.0 = Release|Any CPU - {86BD3DF6-A3E9-4839-8036-813A20DC8AD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {86BD3DF6-A3E9-4839-8036-813A20DC8AD6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {86BD3DF6-A3E9-4839-8036-813A20DC8AD6}.Debug|x64.ActiveCfg = Debug|Any CPU - {86BD3DF6-A3E9-4839-8036-813A20DC8AD6}.Debug|x64.Build.0 = Debug|Any CPU - {86BD3DF6-A3E9-4839-8036-813A20DC8AD6}.Debug|x86.ActiveCfg = Debug|Any CPU - {86BD3DF6-A3E9-4839-8036-813A20DC8AD6}.Debug|x86.Build.0 = Debug|Any CPU - {86BD3DF6-A3E9-4839-8036-813A20DC8AD6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {86BD3DF6-A3E9-4839-8036-813A20DC8AD6}.Release|Any CPU.Build.0 = Release|Any CPU - {86BD3DF6-A3E9-4839-8036-813A20DC8AD6}.Release|x64.ActiveCfg = Release|Any CPU - {86BD3DF6-A3E9-4839-8036-813A20DC8AD6}.Release|x64.Build.0 = Release|Any CPU - {86BD3DF6-A3E9-4839-8036-813A20DC8AD6}.Release|x86.ActiveCfg = Release|Any CPU - {86BD3DF6-A3E9-4839-8036-813A20DC8AD6}.Release|x86.Build.0 = Release|Any CPU - {ECCEA352-8953-49D6-8F87-8AB361499420}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ECCEA352-8953-49D6-8F87-8AB361499420}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ECCEA352-8953-49D6-8F87-8AB361499420}.Debug|x64.ActiveCfg = Debug|Any CPU - {ECCEA352-8953-49D6-8F87-8AB361499420}.Debug|x64.Build.0 = Debug|Any CPU - {ECCEA352-8953-49D6-8F87-8AB361499420}.Debug|x86.ActiveCfg = Debug|Any CPU - {ECCEA352-8953-49D6-8F87-8AB361499420}.Debug|x86.Build.0 = Debug|Any CPU - {ECCEA352-8953-49D6-8F87-8AB361499420}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ECCEA352-8953-49D6-8F87-8AB361499420}.Release|Any CPU.Build.0 = Release|Any CPU - {ECCEA352-8953-49D6-8F87-8AB361499420}.Release|x64.ActiveCfg = Release|Any CPU - {ECCEA352-8953-49D6-8F87-8AB361499420}.Release|x64.Build.0 = Release|Any CPU - {ECCEA352-8953-49D6-8F87-8AB361499420}.Release|x86.ActiveCfg = Release|Any CPU - {ECCEA352-8953-49D6-8F87-8AB361499420}.Release|x86.Build.0 = Release|Any CPU - {D64AD07C-A711-42D8-8653-EDCD7A825A44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D64AD07C-A711-42D8-8653-EDCD7A825A44}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D64AD07C-A711-42D8-8653-EDCD7A825A44}.Debug|x64.ActiveCfg = Debug|Any CPU - {D64AD07C-A711-42D8-8653-EDCD7A825A44}.Debug|x64.Build.0 = Debug|Any CPU - {D64AD07C-A711-42D8-8653-EDCD7A825A44}.Debug|x86.ActiveCfg = Debug|Any CPU - {D64AD07C-A711-42D8-8653-EDCD7A825A44}.Debug|x86.Build.0 = Debug|Any CPU - {D64AD07C-A711-42D8-8653-EDCD7A825A44}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D64AD07C-A711-42D8-8653-EDCD7A825A44}.Release|Any CPU.Build.0 = Release|Any CPU - {D64AD07C-A711-42D8-8653-EDCD7A825A44}.Release|x64.ActiveCfg = Release|Any CPU - {D64AD07C-A711-42D8-8653-EDCD7A825A44}.Release|x64.Build.0 = Release|Any CPU - {D64AD07C-A711-42D8-8653-EDCD7A825A44}.Release|x86.ActiveCfg = Release|Any CPU - {D64AD07C-A711-42D8-8653-EDCD7A825A44}.Release|x86.Build.0 = Release|Any CPU - {B3866EEF-8F46-4302-ABAC-A95EE2F27331}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B3866EEF-8F46-4302-ABAC-A95EE2F27331}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B3866EEF-8F46-4302-ABAC-A95EE2F27331}.Debug|x64.ActiveCfg = Debug|Any CPU - {B3866EEF-8F46-4302-ABAC-A95EE2F27331}.Debug|x64.Build.0 = Debug|Any CPU - {B3866EEF-8F46-4302-ABAC-A95EE2F27331}.Debug|x86.ActiveCfg = Debug|Any CPU - {B3866EEF-8F46-4302-ABAC-A95EE2F27331}.Debug|x86.Build.0 = Debug|Any CPU - {B3866EEF-8F46-4302-ABAC-A95EE2F27331}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B3866EEF-8F46-4302-ABAC-A95EE2F27331}.Release|Any CPU.Build.0 = Release|Any CPU - {B3866EEF-8F46-4302-ABAC-A95EE2F27331}.Release|x64.ActiveCfg = Release|Any CPU - {B3866EEF-8F46-4302-ABAC-A95EE2F27331}.Release|x64.Build.0 = Release|Any CPU - {B3866EEF-8F46-4302-ABAC-A95EE2F27331}.Release|x86.ActiveCfg = Release|Any CPU - {B3866EEF-8F46-4302-ABAC-A95EE2F27331}.Release|x86.Build.0 = Release|Any CPU - {8C7DAF8E-F792-4092-8BBF-31A6B898B39A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8C7DAF8E-F792-4092-8BBF-31A6B898B39A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8C7DAF8E-F792-4092-8BBF-31A6B898B39A}.Debug|x64.ActiveCfg = Debug|Any CPU - {8C7DAF8E-F792-4092-8BBF-31A6B898B39A}.Debug|x64.Build.0 = Debug|Any CPU - {8C7DAF8E-F792-4092-8BBF-31A6B898B39A}.Debug|x86.ActiveCfg = Debug|Any CPU - {8C7DAF8E-F792-4092-8BBF-31A6B898B39A}.Debug|x86.Build.0 = Debug|Any CPU - {8C7DAF8E-F792-4092-8BBF-31A6B898B39A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8C7DAF8E-F792-4092-8BBF-31A6B898B39A}.Release|Any CPU.Build.0 = Release|Any CPU - {8C7DAF8E-F792-4092-8BBF-31A6B898B39A}.Release|x64.ActiveCfg = Release|Any CPU - {8C7DAF8E-F792-4092-8BBF-31A6B898B39A}.Release|x64.Build.0 = Release|Any CPU - {8C7DAF8E-F792-4092-8BBF-31A6B898B39A}.Release|x86.ActiveCfg = Release|Any CPU - {8C7DAF8E-F792-4092-8BBF-31A6B898B39A}.Release|x86.Build.0 = Release|Any CPU - {B15705B5-041C-4F1E-8342-AD03182EDD42}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B15705B5-041C-4F1E-8342-AD03182EDD42}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B15705B5-041C-4F1E-8342-AD03182EDD42}.Debug|x64.ActiveCfg = Debug|Any CPU - {B15705B5-041C-4F1E-8342-AD03182EDD42}.Debug|x64.Build.0 = Debug|Any CPU - {B15705B5-041C-4F1E-8342-AD03182EDD42}.Debug|x86.ActiveCfg = Debug|Any CPU - {B15705B5-041C-4F1E-8342-AD03182EDD42}.Debug|x86.Build.0 = Debug|Any CPU - {B15705B5-041C-4F1E-8342-AD03182EDD42}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B15705B5-041C-4F1E-8342-AD03182EDD42}.Release|Any CPU.Build.0 = Release|Any CPU - {B15705B5-041C-4F1E-8342-AD03182EDD42}.Release|x64.ActiveCfg = Release|Any CPU - {B15705B5-041C-4F1E-8342-AD03182EDD42}.Release|x64.Build.0 = Release|Any CPU - {B15705B5-041C-4F1E-8342-AD03182EDD42}.Release|x86.ActiveCfg = Release|Any CPU - {B15705B5-041C-4F1E-8342-AD03182EDD42}.Release|x86.Build.0 = Release|Any CPU - {89FE1C3B-29D3-48A8-8E7D-90C261D266C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {89FE1C3B-29D3-48A8-8E7D-90C261D266C5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {89FE1C3B-29D3-48A8-8E7D-90C261D266C5}.Debug|x64.ActiveCfg = Debug|Any CPU - {89FE1C3B-29D3-48A8-8E7D-90C261D266C5}.Debug|x64.Build.0 = Debug|Any CPU - {89FE1C3B-29D3-48A8-8E7D-90C261D266C5}.Debug|x86.ActiveCfg = Debug|Any CPU - {89FE1C3B-29D3-48A8-8E7D-90C261D266C5}.Debug|x86.Build.0 = Debug|Any CPU - {89FE1C3B-29D3-48A8-8E7D-90C261D266C5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {89FE1C3B-29D3-48A8-8E7D-90C261D266C5}.Release|Any CPU.Build.0 = Release|Any CPU - {89FE1C3B-29D3-48A8-8E7D-90C261D266C5}.Release|x64.ActiveCfg = Release|Any CPU - {89FE1C3B-29D3-48A8-8E7D-90C261D266C5}.Release|x64.Build.0 = Release|Any CPU - {89FE1C3B-29D3-48A8-8E7D-90C261D266C5}.Release|x86.ActiveCfg = Release|Any CPU - {89FE1C3B-29D3-48A8-8E7D-90C261D266C5}.Release|x86.Build.0 = Release|Any CPU - {BCE4A428-8B97-4B56-AE45-496EE3906667}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BCE4A428-8B97-4B56-AE45-496EE3906667}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BCE4A428-8B97-4B56-AE45-496EE3906667}.Debug|x64.ActiveCfg = Debug|Any CPU - {BCE4A428-8B97-4B56-AE45-496EE3906667}.Debug|x64.Build.0 = Debug|Any CPU - {BCE4A428-8B97-4B56-AE45-496EE3906667}.Debug|x86.ActiveCfg = Debug|Any CPU - {BCE4A428-8B97-4B56-AE45-496EE3906667}.Debug|x86.Build.0 = Debug|Any CPU - {BCE4A428-8B97-4B56-AE45-496EE3906667}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BCE4A428-8B97-4B56-AE45-496EE3906667}.Release|Any CPU.Build.0 = Release|Any CPU - {BCE4A428-8B97-4B56-AE45-496EE3906667}.Release|x64.ActiveCfg = Release|Any CPU - {BCE4A428-8B97-4B56-AE45-496EE3906667}.Release|x64.Build.0 = Release|Any CPU - {BCE4A428-8B97-4B56-AE45-496EE3906667}.Release|x86.ActiveCfg = Release|Any CPU - {BCE4A428-8B97-4B56-AE45-496EE3906667}.Release|x86.Build.0 = Release|Any CPU - {27BEF279-AE73-43DC-92A9-FD7021A999D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {27BEF279-AE73-43DC-92A9-FD7021A999D0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {27BEF279-AE73-43DC-92A9-FD7021A999D0}.Debug|x64.ActiveCfg = Debug|Any CPU - {27BEF279-AE73-43DC-92A9-FD7021A999D0}.Debug|x64.Build.0 = Debug|Any CPU - {27BEF279-AE73-43DC-92A9-FD7021A999D0}.Debug|x86.ActiveCfg = Debug|Any CPU - {27BEF279-AE73-43DC-92A9-FD7021A999D0}.Debug|x86.Build.0 = Debug|Any CPU - {27BEF279-AE73-43DC-92A9-FD7021A999D0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {27BEF279-AE73-43DC-92A9-FD7021A999D0}.Release|Any CPU.Build.0 = Release|Any CPU - {27BEF279-AE73-43DC-92A9-FD7021A999D0}.Release|x64.ActiveCfg = Release|Any CPU - {27BEF279-AE73-43DC-92A9-FD7021A999D0}.Release|x64.Build.0 = Release|Any CPU - {27BEF279-AE73-43DC-92A9-FD7021A999D0}.Release|x86.ActiveCfg = Release|Any CPU - {27BEF279-AE73-43DC-92A9-FD7021A999D0}.Release|x86.Build.0 = Release|Any CPU - {34359707-CE66-4DF0-9EF4-D7544B615564}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {34359707-CE66-4DF0-9EF4-D7544B615564}.Debug|Any CPU.Build.0 = Debug|Any CPU - {34359707-CE66-4DF0-9EF4-D7544B615564}.Debug|x64.ActiveCfg = Debug|Any CPU - {34359707-CE66-4DF0-9EF4-D7544B615564}.Debug|x64.Build.0 = Debug|Any CPU - {34359707-CE66-4DF0-9EF4-D7544B615564}.Debug|x86.ActiveCfg = Debug|Any CPU - {34359707-CE66-4DF0-9EF4-D7544B615564}.Debug|x86.Build.0 = Debug|Any CPU - {34359707-CE66-4DF0-9EF4-D7544B615564}.Release|Any CPU.ActiveCfg = Release|Any CPU - {34359707-CE66-4DF0-9EF4-D7544B615564}.Release|Any CPU.Build.0 = Release|Any CPU - {34359707-CE66-4DF0-9EF4-D7544B615564}.Release|x64.ActiveCfg = Release|Any CPU - {34359707-CE66-4DF0-9EF4-D7544B615564}.Release|x64.Build.0 = Release|Any CPU - {34359707-CE66-4DF0-9EF4-D7544B615564}.Release|x86.ActiveCfg = Release|Any CPU - {34359707-CE66-4DF0-9EF4-D7544B615564}.Release|x86.Build.0 = Release|Any CPU - {990CA37A-86D3-4FE6-B777-3CF0DDAC6BF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {990CA37A-86D3-4FE6-B777-3CF0DDAC6BF6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {990CA37A-86D3-4FE6-B777-3CF0DDAC6BF6}.Debug|x64.ActiveCfg = Debug|Any CPU - {990CA37A-86D3-4FE6-B777-3CF0DDAC6BF6}.Debug|x64.Build.0 = Debug|Any CPU - {990CA37A-86D3-4FE6-B777-3CF0DDAC6BF6}.Debug|x86.ActiveCfg = Debug|Any CPU - {990CA37A-86D3-4FE6-B777-3CF0DDAC6BF6}.Debug|x86.Build.0 = Debug|Any CPU - {990CA37A-86D3-4FE6-B777-3CF0DDAC6BF6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {990CA37A-86D3-4FE6-B777-3CF0DDAC6BF6}.Release|Any CPU.Build.0 = Release|Any CPU - {990CA37A-86D3-4FE6-B777-3CF0DDAC6BF6}.Release|x64.ActiveCfg = Release|Any CPU - {990CA37A-86D3-4FE6-B777-3CF0DDAC6BF6}.Release|x64.Build.0 = Release|Any CPU - {990CA37A-86D3-4FE6-B777-3CF0DDAC6BF6}.Release|x86.ActiveCfg = Release|Any CPU - {990CA37A-86D3-4FE6-B777-3CF0DDAC6BF6}.Release|x86.Build.0 = Release|Any CPU - {2119CE89-308D-4932-BFCE-8CDC0A05EB9E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2119CE89-308D-4932-BFCE-8CDC0A05EB9E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2119CE89-308D-4932-BFCE-8CDC0A05EB9E}.Debug|x64.ActiveCfg = Debug|Any CPU - {2119CE89-308D-4932-BFCE-8CDC0A05EB9E}.Debug|x64.Build.0 = Debug|Any CPU - {2119CE89-308D-4932-BFCE-8CDC0A05EB9E}.Debug|x86.ActiveCfg = Debug|Any CPU - {2119CE89-308D-4932-BFCE-8CDC0A05EB9E}.Debug|x86.Build.0 = Debug|Any CPU - {2119CE89-308D-4932-BFCE-8CDC0A05EB9E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2119CE89-308D-4932-BFCE-8CDC0A05EB9E}.Release|Any CPU.Build.0 = Release|Any CPU - {2119CE89-308D-4932-BFCE-8CDC0A05EB9E}.Release|x64.ActiveCfg = Release|Any CPU - {2119CE89-308D-4932-BFCE-8CDC0A05EB9E}.Release|x64.Build.0 = Release|Any CPU - {2119CE89-308D-4932-BFCE-8CDC0A05EB9E}.Release|x86.ActiveCfg = Release|Any CPU - {2119CE89-308D-4932-BFCE-8CDC0A05EB9E}.Release|x86.Build.0 = Release|Any CPU - {49AA63BF-3DBA-4490-9470-5AE0EB7F49F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {49AA63BF-3DBA-4490-9470-5AE0EB7F49F0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {49AA63BF-3DBA-4490-9470-5AE0EB7F49F0}.Debug|x64.ActiveCfg = Debug|Any CPU - {49AA63BF-3DBA-4490-9470-5AE0EB7F49F0}.Debug|x64.Build.0 = Debug|Any CPU - {49AA63BF-3DBA-4490-9470-5AE0EB7F49F0}.Debug|x86.ActiveCfg = Debug|Any CPU - {49AA63BF-3DBA-4490-9470-5AE0EB7F49F0}.Debug|x86.Build.0 = Debug|Any CPU - {49AA63BF-3DBA-4490-9470-5AE0EB7F49F0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {49AA63BF-3DBA-4490-9470-5AE0EB7F49F0}.Release|Any CPU.Build.0 = Release|Any CPU - {49AA63BF-3DBA-4490-9470-5AE0EB7F49F0}.Release|x64.ActiveCfg = Release|Any CPU - {49AA63BF-3DBA-4490-9470-5AE0EB7F49F0}.Release|x64.Build.0 = Release|Any CPU - {49AA63BF-3DBA-4490-9470-5AE0EB7F49F0}.Release|x86.ActiveCfg = Release|Any CPU - {49AA63BF-3DBA-4490-9470-5AE0EB7F49F0}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {F3DF5AC5-8CDC-46D4-969D-1245A6880215} = {CE64E92B-E088-46FB-9028-7FB6B67DEC55} - {93324D12-DE1B-4C1B-934A-92AA140FF6F6} = {F3DF5AC5-8CDC-46D4-969D-1245A6880215} - {79981A5A-207A-4A16-A21B-5E80394082F6} = {F3DF5AC5-8CDC-46D4-969D-1245A6880215} - {05248A38-0F34-4E59-A3D1-B07097987AFB} = {CE64E92B-E088-46FB-9028-7FB6B67DEC55} - {12F8343D-20A6-4E24-B0F5-3A66F2228CF6} = {CE64E92B-E088-46FB-9028-7FB6B67DEC55} - {294D6FF8-9379-4AB8-A203-8D0CC85FBFBB} = {05248A38-0F34-4E59-A3D1-B07097987AFB} - {A1D828E4-6B83-4BA2-B8E9-B21CE3BE8A31} = {05248A38-0F34-4E59-A3D1-B07097987AFB} - {86BD3DF6-A3E9-4839-8036-813A20DC8AD6} = {CE64E92B-E088-46FB-9028-7FB6B67DEC55} - {ECCEA352-8953-49D6-8F87-8AB361499420} = {12F8343D-20A6-4E24-B0F5-3A66F2228CF6} - {D64AD07C-A711-42D8-8653-EDCD7A825A44} = {12F8343D-20A6-4E24-B0F5-3A66F2228CF6} - {B3866EEF-8F46-4302-ABAC-A95EE2F27331} = {79981A5A-207A-4A16-A21B-5E80394082F6} - {8C7DAF8E-F792-4092-8BBF-31A6B898B39A} = {93324D12-DE1B-4C1B-934A-92AA140FF6F6} - {B15705B5-041C-4F1E-8342-AD03182EDD42} = {93324D12-DE1B-4C1B-934A-92AA140FF6F6} - {89FE1C3B-29D3-48A8-8E7D-90C261D266C5} = {93324D12-DE1B-4C1B-934A-92AA140FF6F6} - {BCE4A428-8B97-4B56-AE45-496EE3906667} = {2B1F75CE-07A6-4C19-A2E3-F9E062CFDDFB} - {27BEF279-AE73-43DC-92A9-FD7021A999D0} = {2B1F75CE-07A6-4C19-A2E3-F9E062CFDDFB} - {34359707-CE66-4DF0-9EF4-D7544B615564} = {2B1F75CE-07A6-4C19-A2E3-F9E062CFDDFB} - {990CA37A-86D3-4FE6-B777-3CF0DDAC6BF6} = {D36E77BC-4568-4BC8-9506-1EFB7B1CD335} - {2119CE89-308D-4932-BFCE-8CDC0A05EB9E} = {D36E77BC-4568-4BC8-9506-1EFB7B1CD335} - {FE1B1E84-F993-4840-9CAB-9082EB523FDD} = {CE64E92B-E088-46FB-9028-7FB6B67DEC55} - {F17769D7-0E41-4E80-BDD4-282EBE7B5199} = {FE1B1E84-F993-4840-9CAB-9082EB523FDD} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {EA8248C2-3877-4AF7-8777-A17E7881E030} - EndGlobalSection -EndGlobal diff --git a/src/GetToken.http b/src/GetToken.http deleted file mode 100644 index 0de6481c71..0000000000 --- a/src/GetToken.http +++ /dev/null @@ -1,10 +0,0 @@ -@Host = https://localhost:7000 - -POST {{Host}}/api/token/ -Accept: application/json -Content-Type: application/json -tenant: root -{ - "email":"admin@root.com", - "password":"123Pa$$word!" -} diff --git a/src/Infrastructure/Infrastructure.csproj b/src/Infrastructure/Infrastructure.csproj new file mode 100644 index 0000000000..f8a26110cf --- /dev/null +++ b/src/Infrastructure/Infrastructure.csproj @@ -0,0 +1,14 @@ + + + FSH.Framework.Infrastructure + FSH.Framework.Infrastructure + + + + + + + + + + diff --git a/src/Shared/Authorization/AppConstants.cs b/src/Shared/Authorization/AppConstants.cs deleted file mode 100644 index 5334ee902f..0000000000 --- a/src/Shared/Authorization/AppConstants.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Collections.ObjectModel; - -namespace FSH.Starter.Shared.Authorization; -public static class AppConstants -{ - public static readonly Collection SupportedImageFormats = - [ - ".jpeg", - ".jpg", - ".png" - ]; - public static readonly string StandardImageFormat = "image/jpeg"; - public static readonly int MaxImageWidth = 1500; - public static readonly int MaxImageHeight = 1500; - public static readonly long MaxAllowedSize = 1000000; // Allows Max File Size of 1 Mb. -} diff --git a/src/Shared/Authorization/ClaimsPrincipalExtensions.cs b/src/Shared/Authorization/ClaimsPrincipalExtensions.cs deleted file mode 100644 index 4c4398d73a..0000000000 --- a/src/Shared/Authorization/ClaimsPrincipalExtensions.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System.Security.Claims; - -namespace FSH.Starter.Shared.Authorization; -public static class ClaimsPrincipalExtensions -{ - public static string? GetEmail(this ClaimsPrincipal principal) - => principal.FindFirstValue(ClaimTypes.Email); - - public static string? GetTenant(this ClaimsPrincipal principal) - => principal.FindFirstValue(FshClaims.Tenant); - - public static string? GetFullName(this ClaimsPrincipal principal) - => principal?.FindFirst(FshClaims.Fullname)?.Value; - - public static string? GetFirstName(this ClaimsPrincipal principal) - => principal?.FindFirst(ClaimTypes.Name)?.Value; - - public static string? GetSurname(this ClaimsPrincipal principal) - => principal?.FindFirst(ClaimTypes.Surname)?.Value; - - public static string? GetPhoneNumber(this ClaimsPrincipal principal) - => principal.FindFirstValue(ClaimTypes.MobilePhone); - - public static string? GetUserId(this ClaimsPrincipal principal) - => principal.FindFirstValue(ClaimTypes.NameIdentifier); - - public static Uri? GetImageUrl(this ClaimsPrincipal principal) - { - var imageUrl = principal.FindFirstValue(FshClaims.ImageUrl); - return Uri.TryCreate(imageUrl, UriKind.Absolute, out var uri) ? uri : null; - } - - public static DateTimeOffset GetExpiration(this ClaimsPrincipal principal) => - DateTimeOffset.FromUnixTimeSeconds(Convert.ToInt64( - principal.FindFirstValue(FshClaims.Expiration))); - - private static string? FindFirstValue(this ClaimsPrincipal principal, string claimType) => - principal is null - ? throw new ArgumentNullException(nameof(principal)) - : principal.FindFirst(claimType)?.Value; -} diff --git a/src/Shared/Authorization/FshActions.cs b/src/Shared/Authorization/FshActions.cs deleted file mode 100644 index a29f17e51e..0000000000 --- a/src/Shared/Authorization/FshActions.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace FSH.Starter.Shared.Authorization; -public static class FshActions -{ - public const string View = nameof(View); - public const string Search = nameof(Search); - public const string Create = nameof(Create); - public const string Update = nameof(Update); - public const string Delete = nameof(Delete); - public const string Export = nameof(Export); - public const string Generate = nameof(Generate); - public const string Clean = nameof(Clean); - public const string UpgradeSubscription = nameof(UpgradeSubscription); -} diff --git a/src/Shared/Authorization/FshClaims.cs b/src/Shared/Authorization/FshClaims.cs deleted file mode 100644 index bdf9020684..0000000000 --- a/src/Shared/Authorization/FshClaims.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace FSH.Starter.Shared.Authorization; - -public static class FshClaims -{ - public const string Tenant = "tenant"; - public const string Fullname = "fullName"; - public const string Permission = "permission"; - public const string ImageUrl = "image_url"; - public const string IpAddress = "ipAddress"; - public const string Expiration = "exp"; -} diff --git a/src/Shared/Authorization/FshPermissions.cs b/src/Shared/Authorization/FshPermissions.cs deleted file mode 100644 index fad6676ee8..0000000000 --- a/src/Shared/Authorization/FshPermissions.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System.Collections.ObjectModel; - -namespace FSH.Starter.Shared.Authorization; - -public static class FshPermissions -{ - private static readonly FshPermission[] AllPermissions = - [ - //tenants - new("View Tenants", FshActions.View, FshResources.Tenants, IsRoot: true), - new("Create Tenants", FshActions.Create, FshResources.Tenants, IsRoot: true), - new("Update Tenants", FshActions.Update, FshResources.Tenants, IsRoot: true), - new("Upgrade Tenant Subscription", FshActions.UpgradeSubscription, FshResources.Tenants, IsRoot: true), - - //identity - new("View Users", FshActions.View, FshResources.Users), - new("Search Users", FshActions.Search, FshResources.Users), - new("Create Users", FshActions.Create, FshResources.Users), - new("Update Users", FshActions.Update, FshResources.Users), - new("Delete Users", FshActions.Delete, FshResources.Users), - new("Export Users", FshActions.Export, FshResources.Users), - new("View UserRoles", FshActions.View, FshResources.UserRoles), - new("Update UserRoles", FshActions.Update, FshResources.UserRoles), - new("View Roles", FshActions.View, FshResources.Roles), - new("Create Roles", FshActions.Create, FshResources.Roles), - new("Update Roles", FshActions.Update, FshResources.Roles), - new("Delete Roles", FshActions.Delete, FshResources.Roles), - new("View RoleClaims", FshActions.View, FshResources.RoleClaims), - new("Update RoleClaims", FshActions.Update, FshResources.RoleClaims), - - //products - new("View Products", FshActions.View, FshResources.Products, IsBasic: true), - new("Search Products", FshActions.Search, FshResources.Products, IsBasic: true), - new("Create Products", FshActions.Create, FshResources.Products), - new("Update Products", FshActions.Update, FshResources.Products), - new("Delete Products", FshActions.Delete, FshResources.Products), - new("Export Products", FshActions.Export, FshResources.Products), - - //brands - new("View Brands", FshActions.View, FshResources.Brands, IsBasic: true), - new("Search Brands", FshActions.Search, FshResources.Brands, IsBasic: true), - new("Create Brands", FshActions.Create, FshResources.Brands), - new("Update Brands", FshActions.Update, FshResources.Brands), - new("Delete Brands", FshActions.Delete, FshResources.Brands), - new("Export Brands", FshActions.Export, FshResources.Brands), - - //todos - new("View Todos", FshActions.View, FshResources.Todos, IsBasic: true), - new("Search Todos", FshActions.Search, FshResources.Todos, IsBasic: true), - new("Create Todos", FshActions.Create, FshResources.Todos), - new("Update Todos", FshActions.Update, FshResources.Todos), - new("Delete Todos", FshActions.Delete, FshResources.Todos), - new("Export Todos", FshActions.Export, FshResources.Todos), - - new("View Hangfire", FshActions.View, FshResources.Hangfire), - new("View Dashboard", FshActions.View, FshResources.Dashboard), - - //audit - new("View Audit Trails", FshActions.View, FshResources.AuditTrails), - ]; - - public static IReadOnlyList All { get; } = new ReadOnlyCollection(AllPermissions); - public static IReadOnlyList Root { get; } = new ReadOnlyCollection(AllPermissions.Where(p => p.IsRoot).ToArray()); - public static IReadOnlyList Admin { get; } = new ReadOnlyCollection(AllPermissions.Where(p => !p.IsRoot).ToArray()); - public static IReadOnlyList Basic { get; } = new ReadOnlyCollection(AllPermissions.Where(p => p.IsBasic).ToArray()); -} - -public record FshPermission(string Description, string Action, string Resource, bool IsBasic = false, bool IsRoot = false) -{ - public string Name => NameFor(Action, Resource); - public static string NameFor(string action, string resource) - { - return $"Permissions.{resource}.{action}"; - } -} - - diff --git a/src/Shared/Authorization/FshResources.cs b/src/Shared/Authorization/FshResources.cs deleted file mode 100644 index e8d276c470..0000000000 --- a/src/Shared/Authorization/FshResources.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace FSH.Starter.Shared.Authorization; -public static class FshResources -{ - public const string Tenants = nameof(Tenants); - public const string Dashboard = nameof(Dashboard); - public const string Hangfire = nameof(Hangfire); - public const string Users = nameof(Users); - public const string UserRoles = nameof(UserRoles); - public const string Roles = nameof(Roles); - public const string RoleClaims = nameof(RoleClaims); - public const string Products = nameof(Products); - public const string Brands = nameof(Brands); - public const string Todos = nameof(Todos); - public const string AuditTrails = nameof(AuditTrails); -} diff --git a/src/Shared/Authorization/FshRoles.cs b/src/Shared/Authorization/FshRoles.cs deleted file mode 100644 index e471e50930..0000000000 --- a/src/Shared/Authorization/FshRoles.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Collections.ObjectModel; - -namespace FSH.Starter.Shared.Authorization; - -public static class FshRoles -{ - public const string Admin = nameof(Admin); - public const string Basic = nameof(Basic); - - public static IReadOnlyList DefaultRoles { get; } = new ReadOnlyCollection(new[] - { - Admin, - Basic - }); - - public static bool IsDefault(string roleName) => DefaultRoles.Any(r => r == roleName); -} diff --git a/src/Shared/Authorization/IdentityConstants.cs b/src/Shared/Authorization/IdentityConstants.cs deleted file mode 100644 index 7d15a098be..0000000000 --- a/src/Shared/Authorization/IdentityConstants.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace FSH.Starter.Shared.Authorization; -public static class IdentityConstants -{ - public const int PasswordLength = 6; - public const string SchemaName = "identity"; -} diff --git a/src/Shared/Authorization/TenantConstants.cs b/src/Shared/Authorization/TenantConstants.cs deleted file mode 100644 index 984fe77e1a..0000000000 --- a/src/Shared/Authorization/TenantConstants.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace FSH.Starter.Shared.Authorization; -public static class TenantConstants -{ - public static class Root - { - public const string Id = "root"; - public const string Name = "Root"; - public const string EmailAddress = "admin@root.com"; - public const string DefaultProfilePicture = "assets/defaults/profile-picture.webp"; - } - - public const string DefaultPassword = "123Pa$$word!"; - - public const string Identifier = "tenant"; - -} diff --git a/src/Shared/Constants/SchemaNames.cs b/src/Shared/Constants/SchemaNames.cs deleted file mode 100644 index 6f6763a8b2..0000000000 --- a/src/Shared/Constants/SchemaNames.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Shared.Constants; -public static class SchemaNames -{ - public const string Todo = "todo"; - public const string Catalog = "catalog"; - public const string Tenant = "tenant"; -} diff --git a/src/Shared/Shared.csproj b/src/Shared/Shared.csproj index 125f4c93bc..33fe52ad7e 100644 --- a/src/Shared/Shared.csproj +++ b/src/Shared/Shared.csproj @@ -1,9 +1,6 @@  - - - net9.0 - enable - enable - - + + FSH.Framework.Shared + FSH.Framework.Shared + diff --git a/src/Web/Endpoints/Abstractions/IEndpointDefinition.cs b/src/Web/Endpoints/Abstractions/IEndpointDefinition.cs new file mode 100644 index 0000000000..ef7871ae5b --- /dev/null +++ b/src/Web/Endpoints/Abstractions/IEndpointDefinition.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNetCore.Builder; + +namespace FSH.Framework.Web.Endpoints.Abstractions; + +public interface IEndpointDefinition +{ + void DefineEndpoints(WebApplication app); +} \ No newline at end of file diff --git a/src/Web/Endpoints/Extensions.cs b/src/Web/Endpoints/Extensions.cs new file mode 100644 index 0000000000..d6571d7870 --- /dev/null +++ b/src/Web/Endpoints/Extensions.cs @@ -0,0 +1,25 @@ +using FSH.Framework.Web.Endpoints.Abstractions; +using Microsoft.AspNetCore.Builder; +using System.Reflection; + +namespace FSH.Framework.Web.Endpoints; +public static class Extensions +{ + public static WebApplication MapEndpointsFromAssembly(this WebApplication app, Assembly assembly) + { + var endpointDefinitions = assembly + .GetTypes() + .Where(t => t.IsAssignableTo(typeof(IEndpointDefinition)) + && !t.IsAbstract + && !t.IsInterface) + .Select(Activator.CreateInstance) + .Cast(); + + foreach (var endpointDefinition in endpointDefinitions) + { + endpointDefinition.DefineEndpoints(app); + } + + return app; + } +} \ No newline at end of file diff --git a/src/Web/Observability/Logging/Enrichers/TenantIdEnricher.cs b/src/Web/Observability/Logging/Enrichers/TenantIdEnricher.cs new file mode 100644 index 0000000000..2eb7225ce7 --- /dev/null +++ b/src/Web/Observability/Logging/Enrichers/TenantIdEnricher.cs @@ -0,0 +1,39 @@ +using Microsoft.AspNetCore.Http; +using Serilog.Core; +using Serilog.Events; +using System.Security.Claims; + +namespace FSH.Framework.Web.Observability.Logging.Enrichers; + +public sealed class TenantIdEnricher : ILogEventEnricher +{ + public const string PropertyName = "TenantId"; + private static readonly HttpContextAccessor Accessor = new(); + + public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory) + { + ArgumentNullException.ThrowIfNull(logEvent); + ArgumentNullException.ThrowIfNull(propertyFactory); + + var http = Accessor.HttpContext; + string tenantId = + GetFromClaims(http?.User) ?? + GetFromItems(http) ?? + GetFromHeader(http) ?? + "unknown"; + + var prop = propertyFactory.CreateProperty(PropertyName, tenantId, false); + logEvent.AddPropertyIfAbsent(prop); + } + + private static string? GetFromClaims(ClaimsPrincipal? user) => + user?.FindFirstValue("tenant_id") + ?? user?.FindFirstValue("tid") + ?? user?.FindFirstValue("TenantId"); + + private static string? GetFromItems(HttpContext? ctx) => + ctx is not null && ctx.Items.TryGetValue("TenantId", out var v) ? v?.ToString() : null; + + private static string? GetFromHeader(HttpContext? ctx) => + ctx?.Request?.Headers.TryGetValue("X-Tenant", out var val) == true ? val.ToString() : null; +} \ No newline at end of file diff --git a/src/Web/Observability/Logging/SerilogExtensions.cs b/src/Web/Observability/Logging/SerilogExtensions.cs new file mode 100644 index 0000000000..4e5f034098 --- /dev/null +++ b/src/Web/Observability/Logging/SerilogExtensions.cs @@ -0,0 +1,28 @@ +using FSH.Framework.Web.Observability.Logging.Enrichers; +using Microsoft.AspNetCore.Builder; +using Serilog; +using Serilog.Events; +using Serilog.Filters; + +namespace FSH.Framework.Web.Observability.Logging; +public static class SerilogExtensions +{ + public static WebApplicationBuilder UseStructuredLogging(this WebApplicationBuilder builder) + { + ArgumentNullException.ThrowIfNull(builder); + builder.Host.UseSerilog((context, logger) => + { + logger.ReadFrom.Configuration(context.Configuration); + logger.Enrich.FromLogContext(); + logger.Enrich.With(new TenantIdEnricher()); + logger + .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) + .MinimumLevel.Override("Microsoft.Hosting.Lifetime", LogEventLevel.Information) + .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Error) + .MinimumLevel.Override("Hangfire", LogEventLevel.Warning) + .MinimumLevel.Override("Finbuckle.MultiTenant", LogEventLevel.Warning) + .Filter.ByExcluding(Matching.FromSource("Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware")); + }); + return builder; + } +} \ No newline at end of file diff --git a/src/Web/Web.csproj b/src/Web/Web.csproj new file mode 100644 index 0000000000..179d905b45 --- /dev/null +++ b/src/Web/Web.csproj @@ -0,0 +1,17 @@ + + + FSH.Framework.Web + FSH.Framework.Web + + + + + + + + + + + + + diff --git a/src/api/framework/Core/Audit/AuditTrail.cs b/src/api/framework/Core/Audit/AuditTrail.cs deleted file mode 100644 index 97448ac39f..0000000000 --- a/src/api/framework/Core/Audit/AuditTrail.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace FSH.Framework.Core.Audit; -public class AuditTrail -{ - public Guid Id { get; set; } - public Guid UserId { get; set; } - public string? Operation { get; set; } - public string? Entity { get; set; } - public DateTimeOffset DateTime { get; set; } - public string? PreviousValues { get; set; } - public string? NewValues { get; set; } - public string? ModifiedProperties { get; set; } - public string? PrimaryKey { get; set; } -} diff --git a/src/api/framework/Core/Audit/IAuditService.cs b/src/api/framework/Core/Audit/IAuditService.cs deleted file mode 100644 index 9c62f4d0db..0000000000 --- a/src/api/framework/Core/Audit/IAuditService.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace FSH.Framework.Core.Audit; -public interface IAuditService -{ - Task> GetUserTrailsAsync(Guid userId); -} diff --git a/src/api/framework/Core/Audit/TrailDto.cs b/src/api/framework/Core/Audit/TrailDto.cs deleted file mode 100644 index 8268e4b172..0000000000 --- a/src/api/framework/Core/Audit/TrailDto.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System.Collections.ObjectModel; -using System.Text.Json; - -namespace FSH.Framework.Core.Audit; -public class TrailDto() -{ - public Guid Id { get; set; } - public DateTimeOffset DateTime { get; set; } - public Guid UserId { get; set; } - public Dictionary KeyValues { get; } = []; - public Dictionary OldValues { get; } = []; - public Dictionary NewValues { get; } = []; - public Collection ModifiedProperties { get; } = []; - public TrailType Type { get; set; } - public string? TableName { get; set; } - - private static readonly JsonSerializerOptions SerializerOptions = new() - { - WriteIndented = false, - }; - - public AuditTrail ToAuditTrail() - { - return new() - { - Id = Guid.NewGuid(), - UserId = UserId, - Operation = Type.ToString(), - Entity = TableName, - DateTime = DateTime, - PrimaryKey = JsonSerializer.Serialize(KeyValues, SerializerOptions), - PreviousValues = OldValues.Count == 0 ? null : JsonSerializer.Serialize(OldValues, SerializerOptions), - NewValues = NewValues.Count == 0 ? null : JsonSerializer.Serialize(NewValues, SerializerOptions), - ModifiedProperties = ModifiedProperties.Count == 0 ? null : JsonSerializer.Serialize(ModifiedProperties, SerializerOptions) - }; - } -} diff --git a/src/api/framework/Core/Audit/TrailType.cs b/src/api/framework/Core/Audit/TrailType.cs deleted file mode 100644 index a98bfa29b6..0000000000 --- a/src/api/framework/Core/Audit/TrailType.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace FSH.Framework.Core.Audit; -public enum TrailType -{ - None = 0, - Create = 1, - Update = 2, - Delete = 3 -} diff --git a/src/api/framework/Core/Auth/Jwt/JwtOptions.cs b/src/api/framework/Core/Auth/Jwt/JwtOptions.cs deleted file mode 100644 index 5d99d6702f..0000000000 --- a/src/api/framework/Core/Auth/Jwt/JwtOptions.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace FSH.Framework.Core.Auth.Jwt; -public class JwtOptions : IValidatableObject -{ - public string Key { get; set; } = string.Empty; - - public int TokenExpirationInMinutes { get; set; } = 60; - - public int RefreshTokenExpirationInDays { get; set; } = 7; - - public IEnumerable Validate(ValidationContext validationContext) - { - if (string.IsNullOrEmpty(Key)) - { - yield return new ValidationResult("No Key defined in JwtSettings config", [nameof(Key)]); - } - } -} diff --git a/src/api/framework/Core/Caching/CacheOptions.cs b/src/api/framework/Core/Caching/CacheOptions.cs deleted file mode 100644 index b861c2e06a..0000000000 --- a/src/api/framework/Core/Caching/CacheOptions.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace FSH.Framework.Core.Caching; - -public class CacheOptions -{ - public string Redis { get; set; } = string.Empty; -} diff --git a/src/api/framework/Core/Caching/CacheServiceExtensions.cs b/src/api/framework/Core/Caching/CacheServiceExtensions.cs deleted file mode 100644 index c03f94cc1f..0000000000 --- a/src/api/framework/Core/Caching/CacheServiceExtensions.cs +++ /dev/null @@ -1,42 +0,0 @@ -namespace FSH.Framework.Core.Caching; - -public static class CacheServiceExtensions -{ - public static T? GetOrSet(this ICacheService cache, string key, Func getItemCallback, TimeSpan? slidingExpiration = null) - { - T? value = cache.Get(key); - - if (value is not null) - { - return value; - } - - value = getItemCallback(); - - if (value is not null) - { - cache.Set(key, value, slidingExpiration); - } - - return value; - } - - public static async Task GetOrSetAsync(this ICacheService cache, string key, Func> task, TimeSpan? slidingExpiration = null, CancellationToken cancellationToken = default) - { - T? value = await cache.GetAsync(key, cancellationToken); - - if (value is not null) - { - return value; - } - - value = await task(); - - if (value is not null) - { - await cache.SetAsync(key, value, slidingExpiration, cancellationToken); - } - - return value; - } -} diff --git a/src/api/framework/Core/Caching/ICacheService.cs b/src/api/framework/Core/Caching/ICacheService.cs deleted file mode 100644 index 54f3c09048..0000000000 --- a/src/api/framework/Core/Caching/ICacheService.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace FSH.Framework.Core.Caching; - -public interface ICacheService -{ - T? Get(string key); - Task GetAsync(string key, CancellationToken token = default); - - void Refresh(string key); - Task RefreshAsync(string key, CancellationToken token = default); - - void Remove(string key); - Task RemoveAsync(string key, CancellationToken token = default); - - void Set(string key, T value, TimeSpan? slidingExpiration = null); - Task SetAsync(string key, T value, TimeSpan? slidingExpiration = null, CancellationToken cancellationToken = default); -} \ No newline at end of file diff --git a/src/api/framework/Core/Core.csproj b/src/api/framework/Core/Core.csproj deleted file mode 100644 index 13d0f1dbc8..0000000000 --- a/src/api/framework/Core/Core.csproj +++ /dev/null @@ -1,19 +0,0 @@ - - - FSH.Framework.Core - FSH.Framework.Core - - - - - - - - - - - - - - - diff --git a/src/api/framework/Core/Domain/AuditableEntity.cs b/src/api/framework/Core/Domain/AuditableEntity.cs deleted file mode 100644 index 6639a02156..0000000000 --- a/src/api/framework/Core/Domain/AuditableEntity.cs +++ /dev/null @@ -1,18 +0,0 @@ -using FSH.Framework.Core.Domain.Contracts; - -namespace FSH.Framework.Core.Domain; - -public class AuditableEntity : BaseEntity, IAuditable, ISoftDeletable -{ - public DateTimeOffset Created { get; set; } - public Guid CreatedBy { get; set; } - public DateTimeOffset LastModified { get; set; } - public Guid? LastModifiedBy { get; set; } - public DateTimeOffset? Deleted { get; set; } - public Guid? DeletedBy { get; set; } -} - -public abstract class AuditableEntity : AuditableEntity -{ - protected AuditableEntity() => Id = Guid.NewGuid(); -} diff --git a/src/api/framework/Core/Domain/BaseEntity.cs b/src/api/framework/Core/Domain/BaseEntity.cs deleted file mode 100644 index 1c2e98daaf..0000000000 --- a/src/api/framework/Core/Domain/BaseEntity.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Collections.ObjectModel; -using System.ComponentModel.DataAnnotations.Schema; -using FSH.Framework.Core.Domain.Contracts; -using FSH.Framework.Core.Domain.Events; - -namespace FSH.Framework.Core.Domain; - -public abstract class BaseEntity : IEntity -{ - public TId Id { get; protected init; } = default!; - [NotMapped] - public Collection DomainEvents { get; } = new Collection(); - public void QueueDomainEvent(DomainEvent @event) - { - if (!DomainEvents.Contains(@event)) - DomainEvents.Add(@event); - } -} - -public abstract class BaseEntity : BaseEntity -{ - protected BaseEntity() => Id = Guid.NewGuid(); -} diff --git a/src/api/framework/Core/Domain/Contracts/IAggregateRoot.cs b/src/api/framework/Core/Domain/Contracts/IAggregateRoot.cs deleted file mode 100644 index cc98c00dba..0000000000 --- a/src/api/framework/Core/Domain/Contracts/IAggregateRoot.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace FSH.Framework.Core.Domain.Contracts; - -// Apply this marker interface only to aggregate root entities -// Repositories will only work with aggregate roots, not their children -public interface IAggregateRoot : IEntity -{ -} diff --git a/src/api/framework/Core/Domain/Contracts/IAuditable.cs b/src/api/framework/Core/Domain/Contracts/IAuditable.cs deleted file mode 100644 index edfa8ab9f3..0000000000 --- a/src/api/framework/Core/Domain/Contracts/IAuditable.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace FSH.Framework.Core.Domain.Contracts; - -public interface IAuditable -{ - DateTimeOffset Created { get; } - Guid CreatedBy { get; } - DateTimeOffset LastModified { get; } - Guid? LastModifiedBy { get; } -} diff --git a/src/api/framework/Core/Domain/Contracts/IEntity.cs b/src/api/framework/Core/Domain/Contracts/IEntity.cs deleted file mode 100644 index 1d48d306d6..0000000000 --- a/src/api/framework/Core/Domain/Contracts/IEntity.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections.ObjectModel; -using FSH.Framework.Core.Domain.Events; - -namespace FSH.Framework.Core.Domain.Contracts; - -public interface IEntity -{ - Collection DomainEvents { get; } -} - -public interface IEntity : IEntity -{ - TId Id { get; } -} diff --git a/src/api/framework/Core/Domain/Contracts/ISoftDeletable.cs b/src/api/framework/Core/Domain/Contracts/ISoftDeletable.cs deleted file mode 100644 index d129d02e4a..0000000000 --- a/src/api/framework/Core/Domain/Contracts/ISoftDeletable.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace FSH.Framework.Core.Domain.Contracts; - -public interface ISoftDeletable -{ - DateTimeOffset? Deleted { get; set; } - Guid? DeletedBy { get; set; } -} diff --git a/src/api/framework/Core/Domain/Events/DomainEvent.cs b/src/api/framework/Core/Domain/Events/DomainEvent.cs deleted file mode 100644 index 5350854602..0000000000 --- a/src/api/framework/Core/Domain/Events/DomainEvent.cs +++ /dev/null @@ -1,7 +0,0 @@ -using MediatR; - -namespace FSH.Framework.Core.Domain.Events; -public abstract record DomainEvent : IDomainEvent, INotification -{ - public DateTime RaisedOn { get; protected set; } = DateTime.UtcNow; -} diff --git a/src/api/framework/Core/Domain/Events/IDomainEvent.cs b/src/api/framework/Core/Domain/Events/IDomainEvent.cs deleted file mode 100644 index 68d4c8f6c2..0000000000 --- a/src/api/framework/Core/Domain/Events/IDomainEvent.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace FSH.Framework.Core.Domain.Events; -public interface IDomainEvent -{ -} diff --git a/src/api/framework/Core/Exceptions/CustomException.cs b/src/api/framework/Core/Exceptions/CustomException.cs deleted file mode 100644 index 4d1af9af97..0000000000 --- a/src/api/framework/Core/Exceptions/CustomException.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Net; - -namespace FSH.Framework.Core.Exceptions; - -public class CustomException : Exception -{ - public List? ErrorMessages { get; } - - public HttpStatusCode StatusCode { get; } - - public CustomException(string message, List? errors = default, HttpStatusCode statusCode = HttpStatusCode.InternalServerError) - : base(message) - { - ErrorMessages = errors; - StatusCode = statusCode; - } -} diff --git a/src/api/framework/Core/Exceptions/ForbiddenException.cs b/src/api/framework/Core/Exceptions/ForbiddenException.cs deleted file mode 100644 index fdafead902..0000000000 --- a/src/api/framework/Core/Exceptions/ForbiddenException.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Net; - -namespace FSH.Framework.Core.Exceptions; -public class ForbiddenException : FshException -{ - public ForbiddenException() - : base("unauthorized", [], HttpStatusCode.Forbidden) - { - } - public ForbiddenException(string message) - : base(message, [], HttpStatusCode.Forbidden) - { - } -} diff --git a/src/api/framework/Core/Exceptions/FshException.cs b/src/api/framework/Core/Exceptions/FshException.cs deleted file mode 100644 index 28597c5297..0000000000 --- a/src/api/framework/Core/Exceptions/FshException.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Net; - -namespace FSH.Framework.Core.Exceptions; -public class FshException : Exception -{ - public IEnumerable ErrorMessages { get; } - - public HttpStatusCode StatusCode { get; } - - public FshException(string message, IEnumerable errors, HttpStatusCode statusCode = HttpStatusCode.InternalServerError) - : base(message) - { - ErrorMessages = errors; - StatusCode = statusCode; - } - - public FshException(string message) : base(message) - { - ErrorMessages = new List(); - } -} diff --git a/src/api/framework/Core/Exceptions/NotFoundException.cs b/src/api/framework/Core/Exceptions/NotFoundException.cs deleted file mode 100644 index 351e25cfc7..0000000000 --- a/src/api/framework/Core/Exceptions/NotFoundException.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Collections.ObjectModel; -using System.Net; - -namespace FSH.Framework.Core.Exceptions; -public class NotFoundException : FshException -{ - public NotFoundException(string message) - : base(message, new Collection(), HttpStatusCode.NotFound) - { - } -} diff --git a/src/api/framework/Core/Exceptions/UnauthorizedException.cs b/src/api/framework/Core/Exceptions/UnauthorizedException.cs deleted file mode 100644 index 559eb060c8..0000000000 --- a/src/api/framework/Core/Exceptions/UnauthorizedException.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Collections.ObjectModel; -using System.Net; - -namespace FSH.Framework.Core.Exceptions; -public class UnauthorizedException : FshException -{ - public UnauthorizedException() - : base("authentication failed", new Collection(), HttpStatusCode.Unauthorized) - { - } - public UnauthorizedException(string message) - : base(message, new Collection(), HttpStatusCode.Unauthorized) - { - } -} diff --git a/src/api/framework/Core/FshCore.cs b/src/api/framework/Core/FshCore.cs deleted file mode 100644 index 1891dc8d21..0000000000 --- a/src/api/framework/Core/FshCore.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace FSH.Framework.Core; -public static class FshCore -{ - public static string Name { get; set; } = "FshCore"; -} diff --git a/src/api/framework/Core/Identity/Roles/Features/CreateOrUpdateRole/CreateOrUpdateRoleCommand.cs b/src/api/framework/Core/Identity/Roles/Features/CreateOrUpdateRole/CreateOrUpdateRoleCommand.cs deleted file mode 100644 index 5774c40ae9..0000000000 --- a/src/api/framework/Core/Identity/Roles/Features/CreateOrUpdateRole/CreateOrUpdateRoleCommand.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace FSH.Framework.Core.Identity.Roles.Features.CreateOrUpdateRole; - -public class CreateOrUpdateRoleCommand -{ - public string Id { get; set; } = default!; - public string Name { get; set; } = default!; - public string? Description { get; set; } -} diff --git a/src/api/framework/Core/Identity/Roles/Features/CreateOrUpdateRole/CreateOrUpdateRoleValidator.cs b/src/api/framework/Core/Identity/Roles/Features/CreateOrUpdateRole/CreateOrUpdateRoleValidator.cs deleted file mode 100644 index 68f4526661..0000000000 --- a/src/api/framework/Core/Identity/Roles/Features/CreateOrUpdateRole/CreateOrUpdateRoleValidator.cs +++ /dev/null @@ -1,11 +0,0 @@ -using FluentValidation; - -namespace FSH.Framework.Core.Identity.Roles.Features.CreateOrUpdateRole; - -public class CreateOrUpdateRoleValidator : AbstractValidator -{ - public CreateOrUpdateRoleValidator() - { - RuleFor(x => x.Name).NotEmpty().WithMessage("Role name is required."); - } -} diff --git a/src/api/framework/Core/Identity/Roles/Features/UpdatePermissions/UpdatePermissionsCommand.cs b/src/api/framework/Core/Identity/Roles/Features/UpdatePermissions/UpdatePermissionsCommand.cs deleted file mode 100644 index 900c153956..0000000000 --- a/src/api/framework/Core/Identity/Roles/Features/UpdatePermissions/UpdatePermissionsCommand.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace FSH.Framework.Core.Identity.Roles.Features.UpdatePermissions; -public class UpdatePermissionsCommand -{ - public string RoleId { get; set; } = default!; - public List Permissions { get; set; } = default!; -} diff --git a/src/api/framework/Core/Identity/Roles/Features/UpdatePermissions/UpdatePermissionsValidator.cs b/src/api/framework/Core/Identity/Roles/Features/UpdatePermissions/UpdatePermissionsValidator.cs deleted file mode 100644 index 34b0b7f01c..0000000000 --- a/src/api/framework/Core/Identity/Roles/Features/UpdatePermissions/UpdatePermissionsValidator.cs +++ /dev/null @@ -1,13 +0,0 @@ -using FluentValidation; - -namespace FSH.Framework.Core.Identity.Roles.Features.UpdatePermissions; -public class UpdatePermissionsValidator : AbstractValidator -{ - public UpdatePermissionsValidator() - { - RuleFor(r => r.RoleId) - .NotEmpty(); - RuleFor(r => r.Permissions) - .NotNull(); - } -} diff --git a/src/api/framework/Core/Identity/Roles/IRoleService.cs b/src/api/framework/Core/Identity/Roles/IRoleService.cs deleted file mode 100644 index dca61839af..0000000000 --- a/src/api/framework/Core/Identity/Roles/IRoleService.cs +++ /dev/null @@ -1,16 +0,0 @@ -using FSH.Framework.Core.Identity.Roles.Features.CreateOrUpdateRole; -using FSH.Framework.Core.Identity.Roles.Features.UpdatePermissions; - -namespace FSH.Framework.Core.Identity.Roles; - -public interface IRoleService -{ - Task> GetRolesAsync(); - Task GetRoleAsync(string id); - Task CreateOrUpdateRoleAsync(CreateOrUpdateRoleCommand command); - Task DeleteRoleAsync(string id); - Task GetWithPermissionsAsync(string id, CancellationToken cancellationToken); - - Task UpdatePermissionsAsync(UpdatePermissionsCommand request); -} - diff --git a/src/api/framework/Core/Identity/Roles/RoleDto.cs b/src/api/framework/Core/Identity/Roles/RoleDto.cs deleted file mode 100644 index 0a0fc7559b..0000000000 --- a/src/api/framework/Core/Identity/Roles/RoleDto.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace FSH.Framework.Core.Identity.Roles; - -public class RoleDto -{ - public string Id { get; set; } = default!; - public string Name { get; set; } = default!; - public string? Description { get; set; } - public List? Permissions { get; set; } -} diff --git a/src/api/framework/Core/Identity/Tokens/Features/Generate/TokenGenerationCommand.cs b/src/api/framework/Core/Identity/Tokens/Features/Generate/TokenGenerationCommand.cs deleted file mode 100644 index dccc1e15d7..0000000000 --- a/src/api/framework/Core/Identity/Tokens/Features/Generate/TokenGenerationCommand.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.ComponentModel; -using FluentValidation; -using FSH.Starter.Shared.Authorization; - -namespace FSH.Framework.Core.Identity.Tokens.Features.Generate; -public record TokenGenerationCommand( - [property: DefaultValue(TenantConstants.Root.EmailAddress)] string Email, - [property: DefaultValue(TenantConstants.DefaultPassword)] string Password); - -public class GenerateTokenValidator : AbstractValidator -{ - public GenerateTokenValidator() - { - RuleFor(p => p.Email).Cascade(CascadeMode.Stop).NotEmpty().EmailAddress(); - - RuleFor(p => p.Password).Cascade(CascadeMode.Stop).NotEmpty(); - } -} diff --git a/src/api/framework/Core/Identity/Tokens/Features/Refresh/RefreshTokenCommand.cs b/src/api/framework/Core/Identity/Tokens/Features/Refresh/RefreshTokenCommand.cs deleted file mode 100644 index 8fc45b8d24..0000000000 --- a/src/api/framework/Core/Identity/Tokens/Features/Refresh/RefreshTokenCommand.cs +++ /dev/null @@ -1,14 +0,0 @@ -using FluentValidation; - -namespace FSH.Framework.Core.Identity.Tokens.Features.Refresh; -public record RefreshTokenCommand(string Token, string RefreshToken); - -public class RefreshTokenValidator : AbstractValidator -{ - public RefreshTokenValidator() - { - RuleFor(p => p.Token).Cascade(CascadeMode.Stop).NotEmpty(); - - RuleFor(p => p.RefreshToken).Cascade(CascadeMode.Stop).NotEmpty(); - } -} diff --git a/src/api/framework/Core/Identity/Tokens/ITokenService.cs b/src/api/framework/Core/Identity/Tokens/ITokenService.cs deleted file mode 100644 index 86665ec818..0000000000 --- a/src/api/framework/Core/Identity/Tokens/ITokenService.cs +++ /dev/null @@ -1,11 +0,0 @@ -using FSH.Framework.Core.Identity.Tokens.Features.Generate; -using FSH.Framework.Core.Identity.Tokens.Features.Refresh; -using FSH.Framework.Core.Identity.Tokens.Models; - -namespace FSH.Framework.Core.Identity.Tokens; -public interface ITokenService -{ - Task GenerateTokenAsync(TokenGenerationCommand request, string ipAddress, CancellationToken cancellationToken); - Task RefreshTokenAsync(RefreshTokenCommand request, string ipAddress, CancellationToken cancellationToken); - -} diff --git a/src/api/framework/Core/Identity/Tokens/Models/TokenResponse.cs b/src/api/framework/Core/Identity/Tokens/Models/TokenResponse.cs deleted file mode 100644 index fc56f00d89..0000000000 --- a/src/api/framework/Core/Identity/Tokens/Models/TokenResponse.cs +++ /dev/null @@ -1,2 +0,0 @@ -namespace FSH.Framework.Core.Identity.Tokens.Models; -public record TokenResponse(string Token, string RefreshToken, DateTime RefreshTokenExpiryTime); diff --git a/src/api/framework/Core/Identity/Users/Abstractions/ICurrentUser.cs b/src/api/framework/Core/Identity/Users/Abstractions/ICurrentUser.cs deleted file mode 100644 index aa5314b007..0000000000 --- a/src/api/framework/Core/Identity/Users/Abstractions/ICurrentUser.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Security.Claims; - -namespace FSH.Framework.Core.Identity.Users.Abstractions; -public interface ICurrentUser -{ - string? Name { get; } - - Guid GetUserId(); - - string? GetUserEmail(); - - string? GetTenant(); - - bool IsAuthenticated(); - - bool IsInRole(string role); - - IEnumerable? GetUserClaims(); -} diff --git a/src/api/framework/Core/Identity/Users/Abstractions/ICurrentUserInitializer.cs b/src/api/framework/Core/Identity/Users/Abstractions/ICurrentUserInitializer.cs deleted file mode 100644 index 2342d75b8d..0000000000 --- a/src/api/framework/Core/Identity/Users/Abstractions/ICurrentUserInitializer.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Security.Claims; - -namespace FSH.Framework.Core.Identity.Users.Abstractions; -public interface ICurrentUserInitializer -{ - void SetCurrentUser(ClaimsPrincipal user); - - void SetCurrentUserId(string userId); -} diff --git a/src/api/framework/Core/Identity/Users/Abstractions/IUserService.cs b/src/api/framework/Core/Identity/Users/Abstractions/IUserService.cs deleted file mode 100644 index 95fbf9f577..0000000000 --- a/src/api/framework/Core/Identity/Users/Abstractions/IUserService.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System.Security.Claims; -using FSH.Framework.Core.Identity.Users.Dtos; -using FSH.Framework.Core.Identity.Users.Features.AssignUserRole; -using FSH.Framework.Core.Identity.Users.Features.ChangePassword; -using FSH.Framework.Core.Identity.Users.Features.ForgotPassword; -using FSH.Framework.Core.Identity.Users.Features.RegisterUser; -using FSH.Framework.Core.Identity.Users.Features.ResetPassword; -using FSH.Framework.Core.Identity.Users.Features.ToggleUserStatus; -using FSH.Framework.Core.Identity.Users.Features.UpdateUser; - -namespace FSH.Framework.Core.Identity.Users.Abstractions; -public interface IUserService -{ - Task ExistsWithNameAsync(string name); - Task ExistsWithEmailAsync(string email, string? exceptId = null); - Task ExistsWithPhoneNumberAsync(string phoneNumber, string? exceptId = null); - Task> GetListAsync(CancellationToken cancellationToken); - Task GetCountAsync(CancellationToken cancellationToken); - Task GetAsync(string userId, CancellationToken cancellationToken); - Task ToggleStatusAsync(ToggleUserStatusCommand request, CancellationToken cancellationToken); - Task GetOrCreateFromPrincipalAsync(ClaimsPrincipal principal); - Task RegisterAsync(RegisterUserCommand request, string origin, CancellationToken cancellationToken); - Task UpdateAsync(UpdateUserCommand request, string userId); - Task DeleteAsync(string userId); - Task ConfirmEmailAsync(string userId, string code, string tenant, CancellationToken cancellationToken); - Task ConfirmPhoneNumberAsync(string userId, string code); - - // permisions - Task HasPermissionAsync(string userId, string permission, CancellationToken cancellationToken = default); - - // passwords - Task ForgotPasswordAsync(ForgotPasswordCommand request, string origin, CancellationToken cancellationToken); - Task ResetPasswordAsync(ResetPasswordCommand request, CancellationToken cancellationToken); - Task?> GetPermissionsAsync(string userId, CancellationToken cancellationToken); - - Task ChangePasswordAsync(ChangePasswordCommand request, string userId); - Task AssignRolesAsync(string userId, AssignUserRoleCommand request, CancellationToken cancellationToken); - Task> GetUserRolesAsync(string userId, CancellationToken cancellationToken); -} diff --git a/src/api/framework/Core/Identity/Users/Dtos/UserDetail.cs b/src/api/framework/Core/Identity/Users/Dtos/UserDetail.cs deleted file mode 100644 index 23941ad86c..0000000000 --- a/src/api/framework/Core/Identity/Users/Dtos/UserDetail.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace FSH.Framework.Core.Identity.Users.Dtos; -public class UserDetail -{ - public Guid Id { get; set; } - - public string? UserName { get; set; } - - public string? FirstName { get; set; } - - public string? LastName { get; set; } - - public string? Email { get; set; } - - public bool IsActive { get; set; } = true; - - public bool EmailConfirmed { get; set; } - - public string? PhoneNumber { get; set; } - - public Uri? ImageUrl { get; set; } -} diff --git a/src/api/framework/Core/Identity/Users/Dtos/UserRoleDetail.cs b/src/api/framework/Core/Identity/Users/Dtos/UserRoleDetail.cs deleted file mode 100644 index 935fd79b6e..0000000000 --- a/src/api/framework/Core/Identity/Users/Dtos/UserRoleDetail.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace FSH.Framework.Core.Identity.Users.Dtos; -public class UserRoleDetail -{ - public string? RoleId { get; set; } - public string? RoleName { get; set; } - public string? Description { get; set; } - public bool Enabled { get; set; } -} diff --git a/src/api/framework/Core/Identity/Users/Features/AssignUserRole/AssignUserRoleCommand.cs b/src/api/framework/Core/Identity/Users/Features/AssignUserRole/AssignUserRoleCommand.cs deleted file mode 100644 index 34f3fadb89..0000000000 --- a/src/api/framework/Core/Identity/Users/Features/AssignUserRole/AssignUserRoleCommand.cs +++ /dev/null @@ -1,7 +0,0 @@ -using FSH.Framework.Core.Identity.Users.Dtos; - -namespace FSH.Framework.Core.Identity.Users.Features.AssignUserRole; -public class AssignUserRoleCommand -{ - public List UserRoles { get; set; } = new(); -} diff --git a/src/api/framework/Core/Identity/Users/Features/ChangePassword/ChangePasswordCommand.cs b/src/api/framework/Core/Identity/Users/Features/ChangePassword/ChangePasswordCommand.cs deleted file mode 100644 index 82abe1323c..0000000000 --- a/src/api/framework/Core/Identity/Users/Features/ChangePassword/ChangePasswordCommand.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace FSH.Framework.Core.Identity.Users.Features.ChangePassword; -public class ChangePasswordCommand -{ - public string Password { get; set; } = default!; - public string NewPassword { get; set; } = default!; - public string ConfirmNewPassword { get; set; } = default!; -} diff --git a/src/api/framework/Core/Identity/Users/Features/ChangePassword/ChangePasswordValidator.cs b/src/api/framework/Core/Identity/Users/Features/ChangePassword/ChangePasswordValidator.cs deleted file mode 100644 index 9d52f78856..0000000000 --- a/src/api/framework/Core/Identity/Users/Features/ChangePassword/ChangePasswordValidator.cs +++ /dev/null @@ -1,18 +0,0 @@ -using FluentValidation; - -namespace FSH.Framework.Core.Identity.Users.Features.ChangePassword; -public class ChangePasswordValidator : AbstractValidator -{ - public ChangePasswordValidator() - { - RuleFor(p => p.Password) - .NotEmpty(); - - RuleFor(p => p.NewPassword) - .NotEmpty(); - - RuleFor(p => p.ConfirmNewPassword) - .Equal(p => p.NewPassword) - .WithMessage("passwords do not match."); - } -} diff --git a/src/api/framework/Core/Identity/Users/Features/ForgotPassword/ForgotPasswordCommand.cs b/src/api/framework/Core/Identity/Users/Features/ForgotPassword/ForgotPasswordCommand.cs deleted file mode 100644 index 5419a554fb..0000000000 --- a/src/api/framework/Core/Identity/Users/Features/ForgotPassword/ForgotPasswordCommand.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace FSH.Framework.Core.Identity.Users.Features.ForgotPassword; -public class ForgotPasswordCommand -{ - public string Email { get; set; } = default!; -} diff --git a/src/api/framework/Core/Identity/Users/Features/ForgotPassword/ForgotPasswordValidator.cs b/src/api/framework/Core/Identity/Users/Features/ForgotPassword/ForgotPasswordValidator.cs deleted file mode 100644 index 2df57f5be4..0000000000 --- a/src/api/framework/Core/Identity/Users/Features/ForgotPassword/ForgotPasswordValidator.cs +++ /dev/null @@ -1,12 +0,0 @@ -using FluentValidation; - -namespace FSH.Framework.Core.Identity.Users.Features.ForgotPassword; -public class ForgotPasswordValidator : AbstractValidator -{ - public ForgotPasswordValidator() - { - RuleFor(p => p.Email).Cascade(CascadeMode.Stop) - .NotEmpty() - .EmailAddress(); - } -} diff --git a/src/api/framework/Core/Identity/Users/Features/RegisterUser/RegisterUserCommand.cs b/src/api/framework/Core/Identity/Users/Features/RegisterUser/RegisterUserCommand.cs deleted file mode 100644 index 34089d0470..0000000000 --- a/src/api/framework/Core/Identity/Users/Features/RegisterUser/RegisterUserCommand.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Text.Json.Serialization; -using MediatR; - -namespace FSH.Framework.Core.Identity.Users.Features.RegisterUser; -public class RegisterUserCommand : IRequest -{ - public string FirstName { get; set; } = default!; - public string LastName { get; set; } = default!; - public string Email { get; set; } = default!; - public string UserName { get; set; } = default!; - public string Password { get; set; } = default!; - public string ConfirmPassword { get; set; } = default!; - public string? PhoneNumber { get; set; } - - [JsonIgnore] - public string? Origin { get; set; } -} diff --git a/src/api/framework/Core/Identity/Users/Features/RegisterUser/RegisterUserResponse.cs b/src/api/framework/Core/Identity/Users/Features/RegisterUser/RegisterUserResponse.cs deleted file mode 100644 index 967539ae78..0000000000 --- a/src/api/framework/Core/Identity/Users/Features/RegisterUser/RegisterUserResponse.cs +++ /dev/null @@ -1,2 +0,0 @@ -namespace FSH.Framework.Core.Identity.Users.Features.RegisterUser; -public record RegisterUserResponse(string UserId); diff --git a/src/api/framework/Core/Identity/Users/Features/ResetPassword/ResetPasswordCommand.cs b/src/api/framework/Core/Identity/Users/Features/ResetPassword/ResetPasswordCommand.cs deleted file mode 100644 index 244aff2e93..0000000000 --- a/src/api/framework/Core/Identity/Users/Features/ResetPassword/ResetPasswordCommand.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace FSH.Framework.Core.Identity.Users.Features.ResetPassword; -public class ResetPasswordCommand -{ - public string Email { get; set; } = default!; - - public string Password { get; set; } = default!; - - public string Token { get; set; } = default!; -} diff --git a/src/api/framework/Core/Identity/Users/Features/ResetPassword/ResetPasswordValidator.cs b/src/api/framework/Core/Identity/Users/Features/ResetPassword/ResetPasswordValidator.cs deleted file mode 100644 index 4141905651..0000000000 --- a/src/api/framework/Core/Identity/Users/Features/ResetPassword/ResetPasswordValidator.cs +++ /dev/null @@ -1,13 +0,0 @@ -using FluentValidation; - -namespace FSH.Framework.Core.Identity.Users.Features.ResetPassword; - -public class ResetPasswordValidator : AbstractValidator -{ - public ResetPasswordValidator() - { - RuleFor(x => x.Email).NotEmpty().EmailAddress(); - RuleFor(x => x.Password).NotEmpty(); - RuleFor(x => x.Token).NotEmpty(); - } -} diff --git a/src/api/framework/Core/Identity/Users/Features/ToggleUserStatus/ToggleUserStatusCommand.cs b/src/api/framework/Core/Identity/Users/Features/ToggleUserStatus/ToggleUserStatusCommand.cs deleted file mode 100644 index 8b3697293e..0000000000 --- a/src/api/framework/Core/Identity/Users/Features/ToggleUserStatus/ToggleUserStatusCommand.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace FSH.Framework.Core.Identity.Users.Features.ToggleUserStatus; -public class ToggleUserStatusCommand -{ - public bool ActivateUser { get; set; } - public string? UserId { get; set; } -} diff --git a/src/api/framework/Core/Identity/Users/Features/UpdateUser/UpdateUserCommand.cs b/src/api/framework/Core/Identity/Users/Features/UpdateUser/UpdateUserCommand.cs deleted file mode 100644 index 470516218e..0000000000 --- a/src/api/framework/Core/Identity/Users/Features/UpdateUser/UpdateUserCommand.cs +++ /dev/null @@ -1,14 +0,0 @@ -using FSH.Framework.Core.Storage.File.Features; -using MediatR; - -namespace FSH.Framework.Core.Identity.Users.Features.UpdateUser; -public class UpdateUserCommand : IRequest -{ - public string Id { get; set; } = default!; - public string? FirstName { get; set; } - public string? LastName { get; set; } - public string? PhoneNumber { get; set; } - public string? Email { get; set; } - public FileUploadCommand? Image { get; set; } - public bool DeleteCurrentImage { get; set; } -} diff --git a/src/api/framework/Core/Jobs/IJobService.cs b/src/api/framework/Core/Jobs/IJobService.cs deleted file mode 100644 index 7016ae79d5..0000000000 --- a/src/api/framework/Core/Jobs/IJobService.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System.Linq.Expressions; - -namespace FSH.Framework.Core.Jobs; - -public interface IJobService -{ - bool Delete(string jobId); - - bool Delete(string jobId, string fromState); - - string Enqueue(Expression methodCall); - - string Enqueue(string queue, Expression> methodCall); - - string Enqueue(Expression> methodCall); - - string Enqueue(Expression> methodCall); - - string Enqueue(Expression> methodCall); - - bool Requeue(string jobId); - - bool Requeue(string jobId, string fromState); - - string Schedule(Expression methodCall, TimeSpan delay); - - string Schedule(Expression> methodCall, TimeSpan delay); - - string Schedule(Expression methodCall, DateTimeOffset enqueueAt); - - string Schedule(Expression> methodCall, DateTimeOffset enqueueAt); - - string Schedule(Expression> methodCall, TimeSpan delay); - - string Schedule(Expression> methodCall, TimeSpan delay); - - string Schedule(Expression> methodCall, DateTimeOffset enqueueAt); - - string Schedule(Expression> methodCall, DateTimeOffset enqueueAt); -} diff --git a/src/api/framework/Core/Mail/IMailService.cs b/src/api/framework/Core/Mail/IMailService.cs deleted file mode 100644 index c5e000951b..0000000000 --- a/src/api/framework/Core/Mail/IMailService.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace FSH.Framework.Core.Mail; -public interface IMailService -{ - Task SendAsync(MailRequest request, CancellationToken ct); -} diff --git a/src/api/framework/Core/Mail/MailOptions.cs b/src/api/framework/Core/Mail/MailOptions.cs deleted file mode 100644 index 4b01169572..0000000000 --- a/src/api/framework/Core/Mail/MailOptions.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace FSH.Framework.Core.Mail; -public class MailOptions -{ - public string? From { get; set; } - - public string? Host { get; set; } - - public int Port { get; set; } - - public string? UserName { get; set; } - - public string? Password { get; set; } - - public string? DisplayName { get; set; } -} diff --git a/src/api/framework/Core/Mail/MailRequest.cs b/src/api/framework/Core/Mail/MailRequest.cs deleted file mode 100644 index 662dcd4010..0000000000 --- a/src/api/framework/Core/Mail/MailRequest.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Collections.ObjectModel; - -namespace FSH.Framework.Core.Mail; -public class MailRequest(Collection to, string subject, string? body = null, string? from = null, string? displayName = null, string? replyTo = null, string? replyToName = null, Collection? bcc = null, Collection? cc = null, IDictionary? attachmentData = null, IDictionary? headers = null) -{ - public Collection To { get; } = to; - - public string Subject { get; } = subject; - - public string? Body { get; } = body; - - public string? From { get; } = from; - - public string? DisplayName { get; } = displayName; - - public string? ReplyTo { get; } = replyTo; - - public string? ReplyToName { get; } = replyToName; - - public Collection Bcc { get; } = bcc ?? new Collection(); - - public Collection Cc { get; } = cc ?? new Collection(); - - public IDictionary AttachmentData { get; } = attachmentData ?? new Dictionary(); - - public IDictionary Headers { get; } = headers ?? new Dictionary(); -} diff --git a/src/api/framework/Core/Origin/OriginOptions.cs b/src/api/framework/Core/Origin/OriginOptions.cs deleted file mode 100644 index 97e1c35423..0000000000 --- a/src/api/framework/Core/Origin/OriginOptions.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace FSH.Framework.Core.Origin; - -public class OriginOptions -{ - public Uri? OriginUrl { get; set; } -} diff --git a/src/api/framework/Core/Paging/BaseFilter.cs b/src/api/framework/Core/Paging/BaseFilter.cs deleted file mode 100644 index 2bb5b099be..0000000000 --- a/src/api/framework/Core/Paging/BaseFilter.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace FSH.Framework.Core.Paging; - -public class BaseFilter -{ - ///

- /// Column Wise Search is Supported. - /// - public Search? AdvancedSearch { get; set; } - - /// - /// Keyword to Search in All the available columns of the Resource. - /// - public string? Keyword { get; set; } - - /// - /// Advanced column filtering with logical operators and query operators is supported. - /// - public Filter? AdvancedFilter { get; set; } -} diff --git a/src/api/framework/Core/Paging/Extensions.cs b/src/api/framework/Core/Paging/Extensions.cs deleted file mode 100644 index a9c5544eb9..0000000000 --- a/src/api/framework/Core/Paging/Extensions.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Ardalis.Specification; - -namespace FSH.Framework.Core.Paging; -public static class Extensions -{ - public static async Task> PaginatedListAsync( - this IReadRepositoryBase repository, ISpecification spec, PaginationFilter filter, CancellationToken cancellationToken = default) - where T : class - where TDestination : class - { - ArgumentNullException.ThrowIfNull(repository); - - var items = await repository.ListAsync(spec, cancellationToken).ConfigureAwait(false); - int totalCount = await repository.CountAsync(spec, cancellationToken).ConfigureAwait(false); - - return new PagedList(items, filter.PageNumber, filter.PageSize, totalCount); - } -} diff --git a/src/api/framework/Core/Paging/Filter.cs b/src/api/framework/Core/Paging/Filter.cs deleted file mode 100644 index fdbdc29387..0000000000 --- a/src/api/framework/Core/Paging/Filter.cs +++ /dev/null @@ -1,34 +0,0 @@ -namespace FSH.Framework.Core.Paging; - -public static class FilterOperator -{ - public const string EQ = "eq"; - public const string NEQ = "neq"; - public const string LT = "lt"; - public const string LTE = "lte"; - public const string GT = "gt"; - public const string GTE = "gte"; - public const string STARTSWITH = "startswith"; - public const string ENDSWITH = "endswith"; - public const string CONTAINS = "contains"; -} - -public static class FilterLogic -{ - public const string AND = "and"; - public const string OR = "or"; - public const string XOR = "xor"; -} - -public class Filter -{ - public string? Logic { get; set; } - - public IEnumerable? Filters { get; set; } - - public string? Field { get; set; } - - public string? Operator { get; set; } - - public object? Value { get; set; } -} diff --git a/src/api/framework/Core/Paging/IPageRequest.cs b/src/api/framework/Core/Paging/IPageRequest.cs deleted file mode 100644 index c4a2a7f147..0000000000 --- a/src/api/framework/Core/Paging/IPageRequest.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace FSH.Framework.Core.Paging; - -public interface IPageRequest -{ - int PageNumber { get; init; } - int PageSize { get; init; } - string? Filters { get; init; } - string? SortOrder { get; init; } -} diff --git a/src/api/framework/Core/Paging/IPagedList.cs b/src/api/framework/Core/Paging/IPagedList.cs deleted file mode 100644 index e2950b3984..0000000000 --- a/src/api/framework/Core/Paging/IPagedList.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace FSH.Framework.Core.Paging; - -public interface IPagedList - where T : class -{ - int TotalPages { get; } - bool HasPrevious { get; } - bool HasNext { get; } - IReadOnlyList Items { get; init; } - int TotalCount { get; init; } - int PageNumber { get; init; } - int PageSize { get; init; } - - IPagedList MapTo(Func map) - where TR : class; - IPagedList MapTo() - where TR : class; -} diff --git a/src/api/framework/Core/Paging/PagedList.cs b/src/api/framework/Core/Paging/PagedList.cs deleted file mode 100644 index 7f48292f7c..0000000000 --- a/src/api/framework/Core/Paging/PagedList.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Mapster; - -namespace FSH.Framework.Core.Paging; - -public record PagedList(IReadOnlyList Items, int PageNumber, int PageSize, int TotalCount) : IPagedList - where T : class -{ - public int TotalPages => (int)Math.Ceiling(TotalCount / (double)PageSize); - public bool HasPrevious => PageNumber > 1; - public bool HasNext => PageNumber < TotalPages; - public IPagedList MapTo(Func map) - where TR : class - { - return new PagedList(Items.Select(map).ToList(), PageNumber, PageSize, TotalCount); - } - public IPagedList MapTo() - where TR : class - { - return new PagedList(Items.Adapt>(), PageNumber, PageSize, TotalCount); - } -} diff --git a/src/api/framework/Core/Paging/PaginationFilter.cs b/src/api/framework/Core/Paging/PaginationFilter.cs deleted file mode 100644 index 13be4026ee..0000000000 --- a/src/api/framework/Core/Paging/PaginationFilter.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace FSH.Framework.Core.Paging; - -public class PaginationFilter : BaseFilter -{ - public int PageNumber { get; set; } - - public int PageSize { get; set; } = int.MaxValue; - public string[]? OrderBy { get; set; } -} - -public static class PaginationFilterExtensions -{ - public static bool HasOrderBy(this PaginationFilter filter) => - filter.OrderBy?.Any() is true; -} diff --git a/src/api/framework/Core/Paging/Search.cs b/src/api/framework/Core/Paging/Search.cs deleted file mode 100644 index a2f2624980..0000000000 --- a/src/api/framework/Core/Paging/Search.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace FSH.Framework.Core.Paging; - -public class Search -{ - public List Fields { get; set; } = new(); - public string? Keyword { get; set; } -} diff --git a/src/api/framework/Core/Persistence/DatabaseOptions.cs b/src/api/framework/Core/Persistence/DatabaseOptions.cs deleted file mode 100644 index 5be4fb9e02..0000000000 --- a/src/api/framework/Core/Persistence/DatabaseOptions.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace FSH.Framework.Core.Persistence; -public class DatabaseOptions : IValidatableObject -{ - public string Provider { get; set; } = "postgresql"; - public string ConnectionString { get; set; } = string.Empty; - - public IEnumerable Validate(ValidationContext validationContext) - { - if (string.IsNullOrEmpty(ConnectionString)) - { - yield return new ValidationResult("connection string cannot be empty.", new[] { nameof(ConnectionString) }); - } - } -} diff --git a/src/api/framework/Core/Persistence/IConnectionStringValidator.cs b/src/api/framework/Core/Persistence/IConnectionStringValidator.cs deleted file mode 100644 index 413e4fc76c..0000000000 --- a/src/api/framework/Core/Persistence/IConnectionStringValidator.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace FSH.Framework.Core.Persistence; -public interface IConnectionStringValidator -{ - bool TryValidate(string connectionString, string? dbProvider = null); -} diff --git a/src/api/framework/Core/Persistence/IDbInitializer.cs b/src/api/framework/Core/Persistence/IDbInitializer.cs deleted file mode 100644 index ed4a08c844..0000000000 --- a/src/api/framework/Core/Persistence/IDbInitializer.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace FSH.Framework.Core.Persistence; -public interface IDbInitializer -{ - Task MigrateAsync(CancellationToken cancellationToken); - Task SeedAsync(CancellationToken cancellationToken); -} diff --git a/src/api/framework/Core/Persistence/IRepository.cs b/src/api/framework/Core/Persistence/IRepository.cs deleted file mode 100644 index 3915bb3caa..0000000000 --- a/src/api/framework/Core/Persistence/IRepository.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Ardalis.Specification; -using FSH.Framework.Core.Domain.Contracts; - -namespace FSH.Framework.Core.Persistence; -public interface IRepository : IRepositoryBase - where T : class, IAggregateRoot -{ -} - -public interface IReadRepository : IReadRepositoryBase - where T : class, IAggregateRoot -{ -} diff --git a/src/api/framework/Core/Specifications/EntitiesByBaseFilterSpec.cs b/src/api/framework/Core/Specifications/EntitiesByBaseFilterSpec.cs deleted file mode 100644 index 643bcb675a..0000000000 --- a/src/api/framework/Core/Specifications/EntitiesByBaseFilterSpec.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Ardalis.Specification; -using FSH.Framework.Core.Paging; - -namespace FSH.Framework.Core.Specifications; - -public class EntitiesByBaseFilterSpec : Specification -{ - public EntitiesByBaseFilterSpec(BaseFilter filter) => - Query.SearchBy(filter); -} - -public class EntitiesByBaseFilterSpec : Specification -{ - public EntitiesByBaseFilterSpec(BaseFilter filter) => - Query.SearchBy(filter); -} diff --git a/src/api/framework/Core/Specifications/EntitiesByPaginationFilterSpec.cs b/src/api/framework/Core/Specifications/EntitiesByPaginationFilterSpec.cs deleted file mode 100644 index abdf49eeb7..0000000000 --- a/src/api/framework/Core/Specifications/EntitiesByPaginationFilterSpec.cs +++ /dev/null @@ -1,17 +0,0 @@ -using FSH.Framework.Core.Paging; - -namespace FSH.Framework.Core.Specifications; - -public class EntitiesByPaginationFilterSpec : EntitiesByBaseFilterSpec -{ - public EntitiesByPaginationFilterSpec(PaginationFilter filter) - : base(filter) => - Query.PaginateBy(filter); -} - -public class EntitiesByPaginationFilterSpec : EntitiesByBaseFilterSpec -{ - public EntitiesByPaginationFilterSpec(PaginationFilter filter) - : base(filter) => - Query.PaginateBy(filter); -} diff --git a/src/api/framework/Core/Specifications/SpecificationBuilderExtensions.cs b/src/api/framework/Core/Specifications/SpecificationBuilderExtensions.cs deleted file mode 100644 index 81b352056d..0000000000 --- a/src/api/framework/Core/Specifications/SpecificationBuilderExtensions.cs +++ /dev/null @@ -1,348 +0,0 @@ -using System.Linq.Expressions; -using System.Reflection; -using System.Text.Json; -using Ardalis.Specification; -using FSH.Framework.Core.Exceptions; -using FSH.Framework.Core.Paging; - -namespace FSH.Framework.Core.Specifications; - -// See https://github.com/ardalis/Specification/issues/53 -public static class SpecificationBuilderExtensions -{ - public static ISpecificationBuilder SearchBy(this ISpecificationBuilder query, BaseFilter filter) => - query - .SearchByKeyword(filter.Keyword) - .AdvancedSearch(filter.AdvancedSearch) - .AdvancedFilter(filter.AdvancedFilter); - - public static ISpecificationBuilder PaginateBy(this ISpecificationBuilder query, PaginationFilter filter) - { - if (filter.PageNumber <= 0) - { - filter.PageNumber = 1; - } - - if (filter.PageSize <= 0) - { - filter.PageSize = 10; - } - - if (filter.PageNumber > 1) - { - query = query.Skip((filter.PageNumber - 1) * filter.PageSize); - } - - return query - .Take(filter.PageSize) - .OrderBy(filter.OrderBy); - } - - public static IOrderedSpecificationBuilder SearchByKeyword( - this ISpecificationBuilder specificationBuilder, - string? keyword) => - specificationBuilder.AdvancedSearch(new Search { Keyword = keyword }); - - public static IOrderedSpecificationBuilder AdvancedSearch( - this ISpecificationBuilder specificationBuilder, - Search? search) - { - if (!string.IsNullOrEmpty(search?.Keyword)) - { - if (search.Fields?.Any() is true) - { - // search seleted fields (can contain deeper nested fields) - foreach (string field in search.Fields) - { - var paramExpr = Expression.Parameter(typeof(T)); - MemberExpression propertyExpr = GetPropertyExpression(field, paramExpr); - - specificationBuilder.AddSearchPropertyByKeyword(propertyExpr, paramExpr, search.Keyword); - } - } - else - { - // search all fields (only first level) - foreach (var property in typeof(T).GetProperties() - .Where(prop => (Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType) is { } propertyType - && !propertyType.IsEnum - && Type.GetTypeCode(propertyType) != TypeCode.Object)) - { - var paramExpr = Expression.Parameter(typeof(T)); - var propertyExpr = Expression.Property(paramExpr, property); - - specificationBuilder.AddSearchPropertyByKeyword(propertyExpr, paramExpr, search.Keyword); - } - } - } - - return new OrderedSpecificationBuilder(specificationBuilder.Specification); - } - - private static void AddSearchPropertyByKeyword( - this ISpecificationBuilder specificationBuilder, - Expression propertyExpr, - ParameterExpression paramExpr, - string keyword, - string operatorSearch = FilterOperator.CONTAINS) - { - if (propertyExpr is not MemberExpression memberExpr || memberExpr.Member is not PropertyInfo property) - { - throw new ArgumentException("propertyExpr must be a property expression.", nameof(propertyExpr)); - } - - string searchTerm = operatorSearch switch - { - FilterOperator.STARTSWITH => $"{keyword.ToLower()}%", - FilterOperator.ENDSWITH => $"%{keyword.ToLower()}", - FilterOperator.CONTAINS => $"%{keyword.ToLower()}%", - _ => throw new ArgumentException("operatorSearch is not valid.", nameof(operatorSearch)) - }; - - // Generate lambda [ x => x.Property ] for string properties - // or [ x => ((object)x.Property) == null ? null : x.Property.ToString() ] for other properties - Expression selectorExpr = - property.PropertyType == typeof(string) - ? propertyExpr - : Expression.Condition( - Expression.Equal(Expression.Convert(propertyExpr, typeof(object)), Expression.Constant(null, typeof(object))), - Expression.Constant(null, typeof(string)), - Expression.Call(propertyExpr, "ToString", null, null)); - - var toLowerMethod = typeof(string).GetMethod("ToLower", Type.EmptyTypes); - Expression callToLowerMethod = Expression.Call(selectorExpr, toLowerMethod!); - - var selector = Expression.Lambda>(callToLowerMethod, paramExpr); - - ((List>)specificationBuilder.Specification.SearchCriterias) - .Add(new SearchExpressionInfo(selector, searchTerm, 1)); - } - - public static IOrderedSpecificationBuilder AdvancedFilter( - this ISpecificationBuilder specificationBuilder, - Filter? filter) - { - if (filter is not null) - { - var parameter = Expression.Parameter(typeof(T)); - - Expression binaryExpresioFilter; - - if (!string.IsNullOrEmpty(filter.Logic)) - { - if (filter.Filters is null) throw new CustomException("The Filters attribute is required when declaring a logic"); - binaryExpresioFilter = CreateFilterExpression(filter.Logic, filter.Filters, parameter); - } - else - { - var filterValid = GetValidFilter(filter); - binaryExpresioFilter = CreateFilterExpression(filterValid.Field!, filterValid.Operator!, filterValid.Value, parameter); - } - - ((List>)specificationBuilder.Specification.WhereExpressions) - .Add(new WhereExpressionInfo(Expression.Lambda>(binaryExpresioFilter, parameter))); - } - - return new OrderedSpecificationBuilder(specificationBuilder.Specification); - } - - private static Expression CreateFilterExpression( - string logic, - IEnumerable filters, - ParameterExpression parameter) - { - Expression filterExpression = default!; - - foreach (var filter in filters) - { - Expression bExpresionFilter; - - if (!string.IsNullOrEmpty(filter.Logic)) - { - if (filter.Filters is null) throw new CustomException("The Filters attribute is required when declaring a logic"); - bExpresionFilter = CreateFilterExpression(filter.Logic, filter.Filters, parameter); - } - else - { - var filterValid = GetValidFilter(filter); - bExpresionFilter = CreateFilterExpression(filterValid.Field!, filterValid.Operator!, filterValid.Value, parameter); - } - - filterExpression = filterExpression is null ? bExpresionFilter : CombineFilter(logic, filterExpression, bExpresionFilter); - } - - return filterExpression; - } - - private static Expression CreateFilterExpression( - string field, - string filterOperator, - object? value, - ParameterExpression parameter) - { - var propertyExpresion = GetPropertyExpression(field, parameter); - var valueExpresion = GeValuetExpression(field, value, propertyExpresion.Type); - return CreateFilterExpression(propertyExpresion, valueExpresion, filterOperator); - } - - private static Expression CreateFilterExpression( - Expression memberExpression, - Expression constantExpression, - string filterOperator) - { - if (memberExpression.Type == typeof(string)) - { - constantExpression = Expression.Call(constantExpression, "ToLower", null); - memberExpression = Expression.Call(memberExpression, "ToLower", null); - } - - return filterOperator switch - { - FilterOperator.EQ => Expression.Equal(memberExpression, constantExpression), - FilterOperator.NEQ => Expression.NotEqual(memberExpression, constantExpression), - FilterOperator.LT => Expression.LessThan(memberExpression, constantExpression), - FilterOperator.LTE => Expression.LessThanOrEqual(memberExpression, constantExpression), - FilterOperator.GT => Expression.GreaterThan(memberExpression, constantExpression), - FilterOperator.GTE => Expression.GreaterThanOrEqual(memberExpression, constantExpression), - FilterOperator.CONTAINS => Expression.Call(memberExpression, "Contains", null, constantExpression), - FilterOperator.STARTSWITH => Expression.Call(memberExpression, "StartsWith", null, constantExpression), - FilterOperator.ENDSWITH => Expression.Call(memberExpression, "EndsWith", null, constantExpression), - _ => throw new CustomException("Filter Operator is not valid."), - }; - } - - private static Expression CombineFilter( - string filterOperator, - Expression bExpresionBase, - Expression bExpresion) => filterOperator switch - { - FilterLogic.AND => Expression.And(bExpresionBase, bExpresion), - FilterLogic.OR => Expression.Or(bExpresionBase, bExpresion), - FilterLogic.XOR => Expression.ExclusiveOr(bExpresionBase, bExpresion), - _ => throw new ArgumentException("FilterLogic is not valid."), - }; - - private static MemberExpression GetPropertyExpression( - string propertyName, - ParameterExpression parameter) - { - Expression propertyExpression = parameter; - foreach (string member in propertyName.Split('.')) - { - propertyExpression = Expression.PropertyOrField(propertyExpression, member); - } - - return (MemberExpression)propertyExpression; - } - - private static string GetStringFromJsonElement(object value) - => ((JsonElement)value).GetString()!; - - private static ConstantExpression GeValuetExpression( - string field, - object? value, - Type propertyType) - { - if (value == null) return Expression.Constant(null, propertyType); - - if (propertyType.IsEnum) - { - string? stringEnum = GetStringFromJsonElement(value); - - if (!Enum.TryParse(propertyType, stringEnum, true, out object? valueparsed)) throw new CustomException(string.Format("Value {0} is not valid for {1}", value, field)); - - return Expression.Constant(valueparsed, propertyType); - } - - if (propertyType == typeof(Guid)) - { - string? stringGuid = GetStringFromJsonElement(value); - - if (!Guid.TryParse(stringGuid, out Guid valueparsed)) throw new CustomException(string.Format("Value {0} is not valid for {1}", value, field)); - - return Expression.Constant(valueparsed, propertyType); - } - - if (propertyType == typeof(string)) - { - string? text = GetStringFromJsonElement(value); - - return Expression.Constant(text, propertyType); - } - - if (propertyType == typeof(DateTime) || propertyType == typeof(DateTime?)) - { - string? text = GetStringFromJsonElement(value); - return Expression.Constant(ChangeType(text, propertyType), propertyType); - } - - return Expression.Constant(ChangeType(((JsonElement)value).GetRawText(), propertyType), propertyType); - } - - public static dynamic? ChangeType(object value, Type conversion) - { - var t = conversion; - - if (t.IsGenericType && t.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) - { - if (value == null) - { - return null; - } - - t = Nullable.GetUnderlyingType(t); - } - - return Convert.ChangeType(value, t!); - } - - private static Filter GetValidFilter(Filter filter) - { - if (string.IsNullOrEmpty(filter.Field)) throw new CustomException("The field attribute is required when declaring a filter"); - if (string.IsNullOrEmpty(filter.Operator)) throw new CustomException("The Operator attribute is required when declaring a filter"); - return filter; - } - - public static IOrderedSpecificationBuilder OrderBy( - this ISpecificationBuilder specificationBuilder, - string[]? orderByFields) - { - if (orderByFields is not null) - { - foreach (var field in ParseOrderBy(orderByFields)) - { - var paramExpr = Expression.Parameter(typeof(T)); - - Expression propertyExpr = paramExpr; - foreach (string member in field.Key.Split('.')) - { - propertyExpr = Expression.PropertyOrField(propertyExpr, member); - } - - var keySelector = Expression.Lambda>( - Expression.Convert(propertyExpr, typeof(object)), - paramExpr); - - ((List>)specificationBuilder.Specification.OrderExpressions) - .Add(new OrderExpressionInfo(keySelector, field.Value)); - } - } - - return new OrderedSpecificationBuilder(specificationBuilder.Specification); - } - - private static Dictionary ParseOrderBy(string[] orderByFields) => - new(orderByFields.Select((orderByfield, index) => - { - string[] fieldParts = orderByfield.Split(' '); - string field = fieldParts[0]; - bool descending = fieldParts.Length > 1 && fieldParts[1].StartsWith("Desc", StringComparison.OrdinalIgnoreCase); - var orderBy = index == 0 - ? descending ? OrderTypeEnum.OrderByDescending - : OrderTypeEnum.OrderBy - : descending ? OrderTypeEnum.ThenByDescending - : OrderTypeEnum.ThenBy; - - return new KeyValuePair(field, orderBy); - })); -} diff --git a/src/api/framework/Core/Storage/File/Features/FileUploadCommand.cs b/src/api/framework/Core/Storage/File/Features/FileUploadCommand.cs deleted file mode 100644 index c4e5cb0e53..0000000000 --- a/src/api/framework/Core/Storage/File/Features/FileUploadCommand.cs +++ /dev/null @@ -1,11 +0,0 @@ -using MediatR; - -namespace FSH.Framework.Core.Storage.File.Features; - -public class FileUploadCommand : IRequest -{ - public string Name { get; set; } = default!; - public string Extension { get; set; } = default!; - public string Data { get; set; } = default!; -} - diff --git a/src/api/framework/Core/Storage/File/Features/FileUploadResponse.cs b/src/api/framework/Core/Storage/File/Features/FileUploadResponse.cs deleted file mode 100644 index f3af35debf..0000000000 --- a/src/api/framework/Core/Storage/File/Features/FileUploadResponse.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace FSH.Framework.Core.Storage.File.Features; - -public class FileUploadResponse -{ - public Uri Url { get; set; } = default!; -} - diff --git a/src/api/framework/Core/Storage/File/Features/FileUploadValidator.cs b/src/api/framework/Core/Storage/File/Features/FileUploadValidator.cs deleted file mode 100644 index c064cf93f3..0000000000 --- a/src/api/framework/Core/Storage/File/Features/FileUploadValidator.cs +++ /dev/null @@ -1,21 +0,0 @@ -using FluentValidation; - -namespace FSH.Framework.Core.Storage.File.Features; - -public class FileUploadRequestValidator : AbstractValidator -{ - public FileUploadRequestValidator() - { - RuleFor(p => p.Name) - .NotEmpty() - .MaximumLength(150); - - RuleFor(p => p.Extension) - .NotEmpty() - .MaximumLength(5); - - RuleFor(p => p.Data) - .NotEmpty(); - } -} - diff --git a/src/api/framework/Core/Storage/File/FileType.cs b/src/api/framework/Core/Storage/File/FileType.cs deleted file mode 100644 index 267968aaa6..0000000000 --- a/src/api/framework/Core/Storage/File/FileType.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.ComponentModel; - -namespace FSH.Framework.Core.Storage.File; - -public enum FileType -{ - [Description(".jpg,.png,.jpeg")] - Image -} diff --git a/src/api/framework/Core/Storage/IStorageService.cs b/src/api/framework/Core/Storage/IStorageService.cs deleted file mode 100644 index 5e13d6ddec..0000000000 --- a/src/api/framework/Core/Storage/IStorageService.cs +++ /dev/null @@ -1,12 +0,0 @@ -using FSH.Framework.Core.Storage.File; -using FSH.Framework.Core.Storage.File.Features; - -namespace FSH.Framework.Core.Storage; - -public interface IStorageService -{ - public Task UploadAsync(FileUploadCommand? request, FileType supportedFileType, CancellationToken cancellationToken = default) - where T : class; - - public void Remove(Uri? path); -} diff --git a/src/api/framework/Core/Tenant/Abstractions/ITenantService.cs b/src/api/framework/Core/Tenant/Abstractions/ITenantService.cs deleted file mode 100644 index d2540a2ff3..0000000000 --- a/src/api/framework/Core/Tenant/Abstractions/ITenantService.cs +++ /dev/null @@ -1,23 +0,0 @@ -using FSH.Framework.Core.Tenant.Dtos; -using FSH.Framework.Core.Tenant.Features.CreateTenant; - -namespace FSH.Framework.Core.Tenant.Abstractions; - -public interface ITenantService -{ - Task> GetAllAsync(); - - Task ExistsWithIdAsync(string id); - - Task ExistsWithNameAsync(string name); - - Task GetByIdAsync(string id); - - Task CreateAsync(CreateTenantCommand request, CancellationToken cancellationToken); - - Task ActivateAsync(string id, CancellationToken cancellationToken); - - Task DeactivateAsync(string id); - - Task UpgradeSubscription(string id, DateTime extendedExpiryDate); -} diff --git a/src/api/framework/Core/Tenant/Dtos/TenantDetail.cs b/src/api/framework/Core/Tenant/Dtos/TenantDetail.cs deleted file mode 100644 index c9e44f8b7d..0000000000 --- a/src/api/framework/Core/Tenant/Dtos/TenantDetail.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace FSH.Framework.Core.Tenant.Dtos; -public class TenantDetail -{ - public string Id { get; set; } = default!; - public string Name { get; set; } = default!; - public string? ConnectionString { get; set; } - public string AdminEmail { get; set; } = default!; - public bool IsActive { get; set; } - public DateTime ValidUpto { get; set; } - public string? Issuer { get; set; } -} diff --git a/src/api/framework/Core/Tenant/Features/ActivateTenant/ActivateTenantCommand.cs b/src/api/framework/Core/Tenant/Features/ActivateTenant/ActivateTenantCommand.cs deleted file mode 100644 index 01f902dfc9..0000000000 --- a/src/api/framework/Core/Tenant/Features/ActivateTenant/ActivateTenantCommand.cs +++ /dev/null @@ -1,4 +0,0 @@ -using MediatR; - -namespace FSH.Framework.Core.Tenant.Features.ActivateTenant; -public record ActivateTenantCommand(string TenantId) : IRequest; diff --git a/src/api/framework/Core/Tenant/Features/ActivateTenant/ActivateTenantHandler.cs b/src/api/framework/Core/Tenant/Features/ActivateTenant/ActivateTenantHandler.cs deleted file mode 100644 index ab018e532e..0000000000 --- a/src/api/framework/Core/Tenant/Features/ActivateTenant/ActivateTenantHandler.cs +++ /dev/null @@ -1,12 +0,0 @@ -using FSH.Framework.Core.Tenant.Abstractions; -using MediatR; - -namespace FSH.Framework.Core.Tenant.Features.ActivateTenant; -public sealed class ActivateTenantHandler(ITenantService service) : IRequestHandler -{ - public async Task Handle(ActivateTenantCommand request, CancellationToken cancellationToken) - { - var status = await service.ActivateAsync(request.TenantId, cancellationToken); - return new ActivateTenantResponse(status); - } -} diff --git a/src/api/framework/Core/Tenant/Features/ActivateTenant/ActivateTenantResponse.cs b/src/api/framework/Core/Tenant/Features/ActivateTenant/ActivateTenantResponse.cs deleted file mode 100644 index bd396891df..0000000000 --- a/src/api/framework/Core/Tenant/Features/ActivateTenant/ActivateTenantResponse.cs +++ /dev/null @@ -1,2 +0,0 @@ -namespace FSH.Framework.Core.Tenant.Features.ActivateTenant; -public record ActivateTenantResponse(string Status); diff --git a/src/api/framework/Core/Tenant/Features/ActivateTenant/ActivateTenantValidator.cs b/src/api/framework/Core/Tenant/Features/ActivateTenant/ActivateTenantValidator.cs deleted file mode 100644 index de9bceb45e..0000000000 --- a/src/api/framework/Core/Tenant/Features/ActivateTenant/ActivateTenantValidator.cs +++ /dev/null @@ -1,9 +0,0 @@ -using FluentValidation; - -namespace FSH.Framework.Core.Tenant.Features.ActivateTenant; -public sealed class ActivateTenantValidator : AbstractValidator -{ - public ActivateTenantValidator() => - RuleFor(t => t.TenantId) - .NotEmpty(); -} diff --git a/src/api/framework/Core/Tenant/Features/CreateTenant/CreateTenantCommand.cs b/src/api/framework/Core/Tenant/Features/CreateTenant/CreateTenantCommand.cs deleted file mode 100644 index a6bec85931..0000000000 --- a/src/api/framework/Core/Tenant/Features/CreateTenant/CreateTenantCommand.cs +++ /dev/null @@ -1,8 +0,0 @@ -using MediatR; - -namespace FSH.Framework.Core.Tenant.Features.CreateTenant; -public sealed record CreateTenantCommand(string Id, - string Name, - string? ConnectionString, - string AdminEmail, - string? Issuer) : IRequest; diff --git a/src/api/framework/Core/Tenant/Features/CreateTenant/CreateTenantHandler.cs b/src/api/framework/Core/Tenant/Features/CreateTenant/CreateTenantHandler.cs deleted file mode 100644 index d948367cb8..0000000000 --- a/src/api/framework/Core/Tenant/Features/CreateTenant/CreateTenantHandler.cs +++ /dev/null @@ -1,12 +0,0 @@ -using FSH.Framework.Core.Tenant.Abstractions; -using MediatR; - -namespace FSH.Framework.Core.Tenant.Features.CreateTenant; -public sealed class CreateTenantHandler(ITenantService service) : IRequestHandler -{ - public async Task Handle(CreateTenantCommand request, CancellationToken cancellationToken) - { - var tenantId = await service.CreateAsync(request, cancellationToken); - return new CreateTenantResponse(tenantId); - } -} diff --git a/src/api/framework/Core/Tenant/Features/CreateTenant/CreateTenantResponse.cs b/src/api/framework/Core/Tenant/Features/CreateTenant/CreateTenantResponse.cs deleted file mode 100644 index 7a778e4f79..0000000000 --- a/src/api/framework/Core/Tenant/Features/CreateTenant/CreateTenantResponse.cs +++ /dev/null @@ -1,2 +0,0 @@ -namespace FSH.Framework.Core.Tenant.Features.CreateTenant; -public record CreateTenantResponse(string Id); diff --git a/src/api/framework/Core/Tenant/Features/CreateTenant/CreateTenantValidator.cs b/src/api/framework/Core/Tenant/Features/CreateTenant/CreateTenantValidator.cs deleted file mode 100644 index 16e9816afb..0000000000 --- a/src/api/framework/Core/Tenant/Features/CreateTenant/CreateTenantValidator.cs +++ /dev/null @@ -1,30 +0,0 @@ -using FluentValidation; -using FSH.Framework.Core.Persistence; -using FSH.Framework.Core.Tenant.Abstractions; - -namespace FSH.Framework.Core.Tenant.Features.CreateTenant; -public class CreateTenantValidator : AbstractValidator -{ - public CreateTenantValidator( - ITenantService tenantService, - IConnectionStringValidator connectionStringValidator) - { - RuleFor(t => t.Id).Cascade(CascadeMode.Stop) - .NotEmpty() - .MustAsync(async (id, _) => !await tenantService.ExistsWithIdAsync(id).ConfigureAwait(false)) - .WithMessage((_, id) => $"Tenant {id} already exists."); - - RuleFor(t => t.Name).Cascade(CascadeMode.Stop) - .NotEmpty() - .MustAsync(async (name, _) => !await tenantService.ExistsWithNameAsync(name!).ConfigureAwait(false)) - .WithMessage((_, name) => $"Tenant {name} already exists."); - - RuleFor(t => t.ConnectionString).Cascade(CascadeMode.Stop) - .Must((_, cs) => string.IsNullOrWhiteSpace(cs) || connectionStringValidator.TryValidate(cs)) - .WithMessage("Connection string invalid."); - - RuleFor(t => t.AdminEmail).Cascade(CascadeMode.Stop) - .NotEmpty() - .EmailAddress(); - } -} diff --git a/src/api/framework/Core/Tenant/Features/DisableTenant/DisableTenantCommand.cs b/src/api/framework/Core/Tenant/Features/DisableTenant/DisableTenantCommand.cs deleted file mode 100644 index bc0dc1fa95..0000000000 --- a/src/api/framework/Core/Tenant/Features/DisableTenant/DisableTenantCommand.cs +++ /dev/null @@ -1,4 +0,0 @@ -using MediatR; - -namespace FSH.Framework.Core.Tenant.Features.DisableTenant; -public record DisableTenantCommand(string TenantId) : IRequest; diff --git a/src/api/framework/Core/Tenant/Features/DisableTenant/DisableTenantHandler.cs b/src/api/framework/Core/Tenant/Features/DisableTenant/DisableTenantHandler.cs deleted file mode 100644 index d9cad8dcbd..0000000000 --- a/src/api/framework/Core/Tenant/Features/DisableTenant/DisableTenantHandler.cs +++ /dev/null @@ -1,12 +0,0 @@ -using FSH.Framework.Core.Tenant.Abstractions; -using MediatR; - -namespace FSH.Framework.Core.Tenant.Features.DisableTenant; -public sealed class DisableTenantHandler(ITenantService service) : IRequestHandler -{ - public async Task Handle(DisableTenantCommand request, CancellationToken cancellationToken) - { - var status = await service.DeactivateAsync(request.TenantId); - return new DisableTenantResponse(status); - } -} diff --git a/src/api/framework/Core/Tenant/Features/DisableTenant/DisableTenantResponse.cs b/src/api/framework/Core/Tenant/Features/DisableTenant/DisableTenantResponse.cs deleted file mode 100644 index 89ce0c0538..0000000000 --- a/src/api/framework/Core/Tenant/Features/DisableTenant/DisableTenantResponse.cs +++ /dev/null @@ -1,2 +0,0 @@ -namespace FSH.Framework.Core.Tenant.Features.DisableTenant; -public record DisableTenantResponse(string Status); diff --git a/src/api/framework/Core/Tenant/Features/DisableTenant/DisableTenantValidator.cs b/src/api/framework/Core/Tenant/Features/DisableTenant/DisableTenantValidator.cs deleted file mode 100644 index 2c0831e209..0000000000 --- a/src/api/framework/Core/Tenant/Features/DisableTenant/DisableTenantValidator.cs +++ /dev/null @@ -1,9 +0,0 @@ -using FluentValidation; - -namespace FSH.Framework.Core.Tenant.Features.DisableTenant; -public sealed class DisableTenantValidator : AbstractValidator -{ - public DisableTenantValidator() => - RuleFor(t => t.TenantId) - .NotEmpty(); -} diff --git a/src/api/framework/Core/Tenant/Features/GetTenantById/GetTenantByIdHandler.cs b/src/api/framework/Core/Tenant/Features/GetTenantById/GetTenantByIdHandler.cs deleted file mode 100644 index ec8e68737c..0000000000 --- a/src/api/framework/Core/Tenant/Features/GetTenantById/GetTenantByIdHandler.cs +++ /dev/null @@ -1,12 +0,0 @@ -using FSH.Framework.Core.Tenant.Abstractions; -using FSH.Framework.Core.Tenant.Dtos; -using MediatR; - -namespace FSH.Framework.Core.Tenant.Features.GetTenantById; -public sealed class GetTenantByIdHandler(ITenantService service) : IRequestHandler -{ - public async Task Handle(GetTenantByIdQuery request, CancellationToken cancellationToken) - { - return await service.GetByIdAsync(request.TenantId); - } -} diff --git a/src/api/framework/Core/Tenant/Features/GetTenantById/GetTenantByIdQuery.cs b/src/api/framework/Core/Tenant/Features/GetTenantById/GetTenantByIdQuery.cs deleted file mode 100644 index 9f75bc68c4..0000000000 --- a/src/api/framework/Core/Tenant/Features/GetTenantById/GetTenantByIdQuery.cs +++ /dev/null @@ -1,5 +0,0 @@ -using FSH.Framework.Core.Tenant.Dtos; -using MediatR; - -namespace FSH.Framework.Core.Tenant.Features.GetTenantById; -public record GetTenantByIdQuery(string TenantId) : IRequest; diff --git a/src/api/framework/Core/Tenant/Features/GetTenants/GetTenantsHandler.cs b/src/api/framework/Core/Tenant/Features/GetTenants/GetTenantsHandler.cs deleted file mode 100644 index 1ccd5f90eb..0000000000 --- a/src/api/framework/Core/Tenant/Features/GetTenants/GetTenantsHandler.cs +++ /dev/null @@ -1,12 +0,0 @@ -using FSH.Framework.Core.Tenant.Abstractions; -using FSH.Framework.Core.Tenant.Dtos; -using MediatR; - -namespace FSH.Framework.Core.Tenant.Features.GetTenants; -public sealed class GetTenantsHandler(ITenantService service) : IRequestHandler> -{ - public Task> Handle(GetTenantsQuery request, CancellationToken cancellationToken) - { - return service.GetAllAsync(); - } -} diff --git a/src/api/framework/Core/Tenant/Features/GetTenants/GetTenantsQuery.cs b/src/api/framework/Core/Tenant/Features/GetTenants/GetTenantsQuery.cs deleted file mode 100644 index dba6bc1896..0000000000 --- a/src/api/framework/Core/Tenant/Features/GetTenants/GetTenantsQuery.cs +++ /dev/null @@ -1,5 +0,0 @@ -using FSH.Framework.Core.Tenant.Dtos; -using MediatR; - -namespace FSH.Framework.Core.Tenant.Features.GetTenants; -public sealed class GetTenantsQuery : IRequest>; diff --git a/src/api/framework/Core/Tenant/Features/UpgradeSubscription/UpgradeSubscriptionCommand.cs b/src/api/framework/Core/Tenant/Features/UpgradeSubscription/UpgradeSubscriptionCommand.cs deleted file mode 100644 index f132f455b7..0000000000 --- a/src/api/framework/Core/Tenant/Features/UpgradeSubscription/UpgradeSubscriptionCommand.cs +++ /dev/null @@ -1,8 +0,0 @@ -using MediatR; - -namespace FSH.Framework.Core.Tenant.Features.UpgradeSubscription; -public class UpgradeSubscriptionCommand : IRequest -{ - public string Tenant { get; set; } = default!; - public DateTime ExtendedExpiryDate { get; set; } -} diff --git a/src/api/framework/Core/Tenant/Features/UpgradeSubscription/UpgradeSubscriptionHandler.cs b/src/api/framework/Core/Tenant/Features/UpgradeSubscription/UpgradeSubscriptionHandler.cs deleted file mode 100644 index e4cbbb4e7a..0000000000 --- a/src/api/framework/Core/Tenant/Features/UpgradeSubscription/UpgradeSubscriptionHandler.cs +++ /dev/null @@ -1,17 +0,0 @@ -using FSH.Framework.Core.Tenant.Abstractions; -using MediatR; - -namespace FSH.Framework.Core.Tenant.Features.UpgradeSubscription; - -public class UpgradeSubscriptionHandler : IRequestHandler -{ - private readonly ITenantService _tenantService; - - public UpgradeSubscriptionHandler(ITenantService tenantService) => _tenantService = tenantService; - - public async Task Handle(UpgradeSubscriptionCommand request, CancellationToken cancellationToken) - { - var validUpto = await _tenantService.UpgradeSubscription(request.Tenant, request.ExtendedExpiryDate); - return new UpgradeSubscriptionResponse(validUpto, request.Tenant); - } -} diff --git a/src/api/framework/Core/Tenant/Features/UpgradeSubscription/UpgradeSubscriptionResponse.cs b/src/api/framework/Core/Tenant/Features/UpgradeSubscription/UpgradeSubscriptionResponse.cs deleted file mode 100644 index ef14487b74..0000000000 --- a/src/api/framework/Core/Tenant/Features/UpgradeSubscription/UpgradeSubscriptionResponse.cs +++ /dev/null @@ -1,2 +0,0 @@ -namespace FSH.Framework.Core.Tenant.Features.UpgradeSubscription; -public record UpgradeSubscriptionResponse(DateTime NewValidity, string Tenant); diff --git a/src/api/framework/Core/Tenant/Features/UpgradeSubscription/UpgradeSubscriptionValidator.cs b/src/api/framework/Core/Tenant/Features/UpgradeSubscription/UpgradeSubscriptionValidator.cs deleted file mode 100644 index daddf1fbf1..0000000000 --- a/src/api/framework/Core/Tenant/Features/UpgradeSubscription/UpgradeSubscriptionValidator.cs +++ /dev/null @@ -1,11 +0,0 @@ -using FluentValidation; - -namespace FSH.Framework.Core.Tenant.Features.UpgradeSubscription; -public class UpgradeSubscriptionValidator : AbstractValidator -{ - public UpgradeSubscriptionValidator() - { - RuleFor(t => t.Tenant).NotEmpty(); - RuleFor(t => t.ExtendedExpiryDate).GreaterThan(DateTime.UtcNow); - } -} diff --git a/src/api/framework/Infrastructure/Auth/CurrentUserMiddleware.cs b/src/api/framework/Infrastructure/Auth/CurrentUserMiddleware.cs deleted file mode 100644 index b4deef0872..0000000000 --- a/src/api/framework/Infrastructure/Auth/CurrentUserMiddleware.cs +++ /dev/null @@ -1,14 +0,0 @@ -using FSH.Framework.Core.Identity.Users.Abstractions; -using Microsoft.AspNetCore.Http; - -namespace FSH.Framework.Infrastructure.Auth; -public class CurrentUserMiddleware(ICurrentUserInitializer currentUserInitializer) : IMiddleware -{ - private readonly ICurrentUserInitializer _currentUserInitializer = currentUserInitializer; - - public async Task InvokeAsync(HttpContext context, RequestDelegate next) - { - _currentUserInitializer.SetCurrentUser(context.User); - await next(context); - } -} diff --git a/src/api/framework/Infrastructure/Auth/Jwt/ConfigureJwtBearerOptions.cs b/src/api/framework/Infrastructure/Auth/Jwt/ConfigureJwtBearerOptions.cs deleted file mode 100644 index 8e495d207b..0000000000 --- a/src/api/framework/Infrastructure/Auth/Jwt/ConfigureJwtBearerOptions.cs +++ /dev/null @@ -1,75 +0,0 @@ -using System.Security.Claims; -using System.Text; -using FSH.Framework.Core.Auth.Jwt; -using FSH.Framework.Core.Exceptions; -using Microsoft.AspNetCore.Authentication.JwtBearer; -using Microsoft.Extensions.Options; -using Microsoft.IdentityModel.Tokens; - -namespace FSH.Framework.Infrastructure.Auth.Jwt; -public class ConfigureJwtBearerOptions : IConfigureNamedOptions -{ - private readonly JwtOptions _options; - - public ConfigureJwtBearerOptions(IOptions options) - { - _options = options.Value; - } - - public void Configure(JwtBearerOptions options) - { - Configure(string.Empty, options); - } - - public void Configure(string? name, JwtBearerOptions options) - { - if (name != JwtBearerDefaults.AuthenticationScheme) - { - return; - } - - byte[] key = Encoding.ASCII.GetBytes(_options.Key); - - options.RequireHttpsMetadata = false; - options.SaveToken = true; - options.TokenValidationParameters = new TokenValidationParameters - { - ValidateIssuerSigningKey = true, - IssuerSigningKey = new SymmetricSecurityKey(key), - ValidIssuer = JwtAuthConstants.Issuer, - ValidateIssuer = true, - ValidateLifetime = true, - ValidAudience = JwtAuthConstants.Audience, - ValidateAudience = true, - RoleClaimType = ClaimTypes.Role, - ClockSkew = TimeSpan.Zero - }; - options.Events = new JwtBearerEvents - { - OnChallenge = context => - { - context.HandleResponse(); - if (!context.Response.HasStarted) - { - throw new UnauthorizedException(); - } - - return Task.CompletedTask; - }, - OnForbidden = _ => throw new ForbiddenException(), - OnMessageReceived = context => - { - var accessToken = context.Request.Query["access_token"]; - - if (!string.IsNullOrEmpty(accessToken) && - context.HttpContext.Request.Path.StartsWithSegments("/notifications", StringComparison.OrdinalIgnoreCase)) - { - // Read the token out of the query string - context.Token = accessToken; - } - - return Task.CompletedTask; - } - }; - } -} diff --git a/src/api/framework/Infrastructure/Auth/Jwt/Extensions.cs b/src/api/framework/Infrastructure/Auth/Jwt/Extensions.cs deleted file mode 100644 index 87a94d3ec1..0000000000 --- a/src/api/framework/Infrastructure/Auth/Jwt/Extensions.cs +++ /dev/null @@ -1,33 +0,0 @@ -using FSH.Framework.Core.Auth.Jwt; -using FSH.Framework.Infrastructure.Auth.Policy; -using Microsoft.AspNetCore.Authentication.JwtBearer; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; - -namespace FSH.Framework.Infrastructure.Auth.Jwt; -internal static class Extensions -{ - internal static IServiceCollection ConfigureJwtAuth(this IServiceCollection services) - { - services.AddOptions() - .BindConfiguration(nameof(JwtOptions)) - .ValidateDataAnnotations() - .ValidateOnStart(); - - services.AddSingleton, ConfigureJwtBearerOptions>(); - services - .AddAuthentication(authentication => - { - authentication.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; - authentication.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; - }) - .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, null!); - - services.AddAuthorizationBuilder().AddRequiredPermissionPolicy(); - services.AddAuthorization(options => - { - options.FallbackPolicy = options.GetPolicy(RequiredPermissionDefaults.PolicyName); - }); - return services; - } -} diff --git a/src/api/framework/Infrastructure/Auth/Jwt/JwtAuthConstants.cs b/src/api/framework/Infrastructure/Auth/Jwt/JwtAuthConstants.cs deleted file mode 100644 index b766fdf804..0000000000 --- a/src/api/framework/Infrastructure/Auth/Jwt/JwtAuthConstants.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace FSH.Framework.Infrastructure.Auth.Jwt; -internal static class JwtAuthConstants -{ - public const string Issuer = "https://fullstackhero.net"; - public const string Audience = "fullstackhero"; -} diff --git a/src/api/framework/Infrastructure/Auth/Policy/EndpointExtensions.cs b/src/api/framework/Infrastructure/Auth/Policy/EndpointExtensions.cs deleted file mode 100644 index 7cd6ea7e1e..0000000000 --- a/src/api/framework/Infrastructure/Auth/Policy/EndpointExtensions.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Microsoft.AspNetCore.Builder; - -namespace FSH.Framework.Infrastructure.Auth.Policy; -public static class EndpointExtensions -{ - public static TBuilder RequirePermission( - this TBuilder endpointConventionBuilder, string requiredPermission, params string[] additionalRequiredPermissions) - where TBuilder : IEndpointConventionBuilder - { - return endpointConventionBuilder.WithMetadata(new RequiredPermissionAttribute(requiredPermission, additionalRequiredPermissions)); - } -} diff --git a/src/api/framework/Infrastructure/Auth/Policy/PermissionAuthorizationRequirement.cs b/src/api/framework/Infrastructure/Auth/Policy/PermissionAuthorizationRequirement.cs deleted file mode 100644 index 1286921818..0000000000 --- a/src/api/framework/Infrastructure/Auth/Policy/PermissionAuthorizationRequirement.cs +++ /dev/null @@ -1,4 +0,0 @@ -using Microsoft.AspNetCore.Authorization; - -namespace FSH.Framework.Infrastructure.Auth.Policy; -public class PermissionAuthorizationRequirement : IAuthorizationRequirement; diff --git a/src/api/framework/Infrastructure/Auth/Policy/RequiredPermissionAttribute.cs b/src/api/framework/Infrastructure/Auth/Policy/RequiredPermissionAttribute.cs deleted file mode 100644 index cf7ea3d91e..0000000000 --- a/src/api/framework/Infrastructure/Auth/Policy/RequiredPermissionAttribute.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace FSH.Framework.Infrastructure.Auth.Policy; -public interface IRequiredPermissionMetadata -{ - HashSet RequiredPermissions { get; } -} - -[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] -public sealed class RequiredPermissionAttribute(string? requiredPermission, params string[]? additionalRequiredPermissions) - : Attribute, IRequiredPermissionMetadata -{ - public HashSet RequiredPermissions { get; } = [requiredPermission!, .. additionalRequiredPermissions]; - public string? RequiredPermission { get; } - public string[]? AdditionalRequiredPermissions { get; } -} diff --git a/src/api/framework/Infrastructure/Auth/Policy/RequiredPermissionAuthorizationExtensions.cs b/src/api/framework/Infrastructure/Auth/Policy/RequiredPermissionAuthorizationExtensions.cs deleted file mode 100644 index e92cdb2e68..0000000000 --- a/src/api/framework/Infrastructure/Auth/Policy/RequiredPermissionAuthorizationExtensions.cs +++ /dev/null @@ -1,32 +0,0 @@ -using Microsoft.AspNetCore.Authentication.JwtBearer; -using Microsoft.AspNetCore.Authorization; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; - -namespace FSH.Framework.Infrastructure.Auth.Policy; -public static class RequiredPermissionDefaults -{ - public const string PolicyName = "RequiredPermission"; -} - -public static class RequiredPermissionAuthorizationExtensions -{ - public static AuthorizationPolicyBuilder RequireRequiredPermissions(this AuthorizationPolicyBuilder builder) - { - return builder.AddRequirements(new PermissionAuthorizationRequirement()); - } - - public static AuthorizationBuilder AddRequiredPermissionPolicy(this AuthorizationBuilder builder) - { - builder.AddPolicy(RequiredPermissionDefaults.PolicyName, policy => - { - policy.RequireAuthenticatedUser(); - policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme); - policy.RequireRequiredPermissions(); - }); - - builder.Services.TryAddEnumerable(ServiceDescriptor.Scoped()); - - return builder; - } -} diff --git a/src/api/framework/Infrastructure/Auth/Policy/RequiredPermissionAuthorizationHandler.cs b/src/api/framework/Infrastructure/Auth/Policy/RequiredPermissionAuthorizationHandler.cs deleted file mode 100644 index 8903b660e8..0000000000 --- a/src/api/framework/Infrastructure/Auth/Policy/RequiredPermissionAuthorizationHandler.cs +++ /dev/null @@ -1,31 +0,0 @@ -using FSH.Framework.Core.Identity.Users.Abstractions; -using FSH.Starter.Shared.Authorization; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Http; - -namespace FSH.Framework.Infrastructure.Auth.Policy; -public sealed class RequiredPermissionAuthorizationHandler(IUserService userService) : AuthorizationHandler -{ - protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, PermissionAuthorizationRequirement requirement) - { - var endpoint = context.Resource switch - { - HttpContext httpContext => httpContext.GetEndpoint(), - Endpoint ep => ep, - _ => null, - }; - - var requiredPermissions = endpoint?.Metadata.GetMetadata()?.RequiredPermissions; - if (requiredPermissions == null) - { - // there are no permission requirements set by the endpoint - // hence, authorize requests - context.Succeed(requirement); - return; - } - if (context.User?.GetUserId() is { } userId && await userService.HasPermissionAsync(userId, requiredPermissions.First())) - { - context.Succeed(requirement); - } - } -} diff --git a/src/api/framework/Infrastructure/Behaviours/ValidationBehavior.cs b/src/api/framework/Infrastructure/Behaviours/ValidationBehavior.cs deleted file mode 100644 index 016652aeb7..0000000000 --- a/src/api/framework/Infrastructure/Behaviours/ValidationBehavior.cs +++ /dev/null @@ -1,23 +0,0 @@ -using FluentValidation; -using MediatR; - -namespace FSH.Framework.Infrastructure.Behaviours; -public class ValidationBehavior(IEnumerable> validators) : IPipelineBehavior - where TRequest : IRequest -{ - private readonly IEnumerable> _validators = validators; - - public async Task Handle(TRequest request, RequestHandlerDelegate next, CancellationToken cancellationToken) - { - if (_validators.Any()) - { - var context = new ValidationContext(request); - var validationResults = await Task.WhenAll(_validators.Select(v => v.ValidateAsync(context, cancellationToken))); - var failures = validationResults.SelectMany(r => r.Errors).Where(f => f != null).ToList(); - - if (failures.Count > 0) - throw new ValidationException(failures); - } - return await next(); - } -} diff --git a/src/api/framework/Infrastructure/Caching/DistributedCacheService.cs b/src/api/framework/Infrastructure/Caching/DistributedCacheService.cs deleted file mode 100644 index f4353d69a5..0000000000 --- a/src/api/framework/Infrastructure/Caching/DistributedCacheService.cs +++ /dev/null @@ -1,161 +0,0 @@ -using System.Text; -using System.Text.Json; -using FSH.Framework.Core.Caching; -using Microsoft.Extensions.Caching.Distributed; -using Microsoft.Extensions.Logging; - -namespace FSH.Framework.Infrastructure.Caching; - -public class DistributedCacheService : ICacheService -{ - private readonly IDistributedCache _cache; - private readonly ILogger _logger; - - public DistributedCacheService(IDistributedCache cache, ILogger logger) - { - (_cache, _logger) = (cache, logger); - } - - public T? Get(string key) => - Get(key) is { } data - ? Deserialize(data) - : default; - - private byte[]? Get(string key) - { - ArgumentNullException.ThrowIfNull(key); - - try - { - return _cache.Get(key); - } - catch - { - return null; - } - } - - public async Task GetAsync(string key, CancellationToken token = default) => - await GetAsync(key, token) is { } data - ? Deserialize(data) - : default; - - private async Task GetAsync(string key, CancellationToken token = default) - { - try - { - return await _cache.GetAsync(key, token); - } - catch (Exception ex) - { - Console.WriteLine(ex); - return null; - } - } - - public void Refresh(string key) - { - try - { - _cache.Refresh(key); - } - catch - { - // can be ignored - } - } - - public async Task RefreshAsync(string key, CancellationToken token = default) - { - try - { - await _cache.RefreshAsync(key, token); - _logger.LogDebug("refreshed cache with key : {Key}", key); - } - catch - { - // can be ignored - } - } - - public void Remove(string key) - { - try - { - _cache.Remove(key); - } - catch - { - // can be ignored - } - } - - public async Task RemoveAsync(string key, CancellationToken token = default) - { - try - { - await _cache.RemoveAsync(key, token); - } - catch - { - // can be ignored - } - } - - public void Set(string key, T value, TimeSpan? slidingExpiration = null) => - Set(key, Serialize(value), slidingExpiration); - - private void Set(string key, byte[] value, TimeSpan? slidingExpiration = null) - { - try - { - _cache.Set(key, value, GetOptions(slidingExpiration)); - _logger.LogDebug("cached data with key : {Key}", key); - } - catch - { - // can be ignored - } - } - - public Task SetAsync(string key, T value, TimeSpan? slidingExpiration = null, CancellationToken cancellationToken = default) => - SetAsync(key, Serialize(value), slidingExpiration, cancellationToken); - - private async Task SetAsync(string key, byte[] value, TimeSpan? slidingExpiration = null, CancellationToken token = default) - { - try - { - await _cache.SetAsync(key, value, GetOptions(slidingExpiration), token); - _logger.LogDebug("cached data with key : {Key}", key); - } - catch - { - // can be ignored - } - } - - private static byte[] Serialize(T item) - { - return Encoding.Default.GetBytes(JsonSerializer.Serialize(item)); - } - - private static T Deserialize(byte[] cachedData) - { - return JsonSerializer.Deserialize(Encoding.Default.GetString(cachedData))!; - } - - private static DistributedCacheEntryOptions GetOptions(TimeSpan? slidingExpiration) - { - var options = new DistributedCacheEntryOptions(); - if (slidingExpiration.HasValue) - { - options.SetSlidingExpiration(slidingExpiration.Value); - } - else - { - options.SetSlidingExpiration(TimeSpan.FromMinutes(5)); - } - options.SetAbsoluteExpiration(TimeSpan.FromMinutes(15)); - return options; - } -} diff --git a/src/api/framework/Infrastructure/Caching/Extensions.cs b/src/api/framework/Infrastructure/Caching/Extensions.cs deleted file mode 100644 index c389a52a1b..0000000000 --- a/src/api/framework/Infrastructure/Caching/Extensions.cs +++ /dev/null @@ -1,34 +0,0 @@ -using FSH.Framework.Core.Caching; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Serilog; - -namespace FSH.Framework.Infrastructure.Caching; -internal static class Extensions -{ - private static readonly ILogger _logger = Log.ForContext(typeof(Extensions)); - internal static IServiceCollection ConfigureCaching(this IServiceCollection services, IConfiguration configuration) - { - services.AddTransient(); - var cacheOptions = configuration.GetSection(nameof(CacheOptions)).Get(); - if (cacheOptions == null || string.IsNullOrEmpty(cacheOptions.Redis)) - { - _logger.Information("configuring memory cache."); - services.AddDistributedMemoryCache(); - return services; - } - - _logger.Information("configuring redis cache."); - services.AddStackExchangeRedisCache(options => - { - options.Configuration = cacheOptions.Redis; - options.ConfigurationOptions = new StackExchange.Redis.ConfigurationOptions() - { - AbortOnConnectFail = true, - EndPoints = { cacheOptions.Redis! } - }; - }); - - return services; - } -} diff --git a/src/api/framework/Infrastructure/Common/Extensions/EnumExtensions.cs b/src/api/framework/Infrastructure/Common/Extensions/EnumExtensions.cs deleted file mode 100644 index d1f3014aa3..0000000000 --- a/src/api/framework/Infrastructure/Common/Extensions/EnumExtensions.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Collections.ObjectModel; -using System.ComponentModel; -using System.Text.RegularExpressions; - -namespace FSH.Framework.Infrastructure.Common.Extensions; -public static class EnumExtensions -{ - public static string GetDescription(this Enum enumValue) - { - object[] attr = enumValue.GetType().GetField(enumValue.ToString())! - .GetCustomAttributes(typeof(DescriptionAttribute), false); - if (attr.Length > 0) - return ((DescriptionAttribute)attr[0]).Description; - string result = enumValue.ToString(); - result = Regex.Replace(result, "([a-z])([A-Z])", "$1 $2"); - result = Regex.Replace(result, "([A-Za-z])([0-9])", "$1 $2"); - result = Regex.Replace(result, "([0-9])([A-Za-z])", "$1 $2"); - result = Regex.Replace(result, "(? GetDescriptionList(this Enum enumValue) - { - string result = enumValue.GetDescription(); - return new ReadOnlyCollection(result.Split(',').ToList()); - } -} diff --git a/src/api/framework/Infrastructure/Common/Extensions/RegexExtensions.cs b/src/api/framework/Infrastructure/Common/Extensions/RegexExtensions.cs deleted file mode 100644 index 0204acd3c5..0000000000 --- a/src/api/framework/Infrastructure/Common/Extensions/RegexExtensions.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Text.RegularExpressions; - -namespace FSH.Framework.Infrastructure.Common.Extensions; -public static class RegexExtensions -{ - private static readonly Regex Whitespace = new(@"\s+"); - - public static string ReplaceWhitespace(this string input, string replacement) - { - return Whitespace.Replace(input, replacement); - } -} diff --git a/src/api/framework/Infrastructure/Constants/QueryStringKeys.cs b/src/api/framework/Infrastructure/Constants/QueryStringKeys.cs deleted file mode 100644 index 0ea2d30503..0000000000 --- a/src/api/framework/Infrastructure/Constants/QueryStringKeys.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace FSH.Framework.Infrastructure.Constants; -public static class QueryStringKeys -{ - public const string Code = "code"; - public const string UserId = "userId"; -} diff --git a/src/api/framework/Infrastructure/Cors/CorsOptions.cs b/src/api/framework/Infrastructure/Cors/CorsOptions.cs deleted file mode 100644 index 8f2ef1b9eb..0000000000 --- a/src/api/framework/Infrastructure/Cors/CorsOptions.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace FSH.Framework.Infrastructure.Cors; -using System.Collections.ObjectModel; - -public class CorsOptions -{ - public CorsOptions() - { - AllowedOrigins = []; - } - - public Collection AllowedOrigins { get; } -} diff --git a/src/api/framework/Infrastructure/Cors/Extensions.cs b/src/api/framework/Infrastructure/Cors/Extensions.cs deleted file mode 100644 index d559de2067..0000000000 --- a/src/api/framework/Infrastructure/Cors/Extensions.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; - -namespace FSH.Framework.Infrastructure.Cors; -public static class Extensions -{ - private const string CorsPolicy = nameof(CorsPolicy); - internal static IServiceCollection AddCorsPolicy(this IServiceCollection services, IConfiguration config) - { - var corsOptions = config.GetSection(nameof(CorsOptions)).Get(); - if (corsOptions == null) { return services; } - return services.AddCors(opt => - opt.AddPolicy(CorsPolicy, policy => - policy.AllowAnyHeader() - .AllowAnyMethod() - .AllowCredentials() - .WithOrigins(corsOptions.AllowedOrigins.ToArray()))); - } - - internal static IApplicationBuilder UseCorsPolicy(this IApplicationBuilder app) - { - return app.UseCors(CorsPolicy); - } -} diff --git a/src/api/framework/Infrastructure/Exceptions/CustomExceptionHandler.cs b/src/api/framework/Infrastructure/Exceptions/CustomExceptionHandler.cs deleted file mode 100644 index c2d19308f2..0000000000 --- a/src/api/framework/Infrastructure/Exceptions/CustomExceptionHandler.cs +++ /dev/null @@ -1,51 +0,0 @@ -using FSH.Framework.Core.Exceptions; -using Microsoft.AspNetCore.Diagnostics; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Logging; -using Serilog.Context; - -namespace FSH.Framework.Infrastructure.Exceptions; -public class CustomExceptionHandler(ILogger logger) : IExceptionHandler -{ - public async ValueTask TryHandleAsync(HttpContext httpContext, Exception exception, CancellationToken cancellationToken) - { - ArgumentNullException.ThrowIfNull(httpContext); - ArgumentNullException.ThrowIfNull(exception); - var problemDetails = new ProblemDetails(); - problemDetails.Instance = httpContext.Request.Path; - - if (exception is FluentValidation.ValidationException fluentException) - { - problemDetails.Detail = "one or more validation errors occurred"; - problemDetails.Type = "https://tools.ietf.org/html/rfc7231#section-6.5.1"; - httpContext.Response.StatusCode = StatusCodes.Status400BadRequest; - List validationErrors = new List(); - foreach (var error in fluentException.Errors) - { - validationErrors.Add(error.ErrorMessage); - } - problemDetails.Extensions.Add("errors", validationErrors); - } - - else if (exception is FshException e) - { - httpContext.Response.StatusCode = (int)e.StatusCode; - problemDetails.Detail = e.Message; - if (e.ErrorMessages != null && e.ErrorMessages.Any()) - { - problemDetails.Extensions.Add("errors", e.ErrorMessages); - } - } - - else - { - problemDetails.Detail = exception.Message; - } - - LogContext.PushProperty("StackTrace", exception.StackTrace); - logger.LogError("{ProblemDetail}", problemDetails.Detail); - await httpContext.Response.WriteAsJsonAsync(problemDetails, cancellationToken).ConfigureAwait(false); - return true; - } -} diff --git a/src/api/framework/Infrastructure/Extensions.cs b/src/api/framework/Infrastructure/Extensions.cs deleted file mode 100644 index 865bce172d..0000000000 --- a/src/api/framework/Infrastructure/Extensions.cs +++ /dev/null @@ -1,114 +0,0 @@ -using System.Reflection; -using Asp.Versioning.Conventions; -using FluentValidation; -using FSH.Framework.Core; -using FSH.Framework.Core.Origin; -using FSH.Framework.Infrastructure.Auth; -using FSH.Framework.Infrastructure.Auth.Jwt; -using FSH.Framework.Infrastructure.Behaviours; -using FSH.Framework.Infrastructure.Caching; -using FSH.Framework.Infrastructure.Cors; -using FSH.Framework.Infrastructure.Exceptions; -using FSH.Framework.Infrastructure.Identity; -using FSH.Framework.Infrastructure.Jobs; -using FSH.Framework.Infrastructure.Logging.Serilog; -using FSH.Framework.Infrastructure.Mail; -using FSH.Framework.Infrastructure.OpenApi; -using FSH.Framework.Infrastructure.Persistence; -using FSH.Framework.Infrastructure.RateLimit; -using FSH.Framework.Infrastructure.SecurityHeaders; -using FSH.Framework.Infrastructure.Storage.Files; -using FSH.Framework.Infrastructure.Tenant; -using FSH.Framework.Infrastructure.Tenant.Endpoints; -using FSH.Starter.Aspire.ServiceDefaults; -using MediatR; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.FileProviders; - -namespace FSH.Framework.Infrastructure; - -public static class Extensions -{ - public static WebApplicationBuilder ConfigureFshFramework(this WebApplicationBuilder builder) - { - ArgumentNullException.ThrowIfNull(builder); - builder.AddServiceDefaults(); - builder.ConfigureSerilog(); - builder.ConfigureDatabase(); - builder.Services.ConfigureMultitenancy(); - builder.Services.ConfigureIdentity(); - builder.Services.AddCorsPolicy(builder.Configuration); - builder.Services.ConfigureFileStorage(); - builder.Services.ConfigureJwtAuth(); - builder.Services.ConfigureOpenApi(); - builder.Services.ConfigureJobs(builder.Configuration); - builder.Services.ConfigureMailing(); - builder.Services.ConfigureCaching(builder.Configuration); - builder.Services.AddExceptionHandler(); - builder.Services.AddProblemDetails(); - builder.Services.AddHealthChecks(); - builder.Services.AddOptions().BindConfiguration(nameof(OriginOptions)); - - // Define module assemblies - var assemblies = new Assembly[] - { - typeof(FshCore).Assembly, - typeof(FshInfrastructure).Assembly - }; - - // Register validators - builder.Services.AddValidatorsFromAssemblies(assemblies); - - // Register MediatR - builder.Services.AddMediatR(cfg => - { - cfg.RegisterServicesFromAssemblies(assemblies); - cfg.AddBehavior(typeof(IPipelineBehavior<,>), typeof(ValidationBehavior<,>)); - }); - - builder.Services.ConfigureRateLimit(builder.Configuration); - builder.Services.ConfigureSecurityHeaders(builder.Configuration); - - return builder; - } - - public static WebApplication UseFshFramework(this WebApplication app) - { - app.MapDefaultEndpoints(); - app.UseRateLimit(); - app.UseSecurityHeaders(); - app.UseMultitenancy(); - app.UseExceptionHandler(); - app.UseCorsPolicy(); - app.UseOpenApi(); - app.UseJobDashboard(app.Configuration); - app.UseRouting(); - app.UseStaticFiles(); - app.UseStaticFiles(new StaticFileOptions() - { - FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "assets")), - RequestPath = new PathString("/assets") - }); - app.UseAuthentication(); - app.UseAuthorization(); - app.MapTenantEndpoints(); - app.MapIdentityEndpoints(); - - // Current user middleware - app.UseMiddleware(); - - // Register API versions - var versions = app.NewApiVersionSet() - .HasApiVersion(1) - .HasApiVersion(2) - .ReportApiVersions() - .Build(); - - // Map versioned endpoint - app.MapGroup("api/v{version:apiVersion}").WithApiVersionSet(versions); - - return app; - } -} diff --git a/src/api/framework/Infrastructure/FshInfrastructure.cs b/src/api/framework/Infrastructure/FshInfrastructure.cs deleted file mode 100644 index d6b702c584..0000000000 --- a/src/api/framework/Infrastructure/FshInfrastructure.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace FSH.Framework.Infrastructure; -public class FshInfrastructure -{ - public static string Name { get; set; } = "FshInfrastructure"; -} diff --git a/src/api/framework/Infrastructure/HealthChecks/HealthCheckEndpoint.cs b/src/api/framework/Infrastructure/HealthChecks/HealthCheckEndpoint.cs deleted file mode 100644 index 785aac77bb..0000000000 --- a/src/api/framework/Infrastructure/HealthChecks/HealthCheckEndpoint.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System.Text.Json; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Diagnostics.HealthChecks; - -namespace FSH.Framework.Infrastructure.HealthChecks; -public static class HealthCheckEndpoint -{ - internal static RouteHandlerBuilder MapCustomHealthCheckEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapGet("/", (HttpContext context) => - { - var healthCheckService = context.RequestServices.GetRequiredService(); - var report = healthCheckService.CheckHealthAsync().Result; - - var response = new - { - status = report.Status.ToString(), - checks = report.Entries.Select(entry => new - { - name = entry.Key, - status = entry.Value.Status.ToString(), - description = entry.Value.Description - }), - - duration = report.TotalDuration - }; - - context.Response.ContentType = "application/json"; - return JsonSerializer.Serialize(response); - }) - .WithName("HealthCheck") - .WithSummary("Checks the health status of the application") - .WithDescription("Provides detailed health information about the application.") - .AllowAnonymous(); - } -} diff --git a/src/api/framework/Infrastructure/HealthChecks/HealthCheckMiddleware.cs b/src/api/framework/Infrastructure/HealthChecks/HealthCheckMiddleware.cs deleted file mode 100644 index 0311568702..0000000000 --- a/src/api/framework/Infrastructure/HealthChecks/HealthCheckMiddleware.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Text.Json; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.Diagnostics.HealthChecks; - -namespace FSH.Framework.Infrastructure.HealthChecks; - -public class HealthCheckMiddleware -{ - private readonly HealthCheckService _healthCheckService; - - public HealthCheckMiddleware(HealthCheckService healthCheckService) - { - _healthCheckService = healthCheckService; - } - - public async Task InvokeAsync(HttpContext context) - { - var report = await _healthCheckService.CheckHealthAsync(); - - var response = new - { - status = report.Status.ToString(), - checks = report.Entries.Select(entry => new - { - name = entry.Key, - status = entry.Value.Status.ToString(), - description = entry.Value.Description - }), - duration = report.TotalDuration - }; - - context.Response.ContentType = "application/json"; - await context.Response.WriteAsync(JsonSerializer.Serialize(response)); - } -} - diff --git a/src/api/framework/Infrastructure/Identity/Audit/AuditPublishedEvent.cs b/src/api/framework/Infrastructure/Identity/Audit/AuditPublishedEvent.cs deleted file mode 100644 index 46587882d7..0000000000 --- a/src/api/framework/Infrastructure/Identity/Audit/AuditPublishedEvent.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Collections.ObjectModel; -using FSH.Framework.Core.Audit; -using MediatR; - -namespace FSH.Framework.Infrastructure.Identity.Audit; -public class AuditPublishedEvent : INotification -{ - public AuditPublishedEvent(Collection? trails) - { - Trails = trails; - } - public Collection? Trails { get; } -} diff --git a/src/api/framework/Infrastructure/Identity/Audit/AuditPublishedEventHandler.cs b/src/api/framework/Infrastructure/Identity/Audit/AuditPublishedEventHandler.cs deleted file mode 100644 index cb255f82af..0000000000 --- a/src/api/framework/Infrastructure/Identity/Audit/AuditPublishedEventHandler.cs +++ /dev/null @@ -1,24 +0,0 @@ -using FSH.Framework.Core.Audit; -using FSH.Framework.Infrastructure.Identity.Persistence; -using MediatR; -using Microsoft.Extensions.Logging; - -namespace FSH.Framework.Infrastructure.Identity.Audit; -public class AuditPublishedEventHandler(ILogger logger, IdentityDbContext context) : INotificationHandler -{ - public async Task Handle(AuditPublishedEvent notification, CancellationToken cancellationToken) - { - if (context == null) return; - logger.LogInformation("received audit trails"); - try - { - await context.Set().AddRangeAsync(notification.Trails!, default); - await context.SaveChangesAsync(default); - } - catch - { - logger.LogError("error while saving audit trail"); - } - return; - } -} diff --git a/src/api/framework/Infrastructure/Identity/Audit/AuditService.cs b/src/api/framework/Infrastructure/Identity/Audit/AuditService.cs deleted file mode 100644 index 823cb79576..0000000000 --- a/src/api/framework/Infrastructure/Identity/Audit/AuditService.cs +++ /dev/null @@ -1,17 +0,0 @@ -using FSH.Framework.Core.Audit; -using FSH.Framework.Infrastructure.Identity.Persistence; -using Microsoft.EntityFrameworkCore; - -namespace FSH.Framework.Infrastructure.Identity.Audit; -public class AuditService(IdentityDbContext context) : IAuditService -{ - public async Task> GetUserTrailsAsync(Guid userId) - { - var trails = await context.AuditTrails - .Where(a => a.UserId == userId) - .OrderByDescending(a => a.DateTime) - .Take(250) - .ToListAsync(); - return trails; - } -} diff --git a/src/api/framework/Infrastructure/Identity/Audit/Endpoints/GetUserAuditTrailEndpoint.cs b/src/api/framework/Infrastructure/Identity/Audit/Endpoints/GetUserAuditTrailEndpoint.cs deleted file mode 100644 index 78ca37942a..0000000000 --- a/src/api/framework/Infrastructure/Identity/Audit/Endpoints/GetUserAuditTrailEndpoint.cs +++ /dev/null @@ -1,22 +0,0 @@ -using FSH.Framework.Core.Audit; -using FSH.Framework.Infrastructure.Auth.Policy; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Identity.Audit.Endpoints; - -public static class GetUserAuditTrailEndpoint -{ - internal static RouteHandlerBuilder MapGetUserAuditTrailEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapGet("/{id:guid}/audit-trails", (Guid id, IAuditService service) => - { - return service.GetUserTrailsAsync(id); - }) - .WithName(nameof(GetUserAuditTrailEndpoint)) - .WithSummary("Get user's audit trail details") - .RequirePermission("Permissions.AuditTrails.View") - .WithDescription("Get user's audit trail details."); - } -} diff --git a/src/api/framework/Infrastructure/Identity/Extensions.cs b/src/api/framework/Infrastructure/Identity/Extensions.cs deleted file mode 100644 index 4d20559295..0000000000 --- a/src/api/framework/Infrastructure/Identity/Extensions.cs +++ /dev/null @@ -1,66 +0,0 @@ -using FSH.Framework.Core.Audit; -using FSH.Framework.Core.Identity.Roles; -using FSH.Framework.Core.Identity.Tokens; -using FSH.Framework.Core.Identity.Users.Abstractions; -using FSH.Framework.Core.Persistence; -using FSH.Framework.Infrastructure.Auth; -using FSH.Framework.Infrastructure.Identity.Audit; -using FSH.Framework.Infrastructure.Identity.Persistence; -using FSH.Framework.Infrastructure.Identity.Roles; -using FSH.Framework.Infrastructure.Identity.Roles.Endpoints; -using FSH.Framework.Infrastructure.Identity.Tokens; -using FSH.Framework.Infrastructure.Identity.Tokens.Endpoints; -using FSH.Framework.Infrastructure.Identity.Users; -using FSH.Framework.Infrastructure.Identity.Users.Endpoints; -using FSH.Framework.Infrastructure.Identity.Users.Services; -using FSH.Framework.Infrastructure.Persistence; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Identity; -using Microsoft.AspNetCore.Routing; -using Microsoft.Extensions.DependencyInjection; -using IdentityConstants = FSH.Starter.Shared.Authorization.IdentityConstants; - -namespace FSH.Framework.Infrastructure.Identity; -internal static class Extensions -{ - internal static IServiceCollection ConfigureIdentity(this IServiceCollection services) - { - ArgumentNullException.ThrowIfNull(services); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(sp => (ICurrentUserInitializer)sp.GetRequiredService()); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.BindDbContext(); - services.AddScoped(); - services.AddIdentity(options => - { - options.Password.RequiredLength = IdentityConstants.PasswordLength; - options.Password.RequireDigit = false; - options.Password.RequireLowercase = false; - options.Password.RequireNonAlphanumeric = false; - options.Password.RequireUppercase = false; - options.User.RequireUniqueEmail = true; - }) - .AddEntityFrameworkStores() - .AddDefaultTokenProviders(); - return services; - } - - public static IEndpointRouteBuilder MapIdentityEndpoints(this IEndpointRouteBuilder app) - { - var users = app.MapGroup("api/users").WithTags("users"); - users.MapUserEndpoints(); - - var tokens = app.MapGroup("api/token").WithTags("token"); - tokens.MapTokenEndpoints(); - - var roles = app.MapGroup("api/roles").WithTags("roles"); - roles.MapRoleEndpoints(); - - return app; - } -} diff --git a/src/api/framework/Infrastructure/Identity/Persistence/IdentityConfiguration.cs b/src/api/framework/Infrastructure/Identity/Persistence/IdentityConfiguration.cs deleted file mode 100644 index 240b63fffc..0000000000 --- a/src/api/framework/Infrastructure/Identity/Persistence/IdentityConfiguration.cs +++ /dev/null @@ -1,86 +0,0 @@ -using Finbuckle.MultiTenant; -using FSH.Framework.Core.Audit; -using FSH.Framework.Infrastructure.Identity.RoleClaims; -using FSH.Framework.Infrastructure.Identity.Roles; -using FSH.Framework.Infrastructure.Identity.Users; -using Microsoft.AspNetCore.Identity; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Metadata.Builders; -using IdentityConstants = FSH.Starter.Shared.Authorization.IdentityConstants; - -namespace FSH.Framework.Infrastructure.Identity.Persistence; - -public class AuditTrailConfig : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder - .ToTable("AuditTrails", IdentityConstants.SchemaName) - .IsMultiTenant(); - - builder.HasKey(a => a.Id); - } -} - -public class ApplicationUserConfig : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder - .ToTable("Users", IdentityConstants.SchemaName) - .IsMultiTenant(); - - builder - .Property(u => u.ObjectId) - .HasMaxLength(256); - } -} - -public class ApplicationRoleConfig : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) => - builder - .ToTable("Roles", IdentityConstants.SchemaName) - .IsMultiTenant() - .AdjustUniqueIndexes(); -} - -public class ApplicationRoleClaimConfig : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) => - builder - .ToTable("RoleClaims", IdentityConstants.SchemaName) - .IsMultiTenant(); -} - -public class IdentityUserRoleConfig : IEntityTypeConfiguration> -{ - public void Configure(EntityTypeBuilder> builder) => - builder - .ToTable("UserRoles", IdentityConstants.SchemaName) - .IsMultiTenant(); -} - -public class IdentityUserClaimConfig : IEntityTypeConfiguration> -{ - public void Configure(EntityTypeBuilder> builder) => - builder - .ToTable("UserClaims", IdentityConstants.SchemaName) - .IsMultiTenant(); -} - -public class IdentityUserLoginConfig : IEntityTypeConfiguration> -{ - public void Configure(EntityTypeBuilder> builder) => - builder - .ToTable("UserLogins", IdentityConstants.SchemaName) - .IsMultiTenant(); -} - -public class IdentityUserTokenConfig : IEntityTypeConfiguration> -{ - public void Configure(EntityTypeBuilder> builder) => - builder - .ToTable("UserTokens", IdentityConstants.SchemaName) - .IsMultiTenant(); -} diff --git a/src/api/framework/Infrastructure/Identity/Persistence/IdentityDbContext.cs b/src/api/framework/Infrastructure/Identity/Persistence/IdentityDbContext.cs deleted file mode 100644 index 5945567c37..0000000000 --- a/src/api/framework/Infrastructure/Identity/Persistence/IdentityDbContext.cs +++ /dev/null @@ -1,47 +0,0 @@ -using Finbuckle.MultiTenant.Abstractions; -using Finbuckle.MultiTenant.EntityFrameworkCore; -using FSH.Framework.Core.Audit; -using FSH.Framework.Core.Persistence; -using FSH.Framework.Infrastructure.Identity.RoleClaims; -using FSH.Framework.Infrastructure.Identity.Roles; -using FSH.Framework.Infrastructure.Identity.Users; -using FSH.Framework.Infrastructure.Persistence; -using FSH.Framework.Infrastructure.Tenant; -using Microsoft.AspNetCore.Identity; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Options; - -namespace FSH.Framework.Infrastructure.Identity.Persistence; -public class IdentityDbContext : MultiTenantIdentityDbContext, - IdentityUserRole, - IdentityUserLogin, - FshRoleClaim, - IdentityUserToken> -{ - private readonly DatabaseOptions _settings; - private new FshTenantInfo TenantInfo { get; set; } - public IdentityDbContext(IMultiTenantContextAccessor multiTenantContextAccessor, DbContextOptions options, IOptions settings) : base(multiTenantContextAccessor, options) - { - _settings = settings.Value; - TenantInfo = multiTenantContextAccessor.MultiTenantContext.TenantInfo!; - } - - public DbSet AuditTrails { get; set; } - - protected override void OnModelCreating(ModelBuilder builder) - { - base.OnModelCreating(builder); - builder.ApplyConfigurationsFromAssembly(typeof(IdentityDbContext).Assembly); - } - - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - if (!string.IsNullOrWhiteSpace(TenantInfo?.ConnectionString)) - { - optionsBuilder.ConfigureDatabase(_settings.Provider, TenantInfo.ConnectionString); - } - } -} diff --git a/src/api/framework/Infrastructure/Identity/Persistence/IdentityDbInitializer.cs b/src/api/framework/Infrastructure/Identity/Persistence/IdentityDbInitializer.cs deleted file mode 100644 index f4759350cf..0000000000 --- a/src/api/framework/Infrastructure/Identity/Persistence/IdentityDbInitializer.cs +++ /dev/null @@ -1,136 +0,0 @@ -using Finbuckle.MultiTenant.Abstractions; -using FSH.Framework.Core.Origin; -using FSH.Framework.Core.Persistence; -using FSH.Framework.Infrastructure.Identity.RoleClaims; -using FSH.Framework.Infrastructure.Identity.Roles; -using FSH.Framework.Infrastructure.Identity.Users; -using FSH.Framework.Infrastructure.Tenant; -using FSH.Starter.Shared.Authorization; -using Microsoft.AspNetCore.Identity; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; -using IdentityConstants = FSH.Starter.Shared.Authorization.IdentityConstants; - -namespace FSH.Framework.Infrastructure.Identity.Persistence; -internal sealed class IdentityDbInitializer( - ILogger logger, - IdentityDbContext context, - RoleManager roleManager, - UserManager userManager, - TimeProvider timeProvider, - IMultiTenantContextAccessor multiTenantContextAccessor, - IOptions originSettings) : IDbInitializer -{ - public async Task MigrateAsync(CancellationToken cancellationToken) - { - if ((await context.Database.GetPendingMigrationsAsync(cancellationToken).ConfigureAwait(false)).Any()) - { - await context.Database.MigrateAsync(cancellationToken).ConfigureAwait(false); - logger.LogInformation("[{Tenant}] applied database migrations for identity module", context.TenantInfo?.Identifier); - } - } - - public async Task SeedAsync(CancellationToken cancellationToken) - { - await SeedRolesAsync(); - await SeedAdminUserAsync(); - } - - private async Task SeedRolesAsync() - { - foreach (string roleName in FshRoles.DefaultRoles) - { - if (await roleManager.Roles.SingleOrDefaultAsync(r => r.Name == roleName) - is not FshRole role) - { - // create role - role = new FshRole(roleName, $"{roleName} Role for {multiTenantContextAccessor.MultiTenantContext.TenantInfo?.Id} Tenant"); - await roleManager.CreateAsync(role); - } - - // Assign permissions - if (roleName == FshRoles.Basic) - { - await AssignPermissionsToRoleAsync(context, FshPermissions.Basic, role); - } - else if (roleName == FshRoles.Admin) - { - await AssignPermissionsToRoleAsync(context, FshPermissions.Admin, role); - - if (multiTenantContextAccessor.MultiTenantContext.TenantInfo?.Id == TenantConstants.Root.Id) - { - await AssignPermissionsToRoleAsync(context, FshPermissions.Root, role); - } - } - } - } - - private async Task AssignPermissionsToRoleAsync(IdentityDbContext dbContext, IReadOnlyList permissions, FshRole role) - { - var currentClaims = await roleManager.GetClaimsAsync(role); - var newClaims = permissions - .Where(permission => !currentClaims.Any(c => c.Type == FshClaims.Permission && c.Value == permission.Name)) - .Select(permission => new FshRoleClaim - { - RoleId = role.Id, - ClaimType = FshClaims.Permission, - ClaimValue = permission.Name, - CreatedBy = "application", - CreatedOn = timeProvider.GetUtcNow() - }) - .ToList(); - - foreach (var claim in newClaims) - { - logger.LogInformation("Seeding {Role} Permission '{Permission}' for '{TenantId}' Tenant.", role.Name, claim.ClaimValue, multiTenantContextAccessor.MultiTenantContext.TenantInfo?.Id); - await dbContext.RoleClaims.AddAsync(claim); - } - - // Save changes to the database context - if (newClaims.Count != 0) - { - await dbContext.SaveChangesAsync(); - } - - } - - private async Task SeedAdminUserAsync() - { - if (string.IsNullOrWhiteSpace(multiTenantContextAccessor.MultiTenantContext.TenantInfo?.Id) || string.IsNullOrWhiteSpace(multiTenantContextAccessor.MultiTenantContext.TenantInfo?.AdminEmail)) - { - return; - } - - if (await userManager.Users.FirstOrDefaultAsync(u => u.Email == multiTenantContextAccessor.MultiTenantContext.TenantInfo!.AdminEmail) - is not FshUser adminUser) - { - string adminUserName = $"{multiTenantContextAccessor.MultiTenantContext.TenantInfo?.Id.Trim()}.{FshRoles.Admin}".ToUpperInvariant(); - adminUser = new FshUser - { - FirstName = multiTenantContextAccessor.MultiTenantContext.TenantInfo?.Id.Trim().ToUpperInvariant(), - LastName = FshRoles.Admin, - Email = multiTenantContextAccessor.MultiTenantContext.TenantInfo?.AdminEmail, - UserName = adminUserName, - EmailConfirmed = true, - PhoneNumberConfirmed = true, - NormalizedEmail = multiTenantContextAccessor.MultiTenantContext.TenantInfo?.AdminEmail!.ToUpperInvariant(), - NormalizedUserName = adminUserName.ToUpperInvariant(), - ImageUrl = new Uri(originSettings.Value.OriginUrl! + TenantConstants.Root.DefaultProfilePicture), - IsActive = true - }; - - logger.LogInformation("Seeding Default Admin User for '{TenantId}' Tenant.", multiTenantContextAccessor.MultiTenantContext.TenantInfo?.Id); - var password = new PasswordHasher(); - adminUser.PasswordHash = password.HashPassword(adminUser, TenantConstants.DefaultPassword); - await userManager.CreateAsync(adminUser); - } - - // Assign role to user - if (!await userManager.IsInRoleAsync(adminUser, FshRoles.Admin)) - { - logger.LogInformation("Assigning Admin Role to Admin User for '{TenantId}' Tenant.", multiTenantContextAccessor.MultiTenantContext.TenantInfo?.Id); - await userManager.AddToRoleAsync(adminUser, FshRoles.Admin); - } - } -} diff --git a/src/api/framework/Infrastructure/Identity/RoleClaims/FshRoleClaim.cs b/src/api/framework/Infrastructure/Identity/RoleClaims/FshRoleClaim.cs deleted file mode 100644 index 210fa1bec6..0000000000 --- a/src/api/framework/Infrastructure/Identity/RoleClaims/FshRoleClaim.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Microsoft.AspNetCore.Identity; - -namespace FSH.Framework.Infrastructure.Identity.RoleClaims; -public class FshRoleClaim : IdentityRoleClaim -{ - public string? CreatedBy { get; init; } - public DateTimeOffset CreatedOn { get; init; } -} diff --git a/src/api/framework/Infrastructure/Identity/Roles/Endpoints/CreateOrUpdateRoleEndpoint.cs b/src/api/framework/Infrastructure/Identity/Roles/Endpoints/CreateOrUpdateRoleEndpoint.cs deleted file mode 100644 index 86234da7ec..0000000000 --- a/src/api/framework/Infrastructure/Identity/Roles/Endpoints/CreateOrUpdateRoleEndpoint.cs +++ /dev/null @@ -1,23 +0,0 @@ -using FSH.Framework.Core.Identity.Roles; -using FSH.Framework.Core.Identity.Roles.Features.CreateOrUpdateRole; -using FSH.Framework.Infrastructure.Auth.Policy; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Identity.Roles.Endpoints; - -public static class CreateOrUpdateRoleEndpoint -{ - public static RouteHandlerBuilder MapCreateOrUpdateRoleEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapPost("/", async (CreateOrUpdateRoleCommand request, IRoleService roleService) => - { - return await roleService.CreateOrUpdateRoleAsync(request); - }) - .WithName(nameof(CreateOrUpdateRoleEndpoint)) - .WithSummary("Create or update a role") - .RequirePermission("Permissions.Roles.Create") - .WithDescription("Create a new role or update an existing role."); - } -} diff --git a/src/api/framework/Infrastructure/Identity/Roles/Endpoints/DeleteRoleEndpoint.cs b/src/api/framework/Infrastructure/Identity/Roles/Endpoints/DeleteRoleEndpoint.cs deleted file mode 100644 index 106ea082bf..0000000000 --- a/src/api/framework/Infrastructure/Identity/Roles/Endpoints/DeleteRoleEndpoint.cs +++ /dev/null @@ -1,23 +0,0 @@ -using FSH.Framework.Core.Identity.Roles; -using FSH.Framework.Infrastructure.Auth.Policy; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Identity.Roles.Endpoints; - -public static class DeleteRoleEndpoint -{ - public static RouteHandlerBuilder MapDeleteRoleEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapDelete("/{id:guid}", async (string id, IRoleService roleService) => - { - await roleService.DeleteRoleAsync(id); - }) - .WithName(nameof(DeleteRoleEndpoint)) - .WithSummary("Delete a role by ID") - .RequirePermission("Permissions.Roles.Delete") - .WithDescription("Remove a role from the system by its ID."); - } -} - diff --git a/src/api/framework/Infrastructure/Identity/Roles/Endpoints/Extensions.cs b/src/api/framework/Infrastructure/Identity/Roles/Endpoints/Extensions.cs deleted file mode 100644 index b899bb362c..0000000000 --- a/src/api/framework/Infrastructure/Identity/Roles/Endpoints/Extensions.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Identity.Roles.Endpoints; - -internal static class Extensions -{ - public static IEndpointRouteBuilder MapRoleEndpoints(this IEndpointRouteBuilder app) - { - app.MapGetRoleEndpoint(); - app.MapGetRolesEndpoint(); - app.MapDeleteRoleEndpoint(); - app.MapCreateOrUpdateRoleEndpoint(); - app.MapGetRolePermissionsEndpoint(); - app.MapUpdateRolePermissionsEndpoint(); - return app; - } -} - diff --git a/src/api/framework/Infrastructure/Identity/Roles/Endpoints/GetRoleEndpoint.cs b/src/api/framework/Infrastructure/Identity/Roles/Endpoints/GetRoleEndpoint.cs deleted file mode 100644 index 6064a33866..0000000000 --- a/src/api/framework/Infrastructure/Identity/Roles/Endpoints/GetRoleEndpoint.cs +++ /dev/null @@ -1,23 +0,0 @@ -using FSH.Framework.Core.Identity.Roles; -using FSH.Framework.Infrastructure.Auth.Policy; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Identity.Roles.Endpoints; - -public static class GetRoleByIdEndpoint -{ - public static RouteHandlerBuilder MapGetRoleEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapGet("/{id:guid}", async (string id, IRoleService roleService) => - { - return await roleService.GetRoleAsync(id); - }) - .WithName(nameof(GetRoleByIdEndpoint)) - .WithSummary("Get role details by ID") - .RequirePermission("Permissions.Roles.View") - .WithDescription("Retrieve the details of a role by its ID."); - } -} - diff --git a/src/api/framework/Infrastructure/Identity/Roles/Endpoints/GetRolePermissionsEndpoint.cs b/src/api/framework/Infrastructure/Identity/Roles/Endpoints/GetRolePermissionsEndpoint.cs deleted file mode 100644 index 42eb894263..0000000000 --- a/src/api/framework/Infrastructure/Identity/Roles/Endpoints/GetRolePermissionsEndpoint.cs +++ /dev/null @@ -1,21 +0,0 @@ -using FSH.Framework.Core.Identity.Roles; -using FSH.Framework.Infrastructure.Auth.Policy; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Identity.Roles.Endpoints; -public static class GetRolePermissionsEndpoint -{ - public static RouteHandlerBuilder MapGetRolePermissionsEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapGet("/{id:guid}/permissions", async (string id, IRoleService roleService, CancellationToken cancellationToken) => - { - return await roleService.GetWithPermissionsAsync(id, cancellationToken); - }) - .WithName(nameof(GetRolePermissionsEndpoint)) - .WithSummary("get role permissions") - .RequirePermission("Permissions.Roles.View") - .WithDescription("get role permissions"); - } -} diff --git a/src/api/framework/Infrastructure/Identity/Roles/Endpoints/GetRolesEndpoint.cs b/src/api/framework/Infrastructure/Identity/Roles/Endpoints/GetRolesEndpoint.cs deleted file mode 100644 index df3b91cff8..0000000000 --- a/src/api/framework/Infrastructure/Identity/Roles/Endpoints/GetRolesEndpoint.cs +++ /dev/null @@ -1,21 +0,0 @@ -using FSH.Framework.Core.Identity.Roles; -using FSH.Framework.Infrastructure.Auth.Policy; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Identity.Roles.Endpoints; -public static class GetRolesEndpoint -{ - public static RouteHandlerBuilder MapGetRolesEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapGet("/", async (IRoleService roleService) => - { - return await roleService.GetRolesAsync(); - }) - .WithName(nameof(GetRolesEndpoint)) - .WithSummary("Get a list of all roles") - .RequirePermission("Permissions.Roles.View") - .WithDescription("Retrieve a list of all roles available in the system."); - } -} diff --git a/src/api/framework/Infrastructure/Identity/Roles/Endpoints/UpdateRolePermissionsEndpoint.cs b/src/api/framework/Infrastructure/Identity/Roles/Endpoints/UpdateRolePermissionsEndpoint.cs deleted file mode 100644 index 71cb44c611..0000000000 --- a/src/api/framework/Infrastructure/Identity/Roles/Endpoints/UpdateRolePermissionsEndpoint.cs +++ /dev/null @@ -1,30 +0,0 @@ -using FluentValidation; -using FSH.Framework.Core.Identity.Roles; -using FSH.Framework.Core.Identity.Roles.Features.UpdatePermissions; -using FSH.Framework.Infrastructure.Auth.Policy; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Identity.Roles.Endpoints; -public static class UpdateRolePermissionsEndpoint -{ - public static RouteHandlerBuilder MapUpdateRolePermissionsEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapPut("/{id}/permissions", async ( - UpdatePermissionsCommand request, - IRoleService roleService, - string id, - [FromServices] IValidator validator) => - { - if (id != request.RoleId) return Results.BadRequest(); - var response = await roleService.UpdatePermissionsAsync(request); - return Results.Ok(response); - }) - .WithName(nameof(UpdateRolePermissionsEndpoint)) - .WithSummary("update role permissions") - .RequirePermission("Permissions.Roles.Create") - .WithDescription("update role permissions"); - } -} diff --git a/src/api/framework/Infrastructure/Identity/Roles/FshRole.cs b/src/api/framework/Infrastructure/Identity/Roles/FshRole.cs deleted file mode 100644 index fa8baf6bc6..0000000000 --- a/src/api/framework/Infrastructure/Identity/Roles/FshRole.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Microsoft.AspNetCore.Identity; - -namespace FSH.Framework.Infrastructure.Identity.Roles; -public class FshRole : IdentityRole -{ - public string? Description { get; set; } - - public FshRole(string name, string? description = null) - : base(name) - { - Description = description; - NormalizedName = name.ToUpperInvariant(); - } -} diff --git a/src/api/framework/Infrastructure/Identity/Roles/RoleService.cs b/src/api/framework/Infrastructure/Identity/Roles/RoleService.cs deleted file mode 100644 index 6930ab0e16..0000000000 --- a/src/api/framework/Infrastructure/Identity/Roles/RoleService.cs +++ /dev/null @@ -1,126 +0,0 @@ -using Finbuckle.MultiTenant.Abstractions; -using FSH.Framework.Core.Exceptions; -using FSH.Framework.Core.Identity.Roles; -using FSH.Framework.Core.Identity.Roles.Features.CreateOrUpdateRole; -using FSH.Framework.Core.Identity.Roles.Features.UpdatePermissions; -using FSH.Framework.Core.Identity.Users.Abstractions; -using FSH.Framework.Infrastructure.Identity.Persistence; -using FSH.Framework.Infrastructure.Identity.RoleClaims; -using FSH.Framework.Infrastructure.Tenant; -using FSH.Starter.Shared.Authorization; -using Microsoft.AspNetCore.Identity; -using Microsoft.EntityFrameworkCore; - -namespace FSH.Framework.Infrastructure.Identity.Roles; - -public class RoleService(RoleManager roleManager, - IdentityDbContext context, - IMultiTenantContextAccessor multiTenantContextAccessor, - ICurrentUser currentUser) : IRoleService -{ - private readonly RoleManager _roleManager = roleManager; - - public async Task> GetRolesAsync() - { - return await Task.Run(() => _roleManager.Roles - .Select(role => new RoleDto { Id = role.Id, Name = role.Name!, Description = role.Description }) - .ToList()); - } - - public async Task GetRoleAsync(string id) - { - FshRole? role = await _roleManager.FindByIdAsync(id); - - _ = role ?? throw new NotFoundException("role not found"); - - return new RoleDto { Id = role.Id, Name = role.Name!, Description = role.Description }; - } - - public async Task CreateOrUpdateRoleAsync(CreateOrUpdateRoleCommand command) - { - FshRole? role = await _roleManager.FindByIdAsync(command.Id); - - if (role != null) - { - role.Name = command.Name; - role.Description = command.Description; - await _roleManager.UpdateAsync(role); - } - else - { - role = new FshRole(command.Name, command.Description); - await _roleManager.CreateAsync(role); - } - - return new RoleDto { Id = role.Id, Name = role.Name!, Description = role.Description }; - } - - public async Task DeleteRoleAsync(string id) - { - FshRole? role = await _roleManager.FindByIdAsync(id); - - _ = role ?? throw new NotFoundException("role not found"); - - await _roleManager.DeleteAsync(role); - } - - public async Task GetWithPermissionsAsync(string id, CancellationToken cancellationToken) - { - var role = await GetRoleAsync(id); - _ = role ?? throw new NotFoundException("role not found"); - - role.Permissions = await context.RoleClaims - .Where(c => c.RoleId == id && c.ClaimType == FshClaims.Permission) - .Select(c => c.ClaimValue!) - .ToListAsync(cancellationToken); - - return role; - } - - public async Task UpdatePermissionsAsync(UpdatePermissionsCommand request) - { - var role = await _roleManager.FindByIdAsync(request.RoleId); - _ = role ?? throw new NotFoundException("role not found"); - if (role.Name == FshRoles.Admin) - { - throw new FshException("operation not permitted"); - } - - if (multiTenantContextAccessor?.MultiTenantContext?.TenantInfo?.Id != TenantConstants.Root.Id) - { - // Remove Root Permissions if the Role is not created for Root Tenant. - request.Permissions.RemoveAll(u => u.StartsWith("Permissions.Root.", StringComparison.InvariantCultureIgnoreCase)); - } - - var currentClaims = await _roleManager.GetClaimsAsync(role); - - // Remove permissions that were previously selected - foreach (var claim in currentClaims.Where(c => !request.Permissions.Exists(p => p == c.Value))) - { - var result = await _roleManager.RemoveClaimAsync(role, claim); - if (!result.Succeeded) - { - var errors = result.Errors.Select(error => error.Description).ToList(); - throw new FshException("operation failed", errors); - } - } - - // Add all permissions that were not previously selected - foreach (string permission in request.Permissions.Where(c => !currentClaims.Any(p => p.Value == c))) - { - if (!string.IsNullOrEmpty(permission)) - { - context.RoleClaims.Add(new FshRoleClaim - { - RoleId = role.Id, - ClaimType = FshClaims.Permission, - ClaimValue = permission, - CreatedBy = currentUser.GetUserId().ToString() - }); - await context.SaveChangesAsync(); - } - } - - return "permissions updated"; - } -} diff --git a/src/api/framework/Infrastructure/Identity/Tokens/Endpoints/Extensions.cs b/src/api/framework/Infrastructure/Identity/Tokens/Endpoints/Extensions.cs deleted file mode 100644 index 3bd70a42c4..0000000000 --- a/src/api/framework/Infrastructure/Identity/Tokens/Endpoints/Extensions.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Identity.Tokens.Endpoints; -internal static class Extensions -{ - public static IEndpointRouteBuilder MapTokenEndpoints(this IEndpointRouteBuilder app) - { - app.MapRefreshTokenEndpoint(); - app.MapTokenGenerationEndpoint(); - return app; - } - - public static string GetIpAddress(this HttpContext context) - { - string ip = "N/A"; - if (context.Request.Headers.TryGetValue("X-Forwarded-For", out var ipList)) - { - ip = ipList.FirstOrDefault() ?? "N/A"; - } - else if (context.Connection.RemoteIpAddress != null) - { - ip = context.Connection.RemoteIpAddress.MapToIPv4().ToString(); - } - return ip; - - } -} diff --git a/src/api/framework/Infrastructure/Identity/Tokens/Endpoints/RefreshTokenEndpoint.cs b/src/api/framework/Infrastructure/Identity/Tokens/Endpoints/RefreshTokenEndpoint.cs deleted file mode 100644 index a8f27128ba..0000000000 --- a/src/api/framework/Infrastructure/Identity/Tokens/Endpoints/RefreshTokenEndpoint.cs +++ /dev/null @@ -1,28 +0,0 @@ -using FSH.Framework.Core.Identity.Tokens; -using FSH.Framework.Core.Identity.Tokens.Features.Refresh; -using FSH.Starter.Shared.Authorization; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Identity.Tokens.Endpoints; -public static class RefreshTokenEndpoint -{ - internal static RouteHandlerBuilder MapRefreshTokenEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapPost("/refresh", (RefreshTokenCommand request, - [FromHeader(Name = TenantConstants.Identifier)] string tenant, - ITokenService service, - HttpContext context, - CancellationToken cancellationToken) => - { - string ip = context.GetIpAddress(); - return service.RefreshTokenAsync(request, ip!, cancellationToken); - }) - .WithName(nameof(RefreshTokenEndpoint)) - .WithSummary("refresh JWTs") - .WithDescription("refresh JWTs") - .AllowAnonymous(); - } -} diff --git a/src/api/framework/Infrastructure/Identity/Tokens/Endpoints/TokenGenerationEndpoint.cs b/src/api/framework/Infrastructure/Identity/Tokens/Endpoints/TokenGenerationEndpoint.cs deleted file mode 100644 index e0bbc4796e..0000000000 --- a/src/api/framework/Infrastructure/Identity/Tokens/Endpoints/TokenGenerationEndpoint.cs +++ /dev/null @@ -1,28 +0,0 @@ -using FSH.Framework.Core.Identity.Tokens; -using FSH.Framework.Core.Identity.Tokens.Features.Generate; -using FSH.Starter.Shared.Authorization; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Identity.Tokens.Endpoints; -public static class TokenGenerationEndpoint -{ - internal static RouteHandlerBuilder MapTokenGenerationEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapPost("/", (TokenGenerationCommand request, - [FromHeader(Name = TenantConstants.Identifier)] string tenant, - ITokenService service, - HttpContext context, - CancellationToken cancellationToken) => - { - string ip = context.GetIpAddress(); - return service.GenerateTokenAsync(request, ip!, cancellationToken); - }) - .WithName(nameof(TokenGenerationEndpoint)) - .WithSummary("generate JWTs") - .WithDescription("generate JWTs") - .AllowAnonymous(); - } -} diff --git a/src/api/framework/Infrastructure/Identity/Tokens/TokenService.cs b/src/api/framework/Infrastructure/Identity/Tokens/TokenService.cs deleted file mode 100644 index 4f0bc60145..0000000000 --- a/src/api/framework/Infrastructure/Identity/Tokens/TokenService.cs +++ /dev/null @@ -1,188 +0,0 @@ -using System.IdentityModel.Tokens.Jwt; -using System.Security.Claims; -using System.Security.Cryptography; -using System.Text; -using Finbuckle.MultiTenant.Abstractions; -using FSH.Framework.Core.Auth.Jwt; -using FSH.Framework.Core.Exceptions; -using FSH.Framework.Core.Identity.Tokens; -using FSH.Framework.Core.Identity.Tokens.Features.Generate; -using FSH.Framework.Core.Identity.Tokens.Features.Refresh; -using FSH.Framework.Core.Identity.Tokens.Models; -using FSH.Framework.Infrastructure.Auth.Jwt; -using FSH.Framework.Infrastructure.Identity.Audit; -using FSH.Framework.Infrastructure.Identity.Users; -using FSH.Framework.Infrastructure.Tenant; -using FSH.Starter.Shared.Authorization; -using MediatR; -using Microsoft.AspNetCore.Identity; -using Microsoft.Extensions.Options; -using Microsoft.IdentityModel.Tokens; - -namespace FSH.Framework.Infrastructure.Identity.Tokens; -public sealed class TokenService : ITokenService -{ - private readonly UserManager _userManager; - private readonly IMultiTenantContextAccessor? _multiTenantContextAccessor; - private readonly JwtOptions _jwtOptions; - private readonly IPublisher _publisher; - public TokenService(IOptions jwtOptions, UserManager userManager, IMultiTenantContextAccessor? multiTenantContextAccessor, IPublisher publisher) - { - _jwtOptions = jwtOptions.Value; - _userManager = userManager ?? throw new ArgumentNullException(nameof(userManager)); - _multiTenantContextAccessor = multiTenantContextAccessor; - _publisher = publisher; - } - - public async Task GenerateTokenAsync(TokenGenerationCommand request, string ipAddress, CancellationToken cancellationToken) - { - var currentTenant = _multiTenantContextAccessor!.MultiTenantContext.TenantInfo; - if (currentTenant == null) throw new UnauthorizedException(); - if (string.IsNullOrWhiteSpace(currentTenant.Id) - || await _userManager.FindByEmailAsync(request.Email.Trim().Normalize()) is not { } user - || !await _userManager.CheckPasswordAsync(user, request.Password)) - { - throw new UnauthorizedException(); - } - - if (!user.IsActive) - { - throw new UnauthorizedException("user is deactivated"); - } - - if (!user.EmailConfirmed) - { - throw new UnauthorizedException("email not confirmed"); - } - - if (currentTenant.Id != TenantConstants.Root.Id) - { - if (!currentTenant.IsActive) - { - throw new UnauthorizedException($"tenant {currentTenant.Id} is deactivated"); - } - - if (DateTime.UtcNow > currentTenant.ValidUpto) - { - throw new UnauthorizedException($"tenant {currentTenant.Id} validity has expired"); - } - } - - return await GenerateTokensAndUpdateUser(user, ipAddress); - } - - - public async Task RefreshTokenAsync(RefreshTokenCommand request, string ipAddress, CancellationToken cancellationToken) - { - var userPrincipal = GetPrincipalFromExpiredToken(request.Token); - var userId = _userManager.GetUserId(userPrincipal)!; - var user = await _userManager.FindByIdAsync(userId); - if (user is null) - { - throw new UnauthorizedException(); - } - - if (user.RefreshToken != request.RefreshToken || user.RefreshTokenExpiryTime <= DateTime.UtcNow) - { - throw new UnauthorizedException("Invalid Refresh Token"); - } - - return await GenerateTokensAndUpdateUser(user, ipAddress); - } - private async Task GenerateTokensAndUpdateUser(FshUser user, string ipAddress) - { - string token = GenerateJwt(user, ipAddress); - - user.RefreshToken = GenerateRefreshToken(); - user.RefreshTokenExpiryTime = DateTime.UtcNow.AddDays(_jwtOptions.RefreshTokenExpirationInDays); - - await _userManager.UpdateAsync(user); - - await _publisher.Publish(new AuditPublishedEvent(new() - { - new() - { - Id = Guid.NewGuid(), - Operation = "Token Generated", - Entity = "Identity", - UserId = new Guid(user.Id), - DateTime = DateTime.UtcNow, - } - })); - - return new TokenResponse(token, user.RefreshToken, user.RefreshTokenExpiryTime); - } - - private string GenerateJwt(FshUser user, string ipAddress) => - GenerateEncryptedToken(GetSigningCredentials(), GetClaims(user, ipAddress)); - - private SigningCredentials GetSigningCredentials() - { - byte[] secret = Encoding.UTF8.GetBytes(_jwtOptions.Key); - return new SigningCredentials(new SymmetricSecurityKey(secret), SecurityAlgorithms.HmacSha256); - } - - private string GenerateEncryptedToken(SigningCredentials signingCredentials, IEnumerable claims) - { - var token = new JwtSecurityToken( - claims: claims, - expires: DateTime.UtcNow.AddMinutes(_jwtOptions.TokenExpirationInMinutes), - signingCredentials: signingCredentials, - issuer: JwtAuthConstants.Issuer, - audience: JwtAuthConstants.Audience - ); - var tokenHandler = new JwtSecurityTokenHandler(); - return tokenHandler.WriteToken(token); - } - - private List GetClaims(FshUser user, string ipAddress) => - new List - { - new(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), - new(ClaimTypes.NameIdentifier, user.Id), - new(ClaimTypes.Email, user.Email!), - new(ClaimTypes.Name, user.FirstName ?? string.Empty), - new(ClaimTypes.MobilePhone, user.PhoneNumber ?? string.Empty), - new(FshClaims.Fullname, $"{user.FirstName} {user.LastName}"), - new(ClaimTypes.Surname, user.LastName ?? string.Empty), - new(FshClaims.IpAddress, ipAddress), - new(FshClaims.Tenant, _multiTenantContextAccessor!.MultiTenantContext.TenantInfo!.Id), - new(FshClaims.ImageUrl, user.ImageUrl == null ? string.Empty : user.ImageUrl.ToString()) - }; - private static string GenerateRefreshToken() - { - byte[] randomNumber = new byte[32]; - using var rng = RandomNumberGenerator.Create(); - rng.GetBytes(randomNumber); - return Convert.ToBase64String(randomNumber); - } - - private ClaimsPrincipal GetPrincipalFromExpiredToken(string token) - { -#pragma warning disable CA5404 // Do not disable token validation checks - var tokenValidationParameters = new TokenValidationParameters - { - ValidateIssuerSigningKey = true, - IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtOptions.Key)), - ValidateIssuer = true, - ValidateAudience = true, - ValidAudience = JwtAuthConstants.Audience, - ValidIssuer = JwtAuthConstants.Issuer, - RoleClaimType = ClaimTypes.Role, - ClockSkew = TimeSpan.Zero, - ValidateLifetime = false - }; -#pragma warning restore CA5404 // Do not disable token validation checks - var tokenHandler = new JwtSecurityTokenHandler(); - var principal = tokenHandler.ValidateToken(token, tokenValidationParameters, out var securityToken); - if (securityToken is not JwtSecurityToken jwtSecurityToken || - !jwtSecurityToken.Header.Alg.Equals( - SecurityAlgorithms.HmacSha256, - StringComparison.OrdinalIgnoreCase)) - { - throw new UnauthorizedException("invalid token"); - } - - return principal; - } -} diff --git a/src/api/framework/Infrastructure/Identity/Users/Endpoints/AssignRolesToUserEndpoint.cs b/src/api/framework/Infrastructure/Identity/Users/Endpoints/AssignRolesToUserEndpoint.cs deleted file mode 100644 index 161fe18e8f..0000000000 --- a/src/api/framework/Infrastructure/Identity/Users/Endpoints/AssignRolesToUserEndpoint.cs +++ /dev/null @@ -1,28 +0,0 @@ -using FluentValidation; -using FSH.Framework.Core.Identity.Users.Abstractions; -using FSH.Framework.Core.Identity.Users.Features.AssignUserRole; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Identity.Users.Endpoints; -public static class AssignRolesToUserEndpoint -{ - internal static RouteHandlerBuilder MapAssignRolesToUserEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapPost("/{id:guid}/roles", async (AssignUserRoleCommand command, - HttpContext context, - string id, - IUserService userService, - CancellationToken cancellationToken) => - { - - var message = await userService.AssignRolesAsync(id, command, cancellationToken); - return Results.Ok(message); - }) - .WithName(nameof(AssignRolesToUserEndpoint)) - .WithSummary("assign roles") - .WithDescription("assign roles"); - } - -} diff --git a/src/api/framework/Infrastructure/Identity/Users/Endpoints/ChangePasswordEndpoint.cs b/src/api/framework/Infrastructure/Identity/Users/Endpoints/ChangePasswordEndpoint.cs deleted file mode 100644 index 7164ac5668..0000000000 --- a/src/api/framework/Infrastructure/Identity/Users/Endpoints/ChangePasswordEndpoint.cs +++ /dev/null @@ -1,43 +0,0 @@ -using FluentValidation; -using FluentValidation.Results; -using FSH.Framework.Core.Identity.Users.Abstractions; -using FSH.Framework.Core.Identity.Users.Features.ChangePassword; -using FSH.Framework.Core.Origin; -using FSH.Starter.Shared.Authorization; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; -using Microsoft.Extensions.Options; - -namespace FSH.Framework.Infrastructure.Identity.Users.Endpoints; -public static class ChangePasswordEndpoint -{ - internal static RouteHandlerBuilder MapChangePasswordEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapPost("/change-password", async (ChangePasswordCommand command, - HttpContext context, - IOptions settings, - IValidator validator, - IUserService userService, - CancellationToken cancellationToken) => - { - ValidationResult result = await validator.ValidateAsync(command, cancellationToken); - if (!result.IsValid) - { - return Results.ValidationProblem(result.ToDictionary()); - } - - if (context.User.GetUserId() is not { } userId || string.IsNullOrEmpty(userId)) - { - return Results.BadRequest(); - } - - await userService.ChangePasswordAsync(command, userId); - return Results.Ok("password reset email sent"); - }) - .WithName(nameof(ChangePasswordEndpoint)) - .WithSummary("Changes password") - .WithDescription("Change password"); - } - -} diff --git a/src/api/framework/Infrastructure/Identity/Users/Endpoints/ConfirmEmailEndpoint.cs b/src/api/framework/Infrastructure/Identity/Users/Endpoints/ConfirmEmailEndpoint.cs deleted file mode 100644 index c0800e3321..0000000000 --- a/src/api/framework/Infrastructure/Identity/Users/Endpoints/ConfirmEmailEndpoint.cs +++ /dev/null @@ -1,20 +0,0 @@ -using FSH.Framework.Core.Identity.Users.Abstractions; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Identity.Users.Endpoints; -public static class ConfirmEmailEndpoint -{ - internal static RouteHandlerBuilder MapConfirmEmailEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapGet("/confirm-email", (string userId, string code, string tenant, IUserService service) => - { - return service.ConfirmEmailAsync(userId, code, tenant, default); - }) - .WithName(nameof(ConfirmEmailEndpoint)) - .WithSummary("confirm user email") - .WithDescription("confirm user email") - .AllowAnonymous(); - } -} diff --git a/src/api/framework/Infrastructure/Identity/Users/Endpoints/DeleteUserEndpoint.cs b/src/api/framework/Infrastructure/Identity/Users/Endpoints/DeleteUserEndpoint.cs deleted file mode 100644 index 6969b4e124..0000000000 --- a/src/api/framework/Infrastructure/Identity/Users/Endpoints/DeleteUserEndpoint.cs +++ /dev/null @@ -1,21 +0,0 @@ -using FSH.Framework.Core.Identity.Users.Abstractions; -using FSH.Framework.Infrastructure.Auth.Policy; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Identity.Users.Endpoints; -public static class DeleteUserEndpoint -{ - internal static RouteHandlerBuilder MapDeleteUserEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapDelete("/{id:guid}", (string id, IUserService service) => - { - return service.DeleteAsync(id); - }) - .WithName(nameof(DeleteUserEndpoint)) - .WithSummary("delete user profile") - .RequirePermission("Permissions.Users.Delete") - .WithDescription("delete user profile"); - } -} diff --git a/src/api/framework/Infrastructure/Identity/Users/Endpoints/Extensions.cs b/src/api/framework/Infrastructure/Identity/Users/Endpoints/Extensions.cs deleted file mode 100644 index cbc311c6be..0000000000 --- a/src/api/framework/Infrastructure/Identity/Users/Endpoints/Extensions.cs +++ /dev/null @@ -1,27 +0,0 @@ -using FSH.Framework.Infrastructure.Identity.Audit.Endpoints; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Identity.Users.Endpoints; -internal static class Extensions -{ - public static IEndpointRouteBuilder MapUserEndpoints(this IEndpointRouteBuilder app) - { - app.MapRegisterUserEndpoint(); - app.MapSelfRegisterUserEndpoint(); - app.MapUpdateUserEndpoint(); - app.MapGetUsersListEndpoint(); - app.MapDeleteUserEndpoint(); - app.MapForgotPasswordEndpoint(); - app.MapChangePasswordEndpoint(); - app.MapResetPasswordEndpoint(); - app.MapGetMeEndpoint(); - app.MapGetUserEndpoint(); - app.MapGetCurrentUserPermissionsEndpoint(); - app.ToggleUserStatusEndpointEndpoint(); - app.MapAssignRolesToUserEndpoint(); - app.MapGetUserRolesEndpoint(); - app.MapGetUserAuditTrailEndpoint(); - app.MapConfirmEmailEndpoint(); - return app; - } -} diff --git a/src/api/framework/Infrastructure/Identity/Users/Endpoints/ForgotPasswordEndpoint.cs b/src/api/framework/Infrastructure/Identity/Users/Endpoints/ForgotPasswordEndpoint.cs deleted file mode 100644 index 9483571e7a..0000000000 --- a/src/api/framework/Infrastructure/Identity/Users/Endpoints/ForgotPasswordEndpoint.cs +++ /dev/null @@ -1,45 +0,0 @@ -using FluentValidation; -using FluentValidation.Results; -using FSH.Framework.Core.Identity.Users.Abstractions; -using FSH.Framework.Core.Identity.Users.Features.ForgotPassword; -using FSH.Framework.Core.Origin; -using FSH.Starter.Shared.Authorization; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Routing; -using Microsoft.Extensions.Options; - -namespace FSH.Framework.Infrastructure.Identity.Users.Endpoints; - -public static class ForgotPasswordEndpoint -{ - internal static RouteHandlerBuilder MapForgotPasswordEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapPost("/forgot-password", async (HttpRequest request, [FromHeader(Name = TenantConstants.Identifier)] string tenant, ForgotPasswordCommand command, IOptions settings, IValidator validator, IUserService userService, CancellationToken cancellationToken) => - { - ValidationResult result = await validator.ValidateAsync(command, cancellationToken); - if (!result.IsValid) - { - return Results.ValidationProblem(result.ToDictionary()); - } - - // Obtain origin from appsettings - var origin = settings.Value; - - if (origin?.OriginUrl == null) - { - // Handle the case where OriginUrl is null - return Results.BadRequest("Origin URL is not configured."); - } - - await userService.ForgotPasswordAsync(command, origin.OriginUrl.ToString(), cancellationToken); - return Results.Ok("Password reset email sent."); - }) - .WithName(nameof(ForgotPasswordEndpoint)) - .WithSummary("Forgot password") - .WithDescription("Generates a password reset token and sends it via email.") - .AllowAnonymous(); - } - -} diff --git a/src/api/framework/Infrastructure/Identity/Users/Endpoints/GetUserEndpoint.cs b/src/api/framework/Infrastructure/Identity/Users/Endpoints/GetUserEndpoint.cs deleted file mode 100644 index c23a8f5f40..0000000000 --- a/src/api/framework/Infrastructure/Identity/Users/Endpoints/GetUserEndpoint.cs +++ /dev/null @@ -1,21 +0,0 @@ -using FSH.Framework.Core.Identity.Users.Abstractions; -using FSH.Framework.Infrastructure.Auth.Policy; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Identity.Users.Endpoints; -public static class GetUserEndpoint -{ - internal static RouteHandlerBuilder MapGetUserEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapGet("/{id:guid}", (string id, IUserService service) => - { - return service.GetAsync(id, CancellationToken.None); - }) - .WithName(nameof(GetUserEndpoint)) - .WithSummary("Get user profile by ID") - .RequirePermission("Permissions.Users.View") - .WithDescription("Get another user's profile details by user ID."); - } -} diff --git a/src/api/framework/Infrastructure/Identity/Users/Endpoints/GetUserPermissionsEndpoint.cs b/src/api/framework/Infrastructure/Identity/Users/Endpoints/GetUserPermissionsEndpoint.cs deleted file mode 100644 index 6ee0f74eee..0000000000 --- a/src/api/framework/Infrastructure/Identity/Users/Endpoints/GetUserPermissionsEndpoint.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Security.Claims; -using FSH.Framework.Core.Exceptions; -using FSH.Framework.Core.Identity.Users.Abstractions; -using FSH.Starter.Shared.Authorization; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Identity.Users.Endpoints; -public static class GetUserPermissionsEndpoint -{ - internal static RouteHandlerBuilder MapGetCurrentUserPermissionsEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapGet("/permissions", async (ClaimsPrincipal user, IUserService service, CancellationToken cancellationToken) => - { - if (user.GetUserId() is not { } userId || string.IsNullOrEmpty(userId)) - { - throw new UnauthorizedException(); - } - - return await service.GetPermissionsAsync(userId, cancellationToken); - }) - .WithName("GetUserPermissions") - .WithSummary("Get current user permissions") - .WithDescription("Get current user permissions"); - } -} diff --git a/src/api/framework/Infrastructure/Identity/Users/Endpoints/GetUserProfileEndpoint.cs b/src/api/framework/Infrastructure/Identity/Users/Endpoints/GetUserProfileEndpoint.cs deleted file mode 100644 index 9f3ea36ab4..0000000000 --- a/src/api/framework/Infrastructure/Identity/Users/Endpoints/GetUserProfileEndpoint.cs +++ /dev/null @@ -1,27 +0,0 @@ -using FSH.Framework.Core.Exceptions; -using System.Security.Claims; -using FSH.Framework.Core.Identity.Users.Abstractions; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; -using FSH.Starter.Shared.Authorization; - -namespace FSH.Framework.Infrastructure.Identity.Users.Endpoints; -public static class GetUserProfileEndpoint -{ - internal static RouteHandlerBuilder MapGetMeEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapGet("/profile", async (ClaimsPrincipal user, IUserService service, CancellationToken cancellationToken) => - { - if (user.GetUserId() is not { } userId || string.IsNullOrEmpty(userId)) - { - throw new UnauthorizedException(); - } - - return await service.GetAsync(userId, cancellationToken); - }) - .WithName("GetMeEndpoint") - .WithSummary("Get current user information based on token") - .WithDescription("Get current user information based on token"); - } -} diff --git a/src/api/framework/Infrastructure/Identity/Users/Endpoints/GetUserRolesEndpoint.cs b/src/api/framework/Infrastructure/Identity/Users/Endpoints/GetUserRolesEndpoint.cs deleted file mode 100644 index 757f842926..0000000000 --- a/src/api/framework/Infrastructure/Identity/Users/Endpoints/GetUserRolesEndpoint.cs +++ /dev/null @@ -1,21 +0,0 @@ -using FSH.Framework.Core.Identity.Users.Abstractions; -using FSH.Framework.Infrastructure.Auth.Policy; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Identity.Users.Endpoints; -public static class GetUserRolesEndpoint -{ - internal static RouteHandlerBuilder MapGetUserRolesEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapGet("/{id:guid}/roles", (string id, IUserService service) => - { - return service.GetUserRolesAsync(id, CancellationToken.None); - }) - .WithName(nameof(GetUserRolesEndpoint)) - .WithSummary("get user roles") - .RequirePermission("Permissions.Users.View") - .WithDescription("get user roles"); - } -} diff --git a/src/api/framework/Infrastructure/Identity/Users/Endpoints/GetUsersListEndpoint.cs b/src/api/framework/Infrastructure/Identity/Users/Endpoints/GetUsersListEndpoint.cs deleted file mode 100644 index 0743634ca8..0000000000 --- a/src/api/framework/Infrastructure/Identity/Users/Endpoints/GetUsersListEndpoint.cs +++ /dev/null @@ -1,21 +0,0 @@ -using FSH.Framework.Core.Identity.Users.Abstractions; -using FSH.Framework.Infrastructure.Auth.Policy; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Identity.Users.Endpoints; -public static class GetUsersListEndpoint -{ - internal static RouteHandlerBuilder MapGetUsersListEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapGet("/", (CancellationToken cancellationToken, IUserService service) => - { - return service.GetListAsync(cancellationToken); - }) - .WithName(nameof(GetUsersListEndpoint)) - .WithSummary("get users list") - .RequirePermission("Permissions.Users.View") - .WithDescription("get users list"); - } -} diff --git a/src/api/framework/Infrastructure/Identity/Users/Endpoints/RegisterUserEndpoint.cs b/src/api/framework/Infrastructure/Identity/Users/Endpoints/RegisterUserEndpoint.cs deleted file mode 100644 index 84b98a911f..0000000000 --- a/src/api/framework/Infrastructure/Identity/Users/Endpoints/RegisterUserEndpoint.cs +++ /dev/null @@ -1,26 +0,0 @@ -using FSH.Framework.Core.Identity.Users.Abstractions; -using FSH.Framework.Core.Identity.Users.Features.RegisterUser; -using FSH.Framework.Infrastructure.Auth.Policy; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Identity.Users.Endpoints; -public static class RegisterUserEndpoint -{ - internal static RouteHandlerBuilder MapRegisterUserEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapPost("/register", (RegisterUserCommand request, - IUserService service, - HttpContext context, - CancellationToken cancellationToken) => - { - var origin = $"{context.Request.Scheme}://{context.Request.Host.Value}{context.Request.PathBase.Value}"; - return service.RegisterAsync(request, origin, cancellationToken); - }) - .WithName(nameof(RegisterUserEndpoint)) - .WithSummary("register user") - .RequirePermission("Permissions.Users.Create") - .WithDescription("register user"); - } -} diff --git a/src/api/framework/Infrastructure/Identity/Users/Endpoints/ResetPasswordEndpoint.cs b/src/api/framework/Infrastructure/Identity/Users/Endpoints/ResetPasswordEndpoint.cs deleted file mode 100644 index a1f7187208..0000000000 --- a/src/api/framework/Infrastructure/Identity/Users/Endpoints/ResetPasswordEndpoint.cs +++ /dev/null @@ -1,34 +0,0 @@ -using FluentValidation; -using FluentValidation.Results; -using FSH.Framework.Core.Identity.Users.Abstractions; -using FSH.Framework.Core.Identity.Users.Features.ResetPassword; -using FSH.Starter.Shared.Authorization; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Identity.Users.Endpoints; - -public static class ResetPasswordEndpoint -{ - internal static RouteHandlerBuilder MapResetPasswordEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapPost("/reset-password", async (ResetPasswordCommand command, [FromHeader(Name = TenantConstants.Identifier)] string tenant, IValidator validator, IUserService userService, CancellationToken cancellationToken) => - { - ValidationResult result = await validator.ValidateAsync(command, cancellationToken); - if (!result.IsValid) - { - return Results.ValidationProblem(result.ToDictionary()); - } - - await userService.ResetPasswordAsync(command, cancellationToken); - return Results.Ok("Password has been reset."); - }) - .WithName(nameof(ResetPasswordEndpoint)) - .WithSummary("Reset password") - .WithDescription("Resets the password using the token and new password provided.") - .AllowAnonymous(); - } - -} diff --git a/src/api/framework/Infrastructure/Identity/Users/Endpoints/SelfRegisterUserEndpoint.cs b/src/api/framework/Infrastructure/Identity/Users/Endpoints/SelfRegisterUserEndpoint.cs deleted file mode 100644 index 8af1fc52f0..0000000000 --- a/src/api/framework/Infrastructure/Identity/Users/Endpoints/SelfRegisterUserEndpoint.cs +++ /dev/null @@ -1,30 +0,0 @@ -using FSH.Framework.Core.Identity.Users.Abstractions; -using FSH.Framework.Core.Identity.Users.Features.RegisterUser; -using FSH.Framework.Infrastructure.Auth.Policy; -using FSH.Starter.Shared.Authorization; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Identity.Users.Endpoints; -public static class SelfRegisterUserEndpoint -{ - internal static RouteHandlerBuilder MapSelfRegisterUserEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapPost("/self-register", (RegisterUserCommand request, - [FromHeader(Name = TenantConstants.Identifier)] string tenant, - IUserService service, - HttpContext context, - CancellationToken cancellationToken) => - { - var origin = $"{context.Request.Scheme}://{context.Request.Host.Value}{context.Request.PathBase.Value}"; - return service.RegisterAsync(request, origin, cancellationToken); - }) - .WithName(nameof(SelfRegisterUserEndpoint)) - .WithSummary("self register user") - .RequirePermission("Permissions.Users.Create") - .WithDescription("self register user") - .AllowAnonymous(); - } -} diff --git a/src/api/framework/Infrastructure/Identity/Users/Endpoints/ToggleUserStatusEndpoint.cs b/src/api/framework/Infrastructure/Identity/Users/Endpoints/ToggleUserStatusEndpoint.cs deleted file mode 100644 index 7e705e3294..0000000000 --- a/src/api/framework/Infrastructure/Identity/Users/Endpoints/ToggleUserStatusEndpoint.cs +++ /dev/null @@ -1,35 +0,0 @@ -using FluentValidation; -using FSH.Framework.Core.Identity.Users.Abstractions; -using FSH.Framework.Core.Identity.Users.Features.ToggleUserStatus; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Identity.Users.Endpoints; - -public static class ToggleUserStatusEndpoint -{ - internal static RouteHandlerBuilder ToggleUserStatusEndpointEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapPost("/{id:guid}/toggle-status", async ( - string id, - ToggleUserStatusCommand command, - [FromServices] IUserService userService, - CancellationToken cancellationToken) => - { - if (id != command.UserId) - { - return Results.BadRequest(); - } - - await userService.ToggleStatusAsync(command, cancellationToken); - return Results.Ok(); - }) - .WithName(nameof(ToggleUserStatusEndpoint)) - .WithSummary("Toggle a user's active status") - .WithDescription("Toggle a user's active status") - .AllowAnonymous(); - } - -} diff --git a/src/api/framework/Infrastructure/Identity/Users/Endpoints/UpdateUserEndpoint.cs b/src/api/framework/Infrastructure/Identity/Users/Endpoints/UpdateUserEndpoint.cs deleted file mode 100644 index 6d137e8d99..0000000000 --- a/src/api/framework/Infrastructure/Identity/Users/Endpoints/UpdateUserEndpoint.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System.Security.Claims; -using FSH.Framework.Core.Exceptions; -using FSH.Framework.Core.Identity.Users.Abstractions; -using FSH.Framework.Core.Identity.Users.Features.UpdateUser; -using FSH.Framework.Infrastructure.Auth.Policy; -using FSH.Starter.Shared.Authorization; -using MediatR; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Identity.Users.Endpoints; -public static class UpdateUserEndpoint -{ - internal static RouteHandlerBuilder MapUpdateUserEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapPut("/profile", (UpdateUserCommand request, ISender mediator, ClaimsPrincipal user, IUserService service) => - { - if (user.GetUserId() is not { } userId || string.IsNullOrEmpty(userId)) - { - throw new UnauthorizedException(); - } - return service.UpdateAsync(request, userId); - }) - .WithName(nameof(UpdateUserEndpoint)) - .WithSummary("update user profile") - .RequirePermission("Permissions.Users.Update") - .WithDescription("update user profile"); - } -} diff --git a/src/api/framework/Infrastructure/Identity/Users/FshUser.cs b/src/api/framework/Infrastructure/Identity/Users/FshUser.cs deleted file mode 100644 index 4d68e207f3..0000000000 --- a/src/api/framework/Infrastructure/Identity/Users/FshUser.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Microsoft.AspNetCore.Identity; - -namespace FSH.Framework.Infrastructure.Identity.Users; -public class FshUser : IdentityUser -{ - public string? FirstName { get; set; } - public string? LastName { get; set; } - public Uri? ImageUrl { get; set; } - public bool IsActive { get; set; } - public string? RefreshToken { get; set; } - public DateTime RefreshTokenExpiryTime { get; set; } - - public string? ObjectId { get; set; } -} diff --git a/src/api/framework/Infrastructure/Identity/Users/Services/CurrentUserService.cs b/src/api/framework/Infrastructure/Identity/Users/Services/CurrentUserService.cs deleted file mode 100644 index 2fcfea6fb5..0000000000 --- a/src/api/framework/Infrastructure/Identity/Users/Services/CurrentUserService.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System.Security.Claims; -using FSH.Framework.Core.Exceptions; -using FSH.Framework.Core.Identity.Users.Abstractions; -using FSH.Starter.Shared.Authorization; - -namespace FSH.Framework.Infrastructure.Identity.Users.Services; -public class CurrentUser : ICurrentUser, ICurrentUserInitializer -{ - private ClaimsPrincipal? _user; - - public string? Name => _user?.Identity?.Name; - - private Guid _userId = Guid.Empty; - - public Guid GetUserId() - { - return IsAuthenticated() - ? Guid.Parse(_user?.GetUserId() ?? Guid.Empty.ToString()) - : _userId; - } - - public string? GetUserEmail() => - IsAuthenticated() - ? _user!.GetEmail() - : string.Empty; - - public bool IsAuthenticated() => - _user?.Identity?.IsAuthenticated is true; - - public bool IsInRole(string role) => - _user?.IsInRole(role) is true; - - public IEnumerable? GetUserClaims() => - _user?.Claims; - - public string? GetTenant() => - IsAuthenticated() ? _user?.GetTenant() : string.Empty; - - public void SetCurrentUser(ClaimsPrincipal user) - { - if (_user != null) - { - throw new FshException("Method reserved for in-scope initialization"); - } - - _user = user; - } - - public void SetCurrentUserId(string userId) - { - if (_userId != Guid.Empty) - { - throw new FshException("Method reserved for in-scope initialization"); - } - - if (!string.IsNullOrEmpty(userId)) - { - _userId = Guid.Parse(userId); - } - } -} diff --git a/src/api/framework/Infrastructure/Identity/Users/Services/UserService.Password.cs b/src/api/framework/Infrastructure/Identity/Users/Services/UserService.Password.cs deleted file mode 100644 index 97b7af7979..0000000000 --- a/src/api/framework/Infrastructure/Identity/Users/Services/UserService.Password.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System.Collections.ObjectModel; -using System.Text; -using FSH.Framework.Core.Exceptions; -using FSH.Framework.Core.Identity.Users.Features.ChangePassword; -using FSH.Framework.Core.Identity.Users.Features.ForgotPassword; -using FSH.Framework.Core.Identity.Users.Features.ResetPassword; -using FSH.Framework.Core.Mail; -using Microsoft.AspNetCore.WebUtilities; - -namespace FSH.Framework.Infrastructure.Identity.Users.Services; -internal sealed partial class UserService -{ - public async Task ForgotPasswordAsync(ForgotPasswordCommand request, string origin, CancellationToken cancellationToken) - { - EnsureValidTenant(); - - var user = await userManager.FindByEmailAsync(request.Email); - if (user == null) - { - throw new NotFoundException("user not found"); - } - - if (string.IsNullOrWhiteSpace(user.Email)) - { - throw new InvalidOperationException("user email cannot be null or empty"); - } - - var token = await userManager.GeneratePasswordResetTokenAsync(user); - token = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(token)); - - var resetPasswordUri = $"{origin}/reset-password?token={token}&email={request.Email}"; - var mailRequest = new MailRequest( - new Collection { user.Email }, - "Reset Password", - $"Please reset your password using the following link: {resetPasswordUri}"); - - jobService.Enqueue(() => mailService.SendAsync(mailRequest, CancellationToken.None)); - } - - public async Task ResetPasswordAsync(ResetPasswordCommand request, CancellationToken cancellationToken) - { - EnsureValidTenant(); - - var user = await userManager.FindByEmailAsync(request.Email); - if (user == null) - { - throw new NotFoundException("user not found"); - } - - request.Token = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(request.Token)); - var result = await userManager.ResetPasswordAsync(user, request.Token, request.Password); - - if (!result.Succeeded) - { - var errors = result.Errors.Select(e => e.Description).ToList(); - throw new FshException("error resetting password", errors); - } - } - - public async Task ChangePasswordAsync(ChangePasswordCommand request, string userId) - { - var user = await userManager.FindByIdAsync(userId); - - _ = user ?? throw new NotFoundException("user not found"); - - var result = await userManager.ChangePasswordAsync(user, request.Password, request.NewPassword); - - if (!result.Succeeded) - { - var errors = result.Errors.Select(e => e.Description).ToList(); - throw new FshException("failed to change password", errors); - } - } -} diff --git a/src/api/framework/Infrastructure/Identity/Users/Services/UserService.Permissions.cs b/src/api/framework/Infrastructure/Identity/Users/Services/UserService.Permissions.cs deleted file mode 100644 index 52f5698f78..0000000000 --- a/src/api/framework/Infrastructure/Identity/Users/Services/UserService.Permissions.cs +++ /dev/null @@ -1,53 +0,0 @@ -using FSH.Framework.Core.Caching; -using FSH.Framework.Core.Exceptions; -using FSH.Starter.Shared.Authorization; -using Microsoft.EntityFrameworkCore; - -namespace FSH.Framework.Infrastructure.Identity.Users.Services; -internal sealed partial class UserService -{ - public async Task?> GetPermissionsAsync(string userId, CancellationToken cancellationToken) - { - var permissions = await cache.GetOrSetAsync( - GetPermissionCacheKey(userId), - async () => - { - var user = await userManager.FindByIdAsync(userId); - - _ = user ?? throw new UnauthorizedException(); - - var userRoles = await userManager.GetRolesAsync(user); - var permissions = new List(); - foreach (var role in await roleManager.Roles - .Where(r => userRoles.Contains(r.Name!)) - .ToListAsync(cancellationToken)) - { - permissions.AddRange(await db.RoleClaims - .Where(rc => rc.RoleId == role.Id && rc.ClaimType == FshClaims.Permission) - .Select(rc => rc.ClaimValue!) - .ToListAsync(cancellationToken)); - } - return permissions.Distinct().ToList(); - }, - cancellationToken: cancellationToken); - - return permissions; - } - - public static string GetPermissionCacheKey(string userId) - { - return $"perm:{userId}"; - } - - public async Task HasPermissionAsync(string userId, string permission, CancellationToken cancellationToken = default) - { - var permissions = await GetPermissionsAsync(userId, cancellationToken); - - return permissions?.Contains(permission) ?? false; - } - - public Task InvalidatePermissionCacheAsync(string userId, CancellationToken cancellationToken) - { - return cache.RemoveAsync(GetPermissionCacheKey(userId), cancellationToken); - } -} diff --git a/src/api/framework/Infrastructure/Identity/Users/Services/UserService.cs b/src/api/framework/Infrastructure/Identity/Users/Services/UserService.cs deleted file mode 100644 index a714a154d2..0000000000 --- a/src/api/framework/Infrastructure/Identity/Users/Services/UserService.cs +++ /dev/null @@ -1,313 +0,0 @@ -using System.Collections.ObjectModel; -using System.Security.Claims; -using System.Text; -using Finbuckle.MultiTenant.Abstractions; -using FSH.Framework.Core.Caching; -using FSH.Framework.Core.Exceptions; -using FSH.Framework.Core.Identity.Users.Abstractions; -using FSH.Framework.Core.Identity.Users.Dtos; -using FSH.Framework.Core.Identity.Users.Features.AssignUserRole; -using FSH.Framework.Core.Identity.Users.Features.RegisterUser; -using FSH.Framework.Core.Identity.Users.Features.ToggleUserStatus; -using FSH.Framework.Core.Identity.Users.Features.UpdateUser; -using FSH.Framework.Core.Jobs; -using FSH.Framework.Core.Mail; -using FSH.Framework.Core.Storage; -using FSH.Framework.Core.Storage.File; -using FSH.Framework.Infrastructure.Constants; -using FSH.Framework.Infrastructure.Identity.Persistence; -using FSH.Framework.Infrastructure.Identity.Roles; -using FSH.Framework.Infrastructure.Tenant; -using FSH.Starter.Shared.Authorization; -using Mapster; -using Microsoft.AspNetCore.Identity; -using Microsoft.AspNetCore.WebUtilities; -using Microsoft.EntityFrameworkCore; - -namespace FSH.Framework.Infrastructure.Identity.Users.Services; - -internal sealed partial class UserService( - UserManager userManager, - SignInManager signInManager, - RoleManager roleManager, - IdentityDbContext db, - ICacheService cache, - IJobService jobService, - IMailService mailService, - IMultiTenantContextAccessor multiTenantContextAccessor, - IStorageService storageService - ) : IUserService -{ - private void EnsureValidTenant() - { - if (string.IsNullOrWhiteSpace(multiTenantContextAccessor?.MultiTenantContext?.TenantInfo?.Id)) - { - throw new UnauthorizedException("invalid tenant"); - } - } - - public async Task ConfirmEmailAsync(string userId, string code, string tenant, CancellationToken cancellationToken) - { - EnsureValidTenant(); - - var user = await userManager.Users - .Where(u => u.Id == userId && !u.EmailConfirmed) - .FirstOrDefaultAsync(cancellationToken); - - _ = user ?? throw new FshException("An error occurred while confirming E-Mail."); - - code = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(code)); - var result = await userManager.ConfirmEmailAsync(user, code); - - return result.Succeeded - ? string.Format("Account Confirmed for E-Mail {0}. You can now use the /api/tokens endpoint to generate JWT.", user.Email) - : throw new FshException(string.Format("An error occurred while confirming {0}", user.Email)); - } - - public Task ConfirmPhoneNumberAsync(string userId, string code) - { - throw new NotImplementedException(); - } - - public async Task ExistsWithEmailAsync(string email, string? exceptId = null) - { - EnsureValidTenant(); - return await userManager.FindByEmailAsync(email.Normalize()) is FshUser user && user.Id != exceptId; - } - - public async Task ExistsWithNameAsync(string name) - { - EnsureValidTenant(); - return await userManager.FindByNameAsync(name) is not null; - } - - public async Task ExistsWithPhoneNumberAsync(string phoneNumber, string? exceptId = null) - { - EnsureValidTenant(); - return await userManager.Users.FirstOrDefaultAsync(x => x.PhoneNumber == phoneNumber) is FshUser user && user.Id != exceptId; - } - - public async Task GetAsync(string userId, CancellationToken cancellationToken) - { - var user = await userManager.Users - .AsNoTracking() - .Where(u => u.Id == userId) - .FirstOrDefaultAsync(cancellationToken); - - _ = user ?? throw new NotFoundException("user not found"); - - return user.Adapt(); - } - - public Task GetCountAsync(CancellationToken cancellationToken) => - userManager.Users.AsNoTracking().CountAsync(cancellationToken); - - public async Task> GetListAsync(CancellationToken cancellationToken) - { - var users = await userManager.Users.AsNoTracking().ToListAsync(cancellationToken); - return users.Adapt>(); - } - - public Task GetOrCreateFromPrincipalAsync(ClaimsPrincipal principal) - { - throw new NotImplementedException(); - } - - public async Task RegisterAsync(RegisterUserCommand request, string origin, CancellationToken cancellationToken) - { - // create user entity - var user = new FshUser - { - Email = request.Email, - FirstName = request.FirstName, - LastName = request.LastName, - UserName = request.UserName, - PhoneNumber = request.PhoneNumber, - IsActive = true, - EmailConfirmed = false, - PhoneNumberConfirmed = false, - }; - - // register user - var result = await userManager.CreateAsync(user, request.Password); - if (!result.Succeeded) - { - var errors = result.Errors.Select(error => error.Description).ToList(); - throw new FshException("error while registering a new user", errors); - } - - // add basic role - await userManager.AddToRoleAsync(user, FshRoles.Basic); - - // send confirmation mail - if (!string.IsNullOrEmpty(user.Email)) - { - string emailVerificationUri = await GetEmailVerificationUriAsync(user, origin); - var mailRequest = new MailRequest( - new Collection { user.Email }, - "Confirm Registration", - emailVerificationUri); - jobService.Enqueue("email", () => mailService.SendAsync(mailRequest, CancellationToken.None)); - } - - return new RegisterUserResponse(user.Id); - } - - public async Task ToggleStatusAsync(ToggleUserStatusCommand request, CancellationToken cancellationToken) - { - var user = await userManager.Users.Where(u => u.Id == request.UserId).FirstOrDefaultAsync(cancellationToken); - - _ = user ?? throw new NotFoundException("User Not Found."); - - bool isAdmin = await userManager.IsInRoleAsync(user, FshRoles.Admin); - if (isAdmin) - { - throw new FshException("Administrators Profile's Status cannot be toggled"); - } - - user.IsActive = request.ActivateUser; - - await userManager.UpdateAsync(user); - } - - public async Task UpdateAsync(UpdateUserCommand request, string userId) - { - var user = await userManager.FindByIdAsync(userId); - - _ = user ?? throw new NotFoundException("user not found"); - - Uri imageUri = user.ImageUrl ?? null!; - if (request.Image != null || request.DeleteCurrentImage) - { - user.ImageUrl = await storageService.UploadAsync(request.Image, FileType.Image); - if (request.DeleteCurrentImage && imageUri != null) - { - storageService.Remove(imageUri); - } - } - - user.FirstName = request.FirstName; - user.LastName = request.LastName; - user.PhoneNumber = request.PhoneNumber; - string? phoneNumber = await userManager.GetPhoneNumberAsync(user); - if (request.PhoneNumber != phoneNumber) - { - await userManager.SetPhoneNumberAsync(user, request.PhoneNumber); - } - - var result = await userManager.UpdateAsync(user); - await signInManager.RefreshSignInAsync(user); - - if (!result.Succeeded) - { - throw new FshException("Update profile failed"); - } - } - - public async Task DeleteAsync(string userId) - { - FshUser? user = await userManager.FindByIdAsync(userId); - - _ = user ?? throw new NotFoundException("User Not Found."); - - user.IsActive = false; - IdentityResult? result = await userManager.UpdateAsync(user); - - if (!result.Succeeded) - { - List errors = result.Errors.Select(error => error.Description).ToList(); - throw new FshException("Delete profile failed", errors); - } - } - - private async Task GetEmailVerificationUriAsync(FshUser user, string origin) - { - EnsureValidTenant(); - - string code = await userManager.GenerateEmailConfirmationTokenAsync(user); - code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code)); - const string route = "api/users/confirm-email/"; - var endpointUri = new Uri(string.Concat($"{origin}/", route)); - string verificationUri = QueryHelpers.AddQueryString(endpointUri.ToString(), QueryStringKeys.UserId, user.Id); - verificationUri = QueryHelpers.AddQueryString(verificationUri, QueryStringKeys.Code, code); - verificationUri = QueryHelpers.AddQueryString(verificationUri, - TenantConstants.Identifier, - multiTenantContextAccessor?.MultiTenantContext?.TenantInfo?.Id!); - return verificationUri; - } - - public async Task AssignRolesAsync(string userId, AssignUserRoleCommand request, CancellationToken cancellationToken) - { - ArgumentNullException.ThrowIfNull(request); - - var user = await userManager.Users.Where(u => u.Id == userId).FirstOrDefaultAsync(cancellationToken); - - _ = user ?? throw new NotFoundException("user not found"); - - // Check if the user is an admin for which the admin role is getting disabled - if (await userManager.IsInRoleAsync(user, FshRoles.Admin) - && request.UserRoles.Exists(a => !a.Enabled && a.RoleName == FshRoles.Admin)) - { - // Get count of users in Admin Role - int adminCount = (await userManager.GetUsersInRoleAsync(FshRoles.Admin)).Count; - - // Check if user is not Root Tenant Admin - // Edge Case : there are chances for other tenants to have users with the same email as that of Root Tenant Admin. Probably can add a check while User Registration - if (user.Email == TenantConstants.Root.EmailAddress) - { - if (multiTenantContextAccessor?.MultiTenantContext?.TenantInfo?.Id == TenantConstants.Root.Id) - { - throw new FshException("action not permitted"); - } - } - else if (adminCount <= 2) - { - throw new FshException("tenant should have at least 2 admins."); - } - } - - foreach (var userRole in request.UserRoles) - { - // Check if Role Exists - if (await roleManager.FindByNameAsync(userRole.RoleName!) is not null) - { - if (userRole.Enabled) - { - if (!await userManager.IsInRoleAsync(user, userRole.RoleName!)) - { - await userManager.AddToRoleAsync(user, userRole.RoleName!); - } - } - else - { - await userManager.RemoveFromRoleAsync(user, userRole.RoleName!); - } - } - } - - return "User Roles Updated Successfully."; - - } - - public async Task> GetUserRolesAsync(string userId, CancellationToken cancellationToken) - { - var userRoles = new List(); - - var user = await userManager.FindByIdAsync(userId); - if (user is null) throw new NotFoundException("user not found"); - var roles = await roleManager.Roles.AsNoTracking().ToListAsync(cancellationToken); - if (roles is null) throw new NotFoundException("roles not found"); - foreach (var role in roles) - { - userRoles.Add(new UserRoleDetail - { - RoleId = role.Id, - RoleName = role.Name, - Description = role.Description, - Enabled = await userManager.IsInRoleAsync(user, role.Name!) - }); - } - - return userRoles; - } -} diff --git a/src/api/framework/Infrastructure/Infrastructure.csproj b/src/api/framework/Infrastructure/Infrastructure.csproj deleted file mode 100644 index 389248b9c6..0000000000 --- a/src/api/framework/Infrastructure/Infrastructure.csproj +++ /dev/null @@ -1,82 +0,0 @@ - - - FSH.Framework.Infrastructure - FSH.Framework.Infrastructure - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/api/framework/Infrastructure/Jobs/Extensions.cs b/src/api/framework/Infrastructure/Jobs/Extensions.cs deleted file mode 100644 index 618d07d30d..0000000000 --- a/src/api/framework/Infrastructure/Jobs/Extensions.cs +++ /dev/null @@ -1,71 +0,0 @@ -using FSH.Framework.Core.Exceptions; -using FSH.Framework.Core.Jobs; -using FSH.Framework.Core.Persistence; -using FSH.Framework.Infrastructure.Persistence; -using Hangfire; -using Hangfire.PostgreSql; -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; - -namespace FSH.Framework.Infrastructure.Jobs; - -internal static class Extensions -{ - internal static IServiceCollection ConfigureJobs(this IServiceCollection services, IConfiguration configuration) - { - var dbOptions = configuration.GetSection(nameof(DatabaseOptions)).Get() ?? - throw new FshException("database options cannot be null"); - - services.AddHangfireServer(o => - { - o.HeartbeatInterval = TimeSpan.FromSeconds(30); - o.Queues = new string[] { "default", "email" }; - o.WorkerCount = 5; - o.SchedulePollingInterval = TimeSpan.FromSeconds(30); - }); - - services.AddHangfire((provider, config) => - { - switch (dbOptions.Provider.ToUpperInvariant()) - { - case DbProviders.PostgreSQL: - config.UsePostgreSqlStorage(o => - { - o.UseNpgsqlConnection(dbOptions.ConnectionString); - }); - break; - - case DbProviders.MSSQL: - config.UseSqlServerStorage(dbOptions.ConnectionString); - break; - - default: - throw new FshException($"hangfire storage provider {dbOptions.Provider} is not supported"); - } - - config.UseFilter(new FshJobFilter(provider)); - config.UseFilter(new LogJobFilter()); - }); - - services.AddTransient(); - return services; - } - - internal static IApplicationBuilder UseJobDashboard(this IApplicationBuilder app, IConfiguration config) - { - var hangfireOptions = config.GetSection(nameof(HangfireOptions)).Get() ?? new HangfireOptions(); - var dashboardOptions = new DashboardOptions(); - dashboardOptions.AppPath = "https://fullstackhero.net/"; - dashboardOptions.Authorization = new[] - { - new HangfireCustomBasicAuthenticationFilter - { - User = hangfireOptions.UserName!, - Pass = hangfireOptions.Password! - } - }; - - return app.UseHangfireDashboard(hangfireOptions.Route, dashboardOptions); - } -} diff --git a/src/api/framework/Infrastructure/Jobs/FshJobActivator.cs b/src/api/framework/Infrastructure/Jobs/FshJobActivator.cs deleted file mode 100644 index dc0eb2fd83..0000000000 --- a/src/api/framework/Infrastructure/Jobs/FshJobActivator.cs +++ /dev/null @@ -1,64 +0,0 @@ -using Finbuckle.MultiTenant; -using Finbuckle.MultiTenant.Abstractions; -using FSH.Framework.Core.Identity.Users.Abstractions; -using FSH.Framework.Infrastructure.Constants; -using FSH.Framework.Infrastructure.Tenant; -using FSH.Starter.Shared.Authorization; -using Hangfire; -using Hangfire.Server; -using Microsoft.Extensions.DependencyInjection; - -namespace FSH.Framework.Infrastructure.Jobs; - -public class FshJobActivator : JobActivator -{ - private readonly IServiceScopeFactory _scopeFactory; - - public FshJobActivator(IServiceScopeFactory scopeFactory) => - _scopeFactory = scopeFactory ?? throw new ArgumentNullException(nameof(scopeFactory)); - - public override JobActivatorScope BeginScope(PerformContext context) => - new Scope(context, _scopeFactory.CreateScope()); - - private sealed class Scope : JobActivatorScope, IServiceProvider - { - private readonly PerformContext _context; - private readonly IServiceScope _scope; - - public Scope(PerformContext context, IServiceScope scope) - { - _context = context ?? throw new ArgumentNullException(nameof(context)); - _scope = scope ?? throw new ArgumentNullException(nameof(scope)); - - ReceiveParameters(); - } - - private void ReceiveParameters() - { - var tenantInfo = _context.GetJobParameter(TenantConstants.Identifier); - if (tenantInfo is not null) - { - _scope.ServiceProvider.GetRequiredService() - .MultiTenantContext = new MultiTenantContext - { - TenantInfo = tenantInfo - }; - } - - string userId = _context.GetJobParameter(QueryStringKeys.UserId); - if (!string.IsNullOrEmpty(userId)) - { - _scope.ServiceProvider.GetRequiredService() - .SetCurrentUserId(userId); - } - } - - public override object Resolve(Type type) => - ActivatorUtilities.GetServiceOrCreateInstance(this, type); - - object? IServiceProvider.GetService(Type serviceType) => - serviceType == typeof(PerformContext) - ? _context - : _scope.ServiceProvider.GetService(serviceType); - } -} diff --git a/src/api/framework/Infrastructure/Jobs/FshJobFilter.cs b/src/api/framework/Infrastructure/Jobs/FshJobFilter.cs deleted file mode 100644 index 54b83641b2..0000000000 --- a/src/api/framework/Infrastructure/Jobs/FshJobFilter.cs +++ /dev/null @@ -1,41 +0,0 @@ -using Finbuckle.MultiTenant.Abstractions; -using FSH.Framework.Infrastructure.Constants; -using FSH.Starter.Shared.Authorization; -using Hangfire.Client; -using Hangfire.Logging; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.DependencyInjection; - -namespace FSH.Framework.Infrastructure.Jobs; - -public class FshJobFilter : IClientFilter -{ - private static readonly ILog Logger = LogProvider.GetCurrentClassLogger(); - - private readonly IServiceProvider _services; - - public FshJobFilter(IServiceProvider services) => _services = services; - - public void OnCreating(CreatingContext context) - { - ArgumentNullException.ThrowIfNull(context); - - Logger.InfoFormat("Set TenantId and UserId parameters to job {0}.{1}...", context.Job.Method.ReflectedType?.FullName, context.Job.Method.Name); - - using var scope = _services.CreateScope(); - - var httpContext = scope.ServiceProvider.GetRequiredService()?.HttpContext; - _ = httpContext ?? throw new InvalidOperationException("Can't create a TenantJob without HttpContext."); - - var tenantInfo = scope.ServiceProvider.GetRequiredService().MultiTenantContext.TenantInfo; - context.SetJobParameter(TenantConstants.Identifier, tenantInfo); - - string? userId = httpContext.User.GetUserId(); - context.SetJobParameter(QueryStringKeys.UserId, userId); - } - - public void OnCreated(CreatedContext context) => - Logger.InfoFormat( - "Job created with parameters {0}", - context.Parameters.Select(x => x.Key + "=" + x.Value).Aggregate((s1, s2) => s1 + ";" + s2)); -} diff --git a/src/api/framework/Infrastructure/Jobs/HangfireCustomBasicAuthenticationFilter.cs b/src/api/framework/Infrastructure/Jobs/HangfireCustomBasicAuthenticationFilter.cs deleted file mode 100644 index 2cc8980d4b..0000000000 --- a/src/api/framework/Infrastructure/Jobs/HangfireCustomBasicAuthenticationFilter.cs +++ /dev/null @@ -1,121 +0,0 @@ -using System.Net.Http.Headers; -using Hangfire.Dashboard; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; -using Microsoft.Extensions.Primitives; - -namespace FSH.Framework.Infrastructure.Jobs; - -public class HangfireCustomBasicAuthenticationFilter : IDashboardAuthorizationFilter -{ - private const string _AuthenticationScheme = "Basic"; - private readonly ILogger _logger; - public string User { get; set; } = default!; - public string Pass { get; set; } = default!; - - public HangfireCustomBasicAuthenticationFilter() - : this(new NullLogger()) - { - } - - public HangfireCustomBasicAuthenticationFilter(ILogger logger) => _logger = logger; - - public bool Authorize(DashboardContext context) - { - var httpContext = context.GetHttpContext(); - var header = httpContext.Request.Headers["Authorization"]!; - - if (MissingAuthorizationHeader(header)) - { - _logger.LogInformation("Request is missing Authorization Header"); - SetChallengeResponse(httpContext); - return false; - } - - var authValues = AuthenticationHeaderValue.Parse(header!); - - if (NotBasicAuthentication(authValues)) - { - _logger.LogInformation("Request is NOT BASIC authentication"); - SetChallengeResponse(httpContext); - return false; - } - - var tokens = ExtractAuthenticationTokens(authValues); - - if (tokens.AreInvalid()) - { - _logger.LogInformation("Authentication tokens are invalid (empty, null, whitespace)"); - SetChallengeResponse(httpContext); - return false; - } - - if (tokens.CredentialsMatch(User, Pass)) - { - _logger.LogInformation("Awesome, authentication tokens match configuration!"); - return true; - } - - _logger.LogInformation("auth tokens [{UserName}] [{Password}] do not match configuration", tokens.Username, tokens.Password); - - SetChallengeResponse(httpContext); - return false; - } - - private static bool MissingAuthorizationHeader(StringValues header) - { - return string.IsNullOrWhiteSpace(header); - } - - private static BasicAuthenticationTokens ExtractAuthenticationTokens(AuthenticationHeaderValue authValues) - { - string? parameter = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(authValues.Parameter!)); - string[]? parts = parameter.Split(':'); - return new BasicAuthenticationTokens(parts); - } - - private static bool NotBasicAuthentication(AuthenticationHeaderValue authValues) - { - return !_AuthenticationScheme.Equals(authValues.Scheme, StringComparison.OrdinalIgnoreCase); - } - - private static void SetChallengeResponse(HttpContext httpContext) - { - httpContext.Response.StatusCode = 401; - httpContext.Response.Headers.Append("WWW-Authenticate", "Basic realm=\"Hangfire Dashboard\""); - } -} - -public class BasicAuthenticationTokens -{ - private readonly string[] _tokens; - - public string Username => _tokens[0]; - public string Password => _tokens[1]; - - public BasicAuthenticationTokens(string[] tokens) - { - _tokens = tokens; - } - - public bool AreInvalid() - { - return ContainsTwoTokens() && ValidTokenValue(Username) && ValidTokenValue(Password); - } - - public bool CredentialsMatch(string user, string pass) - { - return Username.Equals(user, StringComparison.Ordinal) && Password.Equals(pass, StringComparison.Ordinal); - } - - private static bool ValidTokenValue(string token) - { - return string.IsNullOrWhiteSpace(token); - } - - private bool ContainsTwoTokens() - { - return _tokens.Length == 2; - } -} diff --git a/src/api/framework/Infrastructure/Jobs/HangfireOptions.cs b/src/api/framework/Infrastructure/Jobs/HangfireOptions.cs deleted file mode 100644 index 45f5ac0c63..0000000000 --- a/src/api/framework/Infrastructure/Jobs/HangfireOptions.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace FSH.Framework.Infrastructure.Jobs; -public class HangfireOptions -{ - public string UserName { get; set; } = "admin"; - public string Password { get; set; } = "Secure1234!Me"; - public string Route { get; set; } = "/jobs"; -} diff --git a/src/api/framework/Infrastructure/Jobs/HangfireService.cs b/src/api/framework/Infrastructure/Jobs/HangfireService.cs deleted file mode 100644 index 1c4785cd10..0000000000 --- a/src/api/framework/Infrastructure/Jobs/HangfireService.cs +++ /dev/null @@ -1,59 +0,0 @@ -using System.Linq.Expressions; -using FSH.Framework.Core.Jobs; -using Hangfire; - -namespace FSH.Framework.Infrastructure.Jobs; - -public class HangfireService : IJobService -{ - public bool Delete(string jobId) => - BackgroundJob.Delete(jobId); - - public bool Delete(string jobId, string fromState) => - BackgroundJob.Delete(jobId, fromState); - - public string Enqueue(Expression> methodCall) => - BackgroundJob.Enqueue(methodCall); - - public string Enqueue(string queue, Expression> methodCall) => - BackgroundJob.Enqueue(queue, methodCall); - - public string Enqueue(Expression> methodCall) => - BackgroundJob.Enqueue(methodCall); - - public string Enqueue(Expression methodCall) => - BackgroundJob.Enqueue(methodCall); - - public string Enqueue(Expression> methodCall) => - BackgroundJob.Enqueue(methodCall); - - public bool Requeue(string jobId) => - BackgroundJob.Requeue(jobId); - - public bool Requeue(string jobId, string fromState) => - BackgroundJob.Requeue(jobId, fromState); - - public string Schedule(Expression methodCall, TimeSpan delay) => - BackgroundJob.Schedule(methodCall, delay); - - public string Schedule(Expression> methodCall, TimeSpan delay) => - BackgroundJob.Schedule(methodCall, delay); - - public string Schedule(Expression methodCall, DateTimeOffset enqueueAt) => - BackgroundJob.Schedule(methodCall, enqueueAt); - - public string Schedule(Expression> methodCall, DateTimeOffset enqueueAt) => - BackgroundJob.Schedule(methodCall, enqueueAt); - - public string Schedule(Expression> methodCall, TimeSpan delay) => - BackgroundJob.Schedule(methodCall, delay); - - public string Schedule(Expression> methodCall, TimeSpan delay) => - BackgroundJob.Schedule(methodCall, delay); - - public string Schedule(Expression> methodCall, DateTimeOffset enqueueAt) => - BackgroundJob.Schedule(methodCall, enqueueAt); - - public string Schedule(Expression> methodCall, DateTimeOffset enqueueAt) => - BackgroundJob.Schedule(methodCall, enqueueAt); -} diff --git a/src/api/framework/Infrastructure/Jobs/LogJobFilter.cs b/src/api/framework/Infrastructure/Jobs/LogJobFilter.cs deleted file mode 100644 index 24f1c734ea..0000000000 --- a/src/api/framework/Infrastructure/Jobs/LogJobFilter.cs +++ /dev/null @@ -1,51 +0,0 @@ -using Hangfire.Client; -using Hangfire.Logging; -using Hangfire.Server; -using Hangfire.States; -using Hangfire.Storage; - -namespace FSH.Framework.Infrastructure.Jobs; - -public class LogJobFilter : IClientFilter, IServerFilter, IElectStateFilter, IApplyStateFilter -{ - private static readonly ILog Logger = LogProvider.GetCurrentClassLogger(); - - public void OnCreating(CreatingContext context) => - Logger.DebugFormat("Creating a job based on method {0}...", context.Job.Method.Name); - - public void OnCreated(CreatedContext context) => - Logger.DebugFormat( - "Job that is based on method {0} has been created with id {1}", - context.Job.Method.Name, - context.BackgroundJob?.Id); - - public void OnPerforming(PerformingContext context) => - Logger.DebugFormat("Starting to perform job {0}", context.BackgroundJob.Id); - - public void OnPerformed(PerformedContext context) => - Logger.DebugFormat("Job {0} has been performed", context.BackgroundJob.Id); - - public void OnStateElection(ElectStateContext context) - { - if (context.CandidateState is FailedState failedState) - { - Logger.WarnFormat( - "Job '{0}' has been failed due to an exception {1}", - context.BackgroundJob.Id, - failedState.Exception); - } - } - - public void OnStateApplied(ApplyStateContext context, IWriteOnlyTransaction transaction) => - Logger.DebugFormat( - "Job {0} state was changed from {1} to {2}", - context.BackgroundJob.Id, - context.OldStateName, - context.NewState.Name); - - public void OnStateUnapplied(ApplyStateContext context, IWriteOnlyTransaction transaction) => - Logger.DebugFormat( - "Job {0} state {1} was unapplied.", - context.BackgroundJob.Id, - context.OldStateName); -} diff --git a/src/api/framework/Infrastructure/Logging/Serilog/Extensions.cs b/src/api/framework/Infrastructure/Logging/Serilog/Extensions.cs deleted file mode 100644 index 25a8dba177..0000000000 --- a/src/api/framework/Infrastructure/Logging/Serilog/Extensions.cs +++ /dev/null @@ -1,58 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Serilog; -using Serilog.Events; -using Serilog.Filters; - -namespace FSH.Framework.Infrastructure.Logging.Serilog; - -public static class Extensions -{ - public static WebApplicationBuilder ConfigureSerilog(this WebApplicationBuilder builder) - { - ArgumentNullException.ThrowIfNull(builder); - builder.Host.UseSerilog((context, logger) => - { - logger.WriteTo.OpenTelemetry(options => - { - try - { - options.Endpoint = builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]; - var headers = builder.Configuration["OTEL_EXPORTER_OTLP_HEADERS"]?.Split(',') ?? []; - foreach (var header in headers) - { - var (key, value) = header.Split('=') switch - { - [string k, string v] => (k, v), - var v => throw new Exception($"Invalid header format {v}") - }; - - options.Headers.Add(key, value); - } - options.ResourceAttributes.Add("service.name", "apiservice"); - //To remove the duplicate issue, we can use the below code to get the key and value from the configuration - var (otelResourceAttribute, otelResourceAttributeValue) = builder.Configuration["OTEL_RESOURCE_ATTRIBUTES"]?.Split('=') switch - { - [string k, string v] => (k, v), - _ => throw new Exception($"Invalid header format {builder.Configuration["OTEL_RESOURCE_ATTRIBUTES"]}") - }; - options.ResourceAttributes.Add(otelResourceAttribute, otelResourceAttributeValue); - } - catch - { - //ignore - } - }); - logger.ReadFrom.Configuration(context.Configuration); - logger.Enrich.FromLogContext(); - logger.Enrich.WithCorrelationId(); - logger - .MinimumLevel.Override("Microsoft", LogEventLevel.Warning) - .MinimumLevel.Override("Microsoft.Hosting.Lifetime", LogEventLevel.Information) - .MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Error) - .MinimumLevel.Override("Hangfire", LogEventLevel.Warning) - .MinimumLevel.Override("Finbuckle.MultiTenant", LogEventLevel.Warning) - .Filter.ByExcluding(Matching.FromSource("Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware")); - }); - return builder; - } -} diff --git a/src/api/framework/Infrastructure/Logging/Serilog/StaticLogger.cs b/src/api/framework/Infrastructure/Logging/Serilog/StaticLogger.cs deleted file mode 100644 index 1809893b53..0000000000 --- a/src/api/framework/Infrastructure/Logging/Serilog/StaticLogger.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Serilog; -using Serilog.Core; - -namespace FSH.Framework.Infrastructure.Logging.Serilog; - -public static class StaticLogger -{ - public static void EnsureInitialized() - { - if (Log.Logger is not Logger) - { - Log.Logger = new LoggerConfiguration() - .Enrich.FromLogContext() - .WriteTo.Console() - .WriteTo.OpenTelemetry() - .CreateLogger(); - } - } -} diff --git a/src/api/framework/Infrastructure/Mail/Extensions.cs b/src/api/framework/Infrastructure/Mail/Extensions.cs deleted file mode 100644 index 4c772f7731..0000000000 --- a/src/api/framework/Infrastructure/Mail/Extensions.cs +++ /dev/null @@ -1,13 +0,0 @@ -using FSH.Framework.Core.Mail; -using Microsoft.Extensions.DependencyInjection; - -namespace FSH.Framework.Infrastructure.Mail; -internal static class Extensions -{ - internal static IServiceCollection ConfigureMailing(this IServiceCollection services) - { - services.AddTransient(); - services.AddOptions().BindConfiguration(nameof(MailOptions)); - return services; - } -} diff --git a/src/api/framework/Infrastructure/Mail/SmtpMailService.cs b/src/api/framework/Infrastructure/Mail/SmtpMailService.cs deleted file mode 100644 index aee5969491..0000000000 --- a/src/api/framework/Infrastructure/Mail/SmtpMailService.cs +++ /dev/null @@ -1,93 +0,0 @@ -namespace FSH.Framework.Infrastructure.Mail; -using System; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using FSH.Framework.Core.Mail; -using MailKit.Net.Smtp; -using MailKit.Security; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; -using MimeKit; - -public class SmtpMailService(IOptions settings, ILogger logger) : IMailService -{ - private readonly MailOptions _settings = settings.Value; - private readonly ILogger _logger = logger; - - public async Task SendAsync(MailRequest request, CancellationToken ct) - { - using var email = new MimeMessage(); - - // From - email.From.Add(new MailboxAddress(_settings.DisplayName, request.From ?? _settings.From)); - - // To - foreach (string address in request.To) - email.To.Add(MailboxAddress.Parse(address)); - - // Reply To - if (!string.IsNullOrEmpty(request.ReplyTo)) - email.ReplyTo.Add(new MailboxAddress(request.ReplyToName, request.ReplyTo)); - - // Bcc - if (request.Bcc != null) - { - foreach (string address in request.Bcc.Where(bccValue => !string.IsNullOrWhiteSpace(bccValue))) - email.Bcc.Add(MailboxAddress.Parse(address.Trim())); - } - - // Cc - if (request.Cc != null) - { - foreach (string? address in request.Cc.Where(ccValue => !string.IsNullOrWhiteSpace(ccValue))) - email.Cc.Add(MailboxAddress.Parse(address.Trim())); - } - - // Headers - if (request.Headers != null) - { - foreach (var header in request.Headers) - email.Headers.Add(header.Key, header.Value); - } - - // Content - var builder = new BodyBuilder(); - email.Sender = new MailboxAddress(request.DisplayName ?? _settings.DisplayName, request.From ?? _settings.From); - email.Subject = request.Subject; - builder.HtmlBody = request.Body; - - // Create the file attachments for this e-mail message - if (request.AttachmentData != null) - { - foreach (var attachmentInfo in request.AttachmentData) - { - using (var stream = new MemoryStream()) - { - await stream.WriteAsync(attachmentInfo.Value, ct); - stream.Position = 0; - await builder.Attachments.AddAsync(attachmentInfo.Key, stream, ct); - } - } - } - - email.Body = builder.ToMessageBody(); - - using var client = new SmtpClient(); - try - { - await client.ConnectAsync(_settings.Host, _settings.Port, SecureSocketOptions.StartTls, ct); - await client.AuthenticateAsync(_settings.UserName, _settings.Password, ct); - await client.SendAsync(email, ct); - } - catch (Exception ex) - { - _logger.LogError(ex, "An error occurred while sending email: {Message}", ex.Message); - } - finally - { - await client.DisconnectAsync(true, ct); - } - } -} diff --git a/src/api/framework/Infrastructure/OpenApi/ConfigureSwaggerOptions.cs b/src/api/framework/Infrastructure/OpenApi/ConfigureSwaggerOptions.cs deleted file mode 100644 index 71eed3eb74..0000000000 --- a/src/api/framework/Infrastructure/OpenApi/ConfigureSwaggerOptions.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System.Text; -using Asp.Versioning.ApiExplorer; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; -using Microsoft.OpenApi.Models; -using Swashbuckle.AspNetCore.SwaggerGen; - -namespace FSH.Framework.Infrastructure.OpenApi; -public class ConfigureSwaggerOptions : IConfigureOptions -{ - private readonly IApiVersionDescriptionProvider provider; - - /// - /// Initializes a new instance of the class. - /// - /// The provider used to generate Swagger documents. - public ConfigureSwaggerOptions(IApiVersionDescriptionProvider provider) => this.provider = provider; - - /// - public void Configure(SwaggerGenOptions options) - { - // add a swagger document for each discovered API version - // note: you might choose to skip or document deprecated API versions differently - foreach (var description in provider.ApiVersionDescriptions) - { - options.SwaggerDoc(description.GroupName, CreateInfoForApiVersion(description)); - } - } - - private static OpenApiInfo CreateInfoForApiVersion(ApiVersionDescription description) - { - var text = new StringBuilder(".NET 8 Starter Kit with Vertical Slice Architecture!"); - var info = new OpenApiInfo() - { - Title = "FSH.Starter.WebApi", - Version = description.ApiVersion.ToString(), - Contact = new OpenApiContact() { Name = "Mukesh Murugan", Email = "hello@codewithmukesh.com" } - }; - - if (description.IsDeprecated) - { - text.Append(" This API version has been deprecated."); - } - - info.Description = text.ToString(); - - return info; - } -} diff --git a/src/api/framework/Infrastructure/OpenApi/Extensions.cs b/src/api/framework/Infrastructure/OpenApi/Extensions.cs deleted file mode 100644 index df32e185fe..0000000000 --- a/src/api/framework/Infrastructure/OpenApi/Extensions.cs +++ /dev/null @@ -1,82 +0,0 @@ -using Asp.Versioning; -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Options; -using Microsoft.OpenApi.Models; -using Swashbuckle.AspNetCore.SwaggerGen; -using Swashbuckle.AspNetCore.SwaggerUI; - -namespace FSH.Framework.Infrastructure.OpenApi; - -public static class Extensions -{ - public static IServiceCollection ConfigureOpenApi(this IServiceCollection services) - { - ArgumentNullException.ThrowIfNull(services); - services.AddEndpointsApiExplorer(); - services.AddTransient, ConfigureSwaggerOptions>(); - services - .AddSwaggerGen(options => - { - options.OperationFilter(); - options.AddSecurityDefinition("bearerAuth", new OpenApiSecurityScheme - { - Type = SecuritySchemeType.Http, - Scheme = "bearer", - BearerFormat = "JWT", - Description = "JWT Authorization header using the Bearer scheme." - }); - options.AddSecurityRequirement(new OpenApiSecurityRequirement - { - { - new OpenApiSecurityScheme - { - Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "bearerAuth" } - }, - Array.Empty() - } - }); - }); - services - .AddApiVersioning(options => - { - options.ReportApiVersions = true; - options.DefaultApiVersion = new ApiVersion(1); - options.AssumeDefaultVersionWhenUnspecified = true; - options.ApiVersionReader = new UrlSegmentApiVersionReader(); - }) - .AddApiExplorer(options => - { - options.GroupNameFormat = "'v'VVV"; - }) - .EnableApiVersionBinding(); - return services; - } - public static WebApplication UseOpenApi(this WebApplication app) - { - ArgumentNullException.ThrowIfNull(app); - if (app.Environment.IsDevelopment() || app.Environment.EnvironmentName == "docker") - { - app.UseSwagger(); - app.UseSwaggerUI(options => - { - options.DocExpansion(DocExpansion.None); - options.DisplayRequestDuration(); - - var swaggerEndpoints = app.DescribeApiVersions() - .Select(desc => new - { - Url = $"../swagger/{desc.GroupName}/swagger.json", - Name = desc.GroupName.ToUpperInvariant() - }); - - foreach (var endpoint in swaggerEndpoints) - { - options.SwaggerEndpoint(endpoint.Url, endpoint.Name); - } - }); - } - return app; - } -} diff --git a/src/api/framework/Infrastructure/OpenApi/SwaggerDefaultValues.cs b/src/api/framework/Infrastructure/OpenApi/SwaggerDefaultValues.cs deleted file mode 100644 index b872e69024..0000000000 --- a/src/api/framework/Infrastructure/OpenApi/SwaggerDefaultValues.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System.Text.Json; -using Microsoft.AspNetCore.Mvc.ApiExplorer; -using Microsoft.AspNetCore.Mvc.ModelBinding; -using Microsoft.OpenApi.Models; -using Swashbuckle.AspNetCore.SwaggerGen; - -namespace FSH.Framework.Infrastructure.OpenApi; -public class SwaggerDefaultValues : IOperationFilter -{ - /// - public void Apply(OpenApiOperation operation, OperationFilterContext context) - { - ArgumentNullException.ThrowIfNull(operation); - ArgumentNullException.ThrowIfNull(context); - - var apiDescription = context.ApiDescription; - - operation.Deprecated |= apiDescription.IsDeprecated(); - - // REF: https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/1752#issue-663991077 - foreach (var responseType in context.ApiDescription.SupportedResponseTypes) - { - // REF: https://github.com/domaindrivendev/Swashbuckle.AspNetCore/blob/b7cf75e7905050305b115dd96640ddd6e74c7ac9/src/Swashbuckle.AspNetCore.SwaggerGen/SwaggerGenerator/SwaggerGenerator.cs#L383-L387 - var responseKey = responseType.IsDefaultResponse ? "default" : responseType.StatusCode.ToString(); - var response = operation.Responses[responseKey]; - - foreach (var contentType in response.Content.Keys) - { - if (!responseType.ApiResponseFormats.Any(x => x.MediaType == contentType)) - { - response.Content.Remove(contentType); - } - } - } - - if (operation.Parameters == null) - { - return; - } - - // REF: https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/412 - // REF: https://github.com/domaindrivendev/Swashbuckle.AspNetCore/pull/413 - foreach (var parameter in operation.Parameters) - { - var description = apiDescription.ParameterDescriptions.First(p => p.Name == parameter.Name); - - parameter.Description ??= description.ModelMetadata?.Description; - - if (parameter.Schema.Default == null && - description.DefaultValue != null && - description.DefaultValue is not DBNull && - description.ModelMetadata is ModelMetadata modelMetadata) - { - // REF: https://github.com/Microsoft/aspnet-api-versioning/issues/429#issuecomment-605402330 - var json = JsonSerializer.Serialize(description.DefaultValue, modelMetadata.ModelType); - parameter.Schema.Default = OpenApiAnyFactory.CreateFromJson(json); - } - - parameter.Required |= description.IsRequired; - } - } -} diff --git a/src/api/framework/Infrastructure/Persistence/AppendGlobalQueryFilterExtension.cs b/src/api/framework/Infrastructure/Persistence/AppendGlobalQueryFilterExtension.cs deleted file mode 100644 index dbd09831d1..0000000000 --- a/src/api/framework/Infrastructure/Persistence/AppendGlobalQueryFilterExtension.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Linq.Expressions; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Query; - -namespace FSH.Framework.Infrastructure.Persistence; - -internal static class ModelBuilderExtensions -{ - public static ModelBuilder AppendGlobalQueryFilter(this ModelBuilder modelBuilder, Expression> filter) - { - // get a list of entities without a baseType that implement the interface TInterface - var entities = modelBuilder.Model.GetEntityTypes() - .Where(e => e.BaseType is null && e.ClrType.GetInterface(typeof(TInterface).Name) is not null) - .Select(e => e.ClrType); - - foreach (var entity in entities) - { - var parameterType = Expression.Parameter(modelBuilder.Entity(entity).Metadata.ClrType); - var filterBody = ReplacingExpressionVisitor.Replace(filter.Parameters.Single(), parameterType, filter.Body); - - // get the existing query filter - if (modelBuilder.Entity(entity).Metadata.GetQueryFilter() is { } existingFilter) - { - var existingFilterBody = ReplacingExpressionVisitor.Replace(existingFilter.Parameters.Single(), parameterType, existingFilter.Body); - - // combine the existing query filter with the new query filter - filterBody = Expression.AndAlso(existingFilterBody, filterBody); - } - - // apply the new query filter - modelBuilder.Entity(entity).HasQueryFilter(Expression.Lambda(filterBody, parameterType)); - } - - return modelBuilder; - } -} diff --git a/src/api/framework/Infrastructure/Persistence/DbProviders.cs b/src/api/framework/Infrastructure/Persistence/DbProviders.cs deleted file mode 100644 index f330df5123..0000000000 --- a/src/api/framework/Infrastructure/Persistence/DbProviders.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace FSH.Framework.Infrastructure.Persistence; -internal static class DbProviders -{ - public const string PostgreSQL = "POSTGRESQL"; - public const string MSSQL = "MSSQL"; -} diff --git a/src/api/framework/Infrastructure/Persistence/Extensions.cs b/src/api/framework/Infrastructure/Persistence/Extensions.cs deleted file mode 100644 index dce8cb5a64..0000000000 --- a/src/api/framework/Infrastructure/Persistence/Extensions.cs +++ /dev/null @@ -1,56 +0,0 @@ -using FSH.Framework.Core.Persistence; -using FSH.Framework.Infrastructure.Persistence.Interceptors; -using Microsoft.AspNetCore.Builder; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Diagnostics; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; -using Serilog; - -namespace FSH.Framework.Infrastructure.Persistence; -public static class Extensions -{ - private static readonly ILogger Logger = Log.ForContext(typeof(Extensions)); - internal static DbContextOptionsBuilder ConfigureDatabase(this DbContextOptionsBuilder builder, string dbProvider, string connectionString) - { - builder.ConfigureWarnings(warnings => warnings.Log(RelationalEventId.PendingModelChangesWarning)); - return dbProvider.ToUpperInvariant() switch - { - DbProviders.PostgreSQL => builder.UseNpgsql(connectionString, e => - e.MigrationsAssembly("FSH.Starter.WebApi.Migrations.PostgreSQL")).EnableSensitiveDataLogging(), - DbProviders.MSSQL => builder.UseSqlServer(connectionString, e => - e.MigrationsAssembly("FSH.Starter.WebApi.Migrations.MSSQL")), - _ => throw new InvalidOperationException($"DB Provider {dbProvider} is not supported."), - }; - } - - public static WebApplicationBuilder ConfigureDatabase(this WebApplicationBuilder builder) - { - ArgumentNullException.ThrowIfNull(builder); - builder.Services.AddOptions() - .BindConfiguration(nameof(DatabaseOptions)) - .ValidateDataAnnotations() - .PostConfigure(config => - { - Logger.Information("current db provider: {DatabaseProvider}", config.Provider); - Logger.Information("for documentations and guides, visit https://www.fullstackhero.net"); - Logger.Information("to sponsor this project, visit https://opencollective.com/fullstackhero"); - }); - builder.Services.AddScoped(); - return builder; - } - - public static IServiceCollection BindDbContext(this IServiceCollection services) - where TContext : DbContext - { - ArgumentNullException.ThrowIfNull(services); - - services.AddDbContext((sp, options) => - { - var dbConfig = sp.GetRequiredService>().Value; - options.ConfigureDatabase(dbConfig.Provider, dbConfig.ConnectionString); - options.AddInterceptors(sp.GetServices()); - }); - return services; - } -} diff --git a/src/api/framework/Infrastructure/Persistence/FshDbContext.cs b/src/api/framework/Infrastructure/Persistence/FshDbContext.cs deleted file mode 100644 index 1f3186e3e5..0000000000 --- a/src/api/framework/Infrastructure/Persistence/FshDbContext.cs +++ /dev/null @@ -1,60 +0,0 @@ -using Finbuckle.MultiTenant.Abstractions; -using Finbuckle.MultiTenant.EntityFrameworkCore; -using FSH.Framework.Core.Domain.Contracts; -using FSH.Framework.Core.Persistence; -using FSH.Framework.Infrastructure.Tenant; -using MediatR; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Options; - -namespace FSH.Framework.Infrastructure.Persistence; -public class FshDbContext(IMultiTenantContextAccessor multiTenantContextAccessor, - DbContextOptions options, - IPublisher publisher, - IOptions settings) - : MultiTenantDbContext(multiTenantContextAccessor, options) -{ - private readonly IPublisher _publisher = publisher; - private readonly DatabaseOptions _settings = settings.Value; - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - // QueryFilters need to be applied before base.OnModelCreating - modelBuilder.AppendGlobalQueryFilter(s => s.Deleted == null); - base.OnModelCreating(modelBuilder); - } - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - optionsBuilder.EnableSensitiveDataLogging(); - - if (!string.IsNullOrWhiteSpace(multiTenantContextAccessor?.MultiTenantContext.TenantInfo?.ConnectionString)) - { - optionsBuilder.ConfigureDatabase(_settings.Provider, multiTenantContextAccessor.MultiTenantContext.TenantInfo.ConnectionString!); - } - } - public override async Task SaveChangesAsync(CancellationToken cancellationToken = default) - { - this.TenantNotSetMode = TenantNotSetMode.Overwrite; - int result = await base.SaveChangesAsync(cancellationToken).ConfigureAwait(false); - await PublishDomainEventsAsync().ConfigureAwait(false); - return result; - } - private async Task PublishDomainEventsAsync() - { - var domainEvents = ChangeTracker.Entries() - .Select(e => e.Entity) - .Where(e => e.DomainEvents.Count > 0) - .SelectMany(e => - { - var domainEvents = e.DomainEvents.ToList(); - e.DomainEvents.Clear(); - return domainEvents; - }) - .ToList(); - - foreach (var domainEvent in domainEvents) - { - await _publisher.Publish(domainEvent).ConfigureAwait(false); - } - } -} diff --git a/src/api/framework/Infrastructure/Persistence/Interceptors/AuditInterceptor.cs b/src/api/framework/Infrastructure/Persistence/Interceptors/AuditInterceptor.cs deleted file mode 100644 index 6c2d819cac..0000000000 --- a/src/api/framework/Infrastructure/Persistence/Interceptors/AuditInterceptor.cs +++ /dev/null @@ -1,145 +0,0 @@ -using System.Collections.ObjectModel; -using FSH.Framework.Core.Audit; -using FSH.Framework.Core.Domain; -using FSH.Framework.Core.Domain.Contracts; -using FSH.Framework.Core.Identity.Users.Abstractions; -using FSH.Framework.Infrastructure.Identity.Audit; -using MediatR; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.ChangeTracking; -using Microsoft.EntityFrameworkCore.Diagnostics; - -namespace FSH.Framework.Infrastructure.Persistence.Interceptors; -public class AuditInterceptor(ICurrentUser currentUser, TimeProvider timeProvider, IPublisher publisher) : SaveChangesInterceptor -{ - - public override ValueTask SavedChangesAsync(SaveChangesCompletedEventData eventData, int result, CancellationToken cancellationToken = default) - { - return base.SavedChangesAsync(eventData, result, cancellationToken); - } - - public override Task SaveChangesFailedAsync(DbContextErrorEventData eventData, CancellationToken cancellationToken = default) - { - return base.SaveChangesFailedAsync(eventData, cancellationToken); - } - - public override async ValueTask> SavingChangesAsync(DbContextEventData eventData, InterceptionResult result, CancellationToken cancellationToken = default) - { - UpdateEntities(eventData.Context); - await PublishAuditTrailsAsync(eventData); - return await base.SavingChangesAsync(eventData, result, cancellationToken); - } - - private async Task PublishAuditTrailsAsync(DbContextEventData eventData) - { - if (eventData.Context == null) return; - eventData.Context.ChangeTracker.DetectChanges(); - var trails = new List(); - var utcNow = timeProvider.GetUtcNow(); - foreach (var entry in eventData.Context.ChangeTracker.Entries().Where(x => x.State is EntityState.Added or EntityState.Deleted or EntityState.Modified).ToList()) - { - var userId = currentUser.GetUserId(); - var trail = new TrailDto() - { - Id = Guid.NewGuid(), - TableName = entry.Entity.GetType().Name, - UserId = userId, - DateTime = utcNow - }; - - foreach (var property in entry.Properties) - { - if (property.IsTemporary) - { - continue; - } - string propertyName = property.Metadata.Name; - if (property.Metadata.IsPrimaryKey()) - { - trail.KeyValues[propertyName] = property.CurrentValue; - continue; - } - - switch (entry.State) - { - case EntityState.Added: - trail.Type = TrailType.Create; - trail.NewValues[propertyName] = property.CurrentValue; - break; - - case EntityState.Deleted: - trail.Type = TrailType.Delete; - trail.OldValues[propertyName] = property.OriginalValue; - break; - - case EntityState.Modified: - if (property.IsModified) - { - if (entry.Entity is ISoftDeletable && property.OriginalValue == null && property.CurrentValue != null) - { - trail.ModifiedProperties.Add(propertyName); - trail.Type = TrailType.Delete; - trail.OldValues[propertyName] = property.OriginalValue; - trail.NewValues[propertyName] = property.CurrentValue; - } - else if (property.OriginalValue?.Equals(property.CurrentValue) == false) - { - trail.ModifiedProperties.Add(propertyName); - trail.Type = TrailType.Update; - trail.OldValues[propertyName] = property.OriginalValue; - trail.NewValues[propertyName] = property.CurrentValue; - } - else - { - property.IsModified = false; - } - } - break; - } - } - - trails.Add(trail); - } - if (trails.Count == 0) return; - var auditTrails = new Collection(); - foreach (var trail in trails) - { - auditTrails.Add(trail.ToAuditTrail()); - } - await publisher.Publish(new AuditPublishedEvent(auditTrails)); - } - - public void UpdateEntities(DbContext? context) - { - if (context == null) return; - foreach (var entry in context.ChangeTracker.Entries()) - { - var utcNow = timeProvider.GetUtcNow(); - if (entry.State is EntityState.Added or EntityState.Modified || entry.HasChangedOwnedEntities()) - { - if (entry.State == EntityState.Added) - { - entry.Entity.CreatedBy = currentUser.GetUserId(); - entry.Entity.Created = utcNow; - } - entry.Entity.LastModifiedBy = currentUser.GetUserId(); - entry.Entity.LastModified = utcNow; - } - if(entry.State is EntityState.Deleted && entry.Entity is ISoftDeletable softDelete) - { - softDelete.DeletedBy = currentUser.GetUserId(); - softDelete.Deleted = utcNow; - entry.State = EntityState.Modified; - } - } - } -} - -public static class Extensions -{ - public static bool HasChangedOwnedEntities(this EntityEntry entry) => - entry.References.Any(r => - r.TargetEntry != null && - r.TargetEntry.Metadata.IsOwned() && - (r.TargetEntry.State == EntityState.Added || r.TargetEntry.State == EntityState.Modified)); -} diff --git a/src/api/framework/Infrastructure/Persistence/Services/ConnectionStringValidator.cs b/src/api/framework/Infrastructure/Persistence/Services/ConnectionStringValidator.cs deleted file mode 100644 index 2b39de48d8..0000000000 --- a/src/api/framework/Infrastructure/Persistence/Services/ConnectionStringValidator.cs +++ /dev/null @@ -1,44 +0,0 @@ -using FSH.Framework.Core.Persistence; -using Microsoft.Data.SqlClient; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; -using Npgsql; - -namespace FSH.Framework.Infrastructure.Persistence.Services; -internal sealed class ConnectionStringValidator(IOptions dbSettings, ILogger logger) : IConnectionStringValidator -{ - private readonly DatabaseOptions _dbSettings = dbSettings.Value; - private readonly ILogger _logger = logger; - - public bool TryValidate(string connectionString, string? dbProvider = null) - { - if (string.IsNullOrWhiteSpace(dbProvider)) - { - dbProvider = _dbSettings.Provider; - } - - try - { - switch (dbProvider?.ToUpperInvariant()) - { - case DbProviders.PostgreSQL: - _ = new NpgsqlConnectionStringBuilder(connectionString); - break; - case DbProviders.MSSQL: - _ = new SqlConnectionStringBuilder(connectionString); - break; - default: - break; - } - - return true; - } - catch (Exception ex) - { -#pragma warning disable S6667 // Logging in a catch clause should pass the caught exception as a parameter. - _logger.LogError("Connection String Validation Exception : {Error}", ex.Message); -#pragma warning restore S6667 // Logging in a catch clause should pass the caught exception as a parameter. - return false; - } - } -} diff --git a/src/api/framework/Infrastructure/RateLimit/Extensions.cs b/src/api/framework/Infrastructure/RateLimit/Extensions.cs deleted file mode 100644 index 3b00e7d85f..0000000000 --- a/src/api/framework/Infrastructure/RateLimit/Extensions.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System.Threading.RateLimiting; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.RateLimiting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; - -namespace FSH.Framework.Infrastructure.RateLimit; - -public static class Extensions -{ - internal static IServiceCollection ConfigureRateLimit(this IServiceCollection services, IConfiguration config) - { - services.Configure(config.GetSection(nameof(RateLimitOptions))); - - var options = config.GetSection(nameof(RateLimitOptions)).Get(); - if (options is { EnableRateLimiting: true }) - { - services.AddRateLimiter(rateLimitOptions => - { - rateLimitOptions.GlobalLimiter = PartitionedRateLimiter.Create(httpContext => - { - return RateLimitPartition.GetFixedWindowLimiter(partitionKey: httpContext.Request.Headers.Host.ToString(), - factory: _ => new FixedWindowRateLimiterOptions - { - PermitLimit = options.PermitLimit, - Window = TimeSpan.FromSeconds(options.WindowInSeconds) - }); - }); - - rateLimitOptions.RejectionStatusCode = options.RejectionStatusCode; - rateLimitOptions.OnRejected = async (context, token) => - { - var message = BuildRateLimitResponseMessage(context); - - await context.HttpContext.Response.WriteAsync(message, cancellationToken: token); - }; - }); - } - - return services; - } - - internal static IApplicationBuilder UseRateLimit(this IApplicationBuilder app) - { - var options = app.ApplicationServices.GetRequiredService>().Value; - - if (options.EnableRateLimiting) - { - app.UseRateLimiter(); - } - - return app; - } - - private static string BuildRateLimitResponseMessage(OnRejectedContext onRejectedContext) - { - var hostName = onRejectedContext.HttpContext.Request.Headers.Host.ToString(); - - return $"You have reached the maximum number of requests allowed for the address ({hostName})."; - } -} diff --git a/src/api/framework/Infrastructure/RateLimit/RateLimitOptions.cs b/src/api/framework/Infrastructure/RateLimit/RateLimitOptions.cs deleted file mode 100644 index 6fd364c5d1..0000000000 --- a/src/api/framework/Infrastructure/RateLimit/RateLimitOptions.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace FSH.Framework.Infrastructure.RateLimit; - -public class RateLimitOptions -{ - public bool EnableRateLimiting { get; init; } - public int PermitLimit { get; init; } - public int WindowInSeconds { get; init; } - public int RejectionStatusCode { get; init; } -} diff --git a/src/api/framework/Infrastructure/SecurityHeaders/Extensions.cs b/src/api/framework/Infrastructure/SecurityHeaders/Extensions.cs deleted file mode 100644 index 7d8ea168c7..0000000000 --- a/src/api/framework/Infrastructure/SecurityHeaders/Extensions.cs +++ /dev/null @@ -1,69 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; - -namespace FSH.Framework.Infrastructure.SecurityHeaders; - -public static class Extensions -{ - internal static IServiceCollection ConfigureSecurityHeaders(this IServiceCollection services, IConfiguration config) - { - services.Configure(config.GetSection(nameof(SecurityHeaderOptions))); - - return services; - } - - internal static IApplicationBuilder UseSecurityHeaders(this IApplicationBuilder app) - { - var options = app.ApplicationServices.GetRequiredService>().Value; - - if (options.Enable) - { - app.Use(async (context, next) => - { - if (!context.Response.HasStarted) - { - if (!string.IsNullOrWhiteSpace(options.Headers.XFrameOptions)) - { - context.Response.Headers.XFrameOptions = options.Headers.XFrameOptions; - } - - if (!string.IsNullOrWhiteSpace(options.Headers.XContentTypeOptions)) - { - context.Response.Headers.XContentTypeOptions = options.Headers.XContentTypeOptions; - } - - if (!string.IsNullOrWhiteSpace(options.Headers.ReferrerPolicy)) - { - context.Response.Headers.Referer = options.Headers.ReferrerPolicy; - } - - if (!string.IsNullOrWhiteSpace(options.Headers.PermissionsPolicy)) - { - context.Response.Headers["Permissions-Policy"] = options.Headers.PermissionsPolicy; - } - - if (!string.IsNullOrWhiteSpace(options.Headers.XXSSProtection)) - { - context.Response.Headers.XXSSProtection = options.Headers.XXSSProtection; - } - - if (!string.IsNullOrWhiteSpace(options.Headers.ContentSecurityPolicy)) - { - context.Response.Headers.ContentSecurityPolicy = options.Headers.ContentSecurityPolicy; - } - - if (!string.IsNullOrWhiteSpace(options.Headers.StrictTransportSecurity)) - { - context.Response.Headers.StrictTransportSecurity = options.Headers.StrictTransportSecurity; - } - } - - await next.Invoke(); - }); - } - - return app; - } -} diff --git a/src/api/framework/Infrastructure/SecurityHeaders/SecurityHeaderOptions.cs b/src/api/framework/Infrastructure/SecurityHeaders/SecurityHeaderOptions.cs deleted file mode 100644 index 4fac61a596..0000000000 --- a/src/api/framework/Infrastructure/SecurityHeaders/SecurityHeaderOptions.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace FSH.Framework.Infrastructure.SecurityHeaders; - -public class SecurityHeaderOptions -{ - public bool Enable { get; set; } - public SecurityHeaders Headers { get; set; } = default!; -} diff --git a/src/api/framework/Infrastructure/SecurityHeaders/SecurityHeaders.cs b/src/api/framework/Infrastructure/SecurityHeaders/SecurityHeaders.cs deleted file mode 100644 index 596d99a175..0000000000 --- a/src/api/framework/Infrastructure/SecurityHeaders/SecurityHeaders.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace FSH.Framework.Infrastructure.SecurityHeaders; - -public class SecurityHeaders -{ - public string? XContentTypeOptions { get; set; } - public string? ReferrerPolicy { get; set; } - public string? XXSSProtection { get; set; } - public string? XFrameOptions { get; set; } - public string? ContentSecurityPolicy { get; set; } - public string? PermissionsPolicy { get; set; } - public string? StrictTransportSecurity { get; set; } -} diff --git a/src/api/framework/Infrastructure/Storage/Files/Extension.cs b/src/api/framework/Infrastructure/Storage/Files/Extension.cs deleted file mode 100644 index 6699f126d2..0000000000 --- a/src/api/framework/Infrastructure/Storage/Files/Extension.cs +++ /dev/null @@ -1,25 +0,0 @@ -using FSH.Framework.Core.Storage; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.FileProviders; - -namespace FSH.Framework.Infrastructure.Storage.Files; - -internal static class Extension -{ - internal static IServiceCollection ConfigureFileStorage(this IServiceCollection services) - { - ArgumentNullException.ThrowIfNull(services); - services.AddTransient(); - - return services; - } - - internal static IApplicationBuilder UseFileStorage(this IApplicationBuilder app) => - app.UseStaticFiles(new StaticFileOptions() - { - FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "Files")), - RequestPath = new PathString("/Files") - }); -} diff --git a/src/api/framework/Infrastructure/Storage/Files/LocalFileStorageService.cs b/src/api/framework/Infrastructure/Storage/Files/LocalFileStorageService.cs deleted file mode 100644 index 16b786da6f..0000000000 --- a/src/api/framework/Infrastructure/Storage/Files/LocalFileStorageService.cs +++ /dev/null @@ -1,133 +0,0 @@ -using System.Runtime.InteropServices; -using System.Text.RegularExpressions; -using FSH.Framework.Core.Origin; -using FSH.Framework.Core.Storage; -using FSH.Framework.Core.Storage.File; -using FSH.Framework.Core.Storage.File.Features; -using FSH.Framework.Infrastructure.Common.Extensions; -using Microsoft.Extensions.Options; -namespace FSH.Framework.Infrastructure.Storage.Files -{ - public class LocalFileStorageService(IOptions originSettings) : IStorageService - { - public async Task UploadAsync(FileUploadCommand? request, FileType supportedFileType, CancellationToken cancellationToken = default) - where T : class - { - if (request == null || request.Data == null) - { - return null!; - } - - if (request.Extension is null || !supportedFileType.GetDescriptionList().Contains(request.Extension.ToLower(System.Globalization.CultureInfo.CurrentCulture))) - throw new InvalidOperationException("File Format Not Supported."); - if (request.Name is null) - throw new InvalidOperationException("Name is required."); - - string base64Data = Regex.Match(request.Data, "data:image/(?.+?),(?.+)").Groups["data"].Value; - - var streamData = new MemoryStream(Convert.FromBase64String(base64Data)); - if (streamData.Length > 0) - { - string folder = typeof(T).Name; - if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - folder = folder.Replace(@"\", "/", StringComparison.Ordinal); - } - - string folderName = supportedFileType switch - { - FileType.Image => Path.Combine("assets", "images", folder), - _ => Path.Combine("assets", "others", folder), - }; - string pathToSave = Path.Combine(Directory.GetCurrentDirectory(), folderName); - Directory.CreateDirectory(pathToSave); - - string fileName = request.Name.Trim('"'); - fileName = RemoveSpecialCharacters(fileName); - fileName = fileName.ReplaceWhitespace("-"); - fileName += request.Extension.Trim(); - string fullPath = Path.Combine(pathToSave, fileName); - string dbPath = Path.Combine(folderName, fileName); - if (File.Exists(dbPath)) - { - dbPath = NextAvailableFilename(dbPath); - fullPath = NextAvailableFilename(fullPath); - } - - using var stream = new FileStream(fullPath, FileMode.Create); - await streamData.CopyToAsync(stream, cancellationToken); - var path = dbPath.Replace("\\", "/", StringComparison.Ordinal); - var imageUri = new Uri(originSettings.Value.OriginUrl!, path); - return imageUri; - } - else - { - return null!; - } - } - - public static string RemoveSpecialCharacters(string str) - { - return Regex.Replace(str, "[^a-zA-Z0-9_.]+", string.Empty, RegexOptions.Compiled); - } - - public void Remove(Uri? path) - { - var pathString = path!.ToString(); - if (File.Exists(pathString)) - { - File.Delete(pathString); - } - } - - private const string NumberPattern = "-{0}"; - - private static string NextAvailableFilename(string path) - { - if (!File.Exists(path)) - { - return path; - } - - if (Path.HasExtension(path)) - { - return GetNextFilename(path.Insert(path.LastIndexOf(Path.GetExtension(path), StringComparison.Ordinal), NumberPattern)); - } - - return GetNextFilename(path + NumberPattern); - } - - private static string GetNextFilename(string pattern) - { - string tmp = string.Format(pattern, 1); - - if (!File.Exists(tmp)) - { - return tmp; - } - - int min = 1, max = 2; - - while (File.Exists(string.Format(pattern, max))) - { - min = max; - max *= 2; - } - - while (max != min + 1) - { - int pivot = (max + min) / 2; - if (File.Exists(string.Format(pattern, pivot))) - { - min = pivot; - } - else - { - max = pivot; - } - } - - return string.Format(pattern, max); - } - } -} diff --git a/src/api/framework/Infrastructure/Tenant/Abstractions/IFshTenantInfo.cs b/src/api/framework/Infrastructure/Tenant/Abstractions/IFshTenantInfo.cs deleted file mode 100644 index 843820200f..0000000000 --- a/src/api/framework/Infrastructure/Tenant/Abstractions/IFshTenantInfo.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Finbuckle.MultiTenant.Abstractions; - -namespace FSH.Framework.Infrastructure.Tenant.Abstractions; -public interface IFshTenantInfo : ITenantInfo -{ - string? ConnectionString { get; set; } -} diff --git a/src/api/framework/Infrastructure/Tenant/Endpoints/ActivateTenantEndpoint.cs b/src/api/framework/Infrastructure/Tenant/Endpoints/ActivateTenantEndpoint.cs deleted file mode 100644 index 4f2f24f87b..0000000000 --- a/src/api/framework/Infrastructure/Tenant/Endpoints/ActivateTenantEndpoint.cs +++ /dev/null @@ -1,19 +0,0 @@ -using FSH.Framework.Core.Tenant.Features.ActivateTenant; -using FSH.Framework.Infrastructure.Auth.Policy; -using MediatR; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Tenant.Endpoints; -public static class ActivateTenantEndpoint -{ - internal static RouteHandlerBuilder MapActivateTenantEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapPost("/{id}/activate", (ISender mediator, string id) => mediator.Send(new ActivateTenantCommand(id))) - .WithName(nameof(ActivateTenantEndpoint)) - .WithSummary("activate tenant") - .RequirePermission("Permissions.Tenants.Update") - .WithDescription("activate tenant"); - } -} diff --git a/src/api/framework/Infrastructure/Tenant/Endpoints/CreateTenantEndpoint.cs b/src/api/framework/Infrastructure/Tenant/Endpoints/CreateTenantEndpoint.cs deleted file mode 100644 index 51d8a9f6fd..0000000000 --- a/src/api/framework/Infrastructure/Tenant/Endpoints/CreateTenantEndpoint.cs +++ /dev/null @@ -1,19 +0,0 @@ -using FSH.Framework.Core.Tenant.Features.CreateTenant; -using FSH.Framework.Infrastructure.Auth.Policy; -using MediatR; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Tenant.Endpoints; -public static class CreateTenantEndpoint -{ - internal static RouteHandlerBuilder MapRegisterTenantEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapPost("/", (CreateTenantCommand request, ISender mediator) => mediator.Send(request)) - .WithName(nameof(CreateTenantEndpoint)) - .WithSummary("creates a tenant") - .RequirePermission("Permissions.Tenants.Create") - .WithDescription("creates a tenant"); - } -} diff --git a/src/api/framework/Infrastructure/Tenant/Endpoints/DisableTenantEndpoint.cs b/src/api/framework/Infrastructure/Tenant/Endpoints/DisableTenantEndpoint.cs deleted file mode 100644 index 64ef613204..0000000000 --- a/src/api/framework/Infrastructure/Tenant/Endpoints/DisableTenantEndpoint.cs +++ /dev/null @@ -1,19 +0,0 @@ -using FSH.Framework.Core.Tenant.Features.DisableTenant; -using FSH.Framework.Infrastructure.Auth.Policy; -using MediatR; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Tenant.Endpoints; -public static class DisableTenantEndpoint -{ - internal static RouteHandlerBuilder MapDisableTenantEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapPost("/{id}/deactivate", (ISender mediator, string id) => mediator.Send(new DisableTenantCommand(id))) - .WithName(nameof(DisableTenantEndpoint)) - .WithSummary("activate tenant") - .RequirePermission("Permissions.Tenants.Update") - .WithDescription("activate tenant"); - } -} diff --git a/src/api/framework/Infrastructure/Tenant/Endpoints/Extensions.cs b/src/api/framework/Infrastructure/Tenant/Endpoints/Extensions.cs deleted file mode 100644 index bc88511001..0000000000 --- a/src/api/framework/Infrastructure/Tenant/Endpoints/Extensions.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Tenant.Endpoints; -public static class Extensions -{ - public static IEndpointRouteBuilder MapTenantEndpoints(this IEndpointRouteBuilder app) - { - var tenantGroup = app.MapGroup("api/tenants").WithTags("tenants"); - tenantGroup.MapRegisterTenantEndpoint(); - tenantGroup.MapGetTenantsEndpoint(); - tenantGroup.MapGetTenantByIdEndpoint(); - tenantGroup.MapUpgradeTenantSubscriptionEndpoint(); - tenantGroup.MapActivateTenantEndpoint(); - tenantGroup.MapDisableTenantEndpoint(); - return app; - } -} diff --git a/src/api/framework/Infrastructure/Tenant/Endpoints/GetTenantByIdEndpoint.cs b/src/api/framework/Infrastructure/Tenant/Endpoints/GetTenantByIdEndpoint.cs deleted file mode 100644 index a429ac62e4..0000000000 --- a/src/api/framework/Infrastructure/Tenant/Endpoints/GetTenantByIdEndpoint.cs +++ /dev/null @@ -1,19 +0,0 @@ -using FSH.Framework.Core.Tenant.Features.GetTenantById; -using FSH.Framework.Infrastructure.Auth.Policy; -using MediatR; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Tenant.Endpoints; -public static class GetTenantByIdEndpoint -{ - internal static RouteHandlerBuilder MapGetTenantByIdEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapGet("/{id}", (ISender mediator, string id) => mediator.Send(new GetTenantByIdQuery(id))) - .WithName(nameof(GetTenantByIdEndpoint)) - .WithSummary("get tenant by id") - .RequirePermission("Permissions.Tenants.View") - .WithDescription("get tenant by id"); - } -} diff --git a/src/api/framework/Infrastructure/Tenant/Endpoints/GetTenantsEndpoint.cs b/src/api/framework/Infrastructure/Tenant/Endpoints/GetTenantsEndpoint.cs deleted file mode 100644 index 1bf590deb4..0000000000 --- a/src/api/framework/Infrastructure/Tenant/Endpoints/GetTenantsEndpoint.cs +++ /dev/null @@ -1,19 +0,0 @@ -using FSH.Framework.Core.Tenant.Features.GetTenants; -using FSH.Framework.Infrastructure.Auth.Policy; -using MediatR; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Tenant.Endpoints; -public static class GetTenantsEndpoint -{ - internal static RouteHandlerBuilder MapGetTenantsEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapGet("/", (ISender mediator) => mediator.Send(new GetTenantsQuery())) - .WithName(nameof(GetTenantsEndpoint)) - .WithSummary("get tenants") - .RequirePermission("Permissions.Tenants.View") - .WithDescription("get tenants"); - } -} diff --git a/src/api/framework/Infrastructure/Tenant/Endpoints/UpgradeSubscriptionEndpoint.cs b/src/api/framework/Infrastructure/Tenant/Endpoints/UpgradeSubscriptionEndpoint.cs deleted file mode 100644 index 182330544f..0000000000 --- a/src/api/framework/Infrastructure/Tenant/Endpoints/UpgradeSubscriptionEndpoint.cs +++ /dev/null @@ -1,20 +0,0 @@ -using FSH.Framework.Core.Tenant.Features.UpgradeSubscription; -using FSH.Framework.Infrastructure.Auth.Policy; -using MediatR; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Framework.Infrastructure.Tenant.Endpoints; - -public static class UpgradeSubscriptionEndpoint -{ - internal static RouteHandlerBuilder MapUpgradeTenantSubscriptionEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapPost("/upgrade", (UpgradeSubscriptionCommand command, ISender mediator) => mediator.Send(command)) - .WithName(nameof(UpgradeSubscriptionEndpoint)) - .WithSummary("upgrade tenant subscription") - .RequirePermission("Permissions.Tenants.Update") - .WithDescription("upgrade tenant subscription"); - } -} diff --git a/src/api/framework/Infrastructure/Tenant/Extensions.cs b/src/api/framework/Infrastructure/Tenant/Extensions.cs deleted file mode 100644 index f7fea460cd..0000000000 --- a/src/api/framework/Infrastructure/Tenant/Extensions.cs +++ /dev/null @@ -1,136 +0,0 @@ -using Finbuckle.MultiTenant; -using Finbuckle.MultiTenant.Abstractions; -using Finbuckle.MultiTenant.Stores.DistributedCacheStore; -using FSH.Framework.Core.Persistence; -using FSH.Framework.Core.Tenant.Abstractions; -using FSH.Framework.Infrastructure.Persistence; -using FSH.Framework.Infrastructure.Persistence.Services; -using FSH.Framework.Infrastructure.Tenant.Persistence; -using FSH.Framework.Infrastructure.Tenant.Services; -using FSH.Starter.Shared.Authorization; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; -using Serilog; - -namespace FSH.Framework.Infrastructure.Tenant; -internal static class Extensions -{ - public static IServiceCollection ConfigureMultitenancy(this IServiceCollection services) - { - ArgumentNullException.ThrowIfNull(services); - services.AddTransient(); - services.BindDbContext(); - services - .AddMultiTenant(config => - { - // to save database calls to resolve tenant - // this was happening for every request earlier, leading to ineffeciency - config.Events.OnTenantResolveCompleted = async (context) => - { - if (context.MultiTenantContext.StoreInfo is null) return; - if (context.MultiTenantContext.StoreInfo.StoreType != typeof(DistributedCacheStore)) - { - var sp = ((HttpContext)context.Context!).RequestServices; - var distributedCacheStore = sp - .GetService>>()! - .FirstOrDefault(s => s.GetType() == typeof(DistributedCacheStore)); - - await distributedCacheStore!.TryAddAsync(context.MultiTenantContext.TenantInfo!); - } - await Task.FromResult(0); - }; - }) - .WithClaimStrategy(FshClaims.Tenant) - .WithHeaderStrategy(TenantConstants.Identifier) - .WithDelegateStrategy(async context => - { - if (context is not HttpContext httpContext) - return null; - if (!httpContext.Request.Query.TryGetValue("tenant", out var tenantIdentifier) || string.IsNullOrEmpty(tenantIdentifier)) - return null; - return await Task.FromResult(tenantIdentifier.ToString()); - }) - .WithDistributedCacheStore(TimeSpan.FromMinutes(60)) - .WithEFCoreStore(); - services.AddScoped(); - return services; - } - - public static WebApplication UseMultitenancy(this WebApplication app) - { - ArgumentNullException.ThrowIfNull(app); - app.UseMultiTenant(); - - // set up tenant store - var tenants = TenantStoreSetup(app); - - // set up tenant databases - app.SetupTenantDatabases(tenants); - - return app; - } - - private static IApplicationBuilder SetupTenantDatabases(this IApplicationBuilder app, IEnumerable tenants) - { - foreach (var tenant in tenants) - { - // create a scope for tenant - using var tenantScope = app.ApplicationServices.CreateScope(); - - //set current tenant so that the right connection string is used - tenantScope.ServiceProvider.GetRequiredService() - .MultiTenantContext = new MultiTenantContext() - { - TenantInfo = tenant - }; - - // using the scope, perform migrations / seeding - var initializers = tenantScope.ServiceProvider.GetServices(); - foreach (var initializer in initializers) - { - initializer.MigrateAsync(CancellationToken.None).Wait(); - initializer.SeedAsync(CancellationToken.None).Wait(); - } - } - return app; - } - - private static IEnumerable TenantStoreSetup(IApplicationBuilder app) - { - var scope = app.ApplicationServices.CreateScope(); - - // tenant master schema migration - var tenantDbContext = scope.ServiceProvider.GetRequiredService(); - if (tenantDbContext.Database.GetPendingMigrations().Any()) - { - tenantDbContext.Database.Migrate(); - Log.Information("applied database migrations for tenant module"); - } - - // default tenant seeding - if (tenantDbContext.TenantInfo.Find(TenantConstants.Root.Id) is null) - { - var rootTenant = new FshTenantInfo( - TenantConstants.Root.Id, - TenantConstants.Root.Name, - string.Empty, - TenantConstants.Root.EmailAddress); - - rootTenant.SetValidity(DateTime.UtcNow.AddYears(1)); - tenantDbContext.TenantInfo.Add(rootTenant); - tenantDbContext.SaveChanges(); - Log.Information("configured default tenant data"); - } - - // get all tenants from store - var tenantStore = scope.ServiceProvider.GetRequiredService>(); - var tenants = tenantStore.GetAllAsync().Result; - - //dispose scope - scope.Dispose(); - - return tenants; - } -} diff --git a/src/api/framework/Infrastructure/Tenant/FshTenantInfo.cs b/src/api/framework/Infrastructure/Tenant/FshTenantInfo.cs deleted file mode 100644 index 7be7d62d3e..0000000000 --- a/src/api/framework/Infrastructure/Tenant/FshTenantInfo.cs +++ /dev/null @@ -1,68 +0,0 @@ -using Finbuckle.MultiTenant.Abstractions; -using FSH.Framework.Core.Exceptions; -using FSH.Framework.Infrastructure.Tenant.Abstractions; -using FSH.Starter.Shared.Authorization; - -namespace FSH.Framework.Infrastructure.Tenant; -public sealed class FshTenantInfo : IFshTenantInfo -{ - public FshTenantInfo() - { - } - - public FshTenantInfo(string id, string name, string? connectionString, string adminEmail, string? issuer = null) - { - Id = id; - Identifier = id; - Name = name; - ConnectionString = connectionString ?? string.Empty; - AdminEmail = adminEmail; - IsActive = true; - Issuer = issuer; - - // Add Default 1 Month Validity for all new tenants. Something like a DEMO period for tenants. - ValidUpto = DateTime.UtcNow.AddMonths(1); - } - public string Id { get; set; } = default!; - public string Identifier { get; set; } = default!; - - public string Name { get; set; } = default!; - public string ConnectionString { get; set; } = default!; - - public string AdminEmail { get; set; } = default!; - public bool IsActive { get; set; } - public DateTime ValidUpto { get; set; } - public string? Issuer { get; set; } - - public void AddValidity(int months) => - ValidUpto = ValidUpto.AddMonths(months); - - public void SetValidity(in DateTime validTill) => - ValidUpto = ValidUpto < validTill - ? validTill - : throw new FshException("Subscription cannot be backdated."); - - public void Activate() - { - if (Id == TenantConstants.Root.Id) - { - throw new InvalidOperationException("Invalid Tenant"); - } - - IsActive = true; - } - - public void Deactivate() - { - if (Id == TenantConstants.Root.Id) - { - throw new InvalidOperationException("Invalid Tenant"); - } - - IsActive = false; - } - string? ITenantInfo.Id { get => Id; set => Id = value ?? throw new InvalidOperationException("Id can't be null."); } - string? ITenantInfo.Identifier { get => Identifier; set => Identifier = value ?? throw new InvalidOperationException("Identifier can't be null."); } - string? ITenantInfo.Name { get => Name; set => Name = value ?? throw new InvalidOperationException("Name can't be null."); } - string? IFshTenantInfo.ConnectionString { get => ConnectionString; set => ConnectionString = value ?? throw new InvalidOperationException("ConnectionString can't be null."); } -} diff --git a/src/api/framework/Infrastructure/Tenant/Persistence/TenantDbContext.cs b/src/api/framework/Infrastructure/Tenant/Persistence/TenantDbContext.cs deleted file mode 100644 index d778a7ce59..0000000000 --- a/src/api/framework/Infrastructure/Tenant/Persistence/TenantDbContext.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Finbuckle.MultiTenant.EntityFrameworkCore.Stores.EFCoreStore; -using Microsoft.EntityFrameworkCore; - -namespace FSH.Framework.Infrastructure.Tenant.Persistence; -public class TenantDbContext : EFCoreStoreDbContext -{ - public const string Schema = "tenant"; - public TenantDbContext(DbContextOptions options) - : base(options) - { - AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true); - } - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - ArgumentNullException.ThrowIfNull(modelBuilder); - - base.OnModelCreating(modelBuilder); - - modelBuilder.Entity().ToTable("Tenants", Schema); - } -} diff --git a/src/api/framework/Infrastructure/Tenant/Services/TenantService.cs b/src/api/framework/Infrastructure/Tenant/Services/TenantService.cs deleted file mode 100644 index bfc8458cf4..0000000000 --- a/src/api/framework/Infrastructure/Tenant/Services/TenantService.cs +++ /dev/null @@ -1,120 +0,0 @@ -using Finbuckle.MultiTenant; -using Finbuckle.MultiTenant.Abstractions; -using FSH.Framework.Core.Exceptions; -using FSH.Framework.Core.Persistence; -using FSH.Framework.Core.Tenant.Abstractions; -using FSH.Framework.Core.Tenant.Dtos; -using FSH.Framework.Core.Tenant.Features.CreateTenant; -using Mapster; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; - -namespace FSH.Framework.Infrastructure.Tenant.Services; - -public sealed class TenantService : ITenantService -{ - private readonly IMultiTenantStore _tenantStore; - private readonly DatabaseOptions _config; - private readonly IServiceProvider _serviceProvider; - - public TenantService(IMultiTenantStore tenantStore, IOptions config, IServiceProvider serviceProvider) - { - _tenantStore = tenantStore; - _config = config.Value; - _serviceProvider = serviceProvider; - } - - public async Task ActivateAsync(string id, CancellationToken cancellationToken) - { - var tenant = await GetTenantInfoAsync(id).ConfigureAwait(false); - - if (tenant.IsActive) - { - throw new FshException($"tenant {id} is already activated"); - } - - tenant.Activate(); - - await _tenantStore.TryUpdateAsync(tenant).ConfigureAwait(false); - - return $"tenant {id} is now activated"; - } - - public async Task CreateAsync(CreateTenantCommand request, CancellationToken cancellationToken) - { - var connectionString = request.ConnectionString; - if (request.ConnectionString?.Trim() == _config.ConnectionString.Trim()) - { - connectionString = string.Empty; - } - - FshTenantInfo tenant = new(request.Id, request.Name, connectionString, request.AdminEmail, request.Issuer); - await _tenantStore.TryAddAsync(tenant).ConfigureAwait(false); - - await InitializeDatabase(tenant).ConfigureAwait(false); - - return tenant.Id; - } - - private async Task InitializeDatabase(FshTenantInfo tenant) - { - // First create a new scope - using var scope = _serviceProvider.CreateScope(); - - // Then set current tenant so the right connection string is used - scope.ServiceProvider.GetRequiredService() - .MultiTenantContext = new MultiTenantContext() - { - TenantInfo = tenant - }; - - // using the scope, perform migrations / seeding - var initializers = scope.ServiceProvider.GetServices(); - foreach (var initializer in initializers) - { - await initializer.MigrateAsync(CancellationToken.None).ConfigureAwait(false); - await initializer.SeedAsync(CancellationToken.None).ConfigureAwait(false); - } - } - - public async Task DeactivateAsync(string id) - { - var tenant = await GetTenantInfoAsync(id).ConfigureAwait(false); - if (!tenant.IsActive) - { - throw new FshException($"tenant {id} is already deactivated"); - } - - tenant.Deactivate(); - await _tenantStore.TryUpdateAsync(tenant).ConfigureAwait(false); - return $"tenant {id} is now deactivated"; - } - - public async Task ExistsWithIdAsync(string id) => - await _tenantStore.TryGetAsync(id).ConfigureAwait(false) is not null; - - public async Task ExistsWithNameAsync(string name) => - (await _tenantStore.GetAllAsync().ConfigureAwait(false)).Any(t => t.Name == name); - - public async Task> GetAllAsync() - { - var tenants = (await _tenantStore.GetAllAsync().ConfigureAwait(false)).Adapt>(); - return tenants; - } - - public async Task GetByIdAsync(string id) => - (await GetTenantInfoAsync(id).ConfigureAwait(false)) - .Adapt(); - - public async Task UpgradeSubscription(string id, DateTime extendedExpiryDate) - { - var tenant = await GetTenantInfoAsync(id).ConfigureAwait(false); - tenant.SetValidity(extendedExpiryDate); - await _tenantStore.TryUpdateAsync(tenant).ConfigureAwait(false); - return tenant.ValidUpto; - } - - private async Task GetTenantInfoAsync(string id) => - await _tenantStore.TryGetAsync(id).ConfigureAwait(false) - ?? throw new NotFoundException($"{typeof(FshTenantInfo).Name} {id} Not Found."); -} diff --git a/src/api/migrations/MSSQL/Catalog/20241123030623_Add Catalog Schema.Designer.cs b/src/api/migrations/MSSQL/Catalog/20241123030623_Add Catalog Schema.Designer.cs deleted file mode 100644 index ee52283a6f..0000000000 --- a/src/api/migrations/MSSQL/Catalog/20241123030623_Add Catalog Schema.Designer.cs +++ /dev/null @@ -1,138 +0,0 @@ -// -using System; -using FSH.Starter.WebApi.Catalog.Infrastructure.Persistence; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace FSH.Starter.WebApi.Migrations.MSSQL.Catalog -{ - [DbContext(typeof(CatalogDbContext))] - [Migration("20241123030623_Add Catalog Schema")] - partial class AddCatalogSchema - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasDefaultSchema("catalog") - .HasAnnotation("ProductVersion", "9.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("FSH.Starter.WebApi.Catalog.Domain.Brand", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Created") - .HasColumnType("datetimeoffset"); - - b.Property("CreatedBy") - .HasColumnType("uniqueidentifier"); - - b.Property("Deleted") - .HasColumnType("datetimeoffset"); - - b.Property("DeletedBy") - .HasColumnType("uniqueidentifier"); - - b.Property("Description") - .HasMaxLength(1000) - .HasColumnType("nvarchar(1000)"); - - b.Property("LastModified") - .HasColumnType("datetimeoffset"); - - b.Property("LastModifiedBy") - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("nvarchar(100)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.HasKey("Id"); - - b.ToTable("Brands", "catalog"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("FSH.Starter.WebApi.Catalog.Domain.Product", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("BrandId") - .HasColumnType("uniqueidentifier"); - - b.Property("Created") - .HasColumnType("datetimeoffset"); - - b.Property("CreatedBy") - .HasColumnType("uniqueidentifier"); - - b.Property("Deleted") - .HasColumnType("datetimeoffset"); - - b.Property("DeletedBy") - .HasColumnType("uniqueidentifier"); - - b.Property("Description") - .HasMaxLength(1000) - .HasColumnType("nvarchar(1000)"); - - b.Property("LastModified") - .HasColumnType("datetimeoffset"); - - b.Property("LastModifiedBy") - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("nvarchar(100)"); - - b.Property("Price") - .HasColumnType("decimal(18,2)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.HasKey("Id"); - - b.HasIndex("BrandId"); - - b.ToTable("Products", "catalog"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("FSH.Starter.WebApi.Catalog.Domain.Product", b => - { - b.HasOne("FSH.Starter.WebApi.Catalog.Domain.Brand", "Brand") - .WithMany() - .HasForeignKey("BrandId"); - - b.Navigation("Brand"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/api/migrations/MSSQL/Catalog/20241123030623_Add Catalog Schema.cs b/src/api/migrations/MSSQL/Catalog/20241123030623_Add Catalog Schema.cs deleted file mode 100644 index 419d491abb..0000000000 --- a/src/api/migrations/MSSQL/Catalog/20241123030623_Add Catalog Schema.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace FSH.Starter.WebApi.Migrations.MSSQL.Catalog -{ - /// - public partial class AddCatalogSchema : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.EnsureSchema( - name: "catalog"); - - migrationBuilder.CreateTable( - name: "Brands", - schema: "catalog", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: false), - Description = table.Column(type: "nvarchar(1000)", maxLength: 1000, nullable: true), - TenantId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - Created = table.Column(type: "datetimeoffset", nullable: false), - CreatedBy = table.Column(type: "uniqueidentifier", nullable: false), - LastModified = table.Column(type: "datetimeoffset", nullable: false), - LastModifiedBy = table.Column(type: "uniqueidentifier", nullable: true), - Deleted = table.Column(type: "datetimeoffset", nullable: true), - DeletedBy = table.Column(type: "uniqueidentifier", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Brands", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Products", - schema: "catalog", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Name = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: false), - Description = table.Column(type: "nvarchar(1000)", maxLength: 1000, nullable: true), - Price = table.Column(type: "decimal(18,2)", nullable: false), - BrandId = table.Column(type: "uniqueidentifier", nullable: true), - TenantId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - Created = table.Column(type: "datetimeoffset", nullable: false), - CreatedBy = table.Column(type: "uniqueidentifier", nullable: false), - LastModified = table.Column(type: "datetimeoffset", nullable: false), - LastModifiedBy = table.Column(type: "uniqueidentifier", nullable: true), - Deleted = table.Column(type: "datetimeoffset", nullable: true), - DeletedBy = table.Column(type: "uniqueidentifier", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Products", x => x.Id); - table.ForeignKey( - name: "FK_Products_Brands_BrandId", - column: x => x.BrandId, - principalSchema: "catalog", - principalTable: "Brands", - principalColumn: "Id"); - }); - - migrationBuilder.CreateIndex( - name: "IX_Products_BrandId", - schema: "catalog", - table: "Products", - column: "BrandId"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "Products", - schema: "catalog"); - - migrationBuilder.DropTable( - name: "Brands", - schema: "catalog"); - } - } -} diff --git a/src/api/migrations/MSSQL/Catalog/CatalogDbContextModelSnapshot.cs b/src/api/migrations/MSSQL/Catalog/CatalogDbContextModelSnapshot.cs deleted file mode 100644 index df0564c347..0000000000 --- a/src/api/migrations/MSSQL/Catalog/CatalogDbContextModelSnapshot.cs +++ /dev/null @@ -1,135 +0,0 @@ -// -using System; -using FSH.Starter.WebApi.Catalog.Infrastructure.Persistence; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace FSH.Starter.WebApi.Migrations.MSSQL.Catalog -{ - [DbContext(typeof(CatalogDbContext))] - partial class CatalogDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasDefaultSchema("catalog") - .HasAnnotation("ProductVersion", "9.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("FSH.Starter.WebApi.Catalog.Domain.Brand", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Created") - .HasColumnType("datetimeoffset"); - - b.Property("CreatedBy") - .HasColumnType("uniqueidentifier"); - - b.Property("Deleted") - .HasColumnType("datetimeoffset"); - - b.Property("DeletedBy") - .HasColumnType("uniqueidentifier"); - - b.Property("Description") - .HasMaxLength(1000) - .HasColumnType("nvarchar(1000)"); - - b.Property("LastModified") - .HasColumnType("datetimeoffset"); - - b.Property("LastModifiedBy") - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("nvarchar(100)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.HasKey("Id"); - - b.ToTable("Brands", "catalog"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("FSH.Starter.WebApi.Catalog.Domain.Product", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("BrandId") - .HasColumnType("uniqueidentifier"); - - b.Property("Created") - .HasColumnType("datetimeoffset"); - - b.Property("CreatedBy") - .HasColumnType("uniqueidentifier"); - - b.Property("Deleted") - .HasColumnType("datetimeoffset"); - - b.Property("DeletedBy") - .HasColumnType("uniqueidentifier"); - - b.Property("Description") - .HasMaxLength(1000) - .HasColumnType("nvarchar(1000)"); - - b.Property("LastModified") - .HasColumnType("datetimeoffset"); - - b.Property("LastModifiedBy") - .HasColumnType("uniqueidentifier"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("nvarchar(100)"); - - b.Property("Price") - .HasColumnType("decimal(18,2)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.HasKey("Id"); - - b.HasIndex("BrandId"); - - b.ToTable("Products", "catalog"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("FSH.Starter.WebApi.Catalog.Domain.Product", b => - { - b.HasOne("FSH.Starter.WebApi.Catalog.Domain.Brand", "Brand") - .WithMany() - .HasForeignKey("BrandId"); - - b.Navigation("Brand"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/api/migrations/MSSQL/Identity/20241123030737_Add Identity Schema.Designer.cs b/src/api/migrations/MSSQL/Identity/20241123030737_Add Identity Schema.Designer.cs deleted file mode 100644 index 083e64b009..0000000000 --- a/src/api/migrations/MSSQL/Identity/20241123030737_Add Identity Schema.Designer.cs +++ /dev/null @@ -1,401 +0,0 @@ -// -using System; -using FSH.Framework.Infrastructure.Identity.Persistence; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace FSH.Starter.WebApi.Migrations.MSSQL.Identity -{ - [DbContext(typeof(IdentityDbContext))] - [Migration("20241123030737_Add Identity Schema")] - partial class AddIdentitySchema - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("FSH.Framework.Core.Audit.AuditTrail", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("DateTime") - .HasColumnType("datetimeoffset"); - - b.Property("Entity") - .HasColumnType("nvarchar(max)"); - - b.Property("ModifiedProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("NewValues") - .HasColumnType("nvarchar(max)"); - - b.Property("Operation") - .HasColumnType("nvarchar(max)"); - - b.Property("PreviousValues") - .HasColumnType("nvarchar(max)"); - - b.Property("PrimaryKey") - .HasColumnType("nvarchar(max)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.ToTable("AuditTrails", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("FSH.Framework.Infrastructure.Identity.RoleClaims.FshRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("nvarchar(max)"); - - b.Property("ClaimValue") - .HasColumnType("nvarchar(max)"); - - b.Property("CreatedBy") - .HasColumnType("nvarchar(max)"); - - b.Property("CreatedOn") - .HasColumnType("datetimeoffset"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("nvarchar(450)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("RoleClaims", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("FSH.Framework.Infrastructure.Identity.Roles.FshRole", b => - { - b.Property("Id") - .HasColumnType("nvarchar(450)"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("nvarchar(max)"); - - b.Property("Description") - .HasColumnType("nvarchar(max)"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName", "TenantId") - .IsUnique() - .HasDatabaseName("RoleNameIndex") - .HasFilter("[NormalizedName] IS NOT NULL"); - - b.ToTable("Roles", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("FSH.Framework.Infrastructure.Identity.Users.FshUser", b => - { - b.Property("Id") - .HasColumnType("nvarchar(450)"); - - b.Property("AccessFailedCount") - .HasColumnType("int"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("nvarchar(max)"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("bit"); - - b.Property("FirstName") - .HasColumnType("nvarchar(max)"); - - b.Property("ImageUrl") - .HasColumnType("nvarchar(max)"); - - b.Property("IsActive") - .HasColumnType("bit"); - - b.Property("LastName") - .HasColumnType("nvarchar(max)"); - - b.Property("LockoutEnabled") - .HasColumnType("bit"); - - b.Property("LockoutEnd") - .HasColumnType("datetimeoffset"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("ObjectId") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("PasswordHash") - .HasColumnType("nvarchar(max)"); - - b.Property("PhoneNumber") - .HasColumnType("nvarchar(max)"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("bit"); - - b.Property("RefreshToken") - .HasColumnType("nvarchar(max)"); - - b.Property("RefreshTokenExpiryTime") - .HasColumnType("datetime2"); - - b.Property("SecurityStamp") - .HasColumnType("nvarchar(max)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("TwoFactorEnabled") - .HasColumnType("bit"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex") - .HasFilter("[NormalizedUserName] IS NOT NULL"); - - b.ToTable("Users", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("nvarchar(max)"); - - b.Property("ClaimValue") - .HasColumnType("nvarchar(max)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("nvarchar(450)"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("nvarchar(450)"); - - b.Property("ProviderKey") - .HasColumnType("nvarchar(450)"); - - b.Property("ProviderDisplayName") - .HasColumnType("nvarchar(max)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("nvarchar(450)"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("UserLogins", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("nvarchar(450)"); - - b.Property("RoleId") - .HasColumnType("nvarchar(450)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("UserRoles", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("nvarchar(450)"); - - b.Property("LoginProvider") - .HasColumnType("nvarchar(450)"); - - b.Property("Name") - .HasColumnType("nvarchar(450)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("Value") - .HasColumnType("nvarchar(max)"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("UserTokens", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("FSH.Framework.Infrastructure.Identity.RoleClaims.FshRoleClaim", b => - { - b.HasOne("FSH.Framework.Infrastructure.Identity.Roles.FshRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("FSH.Framework.Infrastructure.Identity.Users.FshUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("FSH.Framework.Infrastructure.Identity.Users.FshUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("FSH.Framework.Infrastructure.Identity.Roles.FshRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("FSH.Framework.Infrastructure.Identity.Users.FshUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("FSH.Framework.Infrastructure.Identity.Users.FshUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/api/migrations/MSSQL/Identity/20241123030737_Add Identity Schema.cs b/src/api/migrations/MSSQL/Identity/20241123030737_Add Identity Schema.cs deleted file mode 100644 index c51ef44a6c..0000000000 --- a/src/api/migrations/MSSQL/Identity/20241123030737_Add Identity Schema.cs +++ /dev/null @@ -1,296 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace FSH.Starter.WebApi.Migrations.MSSQL.Identity -{ - /// - public partial class AddIdentitySchema : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.EnsureSchema( - name: "identity"); - - migrationBuilder.CreateTable( - name: "AuditTrails", - schema: "identity", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - UserId = table.Column(type: "uniqueidentifier", nullable: false), - Operation = table.Column(type: "nvarchar(max)", nullable: true), - Entity = table.Column(type: "nvarchar(max)", nullable: true), - DateTime = table.Column(type: "datetimeoffset", nullable: false), - PreviousValues = table.Column(type: "nvarchar(max)", nullable: true), - NewValues = table.Column(type: "nvarchar(max)", nullable: true), - ModifiedProperties = table.Column(type: "nvarchar(max)", nullable: true), - PrimaryKey = table.Column(type: "nvarchar(max)", nullable: true), - TenantId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AuditTrails", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Roles", - schema: "identity", - columns: table => new - { - Id = table.Column(type: "nvarchar(450)", nullable: false), - Description = table.Column(type: "nvarchar(max)", nullable: true), - TenantId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - Name = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - NormalizedName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - ConcurrencyStamp = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Roles", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Users", - schema: "identity", - columns: table => new - { - Id = table.Column(type: "nvarchar(450)", nullable: false), - FirstName = table.Column(type: "nvarchar(max)", nullable: true), - LastName = table.Column(type: "nvarchar(max)", nullable: true), - ImageUrl = table.Column(type: "nvarchar(max)", nullable: true), - IsActive = table.Column(type: "bit", nullable: false), - RefreshToken = table.Column(type: "nvarchar(max)", nullable: true), - RefreshTokenExpiryTime = table.Column(type: "datetime2", nullable: false), - ObjectId = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - TenantId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - UserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - NormalizedUserName = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - Email = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - NormalizedEmail = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: true), - EmailConfirmed = table.Column(type: "bit", nullable: false), - PasswordHash = table.Column(type: "nvarchar(max)", nullable: true), - SecurityStamp = table.Column(type: "nvarchar(max)", nullable: true), - ConcurrencyStamp = table.Column(type: "nvarchar(max)", nullable: true), - PhoneNumber = table.Column(type: "nvarchar(max)", nullable: true), - PhoneNumberConfirmed = table.Column(type: "bit", nullable: false), - TwoFactorEnabled = table.Column(type: "bit", nullable: false), - LockoutEnd = table.Column(type: "datetimeoffset", nullable: true), - LockoutEnabled = table.Column(type: "bit", nullable: false), - AccessFailedCount = table.Column(type: "int", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Users", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "RoleClaims", - schema: "identity", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - CreatedBy = table.Column(type: "nvarchar(max)", nullable: true), - CreatedOn = table.Column(type: "datetimeoffset", nullable: false), - TenantId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - RoleId = table.Column(type: "nvarchar(450)", nullable: false), - ClaimType = table.Column(type: "nvarchar(max)", nullable: true), - ClaimValue = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_RoleClaims", x => x.Id); - table.ForeignKey( - name: "FK_RoleClaims_Roles_RoleId", - column: x => x.RoleId, - principalSchema: "identity", - principalTable: "Roles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "UserClaims", - schema: "identity", - columns: table => new - { - Id = table.Column(type: "int", nullable: false) - .Annotation("SqlServer:Identity", "1, 1"), - UserId = table.Column(type: "nvarchar(450)", nullable: false), - ClaimType = table.Column(type: "nvarchar(max)", nullable: true), - ClaimValue = table.Column(type: "nvarchar(max)", nullable: true), - TenantId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_UserClaims", x => x.Id); - table.ForeignKey( - name: "FK_UserClaims_Users_UserId", - column: x => x.UserId, - principalSchema: "identity", - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "UserLogins", - schema: "identity", - columns: table => new - { - LoginProvider = table.Column(type: "nvarchar(450)", nullable: false), - ProviderKey = table.Column(type: "nvarchar(450)", nullable: false), - ProviderDisplayName = table.Column(type: "nvarchar(max)", nullable: true), - UserId = table.Column(type: "nvarchar(450)", nullable: false), - TenantId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_UserLogins", x => new { x.LoginProvider, x.ProviderKey }); - table.ForeignKey( - name: "FK_UserLogins_Users_UserId", - column: x => x.UserId, - principalSchema: "identity", - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "UserRoles", - schema: "identity", - columns: table => new - { - UserId = table.Column(type: "nvarchar(450)", nullable: false), - RoleId = table.Column(type: "nvarchar(450)", nullable: false), - TenantId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_UserRoles", x => new { x.UserId, x.RoleId }); - table.ForeignKey( - name: "FK_UserRoles_Roles_RoleId", - column: x => x.RoleId, - principalSchema: "identity", - principalTable: "Roles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_UserRoles_Users_UserId", - column: x => x.UserId, - principalSchema: "identity", - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "UserTokens", - schema: "identity", - columns: table => new - { - UserId = table.Column(type: "nvarchar(450)", nullable: false), - LoginProvider = table.Column(type: "nvarchar(450)", nullable: false), - Name = table.Column(type: "nvarchar(450)", nullable: false), - Value = table.Column(type: "nvarchar(max)", nullable: true), - TenantId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_UserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); - table.ForeignKey( - name: "FK_UserTokens_Users_UserId", - column: x => x.UserId, - principalSchema: "identity", - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "IX_RoleClaims_RoleId", - schema: "identity", - table: "RoleClaims", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "RoleNameIndex", - schema: "identity", - table: "Roles", - columns: new[] { "NormalizedName", "TenantId" }, - unique: true, - filter: "[NormalizedName] IS NOT NULL"); - - migrationBuilder.CreateIndex( - name: "IX_UserClaims_UserId", - schema: "identity", - table: "UserClaims", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_UserLogins_UserId", - schema: "identity", - table: "UserLogins", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_UserRoles_RoleId", - schema: "identity", - table: "UserRoles", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "EmailIndex", - schema: "identity", - table: "Users", - column: "NormalizedEmail"); - - migrationBuilder.CreateIndex( - name: "UserNameIndex", - schema: "identity", - table: "Users", - column: "NormalizedUserName", - unique: true, - filter: "[NormalizedUserName] IS NOT NULL"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "AuditTrails", - schema: "identity"); - - migrationBuilder.DropTable( - name: "RoleClaims", - schema: "identity"); - - migrationBuilder.DropTable( - name: "UserClaims", - schema: "identity"); - - migrationBuilder.DropTable( - name: "UserLogins", - schema: "identity"); - - migrationBuilder.DropTable( - name: "UserRoles", - schema: "identity"); - - migrationBuilder.DropTable( - name: "UserTokens", - schema: "identity"); - - migrationBuilder.DropTable( - name: "Roles", - schema: "identity"); - - migrationBuilder.DropTable( - name: "Users", - schema: "identity"); - } - } -} diff --git a/src/api/migrations/MSSQL/Identity/IdentityDbContextModelSnapshot.cs b/src/api/migrations/MSSQL/Identity/IdentityDbContextModelSnapshot.cs deleted file mode 100644 index b14e13f498..0000000000 --- a/src/api/migrations/MSSQL/Identity/IdentityDbContextModelSnapshot.cs +++ /dev/null @@ -1,398 +0,0 @@ -// -using System; -using FSH.Framework.Infrastructure.Identity.Persistence; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace FSH.Starter.WebApi.Migrations.MSSQL.Identity -{ - [DbContext(typeof(IdentityDbContext))] - partial class IdentityDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("FSH.Framework.Core.Audit.AuditTrail", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("DateTime") - .HasColumnType("datetimeoffset"); - - b.Property("Entity") - .HasColumnType("nvarchar(max)"); - - b.Property("ModifiedProperties") - .HasColumnType("nvarchar(max)"); - - b.Property("NewValues") - .HasColumnType("nvarchar(max)"); - - b.Property("Operation") - .HasColumnType("nvarchar(max)"); - - b.Property("PreviousValues") - .HasColumnType("nvarchar(max)"); - - b.Property("PrimaryKey") - .HasColumnType("nvarchar(max)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("UserId") - .HasColumnType("uniqueidentifier"); - - b.HasKey("Id"); - - b.ToTable("AuditTrails", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("FSH.Framework.Infrastructure.Identity.RoleClaims.FshRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("nvarchar(max)"); - - b.Property("ClaimValue") - .HasColumnType("nvarchar(max)"); - - b.Property("CreatedBy") - .HasColumnType("nvarchar(max)"); - - b.Property("CreatedOn") - .HasColumnType("datetimeoffset"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("nvarchar(450)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("RoleClaims", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("FSH.Framework.Infrastructure.Identity.Roles.FshRole", b => - { - b.Property("Id") - .HasColumnType("nvarchar(450)"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("nvarchar(max)"); - - b.Property("Description") - .HasColumnType("nvarchar(max)"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName", "TenantId") - .IsUnique() - .HasDatabaseName("RoleNameIndex") - .HasFilter("[NormalizedName] IS NOT NULL"); - - b.ToTable("Roles", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("FSH.Framework.Infrastructure.Identity.Users.FshUser", b => - { - b.Property("Id") - .HasColumnType("nvarchar(450)"); - - b.Property("AccessFailedCount") - .HasColumnType("int"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("nvarchar(max)"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("bit"); - - b.Property("FirstName") - .HasColumnType("nvarchar(max)"); - - b.Property("ImageUrl") - .HasColumnType("nvarchar(max)"); - - b.Property("IsActive") - .HasColumnType("bit"); - - b.Property("LastName") - .HasColumnType("nvarchar(max)"); - - b.Property("LockoutEnabled") - .HasColumnType("bit"); - - b.Property("LockoutEnd") - .HasColumnType("datetimeoffset"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("ObjectId") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.Property("PasswordHash") - .HasColumnType("nvarchar(max)"); - - b.Property("PhoneNumber") - .HasColumnType("nvarchar(max)"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("bit"); - - b.Property("RefreshToken") - .HasColumnType("nvarchar(max)"); - - b.Property("RefreshTokenExpiryTime") - .HasColumnType("datetime2"); - - b.Property("SecurityStamp") - .HasColumnType("nvarchar(max)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("TwoFactorEnabled") - .HasColumnType("bit"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("nvarchar(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex") - .HasFilter("[NormalizedUserName] IS NOT NULL"); - - b.ToTable("Users", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("nvarchar(max)"); - - b.Property("ClaimValue") - .HasColumnType("nvarchar(max)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("nvarchar(450)"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("nvarchar(450)"); - - b.Property("ProviderKey") - .HasColumnType("nvarchar(450)"); - - b.Property("ProviderDisplayName") - .HasColumnType("nvarchar(max)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("nvarchar(450)"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("UserLogins", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("nvarchar(450)"); - - b.Property("RoleId") - .HasColumnType("nvarchar(450)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("UserRoles", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("nvarchar(450)"); - - b.Property("LoginProvider") - .HasColumnType("nvarchar(450)"); - - b.Property("Name") - .HasColumnType("nvarchar(450)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("Value") - .HasColumnType("nvarchar(max)"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("UserTokens", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("FSH.Framework.Infrastructure.Identity.RoleClaims.FshRoleClaim", b => - { - b.HasOne("FSH.Framework.Infrastructure.Identity.Roles.FshRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("FSH.Framework.Infrastructure.Identity.Users.FshUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("FSH.Framework.Infrastructure.Identity.Users.FshUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("FSH.Framework.Infrastructure.Identity.Roles.FshRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("FSH.Framework.Infrastructure.Identity.Users.FshUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("FSH.Framework.Infrastructure.Identity.Users.FshUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/api/migrations/MSSQL/MSSQL.csproj b/src/api/migrations/MSSQL/MSSQL.csproj deleted file mode 100644 index adb542a166..0000000000 --- a/src/api/migrations/MSSQL/MSSQL.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - FSH.Starter.WebApi.Migrations.MSSQL - FSH.Starter.WebApi.Migrations.MSSQL - - - - - - - - - - - - - diff --git a/src/api/migrations/MSSQL/Tenant/20241123030647_Add Tenant Schema.Designer.cs b/src/api/migrations/MSSQL/Tenant/20241123030647_Add Tenant Schema.Designer.cs deleted file mode 100644 index 6c649f26d5..0000000000 --- a/src/api/migrations/MSSQL/Tenant/20241123030647_Add Tenant Schema.Designer.cs +++ /dev/null @@ -1,69 +0,0 @@ -// -using System; -using FSH.Framework.Infrastructure.Tenant.Persistence; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace FSH.Starter.WebApi.Migrations.MSSQL.Tenant -{ - [DbContext(typeof(TenantDbContext))] - [Migration("20241123030647_Add Tenant Schema")] - partial class AddTenantSchema - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("FSH.Framework.Infrastructure.Tenant.FshTenantInfo", b => - { - b.Property("Id") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("AdminEmail") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("ConnectionString") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Identifier") - .IsRequired() - .HasColumnType("nvarchar(450)"); - - b.Property("IsActive") - .HasColumnType("bit"); - - b.Property("Issuer") - .HasColumnType("nvarchar(max)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("ValidUpto") - .HasColumnType("datetime2"); - - b.HasKey("Id"); - - b.HasIndex("Identifier") - .IsUnique(); - - b.ToTable("Tenants", "tenant"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/api/migrations/MSSQL/Tenant/20241123030647_Add Tenant Schema.cs b/src/api/migrations/MSSQL/Tenant/20241123030647_Add Tenant Schema.cs deleted file mode 100644 index dda5acf677..0000000000 --- a/src/api/migrations/MSSQL/Tenant/20241123030647_Add Tenant Schema.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace FSH.Starter.WebApi.Migrations.MSSQL.Tenant -{ - /// - public partial class AddTenantSchema : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.EnsureSchema( - name: "tenant"); - - migrationBuilder.CreateTable( - name: "Tenants", - schema: "tenant", - columns: table => new - { - Id = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - Identifier = table.Column(type: "nvarchar(450)", nullable: false), - Name = table.Column(type: "nvarchar(max)", nullable: false), - ConnectionString = table.Column(type: "nvarchar(max)", nullable: false), - AdminEmail = table.Column(type: "nvarchar(max)", nullable: false), - IsActive = table.Column(type: "bit", nullable: false), - ValidUpto = table.Column(type: "datetime2", nullable: false), - Issuer = table.Column(type: "nvarchar(max)", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Tenants", x => x.Id); - }); - - migrationBuilder.CreateIndex( - name: "IX_Tenants_Identifier", - schema: "tenant", - table: "Tenants", - column: "Identifier", - unique: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "Tenants", - schema: "tenant"); - } - } -} diff --git a/src/api/migrations/MSSQL/Tenant/TenantDbContextModelSnapshot.cs b/src/api/migrations/MSSQL/Tenant/TenantDbContextModelSnapshot.cs deleted file mode 100644 index 288a117987..0000000000 --- a/src/api/migrations/MSSQL/Tenant/TenantDbContextModelSnapshot.cs +++ /dev/null @@ -1,66 +0,0 @@ -// -using System; -using FSH.Framework.Infrastructure.Tenant.Persistence; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace FSH.Starter.WebApi.Migrations.MSSQL.Tenant -{ - [DbContext(typeof(TenantDbContext))] - partial class TenantDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("FSH.Framework.Infrastructure.Tenant.FshTenantInfo", b => - { - b.Property("Id") - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("AdminEmail") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("ConnectionString") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("Identifier") - .IsRequired() - .HasColumnType("nvarchar(450)"); - - b.Property("IsActive") - .HasColumnType("bit"); - - b.Property("Issuer") - .HasColumnType("nvarchar(max)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("nvarchar(max)"); - - b.Property("ValidUpto") - .HasColumnType("datetime2"); - - b.HasKey("Id"); - - b.HasIndex("Identifier") - .IsUnique(); - - b.ToTable("Tenants", "tenant"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/api/migrations/MSSQL/Todo/20241123030700_Add Todo Schema.Designer.cs b/src/api/migrations/MSSQL/Todo/20241123030700_Add Todo Schema.Designer.cs deleted file mode 100644 index 505dd92c42..0000000000 --- a/src/api/migrations/MSSQL/Todo/20241123030700_Add Todo Schema.Designer.cs +++ /dev/null @@ -1,75 +0,0 @@ -// -using System; -using FSH.Starter.WebApi.Todo.Persistence; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace FSH.Starter.WebApi.Migrations.MSSQL.Todo -{ - [DbContext(typeof(TodoDbContext))] - [Migration("20241123030700_Add Todo Schema")] - partial class AddTodoSchema - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasDefaultSchema("todo") - .HasAnnotation("ProductVersion", "9.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("FSH.Starter.WebApi.Todo.Domain.TodoItem", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Created") - .HasColumnType("datetimeoffset"); - - b.Property("CreatedBy") - .HasColumnType("uniqueidentifier"); - - b.Property("Deleted") - .HasColumnType("datetimeoffset"); - - b.Property("DeletedBy") - .HasColumnType("uniqueidentifier"); - - b.Property("LastModified") - .HasColumnType("datetimeoffset"); - - b.Property("LastModifiedBy") - .HasColumnType("uniqueidentifier"); - - b.Property("Note") - .HasMaxLength(1000) - .HasColumnType("nvarchar(1000)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("Title") - .HasMaxLength(100) - .HasColumnType("nvarchar(100)"); - - b.HasKey("Id"); - - b.ToTable("Todos", "todo"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/api/migrations/MSSQL/Todo/20241123030700_Add Todo Schema.cs b/src/api/migrations/MSSQL/Todo/20241123030700_Add Todo Schema.cs deleted file mode 100644 index 0f68d6be73..0000000000 --- a/src/api/migrations/MSSQL/Todo/20241123030700_Add Todo Schema.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace FSH.Starter.WebApi.Migrations.MSSQL.Todo -{ - /// - public partial class AddTodoSchema : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.EnsureSchema( - name: "todo"); - - migrationBuilder.CreateTable( - name: "Todos", - schema: "todo", - columns: table => new - { - Id = table.Column(type: "uniqueidentifier", nullable: false), - Title = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: true), - Note = table.Column(type: "nvarchar(1000)", maxLength: 1000, nullable: true), - TenantId = table.Column(type: "nvarchar(64)", maxLength: 64, nullable: false), - Created = table.Column(type: "datetimeoffset", nullable: false), - CreatedBy = table.Column(type: "uniqueidentifier", nullable: false), - LastModified = table.Column(type: "datetimeoffset", nullable: false), - LastModifiedBy = table.Column(type: "uniqueidentifier", nullable: true), - Deleted = table.Column(type: "datetimeoffset", nullable: true), - DeletedBy = table.Column(type: "uniqueidentifier", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Todos", x => x.Id); - }); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "Todos", - schema: "todo"); - } - } -} diff --git a/src/api/migrations/MSSQL/Todo/TodoDbContextModelSnapshot.cs b/src/api/migrations/MSSQL/Todo/TodoDbContextModelSnapshot.cs deleted file mode 100644 index 59a159b6b6..0000000000 --- a/src/api/migrations/MSSQL/Todo/TodoDbContextModelSnapshot.cs +++ /dev/null @@ -1,72 +0,0 @@ -// -using System; -using FSH.Starter.WebApi.Todo.Persistence; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace FSH.Starter.WebApi.Migrations.MSSQL.Todo -{ - [DbContext(typeof(TodoDbContext))] - partial class TodoDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasDefaultSchema("todo") - .HasAnnotation("ProductVersion", "9.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 128); - - SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); - - modelBuilder.Entity("FSH.Starter.WebApi.Todo.Domain.TodoItem", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uniqueidentifier"); - - b.Property("Created") - .HasColumnType("datetimeoffset"); - - b.Property("CreatedBy") - .HasColumnType("uniqueidentifier"); - - b.Property("Deleted") - .HasColumnType("datetimeoffset"); - - b.Property("DeletedBy") - .HasColumnType("uniqueidentifier"); - - b.Property("LastModified") - .HasColumnType("datetimeoffset"); - - b.Property("LastModifiedBy") - .HasColumnType("uniqueidentifier"); - - b.Property("Note") - .HasMaxLength(1000) - .HasColumnType("nvarchar(1000)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("nvarchar(64)"); - - b.Property("Title") - .HasMaxLength(100) - .HasColumnType("nvarchar(100)"); - - b.HasKey("Id"); - - b.ToTable("Todos", "todo"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/api/migrations/PostgreSQL/Catalog/20241123024839_Add Catalog Schema.Designer.cs b/src/api/migrations/PostgreSQL/Catalog/20241123024839_Add Catalog Schema.Designer.cs deleted file mode 100644 index 58b695929c..0000000000 --- a/src/api/migrations/PostgreSQL/Catalog/20241123024839_Add Catalog Schema.Designer.cs +++ /dev/null @@ -1,138 +0,0 @@ -// -using System; -using FSH.Starter.WebApi.Catalog.Infrastructure.Persistence; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace FSH.Starter.WebApi.Migrations.PostgreSQL.Catalog -{ - [DbContext(typeof(CatalogDbContext))] - [Migration("20241123024839_Add Catalog Schema")] - partial class AddCatalogSchema - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasDefaultSchema("catalog") - .HasAnnotation("ProductVersion", "9.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("FSH.Starter.WebApi.Catalog.Domain.Brand", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.Property("CreatedBy") - .HasColumnType("uuid"); - - b.Property("Deleted") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedBy") - .HasColumnType("uuid"); - - b.Property("Description") - .HasMaxLength(1000) - .HasColumnType("character varying(1000)"); - - b.Property("LastModified") - .HasColumnType("timestamp with time zone"); - - b.Property("LastModifiedBy") - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasKey("Id"); - - b.ToTable("Brands", "catalog"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("FSH.Starter.WebApi.Catalog.Domain.Product", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("BrandId") - .HasColumnType("uuid"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.Property("CreatedBy") - .HasColumnType("uuid"); - - b.Property("Deleted") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedBy") - .HasColumnType("uuid"); - - b.Property("Description") - .HasMaxLength(1000) - .HasColumnType("character varying(1000)"); - - b.Property("LastModified") - .HasColumnType("timestamp with time zone"); - - b.Property("LastModifiedBy") - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("Price") - .HasColumnType("numeric"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasKey("Id"); - - b.HasIndex("BrandId"); - - b.ToTable("Products", "catalog"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("FSH.Starter.WebApi.Catalog.Domain.Product", b => - { - b.HasOne("FSH.Starter.WebApi.Catalog.Domain.Brand", "Brand") - .WithMany() - .HasForeignKey("BrandId"); - - b.Navigation("Brand"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/api/migrations/PostgreSQL/Catalog/20241123024839_Add Catalog Schema.cs b/src/api/migrations/PostgreSQL/Catalog/20241123024839_Add Catalog Schema.cs deleted file mode 100644 index e31911ac56..0000000000 --- a/src/api/migrations/PostgreSQL/Catalog/20241123024839_Add Catalog Schema.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace FSH.Starter.WebApi.Migrations.PostgreSQL.Catalog -{ - /// - public partial class AddCatalogSchema : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.EnsureSchema( - name: "catalog"); - - migrationBuilder.CreateTable( - name: "Brands", - schema: "catalog", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - Name = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), - Description = table.Column(type: "character varying(1000)", maxLength: 1000, nullable: true), - TenantId = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), - Created = table.Column(type: "timestamp with time zone", nullable: false), - CreatedBy = table.Column(type: "uuid", nullable: false), - LastModified = table.Column(type: "timestamp with time zone", nullable: false), - LastModifiedBy = table.Column(type: "uuid", nullable: true), - Deleted = table.Column(type: "timestamp with time zone", nullable: true), - DeletedBy = table.Column(type: "uuid", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Brands", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Products", - schema: "catalog", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - Name = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), - Description = table.Column(type: "character varying(1000)", maxLength: 1000, nullable: true), - Price = table.Column(type: "numeric", nullable: false), - BrandId = table.Column(type: "uuid", nullable: true), - TenantId = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), - Created = table.Column(type: "timestamp with time zone", nullable: false), - CreatedBy = table.Column(type: "uuid", nullable: false), - LastModified = table.Column(type: "timestamp with time zone", nullable: false), - LastModifiedBy = table.Column(type: "uuid", nullable: true), - Deleted = table.Column(type: "timestamp with time zone", nullable: true), - DeletedBy = table.Column(type: "uuid", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Products", x => x.Id); - table.ForeignKey( - name: "FK_Products_Brands_BrandId", - column: x => x.BrandId, - principalSchema: "catalog", - principalTable: "Brands", - principalColumn: "Id"); - }); - - migrationBuilder.CreateIndex( - name: "IX_Products_BrandId", - schema: "catalog", - table: "Products", - column: "BrandId"); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "Products", - schema: "catalog"); - - migrationBuilder.DropTable( - name: "Brands", - schema: "catalog"); - } - } -} diff --git a/src/api/migrations/PostgreSQL/Catalog/CatalogDbContextModelSnapshot.cs b/src/api/migrations/PostgreSQL/Catalog/CatalogDbContextModelSnapshot.cs deleted file mode 100644 index 66ec756fd7..0000000000 --- a/src/api/migrations/PostgreSQL/Catalog/CatalogDbContextModelSnapshot.cs +++ /dev/null @@ -1,135 +0,0 @@ -// -using System; -using FSH.Starter.WebApi.Catalog.Infrastructure.Persistence; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace FSH.Starter.WebApi.Migrations.PostgreSQL.Catalog -{ - [DbContext(typeof(CatalogDbContext))] - partial class CatalogDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasDefaultSchema("catalog") - .HasAnnotation("ProductVersion", "9.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("FSH.Starter.WebApi.Catalog.Domain.Brand", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.Property("CreatedBy") - .HasColumnType("uuid"); - - b.Property("Deleted") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedBy") - .HasColumnType("uuid"); - - b.Property("Description") - .HasMaxLength(1000) - .HasColumnType("character varying(1000)"); - - b.Property("LastModified") - .HasColumnType("timestamp with time zone"); - - b.Property("LastModifiedBy") - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasKey("Id"); - - b.ToTable("Brands", "catalog"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("FSH.Starter.WebApi.Catalog.Domain.Product", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("BrandId") - .HasColumnType("uuid"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.Property("CreatedBy") - .HasColumnType("uuid"); - - b.Property("Deleted") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedBy") - .HasColumnType("uuid"); - - b.Property("Description") - .HasMaxLength(1000) - .HasColumnType("character varying(1000)"); - - b.Property("LastModified") - .HasColumnType("timestamp with time zone"); - - b.Property("LastModifiedBy") - .HasColumnType("uuid"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("Price") - .HasColumnType("numeric"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasKey("Id"); - - b.HasIndex("BrandId"); - - b.ToTable("Products", "catalog"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("FSH.Starter.WebApi.Catalog.Domain.Product", b => - { - b.HasOne("FSH.Starter.WebApi.Catalog.Domain.Brand", "Brand") - .WithMany() - .HasForeignKey("BrandId"); - - b.Navigation("Brand"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/api/migrations/PostgreSQL/Identity/20241123024818_Add Identity Schema.Designer.cs b/src/api/migrations/PostgreSQL/Identity/20241123024818_Add Identity Schema.Designer.cs deleted file mode 100644 index 6163907fac..0000000000 --- a/src/api/migrations/PostgreSQL/Identity/20241123024818_Add Identity Schema.Designer.cs +++ /dev/null @@ -1,399 +0,0 @@ -// -using System; -using FSH.Framework.Infrastructure.Identity.Persistence; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace FSH.Starter.WebApi.Migrations.PostgreSQL.Identity -{ - [DbContext(typeof(IdentityDbContext))] - [Migration("20241123024818_Add Identity Schema")] - partial class AddIdentitySchema - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("FSH.Framework.Core.Audit.AuditTrail", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Entity") - .HasColumnType("text"); - - b.Property("ModifiedProperties") - .HasColumnType("text"); - - b.Property("NewValues") - .HasColumnType("text"); - - b.Property("Operation") - .HasColumnType("text"); - - b.Property("PreviousValues") - .HasColumnType("text"); - - b.Property("PrimaryKey") - .HasColumnType("text"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.ToTable("AuditTrails", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("FSH.Framework.Infrastructure.Identity.RoleClaims.FshRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("CreatedBy") - .HasColumnType("text"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("text"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("RoleClaims", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("FSH.Framework.Infrastructure.Identity.Roles.FshRole", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName", "TenantId") - .IsUnique() - .HasDatabaseName("RoleNameIndex"); - - b.ToTable("Roles", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("FSH.Framework.Infrastructure.Identity.Users.FshUser", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("AccessFailedCount") - .HasColumnType("integer"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("boolean"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("ImageUrl") - .HasColumnType("text"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("LockoutEnabled") - .HasColumnType("boolean"); - - b.Property("LockoutEnd") - .HasColumnType("timestamp with time zone"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("ObjectId") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("PasswordHash") - .HasColumnType("text"); - - b.Property("PhoneNumber") - .HasColumnType("text"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("boolean"); - - b.Property("RefreshToken") - .HasColumnType("text"); - - b.Property("RefreshTokenExpiryTime") - .HasColumnType("timestamp with time zone"); - - b.Property("SecurityStamp") - .HasColumnType("text"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("TwoFactorEnabled") - .HasColumnType("boolean"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex"); - - b.ToTable("Users", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("ProviderKey") - .HasColumnType("text"); - - b.Property("ProviderDisplayName") - .HasColumnType("text"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("UserLogins", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("text"); - - b.Property("RoleId") - .HasColumnType("text"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("UserRoles", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("text"); - - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Value") - .HasColumnType("text"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("UserTokens", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("FSH.Framework.Infrastructure.Identity.RoleClaims.FshRoleClaim", b => - { - b.HasOne("FSH.Framework.Infrastructure.Identity.Roles.FshRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("FSH.Framework.Infrastructure.Identity.Users.FshUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("FSH.Framework.Infrastructure.Identity.Users.FshUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("FSH.Framework.Infrastructure.Identity.Roles.FshRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("FSH.Framework.Infrastructure.Identity.Users.FshUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("FSH.Framework.Infrastructure.Identity.Users.FshUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/api/migrations/PostgreSQL/Identity/20241123024818_Add Identity Schema.cs b/src/api/migrations/PostgreSQL/Identity/20241123024818_Add Identity Schema.cs deleted file mode 100644 index 6487136614..0000000000 --- a/src/api/migrations/PostgreSQL/Identity/20241123024818_Add Identity Schema.cs +++ /dev/null @@ -1,295 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace FSH.Starter.WebApi.Migrations.PostgreSQL.Identity -{ - /// - public partial class AddIdentitySchema : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.EnsureSchema( - name: "identity"); - - migrationBuilder.CreateTable( - name: "AuditTrails", - schema: "identity", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - UserId = table.Column(type: "uuid", nullable: false), - Operation = table.Column(type: "text", nullable: true), - Entity = table.Column(type: "text", nullable: true), - DateTime = table.Column(type: "timestamp with time zone", nullable: false), - PreviousValues = table.Column(type: "text", nullable: true), - NewValues = table.Column(type: "text", nullable: true), - ModifiedProperties = table.Column(type: "text", nullable: true), - PrimaryKey = table.Column(type: "text", nullable: true), - TenantId = table.Column(type: "character varying(64)", maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AuditTrails", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Roles", - schema: "identity", - columns: table => new - { - Id = table.Column(type: "text", nullable: false), - Description = table.Column(type: "text", nullable: true), - TenantId = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), - Name = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - NormalizedName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - ConcurrencyStamp = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Roles", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Users", - schema: "identity", - columns: table => new - { - Id = table.Column(type: "text", nullable: false), - FirstName = table.Column(type: "text", nullable: true), - LastName = table.Column(type: "text", nullable: true), - ImageUrl = table.Column(type: "text", nullable: true), - IsActive = table.Column(type: "boolean", nullable: false), - RefreshToken = table.Column(type: "text", nullable: true), - RefreshTokenExpiryTime = table.Column(type: "timestamp with time zone", nullable: false), - ObjectId = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - TenantId = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), - UserName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - NormalizedUserName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - Email = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - NormalizedEmail = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - EmailConfirmed = table.Column(type: "boolean", nullable: false), - PasswordHash = table.Column(type: "text", nullable: true), - SecurityStamp = table.Column(type: "text", nullable: true), - ConcurrencyStamp = table.Column(type: "text", nullable: true), - PhoneNumber = table.Column(type: "text", nullable: true), - PhoneNumberConfirmed = table.Column(type: "boolean", nullable: false), - TwoFactorEnabled = table.Column(type: "boolean", nullable: false), - LockoutEnd = table.Column(type: "timestamp with time zone", nullable: true), - LockoutEnabled = table.Column(type: "boolean", nullable: false), - AccessFailedCount = table.Column(type: "integer", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Users", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "RoleClaims", - schema: "identity", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - CreatedBy = table.Column(type: "text", nullable: true), - CreatedOn = table.Column(type: "timestamp with time zone", nullable: false), - TenantId = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), - RoleId = table.Column(type: "text", nullable: false), - ClaimType = table.Column(type: "text", nullable: true), - ClaimValue = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_RoleClaims", x => x.Id); - table.ForeignKey( - name: "FK_RoleClaims_Roles_RoleId", - column: x => x.RoleId, - principalSchema: "identity", - principalTable: "Roles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "UserClaims", - schema: "identity", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - UserId = table.Column(type: "text", nullable: false), - ClaimType = table.Column(type: "text", nullable: true), - ClaimValue = table.Column(type: "text", nullable: true), - TenantId = table.Column(type: "character varying(64)", maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_UserClaims", x => x.Id); - table.ForeignKey( - name: "FK_UserClaims_Users_UserId", - column: x => x.UserId, - principalSchema: "identity", - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "UserLogins", - schema: "identity", - columns: table => new - { - LoginProvider = table.Column(type: "text", nullable: false), - ProviderKey = table.Column(type: "text", nullable: false), - ProviderDisplayName = table.Column(type: "text", nullable: true), - UserId = table.Column(type: "text", nullable: false), - TenantId = table.Column(type: "character varying(64)", maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_UserLogins", x => new { x.LoginProvider, x.ProviderKey }); - table.ForeignKey( - name: "FK_UserLogins_Users_UserId", - column: x => x.UserId, - principalSchema: "identity", - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "UserRoles", - schema: "identity", - columns: table => new - { - UserId = table.Column(type: "text", nullable: false), - RoleId = table.Column(type: "text", nullable: false), - TenantId = table.Column(type: "character varying(64)", maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_UserRoles", x => new { x.UserId, x.RoleId }); - table.ForeignKey( - name: "FK_UserRoles_Roles_RoleId", - column: x => x.RoleId, - principalSchema: "identity", - principalTable: "Roles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_UserRoles_Users_UserId", - column: x => x.UserId, - principalSchema: "identity", - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "UserTokens", - schema: "identity", - columns: table => new - { - UserId = table.Column(type: "text", nullable: false), - LoginProvider = table.Column(type: "text", nullable: false), - Name = table.Column(type: "text", nullable: false), - Value = table.Column(type: "text", nullable: true), - TenantId = table.Column(type: "character varying(64)", maxLength: 64, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_UserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); - table.ForeignKey( - name: "FK_UserTokens_Users_UserId", - column: x => x.UserId, - principalSchema: "identity", - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "IX_RoleClaims_RoleId", - schema: "identity", - table: "RoleClaims", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "RoleNameIndex", - schema: "identity", - table: "Roles", - columns: new[] { "NormalizedName", "TenantId" }, - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_UserClaims_UserId", - schema: "identity", - table: "UserClaims", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_UserLogins_UserId", - schema: "identity", - table: "UserLogins", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_UserRoles_RoleId", - schema: "identity", - table: "UserRoles", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "EmailIndex", - schema: "identity", - table: "Users", - column: "NormalizedEmail"); - - migrationBuilder.CreateIndex( - name: "UserNameIndex", - schema: "identity", - table: "Users", - column: "NormalizedUserName", - unique: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "AuditTrails", - schema: "identity"); - - migrationBuilder.DropTable( - name: "RoleClaims", - schema: "identity"); - - migrationBuilder.DropTable( - name: "UserClaims", - schema: "identity"); - - migrationBuilder.DropTable( - name: "UserLogins", - schema: "identity"); - - migrationBuilder.DropTable( - name: "UserRoles", - schema: "identity"); - - migrationBuilder.DropTable( - name: "UserTokens", - schema: "identity"); - - migrationBuilder.DropTable( - name: "Roles", - schema: "identity"); - - migrationBuilder.DropTable( - name: "Users", - schema: "identity"); - } - } -} diff --git a/src/api/migrations/PostgreSQL/Identity/IdentityDbContextModelSnapshot.cs b/src/api/migrations/PostgreSQL/Identity/IdentityDbContextModelSnapshot.cs deleted file mode 100644 index 685f78d39e..0000000000 --- a/src/api/migrations/PostgreSQL/Identity/IdentityDbContextModelSnapshot.cs +++ /dev/null @@ -1,396 +0,0 @@ -// -using System; -using FSH.Framework.Infrastructure.Identity.Persistence; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace FSH.Starter.WebApi.Migrations.PostgreSQL.Identity -{ - [DbContext(typeof(IdentityDbContext))] - partial class IdentityDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("FSH.Framework.Core.Audit.AuditTrail", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("DateTime") - .HasColumnType("timestamp with time zone"); - - b.Property("Entity") - .HasColumnType("text"); - - b.Property("ModifiedProperties") - .HasColumnType("text"); - - b.Property("NewValues") - .HasColumnType("text"); - - b.Property("Operation") - .HasColumnType("text"); - - b.Property("PreviousValues") - .HasColumnType("text"); - - b.Property("PrimaryKey") - .HasColumnType("text"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("UserId") - .HasColumnType("uuid"); - - b.HasKey("Id"); - - b.ToTable("AuditTrails", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("FSH.Framework.Infrastructure.Identity.RoleClaims.FshRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("CreatedBy") - .HasColumnType("text"); - - b.Property("CreatedOn") - .HasColumnType("timestamp with time zone"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("text"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("RoleClaims", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("FSH.Framework.Infrastructure.Identity.Roles.FshRole", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("Description") - .HasColumnType("text"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName", "TenantId") - .IsUnique() - .HasDatabaseName("RoleNameIndex"); - - b.ToTable("Roles", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("FSH.Framework.Infrastructure.Identity.Users.FshUser", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("AccessFailedCount") - .HasColumnType("integer"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("boolean"); - - b.Property("FirstName") - .HasColumnType("text"); - - b.Property("ImageUrl") - .HasColumnType("text"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("LastName") - .HasColumnType("text"); - - b.Property("LockoutEnabled") - .HasColumnType("boolean"); - - b.Property("LockoutEnd") - .HasColumnType("timestamp with time zone"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("ObjectId") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("PasswordHash") - .HasColumnType("text"); - - b.Property("PhoneNumber") - .HasColumnType("text"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("boolean"); - - b.Property("RefreshToken") - .HasColumnType("text"); - - b.Property("RefreshTokenExpiryTime") - .HasColumnType("timestamp with time zone"); - - b.Property("SecurityStamp") - .HasColumnType("text"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("TwoFactorEnabled") - .HasColumnType("boolean"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex"); - - b.ToTable("Users", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("ProviderKey") - .HasColumnType("text"); - - b.Property("ProviderDisplayName") - .HasColumnType("text"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("UserLogins", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("text"); - - b.Property("RoleId") - .HasColumnType("text"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("UserRoles", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("text"); - - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Value") - .HasColumnType("text"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("UserTokens", "identity"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); - - modelBuilder.Entity("FSH.Framework.Infrastructure.Identity.RoleClaims.FshRoleClaim", b => - { - b.HasOne("FSH.Framework.Infrastructure.Identity.Roles.FshRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("FSH.Framework.Infrastructure.Identity.Users.FshUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("FSH.Framework.Infrastructure.Identity.Users.FshUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("FSH.Framework.Infrastructure.Identity.Roles.FshRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("FSH.Framework.Infrastructure.Identity.Users.FshUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("FSH.Framework.Infrastructure.Identity.Users.FshUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/api/migrations/PostgreSQL/PostgreSQL.csproj b/src/api/migrations/PostgreSQL/PostgreSQL.csproj deleted file mode 100644 index 706f2aa206..0000000000 --- a/src/api/migrations/PostgreSQL/PostgreSQL.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - FSH.Starter.WebApi.Migrations.PostgreSQL - FSH.Starter.WebApi.Migrations.PostgreSQL - - - - - - - - - - - - - diff --git a/src/api/migrations/PostgreSQL/Tenant/20241123024825_Add Tenant Schema.Designer.cs b/src/api/migrations/PostgreSQL/Tenant/20241123024825_Add Tenant Schema.Designer.cs deleted file mode 100644 index cd4007fd06..0000000000 --- a/src/api/migrations/PostgreSQL/Tenant/20241123024825_Add Tenant Schema.Designer.cs +++ /dev/null @@ -1,69 +0,0 @@ -// -using System; -using FSH.Framework.Infrastructure.Tenant.Persistence; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace FSH.Starter.WebApi.Migrations.PostgreSQL.Tenant -{ - [DbContext(typeof(TenantDbContext))] - [Migration("20241123024825_Add Tenant Schema")] - partial class AddTenantSchema - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("FSH.Framework.Infrastructure.Tenant.FshTenantInfo", b => - { - b.Property("Id") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("AdminEmail") - .IsRequired() - .HasColumnType("text"); - - b.Property("ConnectionString") - .IsRequired() - .HasColumnType("text"); - - b.Property("Identifier") - .IsRequired() - .HasColumnType("text"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("Issuer") - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ValidUpto") - .HasColumnType("timestamp without time zone"); - - b.HasKey("Id"); - - b.HasIndex("Identifier") - .IsUnique(); - - b.ToTable("Tenants", "tenant"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/api/migrations/PostgreSQL/Tenant/20241123024825_Add Tenant Schema.cs b/src/api/migrations/PostgreSQL/Tenant/20241123024825_Add Tenant Schema.cs deleted file mode 100644 index 2b7a5dd93c..0000000000 --- a/src/api/migrations/PostgreSQL/Tenant/20241123024825_Add Tenant Schema.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace FSH.Starter.WebApi.Migrations.PostgreSQL.Tenant -{ - /// - public partial class AddTenantSchema : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.EnsureSchema( - name: "tenant"); - - migrationBuilder.CreateTable( - name: "Tenants", - schema: "tenant", - columns: table => new - { - Id = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), - Identifier = table.Column(type: "text", nullable: false), - Name = table.Column(type: "text", nullable: false), - ConnectionString = table.Column(type: "text", nullable: false), - AdminEmail = table.Column(type: "text", nullable: false), - IsActive = table.Column(type: "boolean", nullable: false), - ValidUpto = table.Column(type: "timestamp without time zone", nullable: false), - Issuer = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Tenants", x => x.Id); - }); - - migrationBuilder.CreateIndex( - name: "IX_Tenants_Identifier", - schema: "tenant", - table: "Tenants", - column: "Identifier", - unique: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "Tenants", - schema: "tenant"); - } - } -} diff --git a/src/api/migrations/PostgreSQL/Tenant/TenantDbContextModelSnapshot.cs b/src/api/migrations/PostgreSQL/Tenant/TenantDbContextModelSnapshot.cs deleted file mode 100644 index 123e35b38e..0000000000 --- a/src/api/migrations/PostgreSQL/Tenant/TenantDbContextModelSnapshot.cs +++ /dev/null @@ -1,66 +0,0 @@ -// -using System; -using FSH.Framework.Infrastructure.Tenant.Persistence; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace FSH.Starter.WebApi.Migrations.PostgreSQL.Tenant -{ - [DbContext(typeof(TenantDbContext))] - partial class TenantDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "9.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("FSH.Framework.Infrastructure.Tenant.FshTenantInfo", b => - { - b.Property("Id") - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("AdminEmail") - .IsRequired() - .HasColumnType("text"); - - b.Property("ConnectionString") - .IsRequired() - .HasColumnType("text"); - - b.Property("Identifier") - .IsRequired() - .HasColumnType("text"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("Issuer") - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("ValidUpto") - .HasColumnType("timestamp without time zone"); - - b.HasKey("Id"); - - b.HasIndex("Identifier") - .IsUnique(); - - b.ToTable("Tenants", "tenant"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/api/migrations/PostgreSQL/Todo/20241123024832_Add Todo Schema.Designer.cs b/src/api/migrations/PostgreSQL/Todo/20241123024832_Add Todo Schema.Designer.cs deleted file mode 100644 index 249977d6fd..0000000000 --- a/src/api/migrations/PostgreSQL/Todo/20241123024832_Add Todo Schema.Designer.cs +++ /dev/null @@ -1,75 +0,0 @@ -// -using System; -using FSH.Starter.WebApi.Todo.Persistence; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace FSH.Starter.WebApi.Migrations.PostgreSQL.Todo -{ - [DbContext(typeof(TodoDbContext))] - [Migration("20241123024832_Add Todo Schema")] - partial class AddTodoSchema - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasDefaultSchema("todo") - .HasAnnotation("ProductVersion", "9.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("FSH.Starter.WebApi.Todo.Domain.TodoItem", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.Property("CreatedBy") - .HasColumnType("uuid"); - - b.Property("Deleted") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedBy") - .HasColumnType("uuid"); - - b.Property("LastModified") - .HasColumnType("timestamp with time zone"); - - b.Property("LastModifiedBy") - .HasColumnType("uuid"); - - b.Property("Note") - .HasMaxLength(1000) - .HasColumnType("character varying(1000)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Title") - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.HasKey("Id"); - - b.ToTable("Todos", "todo"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/api/migrations/PostgreSQL/Todo/20241123024832_Add Todo Schema.cs b/src/api/migrations/PostgreSQL/Todo/20241123024832_Add Todo Schema.cs deleted file mode 100644 index 15c5f75996..0000000000 --- a/src/api/migrations/PostgreSQL/Todo/20241123024832_Add Todo Schema.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace FSH.Starter.WebApi.Migrations.PostgreSQL.Todo -{ - /// - public partial class AddTodoSchema : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.EnsureSchema( - name: "todo"); - - migrationBuilder.CreateTable( - name: "Todos", - schema: "todo", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - Title = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), - Note = table.Column(type: "character varying(1000)", maxLength: 1000, nullable: true), - TenantId = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), - Created = table.Column(type: "timestamp with time zone", nullable: false), - CreatedBy = table.Column(type: "uuid", nullable: false), - LastModified = table.Column(type: "timestamp with time zone", nullable: false), - LastModifiedBy = table.Column(type: "uuid", nullable: true), - Deleted = table.Column(type: "timestamp with time zone", nullable: true), - DeletedBy = table.Column(type: "uuid", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Todos", x => x.Id); - }); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "Todos", - schema: "todo"); - } - } -} diff --git a/src/api/migrations/PostgreSQL/Todo/TodoDbContextModelSnapshot.cs b/src/api/migrations/PostgreSQL/Todo/TodoDbContextModelSnapshot.cs deleted file mode 100644 index 4edd8aa7ec..0000000000 --- a/src/api/migrations/PostgreSQL/Todo/TodoDbContextModelSnapshot.cs +++ /dev/null @@ -1,72 +0,0 @@ -// -using System; -using FSH.Starter.WebApi.Todo.Persistence; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace FSH.Starter.WebApi.Migrations.PostgreSQL.Todo -{ - [DbContext(typeof(TodoDbContext))] - partial class TodoDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasDefaultSchema("todo") - .HasAnnotation("ProductVersion", "9.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("FSH.Starter.WebApi.Todo.Domain.TodoItem", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Created") - .HasColumnType("timestamp with time zone"); - - b.Property("CreatedBy") - .HasColumnType("uuid"); - - b.Property("Deleted") - .HasColumnType("timestamp with time zone"); - - b.Property("DeletedBy") - .HasColumnType("uuid"); - - b.Property("LastModified") - .HasColumnType("timestamp with time zone"); - - b.Property("LastModifiedBy") - .HasColumnType("uuid"); - - b.Property("Note") - .HasMaxLength(1000) - .HasColumnType("character varying(1000)"); - - b.Property("TenantId") - .IsRequired() - .HasMaxLength(64) - .HasColumnType("character varying(64)"); - - b.Property("Title") - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.HasKey("Id"); - - b.ToTable("Todos", "todo"); - - b.HasAnnotation("Finbuckle:MultiTenant", true); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/src/api/modules/Catalog/Catalog.Application/Brands/Create/v1/CreateBrandCommand.cs b/src/api/modules/Catalog/Catalog.Application/Brands/Create/v1/CreateBrandCommand.cs deleted file mode 100644 index 0c2559f9aa..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Brands/Create/v1/CreateBrandCommand.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.ComponentModel; -using MediatR; - -namespace FSH.Starter.WebApi.Catalog.Application.Brands.Create.v1; -public sealed record CreateBrandCommand( - [property: DefaultValue("Sample Brand")] string? Name, - [property: DefaultValue("Descriptive Description")] string? Description = null) : IRequest; - diff --git a/src/api/modules/Catalog/Catalog.Application/Brands/Create/v1/CreateBrandCommandValidator.cs b/src/api/modules/Catalog/Catalog.Application/Brands/Create/v1/CreateBrandCommandValidator.cs deleted file mode 100644 index 0d2e695331..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Brands/Create/v1/CreateBrandCommandValidator.cs +++ /dev/null @@ -1,11 +0,0 @@ -using FluentValidation; - -namespace FSH.Starter.WebApi.Catalog.Application.Brands.Create.v1; -public class CreateBrandCommandValidator : AbstractValidator -{ - public CreateBrandCommandValidator() - { - RuleFor(b => b.Name).NotEmpty().MinimumLength(2).MaximumLength(100); - RuleFor(b => b.Description).MaximumLength(1000); - } -} diff --git a/src/api/modules/Catalog/Catalog.Application/Brands/Create/v1/CreateBrandHandler.cs b/src/api/modules/Catalog/Catalog.Application/Brands/Create/v1/CreateBrandHandler.cs deleted file mode 100644 index 15b4b7633d..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Brands/Create/v1/CreateBrandHandler.cs +++ /dev/null @@ -1,21 +0,0 @@ -using FSH.Framework.Core.Persistence; -using FSH.Starter.WebApi.Catalog.Domain; -using MediatR; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace FSH.Starter.WebApi.Catalog.Application.Brands.Create.v1; -public sealed class CreateBrandHandler( - ILogger logger, - [FromKeyedServices("catalog:brands")] IRepository repository) - : IRequestHandler -{ - public async Task Handle(CreateBrandCommand request, CancellationToken cancellationToken) - { - ArgumentNullException.ThrowIfNull(request); - var brand = Brand.Create(request.Name!, request.Description); - await repository.AddAsync(brand, cancellationToken); - logger.LogInformation("brand created {BrandId}", brand.Id); - return new CreateBrandResponse(brand.Id); - } -} diff --git a/src/api/modules/Catalog/Catalog.Application/Brands/Create/v1/CreateBrandResponse.cs b/src/api/modules/Catalog/Catalog.Application/Brands/Create/v1/CreateBrandResponse.cs deleted file mode 100644 index 11e63834bd..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Brands/Create/v1/CreateBrandResponse.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace FSH.Starter.WebApi.Catalog.Application.Brands.Create.v1; - -public sealed record CreateBrandResponse(Guid? Id); - diff --git a/src/api/modules/Catalog/Catalog.Application/Brands/Delete/v1/DeleteBrandCommand.cs b/src/api/modules/Catalog/Catalog.Application/Brands/Delete/v1/DeleteBrandCommand.cs deleted file mode 100644 index 0e11b24149..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Brands/Delete/v1/DeleteBrandCommand.cs +++ /dev/null @@ -1,5 +0,0 @@ -using MediatR; - -namespace FSH.Starter.WebApi.Catalog.Application.Brands.Delete.v1; -public sealed record DeleteBrandCommand( - Guid Id) : IRequest; diff --git a/src/api/modules/Catalog/Catalog.Application/Brands/Delete/v1/DeleteBrandHandler.cs b/src/api/modules/Catalog/Catalog.Application/Brands/Delete/v1/DeleteBrandHandler.cs deleted file mode 100644 index d4afe86ef8..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Brands/Delete/v1/DeleteBrandHandler.cs +++ /dev/null @@ -1,22 +0,0 @@ -using FSH.Framework.Core.Persistence; -using FSH.Starter.WebApi.Catalog.Domain; -using FSH.Starter.WebApi.Catalog.Domain.Exceptions; -using MediatR; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace FSH.Starter.WebApi.Catalog.Application.Brands.Delete.v1; -public sealed class DeleteBrandHandler( - ILogger logger, - [FromKeyedServices("catalog:brands")] IRepository repository) - : IRequestHandler -{ - public async Task Handle(DeleteBrandCommand request, CancellationToken cancellationToken) - { - ArgumentNullException.ThrowIfNull(request); - var brand = await repository.GetByIdAsync(request.Id, cancellationToken); - _ = brand ?? throw new BrandNotFoundException(request.Id); - await repository.DeleteAsync(brand, cancellationToken); - logger.LogInformation("Brand with id : {BrandId} deleted", brand.Id); - } -} diff --git a/src/api/modules/Catalog/Catalog.Application/Brands/EventHandlers/BrandCreatedEventHandler.cs b/src/api/modules/Catalog/Catalog.Application/Brands/EventHandlers/BrandCreatedEventHandler.cs deleted file mode 100644 index 777526b767..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Brands/EventHandlers/BrandCreatedEventHandler.cs +++ /dev/null @@ -1,16 +0,0 @@ -using FSH.Starter.WebApi.Catalog.Domain.Events; -using MediatR; -using Microsoft.Extensions.Logging; - -namespace FSH.Starter.WebApi.Catalog.Application.Brands.EventHandlers; - -public class BrandCreatedEventHandler(ILogger logger) : INotificationHandler -{ - public async Task Handle(BrandCreated notification, - CancellationToken cancellationToken) - { - logger.LogInformation("handling brand created domain event.."); - await Task.FromResult(notification); - logger.LogInformation("finished handling brand created domain event.."); - } -} diff --git a/src/api/modules/Catalog/Catalog.Application/Brands/Get/v1/BrandResponse.cs b/src/api/modules/Catalog/Catalog.Application/Brands/Get/v1/BrandResponse.cs deleted file mode 100644 index 726030b24e..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Brands/Get/v1/BrandResponse.cs +++ /dev/null @@ -1,2 +0,0 @@ -namespace FSH.Starter.WebApi.Catalog.Application.Brands.Get.v1; -public sealed record BrandResponse(Guid? Id, string Name, string? Description); diff --git a/src/api/modules/Catalog/Catalog.Application/Brands/Get/v1/GetBrandHandler.cs b/src/api/modules/Catalog/Catalog.Application/Brands/Get/v1/GetBrandHandler.cs deleted file mode 100644 index 7848a10d62..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Brands/Get/v1/GetBrandHandler.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; -using FSH.Starter.WebApi.Catalog.Domain.Exceptions; -using FSH.Framework.Core.Persistence; -using FSH.Framework.Core.Caching; -using FSH.Starter.WebApi.Catalog.Domain; -using MediatR; - -namespace FSH.Starter.WebApi.Catalog.Application.Brands.Get.v1; -public sealed class GetBrandHandler( - [FromKeyedServices("catalog:brands")] IReadRepository repository, - ICacheService cache) - : IRequestHandler -{ - public async Task Handle(GetBrandRequest request, CancellationToken cancellationToken) - { - ArgumentNullException.ThrowIfNull(request); - var item = await cache.GetOrSetAsync( - $"brand:{request.Id}", - async () => - { - var brandItem = await repository.GetByIdAsync(request.Id, cancellationToken); - if (brandItem == null) throw new BrandNotFoundException(request.Id); - return new BrandResponse(brandItem.Id, brandItem.Name, brandItem.Description); - }, - cancellationToken: cancellationToken); - return item!; - } -} diff --git a/src/api/modules/Catalog/Catalog.Application/Brands/Get/v1/GetBrandRequest.cs b/src/api/modules/Catalog/Catalog.Application/Brands/Get/v1/GetBrandRequest.cs deleted file mode 100644 index a9354be5a8..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Brands/Get/v1/GetBrandRequest.cs +++ /dev/null @@ -1,8 +0,0 @@ -using MediatR; - -namespace FSH.Starter.WebApi.Catalog.Application.Brands.Get.v1; -public class GetBrandRequest : IRequest -{ - public Guid Id { get; set; } - public GetBrandRequest(Guid id) => Id = id; -} diff --git a/src/api/modules/Catalog/Catalog.Application/Brands/Search/v1/SearchBrandSpecs.cs b/src/api/modules/Catalog/Catalog.Application/Brands/Search/v1/SearchBrandSpecs.cs deleted file mode 100644 index b18cadc7f9..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Brands/Search/v1/SearchBrandSpecs.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Ardalis.Specification; -using FSH.Framework.Core.Paging; -using FSH.Framework.Core.Specifications; -using FSH.Starter.WebApi.Catalog.Application.Brands.Get.v1; -using FSH.Starter.WebApi.Catalog.Domain; - -namespace FSH.Starter.WebApi.Catalog.Application.Brands.Search.v1; -public class SearchBrandSpecs : EntitiesByPaginationFilterSpec -{ - public SearchBrandSpecs(SearchBrandsCommand command) - : base(command) => - Query - .OrderBy(c => c.Name, !command.HasOrderBy()) - .Where(b => b.Name.Contains(command.Keyword), !string.IsNullOrEmpty(command.Keyword)); -} diff --git a/src/api/modules/Catalog/Catalog.Application/Brands/Search/v1/SearchBrandsCommand.cs b/src/api/modules/Catalog/Catalog.Application/Brands/Search/v1/SearchBrandsCommand.cs deleted file mode 100644 index 70f4b3e0a8..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Brands/Search/v1/SearchBrandsCommand.cs +++ /dev/null @@ -1,11 +0,0 @@ -using FSH.Framework.Core.Paging; -using FSH.Starter.WebApi.Catalog.Application.Brands.Get.v1; -using MediatR; - -namespace FSH.Starter.WebApi.Catalog.Application.Brands.Search.v1; - -public class SearchBrandsCommand : PaginationFilter, IRequest> -{ - public string? Name { get; set; } - public string? Description { get; set; } -} diff --git a/src/api/modules/Catalog/Catalog.Application/Brands/Search/v1/SearchBrandsHandler.cs b/src/api/modules/Catalog/Catalog.Application/Brands/Search/v1/SearchBrandsHandler.cs deleted file mode 100644 index 29b7107f40..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Brands/Search/v1/SearchBrandsHandler.cs +++ /dev/null @@ -1,24 +0,0 @@ -using FSH.Framework.Core.Paging; -using FSH.Framework.Core.Persistence; -using FSH.Starter.WebApi.Catalog.Application.Brands.Get.v1; -using FSH.Starter.WebApi.Catalog.Domain; -using MediatR; -using Microsoft.Extensions.DependencyInjection; - -namespace FSH.Starter.WebApi.Catalog.Application.Brands.Search.v1; -public sealed class SearchBrandsHandler( - [FromKeyedServices("catalog:brands")] IReadRepository repository) - : IRequestHandler> -{ - public async Task> Handle(SearchBrandsCommand request, CancellationToken cancellationToken) - { - ArgumentNullException.ThrowIfNull(request); - - var spec = new SearchBrandSpecs(request); - - var items = await repository.ListAsync(spec, cancellationToken).ConfigureAwait(false); - var totalCount = await repository.CountAsync(spec, cancellationToken).ConfigureAwait(false); - - return new PagedList(items, request!.PageNumber, request!.PageSize, totalCount); - } -} diff --git a/src/api/modules/Catalog/Catalog.Application/Brands/Update/v1/UpdateBrandCommand.cs b/src/api/modules/Catalog/Catalog.Application/Brands/Update/v1/UpdateBrandCommand.cs deleted file mode 100644 index ce7dd54cf8..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Brands/Update/v1/UpdateBrandCommand.cs +++ /dev/null @@ -1,7 +0,0 @@ -using MediatR; - -namespace FSH.Starter.WebApi.Catalog.Application.Brands.Update.v1; -public sealed record UpdateBrandCommand( - Guid Id, - string? Name, - string? Description = null) : IRequest; diff --git a/src/api/modules/Catalog/Catalog.Application/Brands/Update/v1/UpdateBrandCommandValidator.cs b/src/api/modules/Catalog/Catalog.Application/Brands/Update/v1/UpdateBrandCommandValidator.cs deleted file mode 100644 index a3ce8da6cb..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Brands/Update/v1/UpdateBrandCommandValidator.cs +++ /dev/null @@ -1,11 +0,0 @@ -using FluentValidation; - -namespace FSH.Starter.WebApi.Catalog.Application.Brands.Update.v1; -public class UpdateBrandCommandValidator : AbstractValidator -{ - public UpdateBrandCommandValidator() - { - RuleFor(b => b.Name).NotEmpty().MinimumLength(2).MaximumLength(100); - RuleFor(b => b.Description).MaximumLength(1000); - } -} diff --git a/src/api/modules/Catalog/Catalog.Application/Brands/Update/v1/UpdateBrandHandler.cs b/src/api/modules/Catalog/Catalog.Application/Brands/Update/v1/UpdateBrandHandler.cs deleted file mode 100644 index 2477fdb4ad..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Brands/Update/v1/UpdateBrandHandler.cs +++ /dev/null @@ -1,24 +0,0 @@ -using FSH.Framework.Core.Persistence; -using FSH.Starter.WebApi.Catalog.Domain; -using FSH.Starter.WebApi.Catalog.Domain.Exceptions; -using MediatR; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace FSH.Starter.WebApi.Catalog.Application.Brands.Update.v1; -public sealed class UpdateBrandHandler( - ILogger logger, - [FromKeyedServices("catalog:brands")] IRepository repository) - : IRequestHandler -{ - public async Task Handle(UpdateBrandCommand request, CancellationToken cancellationToken) - { - ArgumentNullException.ThrowIfNull(request); - var brand = await repository.GetByIdAsync(request.Id, cancellationToken); - _ = brand ?? throw new BrandNotFoundException(request.Id); - var updatedBrand = brand.Update(request.Name, request.Description); - await repository.UpdateAsync(updatedBrand, cancellationToken); - logger.LogInformation("Brand with id : {BrandId} updated.", brand.Id); - return new UpdateBrandResponse(brand.Id); - } -} diff --git a/src/api/modules/Catalog/Catalog.Application/Brands/Update/v1/UpdateBrandResponse.cs b/src/api/modules/Catalog/Catalog.Application/Brands/Update/v1/UpdateBrandResponse.cs deleted file mode 100644 index 6b4acdc870..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Brands/Update/v1/UpdateBrandResponse.cs +++ /dev/null @@ -1,2 +0,0 @@ -namespace FSH.Starter.WebApi.Catalog.Application.Brands.Update.v1; -public sealed record UpdateBrandResponse(Guid? Id); diff --git a/src/api/modules/Catalog/Catalog.Application/Catalog.Application.csproj b/src/api/modules/Catalog/Catalog.Application/Catalog.Application.csproj deleted file mode 100644 index 34ba8437ef..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Catalog.Application.csproj +++ /dev/null @@ -1,10 +0,0 @@ - - - FSH.Starter.WebApi.Catalog.Application - FSH.Starter.WebApi.Catalog.Application - - - - - - diff --git a/src/api/modules/Catalog/Catalog.Application/CatalogMetadata.cs b/src/api/modules/Catalog/Catalog.Application/CatalogMetadata.cs deleted file mode 100644 index 0301ffd004..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/CatalogMetadata.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace FSH.Starter.WebApi.Catalog.Application; -public static class CatalogMetadata -{ - public static string Name { get; set; } = "CatalogApplication"; -} - diff --git a/src/api/modules/Catalog/Catalog.Application/Products/Create/v1/CreateProductCommand.cs b/src/api/modules/Catalog/Catalog.Application/Products/Create/v1/CreateProductCommand.cs deleted file mode 100644 index 99291ae8e8..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Products/Create/v1/CreateProductCommand.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.ComponentModel; -using MediatR; - -namespace FSH.Starter.WebApi.Catalog.Application.Products.Create.v1; -public sealed record CreateProductCommand( - [property: DefaultValue("Sample Product")] string? Name, - [property: DefaultValue(10)] decimal Price, - [property: DefaultValue("Descriptive Description")] string? Description = null, - [property: DefaultValue(null)] Guid? BrandId = null) : IRequest; diff --git a/src/api/modules/Catalog/Catalog.Application/Products/Create/v1/CreateProductCommandValidator.cs b/src/api/modules/Catalog/Catalog.Application/Products/Create/v1/CreateProductCommandValidator.cs deleted file mode 100644 index 97e81f7599..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Products/Create/v1/CreateProductCommandValidator.cs +++ /dev/null @@ -1,11 +0,0 @@ -using FluentValidation; - -namespace FSH.Starter.WebApi.Catalog.Application.Products.Create.v1; -public class CreateProductCommandValidator : AbstractValidator -{ - public CreateProductCommandValidator() - { - RuleFor(p => p.Name).NotEmpty().MinimumLength(2).MaximumLength(75); - RuleFor(p => p.Price).GreaterThan(0); - } -} diff --git a/src/api/modules/Catalog/Catalog.Application/Products/Create/v1/CreateProductHandler.cs b/src/api/modules/Catalog/Catalog.Application/Products/Create/v1/CreateProductHandler.cs deleted file mode 100644 index cb640ac642..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Products/Create/v1/CreateProductHandler.cs +++ /dev/null @@ -1,21 +0,0 @@ -using FSH.Framework.Core.Persistence; -using FSH.Starter.WebApi.Catalog.Domain; -using MediatR; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace FSH.Starter.WebApi.Catalog.Application.Products.Create.v1; -public sealed class CreateProductHandler( - ILogger logger, - [FromKeyedServices("catalog:products")] IRepository repository) - : IRequestHandler -{ - public async Task Handle(CreateProductCommand request, CancellationToken cancellationToken) - { - ArgumentNullException.ThrowIfNull(request); - var product = Product.Create(request.Name!, request.Description, request.Price, request.BrandId); - await repository.AddAsync(product, cancellationToken); - logger.LogInformation("product created {ProductId}", product.Id); - return new CreateProductResponse(product.Id); - } -} diff --git a/src/api/modules/Catalog/Catalog.Application/Products/Create/v1/CreateProductResponse.cs b/src/api/modules/Catalog/Catalog.Application/Products/Create/v1/CreateProductResponse.cs deleted file mode 100644 index 2c97edab79..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Products/Create/v1/CreateProductResponse.cs +++ /dev/null @@ -1,2 +0,0 @@ -namespace FSH.Starter.WebApi.Catalog.Application.Products.Create.v1; -public sealed record CreateProductResponse(Guid? Id); diff --git a/src/api/modules/Catalog/Catalog.Application/Products/Delete/v1/DeleteProductCommand.cs b/src/api/modules/Catalog/Catalog.Application/Products/Delete/v1/DeleteProductCommand.cs deleted file mode 100644 index 5119734346..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Products/Delete/v1/DeleteProductCommand.cs +++ /dev/null @@ -1,5 +0,0 @@ -using MediatR; - -namespace FSH.Starter.WebApi.Catalog.Application.Products.Delete.v1; -public sealed record DeleteProductCommand( - Guid Id) : IRequest; diff --git a/src/api/modules/Catalog/Catalog.Application/Products/Delete/v1/DeleteProductHandler.cs b/src/api/modules/Catalog/Catalog.Application/Products/Delete/v1/DeleteProductHandler.cs deleted file mode 100644 index 182a282a4b..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Products/Delete/v1/DeleteProductHandler.cs +++ /dev/null @@ -1,22 +0,0 @@ -using FSH.Framework.Core.Persistence; -using FSH.Starter.WebApi.Catalog.Domain; -using FSH.Starter.WebApi.Catalog.Domain.Exceptions; -using MediatR; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace FSH.Starter.WebApi.Catalog.Application.Products.Delete.v1; -public sealed class DeleteProductHandler( - ILogger logger, - [FromKeyedServices("catalog:products")] IRepository repository) - : IRequestHandler -{ - public async Task Handle(DeleteProductCommand request, CancellationToken cancellationToken) - { - ArgumentNullException.ThrowIfNull(request); - var product = await repository.GetByIdAsync(request.Id, cancellationToken); - _ = product ?? throw new ProductNotFoundException(request.Id); - await repository.DeleteAsync(product, cancellationToken); - logger.LogInformation("product with id : {ProductId} deleted", product.Id); - } -} diff --git a/src/api/modules/Catalog/Catalog.Application/Products/EventHandlers/ProductCreatedEventHandler.cs b/src/api/modules/Catalog/Catalog.Application/Products/EventHandlers/ProductCreatedEventHandler.cs deleted file mode 100644 index 694616ab34..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Products/EventHandlers/ProductCreatedEventHandler.cs +++ /dev/null @@ -1,17 +0,0 @@ -using FSH.Starter.WebApi.Catalog.Domain.Events; -using MediatR; -using Microsoft.Extensions.Logging; - -namespace FSH.Starter.WebApi.Catalog.Application.Products.EventHandlers; - -public class ProductCreatedEventHandler(ILogger logger) : INotificationHandler -{ - public async Task Handle(ProductCreated notification, - CancellationToken cancellationToken) - { - logger.LogInformation("handling product created domain event.."); - await Task.FromResult(notification); - logger.LogInformation("finished handling product created domain event.."); - } -} - diff --git a/src/api/modules/Catalog/Catalog.Application/Products/Get/v1/GetProductHandler.cs b/src/api/modules/Catalog/Catalog.Application/Products/Get/v1/GetProductHandler.cs deleted file mode 100644 index 53f327e262..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Products/Get/v1/GetProductHandler.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; -using FSH.Starter.WebApi.Catalog.Domain.Exceptions; -using FSH.Framework.Core.Persistence; -using FSH.Framework.Core.Caching; -using FSH.Starter.WebApi.Catalog.Domain; -using MediatR; - -namespace FSH.Starter.WebApi.Catalog.Application.Products.Get.v1; -public sealed class GetProductHandler( - [FromKeyedServices("catalog:products")] IReadRepository repository, - ICacheService cache) - : IRequestHandler -{ - public async Task Handle(GetProductRequest request, CancellationToken cancellationToken) - { - ArgumentNullException.ThrowIfNull(request); - var item = await cache.GetOrSetAsync( - $"product:{request.Id}", - async () => - { - var spec = new GetProductSpecs(request.Id); - var productItem = await repository.FirstOrDefaultAsync(spec, cancellationToken); - if (productItem == null) throw new ProductNotFoundException(request.Id); - return productItem; - }, - cancellationToken: cancellationToken); - return item!; - } -} diff --git a/src/api/modules/Catalog/Catalog.Application/Products/Get/v1/GetProductRequest.cs b/src/api/modules/Catalog/Catalog.Application/Products/Get/v1/GetProductRequest.cs deleted file mode 100644 index a85bd13fb1..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Products/Get/v1/GetProductRequest.cs +++ /dev/null @@ -1,8 +0,0 @@ -using MediatR; - -namespace FSH.Starter.WebApi.Catalog.Application.Products.Get.v1; -public class GetProductRequest : IRequest -{ - public Guid Id { get; set; } - public GetProductRequest(Guid id) => Id = id; -} diff --git a/src/api/modules/Catalog/Catalog.Application/Products/Get/v1/GetProductSpecs.cs b/src/api/modules/Catalog/Catalog.Application/Products/Get/v1/GetProductSpecs.cs deleted file mode 100644 index 9e30c3767b..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Products/Get/v1/GetProductSpecs.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Ardalis.Specification; -using FSH.Starter.WebApi.Catalog.Domain; - -namespace FSH.Starter.WebApi.Catalog.Application.Products.Get.v1; - -public class GetProductSpecs : Specification -{ - public GetProductSpecs(Guid id) - { - Query - .Where(p => p.Id == id) - .Include(p => p.Brand); - } -} diff --git a/src/api/modules/Catalog/Catalog.Application/Products/Get/v1/ProductResponse.cs b/src/api/modules/Catalog/Catalog.Application/Products/Get/v1/ProductResponse.cs deleted file mode 100644 index 080d358685..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Products/Get/v1/ProductResponse.cs +++ /dev/null @@ -1,4 +0,0 @@ -using FSH.Starter.WebApi.Catalog.Application.Brands.Get.v1; - -namespace FSH.Starter.WebApi.Catalog.Application.Products.Get.v1; -public sealed record ProductResponse(Guid? Id, string Name, string? Description, decimal Price, BrandResponse? Brand); diff --git a/src/api/modules/Catalog/Catalog.Application/Products/Search/v1/SearchProductSpecs.cs b/src/api/modules/Catalog/Catalog.Application/Products/Search/v1/SearchProductSpecs.cs deleted file mode 100644 index 98567c6a5a..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Products/Search/v1/SearchProductSpecs.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Ardalis.Specification; -using FSH.Framework.Core.Paging; -using FSH.Framework.Core.Specifications; -using FSH.Starter.WebApi.Catalog.Application.Products.Get.v1; -using FSH.Starter.WebApi.Catalog.Domain; - -namespace FSH.Starter.WebApi.Catalog.Application.Products.Search.v1; -public class SearchProductSpecs : EntitiesByPaginationFilterSpec -{ - public SearchProductSpecs(SearchProductsCommand command) - : base(command) => - Query - .Include(p => p.Brand) - .OrderBy(c => c.Name, !command.HasOrderBy()) - .Where(p => p.BrandId == command.BrandId!.Value, command.BrandId.HasValue) - .Where(p => p.Price >= command.MinimumRate!.Value, command.MinimumRate.HasValue) - .Where(p => p.Price <= command.MaximumRate!.Value, command.MaximumRate.HasValue); -} diff --git a/src/api/modules/Catalog/Catalog.Application/Products/Search/v1/SearchProductsCommand.cs b/src/api/modules/Catalog/Catalog.Application/Products/Search/v1/SearchProductsCommand.cs deleted file mode 100644 index ed19c2f958..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Products/Search/v1/SearchProductsCommand.cs +++ /dev/null @@ -1,12 +0,0 @@ -using FSH.Framework.Core.Paging; -using FSH.Starter.WebApi.Catalog.Application.Products.Get.v1; -using MediatR; - -namespace FSH.Starter.WebApi.Catalog.Application.Products.Search.v1; - -public class SearchProductsCommand : PaginationFilter, IRequest> -{ - public Guid? BrandId { get; set; } - public decimal? MinimumRate { get; set; } - public decimal? MaximumRate { get; set; } -} diff --git a/src/api/modules/Catalog/Catalog.Application/Products/Search/v1/SearchProductsHandler.cs b/src/api/modules/Catalog/Catalog.Application/Products/Search/v1/SearchProductsHandler.cs deleted file mode 100644 index 7c6c290df0..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Products/Search/v1/SearchProductsHandler.cs +++ /dev/null @@ -1,26 +0,0 @@ -using FSH.Framework.Core.Paging; -using FSH.Framework.Core.Persistence; -using FSH.Starter.WebApi.Catalog.Application.Products.Get.v1; -using FSH.Starter.WebApi.Catalog.Domain; -using MediatR; -using Microsoft.Extensions.DependencyInjection; - - -namespace FSH.Starter.WebApi.Catalog.Application.Products.Search.v1; -public sealed class SearchProductsHandler( - [FromKeyedServices("catalog:products")] IReadRepository repository) - : IRequestHandler> -{ - public async Task> Handle(SearchProductsCommand request, CancellationToken cancellationToken) - { - ArgumentNullException.ThrowIfNull(request); - - var spec = new SearchProductSpecs(request); - - var items = await repository.ListAsync(spec, cancellationToken).ConfigureAwait(false); - var totalCount = await repository.CountAsync(spec, cancellationToken).ConfigureAwait(false); - - return new PagedList(items, request!.PageNumber, request!.PageSize, totalCount); - } -} - diff --git a/src/api/modules/Catalog/Catalog.Application/Products/Update/v1/UpdateProductCommand.cs b/src/api/modules/Catalog/Catalog.Application/Products/Update/v1/UpdateProductCommand.cs deleted file mode 100644 index dd7db751c0..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Products/Update/v1/UpdateProductCommand.cs +++ /dev/null @@ -1,9 +0,0 @@ -using MediatR; - -namespace FSH.Starter.WebApi.Catalog.Application.Products.Update.v1; -public sealed record UpdateProductCommand( - Guid Id, - string? Name, - decimal Price, - string? Description = null, - Guid? BrandId = null) : IRequest; diff --git a/src/api/modules/Catalog/Catalog.Application/Products/Update/v1/UpdateProductCommandValidator.cs b/src/api/modules/Catalog/Catalog.Application/Products/Update/v1/UpdateProductCommandValidator.cs deleted file mode 100644 index e0110ea84f..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Products/Update/v1/UpdateProductCommandValidator.cs +++ /dev/null @@ -1,11 +0,0 @@ -using FluentValidation; - -namespace FSH.Starter.WebApi.Catalog.Application.Products.Update.v1; -public class UpdateProductCommandValidator : AbstractValidator -{ - public UpdateProductCommandValidator() - { - RuleFor(p => p.Name).NotEmpty().MinimumLength(2).MaximumLength(75); - RuleFor(p => p.Price).GreaterThan(0); - } -} diff --git a/src/api/modules/Catalog/Catalog.Application/Products/Update/v1/UpdateProductHandler.cs b/src/api/modules/Catalog/Catalog.Application/Products/Update/v1/UpdateProductHandler.cs deleted file mode 100644 index 5062196250..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Products/Update/v1/UpdateProductHandler.cs +++ /dev/null @@ -1,24 +0,0 @@ -using FSH.Framework.Core.Persistence; -using FSH.Starter.WebApi.Catalog.Domain; -using FSH.Starter.WebApi.Catalog.Domain.Exceptions; -using MediatR; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace FSH.Starter.WebApi.Catalog.Application.Products.Update.v1; -public sealed class UpdateProductHandler( - ILogger logger, - [FromKeyedServices("catalog:products")] IRepository repository) - : IRequestHandler -{ - public async Task Handle(UpdateProductCommand request, CancellationToken cancellationToken) - { - ArgumentNullException.ThrowIfNull(request); - var product = await repository.GetByIdAsync(request.Id, cancellationToken); - _ = product ?? throw new ProductNotFoundException(request.Id); - var updatedProduct = product.Update(request.Name, request.Description, request.Price, request.BrandId); - await repository.UpdateAsync(updatedProduct, cancellationToken); - logger.LogInformation("product with id : {ProductId} updated.", product.Id); - return new UpdateProductResponse(product.Id); - } -} diff --git a/src/api/modules/Catalog/Catalog.Application/Products/Update/v1/UpdateProductResponse.cs b/src/api/modules/Catalog/Catalog.Application/Products/Update/v1/UpdateProductResponse.cs deleted file mode 100644 index cf28a756c8..0000000000 --- a/src/api/modules/Catalog/Catalog.Application/Products/Update/v1/UpdateProductResponse.cs +++ /dev/null @@ -1,2 +0,0 @@ -namespace FSH.Starter.WebApi.Catalog.Application.Products.Update.v1; -public sealed record UpdateProductResponse(Guid? Id); diff --git a/src/api/modules/Catalog/Catalog.Domain/Brand.cs b/src/api/modules/Catalog/Catalog.Domain/Brand.cs deleted file mode 100644 index 0d24695f54..0000000000 --- a/src/api/modules/Catalog/Catalog.Domain/Brand.cs +++ /dev/null @@ -1,51 +0,0 @@ -using FSH.Framework.Core.Domain; -using FSH.Framework.Core.Domain.Contracts; -using FSH.Starter.WebApi.Catalog.Domain.Events; - -namespace FSH.Starter.WebApi.Catalog.Domain; -public class Brand : AuditableEntity, IAggregateRoot -{ - public string Name { get; private set; } = string.Empty; - public string? Description { get; private set; } - - private Brand() { } - - private Brand(Guid id, string name, string? description) - { - Id = id; - Name = name; - Description = description; - QueueDomainEvent(new BrandCreated { Brand = this }); - } - - public static Brand Create(string name, string? description) - { - return new Brand(Guid.NewGuid(), name, description); - } - - public Brand Update(string? name, string? description) - { - bool isUpdated = false; - - if (!string.IsNullOrWhiteSpace(name) && !string.Equals(Name, name, StringComparison.OrdinalIgnoreCase)) - { - Name = name; - isUpdated = true; - } - - if (!string.Equals(Description, description, StringComparison.OrdinalIgnoreCase)) - { - Description = description; - isUpdated = true; - } - - if (isUpdated) - { - QueueDomainEvent(new BrandUpdated { Brand = this }); - } - - return this; - } -} - - diff --git a/src/api/modules/Catalog/Catalog.Domain/Catalog.Domain.csproj b/src/api/modules/Catalog/Catalog.Domain/Catalog.Domain.csproj deleted file mode 100644 index 96c37fb508..0000000000 --- a/src/api/modules/Catalog/Catalog.Domain/Catalog.Domain.csproj +++ /dev/null @@ -1,9 +0,0 @@ - - - FSH.Starter.WebApi.Catalog.Domain - FSH.Starter.WebApi.Catalog.Domain - - - - - diff --git a/src/api/modules/Catalog/Catalog.Domain/Events/BrandCreated.cs b/src/api/modules/Catalog/Catalog.Domain/Events/BrandCreated.cs deleted file mode 100644 index a1ae4abeb1..0000000000 --- a/src/api/modules/Catalog/Catalog.Domain/Events/BrandCreated.cs +++ /dev/null @@ -1,7 +0,0 @@ -using FSH.Framework.Core.Domain.Events; - -namespace FSH.Starter.WebApi.Catalog.Domain.Events; -public sealed record BrandCreated : DomainEvent -{ - public Brand? Brand { get; set; } -} diff --git a/src/api/modules/Catalog/Catalog.Domain/Events/BrandUpdated.cs b/src/api/modules/Catalog/Catalog.Domain/Events/BrandUpdated.cs deleted file mode 100644 index 4446dcf079..0000000000 --- a/src/api/modules/Catalog/Catalog.Domain/Events/BrandUpdated.cs +++ /dev/null @@ -1,7 +0,0 @@ -using FSH.Framework.Core.Domain.Events; - -namespace FSH.Starter.WebApi.Catalog.Domain.Events; -public sealed record BrandUpdated : DomainEvent -{ - public Brand? Brand { get; set; } -} diff --git a/src/api/modules/Catalog/Catalog.Domain/Events/ProductCreated.cs b/src/api/modules/Catalog/Catalog.Domain/Events/ProductCreated.cs deleted file mode 100644 index a049fe6856..0000000000 --- a/src/api/modules/Catalog/Catalog.Domain/Events/ProductCreated.cs +++ /dev/null @@ -1,7 +0,0 @@ -using FSH.Framework.Core.Domain.Events; - -namespace FSH.Starter.WebApi.Catalog.Domain.Events; -public sealed record ProductCreated : DomainEvent -{ - public Product? Product { get; set; } -} diff --git a/src/api/modules/Catalog/Catalog.Domain/Events/ProductUpdated.cs b/src/api/modules/Catalog/Catalog.Domain/Events/ProductUpdated.cs deleted file mode 100644 index ed38e3584a..0000000000 --- a/src/api/modules/Catalog/Catalog.Domain/Events/ProductUpdated.cs +++ /dev/null @@ -1,7 +0,0 @@ -using FSH.Framework.Core.Domain.Events; - -namespace FSH.Starter.WebApi.Catalog.Domain.Events; -public sealed record ProductUpdated : DomainEvent -{ - public Product? Product { get; set; } -} diff --git a/src/api/modules/Catalog/Catalog.Domain/Exceptions/BrandNotFoundException.cs b/src/api/modules/Catalog/Catalog.Domain/Exceptions/BrandNotFoundException.cs deleted file mode 100644 index 84a40a1b81..0000000000 --- a/src/api/modules/Catalog/Catalog.Domain/Exceptions/BrandNotFoundException.cs +++ /dev/null @@ -1,10 +0,0 @@ -using FSH.Framework.Core.Exceptions; - -namespace FSH.Starter.WebApi.Catalog.Domain.Exceptions; -public sealed class BrandNotFoundException : NotFoundException -{ - public BrandNotFoundException(Guid id) - : base($"brand with id {id} not found") - { - } -} diff --git a/src/api/modules/Catalog/Catalog.Domain/Exceptions/ProductNotFoundException.cs b/src/api/modules/Catalog/Catalog.Domain/Exceptions/ProductNotFoundException.cs deleted file mode 100644 index b3a3963a33..0000000000 --- a/src/api/modules/Catalog/Catalog.Domain/Exceptions/ProductNotFoundException.cs +++ /dev/null @@ -1,10 +0,0 @@ -using FSH.Framework.Core.Exceptions; - -namespace FSH.Starter.WebApi.Catalog.Domain.Exceptions; -public sealed class ProductNotFoundException : NotFoundException -{ - public ProductNotFoundException(Guid id) - : base($"product with id {id} not found") - { - } -} diff --git a/src/api/modules/Catalog/Catalog.Domain/Product.cs b/src/api/modules/Catalog/Catalog.Domain/Product.cs deleted file mode 100644 index e1ebd863ff..0000000000 --- a/src/api/modules/Catalog/Catalog.Domain/Product.cs +++ /dev/null @@ -1,68 +0,0 @@ -using FSH.Framework.Core.Domain; -using FSH.Framework.Core.Domain.Contracts; -using FSH.Starter.WebApi.Catalog.Domain.Events; - -namespace FSH.Starter.WebApi.Catalog.Domain; -public class Product : AuditableEntity, IAggregateRoot -{ - public string Name { get; private set; } = string.Empty; - public string? Description { get; private set; } - public decimal Price { get; private set; } - public Guid? BrandId { get; private set; } - public virtual Brand Brand { get; private set; } = default!; - - private Product() { } - - private Product(Guid id, string name, string? description, decimal price, Guid? brandId) - { - Id = id; - Name = name; - Description = description; - Price = price; - BrandId = brandId; - - QueueDomainEvent(new ProductCreated { Product = this }); - } - - public static Product Create(string name, string? description, decimal price, Guid? brandId) - { - return new Product(Guid.NewGuid(), name, description, price, brandId); - } - - public Product Update(string? name, string? description, decimal? price, Guid? brandId) - { - bool isUpdated = false; - - if (!string.IsNullOrWhiteSpace(name) && !string.Equals(Name, name, StringComparison.OrdinalIgnoreCase)) - { - Name = name; - isUpdated = true; - } - - if (!string.Equals(Description, description, StringComparison.OrdinalIgnoreCase)) - { - Description = description; - isUpdated = true; - } - - if (price.HasValue && Price != price.Value) - { - Price = price.Value; - isUpdated = true; - } - - if (brandId.HasValue && brandId.Value != Guid.Empty && BrandId != brandId.Value) - { - BrandId = brandId.Value; - isUpdated = true; - } - - if (isUpdated) - { - QueueDomainEvent(new ProductUpdated { Product = this }); - } - - return this; - } -} - diff --git a/src/api/modules/Catalog/Catalog.Infrastructure/Catalog.Infrastructure.csproj b/src/api/modules/Catalog/Catalog.Infrastructure/Catalog.Infrastructure.csproj deleted file mode 100644 index 7607e1698f..0000000000 --- a/src/api/modules/Catalog/Catalog.Infrastructure/Catalog.Infrastructure.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - FSH.Starter.WebApi.Catalog.Infrastructure - FSH.Starter.WebApi.Catalog.Infrastructure - - - - - - - - - - - diff --git a/src/api/modules/Catalog/Catalog.Infrastructure/CatalogModule.cs b/src/api/modules/Catalog/Catalog.Infrastructure/CatalogModule.cs deleted file mode 100644 index 8327a6a9a0..0000000000 --- a/src/api/modules/Catalog/Catalog.Infrastructure/CatalogModule.cs +++ /dev/null @@ -1,50 +0,0 @@ -using Carter; -using FSH.Framework.Core.Persistence; -using FSH.Framework.Infrastructure.Persistence; -using FSH.Starter.WebApi.Catalog.Domain; -using FSH.Starter.WebApi.Catalog.Infrastructure.Endpoints.v1; -using FSH.Starter.WebApi.Catalog.Infrastructure.Persistence; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; -using Microsoft.Extensions.DependencyInjection; - -namespace FSH.Starter.WebApi.Catalog.Infrastructure; -public static class CatalogModule -{ - public class Endpoints : CarterModule - { - public Endpoints() : base("catalog") { } - public override void AddRoutes(IEndpointRouteBuilder app) - { - var productGroup = app.MapGroup("products").WithTags("products"); - productGroup.MapProductCreationEndpoint(); - productGroup.MapGetProductEndpoint(); - productGroup.MapGetProductListEndpoint(); - productGroup.MapProductUpdateEndpoint(); - productGroup.MapProductDeleteEndpoint(); - - var brandGroup = app.MapGroup("brands").WithTags("brands"); - brandGroup.MapBrandCreationEndpoint(); - brandGroup.MapGetBrandEndpoint(); - brandGroup.MapGetBrandListEndpoint(); - brandGroup.MapBrandUpdateEndpoint(); - brandGroup.MapBrandDeleteEndpoint(); - } - } - public static WebApplicationBuilder RegisterCatalogServices(this WebApplicationBuilder builder) - { - ArgumentNullException.ThrowIfNull(builder); - builder.Services.BindDbContext(); - builder.Services.AddScoped(); - builder.Services.AddKeyedScoped, CatalogRepository>("catalog:products"); - builder.Services.AddKeyedScoped, CatalogRepository>("catalog:products"); - builder.Services.AddKeyedScoped, CatalogRepository>("catalog:brands"); - builder.Services.AddKeyedScoped, CatalogRepository>("catalog:brands"); - return builder; - } - public static WebApplication UseCatalogModule(this WebApplication app) - { - return app; - } -} diff --git a/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/CreateBrandEndpoint.cs b/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/CreateBrandEndpoint.cs deleted file mode 100644 index b7adb6b9bf..0000000000 --- a/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/CreateBrandEndpoint.cs +++ /dev/null @@ -1,26 +0,0 @@ -using FSH.Framework.Infrastructure.Auth.Policy; -using FSH.Starter.WebApi.Catalog.Application.Brands.Create.v1; -using MediatR; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Starter.WebApi.Catalog.Infrastructure.Endpoints.v1; -public static class CreateBrandEndpoint -{ - internal static RouteHandlerBuilder MapBrandCreationEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints - .MapPost("/", async (CreateBrandCommand request, ISender mediator) => - { - var response = await mediator.Send(request); - return Results.Ok(response); - }) - .WithName(nameof(CreateBrandEndpoint)) - .WithSummary("creates a brand") - .WithDescription("creates a brand") - .Produces() - .RequirePermission("Permissions.Brands.Create") - .MapToApiVersion(1); - } -} diff --git a/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/CreateProductEndpoint.cs b/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/CreateProductEndpoint.cs deleted file mode 100644 index 1e018c0ed8..0000000000 --- a/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/CreateProductEndpoint.cs +++ /dev/null @@ -1,26 +0,0 @@ -using FSH.Framework.Infrastructure.Auth.Policy; -using FSH.Starter.WebApi.Catalog.Application.Products.Create.v1; -using MediatR; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Starter.WebApi.Catalog.Infrastructure.Endpoints.v1; -public static class CreateProductEndpoint -{ - internal static RouteHandlerBuilder MapProductCreationEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints - .MapPost("/", async (CreateProductCommand request, ISender mediator) => - { - var response = await mediator.Send(request); - return Results.Ok(response); - }) - .WithName(nameof(CreateProductEndpoint)) - .WithSummary("creates a product") - .WithDescription("creates a product") - .Produces() - .RequirePermission("Permissions.Products.Create") - .MapToApiVersion(1); - } -} diff --git a/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/DeleteBrandEndpoint.cs b/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/DeleteBrandEndpoint.cs deleted file mode 100644 index 3b39820dce..0000000000 --- a/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/DeleteBrandEndpoint.cs +++ /dev/null @@ -1,26 +0,0 @@ -using FSH.Framework.Infrastructure.Auth.Policy; -using FSH.Starter.WebApi.Catalog.Application.Brands.Delete.v1; -using MediatR; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Starter.WebApi.Catalog.Infrastructure.Endpoints.v1; -public static class DeleteBrandEndpoint -{ - internal static RouteHandlerBuilder MapBrandDeleteEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints - .MapDelete("/{id:guid}", async (Guid id, ISender mediator) => - { - await mediator.Send(new DeleteBrandCommand(id)); - return Results.NoContent(); - }) - .WithName(nameof(DeleteBrandEndpoint)) - .WithSummary("deletes brand by id") - .WithDescription("deletes brand by id") - .Produces(StatusCodes.Status204NoContent) - .RequirePermission("Permissions.Brands.Delete") - .MapToApiVersion(1); - } -} diff --git a/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/DeleteProductEndpoint.cs b/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/DeleteProductEndpoint.cs deleted file mode 100644 index c5c25fce2a..0000000000 --- a/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/DeleteProductEndpoint.cs +++ /dev/null @@ -1,26 +0,0 @@ -using FSH.Framework.Infrastructure.Auth.Policy; -using FSH.Starter.WebApi.Catalog.Application.Products.Delete.v1; -using MediatR; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Starter.WebApi.Catalog.Infrastructure.Endpoints.v1; -public static class DeleteProductEndpoint -{ - internal static RouteHandlerBuilder MapProductDeleteEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints - .MapDelete("/{id:guid}", async (Guid id, ISender mediator) => - { - await mediator.Send(new DeleteProductCommand(id)); - return Results.NoContent(); - }) - .WithName(nameof(DeleteProductEndpoint)) - .WithSummary("deletes product by id") - .WithDescription("deletes product by id") - .Produces(StatusCodes.Status204NoContent) - .RequirePermission("Permissions.Products.Delete") - .MapToApiVersion(1); - } -} diff --git a/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/GetBrandEndpoint.cs b/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/GetBrandEndpoint.cs deleted file mode 100644 index 13600025c9..0000000000 --- a/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/GetBrandEndpoint.cs +++ /dev/null @@ -1,26 +0,0 @@ -using FSH.Framework.Infrastructure.Auth.Policy; -using FSH.Starter.WebApi.Catalog.Application.Brands.Get.v1; -using MediatR; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Starter.WebApi.Catalog.Infrastructure.Endpoints.v1; -public static class GetBrandEndpoint -{ - internal static RouteHandlerBuilder MapGetBrandEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints - .MapGet("/{id:guid}", async (Guid id, ISender mediator) => - { - var response = await mediator.Send(new GetBrandRequest(id)); - return Results.Ok(response); - }) - .WithName(nameof(GetBrandEndpoint)) - .WithSummary("gets brand by id") - .WithDescription("gets brand by id") - .Produces() - .RequirePermission("Permissions.Brands.View") - .MapToApiVersion(1); - } -} diff --git a/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/GetProductEndpoint.cs b/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/GetProductEndpoint.cs deleted file mode 100644 index 7fd15eb1f7..0000000000 --- a/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/GetProductEndpoint.cs +++ /dev/null @@ -1,26 +0,0 @@ -using FSH.Framework.Infrastructure.Auth.Policy; -using FSH.Starter.WebApi.Catalog.Application.Products.Get.v1; -using MediatR; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Starter.WebApi.Catalog.Infrastructure.Endpoints.v1; -public static class GetProductEndpoint -{ - internal static RouteHandlerBuilder MapGetProductEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints - .MapGet("/{id:guid}", async (Guid id, ISender mediator) => - { - var response = await mediator.Send(new GetProductRequest(id)); - return Results.Ok(response); - }) - .WithName(nameof(GetProductEndpoint)) - .WithSummary("gets product by id") - .WithDescription("gets prodct by id") - .Produces() - .RequirePermission("Permissions.Products.View") - .MapToApiVersion(1); - } -} diff --git a/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/SearchBrandsEndpoint.cs b/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/SearchBrandsEndpoint.cs deleted file mode 100644 index bc6d9a83f0..0000000000 --- a/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/SearchBrandsEndpoint.cs +++ /dev/null @@ -1,30 +0,0 @@ -using FSH.Framework.Core.Paging; -using FSH.Framework.Infrastructure.Auth.Policy; -using FSH.Starter.WebApi.Catalog.Application.Brands.Get.v1; -using FSH.Starter.WebApi.Catalog.Application.Brands.Search.v1; -using MediatR; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Starter.WebApi.Catalog.Infrastructure.Endpoints.v1; - -public static class SearchBrandsEndpoint -{ - internal static RouteHandlerBuilder MapGetBrandListEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints - .MapPost("/search", async (ISender mediator, [FromBody] SearchBrandsCommand command) => - { - var response = await mediator.Send(command); - return Results.Ok(response); - }) - .WithName(nameof(SearchBrandsEndpoint)) - .WithSummary("Gets a list of brands") - .WithDescription("Gets a list of brands with pagination and filtering support") - .Produces>() - .RequirePermission("Permissions.Brands.View") - .MapToApiVersion(1); - } -} diff --git a/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/SearchProductsEndpoint.cs b/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/SearchProductsEndpoint.cs deleted file mode 100644 index e3d058006b..0000000000 --- a/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/SearchProductsEndpoint.cs +++ /dev/null @@ -1,31 +0,0 @@ -using FSH.Framework.Core.Paging; -using FSH.Framework.Infrastructure.Auth.Policy; -using FSH.Starter.WebApi.Catalog.Application.Products.Get.v1; -using FSH.Starter.WebApi.Catalog.Application.Products.Search.v1; -using MediatR; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Starter.WebApi.Catalog.Infrastructure.Endpoints.v1; - -public static class SearchProductsEndpoint -{ - internal static RouteHandlerBuilder MapGetProductListEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints - .MapPost("/search", async (ISender mediator, [FromBody] SearchProductsCommand command) => - { - var response = await mediator.Send(command); - return Results.Ok(response); - }) - .WithName(nameof(SearchProductsEndpoint)) - .WithSummary("Gets a list of products") - .WithDescription("Gets a list of products with pagination and filtering support") - .Produces>() - .RequirePermission("Permissions.Products.View") - .MapToApiVersion(1); - } -} - diff --git a/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/UpdateBrandEndpoint.cs b/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/UpdateBrandEndpoint.cs deleted file mode 100644 index 3e07b34bef..0000000000 --- a/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/UpdateBrandEndpoint.cs +++ /dev/null @@ -1,27 +0,0 @@ -using FSH.Framework.Infrastructure.Auth.Policy; -using FSH.Starter.WebApi.Catalog.Application.Brands.Update.v1; -using MediatR; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Starter.WebApi.Catalog.Infrastructure.Endpoints.v1; -public static class UpdateBrandEndpoint -{ - internal static RouteHandlerBuilder MapBrandUpdateEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints - .MapPut("/{id:guid}", async (Guid id, UpdateBrandCommand request, ISender mediator) => - { - if (id != request.Id) return Results.BadRequest(); - var response = await mediator.Send(request); - return Results.Ok(response); - }) - .WithName(nameof(UpdateBrandEndpoint)) - .WithSummary("update a brand") - .WithDescription("update a brand") - .Produces() - .RequirePermission("Permissions.Brands.Update") - .MapToApiVersion(1); - } -} diff --git a/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/UpdateProductEndpoint.cs b/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/UpdateProductEndpoint.cs deleted file mode 100644 index e3ee4f3e55..0000000000 --- a/src/api/modules/Catalog/Catalog.Infrastructure/Endpoints/v1/UpdateProductEndpoint.cs +++ /dev/null @@ -1,27 +0,0 @@ -using FSH.Framework.Infrastructure.Auth.Policy; -using FSH.Starter.WebApi.Catalog.Application.Products.Update.v1; -using MediatR; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Starter.WebApi.Catalog.Infrastructure.Endpoints.v1; -public static class UpdateProductEndpoint -{ - internal static RouteHandlerBuilder MapProductUpdateEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints - .MapPut("/{id:guid}", async (Guid id, UpdateProductCommand request, ISender mediator) => - { - if (id != request.Id) return Results.BadRequest(); - var response = await mediator.Send(request); - return Results.Ok(response); - }) - .WithName(nameof(UpdateProductEndpoint)) - .WithSummary("update a product") - .WithDescription("update a product") - .Produces() - .RequirePermission("Permissions.Products.Update") - .MapToApiVersion(1); - } -} diff --git a/src/api/modules/Catalog/Catalog.Infrastructure/Persistence/CatalogDbContext.cs b/src/api/modules/Catalog/Catalog.Infrastructure/Persistence/CatalogDbContext.cs deleted file mode 100644 index dddec6be7f..0000000000 --- a/src/api/modules/Catalog/Catalog.Infrastructure/Persistence/CatalogDbContext.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Finbuckle.MultiTenant.Abstractions; -using FSH.Framework.Core.Persistence; -using FSH.Framework.Infrastructure.Persistence; -using FSH.Framework.Infrastructure.Tenant; -using FSH.Starter.WebApi.Catalog.Domain; -using MediatR; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Options; -using Shared.Constants; - -namespace FSH.Starter.WebApi.Catalog.Infrastructure.Persistence; - -public sealed class CatalogDbContext : FshDbContext -{ - public CatalogDbContext(IMultiTenantContextAccessor multiTenantContextAccessor, DbContextOptions options, IPublisher publisher, IOptions settings) - : base(multiTenantContextAccessor, options, publisher, settings) - { - } - - public DbSet Products { get; set; } = null!; - public DbSet Brands { get; set; } = null!; - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - ArgumentNullException.ThrowIfNull(modelBuilder); - base.OnModelCreating(modelBuilder); - modelBuilder.ApplyConfigurationsFromAssembly(typeof(CatalogDbContext).Assembly); - modelBuilder.HasDefaultSchema(SchemaNames.Catalog); - } -} diff --git a/src/api/modules/Catalog/Catalog.Infrastructure/Persistence/CatalogDbInitializer.cs b/src/api/modules/Catalog/Catalog.Infrastructure/Persistence/CatalogDbInitializer.cs deleted file mode 100644 index db213a0624..0000000000 --- a/src/api/modules/Catalog/Catalog.Infrastructure/Persistence/CatalogDbInitializer.cs +++ /dev/null @@ -1,34 +0,0 @@ -using FSH.Framework.Core.Persistence; -using FSH.Starter.WebApi.Catalog.Domain; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Logging; - -namespace FSH.Starter.WebApi.Catalog.Infrastructure.Persistence; -internal sealed class CatalogDbInitializer( - ILogger logger, - CatalogDbContext context) : IDbInitializer -{ - public async Task MigrateAsync(CancellationToken cancellationToken) - { - if ((await context.Database.GetPendingMigrationsAsync(cancellationToken)).Any()) - { - await context.Database.MigrateAsync(cancellationToken).ConfigureAwait(false); - logger.LogInformation("[{Tenant}] applied database migrations for catalog module", context.TenantInfo!.Identifier); - } - } - - public async Task SeedAsync(CancellationToken cancellationToken) - { - const string Name = "Keychron V6 QMK Custom Wired Mechanical Keyboard"; - const string Description = "A full-size layout QMK/VIA custom mechanical keyboard"; - const decimal Price = 79; - Guid? BrandId = null; - if (await context.Products.FirstOrDefaultAsync(t => t.Name == Name, cancellationToken).ConfigureAwait(false) is null) - { - var product = Product.Create(Name, Description, Price, BrandId); - await context.Products.AddAsync(product, cancellationToken); - await context.SaveChangesAsync(cancellationToken).ConfigureAwait(false); - logger.LogInformation("[{Tenant}] seeding default catalog data", context.TenantInfo!.Identifier); - } - } -} diff --git a/src/api/modules/Catalog/Catalog.Infrastructure/Persistence/CatalogRepository.cs b/src/api/modules/Catalog/Catalog.Infrastructure/Persistence/CatalogRepository.cs deleted file mode 100644 index baa1292f08..0000000000 --- a/src/api/modules/Catalog/Catalog.Infrastructure/Persistence/CatalogRepository.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Ardalis.Specification; -using Ardalis.Specification.EntityFrameworkCore; -using FSH.Framework.Core.Domain.Contracts; -using FSH.Framework.Core.Persistence; -using Mapster; - -namespace FSH.Starter.WebApi.Catalog.Infrastructure.Persistence; -internal sealed class CatalogRepository : RepositoryBase, IReadRepository, IRepository - where T : class, IAggregateRoot -{ - public CatalogRepository(CatalogDbContext context) - : base(context) - { - } - - // We override the default behavior when mapping to a dto. - // We're using Mapster's ProjectToType here to immediately map the result from the database. - // This is only done when no Selector is defined, so regular specifications with a selector also still work. - protected override IQueryable ApplySpecification(ISpecification specification) => - specification.Selector is not null - ? base.ApplySpecification(specification) - : ApplySpecification(specification, false) - .ProjectToType(); -} diff --git a/src/api/modules/Catalog/Catalog.Infrastructure/Persistence/Configurations/BrandConfigurations.cs b/src/api/modules/Catalog/Catalog.Infrastructure/Persistence/Configurations/BrandConfigurations.cs deleted file mode 100644 index 0abf96da30..0000000000 --- a/src/api/modules/Catalog/Catalog.Infrastructure/Persistence/Configurations/BrandConfigurations.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Finbuckle.MultiTenant; -using FSH.Starter.WebApi.Catalog.Domain; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Metadata.Builders; - -namespace FSH.Starter.WebApi.Catalog.Infrastructure.Persistence.Configurations; -internal sealed class BrandConfiguration : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.IsMultiTenant(); - builder.HasKey(x => x.Id); - builder.Property(x => x.Name).HasMaxLength(100); - builder.Property(x => x.Description).HasMaxLength(1000); - } -} diff --git a/src/api/modules/Catalog/Catalog.Infrastructure/Persistence/Configurations/ProductConfiguration.cs b/src/api/modules/Catalog/Catalog.Infrastructure/Persistence/Configurations/ProductConfiguration.cs deleted file mode 100644 index fc1cfffa92..0000000000 --- a/src/api/modules/Catalog/Catalog.Infrastructure/Persistence/Configurations/ProductConfiguration.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Finbuckle.MultiTenant; -using FSH.Starter.WebApi.Catalog.Domain; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Metadata.Builders; - -namespace FSH.Starter.WebApi.Catalog.Infrastructure.Persistence.Configurations; -internal sealed class ProductConfiguration : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.IsMultiTenant(); - builder.HasKey(x => x.Id); - builder.Property(x => x.Name).HasMaxLength(100); - builder.Property(x => x.Description).HasMaxLength(1000); - } -} diff --git a/src/api/modules/Catalog/CatalogModule.cs b/src/api/modules/Catalog/CatalogModule.cs deleted file mode 100644 index e90fd3c217..0000000000 --- a/src/api/modules/Catalog/CatalogModule.cs +++ /dev/null @@ -1,32 +0,0 @@ -using Carter; -using FSH.WebApi.Modules.Catalog.Features.Products.ProductCreation.v1; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.WebApi.Modules.Catalog; - -public static class CatalogModule -{ - public class Endpoints : CarterModule - { - public Endpoints() : base("catalog") { } - public override void AddRoutes(IEndpointRouteBuilder app) - { - var productGroup = app.MapGroup("products").WithTags("products"); - productGroup.MapProductCreationEndpoint(); - - var testGroup = app.MapGroup("test").WithTags("test"); - testGroup.MapGet("/test", () => "hi"); - } - } - public static WebApplicationBuilder RegisterCatalogServices(this WebApplicationBuilder builder) - { - ArgumentNullException.ThrowIfNull(builder); - return builder; - } - public static WebApplication UseCatalogModule(this WebApplication app) - { - return app; - } -} diff --git a/src/api/modules/Todo/Domain/Events/TodoItemCreated.cs b/src/api/modules/Todo/Domain/Events/TodoItemCreated.cs deleted file mode 100644 index 224e6de853..0000000000 --- a/src/api/modules/Todo/Domain/Events/TodoItemCreated.cs +++ /dev/null @@ -1,22 +0,0 @@ - -using FSH.Framework.Core.Caching; -using FSH.Framework.Core.Domain.Events; -using FSH.Starter.WebApi.Todo.Features.Get.v1; -using MediatR; -using Microsoft.Extensions.Logging; - -namespace FSH.Starter.WebApi.Todo.Domain.Events; -public record TodoItemCreated(Guid Id, string Title, string Note) : DomainEvent; - -public class TodoItemCreatedEventHandler( - ILogger logger, - ICacheService cache) - : INotificationHandler -{ - public async Task Handle(TodoItemCreated notification, CancellationToken cancellationToken) - { - logger.LogInformation("handling todo item created domain event.."); - var cacheResponse = new GetTodoResponse(notification.Id, notification.Title, notification.Note); - await cache.SetAsync($"todo:{notification.Id}", cacheResponse, cancellationToken: cancellationToken); - } -} diff --git a/src/api/modules/Todo/Domain/Events/TodoItemUpdated.cs b/src/api/modules/Todo/Domain/Events/TodoItemUpdated.cs deleted file mode 100644 index c5a11e85b8..0000000000 --- a/src/api/modules/Todo/Domain/Events/TodoItemUpdated.cs +++ /dev/null @@ -1,22 +0,0 @@ - -using FSH.Framework.Core.Caching; -using FSH.Framework.Core.Domain.Events; -using FSH.Starter.WebApi.Todo.Features.Get.v1; -using MediatR; -using Microsoft.Extensions.Logging; - -namespace FSH.Starter.WebApi.Todo.Domain.Events; -public record TodoItemUpdated(TodoItem item) : DomainEvent; - -public class TodoItemUpdatedEventHandler( - ILogger logger, - ICacheService cache) - : INotificationHandler -{ - public async Task Handle(TodoItemUpdated notification, CancellationToken cancellationToken) - { - logger.LogInformation("handling todo item update domain event.."); - var cacheResponse = new GetTodoResponse(notification.item.Id, notification.item.Title, notification.item.Note); - await cache.SetAsync($"todo:{notification.item.Id}", cacheResponse, cancellationToken: cancellationToken); - } -} diff --git a/src/api/modules/Todo/Domain/TodoItem.cs b/src/api/modules/Todo/Domain/TodoItem.cs deleted file mode 100644 index 0e32a2add5..0000000000 --- a/src/api/modules/Todo/Domain/TodoItem.cs +++ /dev/null @@ -1,46 +0,0 @@ -using FSH.Framework.Core.Domain; -using FSH.Framework.Core.Domain.Contracts; -using FSH.Starter.WebApi.Todo.Domain.Events; - -namespace FSH.Starter.WebApi.Todo.Domain; -public sealed class TodoItem : AuditableEntity, IAggregateRoot -{ - public string Title { get; private set; } = string.Empty; - public string Note { get; private set; } = string.Empty; - - private TodoItem() { } - - private TodoItem(string title, string note) - { - Title = title; - Note = note; - QueueDomainEvent(new TodoItemCreated(Id, Title, Note)); - TodoMetrics.Created.Add(1); - } - - public static TodoItem Create(string title, string note) => new(title, note); - - public TodoItem Update(string? title, string? note) - { - bool isUpdated = false; - - if (!string.IsNullOrWhiteSpace(title) && !string.Equals(Title, title, StringComparison.OrdinalIgnoreCase)) - { - Title = title; - isUpdated = true; - } - - if (!string.IsNullOrWhiteSpace(note) && !string.Equals(Note, note, StringComparison.OrdinalIgnoreCase)) - { - Note = note; - isUpdated = true; - } - - if (isUpdated) - { - QueueDomainEvent(new TodoItemUpdated(this)); - } - - return this; - } -} diff --git a/src/api/modules/Todo/Domain/TodoMetrics.cs b/src/api/modules/Todo/Domain/TodoMetrics.cs deleted file mode 100644 index cdd98b8df6..0000000000 --- a/src/api/modules/Todo/Domain/TodoMetrics.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Diagnostics.Metrics; -using FSH.Starter.Aspire.ServiceDefaults; - -namespace FSH.Starter.WebApi.Todo.Domain; - -public static class TodoMetrics -{ - private static readonly Meter Meter = new Meter(MetricsConstants.Todos, "1.0.0"); - public static readonly Counter Created = Meter.CreateCounter("items.created"); - public static readonly Counter Updated = Meter.CreateCounter("items.updated"); - public static readonly Counter Deleted = Meter.CreateCounter("items.deleted"); -} - diff --git a/src/api/modules/Todo/Exceptions/TodoItemNotFoundException.cs b/src/api/modules/Todo/Exceptions/TodoItemNotFoundException.cs deleted file mode 100644 index 39ab54f701..0000000000 --- a/src/api/modules/Todo/Exceptions/TodoItemNotFoundException.cs +++ /dev/null @@ -1,10 +0,0 @@ -using FSH.Framework.Core.Exceptions; - -namespace FSH.Starter.WebApi.Todo.Exceptions; -internal sealed class TodoItemNotFoundException : NotFoundException -{ - public TodoItemNotFoundException(Guid id) - : base($"todo item with id {id} not found") - { - } -} diff --git a/src/api/modules/Todo/Features/Create/v1/CreateTodoCommand.cs b/src/api/modules/Todo/Features/Create/v1/CreateTodoCommand.cs deleted file mode 100644 index 7834dbfe81..0000000000 --- a/src/api/modules/Todo/Features/Create/v1/CreateTodoCommand.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.ComponentModel; -using MediatR; - -namespace FSH.Starter.WebApi.Todo.Features.Create.v1; -public record CreateTodoCommand( - [property: DefaultValue("Hello World!")] string Title, - [property: DefaultValue("Important Note.")] string Note) : IRequest; - - - diff --git a/src/api/modules/Todo/Features/Create/v1/CreateTodoEndpoint.cs b/src/api/modules/Todo/Features/Create/v1/CreateTodoEndpoint.cs deleted file mode 100644 index 7ad7673107..0000000000 --- a/src/api/modules/Todo/Features/Create/v1/CreateTodoEndpoint.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Asp.Versioning; -using FSH.Framework.Infrastructure.Auth.Policy; -using MediatR; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Starter.WebApi.Todo.Features.Create.v1; -public static class CreateTodoEndpoint -{ - internal static RouteHandlerBuilder MapTodoItemCreationEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapPost("/", async (CreateTodoCommand request, ISender mediator) => - { - var response = await mediator.Send(request); - return Results.CreatedAtRoute(nameof(CreateTodoEndpoint), new { id = response.Id }, response); - }) - .WithName(nameof(CreateTodoEndpoint)) - .WithSummary("Creates a todo item") - .WithDescription("Creates a todo item") - .Produces(StatusCodes.Status201Created) - .RequirePermission("Permissions.Todos.Create") - .MapToApiVersion(new ApiVersion(1, 0)); - - } -} diff --git a/src/api/modules/Todo/Features/Create/v1/CreateTodoHandler.cs b/src/api/modules/Todo/Features/Create/v1/CreateTodoHandler.cs deleted file mode 100644 index c910b630bd..0000000000 --- a/src/api/modules/Todo/Features/Create/v1/CreateTodoHandler.cs +++ /dev/null @@ -1,22 +0,0 @@ -using FSH.Framework.Core.Persistence; -using FSH.Starter.WebApi.Todo.Domain; -using MediatR; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace FSH.Starter.WebApi.Todo.Features.Create.v1; -public sealed class CreateTodoHandler( - ILogger logger, - [FromKeyedServices("todo")] IRepository repository) - : IRequestHandler -{ - public async Task Handle(CreateTodoCommand request, CancellationToken cancellationToken) - { - ArgumentNullException.ThrowIfNull(request); - var item = TodoItem.Create(request.Title, request.Note); - await repository.AddAsync(item, cancellationToken).ConfigureAwait(false); - await repository.SaveChangesAsync(cancellationToken).ConfigureAwait(false); - logger.LogInformation("todo item created {TodoItemId}", item.Id); - return new CreateTodoResponse(item.Id); - } -} diff --git a/src/api/modules/Todo/Features/Create/v1/CreateTodoResponse.cs b/src/api/modules/Todo/Features/Create/v1/CreateTodoResponse.cs deleted file mode 100644 index d50f053479..0000000000 --- a/src/api/modules/Todo/Features/Create/v1/CreateTodoResponse.cs +++ /dev/null @@ -1,2 +0,0 @@ -namespace FSH.Starter.WebApi.Todo.Features.Create.v1; -public record CreateTodoResponse(Guid? Id); diff --git a/src/api/modules/Todo/Features/Create/v1/CreateTodoValidator.cs b/src/api/modules/Todo/Features/Create/v1/CreateTodoValidator.cs deleted file mode 100644 index 8549f6a3ce..0000000000 --- a/src/api/modules/Todo/Features/Create/v1/CreateTodoValidator.cs +++ /dev/null @@ -1,12 +0,0 @@ -using FluentValidation; -using FSH.Starter.WebApi.Todo.Persistence; - -namespace FSH.Starter.WebApi.Todo.Features.Create.v1; -public class CreateTodoValidator : AbstractValidator -{ - public CreateTodoValidator(TodoDbContext context) - { - RuleFor(p => p.Title).NotEmpty(); - RuleFor(p => p.Note).NotEmpty(); - } -} diff --git a/src/api/modules/Todo/Features/Delete/v1/DeleteTodoCommand.cs b/src/api/modules/Todo/Features/Delete/v1/DeleteTodoCommand.cs deleted file mode 100644 index 86388518a4..0000000000 --- a/src/api/modules/Todo/Features/Delete/v1/DeleteTodoCommand.cs +++ /dev/null @@ -1,8 +0,0 @@ -using MediatR; - -namespace FSH.Starter.WebApi.Todo.Features.Delete.v1; -public sealed record DeleteTodoCommand( - Guid Id) : IRequest; - - - diff --git a/src/api/modules/Todo/Features/Delete/v1/DeleteTodoEndpoint.cs b/src/api/modules/Todo/Features/Delete/v1/DeleteTodoEndpoint.cs deleted file mode 100644 index b73b0658d9..0000000000 --- a/src/api/modules/Todo/Features/Delete/v1/DeleteTodoEndpoint.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Asp.Versioning; -using FSH.Framework.Infrastructure.Auth.Policy; -using MediatR; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Starter.WebApi.Todo.Features.Delete.v1; -public static class DeleteTodoEndpoint -{ - internal static RouteHandlerBuilder MapTodoItemDeletionEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints - .MapDelete("/{id:guid}", async (Guid id, ISender mediator) => - { - await mediator.Send(new DeleteTodoCommand(id)); - return Results.NoContent(); - }) - .WithName(nameof(DeleteTodoEndpoint)) - .WithSummary("Deletes a todo item") - .WithDescription("Deleted a todo item") - .Produces(StatusCodes.Status204NoContent) - .RequirePermission("Permissions.Todos.Delete") - .MapToApiVersion(new ApiVersion(1, 0)); - - } -} diff --git a/src/api/modules/Todo/Features/Delete/v1/DeleteTodoHandler.cs b/src/api/modules/Todo/Features/Delete/v1/DeleteTodoHandler.cs deleted file mode 100644 index 0574538757..0000000000 --- a/src/api/modules/Todo/Features/Delete/v1/DeleteTodoHandler.cs +++ /dev/null @@ -1,22 +0,0 @@ -using FSH.Framework.Core.Persistence; -using FSH.Starter.WebApi.Todo.Domain; -using FSH.Starter.WebApi.Todo.Exceptions; -using MediatR; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace FSH.Starter.WebApi.Todo.Features.Delete.v1; -public sealed class DeleteTodoHandler( - ILogger logger, - [FromKeyedServices("todo")] IRepository repository) - : IRequestHandler -{ - public async Task Handle(DeleteTodoCommand request, CancellationToken cancellationToken) - { - ArgumentNullException.ThrowIfNull(request); - var todoItem = await repository.GetByIdAsync(request.Id, cancellationToken); - _ = todoItem ?? throw new TodoItemNotFoundException(request.Id); - await repository.DeleteAsync(todoItem, cancellationToken); - logger.LogInformation("todo with id : {TodoId} deleted", todoItem.Id); - } -} diff --git a/src/api/modules/Todo/Features/Get/v1/GetTodoEndpoint.cs b/src/api/modules/Todo/Features/Get/v1/GetTodoEndpoint.cs deleted file mode 100644 index 1f039d9d73..0000000000 --- a/src/api/modules/Todo/Features/Get/v1/GetTodoEndpoint.cs +++ /dev/null @@ -1,24 +0,0 @@ -using FSH.Framework.Infrastructure.Auth.Policy; -using MediatR; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Starter.WebApi.Todo.Features.Get.v1; -public static class GetTodoEndpoint -{ - internal static RouteHandlerBuilder MapGetTodoEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapGet("/{id:guid}", async (Guid id, ISender mediator) => - { - var response = await mediator.Send(new GetTodoRequest(id)); - return Results.Ok(response); - }) - .WithName(nameof(GetTodoEndpoint)) - .WithSummary("gets todo item by id") - .WithDescription("gets todo item by id") - .Produces() - .RequirePermission("Permissions.Todos.View") - .MapToApiVersion(1); - } -} diff --git a/src/api/modules/Todo/Features/Get/v1/GetTodoHandler.cs b/src/api/modules/Todo/Features/Get/v1/GetTodoHandler.cs deleted file mode 100644 index 9d7d679363..0000000000 --- a/src/api/modules/Todo/Features/Get/v1/GetTodoHandler.cs +++ /dev/null @@ -1,28 +0,0 @@ -using FSH.Framework.Core.Caching; -using FSH.Framework.Core.Persistence; -using FSH.Starter.WebApi.Todo.Domain; -using FSH.Starter.WebApi.Todo.Exceptions; -using MediatR; -using Microsoft.Extensions.DependencyInjection; - -namespace FSH.Starter.WebApi.Todo.Features.Get.v1; -public sealed class GetTodoHandler( - [FromKeyedServices("todo")] IReadRepository repository, - ICacheService cache) - : IRequestHandler -{ - public async Task Handle(GetTodoRequest request, CancellationToken cancellationToken) - { - ArgumentNullException.ThrowIfNull(request); - var item = await cache.GetOrSetAsync( - $"todo:{request.Id}", - async () => - { - var todoItem = await repository.GetByIdAsync(request.Id, cancellationToken); - if (todoItem == null) throw new TodoItemNotFoundException(request.Id); - return new GetTodoResponse(todoItem.Id, todoItem.Title!, todoItem.Note!); - }, - cancellationToken: cancellationToken); - return item!; - } -} diff --git a/src/api/modules/Todo/Features/Get/v1/GetTodoRequest.cs b/src/api/modules/Todo/Features/Get/v1/GetTodoRequest.cs deleted file mode 100644 index 6569694ca5..0000000000 --- a/src/api/modules/Todo/Features/Get/v1/GetTodoRequest.cs +++ /dev/null @@ -1,8 +0,0 @@ -using MediatR; - -namespace FSH.Starter.WebApi.Todo.Features.Get.v1; -public class GetTodoRequest : IRequest -{ - public Guid Id { get; set; } - public GetTodoRequest(Guid id) => Id = id; -} diff --git a/src/api/modules/Todo/Features/Get/v1/GetTodoResponse.cs b/src/api/modules/Todo/Features/Get/v1/GetTodoResponse.cs deleted file mode 100644 index 910288c95d..0000000000 --- a/src/api/modules/Todo/Features/Get/v1/GetTodoResponse.cs +++ /dev/null @@ -1,2 +0,0 @@ -namespace FSH.Starter.WebApi.Todo.Features.Get.v1; -public record GetTodoResponse(Guid? Id, string? Title, string? Note); diff --git a/src/api/modules/Todo/Features/GetList/v1/GetTodoListEndpoint.cs b/src/api/modules/Todo/Features/GetList/v1/GetTodoListEndpoint.cs deleted file mode 100644 index d183c3e33b..0000000000 --- a/src/api/modules/Todo/Features/GetList/v1/GetTodoListEndpoint.cs +++ /dev/null @@ -1,27 +0,0 @@ -using FSH.Framework.Core.Paging; -using FSH.Framework.Infrastructure.Auth.Policy; -using MediatR; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Starter.WebApi.Todo.Features.GetList.v1; - -public static class GetTodoListEndpoint -{ - internal static RouteHandlerBuilder MapGetTodoListEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints.MapPost("/search", async (ISender mediator, [FromBody] PaginationFilter filter) => - { - var response = await mediator.Send(new GetTodoListRequest(filter)); - return Results.Ok(response); - }) - .WithName(nameof(GetTodoListEndpoint)) - .WithSummary("Gets a list of todo items with paging support") - .WithDescription("Gets a list of todo items with paging support") - .Produces>() - .RequirePermission("Permissions.Todos.View") - .MapToApiVersion(1); - } -} diff --git a/src/api/modules/Todo/Features/GetList/v1/GetTodoListHandler.cs b/src/api/modules/Todo/Features/GetList/v1/GetTodoListHandler.cs deleted file mode 100644 index d9ad5479e9..0000000000 --- a/src/api/modules/Todo/Features/GetList/v1/GetTodoListHandler.cs +++ /dev/null @@ -1,25 +0,0 @@ -using FSH.Framework.Core.Paging; -using FSH.Framework.Core.Persistence; -using FSH.Framework.Core.Specifications; -using FSH.Starter.WebApi.Todo.Domain; -using MediatR; -using Microsoft.Extensions.DependencyInjection; - -namespace FSH.Starter.WebApi.Todo.Features.GetList.v1; - -public sealed class GetTodoListHandler( - [FromKeyedServices("todo")] IReadRepository repository) - : IRequestHandler> -{ - public async Task> Handle(GetTodoListRequest request, CancellationToken cancellationToken) - { - ArgumentNullException.ThrowIfNull(request); - - var spec = new EntitiesByPaginationFilterSpec(request.Filter); - - var items = await repository.ListAsync(spec, cancellationToken).ConfigureAwait(false); - var totalCount = await repository.CountAsync(spec, cancellationToken).ConfigureAwait(false); - - return new PagedList(items, request.Filter.PageNumber, request.Filter.PageSize, totalCount); - } -} diff --git a/src/api/modules/Todo/Features/GetList/v1/GetTodoListRequest.cs b/src/api/modules/Todo/Features/GetList/v1/GetTodoListRequest.cs deleted file mode 100644 index 349fb44a88..0000000000 --- a/src/api/modules/Todo/Features/GetList/v1/GetTodoListRequest.cs +++ /dev/null @@ -1,5 +0,0 @@ -using FSH.Framework.Core.Paging; -using MediatR; - -namespace FSH.Starter.WebApi.Todo.Features.GetList.v1; -public record GetTodoListRequest(PaginationFilter Filter) : IRequest>; diff --git a/src/api/modules/Todo/Features/GetList/v1/TodoDto.cs b/src/api/modules/Todo/Features/GetList/v1/TodoDto.cs deleted file mode 100644 index 869d34eb99..0000000000 --- a/src/api/modules/Todo/Features/GetList/v1/TodoDto.cs +++ /dev/null @@ -1,2 +0,0 @@ -namespace FSH.Starter.WebApi.Todo.Features.GetList.v1; -public record TodoDto(Guid? Id, string Title, string Note); diff --git a/src/api/modules/Todo/Features/Update/v1/UpdateTodoCommand.cs b/src/api/modules/Todo/Features/Update/v1/UpdateTodoCommand.cs deleted file mode 100644 index 89b30556c1..0000000000 --- a/src/api/modules/Todo/Features/Update/v1/UpdateTodoCommand.cs +++ /dev/null @@ -1,10 +0,0 @@ -using MediatR; - -namespace FSH.Starter.WebApi.Todo.Features.Update.v1; -public sealed record UpdateTodoCommand( - Guid Id, - string? Title, - string? Note = null): IRequest; - - - diff --git a/src/api/modules/Todo/Features/Update/v1/UpdateTodoEndpoint.cs b/src/api/modules/Todo/Features/Update/v1/UpdateTodoEndpoint.cs deleted file mode 100644 index a19b9ba901..0000000000 --- a/src/api/modules/Todo/Features/Update/v1/UpdateTodoEndpoint.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Asp.Versioning; -using FSH.Framework.Infrastructure.Auth.Policy; -using MediatR; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace FSH.Starter.WebApi.Todo.Features.Update.v1; -public static class UpdateTodoEndpoint -{ - internal static RouteHandlerBuilder MapTodoItemUpdationEndpoint(this IEndpointRouteBuilder endpoints) - { - return endpoints. - MapPut("/{id:guid}", async (Guid id, UpdateTodoCommand request, ISender mediator) => - { - if (id != request.Id) return Results.BadRequest(); - var response = await mediator.Send(request); - return Results.Ok(response); - }) - .WithName(nameof(UpdateTodoEndpoint)) - .WithSummary("Updates a todo item") - .WithDescription("Updated a todo item") - .Produces(StatusCodes.Status200OK) - .RequirePermission("Permissions.Todos.Update") - .MapToApiVersion(new ApiVersion(1, 0)); - - } -} diff --git a/src/api/modules/Todo/Features/Update/v1/UpdateTodoHandler.cs b/src/api/modules/Todo/Features/Update/v1/UpdateTodoHandler.cs deleted file mode 100644 index fa1c26653d..0000000000 --- a/src/api/modules/Todo/Features/Update/v1/UpdateTodoHandler.cs +++ /dev/null @@ -1,24 +0,0 @@ -using FSH.Framework.Core.Persistence; -using FSH.Starter.WebApi.Todo.Domain; -using FSH.Starter.WebApi.Todo.Exceptions; -using MediatR; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace FSH.Starter.WebApi.Todo.Features.Update.v1; -public sealed class UpdateTodoHandler( - ILogger logger, - [FromKeyedServices("todo")] IRepository repository) - : IRequestHandler -{ - public async Task Handle(UpdateTodoCommand request, CancellationToken cancellationToken) - { - ArgumentNullException.ThrowIfNull(request); - var todo = await repository.GetByIdAsync(request.Id, cancellationToken); - _ = todo ?? throw new TodoItemNotFoundException(request.Id); - var updatedTodo = todo.Update(request.Title, request.Note); - await repository.UpdateAsync(updatedTodo, cancellationToken); - logger.LogInformation("todo item updated {TodoItemId}", updatedTodo.Id); - return new UpdateTodoResponse(updatedTodo.Id); - } -} diff --git a/src/api/modules/Todo/Features/Update/v1/UpdateTodoResponse.cs b/src/api/modules/Todo/Features/Update/v1/UpdateTodoResponse.cs deleted file mode 100644 index b97b5c283f..0000000000 --- a/src/api/modules/Todo/Features/Update/v1/UpdateTodoResponse.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace FSH.Starter.WebApi.Todo.Features.Update.v1; -public record UpdateTodoResponse(Guid? Id); - diff --git a/src/api/modules/Todo/Features/Update/v1/UpdateTodoValidator.cs b/src/api/modules/Todo/Features/Update/v1/UpdateTodoValidator.cs deleted file mode 100644 index 9cf5935b6f..0000000000 --- a/src/api/modules/Todo/Features/Update/v1/UpdateTodoValidator.cs +++ /dev/null @@ -1,12 +0,0 @@ -using FluentValidation; -using FSH.Starter.WebApi.Todo.Persistence; - -namespace FSH.Starter.WebApi.Todo.Features.Update.v1; -public class UpdateTodoValidator : AbstractValidator -{ - public UpdateTodoValidator(TodoDbContext context) - { - RuleFor(p => p.Title).NotEmpty(); - RuleFor(p => p.Note).NotEmpty(); - } -} diff --git a/src/api/modules/Todo/Persistence/Configurations/TodoItemConfiguration.cs b/src/api/modules/Todo/Persistence/Configurations/TodoItemConfiguration.cs deleted file mode 100644 index 7b9a290db4..0000000000 --- a/src/api/modules/Todo/Persistence/Configurations/TodoItemConfiguration.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Finbuckle.MultiTenant; -using FSH.Starter.WebApi.Todo.Domain; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Metadata.Builders; - -namespace FSH.Starter.WebApi.Todo.Persistence.Configurations; -internal sealed class TodoItemConfiguration : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) - { - builder.IsMultiTenant(); - builder.HasKey(x => x.Id); - builder.Property(x => x.Title).HasMaxLength(100); - builder.Property(x => x.Note).HasMaxLength(1000); - } -} diff --git a/src/api/modules/Todo/Persistence/TodoDbContext.cs b/src/api/modules/Todo/Persistence/TodoDbContext.cs deleted file mode 100644 index e802801d4d..0000000000 --- a/src/api/modules/Todo/Persistence/TodoDbContext.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Finbuckle.MultiTenant.Abstractions; -using FSH.Framework.Core.Persistence; -using FSH.Framework.Infrastructure.Persistence; -using FSH.Framework.Infrastructure.Tenant; -using FSH.Starter.WebApi.Todo.Domain; -using MediatR; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Options; -using Shared.Constants; - -namespace FSH.Starter.WebApi.Todo.Persistence; -public sealed class TodoDbContext : FshDbContext -{ - public TodoDbContext(IMultiTenantContextAccessor multiTenantContextAccessor, DbContextOptions options, IPublisher publisher, IOptions settings) - : base(multiTenantContextAccessor, options, publisher, settings) - { - } - - public DbSet Todos { get; set; } = null!; - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - ArgumentNullException.ThrowIfNull(modelBuilder); - modelBuilder.ApplyConfigurationsFromAssembly(typeof(TodoDbContext).Assembly); - modelBuilder.HasDefaultSchema(SchemaNames.Todo); - } -} diff --git a/src/api/modules/Todo/Persistence/TodoDbInitializer.cs b/src/api/modules/Todo/Persistence/TodoDbInitializer.cs deleted file mode 100644 index 77f37affb0..0000000000 --- a/src/api/modules/Todo/Persistence/TodoDbInitializer.cs +++ /dev/null @@ -1,32 +0,0 @@ -using FSH.Framework.Core.Persistence; -using FSH.Starter.WebApi.Todo.Domain; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Logging; - -namespace FSH.Starter.WebApi.Todo.Persistence; -internal sealed class TodoDbInitializer( - ILogger logger, - TodoDbContext context) : IDbInitializer -{ - public async Task MigrateAsync(CancellationToken cancellationToken) - { - if ((await context.Database.GetPendingMigrationsAsync(cancellationToken).ConfigureAwait(false)).Any()) - { - await context.Database.MigrateAsync(cancellationToken).ConfigureAwait(false); - logger.LogInformation("[{Tenant}] applied database migrations for todo module", context.TenantInfo!.Identifier); - } - } - - public async Task SeedAsync(CancellationToken cancellationToken) - { - const string title = "Hello World!"; - const string note = "This is your first task"; - if (await context.Todos.FirstOrDefaultAsync(t => t.Title == title, cancellationToken).ConfigureAwait(false) is null) - { - var todo = TodoItem.Create(title, note); - await context.Todos.AddAsync(todo, cancellationToken); - await context.SaveChangesAsync(cancellationToken).ConfigureAwait(false); - logger.LogInformation("[{Tenant}] seeding default todo data", context.TenantInfo!.Identifier); - } - } -} diff --git a/src/api/modules/Todo/Persistence/TodoRepository.cs b/src/api/modules/Todo/Persistence/TodoRepository.cs deleted file mode 100644 index ff3904c568..0000000000 --- a/src/api/modules/Todo/Persistence/TodoRepository.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Ardalis.Specification; -using Ardalis.Specification.EntityFrameworkCore; -using FSH.Framework.Core.Domain.Contracts; -using FSH.Framework.Core.Persistence; -using Mapster; - -namespace FSH.Starter.WebApi.Todo.Persistence; -internal sealed class TodoRepository : RepositoryBase, IReadRepository, IRepository - where T : class, IAggregateRoot -{ - public TodoRepository(TodoDbContext context) - : base(context) - { - } - - // We override the default behavior when mapping to a dto. - // We're using Mapster's ProjectToType here to immediately map the result from the database. - // This is only done when no Selector is defined, so regular specifications with a selector also still work. - protected override IQueryable ApplySpecification(ISpecification specification) => - specification.Selector is not null - ? base.ApplySpecification(specification) - : ApplySpecification(specification, false) - .ProjectToType(); -} diff --git a/src/api/modules/Todo/Todo.csproj b/src/api/modules/Todo/Todo.csproj deleted file mode 100644 index d6a5873721..0000000000 --- a/src/api/modules/Todo/Todo.csproj +++ /dev/null @@ -1,10 +0,0 @@ - - - FSH.Starter.WebApi.Todo - FSH.Starter.WebApi.Todo - - - - - - diff --git a/src/api/modules/Todo/TodoModule.cs b/src/api/modules/Todo/TodoModule.cs deleted file mode 100644 index 558d9526f0..0000000000 --- a/src/api/modules/Todo/TodoModule.cs +++ /dev/null @@ -1,45 +0,0 @@ -using Carter; -using FSH.Framework.Core.Persistence; -using FSH.Framework.Infrastructure.Persistence; -using FSH.Starter.WebApi.Todo.Domain; -using FSH.Starter.WebApi.Todo.Features.Create.v1; -using FSH.Starter.WebApi.Todo.Features.Delete.v1; -using FSH.Starter.WebApi.Todo.Features.Get.v1; -using FSH.Starter.WebApi.Todo.Features.GetList.v1; -using FSH.Starter.WebApi.Todo.Features.Update.v1; -using FSH.Starter.WebApi.Todo.Persistence; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; -using Microsoft.Extensions.DependencyInjection; - -namespace FSH.Starter.WebApi.Todo; -public static class TodoModule -{ - - public class Endpoints : CarterModule - { - public override void AddRoutes(IEndpointRouteBuilder app) - { - var todoGroup = app.MapGroup("todos").WithTags("todos"); - todoGroup.MapTodoItemCreationEndpoint(); - todoGroup.MapGetTodoEndpoint(); - todoGroup.MapGetTodoListEndpoint(); - todoGroup.MapTodoItemUpdationEndpoint(); - todoGroup.MapTodoItemDeletionEndpoint(); - } - } - public static WebApplicationBuilder RegisterTodoServices(this WebApplicationBuilder builder) - { - ArgumentNullException.ThrowIfNull(builder); - builder.Services.BindDbContext(); - builder.Services.AddScoped(); - builder.Services.AddKeyedScoped, TodoRepository>("todo"); - builder.Services.AddKeyedScoped, TodoRepository>("todo"); - return builder; - } - public static WebApplication UseTodoModule(this WebApplication app) - { - return app; - } -} diff --git a/src/api/server/Extensions.cs b/src/api/server/Extensions.cs deleted file mode 100644 index cc2f773e80..0000000000 --- a/src/api/server/Extensions.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System.Reflection; -using Asp.Versioning.Conventions; -using Carter; -using FluentValidation; -using FSH.Starter.WebApi.Catalog.Application; -using FSH.Starter.WebApi.Catalog.Infrastructure; -using FSH.Starter.WebApi.Todo; - -namespace FSH.Starter.WebApi.Host; - -public static class Extensions -{ - public static WebApplicationBuilder RegisterModules(this WebApplicationBuilder builder) - { - ArgumentNullException.ThrowIfNull(builder); - - //define module assemblies - var assemblies = new Assembly[] - { - typeof(CatalogMetadata).Assembly, - typeof(TodoModule).Assembly - }; - - //register validators - builder.Services.AddValidatorsFromAssemblies(assemblies); - - //register mediatr - builder.Services.AddMediatR(cfg => - { - cfg.RegisterServicesFromAssemblies(assemblies); - }); - - //register module services - builder.RegisterCatalogServices(); - builder.RegisterTodoServices(); - - //add carter endpoint modules - builder.Services.AddCarter(configurator: config => - { - config.WithModule(); - config.WithModule(); - }); - - return builder; - } - - public static WebApplication UseModules(this WebApplication app) - { - ArgumentNullException.ThrowIfNull(app); - - //register modules - app.UseCatalogModule(); - app.UseTodoModule(); - - //register api versions - var versions = app.NewApiVersionSet() - .HasApiVersion(1) - .HasApiVersion(2) - .ReportApiVersions() - .Build(); - - //map versioned endpoint - var endpoints = app.MapGroup("api/v{version:apiVersion}").WithApiVersionSet(versions); - - //use carter - endpoints.MapCarter(); - - return app; - } -} diff --git a/src/api/server/Program.cs b/src/api/server/Program.cs deleted file mode 100644 index f8f65e281c..0000000000 --- a/src/api/server/Program.cs +++ /dev/null @@ -1,30 +0,0 @@ -using FSH.Framework.Infrastructure; -using FSH.Framework.Infrastructure.Logging.Serilog; -using FSH.Starter.WebApi.Host; -using Serilog; - -StaticLogger.EnsureInitialized(); -Log.Information("server booting up.."); -try -{ - var builder = WebApplication.CreateBuilder(args); - builder.ConfigureFshFramework(); - builder.RegisterModules(); - - var app = builder.Build(); - - app.UseFshFramework(); - app.UseModules(); - await app.RunAsync(); -} -catch (Exception ex) when (!ex.GetType().Name.Equals("HostAbortedException", StringComparison.Ordinal)) -{ - StaticLogger.EnsureInitialized(); - Log.Fatal(ex.Message, "unhandled exception"); -} -finally -{ - StaticLogger.EnsureInitialized(); - Log.Information("server shutting down.."); - await Log.CloseAndFlushAsync(); -} diff --git a/src/api/server/Properties/launchSettings.json b/src/api/server/Properties/launchSettings.json deleted file mode 100644 index 0ee67a65b6..0000000000 --- a/src/api/server/Properties/launchSettings.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "profiles": { - "Kestrel": { - "commandName": "Project", - "launchBrowser": true, - "launchUrl": "swagger", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development", - "OTEL_EXPORTER_OTLP_ENDPOINT": "http://localhost:4317", - "OTEL_SERVICE_NAME": "FSH.Starter.WebApi.Host" - }, - "dotnetRunMessages": true, - "applicationUrl": "https://localhost:7000;http://localhost:5000" - } - }, - "$schema": "http://json.schemastore.org/launchsettings.json" -} \ No newline at end of file diff --git a/src/api/server/Server.csproj b/src/api/server/Server.csproj deleted file mode 100644 index 11c255c90d..0000000000 --- a/src/api/server/Server.csproj +++ /dev/null @@ -1,37 +0,0 @@ - - - FSH.Starter.WebApi.Host - FSH.Starter.WebApi.Host - root - - - webapi - DefaultContainer - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - Always - - - Always - - - Always - - - diff --git a/src/api/server/Server.http b/src/api/server/Server.http deleted file mode 100644 index 9a38128e9d..0000000000 --- a/src/api/server/Server.http +++ /dev/null @@ -1,6 +0,0 @@ -@Server_HostAddress = http://localhost:5000 - -GET {{Server_HostAddress}}/weatherforecast/ -Accept: application/json - -### diff --git a/src/api/server/appsettings.Development.json b/src/api/server/appsettings.Development.json deleted file mode 100644 index 351acfd5df..0000000000 --- a/src/api/server/appsettings.Development.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "DatabaseOptions": { - "Provider": "postgresql", - }, - "OriginOptions": { - "OriginUrl": "https://localhost:7000" - }, - "CacheOptions": { - "Redis": "" - }, - "HangfireOptions": { - "Username": "admin", - "Password": "Secure1234!Me", - "Route": "/jobs" - }, - "JwtOptions": { - "Key": "QsJbczCNysv/5SGh+U7sxedX8C07TPQPBdsnSDKZ/aE=", - "TokenExpirationInMinutes": 60, - "RefreshTokenExpirationInDays": 7 - }, - "MailOptions": { - "From": "mukesh@fullstackhero.net", - "Host": "smtp.ethereal.email", - "Port": 587, - "DisplayName": "Mukesh Murugan" - }, - "CorsOptions": { - "AllowedOrigins": [ - "https://localhost:7100", - "http://localhost:7100", - "http://localhost:5010" - ] - }, - "Serilog": { - "Using": [ - "Serilog.Sinks.Console" - ], - "MinimumLevel": { - "Default": "Debug" - }, - "WriteTo": [ - { - "Name": "Console" - } - ] - }, - "RateLimitOptions": { - "EnableRateLimiting": false, - "PermitLimit": 5, - "WindowInSeconds": 10, - "RejectionStatusCode": 429 - }, - "SecurityHeaderOptions": { - "Enable": true, - "Headers": { - "XContentTypeOptions": "nosniff", - "ReferrerPolicy": "no-referrer", - "XXSSProtection": "1; mode=block", - "XFrameOptions": "DENY", - "ContentSecurityPolicy": "block-all-mixed-content; style-src 'self' 'unsafe-inline'; font-src 'self'; form-action 'self'; frame-ancestors 'self'; img-src 'self' data:; script-src 'self' 'unsafe-inline'", - "PermissionsPolicy": "accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()", - "StrictTransportSecurity": "max-age=31536000" - } - } -} \ No newline at end of file diff --git a/src/api/server/appsettings.json b/src/api/server/appsettings.json deleted file mode 100644 index 94292c5c98..0000000000 --- a/src/api/server/appsettings.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "DatabaseOptions": { - "Provider": "postgresql", - "ConnectionString": "Server=localhost;Database=fullstackhero;Port=5433;User Id=pgadmin;Password=pgadmin;" - }, - "OriginOptions": { - "OriginUrl": "https://localhost:7000" - }, - "CacheOptions": { - "Redis": "" - }, - "HangfireOptions": { - "Username": "admin", - "Password": "Secure1234!Me", - "Route": "/jobs" - }, - "JwtOptions": { - "Key": "QsJbczCNysv/5SGh+U7sxedX8C07TPQPBdsnSDKZ/aE=", - "TokenExpirationInMinutes": 10, - "RefreshTokenExpirationInDays": 7 - }, - "MailOptions": { - "From": "mukesh@fullstackhero.net", - "Host": "smtp.ethereal.email", - "Port": 587, - "UserName": "ruth.ruecker@ethereal.email", - "Password": "wygzuX6kpcK6AfDJcd", - "DisplayName": "Mukesh Murugan" - }, - "CorsOptions": { - "AllowedOrigins": [ - "https://localhost:7100", - "http://localhost:7100", - "http://localhost:5010" - ] - }, - "Serilog": { - "Using": [ - "Serilog.Sinks.Console" - ], - "MinimumLevel": { - "Default": "Debug" - }, - "WriteTo": [ - { - "Name": "Console" - } - ] - }, - "RateLimitOptions": { - "EnableRateLimiting": false, - "PermitLimit": 5, - "WindowInSeconds": 10, - "RejectionStatusCode": 429 - }, - "SecurityHeaderOptions": { - "Enable": true, - "Headers": { - "XContentTypeOptions": "nosniff", - "ReferrerPolicy": "no-referrer", - "XXSSProtection": "1; mode=block", - "XFrameOptions": "DENY", - "ContentSecurityPolicy": "block-all-mixed-content; style-src 'self' 'unsafe-inline'; font-src 'self'; form-action 'self'; frame-ancestors 'self'; img-src 'self' data:; script-src 'self' 'unsafe-inline'", - "PermissionsPolicy": "accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()", - "StrictTransportSecurity": "max-age=31536000" - } - } -} \ No newline at end of file diff --git a/src/api/server/assets/defaults/profile-picture.webp b/src/api/server/assets/defaults/profile-picture.webp deleted file mode 100644 index d0922c3f684f357b3ac587b1f22497225b015daa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1448664 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

I87#h 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%0Ai>K=nt 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

g_?%KX*_9kz7rCDuqXN=gt! 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 +wkb6u0! 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

#q5CA zI#$B72)JU)QxV_BWI0Y?RSd6}i{cwL$Phpx7A8l5Pl-ZeK>+A~+)Y4=!K@I*`oG5W^fGTZPuduNvI-Dga&5wcGr1YNr%fdX zKIDhumd3HlosTNAzo3f((p2heWR28h2w6E=03vM)-4e1N>uQ2MaY%1p!u3zeL=4+X zL>6C9vG7Fl#5?^77C?SwCvB<=0c|fSs;kkv50XT-Fl-L!hsn0gcu;RIT_zv zN2GzkTqXL-NE1S(zrx3dornLfjt-6$KHsLaMZYJc?`p4$plqrASf@r78*h59ou4xC ztg@?SzRY~yBB75=j7$xf6fBqszfcdn{dMWxxB6l*Fee!o^qax_#3MNZv7eguEs8MQ z1i_MP|E{l>*2Ylxxk>TD7Usi!sJdFXXg8IEu1yX#P0DEDXi*Z$aPgLhdS5m)oaKGh zI~sD8{Ghs~1zi8eoA{@P8?6z3cDATocZ2*`Srx(WB+Qtzq}mCWcKQ+e;O5nk&sA;d zZ9a$LD@y^mljBQ8Uq@jNv*!W+4-WvTh0SP*uAjkgGkq7-w>uUGYu`zq=YI-*3MlE; zqD)VFQqn{3{kBOLq*%Do_$$^KU99Fbq~rpA?tDLmJJySL3bna<*$OE{Ma_Y}D|GUH z7)xLHAkExOXO)NMThFYzo=xR5aDbW;bO=P!eMQbDJL)Qb5)H4E?F<#-0TkSX;`FK* zm`eE>fNyve3P~pFn|YXH=57h0#-L!uAN`1N;o!a!4GEGBt^_3qf!X?Zxrs3Rf7Rz0 ziaswpG>i}27~>A`eCPjMzvrT@e(AUmHBXYYVLC;EKY-a|c~eR~Fgh_@>sGxJoxaSU zUw_iB+}IP6gR8a{ymFMScN&ra8h!C-ARtKT;y5OW|@E@+h9H=1T~ z24%aLt24jwynxw!M^fzebzg4Bu~w5;esc;+&z9c)M$eKDS*|R?NCXR92g%YN_*?9n zx8DXmc+cFSF>QCB0Fq#`>hH88VNZ{@m{A2cHIU}N-M-detGyKq3|M>aphU)s_|?N5 zE)E`b-JXm_I7Lve$_ z1AHYF-(IN7hHcx@YzL5mj{Yv0H*9o6HUF}M%vtN2GHCwKqpRw+{wnq{y2DCHqL9SL zQKifKMFBBvr;+NqWV#(L7dcW#2_5V{jk056uNC`gB&bLTv7hDLpFS}jUH->WW8LTOIR2a=EyXla96uf+;(Dnr;$ozyVF7#i0^Jx5_{2RWfy*9ug91FLv zC35{Dk9y#$0>wuXq+ZG6X%n~=Au0*PB8H@nr3T^c!iWjmQd>~Fsk2uwfJTGzfG_3I zAp`}!05!I@pY?cBHWe-0lava7Nam=@_L$ zKc65+i2=$55S5BwB77lU;mLOZG+LW#Fxw{M;^wdpr%{g8ofK~vRzUz{$>k-AK`PmNHB zT|aN7*X(ux%lVrMJ;5KZ^XQTd*;rRVQuUF6`ufPwoT8NBdbuftH^}??+a; zl}6+7ZFnAwKQL3bcazHpFgL%8x*nbV{T-6JHm>>#<53>iN{d;0Gttz=fLZ(dTKl^G zrDN2gQ(Amv+4C#O=6bbM!GYj`okdVWa1qLF_^55t=u$;rG{&YmQCF~V>}3m+qHJ7( z?#u7>Z!dg6K&<4YYy@2j`}+-Y1y_Q!qt8JM|y3tkvmDzT#5o^X6baX@2?%zJ32ut`l(V|T z?q@Z8!c}q1cyiL+sXV|&0!?0g%BV%Ew(R91ws;mW zTONgwt7gwz%gLvj&E3mh1K|Pi>;{Olp0lVUD)|GL2v~`FetZK6`ttROFO0mp7a{jR z-A#F15mw3f#mr7+1Gh2fwx&P<^R1cxvnw8O^{}Sq>R5EsZ(D=BnZDb~-jZ>xs@9}Y zl2kA1^74nm@o`8cH!v=N5=;JDeX8ZuSK`!S=TCfi2Y>p7$`OMn0=q~Y8NTu+;HMOdI>Mo#2cK|&P^OFf{zhLo-*o<6J{iTNTlyXt>U2gs$7_nn zg}hI5!Gu;iZ)?=(tRA5Z0ZmA`5!4P4Gl@lf)Xd+mH@lA`?|{sj6^lQZ?>^4<9li1y z&P598Dho-0WRD<1U!_2S6JqO;v^3k1dh4GE4n+eTfO<2C0uiWhiJ%Z@WL2Iuj=7Cp z7;QBta)e+7)bkE;avk>)y5S)R`*kt9KCSz2dKcM18SXZaEcbj~wq(+`Ad)_j%e2Y! zz~7;_p(4xV){ozM%J|#ULhe9U)PJ_9{H>Op$RlHrOg^bp+?jnBC}3{uqIj#0&asG+XbL&8QliKlpAE!|v65#8$%DX?46!`cR{`@c z>Oc;$_tazW!B!7f6wDed>{clTqTEM|T#kZ6 z)6X`4jBN&L7Mh)PT2{qjF~`8e8xZ}oM83GBEOm@zZhwairM;@1e+tfRGA3 ztFhma;5~Zu-Vuy`R?l<3+DPg70q--K3^a{q+DE#o+WH`4Ql&;ZQW&o*dXtaWAX<#D zl+XppYIK|Dup~p$R}}m%(WfudmDBh4xW|=G0QgiKF{JM+x236tt5U}mR2V4XJI@S? zza9Rfb}r*UFl|UXzn@jF8>I;FGVgZJ{R-YcvT&?be9M}kxsD}ndFMM~v67;6&tsIb z<78E6<$g19*9k_dF(-t^dZqvOV$V>cpou@;MU)WL*lxmZ9>q;5SXGm|6Z+EPseAv( zD~FD84w29shCn9NG@}&t#U^F}^&(!y7VfLDY>6o%=$8y=x|Z=KlUa7x4ZdAY*jx3z zMmO9(I3gqQ2{_V{*-L9{AOYkk$nXxbK3?=4fG*+D`Rmr#-eLXExv21s(&}KRwy#8_ zzFYkQHq4bmQl%9m8FmSoU(LizxM6(`eoiX)1*RN~_1Kf0Rs#E0mlH7L`rx!8@xa>& zg%RJd06#qAV3ap-l0+Opz6mvOXfIQ!!ORH8{ok4 z)d~Ia)!K(y(+PxbLZwySNd-^yaRL&HB{bnAUqd@^gE6>s<`kU#12HOW)*^MtotBTp zlY(9V79P)>)XPbRw*gZ>Vgdo)Hd1&Zmr9Ca9xj8Wrdc0=1g&EsZ>iz1rgtn8UwRff zDFFDr(^F|_R#fkaW$`oxEs%r+sQ+iAL9<8!cxpz}4!E4VLao*uiP<6Wu46n%B7@?? zp6Ef4p=th!TNmc~sQvvA=I^mh?z<>9`kG_Iw(&;F&d)|84JYR_{3vP!y37~|OK>?d%QhWoTia?g>+zD^WbxE)EAe~xDT zbmJtb^!{B21K!9xKwujg0msJvOoh_X_orQvm9Jd>9@Wxeexc>Qm~3gn=yYagip-$) zf&#+IV9tIexfYTa+ycyCs-G~Dh}}Zu(4XJKqZiHMxT-ea$5t(FdN$cysShz%SUor6 zicOC>BU0u##o{~Z>?=1t3>fKl-2AgKr34|y9u!?{;=5}s(EzIQB*I>X_FQ6h= z#sX*r|KNM0i?ORANTMSi%7vA%K#xY_bU&~TKAk=Ud#5V0r{#j7$b(R>N<)65I){S` zUWE1xLK}={Mw(!e&gOWaEvgIFO+9Sr%^Rb8@m?Y&BaW^hArQw=&)j^k<5_G|6R8(n zVZj{&fQv8P-?U<>`NG!NQ=<h$lNY_Egy4#FZh|5|L-`!-USc{L46C?rM&tH-ulL`Y4*H0(E572 z>YJmfwp2z^`i|^T5S7gZiXhvO;kwBL!VQ?10_Y#M1YPGCPr36&sGjEFf&3zK{g3{y0e+b#LRhQa#2)7V5 z7vZEswRCE#s$2`%ct7W0*|P=eOb8>^GaZ8=_(Z5E~-svGh~FWv+EGHhg~!zR{E#z~3aJhR34unh-XYx@dKY z4Q2ynBf{%zgm#hnA7f?K?siFDZyz&mc|5Fc-AOU@;Pl*`U1Ae%4sLci=(u{MBfrqp z{&j>Td9i(A)%FB-1dd34vRsT=YIZ3OsPc5KbNbJ8;ZwuG#=N26d*?5*GL_$yRMY5O z6!A%{3vwMzfuwg)@8&UDg^qUtu#hl=ZkEj?JeQC+oR$nxdi=;b^axYj=DT}tIhz@b z`vp4(grw-}5BTNgpl@SsQMM0qsaXK0h6th})Z@~pWM0X(WKbOh9ZO&y&z1P?(dE`b zg8a1cN`l_Lfx9183{tA!E*X`*Lt@CRR8?t)yr;(AD z+`rpTNJ;K4#9&@Zej&LVrKM%v-n z!^*Qy3no{F;;An`gMltzql7pw6FLFAOrNa|ek%>($<_|POm{HdY|RRj>mN8jU4$us z1^Q4N0HrV>O0`biorxh)UAitFE=5Qf!xo>(JH9R|i4HAUyYYOy_&2Dz@+IW(@;r2{ z=7;Kvrd8{4=YO{W@;@(LRXw~a%@XprT6A>Y0VU_BgMy{)O-)x(;Kty~czE~rxUhzv z=Ff)Qai;7g;&tU6uHO!WN{2Le@_p!1Dm6fe@k)dBp`k42NrRME%kH;=no1un+{|i8 zEyGEQ0px8&pyNF)wDHGG{Ya>YUip+`1(j_2*N;1)jD1V&JMxY3 zLB?>=QnN!u3S274QS^cbT5K@&!Kg{N>)M}}L~7rX8nMk)uEcG4XG*v$)W<5-Hdn&a zmU~%9pqb1>#Q>X>m9til6lz5#L80Ao?9$RLwqGs354ekM|9gFO7(XtLrxI2sOe&iX zPMV%l^Sc_>QS|*}NR0Y%hLVp0@ftNP`D66q5Q(D{O`Ww1n%_MjFKN2MlS6~q?drH8 zH5N-bUU_|Hsi;M>YL_fBe0mYoxTJq>+#Y9VsQ@ZRfn@8kJ+Ub|yw&QIfS ztvxP>QZtPU3X+^X2L1=KtY5weUH=;4MMA*ngIxoVE&|>oKgBxoCFHfscXAP?97mXedx6n?!4DH-*tQBu$!Phd zjOE^rc@;gTOHP@A!fP{?vrUVVsx9qI*T2+9Ke$lO&Jv5oC7hnW*Z=x);RT9byH~d< z)|kF`JOq5gYbJ$~4sIalsYs7;Rb??JXyWMhc0L{IeWIixlIIWZX&xH!Llot9yXo{g zm#9(O$IT4eY{ZU|x8St%>N>=94{Af7zbM!16!Axs=E0_p`f<6Na|)d1Xw z4bUhEN(}|n|2K6aloS%KL=Xs$Rz3)#?gpSGfX^Ui2y)h~jL91SK{MFk2qiRz@*$ME z_W9dJxu}{Gg&%0bF-DG%DIiR9;9zIUROV2EYts{=N$^!bB;K1c5u)T&03nZwP@-#B>rt*e$WG;Fpf~xAldndoA@dI1HIH+UMsc zQj5P4Bkb3K5_uyq03wSa0u7Qhs=qIt33+iU^gKA~^!I95`<(J7dGrq1^y?TJKim~< z9Rr31M(EcW1W1(*R_;^}v(cZ$I^Wf6Od=-)ZpG6%e%dTa`8>M$IOG3!Lh9~s)%qXA zhhy+d+4tjmd!?J6Zse~fKw93~T`jVzJwXNE(8kffvL1thw`9?RzSmK8O)=M?GfTZt z*HHU*#kLr#;jhX3)jB>xn`sFN0UaRP$E3D_W4DIhOz*`zlEct&x%dpbN}V+7nvwCV zYRY?zWNO-H2d#73a%C6uEqgnL`Uk{QuBZC5yFYGTc5-_Ta{Hctt9t;y&pZki7rlM| zk&ksB6y>@KGDKO=LR%!IXfWz;Il8_+KYVw!yIB|||DvVh#k0Ss7K20f-+I~n$NsL) z1fEA)JjvA_(x&fAX@{ry=1f>$QH!EPt6U|d9$d6`K=Lf(xq-2}7TTuvr@cm6k5@uC z6{nqn%MS^Lyslo3>)zd#9a4E0J{wc<*}NYEjsZ_U+AYjs|4Ip{%`Hp~{6258y!r+Az35)$bM+O6^TiL{~sLUEeJSI_P z)T-iUUE!&~i^9))ucbS{z-ZJ~>s=USE^o`iPF;qEN{*2iMR6uR;8Csjjmudc*7udP z?^P!8;q#3TefOvmin@lXqM9CQvY&h-t9<8I*AX&m9)_qp`4#Be#UA!U@y&Y_5k`ec zGEVi*zE=D~qEbqaDrK?tr@7bfcfbHo2^|Ah@#p0qgJ36z8=Keg}vUiyKWw{r=<>ag|njp zx-n1y7rPK=gpLIv(U^+Cd+h1|`&&*99WfhC2a7X~cc!iKOVy36Vf>1! zgh3y|oSl2S6_^Bs; zWjEcU1Utgs;6Y&A6!CYM9$F(FAs}%zT=jsE#HYgl~){~ z8gf2e!qzC+-^IT0+1y`R#N71Fl;a>c``YqZyM@nF01E}QleJt`Y2MU^vf6R){65pe zcWj^^0$@wn$ma_mSm^Q=iV?v>pf>MV?M-HSmPmJAz5If`Cd zBbK~S32&q1i~wy}q|&jY52Hq-+m7y)(2b9CQj4c0EavQaO2zP*uED?oMwIa^DG1j$ zx*kSW@$wolO1T$|A|ujA)O0YZ#pW{3PjOTOH>Ta#RG*cJi2A1u+c7tc`CE1g5fq`; zUe>1HpTBq-d1N~_;mj8OWfbry0Qo%P;6x4B7u@owzjznn-(4I)QYJu1fn5ZY8_khO z8*?y(D}3K2Mj9+Zcy92B6PCzh%*_C&H^Oawdb%ADLo5Ap z=cM(&i~bNQ13(eXz!ohqEc5)W4A1{i6{U0#9AWt}Lze7Wzwe(v(VI^xee5M|!l_S# zOg@GL$;7>ES`KHi{MN2I3?R=S^DZQ43D*wGOy85{<4>1SRa9)h?@@VLJJj?~$aw!A zJ4(M+>5q8L*EhYWoPp*Yg~OuRg?(348Y%DIiO=N#+#M;L44dHJjt9)r<(tbdFNdS; z#VQRfN^XwZ%lr)bbr>A)Y!qg^piD^wGMF(E1wFFF;$v_+h^Z4I9?7zItJA-29eT@D6*Sn^g^ojw)PHNeOkDjm4(X&Qn(hhB#>)=gV>wtDmXGXb^KDX-Ut682)qBT^ zPu7|HRX`Av>OjHaN6^lBAwoU;n(sGtQjDPjPZm66fv6mnyH;fLp_Qjgt!}qR!RYs? z15eIIfx=HvvVz}9#)iV=r8Ps{ION<2qKf(`A7AMFXuB{qHb73lH zVk&r#>p}yrd9FAnQ6nLWrGa!anChtYk=+}!yB|2hE%@|Rvqs+rQsM>-0WF_)ST6|Q zC9vL#8*L>`eB)uD$UoNiQM6|~@~>|*|A6cho^=@CviuGFh*4!AO+VPE>fMD)&kQ9BD- zvp79=@%J6@r<6_<&zL}AXc#rH-3~wXhZE+7iAEL|q)6>r5ax1`S__aQR>Fyu-@&s` zgg%=l&El6igS8crX173dlNPsZLYG;ClFlc{7IABO-!VarSwNzhh?w&{)2f8*>tYj? zMdK8&u~UUlAxP>r&2Pp$3Nqyn6U4|yC1t)en2NN1izYF^wl!bM_dF!YBvM>_FIX

4Zp5h2>ZV$eUbK9X@Hdm*cNI=5>f-Csfmw}1jQeM`L|&& zFQK8}#Rwu5M9{ntKy)W4^4OSZ#5CKR25;ZUdYBU(~8A(}`! zk}d|A;O;$=;zTpH4q3ytM$7zxZSQO9R8qyHciVM(l4x-t79+mAPlzA_1-i7|!fI7X z#lKDFS1y{4#b0wRMp))*(+*5Vc;7lI?aMi}y{7h99yr-rQCyu=r8Li?1}@7+k}A~) zf|^ei7x?BU3N4oOlv7NtU*x*>3@Peno43#$zH*pxDhzpTB@g|eO-Co^c+Z#}ULvn$ z%&a(0-5RI_o4Mx{$M zLQtR>e@o3cXID67c=25^Qc`E9_SZE#r73@6AD(U3{p|j7)iOU*HZIsGMxUL~X+S3} zO_Y-7^%gx?k+-1}G+pbGu(vSU98LC0GMU;NF#saM~horQ7SBqfsYs+lU%mE%}oX_Ajr7$brRz_X?&o) ztVP+jbKK##>QBQ?S_QnS#rDDQXo1JR%qlQ;G=C*q?RvnbR@4(B#1l!IihP=aJ!2Az zAJQUvWq8!j5yA>NnCkNW#-g`A#==xDN*J+x19L2p_I4qMmNj+^c7U&T^cZgU>Q)w8 zj7G=38bww;8Zye;S#`n4del^9#KY)pIdqK}X4^#)xJgUwn>AzCJ>(BwmPmgTC?6kC z1!*N~(Qfdz2_ppZzC?9-iF3hVAV4!U=X^pvx@K5ckZ5lLKRP(-{f)ES+PH!(%VrDs*G&ITPR}FZR+5NjZOihdvD}Q71V_DB7L>d zDHPvNQu?3eiwO*r zx4eI^Cc;#0jNB4w6b6Aj`tJb#!g-u-UAPe1){>&|FTze-(fi-N_`hc>xf9f7arWrz z(CgyGh4pT1+ft9BQu5AtNpyhu*N;|#4R=F?Nd*toTmPpjOMoz-08)uzeb;=_>Hb+H zg3gnGZ%Sk&f|A_3{)7kKl_Gei4ZBsp2heHxIwsLlMOzF*141+T_oqDCzliwER{N;9 zf?l@TQ|&sTrlNZ~JsGd(0#P&$&f)6rRs(=d#29ClAO6C z^2lDq8QvcIYqqdWe3x>XSf{S>{QmAELHO?hud5=|q-Mir+OrjK9EaOah32hCL2pqH zQuwYegWNcs?-9unJIQSU9rCbdW*{CSK87QL0uQN6@9(2ApkN{}kN6zV!Xj)4y-&IXm^YaIqTuZ{Yc+@(GoVg*{qIu7YZLeprweNTTQ3(Hx;A3nsMT zgc*HaBz?JEiG=vRCExU&zpj4pt}NTSn>#ys5;?h+IEE2`(0z~9o9y6gkG6a!uwo1N!+djndJXBu-)!#)kiF{L<7 ze~yuge%HLRv+=vqHQ>;R7+7Y0M6wNfg%?VgUzh0r`0l}s%nwx#8?K%9c#}n&3RA@5 z4{fKH%Z7VZubX3tn0cWE5OvZCU1j%B9oO-UK7gDx{&>husutz@DW^I)gya#E#p}Cy zEdxRIm&(fbLJ!&-9fhofOgYeX8GV+_k`VumnzxB#F*SFmWMrcDz_1rI_fm8j9L+CS z`W}Nvq;>ytkR`F7UMZ$44UQEE(ShGvRAwzYHJMMEqwM0?b4z7(p?AP9Whz9GEEEX| zu18=AnN_M7%7scgA_SMN_YZ-@3Q?F&7-)fc&BT=7cM*XIBR1|@>2+usg={TU>U$JxK-kk_*9l@k%ULJ&qo$!`$rT@XX-^3QiV zzeY-r_*zqV@jvp1YMi%l&X>)>Jsg0%Yx8 zzuw3s0>_y$T6;`UBT_1iV5q1$kGg|c=eE@BNS291qDMZNPQQJJLi_uoA|oA1EP1Oe zkNcatAFlmo3SattIJ8C;8z{#_fhOt|iG@*<0KFpcc)aDnktcC*`pL~7{QFG{i?umJ z2yX=wGXQ=p_qbdw|0=yytd*$1)UB&v8S$;Epl?xX?a8sewh z!7O+7^K*W2WzsUc?_>E`q$G7aWu5%{=%{}7PWG;AZhlty&X#4^#6A0m`TV%S49myB zPYcTiaHPFpe@aRcBr82ySM}xFIAuz9{%?}Q65_Mc+-O=r9E<=ENF*gC_{-ojEvZ2g zGY_~iWH(LLjAI#$M!^YTY)Yt87>k5Id<;Ms>P`fmKRP?IpC%?AV+OG^584t=Drg@v zNDg0x2wAO2G{OgFYlo*=L4|W2;<0G+RZ4ofxZ-sjcn%3=2DUr@yQ2 z&A)Pe82Zem^b+5|KU0fm5hYu(LU8kDz)SKTFdNVj*MuZyBXV z3vn+dOK}KKtpDhr2Hhwv-j5{lGG}?fe~#Vo zKu+HTfp^M4Wh3LjtQrlu?k;?C`D5059EQYdf}f9ypoyVQ}i zViTjRnYYQwz#qlCvU)?CpYn)pwFX38lvi+Ch?IY>L5Aol(Iyjq|FVr+t{n6#57vID z*#|n;jnU-#Z1+glKm|5XX(W^==~)hz+^jRNTeZ%W&@nVLdo-D+8J6crRAr6xj6-#4 z(OM6iJgojZb#U1yw)xo5T0D_ly6ct(uv!w@UczVE`0&lP zv$f;vn^U?RJ0KAb0EX+^KmrV&BYIlmPl)w_nMq5JR{V}%-@^Zk{1?^d6<=Az`-!mb z4RusYJ*nT|P{|PW>UYtMB_ieRL^(O&n%h_yL?KElVt3^8 zMc|Q;kH@Lkv;9@)hx+_KdtW~=d-mb_Xyb;gp~p%eqmz_hPQe3K==E*;7<1Iy{j;=( zWQkbMcOlgQOKsXNEz$?@?Ol-lJWhVPcRf z@~~!6h|ewujw7IYj~MqRJZxo&B25)`yX9kbeD^q3(2o!AxLU#HaIF+T0}FY#@*@ms z>KF796iSDN?6AJY0LL;TN@Wlj0(pzOm1hhAMN2FvA}B`yCpa+^A}WuB={bRyC$vNY z(jpBYUm{#u^EWzL3#)sfSChsd(FBfZ;$MR#O5F|PQ1WC&2r1}xe0+@VPb+HnFTZp5(Z`5X^@vFDH1rtVqvGt{HyOcrE zW)Fu;DpedkJ;0#*Vk*(1v6}8m=fPBKaa5&S-jHkym(0`QdHl=ixI!a>Sd}hm$aJ@} zK!OLZ!}_&2R()CIO#v;DiBZ8@X=N2$QN7xww z>5Dq~aKj{CEihh?F+0CL)lo+Cv59D1ef!d0h--^6x>6biki+YV8cDZkO}mRiiT2C{ zv46Vqmdp+jq$kgA9=vn(s%_}OdFOslWh6GVoqB((%6Eh;G2X)p+=*FE8 z#?Jr%lCN#{-WcpZChhz5zL-+S&nPC?I306gH6VLnaUJ#dM5_W3*h(74PYopa%i&x` z36+2FIwod<*UbEILEpGZohs31q0%&d5!;mW)Op2f{LHvjy6cdcR%{a5 zY@I#z=1jNS8?|IlMnTt-@up?YoRTU7aC_IN2+_b{~0xG$stq!wVO1`{OO z)TtPP*A_yHV1+ot2_+=rfMV?Q_dZMjl;FFil~C8~?c3!D18{E%ND1L|LfIMs5ZaI+ zgqnoLIftJ^OKS#826m*|_;6;PQBq+0_&dAOt=dP-?|;-#8Q!Vg3jh?5*n_9gc~y6J z;X13>bZsy!nHQ)PsY6sH*<2|G<-f*{PkxP9DjoE3_7FqbYQYY?*eHND{|` z81~rCAb~@WaoobH2}FQ;Q@yQOO%}?bXY*?D=4ZqyzTrl;M09naEax3tKrQ-C!*}%w z1Yy%OVhJD(L93CIod+NkK*^jWKmLw?hf(y&yX$vhTs|xCp6}PF@KUYc<9JIb=wC2v|ArX_^_Rt863MGz^#&f zQOeu{yoO@r9yNEXiJZ`_>&RRuv(5+EeyRB&kVHrIefwaAMG84A25+Z}p-V&m(%PxT z(knSM<=GH$qF<-l|BNv625D0RskgSQ0g$LL;9VNGa)rQ1h!dN1Eh}6bUko=;z$xHT zrLAT8^t8K86otN_FJaBc@<;iLSslF{cL&&xej$UO+hzdn7mW2S$P?WZ zO3H=MIsvq6M`t5Xet42VF&P{9P5hCixRz&e_!YnSk5>=nU21dWI6YWZSLWn6WB~esw*!Y z^QV1iZz50py-7e5MBS!H?^p?ohPZr@U1znKg;F$%`dx|iPB*8wzSL`X-5KjD#J`Po zaN*#j3-@AVDle2Hs}$ts2FfW0z|GWvE&xHKVo0GxC^?B4AR3dn4Hh39VTRxcs4fmc z06#F>KblBL{|Bg2QsSu5d@m>#A%ynwMA~M+sq#Ala8`OE)h(lNef99^f4}Gl&Te~A z1dnNqh=4JehwLx}3jomo42HI!Mznnp`SWkkXHNM* zqXthz=d{}D6hCfEzkap8DdaaZQ$IX<`1g@QV7KOa(c2e86qF3F+cYa$!ZJrR!ibtJLFfWA)^Q^V@8T zOu~wgu3=LQ;B>5$!(pj6u0Lvnf!LSb?f18L=(|qrvEvoyv>ye>7bH7*4y`-v`p+JZ zz)6`3$udBa&6q+_hVcbDC^`MECD!EpY-4k2(q`$CUsTQU9@FP^*KqB+vb>4x>t1(@ zzUof(T(sY@?m4^eqFvZZ6;963$V&J-j8aqL^ha~U)+@0pC%$_DNTplim|9`-B!tN8 zCcA%Fmb(E|`EqYQ{k{-*9rHfQ4|R6%_rcBi$!GD$BvaOt_3iDG)R8EAwclB=6iGE- zQQ_f23bH$SoFB&Oq=aeclIik$I~w09C@Fw>E-B;m^zJ46l-$40ZRxEp<+rEAK`W;@tdBP|T;sAd>KI918i#2+eN|J{Y_LRK6h5yKyIgMqa=_fl zkm`3M9zEQPFK<}6F2;v}<0$XSijrrY)|ENpbWj^G#F z7(DGLQk-narXm4i#~{Zb5g27P$*>+HXe5!jpsw1D>f-6wl-pDz9Mtc)<8IwV>wNeB zZueZiNGUgd&d%mDO0S_tEiS>5J@ehUeWRM=DDHDKs%=1D%b6WRzO< z7$8>qh~miPq^I!6F-gs$Ey~+VQTC|4^z%`NVblKm@KZut8(7E?VuWUJr+{+e0=8a) zyCjuq`+dr;pZ45;HS(Ey{{BeskHVtOwLzxq@Qa6mPTTCHq^U;HBI3P3Uk?~IH9+Z0 zF!xMZnGVa9oO+jTJ{@`*`S&uRW$D+?wH|t3j{m-0mo2YRlzDbMCZqCR!psm}-dM$?R59aKb`J4<;wezyH;-ze~J_TD@l+OT)#btHb^f^%dy0 zg`M9I^u$!UzQ%M`8dKEJ>RGUgD$DLiCy5OSNiuluIJo{wzXyg7BkuM!>*SxYZ+X`8 z`r=T&#_cmUHCL@dnRm_R^>tKqE%f_(%^5cUhQGF2H)jfQsFBw{b?SGT#sr5UEc{u7 zY1LP`Xoa;B^*C62KXq9ok>0c7Y~v5C@!P5QBJbdZ8Dq~vum^vC|GxZhd~ScbRjDvms*6pr7@eROo_=|s?A)kIk{C=ha1gBt4ij^|5->`f=}&B>`Sz- zWH2N(d{`pX`lg7n9M6D>!R_YuIS?TC zaCn>G07_N_*p=DQ#DvTq4uM_eim&0XAjWp7QJV6MD~3^!&^VNTofCaa3lK$nwlx%4 zO0fu5MG0}ot&AORCkx>dhoi6DhDp`T;}7;%cfa6oeu>?nOFJqRH%`*39*0wYK42sr z@u;1uhaekSGlYdQHhwsaBS zWUw$aOos;gJ~fSW^vh@kzs;LT48}0raRft2FiQ^!eFVKgfQI_9DnJcLjgT$p9-s-g z8$u}=h7>0ahB)^Elq1acv>6sb1OW9rPEiezh$dpU$qBPsKS*TuhXW(bJfR?F9$9|^ zF)C1V8L%qFiBONNX%IvhOgp3}u~vBcY{20RkDrPP!q2h-YW97+#K4Hq9np@>uTP&vt-EGTK52Z?I&n7P6gK`(%n%^C>1tvxKrAq9>BnTDXsS@$l?)ihK&Ve5nJ;FsJGh6Ps zbe!c}=1xDjAUwC-HX7!OmD3P%qS2#7)H``FiGo@rPTd!hnuzuZ>CYQ-=XiWdzvlOP z=%4UrTD#)4@-vic8S2{hzx!v>?WivvUF}G~C6#pMoBEWD0bo3aY#l_#&`J+Df1}?o zcMooV@%?YK@`3AL{6oCqM$lz#`xH5M#qTdBF|(E&j_w+`xkAS1_%(zn<=eoN(ja}R zFQ=-#Z{56#R1tURW`udIRd`3c#}8Ys8TN)#_6A5+CDqxe{t0O?*0qK7x+&h2`jp+if3Uy z%7!g6d0im%YEH7=WmSk_Q1P~BeT(P20mc*hH!-)LbPL+G5s8|WBA}nPKE)Mkx_mVz z*1HGW|E~;xm$N$PWb)bC>*;2(JJ5gwYQGlSyZWwa=SOdJsB&_L2ivU^+f%~W2G)BP zSJn6I=)l>Q^mmJ14l9TruQE~&Y+3aPcW2qR3r|k(>184(s%R5pY$-Vuw+;8t86RSe zq{!!qV1=ulosYQ&1#_iEsL9Mwx)v)$NoDm69qT5oUyBU0GM85D>cWaV6-eEA06qth;7DGetVQs!ovo|ELfIk zp^}(O149Sii^y+C?tEw$$3eb2hW`zedk;mAKSO1QV zyyCqftqON=7!?lx5RtNQGR{>D9+n3+_sV+z%ITl;0K|zwkGEmNT;s&H8C2~m>y86G zp@f|!qH(}Am9WY|gY^?$K2DwQrAxII@`6!NK&7b*TE#QMoy@?rjYhWX6xCh3;N?S* zYh_FN(lTG2KHdk*GGLuY9@@IMy~t|T^ShZWKY6U0nwmed?+NQM(}1nGjFB^O=CRnB zN0iuUJa#kudb&lLx^stGdFp-J(K(q9S-Is6g$IUSG9{~N02NGSEJI-t>6R=N>3{Zf zq)U41(XlH?vr>6{6m(zui@wJ23ZdrlU8u}QD+@W>S4-mo{0}wzz$wBx-IepFsx_a? zQ(_c z2)<(yCpVS|At4qA-uRcIA|W(N-=ti>(n}i>+bj8Dow)(4I~= z41csbI6ZvzaPy|C&*8tLF1fI!KFZJ}dD)^EXO>7{mA zRE@1?`odM&5H>0sb$aT?21w}BF-vqVe{uQybED;ffo>abgGe#f!(_hb?8@Y(Px%x& zf4|*C`Ewajisju;ffBd{YS65NCM6{j4pSSEyH52xQCK%99w_QjVw4J~JPCd=ukG8= zW7Nn1xD)bxhV)^uH3so^Yf|o?W@zBU(ZJ!nwyRoL!N;fnPOkr5TcFH0A6yw3oXmVU zI-N3}<~)a4bB3ibBaz-<2rr4A3>*7nNSjb{dBhB1OcS?tInZ9XS-p^Ep4ku74*Xfv zeR9!`&X4jhuQhJV;@yFI#|>4AR+E_75m-Q!W;CYdOIDd9Hy`$FPEuDOOaNC)XCFfA`K}I z3+TVww-Vg5_YEZxP<-#uIkbf?*`3>SVDlttw4%XT3S7ohuRnDLF}#Q~d%*;7hgbMB z;7p#?qVE56v5eX*C>lh(c?B>~2;c-Rn(te}7E7q&&8Bx1lWWJIRIHs#YdKwZg3h&2 zvs+iy=3J|$0UdW+t*qP-ixic{!y&zqN1{htiQ?3{)&>Shqnuv$TN)3e%ooVg*Muxh zTMD|)L?ZIWo15=~OlYPnco7;Ffz za|b1B!z^HQ@2Otx&OC5fKa0Bx|MB4DzY9y7jkB{SKATPOwk$o-?ABQ@oar$i_e%yz z5%cPZB+0V@%Pw_6x>97%+hSpLI0%Z)RlP8dTI~NASc`7b67f4%7~rnk!iQ8d1b&YeV9DdcAP{VDs%QIV- zUV1WID+aKG(Y+9MIQt04EQD~)`X3JuIQ=gZLde<>wm>i(;$@y_ss)&}J3?N;LB{zr z4#Nj27cd-!J`^M6tuH7bv(WFqUASYW31jpRQ6Lug5bASk!cKx_0Uf^cYo!@`84gM&cQ)a7%{2cw?U2h|2A+ZJX&6yncPA~tIXK{fnx`Es!FoN;L zDTM(s1>|CIfbjVz)C(6EtqkAOAlZwk>$S+W^qJl4f$-n>4%B~Qhh+=YEKbxV#9&hO zH;Eu6IQ?-Lb09=Z8%#kEWun#UXjn8q!? zvbmGD9@B4K-i*0NYatC=4ZAV5KXO;n?D#}DT)pr1aBX_?snM~i>iMb>>9M{iuXfrB zh&t+*6Vxd?g0 zXm!XaDM{6fm5nT`ZM6|Hdb2Z{M|&pVdg{)_#-QnA`&rnR_yKo}ydLw?deL3kjdwIJ zwo~_yKfQUvAIJSUyGq{<*gFTe*59%4R036Y8h^|oyRdYOX>7cs(jV?f>B7LJtFtZ; zC0KG|F2ZBeSEWgD_s)-K#dO)Fz{z4^-MZYJy=e^-^MC*WuUoY5(Q<-RFrD0W!LDk+w;s*SSz#>@&JQj%PX45yxXZvOicyVw|K{J1 zRhxg4&+Z5O=b%GvG4n3s5Bs3{R-m>R>g9YLbVf&QLU?&VnEYI5G(Aa(-b}NYTKz6x z3f;LUt(GR}t7v6Cr`gw&C?X2JRy2orS!(TxXrEPhA&o3qUc|?g>^75d^ zT@V1apn4f&c8QyVhDS7vOKnz$Rz`*{3yMBmp>< zhs6R2Ddb~?%|zemZm^nXv*O63ce#Up(sQytN7rLA!RGsXWsaloF82Drk}%&`DYcnH>j^J&31w!I7joXWH#<-x=`Hu~o`6?R`h_YK za_{K9e0cR`phvpR(UBrC^As9TZx~I+!_-`WHMb?nY(4+&-Q2b0IHmvVPH@+F;ozR9 ze=~^b41lp?q_-ZEBasgQBrzPF1b`)m{X#(`?Eo=B_e#(Q0APTKo0u4k!6o8i#N`~G znX;iziMW;c#t6rrWfmY6gaiuGm;v!If^LAIa(qs*MJ5N^pgmKza%*b}5P-mx6k*{x#AOmxEtYtl4uRVX& zWuYrNM+a=k=rwjs=199iQl7~6#60bp2dSN*{YOcj3`AX=aUP>Hc}--E{Du|gBJUGgc z&S7YBX!WFSQ!d1VZ==uharR{Ae?wfBeE_ey>zE##JD6Dw%8sOC20(t3Q5S>L)!f;I zCDVBSr5Ddo(*0fm>n9uXw;4ldlG{kp*M!G4GsHjojQNM0`spYnW-`gM0@x}dV+%=Jhr>^UEh`lOtuXKKq`|?*7_7${Ivn<(B!a%3dyF z*Oz>h9*WTM-+AAgL5hp14JRYlmHrmwJ~&|w>iB$`ZR^BmpvWUCBwrs$TEyfT9@6tX z!!O54PXcv|o`kl!_2bU~h`5~EM(r0Rr!cMpp@#m@FyVQLyeXw#r&GzqB+y5HS0Q&( zj<=qDche|1^`?>z^cC%xKH@>)T^|Mn`g2icBMmJt@8>$zYs~L;a@_zk?K*Uh=W6(V z6VBXp>nCJ22UlbQ-uWr8i7J0rB=P7S;Yr(Y&~Z}IBV5>e9B zEewi1kDaidqt~fxH`ao3J~YMi!&|Wm{sx+@rpEdp)0d5((?@^(d-YG(M*r{3pP93z zy}ukJA2%<)p81dmZi1Z%4O?0o&gD3r z))@_?#?T`X#B%)pAaD4p@bn?JdVvF}P2mB6a7{yt9tV2#lx%ey zOAu?O=1keuC-qH8V4*)E13Arq>a#MVe>!AY?CqxRgrQK$wBHGwDu^y0{mC^DmFex7 zZji+}@1B7Wm+9oySdx5R$9QAKpMBh7^J9%0iak#&z{PIGFjnx{l9NXy+>Pc<}Tu+rPh?HhwRD zcD1)0D&n)fOpeP@KEA7$gFI;x^#r()|8Z6|Ut@*YB3WtSMekI#w2i^8_0ZUg-@Bos zwkbBJs-9mHzs3qTsPwzZrsqxU?JL`58eSLOvc+pnn=l1NVh;Z-Y5Eg<{_`8K^ zQof7%LK!woMhte0WG;pXgbh-CCIWWfBE%`{m;7HZl{S3kFu(0Kgh{>9I0u`lz}~Cf zk9HMul@iewxkpys#w{WKjrrIqaF@(E#H8jD*R7n(W)n=;^|6If3%KW5@Ue`FXt+8X zHRSPP!^)TDX7FapKBK=4b?IGo6=}Of$B2%uiN{$%k zZ_1P+swK`Zw*|n1Lqmt>&HNOIu&jUDm$KD1JI9Gu#2V*flb8&x+Fk|RuhuwgkK zc#D#frqrEpzVViPdVhy@^I&{SPSQ%|dg56`b3%Et?VMM>CfBdPQpp05At@`7mx4r^ zl%ba-W_`b_!gK0h)|k48KCwj*MNn2A)p zQrD@H?e@HJnEn?@Mcvr|*`=jtN^#$FGPIHI+$XExu2Yj4u6#0A+9A?=j&uQDbuAprf@Piwb&Y8^wXa zzsycubTEdKPr2_tT_l?+F*k%>cBLDZJ|Oq@a(Q1NYqTL&+Ipipf@G(K)9 zO4(z6rRTaLJMCfB7Q~GMS_#d*08>ibTM0m}mD~P8;l7R6QZ}?#WSofvPRQH?04w`Q z_-q3Q;o_9Yw*X_FwNV7xckFyaLq)HD?OFNumoP zWtTR1s#PJ>=dUcsNU@I!xpQJ_73NLh_nalg8W$!ib)TX*vV!49p9M2H@#kf+&2=zf z#jOTc>H3QQ8QHFX*4*msww^iK)V-FE8YGwTtzf+K(N*g~=$ZQc%|CnX?~%{I-Q7r+(t;x;rKB4{ zr9(PLN`unfpfpH`fV}&?2mA>fAMWSAuj@RuSan47pUvtNh4{ueml=Jf=pqzl7bp+6 zbe=ZZOl9W7@2#@vKI|O^#hS>{_xE^T!%_$)Fdm9V;Si60U_JBz(M!(L46ou}m!@$M z1h694!YA;>-~bqn#AM}g;2E2c5KNvHPMqian~ntq13+;|tXO^=%*>T>c`ZB2V3MBRyciitJd{4cq(wBQ>ZcOY-M-#X4U9#>CJx+olPz}PvX<}ogzgS zovS;R70>@N*RdXy8gYF$C|-2Yc2wjxRJokSBd0cL7^@(~C&#Cig!(Gfo?IFGKdG=V zw8%~6yP~=i*n1Nk$lI^nE6|XaRT}g)p{rB=W+G@*IC1 z94u+LiiXZ#u{E`KEe#B}CxibqQz5lP6!W;pD1l8D_mdi zb25<$M(ZrSfcoKO>6Wl_6fwfBUNqqq#E>Kc%5WO`5c&3!N`k=m3WRmvA2hBX4kYYU zc;uDBT1cbV8Ih*b6!9<-Y%@NzXC5y{KM9^}Dg2YPUYWPbQ$;##Yx1HG+9zLl4ubTg zmIy<`?R>lTyc_%pnS0rp@hN%NjSbD6H+7GHf<&wfuG_aGIk!4vKBO)Gxx(}Cv*e;# z_W%|WjDU62%U@XJfNh!nR|5yBc7M!y(NLsh-*N4A_8WNYP6QJQ8->9bieQ!xbuU0b zTa>{s@2k>rNi#1IRC6x_nJ=mrWD5lr04RW2!MKo4mYZP$VuejUNXs}<7u*-fCR|)w zq{ml_6!H;WH7>;{j?piIBC!I64BEuILKcG2V6=V-RL_WWjkBuQa$$EX$J^M7F!oj7 zz<>IrY62WU-Wh4B3yZ9E`r}7bzJyfr;bvpG{${IIVQdXQvslK(b4SIPW2bB7ArcFz z%7Z6td$}+E>uSy};70IKKi(%8A!|sFD4>GQi-3qXh0JePHQZk0q>h41#|RaG$NdXZuu-A+cFyIpgrrsG<9a20i4$ zA!4SzAe0r-vmNAt0iD3m4b@ET7=nEWC=PZqfSH_{p_r4CgduXAi}Mr}2#Ui@K2R_S ziw_P#!>}R)pZHnI0=-mxlxRpzsLm?-cIoZu<^8)o`B|sK@x9pKuG8zze*en7XSd67 zXEyG;(1V7HL{ew7jM9#qpfH9S#kz>;8ph>o*D zdZ`#ya6mz52#`14-)@5Gw(k0O`DGlfc8pCd&j_gO-QDI1`MPp{;ntKt{g?rz{}X`o z3CK8def&GM;allu``FAX*W$PDMn@i{ zldtOg)U)oixrm;R--Dkxw0mzPE+t)s?$N6I;KLFKJ#IuKN~>N7x0neqIfIxqg+{xldGHk5DV2_&Io77!c%Y0F7r}zDDR9v z?^^t4aC_DF*YUS5kG8)J-@tsvEO|?OnIPn^smmy6UtN)P;=DQ!ea>;L0X&K4e}782@{|>C zwXV%GXbKz-8N^xdTi>K}Za`>ycGuBUSVr4QJ1`)P*BA1*JgF%i0}fiyxBw`G35r(P(a~e8Zc5MDo`EpgaYf^x-xOCS##7Ff&r##2giWj zv9xr`B`z$-1^1=Aeg_s8o9kDI_G}CKGvd#*VK?Ut+V&*Bu=NV8=NL9P;cle&UwBo| zqGHzm$%zZ0GTj_WbqOMQWkQyXYf2)tmt>v(FVCly8WfLXk)V*hoYe%&Pd=&@-L<;ZLysE>-LkX;hU_$+H zJl^a;JgqI%S12YKV~!(_g@b{+Me)OPB?dwuQBm_9OyDg5R&x;g_N?>mNoSW7uiM0G z^?&R4^Q*tOjHd0Ke~GMArniW6b+d-dfoj*STzsYo+@^2>%3z^w!r`j8{ zmGU&RYN;Yd0RsD`L<#n>i zqoM!JdtYMj_wkPi+Xas6_g0MylU2rpDOf*W_dzhjS0j3oJ`zBx!~!9gD;I>EL#0!n zi+@ZAY`IJR%69+lU~(1D^O5bPeK|U?$cWbvRIXgltTQ@OTCaid(V6A{PXC?7LHAaS zjkJ6iQ?8Ocz+N9m)aM0bUVdd`(|pg9z|l=QK(%RSAqXMu7192ZnhQj5EqUBJsk$Wl z>JctuDBuy;S=OD~-1*{6Vt_M`9K)}~g-*$}pxR^o_j4(<-1Xmm31gd9-VwG^JMq|E zkG9!O?Y#8iI}5&SvhSan(7=X4P>K2OHM*Z%@O z?(N9o?KNp0wYJSTot$?%JZ;Nf`8j?=x= zdX#Kzzl)##3T&19+^rxS!4bAgqlO*+D%||A5BW1ASrdI79x7d&{)gB#$4<)#}QN&?3=LRSGL9Y{zgQ%hQf|5bJzjfGvU$D7RAeTc@SgCcZu5<)&k5+J=AFyI#uy*viVm(kBz_xiU{sEpBr~v^ zjiP6mFLn|<+9gx{u<@L+wXf%php8Z;7eaxvOF$v9M4`tO$Hhed^?VnR?38epb@hoU zjLi#2fD;OY4K1woi#+4Ez4{?I9pgPM-o@QGOd;^N`i$JSF3(irHtg;$YL_yr_nEcG zu%=wqM~g>pGK#VQM4N^LZ-5M?1{T;uJFfoyt9sW$AMk0h@3qTbc1>ZA=pQYfOGbZM z@4j{)E1b_`wI6C3h54j*w(Hv`=5B@5L@{=a2*{{4nlBbWW&i@MtpMh`<`BqWMbg;x z0dNQc4S+FxDGy614h}r3n_*hP*${c!!vx_!)kpWy;^ANx8S<7u)c=b*(13?50e$2i z!Apo=UpWKGFx_3qtwGS+^3I1Jm)RN*3D>s||6Z2t{rKuiyuf3l*3VIOc5aNZF8e>3 z_kEdvY<4VBW*@ZsEOUR8VaA0w{(zV+j)LZ>;AecfddeO|j=-H6MaNUZe%XkZ2<=AX$X_j~AQ)m(vB@*i$ z=F)}mX@%GzMF0;Gt}va8peZ2*Zlkup@^RPGJE<33z6-f^rTUHfQPq3#5$geo`s^Ga z3S%qWyTZLj4eO^r%?(VQIC|22%uUOEj%RtQG7W6hlhU{Y7AFyq98v^8=f{V`j$=u> z1U!##~oPc_qhP zE=#^ym3(_U*YvJyQ+jQP=Sj<$_q#Z~$*q4`EN7$|I2oslm`yze-L3X-lx_w4GcXs< zdVqa2DP92zd%ymbY>_DYbEe{Yll)lf!9y+|^YThF1B3jPlx(rjdQB5xdT_mI73MKT%I5vR`NQe|H<#wG9mv@X3<`dVD{v&oDbj=R~C zrcGt{!@REfr;ZW^MiK?M)oiVUd(c}*@vOI%$Cn=Th^ll)=i{zpeju<@c zq7TQp(_hjIrOrFy&Z71PX~^P*vm`gA45sWkgd5uECAU|cLPUw0l?B^q<>QPWJ}k7K z2m1_>WIqVg=Q^-AKB&Bh<{++ty2KQmO(IR08Gt1Oc1ff&)UUBDIa{pYxl4X@uNAx8 z{;7mqq#mU-xBmU zb2Tjjxr`RJM1O4lYrP%G#dcp8q3F%-#8dq#bRh+y1YxY|2!84$>moS)yuh3c=hFS@ zJZ!ACxo^~;cA9p6l)1RzEelDNyKiUY2Wzd13k6jQvz(p;N@*1KyV$iupGikAjGYJ- zrA_toI0T4P1c;zuIDq92^(c0>lx>#B;B)<7->$i?lV!;*$)(CAn=Yl)fJmdU46)P#RR#C?BCcFP zotf(f@zQrvKkK<}p2;8ux?N{xUoQpH9#k*!x<8zs{4?6SYn}~ij9%#(*UEn)e%QL4 zvn`P~H?&tQ@utjiWIO9x2%jaEW9B{Z>7XCu9KnQlCW$Wxx*5znZe`UD_8Ed95r)UN8231VZ@UujBojIU)X-K&09 zwB9F7-?Sg^i_>0kWEx1op!0d(q7irAn7j}LI1&5^^cVn!-wzMZ-*2o19S3SJw_SaZ z$~}zLq~P0$csE4{!)E(x`OBJKjJ|J=Byln!*^ECU5lI57Aj;)~AVq9VRGrHt=JB={ zb7`3eWwq%gZhCMbAQ(SKt>*Vn9Jwz9XZ-f^;m^PPm4~gpu8I?tZ!1e3bA5@5YoF3jSRRJIo!lPqU5u}&c_s_sP!$$0FFfGG_j&Gw?M50Q&R?DmWnhQPev2apxNOm*^*4F`Y`6P78fPt ztR>ZFC*gg0c-3_8z2<9>e<#`Y)%~w_3pEj2_0j=>dAas{$Ja_5V_oagmCo`z(x^k9 z29CBj?^lS%pWPJ*^03@?%S*ncKlDDqH^590`GNsZVlo1;;FVz3HTj>9Y99P=p7=gY)jmA+ zw=S7EkGkeSYAMpMOF&rMMAiG1J2)XA{`B13fRA_}fSaA&lT`Sr(Ic`X^~Vu{-fuX) z+MgOrzj(JUH@4a0aC<7^*Vj???c&$Mv{Q{rJZ=nGWFPPon09pAn_)=`aOVZ^flWl3 z9f-1OINq=(90N0}z^g&nkbkohxY=6kYVU>Qr32P;o})aBnnhsmAOM-K z2h6d{MCM`D5dBx~HWi zs?q70(^y!e#p4yDvoJc(3b%hBLE3CLU7xLak21x6 zQ9Jh1lO(EUP<$wkII>W*K0|?v-Jo#z;LFhWjb?jYi87n7%MD%6-e#YC=)ki{;jSVT zjCF0zCjaT;7NQ6t14U}Vvt&aiC#77rOON_g5Axr<-bpO=O?#hSN}qm0@r#epKB%&0 z<8lU9B9nu|m38%{$ukhWfcazTOp#9r$T1xfS$muZdMQsZfr+Q#0G?LIx}Z@rUlL>- z5dpy8j$zMYFpeOs8qBMcE0s7%Bzw&$-bHC81<;x+0TNz`P&iCBJRQ^r1Kw#2gg}YJ z8F9cGo2$9l>+W4A*}h$EtJn7}Hx|d&1~=KQfv)QuXEAv;WUaXk_Svi7CRU7pzy0QW zbt`-FDzHPs-`Bf~zi+zSL~bxMd$!TMw{F+edr&p0uI|Fxm0$OR?6i4i=ECmuwK0*4 zvd-P*UxhjM{Qq|HH&23tB)X37Z5e+)8Lu&kuW%JI9OVx%bt=IHXFGcHSRFs zMq;QAkV*9uj8wi6m%vjCvt%P;U_%aj{O(MnBe`d-OZJH+itaO<{%({V)ZzR zp*PIxZS-@QP{QL4qGjS74$j*G07!OS_8Ym4%b$9u9(8?j;3}*l*Lz3nk|#t@@&p#a z%^Jo-s*$4%@WV*JI-{y%^0gZ9UA5@V2E+HT{9+#6@sE*@+enH2xazFQ#Srumkso5I zVm{DZOmxwu{0ln++vr~Vr?+z2>6y{|Ri%Xo>z)8HwpH{Vyph zG;BGag0dijHza!3$uh!lg-^zm{{8SKQ|Igc`U0sq0n=J`X3aYOm#rZwdVdegj?COk z=Pn0KRv$#)u6E@L#BCmTCivdB_-)&94D)pUc2jv8GstUdrs?h;8C3ET$F5IZpZ!BI z+9%n`UPKhs{N@)CAAic5-(U(htyRY4*HLinVgZMzHT5XwnIgTYx|oG>cL}X%P@r8u zSkW~d#dW5>^2UwAymBBjhP+rS1`Dr{#O*ne(ehu3-~X1cQ%;VaoZOp~6CFAQu6eJL zCxU@uGE531q;ABI8xQ=RICZ~$>JT_lW>902J^MkTtt4X%OU&rUi)hCLLhnY{O6S zw4P~|KjVW}NF$3CIrwo38V-&ZS3RHm<_%m-224K1U^0gk#@BI*l@&`Pu01yFvySV@U{W29FD(Q(LnJ=H=;%wNM)@WOVOoQ>{y5iz|YTpB^}x|JQ8!+oQt&NTB0x4IcseaxqtKp5~5iMmoS6n-`L+NCS`9!jl2hJy{1}##I1xQy zN?Wf+Ci15<;UTah;dkuK^?|p|b%p%D=<2rMeVh9JePfp@-mAhBQx+Zf#kL9W6EBM= zC9S_z@Q&7Y?Fs96Gi}AYGda;Cc+s(Jx=ogMBKYCP;PE1a59sAA%kz`?w>KLPUJv=f zM{id(P9YB=_qR?azo(@jYxP(@^7CbS-eb2Iqxa&dtmC=YZdt{f>P_P$#})wC!2DoJ zBRp%H0I*GM17KKXaa8m{x2s!iw`(UJ9e-%vW?4+l`X1c6b+Uf_TX9rJM<#ynbK!|Y zh5#6~G2b$2hG5Ilv*i#mG6;P#B_@F)u1WSc>{ZRjrNfp~9{Wc+{DYsZ&-JcVx37=+ zSt|0lCM-WP#K3*@OCV+GBFA3}T#uRynx!O0N*PTdTQ0zV+cON<4fV2-iumD3zzs={ z6{eR14>*wD*d@vn=S`oht5b9LH~k1ALpOHpVDmQcLGp+^_iGq_70+$8VfiP?w{lc!J{XkQZc z(W6!6_JWkE8_}nx{&piEyeLW{L$oPPRQI8jjSHh+a8o~y?&_Ueir7wX_cV^H_3a;iH#jsz&KC2WbU&e=r@|K*`rBXxKux8Ie@6_RZfNdc=vy#sXM<)^L z!~|uMg(~FhGH$iVa7G-EYaI{LBJjXCCzreQ%P=Rd32Xm(UTlG4cAL+ntraJkV8d(~ z%ekpzjI?dcq+)4j$6N8YIu^nIJv0tIdL4zwefOQ?^qn#m%85pazT|`Dv()4a<%?4; zEnGhfwQ}rr7G09%@MIkAvHk>wfqo89uvNx-*mUO`ZlV8dJ%Fa}Fsa&k19($k`woaZ zcq!D^T{ldxl;929W01K@)x19);)hQ;lMWd;j`gSep8Js%gth2$6N!QxMcy zN9|h2vUIn_2j)noLYuY>`txo4<>U~oI5@gEK3KcoY3hpJTl}e+>gw1|WTM+hTJg-) z!1p+SMx*s4*TgGl|5(&wwy1}cm;8&dM|*dOksF-gP6=i^aw&XyeckrPkn z20nap&`Hyk>6iBOqrx;RG5al%0(k(bog9XEA2{I>yx10-U;WqYERLcj zy0g>S*X}C04r>3=*xju&$oO{^C9nF`Y>rQb3G0~B&af+)Y>faugeDj)&0$8wbxKi2 z)b!=7pw$p-3oG zhwgMuWCZXpka*WLmy7WVS%~+z0_D{-M%9;X?Bx}MZ z$gIvs7Twye!^7PIa3kfu**~VVbXT~qq^e-kX zX|pr|e%`{j?1S-USuG03RCvR9MI5AL3##RPX2sObbI#X3(!wjdR{@`v+StUGYTrBY za7~%HWs4rF2`|^Apv$wX#RT>^BB9xCt(Ko9V7hx50r|YoN%C*(_Y&|TJzGrBiGzrE za!*3vNxpV7xxuKhO4n9fX2~sF=SS7mb0ZPh%jYA|sE@FMP1Dy@XXFMeew!2N?YwlS z?-c~u-PZ@w!3_LzT!v9yuG*RlP+9n?%d^%n9QTV;`Km@QmDXr1rExCV2xj&VM16fa zD$G*m)!Od{&c87WUQu>>nc&JDj2t?PA z-GX;j^;9>dqiyz;3a5?{JGc(ncc84ac94JG)b`}B#E2ZY_<5V*&M)Q<9B|~*P;eBD zSYI0+Cc6^2Vni|QS`snR!op)_ORYEidK?t(>-@O^1s~4S!%oNw8;FFO9{k0QWB!y$ zrh@uIOLS^T_unIzTkuE%3D&wsl0?sVo7Iim6`mJ2=Yl#$9N{JHsn85cp+#Yb=-Pt% zxNa?@*>zEncc0Rl(g`~hI!DBGwUs3p8NtA!C8Pjji`F%Ox&Ub&UhJT7h?O!fz+b}& z_5g^`AseCiIP)Oca3I8UGWg$>q(r4?ro^hP1U^=X0N-kZRy~92#B|d#9(CDXwDa5# ziiY~91{%_uxLrG;FJiNkKmf`CUV&Pdx@9pJV)&d0~y3!#G?;XxG2r}U^Xi}H|vzJcj}J@3cwCfjN6cr&*P7+pMM;!4Lu(m##+ve5JvI;FBZc@hu9Cc>v$W^JnMFZ@%@Z82w4N5 zb>a}>|7phfBUh9J=P3dl!g^0=TO_xR`T~X1Xn3!eG^NW-olRAqsps%#qz8Jh9p46z zG_>8jy>_<#KFI(|YE4t$6pxSiA{t90Nr(xr*#yF+rV_ zM>25yn~y)iWM0$I;nPztbTf3I=TT?>zNo{0VM?{I*6GyEYW+D!XY$X`M0d~iT-Y_R zVK^}Omlibx$c7G6H0=7`ik_%@i@J2|sJI-@3a;3fo&6o3b2Z2#!I37TQH7U6{%7xi z-Q#)#%n*8OM&hXyY}wuj+uBVSdIU!`kZ^F3*0kNlsFO1KXrauc>YYBIkMzi!tO4U; zS!(j(p)Eh)c@#32a9qW9Nq89tQlC8BFZhh`2&ppT0qq$-FPsh--i#vD>&JI?Y?4|J z^)uH=oa___E417UKmY3gU7?-z~5`ET*a2!)Ii!p z(%7CvoUq|M-@V5H>q-;He!lYhE}m2|LW4N7xzB4Y%sSMd;rQJK!D~TuX^->7Ds25RHIZ+rEkCV8VlIA?K;)fI+L+~^ZB8S20FiU$fSWrC^ zXI}K_{`kz!AiUDxp2I!7X-UkT^pm;&LhWf`V6K$UZEA=wQMOTj-|$zh?a9S4w)AtS zI2a(+R8XY*@{hvpLDSm9>O@mH0*`n|f;=2H6JUVtMArUc=L;8j&^XlIAZKWcs|edl zk6i^>=m0%pw?A+m;$}ul%l_}f=?l7wlBlt!{pG1&7-;cS9wg>@>TzKVpymcZ(u|_D zQg7HuN=n{We$`#DtZgzW09_$0_qJ(zk;}bORxBWRcrJw@pkess@sHrq1^+ZGL)l_j zz8g$W&tQ+1I0^vJsaSk~uS^yML{QL+jfL_coI^rsA|-%k9QrDLIG?0M`+vcK@qzn@ zoOrwEA=e}miOT^Gztqd$#96*?ZStxU>dq*#ir%YE9SMU`;XVsBOOleu3XQI9Nw>j{ zou|mK9Yzu-4q=j6efXQWPsd`_HL(*;KQC4g2ePVov09ZJc%&Rk>Mb90O>g`x9&a1C zy2>IlvMPx~8S(|N_oZ@FbUB7Bw?r@a-VmnuDy9W~#n49h->&&S)QDL<@f*E73Uun=wQux<$eFf@Qdnetsc*;@PO{m^N1@~G-z zdF}1p$4XX09xxJxPNb~>@nc5uHGbiW!!}BQPka@E!w2`nm9kpy@|A>%d3A=7UsKGYR>OQG5V z(toWvyv&_f+%WdcfY{ai*J@Dz<)7=*(Y@5@PxFLh`|3`4zgsjs@Z^4^dp{#Fq7Hhb zneP_P^E8OYhsAJ%mEs)4)+jh%o41d~EmWCz+MaPB5T5peRXb)!_SL2J2`}?mabZ>B zvthpqyqx%KMLdvmnF5uWojLDyHog(hXoC1g)J`5%PWzOzS-Rv2tsYv0l=zqA0#%-~R}Q zr1_McbQ~qg3G85xLt=Rk~Gpb_xIY)Z#05A4)n_j)>lR zTx;vPWGgROFabqtgjYk_hm;F=^f`D=8u~MPbQfd0Nj%O_RBUXVsB^yeIB{)jo47KY z=(Njx5hI@vG$mEY24R=ye{U=(L5%t}b?kFDU*;6&3ADNC_78GA2|C|@a&)~bI?3B; z5>TwWN?xl?O!z@Neuv%BQItgrcM`Y2R##N7C{@>rXXtSWGghISAPgA%;8*&rOy`hd z_-Q6La=6eGjJO0phKZ1T3OKw9Ajlesgs~>COi461;t1EP0uy?c7ayV!NJzxVdGqXVh)oC9)yn;>kv7Q7T~Gg=Y)v9c}u_mz-a z%1O}do>~2|l-R2p&fKgk-Sv&U6fs|ncsk^To}%sU6S5OrP&-J{9ziBVT4cSPDX4Vq z&!nQq^>~3GHG7tQyw%|c5i4(RBV2cf6l;k796dliW zwS9mhU&qy1?vpzD=UuTy@+WmEEroZ0s>;SzIXMn@Q#|iIbfEo$L?^{yp;2`TjZZjy2nL9=5X7gWKTYhNf~Vik z&e~=C89wXPbaL2mIDI()wz_>%ruRUy_)KFZJc~Q{Dh3Nx6WqTpYuGqtzUQc;cmCX0 z2)-;$f|%20!K;u}N;LE$4UJGJZ29Z?KI^B~Q$KGRpTOJPw6M@cP8;0rXBz*xaR+FA zq*!eEoVB?>rT(k`PwQKbkhFj`V}%=!znYb{3crfx)N4!%6BU3yZIYN@x||hUrGO%P zazGhAxpL=|Vjse2RFrHYaltvPxIM;jW^mJ!;*Zj)W9 zxRSN0_?}GL9+t?sMlW(0S>2!I%i`TcTJxL44UC03V52jz@d5XDiXldzKzC?3X|C9G z3VdA=gvICrL*r1xQQV9!e8e6RU;#duJONqs#whDL%CYBnCU&m?EwRLRLDPX|R8_4& zXYlgFKZEQ1yLS)w3J?Dtx>lqWyuzPECkl0byPdGntKTO$Cs_J^VVBLY5EH=Vel)vM zf`0X_>I3;Z>=%Mgcl8G;GwlP4_gkN{*3CWX-+e}uG^cZDkm)5BnB3k!enm&lRn13^ z5c6WxoQg{{4Ap}-%;zYFxvuYK%<`~LW^szYV`7rt7|7+XomLtrpPfvEi<6`$i|`d2 z|ErTq_orMMmm?fy!vJCA$&%P51$f*NNA1GuV(WkQml zM+m^|fU(v$Kz!Jp-M&TQWCW-TID}uA55JsZ1)ttJqa8^H0kGg9A!r0KhL2elh4=`K zL!jZPswUGKz)LEGpAp5+r#O@SDoxP=^8kSeu=v1;s%T_4my{cDs9);@|h>5TSpdd=OtL++a!Fo zrC3SyvQ+mt4OI1P zfF9>Dyia41^)@JR(@t#&3Gtr&wmQ5q^Y`~5QAdL{Xm0hx*Rc?@lMWP^0}qFfzr0Zi zk(1cA>+(!b{Cg;<8y=Ufj6Utmo%8R!es^*`@?V$5zu>OBuX}+BM+Ut={H$woO_Ga^ zJKUaRIVH&1X&M%Tt0UHw-1@_O{?R$@$`45Q6zZ>1J zjQOQEqMO(Zbz#D154#Q*~EQc#*;;FCOISAn9>V3Y%qKDS$QKHG+*3hza?+>j7(*Xv8~`K3rvKYh$lW&MgJ)?Z zG=K>4U_oJi%VIo8ta=y}07Q4s*LVO=wIw_qD^Y^lypBm!mIn24WHIyp$=kE*wSNh3 z|Lr}TUFZM%{J;W*riEhR2cS>lBgrrVKw*drx5=@6 z>|X#l^Z*1HlQ?V##Yq+8p390Ejw!6XTjZ=YbUP$7Vn zVjVfIVq6q@>(r4h1ffWPjGGteQI?K}*PtGQ1SXf#>li+{{EY9_9A!uz&2cJn%PCPk z5Gqmr`FS=y<=|;>^=jwHUgc5t&|aRkP%t^?wzRCM2FA0QAxxovuaplHYDPuiavhb0v7=uDMD{?Ct)P zag<;F+h6^XNHB+gz|bE%9+UKKKW(*6_RVD<``OHr&r`+}L}{ERwg+D}I9Y<2?-5Lj z1TolXu3yFU+1$o*43@D&&?M#u@r=kAzC4r|BdoqDJns;CDc)(xo zTkwV3sTLla>HGZs3rhc}f=2K7j#U2rqdt34!*fag_m$s4_|QH+4m^Jux?9!#b8$wr zu)Ll1x=cd67`dJZCb&s zka=;eI9EOfb1N^$1iHSZ{$~6j63a)e+ABWfVrG=5mCQA~6<&ET5PPM+ihPlG?7B(U zxu9`7OH@eznvG#LOTptSM+~M}z&^d|TTUGyK5plEY0`B&pMT;i>dau>1S_HU98noI zs^Q>b@qcmIX+o)4>%gI}tQ~HRrfQ+BRxCQ>;kTv%ujj_%|zEP1MzN8 z!nG0~dt6r{xcjb#jqBp)$$k~|BTu}NMwz7yJ5=aRKD~)C?06BG@%cpg^?P?g-?CCB zkH>7qpSnTPm?{$#Owd?4%m`rPxb35ba(JI-tTQt<%83YvQ5y;OsjDw)|1e3_a$AMybUmSy23>E^3J#GA>m=O>+as9>vQ${LPau}i_TYX zvpdioQ~`NRjs+1YNAU3&Z1!y}z5zL=DWwcU$r%VGTGdA9hoUf^-U zI052XeyN(-GUH#HJIKe_-05qF;UP0wnzelWjyQ%-hmpYo)kLV740kH>&7=x^P&j|4 z9J5F?64X~r+( zc!6uos0Kl2p?G>*Pf7!GMmP3yss>_~-nP_l;SYUUtdrg<7m~1wS0dj9V;gO_2mBC79}BR6-#o!E7vzhlm5RJ{vNU>{4p!Jf@Y) z6EF3g2{BP@hkUV&)oT&wZ~8RtD`(^pmSa3sFRYCGna$jmkgp`Spc-U9YV{}%LGaO^ z2m7qm{jXFycv5w3S-_OY|%a~kZ2XZNw0_)!E{D7-$)Wbx+eIkWuR;JK5N z;OqP2&Xd3N+>BZTVB5aR-QboFDfRQFs_kATuIU+vc_!v5UM+ty(dQM(H(zt{67lY{ zX3R*)toD*h{GIr$%Nmwr`~qf=>EE1x9?Hv$Np8kgG-qHLm;dH{fL2RX3>bHodb+_# zW^8;}MNblS$ox6Lci+!|8Sis17q%2Ww$F_6nFvX=B9FF4dWp_;m3ssU{^(L)1qCm- z&WZlC$k1INvj0m@HX*yazp%9C@vxq(fVSy3nhJy1%!sQ@jYGik`MLy~UlfWMWVy}& zhJ~NK_}4MpcF2Q;n^ptV69Ntpmknmkh!~+SWujmZ^(M;3u>gSC$GwMrafGVY`~*zn ziJ|a~Pzbo01^|N+^Ia-MwjTb(zP+1!xOczaU&(^L46#a->KDTqO~Nv+l?s0J{I_2g z>pwfzrHS@2y*8WzPBl(d4(SYsPj5IiUT3Bwm1Vu2c87|(Vj&svJkk{Vxa%}+7L5_# zdMLO|g1F_s2pVV!QvG>Ron+NN?5S$XT^rsv!o17!=Zl?J;-E*30*@hUiT|QXy8F%e z3}Tq|ZHZIDTC(8$Z09Rqb?9CEyS=ucrbA26c3-H!nqYzevrBD6|M%BQ`Sm#Ie_M-5 zhH#~VJKWq4f&&}i05Cs<$%-Ib<}n)vOy7SwJ2#L%QlU}QouFqNybSQ6h@*&+;prhD z0A%Us4~RwL&R13~c1wpsFbs%8io$nT%tm6;2QO&3=%9JyJzpLBFto&)ipPfRq{x%Y z=|780>0QP&Z+ruNH=IcCr)O{b4bgX<+9%CKuVM^n3ujJ_bD4u?glLWzuVjM02byFX z%C(!*vQ69%a_LT!q!uAKb)*>zHz{b1}q^2vQ6q7xP0BS30xe?)$E*yz@PpI}B( z`1Cg(N195b^QIBn@g1de?T&kf2Re0(Y0*>b*CF?&kNzyI+3PGaZ4e=6=79#d@##$A>XWG(5i) zE|GcbetWo!X${S*Kl}I9J6#zs`L-G=2W90Ld9cH+z^GzfI}N#ZbI0Kh*pLr{5*KTY z&Z%U5@`3dcBC)>pfP&fM(b}ci+M6fduAUvU(}pTsmU-qqui<}5G-TKCxf$d!P2C>d zr_bYpFWwteyYa%J^ms0{<70f4v_sSCq!|G@`jW(=A_(5Fc9XGM-{XF6iixw(RXuK! zvgd7mYUl=?+R@iLaN>ITmLYw;k2G~~K?05m(GNTs}u04}*LIS>GOPY6tc zR13Hn0o@H-c8~XAq4MGt>K;vv7;7}WR?jCZ2rUUtlqV1y&hxN12;wY; zDnLPgw8_av{Y%Tv0ZDJ?s`M<09&A-m@z)u%3OA;n5|1G9s=->JeX~+S48Zw?b5pJbt&XI^R3lqCll4sLq*!5!kuAW6ZA9R8Nz|^Mje5G>Ay*pSZp) zo+@8W^jCV?cpo)3^{J>tWjvISYc~foNxm^9FFU*xuwsGsk<6N7VjY%dg>Rl*4|kf? z)J-9x6=jSIR<|E87p<3$doJdho1MRQ^^{imyXnv}U-l^EYIWy4BCH_a;%V{ADaR!| zfZGOwPK5{)1*V+J5Y*z<~_B&Y~^okrp?5TlO6h9sGY^B zslfysmx2u259nx7<1gV~!w+bd>{x5b-zI+Vi2|g=aLrU_|ATN88k;#ujwT$xVuIXH zjzk%>oMpFgbd6X%`Oa$n0kaVF=~DQlWSS{#qMpO6mR5(r3eaH%a|5W)C6X1=m)1}$ zC4U>A2iyxp6h0%I8j~dK(Hu%xyE#3Q$Gh`glMF=#F){{WhT{nF zs4bg<%u@)VC=QW!Pr>Kx+pf!;FCx8KAw-2GJsS(6LAi%Q?_3;qR_7k4*E@gvzSmi| z9T_h{L)`G+r(88ElW6XrQ)H8k&y%2qk5}5J)RT_z+3gG+GeZ_5|!wfJi(~;IyOlv(@E#P^8*g2`)m`O&txKB`^-ED zIljcmpw<`nbWYZT8vOGdpO`N}$ZEf=WS^dHw3l}Kr?QemXAFd$%PQp_Oe9}l{uUH& zuo39vj4$qm3Te9a2t`b5MeCumsveQDRXEoxGo(0_%-O);m`#4&s-Sf0Tq5AMf@!V6@5MW?DSxZ52vjG8}?MH3z51ll!7d^r}Tc) zNg_E~_u`2@uBm47g)l2dwKz%(Gsnm_xp90G&lQgMX=#aTJOqK%0xEEw0PB0;9$;^q zFd4$mN2x5&#MsGSH1qi!(6LAcYWPtA*un|I21h$JumU;Xi71R9nb-}jr?PALo!5W= zju(HXvL*k%($P1CkKkK?D4zXtQ=!F*FDL$A3gG%cAcA^rzIbVmmc;IAI~NBZTIH`0 zMLzT;Zt1q&&i)#Zc%P8)hr6lDwMc#tr+Vf25c#{IhaVH7?az2J__EM0R4-5($~&+E z#t-QoBty#5Kv3ehZKrf(cf|9Mkz?t1q)K^#E&^GUS~ck^%e83f^Bp>-lF`0=mwxrqI#8+7O)E+Xtbf zz&Xf`LUTGxcVFSC8J-1oD@8S~*h)8qN5lEfZRq5ag5kWt=j)`Vk@^O<@$a z-5h1S?v+VF^H6pq=Xw@31JBET6t;Yeiu)_2obBPy+V^oX{-m>GcpYFGETKZIa z51p%Y8Nt+6QH$lbM}IoSCeGfQ=jp!uH3(7U;$~$5wP< zfL5C*4K|_RPz5P=q_Ps#@^aWsTSS?pZa+k^A+a9%P|TxrV_^D+=T9olxzsnEnGJV- zcRPn`G{^)BG5{41hDr^#Nd1jg5(-c;RWk(v!Dzq$h}ffR-w&`fiV;~5oq61M^2#qt zJK*pPx$_uvu>Hh?k`hFf2nI&q09ekY-*KM<9#ZkqK4*GwWGa|Q9gYqna8lrgIem?k zl(;97xTA~FvzZNlnn2D=n}km6wi1GYfw5=BE?u3CVSisD*JRqS1J2T{o+pUYwT`O5 zlp;bg&a<7~vI=Ul%6$w?_j=`eWa#Y^oVnO;neJ(oCK1*-5EbIX$hcWz2*rLGUOl$l zA!gR?5tpr#HCcLmlKmKGJzk5zd^4o+nfSC{=63ZW=Ky z4Vb?UrD>q~orxN9qWyqMu*0{JwtaUyJepx@3Zs_*#r}{PBKEaT=hp3R|FS_6)%Kmu zszjhNrT`GC< zkSAo)fi12`r}ek;;(&-IcFDZ#UvqQzqYq@I;xF;RmUaJrcCy3wE}FJX1)P$67_5asg7 z5@n!={N}YDX+$5pGCG)ByK0m@l+{WvLA|COyVa7{KaRrfx5DJ>@ zC@YGw79j9e@?(%y8%#V9jH|k|)D#{Tc=_7AQ;60LSKQQXg=bmRoiCT%7&85pdr}iB z>9$RjcNyA|*PuNYYC~+~9QJ+9S`#3Cq}?aWT`~SpFqgngW?6UjNB#{zlfhA97#6wH zGI1Qz^)VimWl4#9LAo8<W7NCge@5L5Z5!=2HF9E>wpalm=*)HlER{M zFY4}*kT}s;bAgP|5(zvJnmh=E4nm$Dgk5AD&7E7kI3_9Nt21%}k%)^=hX9}s$?&_Q z%cXzkJuSyxYq5Q;a7E5X?8U6;o;bsru;R}iW#YMg;niOsinN6kU0YkW=-&$vm+bz^ z)k;JCjC|t>2PhB$xa3tfQ@wkxY`B?Eg0jpx5C|-H_&H zOU_2qLLx#_Co};w5B`t9w43QFyNll*UmZkah6#h~H0gbioif`Ok8h^k=~V!#aEO&Z zfO~np7H;^OE%$yDIxqX2b)BslWWoS0b82qRZr7&*d+f^C$MN6d@;6j2bU^4NXFP)m z`%J-K8Ih`g0m$rXtc76y_ur!xL+|hIdvjuJ>=_Y+Tgji>X@dJdKd;FkPRB0Il55fx zFz)gxYHr{cB$u(AG@WvCsMMbi!@YIeqTdG%a)-(86i)>2DKgi5IlOK?EmgPu)|}Yb zZ475Z6&#dM%$Ux$Esu%fE8~-YDY6;~_iY1Wt*O_BHn^-Ft$d{vt@hO{OZpQ>y3i*H z>nZu^obQB)1i-ol7{bu(Bw7k&9VMp-Bq!dCs?`RXo$-)JX|nP$8j}@=Duyhpda79} zVq;2S_!Wwr9#<$S6gOGYvuPWnj$WZs8_|rB_BjBK4l>;Aq1fb5B{G~QX?%kBqP?Ww zO;oMczHni^Zpfcn%E0(=)~{-TMbx?(Ol7}+Up|f4&^1`CtTH5HW~D^@I}{zYeeYrz zs)PSy_dWmyqr+nm-mcvO7aO4g5hhkIYeM$**3%7hGaAy3i*?a(!5LF!O=a$41vbPZ zmgE@W)BXDEB?^r4SWtXQH?2+{ap3Hg zI1&WtW784GBX%|w2%;7>F2QRT|L5wO0r_N4HXJ1W${Ziw?eV_H{b<(jr7A~}hIsv2 z72y;B67a}yt|hZ>Kzm(dB4q!N<&wOjU$LV`RGVYKroH)4l0t^Qkhb9+U+7WVp>W>3b73&evDnM{D#@}jcwtt_p0nfP$% zLK-x{1}FixEN~1MV0)~B6$S&E<2@1(fEfV{ljvZ=UBs|VNi2_W)u4FKJ@ZP}p|bWS zpf*{_{t!i5xFYi5CgEm2Kl^6z#y;TbMSWYEXxev<2B6nij@H2I3Ohwxp<&?vAfmco zVtXl|Njhc7JwM;kF#I76;Vem*ky7Ut1t%=7K$F4r3ct2UA1b|S{&%T%2+>@UBr)l< zjIvZ^m!ljvj&WZd`F6~_)J**CsvnAJR3{&GFo9M))jNCm0=8FCb+}gVr@lVW!^#L| zjKz~eAZ7#uOGZX>l?>$RY}vtFjJQl(0%QK|lT5p$zi`msJ&YUew*IFp8$dhs-}(2o z)tiy)ZTbWP6cLcmCvs07yW@d;#QVH?kp#1?5F7;}iBO$a3bJSYn|1C~Q!*0^Vv{vB zj`u+k8e5aXpaMd)P~7U4my;9_pTGAv_waSKpD2-=!|}(X{grucDp%v0@?MKxCfVY) zZ;|W@bK|)`DPIR1wCjG|^Q|;Jh3gX(YiOCHKASAX=*K`|V7Up+r}JMh1R+0z=^o39 zfUL4+$?JCoj{j?Oi9@L&tXRrRZE~K~7qTjH);|xkYW}R*8tB7c=DqOTLcjAbUPRgY zq~2gy8RNxW#I$F^n%{OdBRTPf8coXKF*sgc%0e#eDmxB?*4cNgx=1rlUEwO zf)#H_7$zR!dS$|Sn+3w8E7K(2?M?}d<=PU_y`4%ms`wZ;LIwt}yzUBr#$RA#n0MR) zdzSHtgL-}F9QefZ&++S54|u5lQx6a9G-o53PAle-?SW6gXqPl=HE?;=qM?zxZ4=-3 z$a=9)mhOw6H@_|rrm_zL!obfufaPJJ{#O_fJS@gR8n*ldVmbV4<+9aJJE%#t>Dph* zq*#ePH97f{YiykOj1tfukc^s4b~9A|7=Sr%tT3YrJSs>pUC%aBDN15JFmQfk2(ni- zef#|<2M+9xZLlH9i+XTxbe682Ls#R=_E8QMNuaQh=B=*XINCZx_rKmy40VgKK3~X> z4*wP9)0NN6cT2mjNZoY@9M?+q2n0z^GUzc@75*dO_f=8fyB27kA?~;jY6PK3V-P>a zSDv58&q>lD3=O3~1qC1!sL0^+e#>0v>eWWs+qq{)U%2w~|J@$l9E^IV4X~l#0MWz{ zVITukON@ZBh`mul(LFqaGFZWN8ON4aa!A6T&7%8Op zI#KZcxo|7#t1!@}xQ|%H8&qRT&TJnvlqf>ayMkN>W)7;H|C0=77RpG;VHH;FZ}*ON z0A(h4>?5I8ctB*0F9lfd5n3owxV4y5z)VTj8^?Q=#E^?}k`1agI+4Afdw8X=_HcRj z_*(Q;s9fngXJcQbfIYsYjf8vE2~_xd43AQS#vR=@m|`9uw5cp#xUerq`89r2e7(Bc zCK0x9``>Nenass7C=sm-lEtxFR$(M8SodabSrMW41UT0$E|e+Y#m8rac;X4!L>}|B z;8qwx>u4Nn4ux1sn@g!Es^l{;s!YuVO?Vt`x36|gjUARYa;;#FyDn!f@F%LJGz%*c zCKg3T-I{xC;Jb}8s}AqAdqK#ipvx`Tq4)aqWJcB(stFYERRK zu8o87qaQrv3G!cmyI|h`hv+68`IASPEcQd)+Cxt*=Lf&6kK$HTJg=nn?#F(93IDBF zIk)}U=5EEWTh(K(Es3h$yTU#GG~@1&r7a~Ny+ue#+OT83+JKEf1$(1Qcx6x zJVNR(veFO_YoanjX%jw`%#Pz+r2{&<10v`+WD%7gOMp;M^^Y>%P~@womcR$I&sRJ1 zQUud+V}4=aKS<jmVs8I!$FK53Yn7g(FRdbD%P9@V@C&O1PNmv$(;vK3(EdPmk9>5&0>R5XvXv7TSDT?q&JMIGDG0s4tXF4PDYkNm57$N~ za^+-dm5@F{rA-+EQ5~)bYKMKr+DW{=E%3!GjamlL&(qQNwUN>6(urt+P6{_s^QXbK6puwtBUJM3n@HdJP z>BdDSH`@HBHk9yZOVuk(?ehV#>2XwP8VM79WvBo0m9+R{6-S0nq6Iw@t&HyPjo2)c zpq&Ti7g$=b_KJZRBZj?x{4{R9Mj2Htx@IXEV3~JvxO-NfhL_} z$*W!SUmmvSwV2tgyOOrMCFOFVAB# zFbCGi7gTjj0mnke-kJj+oopiJ-cwRC?MDYJ$G*7493b~^kIp(C{BnrHqx_SCtDex6 z(W*E~4L*D@z6u`($fzhK00VD8R(;se!HRJd%nEp&TWqRi;)?E%JCg)ZFu zSb9G3c5grQWv<}<%!-AFTdw7n+s@pVppeU>!;HVhH$6AW$jjALIevg5CHw_H;npyN ztm_cL$=bh^vx?(<#SSV}yI~gv2@F08>c(wf@mrtMo;T-_c2qf4Pe)Tg<#Lm3fNI+c z!%}JqKbj+&L^47~_!LShBM&PXk+VoHcs|&oHcp?#((h$sU6wCn`PE7eMeq7rPN?I> zd0;GF{K6i;nkwngOSL%ps`wFswY^iM7u%GGLc=r3Pabv0x(`llp8AV00xUR-4t7yX zjVF+A(RJ=gu{{8y!e<5=VSv}8Cwc)VjrD<^wQbo9N_+HkhBar)n3lZ5?-Q?I9kYul z0Nel>7IK?TbC{OBSV@(_-Lcva0EmxxEP(w8_pfJ8TcBE)FZ`9e#M~hm`)h)n5f3CF z07xYfK}THDLxNs@<5{a9DCr5^WWQ@U=;yYKG|Og#B6Fh&c*D?CqaH#k ztZ6VPR7|+sn)W`WAX|vAR*@aHcJZTzTB=&{qkrUEI;}!}@OSbJZ;!i&Y}kb0%A7$X z(aDRk#9l+bLW3=Vy<8-Ykqh6a)*}~w?9jb=7Z36)`=!(ak4p3EH9j9D?i%1?Zx=F0rpII=`*|D5h8=8ywDDZJcJdiDWPbayv ze&pxo*FDTUK6Y(aDw`wr&aA_VBYe!VA=mAt=c0XZB3{~k-{2v@Mpvtw z`=18+a0U3+G97rqJa(7sWrsx^yH1)J;KaUP3{KKvMRAaWU`k59I^f1|Ro0?Z0mDxp z9;G!JXtLJhF0O$`MLcu{j9x+rBUvMy?xUIoH1VT*_y$XYVtXw z?WkBx0z|*u@H+{HwPf$Fc+s7QT=iXC)ikq#oIr1wY5_DiVK}*zljL#LjZv4wBp8rl z1Ea{%?*h!IKr8@568%$|F1fB|W=YsQ5J?K7z(OOt=h3tgv%e3wPj;6ayV?Vnd8wfD zagGP+4PT!5@N_i7aeUDYV|44l3ey@u!AOa#uc+X+(Nry;ntNq=Spg1UG^v4ug zCr}R{jN+-=he7?|FKq*IH@jU^oZy^)rh?67Dy3Dk>dk2y_^muTiRwyO-t;!7W71{3 zwy6l8t+S8AT%GQQt?P^UEtr5{$KG4`-P&2pcF0q!6ypB_tuQq50M>oojT$$~1+S}+ z0zD&$1ca59QUdln>ag&qG)fo+VF`pQ)13gnEtjO5h8MH{Rf{d0|6$1Qs_N>Us1clq z_j&x~vECO3|BJb>dCM5y^Jd@6ALA{b{#ybm&fDFMdTU`` z@Xt`k1R}{=@C;BmF$#(Yi`eqT;8{_8b}c=SrWePL?WlV2dqF}|Fk+dx%FunswBt9A zl5-LMOh9exkl1~RmJPLgkKF@VRaq(K%;UEg4j*nG#9oGx{_|cltB}GSi|TZ40s#IX zRomx`tG{m_(9tHtah6jQ#8!v|C&LpIJm2N`F}yYI=+wT^9fhpzxL5Pm|FF|H;K=${ z-mE)`01-d}$O5P2iI>q{sm|07pN976JGsz;>tWGlZ=W|3tuE10FhEA>kr%nEJ7Y`zK%i`IsXtR+!>EOgx(Rdj`K(s8oevkXfPdK)3sN`;u7Cu z#0B{yw9|*Am>?DEi=Ymp%5$+VJ|2x8bsm0I7MU~gYQV2D=r7LrUX~yPJLJ9FMPHP? zIRY9HJ&F#dsW#TKWJwu&vId|l;r8Lq`maKsKj`>?#@S=hT_Yb(o+WV+sp)=IaT}nF z;YOj}X=<{c1+YXte~Adqv@{8C%hV$Av@H!)Vt3BKYgNMZ#q^z^-cuZLn? zA>|q&j<{U=Q|h>`gV3yAr7u!aEZsu(_1mf4hOBKx;S5ee1UB>^r?i{iHwdN0k*4Rd zESj&|1B4XpYSH#GfRTM}fpL0YW{y1(u@hpz##~VIbUo~}=Auct7^9W>#XU4A<%i|h zJd;9|5PKffDnFo!kQc86qrWV?Z@Mx*cM%QMDg?4N@!nZP71=-L){Xk4M2Nc}Cxa`_F5LW2X1snP%{;KaN%=2tyc_;gN8qo=0pJLu&%y8Gw`pxr z3o}&0LiqlPI60*N2@4}4&aQ6=;hH2eJ#D;Jmqv}DPESBwyDIsaMF%xe(EsnY@pG?KaAfSUUH}DM^jWdUopEquZuZ%ho ztB|D4EWX(``^Cd)XKub@Sv$~9vGle9`ZxsQY3-vS%Sy8a%>?X`hX_};QXComWqbGZ zLxRS@R&rFNi_+aWbnE9zPfmGo15&-HDz~ANZ4*qwnMuPy;y?mrWq)+!xqQm=c#`t_ zA9aVeF@qs-4Sn73lVdAxGZQCw2RB{gG@&4zd&E=JzUzQ|zC8f7N=9uPxm|d9t@$@$2Zt>--FJ0G%bGRNzVsX-E zW#GR*&+ise4z7=%^uBP-vL3LK;(Hj}eLBWv?w6)V=iIyplx1v(hUzC~nRU2Sj2aJJ zF1dD&Pj9jpWm>07TEYwXrzHZu!YT?%Tk%+EDm)b(VPb0uLC7gCjQ;)rE{ygCUE7#f zUdIGYknK3ykX(YC|4j097Kk7Ik@sm9qM7~~gvlcVVQN}5iYmxNs5 zxZtPtzj#QdjQ4%`;lGXNcPn?ZT{k=D#ATztPEiH&01U4Y(8(v#5ndxDCB5$-(<p?@to(Du1PJ35B(XW+^5`U) zaL0JaVDT{>2Rh?hTF;D>eFs^Z0YGLHRg=@PnXOVR!?SpkWI{GSL zh*Cn9R6}-7rDS_rO>kYAD3Py4;xY{m;!87ORH! zine|kUOV?$))nyal$2tA)-KFRR{4_EocyP5+u64r$`fP);7^rN^ee?|{0J3zcMWhS z7Z03~G8Z^C>}8hOq{{s*v*`t`bc!$00Kod0B-hev|3?}Ai+@)j<=gzb7zW!0!QbEZBDGPjY z`b>l0=Da%L6J&FR1H`QlP%6Pb#{BY7exuTk7u%Fo>3s3|p@vvcw#ubfI>2IL?^oa004)igFxh~rwF4e+)^K-E~Ai50?r9o+z9k!zrP5W`=Et9n ziHwWx2^VKD-l#wH*+G#i9@RED^H#pC8QS*psaTC%xi??dQjexeJ6e=_P= zENyetqE#g$3Xj%#@-UrcC5gP;m({5gbDGkH>L3p$EcBi6emEWy-P04ANK6iSK0-ZN zxb)V=&H4kwTxoHF@6ct^&EA~1=l7mfg2 ziPpRb$luEtO0CsHSf1%*@Qms&Ul)m>ptZn$cwav-iUJ zc^X)$@Lag$Uu4bcc1XkAj=N!=h^lpArLS5d{U;KZsYpD9=O42Cz(ShLlybDa%#4673gbk*Q?j=QUHam9`bH5WcKHBBozY;Ch?TtJAsUsM4;dtguAtI6x^qZ!gJMtDES=bQRe4{MrQ zOz=oU_6(dZ$~3C8g960z&;oxrhSpjjZu#$5DGSNC0Bt$t6>d=7bgf_7c5%@RY_hcP zLjcvg06a8M<3y;iY6vb)H?zF#Fl)N-R^mE1-;E((b=GxCEG6PjZh|}We4_P=ePP$% zY$0&rbyC;ST>Gyva5Z7~F_slJT3@O>P&y6rnwjD8U{i!*k-4^4xpIW=L;uo+AifSf* z8XWzQVF68IFu{$)Zv5~X4<`-%MTRuI?&$&*-a^RKj>6LgFn+v-kxjjdNoMo=$FqJUmde1O%b6k zU38!5ZQogrNg&g@@4G>2qpE41B@a0{S*p&ow>dGeNHDc%z128K=^jBA3`$-wWMia3 zk0Tm68S_u&5GSf8h;xo<7j;!!cKtb`37yJmpI7#2A1=;Y3>x=v+%LwAyh^#$$1S%<2aeq){}sGl?K(krZ5ES zjoMkgy-meP?#C(DD}*QGxjw5GQ%K$|pJ9;6G1P)nLSd9Xhanlao#9iz%tJ%?#@bWq zT(*9r#i#ENF8A5vb53z`X1tSLx-xrU_4~-Jm!SdQ#5*r>;m`Y8fW#wbOj?Rv@v~4IZmhb76GU)ue zEDib*$3S-V{prZg+Fi}@)7!VrBb0K6&t>cXZNHIY{WuQ*}>-&kBJSx3}zil6bh_x!%IOQ(aH+{uHy5PP3<*4=wth5r}M`m zndhyLbYC}#=)>9x#)Qyf-QgSwX6|kRT@Vm2tNR*#n@NW=fA?}-x!BSZuQc%REnjZ5{GuL{$8rXjCo9dVJD!= z4OJ5UGg#V5A=wvA7o(lalbVo!KeY#r2XK&=#tD$bHF4bo;=Bm7xUJ}L7(_VXQGrQ$ zOmB|1L|%=bwb1NuI+2B1lM0HhI^}f1C&-+Ewji&d&W`j;^s|jG|K-b_;pyz@4$Wi} zbt~E=$D?Se^~oeSHIc@B^rB=bP1^z&;0q1{!p+DKsdh4Mb=|Pw{(__Mpc>Z1KKYZLRfEN@g5=w~(9@;maO!ua z9q*062Kvdt0f(lP9Fd=}`aCfjA3RfvIFvRy2MuD=^>{U?+`P^@zi$~Tv}wXn*TpZ1_*PVku)r?m)Ui%=It#;6B;HZ6|X;UN8Y!91T`Ang=BeAJ&?M+v39*_ z^?tQi?zXBwOK28IB`>POl)F91d`a5kh3Uz0uV!aY>D>TpoLABfcas~{?->Zs7NM*o z&h}bv6{MHfH_0Q~b_bmBVxY@TZxR?^e$AK$CRDpjt98G+DHocb(SmD>gsR)W^SqqS zeP18uaR6Dnyvkp_eR|o!;~E891SKjoh&hHR;HbwqaykUp$$=gNP@#XRJb-7Tp)D6x z|7hRGj)lwPo@2V}?lZ!>znzy|uNH&CI&vR$mO zoHr`WbvA5s{MujgWc%K~3!Jw%cD~2>&swPOtGj`aPoZnq$2Wrk zFU#b3lZlK1jEeY)StMgN>oSQhqpu4gKoD}%LNcP*wEmNFBv-D|%6w5M(kD3t9t zh1ycB#{7akbc{xyJB%4Weu$aLWe8eK-cQN0SU~8@G?^&af4oj}e9swN937>u%SgHB zx$}T8b$I_k($Yg9rzrW+2l2yrnZ*;=qn7ctU+I#wE3>>3iWfM(BCJyd0V^Ty+2swU)te_?QCk-cT^J9$Z5H&GIQKu}G`JzbvsKUkFC5l>nmqh{g|A4ePPKuZI$J08}DTg#NkanmVAh zV9vJ29{TdC(Gc;Nfk^aeD==~SH;!;G`OBlZv0ath#anPCD+ILwe3qsDyL_`Rn$(>226IZ@5KYi%5F+gC zH5690nOuyEt!zJOk>&Oy1&$PuK*dZ>Y~#Bzf0nkGOvAE=jZ<45h2pEATzf`q$WtxrTks+ky8x zLx+Pc&ih;KDt1|E!ww8}qnOT+QKNDnY2$uTgKah*dk;KR^c&Bv|CXUKMlIY7F}YoD zYAi`xUi>LbHde6fMok>xsGl72d3apjyL(^ zG#xL5o#l;qfkbCqn?T0GhL20NX<a!1 zEltsWTmRX~1+3QH?H%Ta9KSlv=i=K;`#rIIGjeyc6Z(qgu;n-;uV&`mm7RP6b+Q{c zEuIRyT8J4SD#xVZjebYl7v$ktQJcR9oWi0Z~*&#zIoM*6ycI zvKzlql8fz+;pW3UUbfwd)90$L{v1P9457;xlFfdD{N7q5FO(-b^3vTV26@0uIqN5K9#$1u_!f)sADUePkw*GL{!K@e$E_vPWi5COk9>(Sy@KZSX5G^7FC6Y zWwp6-ZgDC1=2My_g# zLZ~kYJJUtCd$YSMTWe1d>$|v~C3wk2Q4$68s58Jpr8*!Me(S1LA_@Q>RrgT#C5VL$ z`wvLR>2cAX2oeBl4#(n=kRXO=0i8_rTJ=On7UnR-eeQ-dxIN&LL&Y!lB4!KtH>QtX=$_mTgruw^1!x4!*2*EkAf1t6@HJWUYw%{V|Cs(yYn{$JdF+vSs^mLZvukn`)#S8I9h z&Aon4kH?NqW?P%n&Cik1RTyX2T1|=4Q4?OS#pC8Gs>IE*QuT^x!}d0$`%q&U(`nC6 z(}eF$M(7>l?(FXTsZVp@%95$+;dOlHtCDkE{u9HDQ04JTA57K+Q#w>Qr#J3%RysFj z3;cfZ37J_{zNE2aq5u3@WaND3G=F{phzn98sZ7nG@=be%UE$;K9f9!FiEOW{bB?N4?{8_-9$A z1K0Q8sp<@@ZE%QG03V|_@Pl`BWpN$RGz;u6CdY%|25QhO>REgn03Uc#5U!7>A*>O= zvi1j@GS%HubN$KO>zjSa!>_?vM?nq6$n6dq!S-&m_p z02bx|B(0^jhb#o;=hRA;j=oD3LcjqQsC>`Sh0)^0`uchGtAJ5;nUx`#BjUMvt=74* zoofrU|I(^e)0XtSms#PkeTDJbS>VRZUEB35#?W$T8F>ZMu0DJtWE^vzxwOBJPavZQ z^WS}jyW0Q}?>yeHC&_h{a!}K5F1?^quo4mKB~rUjvyf8QH_#nBHZGs(&z6S&h!x4p zdK@0jf(nX`WzhRXSo3U<(TfJOX1zD9?4TBEY9xZW!Y82=>7S=lJb{?AIRjU@&(*HU z1>XIOY4uK(W{LS}ApFkdM2IMs?Yw()1`TE8EN?p2rMVpuq_r%2YEg}38cj}I*aSz- zPXvy4koqRPe&F$r~!+jTV%7tz;3^pP5=ueYGl^8rho_#PH6=F`k z`0cGfi`4xbn+d!oc7OlPDwy*OTYDroRAVx3ke!}_!}NEx=+LTRop;S>mGJR#{pLY+ zNh0l6pm9su+&6eiG@Q}}qyKZ+|3 z4%Xd5D886_G`=`9?X5|x2${PRU;CD!f^h=ncLw!HZ+J?P{3;sm3kg6TAODVW!0n2x zl0~mX{vZdw;$f+oSgarheujqkX#p(`)CLg%J0Mc>1*&OnNodSr1dLc14H!SM8wDj{ z1mFPbHMr2`2La=i3k{c-%6TU)%e`2yoRI%=Ah~ZAJUEpV6edWXmg@Sq96#F)+F>g< zM2K&ggY+Jtu3%)*d_*p;sZ6c1dP+;rzg<=PD4^nRk0a@>nz592z>Re;9l8ql{-9Nq*1fji;j=A3}2d(}7O9X{e zX9?ls;3X()THx9Av_ZDs&h=lJuDpei<0Gz>n~t5^RpQETo@NW%h813wy|kI!U2I>n z8>sgMR5krLw4wd;rxmY_*1XY8Yz0ak$>(D40xq9CczOIY|LE?PqU-J~@z%pTvwH1j zp)->G-lu)=!A=yKRCZ3gI@d{JSnVbW6StO?P4Z}x1&kcZ`034wsA`4D=FfALK< zg8i#_MCHehE}4K&ONY-|<~m-Cq?Y(9cazOCd?<6Z{M^kXPXsf|^<_v2Myd>V&>PnPEY+iuP2|Mm82Oq*1w)%hLA3x5uZoH%eT@T9H+@~)Ci8jS2Bzh8 z%1T!!f$~RKf+o6wP!@cvUU5mICqbwHA*_Ek|gU|DM4KJ>OTMY!Ebg#-&BwD{Cx`@b?dIZ zkPcbPdwbuibLSaWlp0`lhpf*ZYDvFZTOL1LX6hMD2ZBF5@@MvK4R6z?aigMxDwBaZ zv;1STWqDOZNxNgytX@&2T7zf5>KZOAPR1EtNT{9z^C=`@38kF1`@EdK|7VDy$W!N14LHz z>)=6>Q?+j=;zjw4ONL!yIgv&3QiEK|C>Otba3fR698l&r@5&TmfbuvF9(N!IC*unb zt6`ofQixPl9Y6zLP)yjfJ&vA9)O%A1^SH8}3s2?ur2}7sOAF`472J6Ajdc0nX=Mk# z=*G|^A_r&8iVehchIRF7s_O){RK$4-zNrhlKIS>DDDV=oF(=YlH)JgPoy$0D+5Wr? zX7z;=5qv0OHJp0DnVJ#MAyW%J{jy^VRZ0fuxs71=ruLF54$@$XG9xrN~ z?>&VKZv09-^X%`qY3PGtWjHl02-@S%fGVt1>****%)`G5-xn%WFeHGZ3`{{*1m9HbDr9qjg%PBqi0vV&e*~m}uk&MpxM_Z^J;Ab{DAL|B?3?Iu^HR(H z^E%|e)d(Z^k3;F39t-7jbo1v&$=havB5cgz!yjsd;`*=tP~BfSx@8p5t%Zi})6T6?Kj`6ji5z&iO63n?75|lZFCy zR?xJHdx^isj>(s|q2!q+&%Q`W?=w}LnCdzWxh=dDpu;IVg}4#Q#cTkrVl8D3Lh%i$ zPMxIW(KiNoZ+vNO61ynk>v$O0sej^)Q!`sa0$OoCe@p-Rp5@)vMA%x$w_KfaR@y-- z9PeiUi`XH>0pbA?B@!zroYodj!o4qDz*$vUa`}<)-}rt_>#fe^-L3z(qKKmqb>n~9!ZRc9I z8b)_&tSRG%s1ud^<)ham%#+(lY}+{(e%O9-5PXcS$RoLYTq#m3&O4mj6t(gpxwscL z;blu`LOKjKS@)WA`5#4R!54MgMB)D~OV`qkOM`Tm`Yb8k-KjK4hrp83Aq|3nfOK~w zp)}I9gmf;AisHNPcesCZ&zzZao#8HS16O_=englZ>NMAG)`ND6v1_L{ly*I$u{4!tp6g;P~&uQisq^A~X(rt3r3+ zqL>Nt@vShqN~ZV2pQEajxCyF4=@{&GIW?M|1TkX1L*%8l%76?+fAB_>v4_FrvZ=CKfXtEa?9n#G=El}opQ{L=LF*`JF8d38`|Yhmed1;gCjXswg)D%PUH2ZjPZ<5d+qux))bB zq!zetFy(4$)naP6gCLo}+KrOF`LeTEZUY91eKdhoHAXNMg#m}W?#|mMJKMXD?Un25vhEqzE{FpH7>&FI^D30Esj;B8uvP{6 z$PGjdA)-rrTGb)+7%Tv`0Q$)pHExEPhu3a{ z5r6;`U@Wl)&>bY@2LvGQJ(}SIUWmW$d>;%CZG0S>Zrk_vYP*;(t-Uc=FPro^>e(5| zYjyQAdF|4&q)jDJZKiI(ZtB=Vjl~N|FDcDKVe(gD%uCft1P^xUyBdQXrbn1^-U7CX zpKGh?Zi0gT3k)gXKcWiy$Rua5dKCP+X{)Ji@5Y>?1@?5)rb6d!24sK7&L(fMlW}&j zQzFxZm0;7644+sFydvlPLC{v99>IZbi40eb1eCv1Qtja!EvlNiR@lo3s~%3WrXg5M z69YR|gbDA$Uot?x3~J_1JXZew-4j~=H*0OPL)|@6CYs_sodE%a8HoH$0Mz3AKT#B& z6W?AoCu5ivS>lU9*hcdw>fd>r-9N98(87NKJrB1_{0}GwlzYbFhbdz-Qx;us^I`g) zT*In>BT{Y|=hyLitr?sv)1-K1rmqrBd$3x)F&~htC9f1T4O}$ZdV`(BSNb+X|5g0? zDDE;Ckih$wJ31|0uNhyqnGVJ#Ses$G?B-|R=VZYv^n%xR_U7aOHWO$lq9?2xxF0htGZUFCB47>K2ANlJa`jo>G+ZrKbgP?{zcNU15Mhu zir~ubDjRpCF~!GHOvxTYBsB8_OW^du#5U!i^sT!-^nvJ^5QAju%vv@8qdp-371Z5&Q2M3u^z|7e#;=mmfY< zTJ>O{?K&VMf^ryG7MT0^wKYUQ!`GRHDYW5M^dt6Kl^glT`-xxd*ljO3Cut}A?)5{S z`^w{)T)cN&`5yl_^31L06Ev1}Fg8~<=91;V-J-1TkXAx&6#omNe5P8RRs8SZ znCMht2lS=BA8llZdo^nu;pd=LDqE`*P2HR!wusNN{wV>r%uLd5AXa>`&#^h2j4~gb z)a>jIK51KXzIs73J2qOjji-Oyoa%X+gBZLihIW(A=XMSXaog}v*#JgfjyT%=?4xYiB7y3r8-yDzU5c6Ez>XH|dY zuqjSsEk(S4YD|9n9iM3-JZQYQeu?ysuT0h7aDT5X0UW5z4GzzC`|Im&KK+0fCYP%1 zOi{|ZZfY(a6FCcLs}w=yWh(sQ>>!_Jbc)E^S&MAChPVP4*k+%ujOvwvZ4SyEM3N4X zZb>f>yH|$4J~f=?1Nscs8Q2qv_p+Y66CVkm-Vi#Qi)9OA1qcN2u{sg8+qakiA0VvRvjAv>sQ`Kl^9^nj4lt8h_1B(v zt)t36KAuzDzueGVbrt)y|I6!4Q*g59te2?S<(V_xR{K6*4_(z_0Ntv^OQ}1$7Ykl+ zfs6gzn(PLcDmqQw`I`$+e*yN7*i$sEE%2FiJU!o|QZe`rSI#8ay+vX6Evl87C3Y;| zvg+^$5WyP}X{IxU8NDulLK6Gt4O|9(Kf9KyGwBg!-LwWa;v+iqd?TxBcEY=01rNhzBC0902m|~M6kE$;SD0-U29cW>{<>=iQIfd5>JGBJpAfL z^@QB^ZN5agPu2dJT63&va_+*sUT8ZfBv?~o8Y^8XZD`)$Z!l77At=c;q1$>>R2XL1 ztLC`>!Euut&)GL^HPHHgG?+hhliSjkkFicVNVLUXnKK^8uBEG35nQKlqcKXhxjwmQ zfl_nis%`uYJJjX7@SjkL<~?6w7}NAS-r%JTyy3~Dd|ylXNWyvlR3W)>|jB5 zlZ^|2aa>zB#j9O+#^}|g@9(ym?xHy(c1 z_qp%11=)YJBv3-f@bnLR+CrxY`%|=?2Uo)}=6u;~gxD)!vl@_$B7h1#(t9*O2@YL; zalZw-?7FS2-L~7dU{}zMki5(ZRM-y`KU90`#?EcBkp*}Z)V&hBm}kDS{A>JL8kroge~6KG~c+3|6id}Nj0Hfphj zPO^ZHF_g^vvE+ZYyJzs^^QXEPFmM%o;!48PTj#pVD=&934}PQb=rIrkJ<4=0xbM0D zGcY?D^}Wj_z0`~wH6ASgRGE5~y7NefX-I^i57Ss3UL0AO?x|``_Ce5Pv<+u;w|@b7bVlnIsg}ZbtUpy0#pnL6jQWJkj#F<=o2Gt8rk~$eCBKl?fVbup#~& z2wBn;VERUCeDDR!k6Jqx+4(`4L!n&z` za|zp@48Zbab7S^!>zet5XIDPen&T7X2tY&yUpa?T?m@yy1|7uL}JX) z;h>r7&E2fvRRDlP=nt^aLrSBXBE2Ttgt`8dy%P{rw;yh5$eut_i;3wmSa%x48GezNL_U6#M7Uhu?kw{GK#^`kT4FiTo{2 z`@V&;Lk{`9mlyXWRd6fPK!_AfMzI@7GH8Lt3p=JU&)C{yfLSy|xwsP6?%j3lEKEto zXTy@q^}G0xNjSVtF|{|xFD{gxCkIQN395b;G>M6w>hM6Lox)c|UhD|_l=%hUqQlrhQPODq!$b|YLiP2EktpUG zR`a_&bB5jRxB=O^=?&Dw+pNCk{67yTo6A#cRTll^YWUAcSp)G_Cz84{~bPch?`XR;BJ z&C0y2H8#@hn!_4ZX210DOYvBJ?cZqca=$zIEWU82R}gVQ!-J9_1Iysu?K1aK=7IEz zwbyNZ0c`G=X>0P|p%E|~PSTNPbv~Cl`tH0WLk05IaeUSGgM13Pd#Bkhr$#PAMf3OB zcO7MJ&psZH-s#`xSxEePW0u-Z9^xqZ&Uh+S5T{@08M~O^*;8HIufj6nGF1!Ugjkw6 za5R8ng}xC;2Zknl=L>Mk$rd%2<>DZ0pslKbNWoTQ7TW}!6NEUyhInno&gOH{dwL#G^rU9)y5GxG}r{hf!S!?mYTN>XW}fF1d3~ zKAg@57ORE9etF=SDBfY7Cb`4s*dklg>miLnd33H%49c7+Pth)mQemrF5pCg$RJSO$ zGe__9ciHN}aG17{lttiXAk$%jtZ4b{iNDMn)lVbJGQ8Mt_@kgj?YN^RMY80naat-= z-<<*!VDkC5s-s;Q=`AK1pNKAXNErl51GCuLSHS5n(w-~(7B9E`=)4wF$_`Gx46K9v zM=*8Er{3@9yfgTpSmVSYk8hao{kiUgi}-qmbzQI<%FhH+Z%Ubb+Dy7f-4BvQ3~pP2 zh5`qD^EPaOR=6^N({ti6PhJY{KlokqA)ND+Ha61)1%=6j}S7bCmS#rhUf|m+@5go3B zmsVT?0^@5fRtUVgzPlzh|OU4V{DhJpV-$zs?77=qx`p?ZA7 zLKFKGqn4bY&EB<#LDXgks>|=A2lBxR^|zbD!VlZAA+RtIxzx0)s6!|2{Nc)g$i%U@ zL|MFbS}Lt&-(*lg=gvE=#e|?`u5ioXm2$3KSc=JvrVdPq;V3MI#+C zOQsfk{+Qb=;1i46t}A@-N~^Oj+(-UpOo@Qoz}7D@B&JW{;_7`n-7Ev6@F11_*N4K3ErffbqnDmOB_x?6J`aj=GIcS@ z_PxLogpsDS@7`|MMpPW}y4|vmj{Ro{3PWRH>+syqdJOS!8mLQfWL@sQe~y6qpUC&J zTMwG0xBup|kC%Jfh$opvP^=iL-WOaWJno7-+1Vpma_JpWQ8lN$bXlUtRQ?|EGwv5M znq+z8}C)I1&dT?kmdk$}=SqF!4@2Jt}BO^XG`#n zy^I_X>f=LcyO{P5`#;xJ>2Y1mxBD-6#fSz1X>=ApIn6DG+dwf1u4Z*O8e1rG5gyX#l{AbfPP*K2k+Ct84~17|`wdEZ z(McOK^xevMH)T0RJvXjV!v>|_))J85oPwDcj;gfrM0M;*B#Zs@H7m7N7I2Ena-q!R z@++}A~oo8B|hQ!(8+ zea0Z8iR$$V#(v_^qu)9Ra?{#D$GeD#nz|7t3XNyFelmM*=%MnpO7nG#BI&Hj8-{v* zi=fum_z0K3q8B{1Uw9V_PPxV*_|v(W2o;MLwLnr${mn~LNIYB~Bz`%6+duRib<*~A zb2Ba@!Sg0R#5=9~y+26Dw!`6#%vKS*%+4grDu=gQ zZoB6TJMt8yO75z~MokGJ#8-locQ5wzoNsvg{8E4XarOlDNY;BAtaI6L9%2I|qg$XD zGzW?ZIux^=MuL%zkv<@6oP(9le)r>HO&VFAe2&`L+?KxE=q!2DZ14Wchkd-K+o-SR zRmSd$RJ@T1lL0fAO~$ARXW7E?tSDu_$*VqhV@nO0ta;8zBQ>SW`Ql#ja#>ai8dIGd zrJY;rtFhBlBTLGPaKIMIZQm+l5RrYNRcEWdmTp!vobRsXQUu+Dsjj~bif7y_o@4OE zwc8j^W01Fh{dtYMEgaHdH!0@Y`OxEmHp1$3I~|*MF8OGZT3LM-ly7r%o5XFhk=Kze zT79Knh5HUz&ecI7U1lnR=11yJ8O+^`bx32nWsT%bxANV&6xW#>-+DAX`ZAb5BJbH{#TBV6OGH^dlV%Rd zJGkKYeLY;e{}?s+SN*4*!1?;N*cp{HqLDv+MoYG7BNryi`PR(nrr@H{i~kZzxiXcUc59 zeFv?!{F3}AT0H&J%(5i1$!YKf8^L>!D^K1Kn?CLj<>BNs<2ZKlzU6DDavwNDKyPMaS=I`rCJ-7R77oA1U zOZ9ZA^^tA9B ze<5zEmq6dMSq!%RmQGNzap3X8AiiqF%HpkfRY3&HH|ya(Y{oM*Il&9)wlE4&ToDEF=XQ3 zo~~KQRo`Q>=FQn!-TK1}VPA`Daqe)Ln`Z{l!%`uymVzNvF69E7{&$` zRCIOai0m&XDww~wdqM5CJP0*(bmW|%g^0ViX`ZQ9jR*gI^_Xyf-|_E9@MiCQYtViD z^&wn7Aq+rxpw~{=?O{MMHURzYGHBYHRDEKLQtufM$-*^6g0x3BB3Y>xYUtpvJzSX^v;DYv{TLLt*E zYUZzSms6YM&uk%dFvFZJ_l#S`02TfN1H|ApTH0-?^H@8~fx0 zOd=XzFY>JC+*>Zn^^ZNfB9?{so6zHLxAvJlg68M4a|xXn_1Gz|8f-d`!~%C+V-sRF zPU)CCMr2_Sy7Dn`1HBXp-No8pqF1q~9-p;`ptDAm_2TpoJVbktmEokxy%Onr446^B zi4`vyaRz_|W(2m|pUTvga8Ltq`>+*l0pKmrPlW+!ynazax#;f^Z2S2Ucm_siVNrs# zo(DATup6r9`{DpET{nX~=Ija+kf;B*LxgM4vs-BdK=SS;1~3F5d{65!W57U+1QgP~ z3{~5`Tc&y}=8_o}HRG9vnxWb?EeCGQ=enBi=Ld^gO$$9irwe1er|-i)`^!;=p2U$`U+ilxiVO#a8o&vA4>)D*E# znSlXexDSyXuT%g^Tk18_mdhURdQvps34|za+ zN4b9XJwYGrRKS%A89)>C+FJQ3NERoRS=?w?l-rV$$pu(*GVc|TrK%}l@R@gN`v>ul{I*!Ph)qgO_bXWxjdaR_u@Vm#*lpO^o=qCV{l$( zF0P=~uAW*@`q5rG_g@PH)*mYv@o3`OQ<>~a-|ccEncS!7oV1bEYOj=XO+F{1xNIYV zXOVI^9uf!uYGUE;>WqN}^kh&AHiKBOzyNe37C@ALk;eI!!KxNH2%=g)K9Y1ks7~&zSq=8mN2F>KsFx?L)$ROlAtT^)BSkdi?nX(o^t^ zr#)Y@&Dl!hkTcduL9$aZvG<#2$B$X@*5$e{x|}oR`eaf&v6qeZ`t}|;a2BSyemL2* zv-%Ug{TYBxGY>X^_$87`Qy3~c|dbJQS%ct4Z50v`?*Wdcfy+>yY zeia-}wmhFBdvWAnGxdTbqvnmEVoSo%mmqio$;Wj}f+UNTo?zMzvlpIgqo`xeo5!TH zzH0YYO&c~0XTf#+dnllIU`@bZS4{w!VTqv*+v!j8_}%G=A+`Bm-G;{fU3*|s-Jt)6 zr5{pD`zBJJ*is*y*WRco4TqdN@VZAtuSt*!t7ibEO?-t_***N?udHjIC0V`@ojUeZ z=WUXmEVPo-4pSUu&4^P}z|Vqx*PtN7)z0L>#XLJ%C92-5rLg1%yZmLUjQa3pVV3%? z$^xH&q`1Yg);Po2!k~1c{Re7($*&_j$>*&C()7czudixWdx&2R9mcV3c4ri|5Ryjbav>Lq?VA<0@v?5As&N z(W(~b4Kq5v^fV3{;sJc2JT%av>>g@EiJ$q5Vj`AIldq<<=z}bHJyDB{ej5cLeV4*P zW_dmOgWX;g#IN{HOZvOKMs?=Bqw@_?h#;4o%L2b*e+fr_(X+U_(DSGDQ-ThD(rSIG z2K_vGRjO*kKh%zY^>d?IqWefBz#YRPzoBaSZ14hs^5^$VPVx!*+xrLl4Ex*iTC0o2 zO(R6GK?w>WVa4hE9Q4gaOTzdvl8{r+Xw(K{vO+^`bMx0~euN!9?V_kBx*2)s?5h<*;owF43iPDpj>Ktc@9D zsPt_|agu^TAyaRmC$|y#ykMb5&F6qxk^-9!5ESUW?mhF}w-0Gjc3eZNON9RLOd zwz6aZa{3s8ew&1TOrGt%HA(lD#MfAK)fW?;8!BIq|5}ntFULPTY(Gx_S88Z-oc-eP zVW{`bb3eKcY5y*_P~_U=dD%bT!cj_|Q~dK;%C%(cik@rJT8!W%&69m6M{2Jf^Izxn zRXx07sjhdPKf~XT?tN!T`&mS#W-u1#+#wTg#Ij)3v#%Btm~!8fJ_6csY-$zIDtswq zjs81CFgmT8P=yBPKD-!k5MLJF2x}806&D&tya_T#-4wj=X$js*)%^3@SZ`gqX`OME zXFRoJe=F6Qr?H|{-N0k}!QDNe2kUU(hv8x1QR%^Szi*2p$bAr_9z3;n+%2d`kPsGw z9$x`l0$BT3YRJ`Y*t!Rg>tp`%q3{~<#>3sS-@&Najr(xAAXUG#JRj&omCv~FY4qC$ zF$L4J68je6-YWgMblf&8Mh<(E;ivXSj>X_)IaiA6r1<4(|5q~fcwq(H#xqWUUeQ?L zL7=lyW{qzx#McBfNc@{`4O2-`w*Fo%=CR|sKL5D^mmsPivMIvkjMYD>C7!n6c3pd? zxzJK?IMIAqz!2izp@SDscGPHX&Npg9ce8aT-LW9;dOLPrM}-;>@Nk;dIa`;-jT;z> z&ZUfeXlS|f|9kOZa58>C)z{>n(7E3KeNywoDU}~&9QT760f3H=#q?!UOmV!$bD&{_ zzWcv;Mxmn(BPWCO!=Z>z0O(k*V{)Luo0neaC|KaB&d6Y##O19tHG!bDkaXU!KZ%$^ zMCY}^u+(Q2R6xH<(2n562HELzNs8ryFFPSJQYY^hpco)1no;2a6m}$q-am$RcSQd% z+Q*V<0uI(g%DT;NJ>9OQfL z2w9!)`c>01-%v)!qgz*Sjkp&Vwcme#?t_Nsn(Bqkr+RDoL<^Kcs$l&35-`jdQ5-*Ps(f(T5W@q)Vw%%KTqenTJnWTbON zDzEjpgWz(>v}0BkG#1>DVyhlgkm*>(mh31xxe(c z>_FXDbntk~aGBJNxu1R2ci&V+Qdu9;VL-2E0BtHNuPv#--Nt}ZsL;LK34SV&s!rB#5uVrm+< z8>Sep;qi5``Q#sNR3IXCHo_{wWzi6=h5NRh&fpq7JW{NThq`x-EpCiij7uJr2XMQ0 zQ4>aNdjJ4>Z}#In{59A`vmet+6P*AEt!G-blEXfS=mAdwR;&aNj6eW*CLlmCEiAA_ zL*iOV2!|m6Fj~4TtgP%D#H7N4h6&n43MbbXI0<|hbUHEHunf5m4qV<0{rNip%l&wy za}R}xy_H&&lwO@aY(!!Eg(mj(eR*8{9Vo!{mZof z=@_MzJT$xWlWuW_!}L0hCVj^Ta_auP|DJj%e^+W4wy!Z>GvZOkjxZ!=;arRyp(NKo z=LoEO%*j8adPNAJ?IKoy7LULTzc2!jXTpVmsRa={tj3gq#4X7ck-w*|?|V@1%x;4t zLLyMV@|VxWnkRVu63=R0&CW8n!^13DPJ-yr3g9p^#el%FARGZBq79zQEdZCA96eSirIH}fS+4*{c61q%cn*`d z5rGMacg6PG*&vkguHCE*PZ|3vH-~S}2PEIHoY)~xhwL}-^4%OO8cQn|Tx6VxWGN@= zncQmBe7M`g+lr){YE26a=>+!3rlTQMBiLV%T&@nmtC%N%KOfqs90_zQg#DmWN*^3a8P{wKIg zx5LHTl?e){`(6M)R1nY94C)Ag^~OVQM(-9HW%fP~EyH+lfYkdIOToj4&oV6o#7rf3 z65*Wp6u_^F1dvg|+TZ+t*Bk%l4jSy=9k?Nb&sL4w>hg1VV0K_;?ltuiZpwtR1+p0p=_bvtP-C}D}wv4%R1HsjswE@&;2X81_6 zDLFg4cTDcm@cC{ppxoW4)4sCOPUFz!B(^E(K|Tq6*;^XkSvoHB3LC7S3x2VqSM%2= zxTi)kUI*Ee!B^KKUXK@kIC&hmu^!QuJ0hKqLGUKV9K~XL{Va5T;dT@kzk}TVH3w;| z{Es-iljx4BZ&~Josc>EKaQYSscv^+-6T~R-levYqth0;Kt_Q~Z`2)1wXpWwtw6a@I zYHZ*ByS6PlNCk7^U6io=VCV$gZ1 zN@puv-d9hR6^5cz`kE-75jFO-z0?jfj(KqvcerZ94+Q4t;-r|ZGjc3E3o*?Z~fP&(&YKwELA|KQ0FO`+a?I3=Mtw zbN9;>)tl^Gb8Ogq|N3aU4RsZSwnF8+6S{-FHeP&HV=amP@p}qz)8za#G^cTIofDIU z*xxUOJv%T-w-1QF=;L_w94{)OC8$;T0eVgnq$bsal5_b%ae*bA2G;dtQ{+Ea=YFO* z1}O4O;8x3l<1R8x;Ig3h`dHRXGbIk)_joV}via&}N#~r!=esm_!Et($#4q9GRIi)Q z@##RM=C0Oz4n_%$7noK9>t>89mnS90!P^_QeVw7mP$XJ90~!Ee!mXcQSimMh@YD{1 z#`Vh^6IRDr=lS1vCxd64Wal;z<@tJiLCA}>@D0GLF9+~A z@Hm=la0g2=wwb)m>-DtrySy8-XP@WzY_NAMGRzvVsXZ8kGtHa(rZhsq@p6P)tZ+s^ z!YMN~J~5ox4Ju|v4gg?+XLq<(q&TU9KVs9s(MCrsKk4`t*)ayQu-MWt!u3{J7J}cH z?$AmriR<4uXD_!nME#n2vU5b_U(&EZY7fG9o80%@KB|}Jv8TS~_ z`dix~gZ1a@MnBbUnfJN>*Vp^|{^ViKb$uOq?)T#0Z2L3gJ3Gw}CjJt*8Ohh>~b;S9f07>IbON&ckm(%?Dw$>8*_gS$bm**}JQU!fp+&fz@immOr=ZR#j* z<^bycA!~MkDI4dDma4CC4_WX=a-;YhbZ^qm3EX#z8b5El6Rcas_Tbzd*3zcH96T45 zHi9CG;PUeP#Zr-aapu*xzRsF2_sS(GoJg5OwJF=4v>65KQ-k6-kK8_}2q|>t$({x; zt>RL=6J}a?Dxxw_RH7%3&l(q5h{K#}xJ6l6!BnihC+T&!Eu5vQiREj?+r?a18RHk# zvgW2=MRE0QN~vO}V+_-7Y}hJ(U0l`FK9yXHnR6U?#U(iUo=j0zf1+DRZuOs@>FUkn z`Nqek;?HM}sK579_ajc5wZUH!K|mx%|2B~2j=(_My896rB*3ddP}X3SIRYQlzdsr8 z;Rcte!azJ1=(lzufMO6yjl{?U{SM47^#j}_fWJP+6g3$TJt&H0!vn?!2}Nl64SxOl z_fO4NB2kd-f5Tm!;DTOfe?1*;^?Mc62{T*mY{a{JHO$E&~x z(2JZuZtKXGBE30!yE>J zJc-tl5h6FGCP5e6K|HdEcTT9E;%fa&!s%<>(py^YXSUC6+q}nr??2dNu0?`~__Krq za_mh$x%V>$t+gq#+7_)tm~6U|+B`A%nH)yHAp;&XPjvc1{6_k63=V^c|LZ$R9`*5Z z4Gy}oot2!&9X{ncY``wO?5D0rO0g-Yqyqp`8iduRB!b9LR$WTjCNPj7P*#I(OMnss zY$cq@_3iVjTUY3lv-P;LPVqQ-KCA3E{5xHpSQ|u%g#l=yr;W|0uSiiB^kGcM;;N4$ zR=!TD^R$7W>cf9Abc!GzCbPHjb~j8SGRv9@8*#= z^eicIRKw@n^uleGGn0|U8+WR7Wvu~jEV=M4)Xn?1FntN10jXLFZA#DA--!7kjqsbp zH%|&eI}v-O<9p0^f3$I$qh6_RnRumJ9viE|@Nl>1Db%uSNbophi>3kwuMpNh2S1)kcLOw}sBF(OA&10#VOrFwaG#aeo8LP1!LEng>Md1u39Q6XcBE%J? z8e4!NyRmj?3^djVRJ)^fwb(Lva(i28!`D>-aD6Z6l+x)o&Dh=ZY_#BbLrFblx7Lp& zZKI1@@k!)}PoXI&)UjhGK%~C7nifxE?LyUDS2_Q4%d0C_3(^SuaevxluO_KZ0KI^2 z1JEHEw1b@r5P@3>U@U{M>0=nEfnuo{EO{8zx(UQUhY&+|R1LfY)3MY5I4Bz1mbyPo z@F`SlyQ&K9HPHibT(*9}t@;5a>8ITI$hhsfosi$NOAkMSn5&pigqJ61({pTFJFf>_ zyyI*`osA}g4L9O{js6}uNnYgNxbr^Wtebb=?xOej+;(D4M!24tc$%53Q*i8kh2XuaY21$zwNQ3fppR$@tdZ%SkP8hZ?(^x!0SF)f4DBfnLp$Wa zB>ups4H0m1KlPkp94QZ6sW*fCKgI0=1Dw!y2rh3~lq#ydJ<-tbP>cGyCO*=KH zFlDA55lxC~g&6uK2hf1$csGpYe%X-Wr24}EC^3Du66--fvu@Poe!<6f=|_e$Umqw?Tga``5X(Qm8vlLm3h6oNLZN~~rEA;V&OP_M5yo6NUvY|_FcW0w zuqq#A6XC&2$#vh`Sb>3gmZ0!55CN-y9CiW%%K`Cx=437SKYOWbpMN39glkEjb%Upo zRD@X>!P%4^ADbMsx01&FfK0aBvp0UX10uM0ZZ>`NLA0$V%JI&QRyFKkflGNDmvv=@ z&reOuB7P;(;OXB7Z?*}WZmuePcSdb9KC#^+y{=X# zn2R2Ct403KciB#YTDp<{w^FTlX3NMR=8A4_0Jaxz*EI45*{!=se%c=g#i}3%DA*mW zpoKCfJF$Z@i1!3JI7~F=i_F~SBR}5dob2cEH&=ez8SjE8Ye*VxgVhw66z1V2(rV;6 zyRo_yvEyZ^h=A8lJSMEP_r6ADJU+LbsRZSyAZg1`&(Nj6`>sp%ex${AZLQysmH*eKZ3(sYB2FgWz_;L-k(2z zrtAq>JnZdc@x?5@8&e8<=eXZneD*O|ofUK+$I8-m3=OKHx@8OA@9hrd|GtE6`Q*<7 z-}?)(y5&;73gj+@>8P9D!jBJ9d_}s;hqtHgiMhT-2Kx2ur1l%~`1nZ^=ck0ol1%tZ z)MipQF2x!FaM!x@?d{|yr3X0tXu!v;gyz$DhUBxKh#w)B++S=av`BFrg?9NMlw~*$ zt?|@HBU$fAWsxLs(s8Tk2tr1804Op+Z-545SDup?EIh`&+&mg9Z(s&MZD+uXj!&ChMoW#0X|HsE0~%EOs- zVTXF`V03Y+RRv1R@L`=HR+KWVqWdSM5Qe{1wmKLAp$3@9p)|ea%NUpMJ?7$ufdqoo zSX@8}Gc0xpVYK+RB5j8dAba~-T)C{7!5x89n9Ud)QuaLftIt`~Bbp{520;?<=CBGn|(+1gGdWqIswS%XF{-)73xd$eAY*f)Uq@NlkX^xcDlSInGR zRSup9>oGO=<15D2sKT){FczoutzX^E;Ftwr6MQ`R{O|YUT#W1HPI2&gG|%ef+6!q> zr4oIy*L^TmdJO)mgi=1$SL7erZTZGoiNfU!F2G`wJUCvE#pibfM z*!gAO)Cn81>Yn>1$uu-e?W@Ia)*pD-+$J}i_YJ(L@}jWwp;(Q&qm>u8zdAcVoyH{T z`2Jjf!<8Za?e_KI!+w)(sfV@*4?esep6RFEZyy6my(?N-G5*mEqueDT3lscgp!|OM zkqBy`**u9K@sQ}5EKcfsAkZ`Jy!K%4CrrIz1eRgvO=TjolfNSHGn%k-3eRUZ{q+TZ z!AU6xY0)P?L(`b&xxZLk9C zH$4MZOjfu3E_t~C%uH^S+b`vI$*NA1m-e!Rs~fMKvnl6F#r4|CqNO5&_cui~fl1Y786- z>-c&ZOa!`kk?;}F%+5&&T;K>Ht*l5fA_*LXT1^cf5cJ5r&9iRlpFMb9Y(Q;B|Ets2 zsPBt^#2#B+_f%1l$nI;4(--+qj*t6Vsypsa^8AbK!U80nU7eOr_K`-hSSI$S5thkA zO2*Q8yPr`U_!7osuk`I`q1hxc6t1SzHT2UPHRnkcKLWcJAP2EPmkoQLe}2!_YMRX1G6ni!lTP(Dn!n4A2&u0s!@* z#-N6KU?ls?7Do5eoj<)F3F>P_{W|v96U=&45PxC!T^bRKpbnLU()E>7{;edE$o=LD1{ zh6Q7d{>lQ`?i7X#po@|YLaje1OeO^;fa$9)&|i%S>D<}^)q&=Fk@szz;`dQ&uE}j= zs*{SaqiE=#XK)hssEh&y3S*ziDLw`yUWk*2%iMJ@fH&N z71ppF7$?tp)PffaOJ}MF8(KX=exEE@oBqrp;g?D#rtP~AT+Qkj4o^0! zz|eu5=N)e0C}!s&#dlX2FCpvjrX)31ZT9H2t!UPF(P?t&bNPJMntr$z?WQPHiTj|% zty>J{z_iWv{ocaqRihAcMU^XqGLjqPk=vsA349DfENXTY!}*Jw&BzZ0sSVZi#xg`- zzp$`PzxTHuG^6z|D|V%hMiIp}HxUbnQRZ&;&* zf&m3^;4Oe8FK~sSnYNU{gs~(sU?$}xvJX<=_Jd1v%J<6E8!m$n;vRC`(Aas5P+4Rz z-LF%h@(h`-u`(<9e3atlQhySAzILkSw=6iiO?&z0OS@B*PfA8L+ri1Sm(wIcX6@ao z*uvi;S$fMkVLYtjf3{w(s}{4x@3a1fVC^-37hnSXCeBvuQC?9$xH)p3JPQ+fg}xL` zr}EzWyaE#7=HQUKFaQBVARx~%0eXapKq9jtVJs++P`VgjLd;aZy!T?ukV zbJbc?r*xI?=wzvOy|J%U0c`IaMdD(b<}hBl0ADdC4ca(f~OO*%FK5v{HrTu3O+MAH)*6!CLC$b9)H$Lf9dRm64= zTUxeT8qpBS_q{ECBtJPbN1yR}IQIVH{pI$S6VbK|QuP;&p|N(;88shm8hcv7#V@g& zzZKpeK5KNT>GksZ*tirp)Ydk9b96&`URl0y)qUOaZ}9Kz)zVd4`Bi<(b?8S$=ecU_ zN1JT=$_<+ha7ZX2KOi5GMiEUHqN^+bkagKca;GEW!mSd+_CZWRwC~15p$7Y{t;;yG zWSniQid|HB?Sm%a{q;xiF!P^V(rueDJw(t)WB`}>%xQ~;W37GdqLh717mN=3!GN4y zi5&j22l2%4RRpFFwamyrp0!(Hq=_(2|YEu0;L z_>F4*dp%oUI+`CtB1)+Y8Xb7bX=$3tpcIpN{O z#pg^QF~U?-*V)n>op6z{`{&mN&)twI>frd3|I8&8w}`qK0Z?PVdfkJE-zvL}MDti8 ztnn5d4Fxsc1jdOlSbPKT@0x<05&dIlj|I(FnikVTo3CHC1y-^j{%ATR4~gZlVEu+h zlBZNPV*w#yYEOptB2+a(l~t9rV`PrrP(-VRZhrWB>$+#>hl+>+jLR}qbD#6O9ti%c z#4u4B^~DQS;~qgs2vO6tE9Nwf&^7cf)Xp<}T^J5_kdK(Ab4s>Y$qQ&OEY#hxkO6YO_!cl)4{EqtI@+RWjh zsPW4mE+UlnE;DV4JL+;+S2P$7MWF!_fRh+a)lfl>Cva2XeeGou$a!SQr-&^fLiJLT zyIH$R6ilFsAJkwuCLo&tL|@TP4Eqc~sqt?&ij}*rl*lK0c&EwHAMn*OX_;6UaWK?zPA-_i%DJ3kzf}p#~t(?=u?Rpw>`oabc8(mT|{+s8w>KwkDILdch z|LCR-mw218-zGI}P&?Fj#^l+#> z*e%-I4;;P*H(Oc?or(D+WG&q{?@8`giw*R7xnmKp3HovmuWY4mz^Uvssj#epP=p}5;;u(o&1&^eFE zDLrKh;;m}x@-&Yzf*YPcfnNM0Y49q=>=T3&`jM2Ae<+raIJ`Y+))YVx{j*LCDx_nA zivO$1;6^iPL}qv?v)&u%79GI${fY``CeblCP+ZAaIvkC7UTT z_#~r0iCJd^b$l%OH$cYp#Z}>;{T*h~Gs*P>_vAaXf;=Xi?fT(2AL6O+VMKgJY<**L zUp~S4&KJ_q(pA7eZ-6w>^0&28cSRf0k{8;97~x z7K3_G+uV9%`nW#a`M}Nrhp}ms&!@w)l9oqP6QWeCz@!4bxzUKAPuaB5K_VW?v<-Q; z_J;43=^`^jnKPXAyF&aB{AOH>F140|wnz`Dg!%6(E>_3E!R};pBtRV@>Espsgfdg} zar~CQ9l9M2fxli)T`5eAuojGIVD{u!M^RaN#*n;rHsaE`X}_EjKQXzvSiSnKRsXo{ z<;=UE`xsQX4Us8Uo=h)jo@&jWoTms9$0<3t4+D7KJXPCI^3^-u`B%E{tlgACKog#8 zdDNPrkzX{eAWIew&2i!z=pAsb=YByDUX+-kk3G=m=bsYP3*+YbqAW;QbYOc}wzRI6 zT%-f~WAHT3h|Jd0U^gJ|??@?X*ONlN!%(L;s6qN0=0l8mpDrj&xKrBB7@&Hw0K&j+G z5E4MHe^-sAqm}?Y+^#;h!31gM2oEB1?T`S@O}jLCHJd-oo!W*VV-JYB{BEFP~lwkrJgQ=K&e_% z%;`+@)cVo&x#g|jN!#1osV6hNx0hG*Z8u_{sx&J9#7sKj4)$uxB>J5O<38xVSL|}h z_#It;?B^jKMTt_gSaQ*%WcZ)b;xF4?_C#P zkxC>}NvZyPRPh@k5h0PlkHI7vrk}})^O)ikJ^(aariFC5XeQw48HgH2JBviaAd&`Y zOWb~W8=*elvY zMGxHiqicn16Kju&R3V-}Ls>L#WYIC8GXP)9uAVE!MfU|;N7IE(JFn!+q2+*yqKS9W^~)& zcJEgXd%S%5Q(SU-)g)tk)K~hT3)Qc(>Eu!fSX;UL;T$bd)!ceX!KAOiL+#cL~Y^>}n{wcyyMcQY-R3@Cs+PpN(%da^I)3v=xMDkHEC?j@q+s*VFS2NSM z=aKAkcQvRl*Gk-{dxOaZ?x+QnA&5Zek3GtrD-pD+Yh4kxg6{hwM*c=#pAN}0pR1^H z(wvp$9W2$oY&dVdbG5CZFk0!%-{i@l`jc6<7;S8iH2fLCpCg#Zz=kpjqK4N_=4<{MLi`m>mu`;5THK(k0neTfqkAP*Zx0fx-)K2hjq}gVZGyax4Qs$0awr5gZunDyx zidpRbJcN*DSJxKS5GPFkNV@dl&o?uj#&1!(`-e;38;44pnWviarI=6LuHhhfcGw?6 z(jP>`9O6NTGz#d|p;z*(OqGr>b4U$ng`gQu0ysfD%p=~y3$aiMLinAPAd*?o8ASt0 zxgil!#hb@T@C!i2G(nF^L*?M7EZO~>18c11X&-m*KL#_89oa8q;3*>IiHF%Yhw(=# zKt6-xe4+OSnWV9kYvEWJpJTMJ>DRKz-Ad&d0z8-6KA`q|`!=`!_VQ~n%JSY#aru(j*r)F?B#{3|T!-2#*or^*vHt)QcX=wwk0ObJ3L z#R={W?O1)ZXL=Mx3rTM6a>vu02BB|4~d_?%l6z0Y&gbzu+g`~M3` zn4w^asV?GG6o5uX-2F3PA6qB(pI_yiSM`FlUG98QDEno6(ll!}MA$^IF^uL3L5Hc< zH32%?jm}T&2U|$(XG_OKV^R2Ne?3)23?`A^gT7QSZQMQSZ{C~4d=^s}oP&S>(J}rJ zZ*)FVhww70kfI3z@g>4^3Q9u!tUZ)NQpObtf{#BfM=KF+789@$GhVDlW*)(j$9L`F zSTv>l;)<5Y%#r&^=F7J{U;b5{?#*Fxt)qD?FR&l(2ltHbn{M>>SP$IIeYb$~!UrFvy+d&6%Pm&LRo%p6; zs@mksg)n87lQ@^k3V8q&ot~iAX)VpH}K+LvS;&@%uvS)dX;!nZoLASirw`0;D z(KEljI%^qVj0D=`FG}Us!>@OHfL34m7h%*CE7ohSudBg5aNK|4pA%X#P|5tREVZc| zrV|}M2f+|u-MO4~(YE*bZRXXft>&j>6}pC&us@6}YW;aE2gs3b6x-uNuPd>$oBvK5 zAEn|@;{~2q^8s^9=07cZEs~sV&XaccA0Y~V|MT3i7ohI4GmVBND)GkKvTTo-lv(Dl zmj;He4#C`)eKg=>-chAzJkhEVHl~-t8!Bd!%5@+-Zy9=c-v^%(u7&of@sMRFQQ~IM zgT677Z_cim8)+QihZa<2(5vzfemYfse1ds${yCQ=h)I57>f*>3`q6QQi+OUT=C&NvMf92xni%I~^>lqh zvfzY9F3<|~Pg5fVlsUJL4N%=akJu^rt@%ZrUeUN;EPg5MOVLRgzu3kEm-M)&-HP~x z{rm_;*Lc6SxReAWxFYb!2u1i^ISNzW38f#))mNP7OPB}7?%ND+PrJ@>`@e1DL;O2m z1Hd9T{`u_sf{u!W5{B0#0}W^^g4qqgoQh&5&YZ>jEsz}x!7IGO0jLZBf%5<+9as>8 z70|f@t*ri^urh}r93T+HtHDPo57@0>RW@=fSO_7ya$Z%pvaZQN?!i@$F7~c$)ArV- z6Kj=tEX6ia3Ob_vU$L7ZQs#SsHp}v7V-uTWDU%8sdApP;Q=`W8inpN7D!*hLTXM8*d=b$;jaG0QGra?4nG=y zDrO+Ke}|P?TeGfCXK#R`w02dKAECUkx}s$I>g{lNxUn#Xk02^6gnG1)l0|_U9`|}q zq^U`S?X73#5b>9dBCo`+^Eu(xrEiS==WL3d?zD~i-#fiYx}L*Nte0)FrfyEBTd;SI zuK)Y%Z}}61O_>?>j{VDcMs@aSS@x@rZO@8Lzoyw7jA?4tQN>XWphEtLx=#~Hr?d+D zpz_4{F3b>$#Cm=VwuT~dNCl*ciG9S~`IQf$anit9_-c!V*mg_xv+I2j&zv|~^4nU+ z6Y7IEY-I23lz@L-ACbu5=k?3isPshl#~tkNu|rMaCty#v--i1X$ZE{|0zd=fdMXO?`WfI^9q4V!AqaS__t@;=cOc@ z>SSFkY8s~`$-j|Q1)ot+wKlu3#ek+TC~e249kcvbLlN8-V#Xu;FS`dV>H>ZoOOqaJ zoxJ#KRF2C_HoN8ZGWNLOo;2;;tS?5zN6tIU#3uY;W6MO|5X4bK8qi2Xywiy{dCNV2*>_`9RM}emnCKnLfD*^2yxOWmC(JjH(xr zkE>4*d{IwfL(#fWkp(;vRZt3d@cqy@?a25Q?*m)z5a zmWDn?32P6M1R`G{i0D3l7bKl(abs{-QX0o}tn&-h3US$zc?akjs6DkkWca39Fw}gg z@{V5;GfsOX=;obQrK|jp;wQLpVXBUip@FuLE}a6_N#nuovrbxSs@DH7v-rw#^7K%w zsoQKOvUdOd?Xr_Lq#L!u`{xf_juW%>vL)38QUlBqAz{`CfQr$K078OhLk|X3xPe%Z z&kdJ?AVAXs-qBD1R50td1KD%JTg_p#G7kf+#EY{dTO*h~kBumm2I5M{MSLR6}= zhmd7ir^TI2OZJ$={BwL5y7R%BJIM^)cmG^=EL1ZeF`h29w#^( zKsasLfD^jeMZroQeTDvovT0UzYlS>T!n0&6UnJuQKV+K%ulm_t* z+O}Q4mwS(1J|6wO&*-hXPX%ll$*-N79kgsO{JB=V`OR=UcCI=QWfcMgroBh==pNE$ za=ZgYph-Bnr2mvqhRk8D@LMGxPdY-)#aS~xoSu-y3o01_c7O0T<%F}}}K8}%ie=(p*;M!iz~ z9{j89pDwmn*)bs2?UPT(ZJsN*d{R7kh*_Nb!`e2LZz(h|0_ZV3d?)!%l35rNPmySP zu$dbBYB?S8%T96n)9p$5d-t1^+kY8x>|$@7bnuk!XA7FM71Sxg|#j-C&b( z7CxU8R3INrsdtLwmmz?&V*EVNBlrX}rL{N>LWDqOdQee|)99DwoLQoGy_pY1O%GY= z_{XHo9-jsLbaBDG-5K`u8jBp$tbA48|BBPSVs4Z33iGM?GYg*YQV#5Y1qCDZDe3lz4o4TWWavQvdI^hu`yn%$gx$-{ zj?C_#$Kiug%VH-oRHl&R(_f{MsV!QVH~J2CPX>u*yRLMfqP<7#s5ZOL-{~66&bCg_ z3D@5DE7i@Z7}pbVxhQgYlCRWV


!@|@T*_8v7vSsY6KiAp^;ZXW8l$`9?(Lq>NZ z9CXIQh8f%1!668K7!#;32&{4;jt1O_H6O;4zYCLyW-(bxotWGCn?(QC!MJ&5khZVi+I=uO-kujFNh#0B0A9rqM$yND?C~EZ8GA#H z#@e~GoG;8IJ-;|k17$lm*5$nu0Yu>QOPNYN#Ir9-ji==`#p5Cwlx(cJ26W&=TZ5zwvMuI>g%~s@e_0JwdX$$|JoNebWt|A6%KX}9g`YU z(EpTMJeW&ZRrcxTYN7Ir+X~*o)0EpK!*>B zH90~^ODT5SI&RzbWMvCxeU|&_OZeOPlgfbK7%K z^~HI{e(6alz)g7f&tUq5>P=5Gi+lX4YXiv){=wA)rl#)Pa3w;o0)Pw}uZ0BaAgFIm zJNW;Q;mm`ikFsccl2xD+JPJVB2?0VV$P5n?2oDE#$_OgvDx!QS;DkUE0MJSrF~lhM zi~oFJ692Wo?e~jjMii$TTbsR-xY3?F8cS`l>vUR%Dn6w57>OG)LTN$62PB8! zgc%ZgfA5NHe6VPG890z^CHVI~{h51n=_o#nwhc8{(2JjT(<}w}U7Qsy&n?G@JubNa z!OQv6R{#Ex45LK#QuXfHe*|&K;p16li|LhvLu8yVPb3x0g4be^Jd)B_nfSpGg5mw3 zF{h*u!58z3jx1WmBUZ0L1Q!|!L-4w7szbQ=vN%j&4MXLJXl}3Mu=~O$*a4;iZW?vc z9(P^G-J*3Z=QB6YXu~}b*tFf^4ECCIJJ-+>rf~mrG^&W`g0a zVQaO*^7K05D(>X6jA zyuvD?lJf-t2NCC6ppw7Cy~P{aA2xnf4Jq~@l0;F<;N}? zDuHY9y79u(G!O(ovr8i)=w~bKZSFl6l71`evvB?`_UPQ@q@`_E);&b(0|W{u#zAQ>~jO>2D^7r*j&a_ZeDyLsMXy)5JYuTO7gtC+p0HfUD zo0-hgNvH%(1Hu{`@XUYrTiaF-mToVfO<%8P+}^&wTy48On|^$^^|tr0vb5!r>V4oX z`FZ)x%}HF-UfqJan-bXzS^Ut6BJPXAzvJ=QnqQ0=w_mc?C6vjJjii1Dy!w(O+NLI0 z>~&D$bP^k2{Y}mo=KaxjV$!3)Leq{;b&^Uh*7}o)kc~30lZ-0shX^!;{X^UkFO5~B zS-HEG@tY>IbS?VM7pL4F63Y!+={t-#T=Ug%%GVhY6pOTl@SvIW&fgX$JG-w!g{Xu) zPW>b}BEOkcuh>G?(2nnM!|qhQ&MN~$PB0sQNF%sX|aG@ zEO(;@J(Pz?fLh(l5wq#(MwlID#6kXCIMc%Mr7Xw0HxUSRZ((B&PS-fKZ?aPtmOtb+ zjcgeqi6tLZpVcZ2I3)}vb%lH&q@h^pUa@MZETB*j*;~Nj-u&)c%u!{0SABNg{~Gdx zT@J5gt}Qcc-glWNfCGRBU_uok2QL|!WL4+@QFwrC2&D-4V}go`fJGTg0NxOYGy))i zBANt(rysLY0H7LT`X7|6i78yGgkCeAL^@t@Iu4eRCt&WAG(4GD#;TP#;cZpQej9P zbSVw}E1F>zI$e-ft@=7wV1AB3s&*K4+CQ-V z#AsSLqLpb;@e3d!Lj!bBbsAk_;<#^#dAwQ>^+-5&&)z<%eURk8E)d#c7J`70(gBdl z;~1L4JOZ>DsD;y(Sm+%&X|S|ouUFQv9El^+M*fB5&W=`?>vag^=P}SC;b;F|4E!9VAVQzTeSvE(h zf3n!&LycMHZ*R*ME>!nTl_icxOxA#Yawsy{gy{vpx-f2`IrcOzQ(_R5>ao4_^$Np< z!?p1&-~M)|F^!MKte7-vm##atB2S9PM;o;`?Q7wDjsSi6FB7qKKGUKfH zsQXMC3YLD#na}r5TPcK?7x4$p34=+;VDdqN08-L*?sxSr?B&T0C3U*O*PZ7JQCc%r z-x??g4Pfj96?SM|SZeix-}2$okJ&TjB?fsvB9ax3nq%&(4~3@hh>Oq5-5-@MI{B%k zCoGwC8jX(rKKqZ&oQdy>f}-nU{O%lbZEt|KC$axmY59LL0UrZxuJmr@0`A@3?9Xky z{5Sno@$l`%zial}KVs$YZ@%8{UWZgmN8PjbX6&B+dj6ne#L`AO#*xnCgJ<69d_qj% zk6$R0yUjZmffZo2=^~rs&X|E%KV9*CoeUwiPq0WI?PG+BxT)~aaQWX2GHOUT>uGNW zUj>j~_38ZA1t#b8PliQ8tPEcgkvp>;W4?OJ;AP3=u73Y&9fqsl>^o6nI|b~R;MI}1 zq59yE#i?Ee*Wd>?B3-$6N$uqK_kEqr+r9wZKp~`sLCIo;?@cEwtWQs1E zHn)z2`9H#UKxpz4#@{3D=D&lJm0Y4(ExZ5|^I~h7UhkjoF4N@)DY(#)UjbQr%3uD9 z@f$ZmjKt`5^`(!Cs028gH0g6Z>x*(7e;hm!E$*exq!ElfE>q7ZFt{HpO4MQ&u@uYO z^xzY3by3EPNh8B){TG5)kz;nbWIO}~T1l3*3Hxv83L_P&1dBAk43)k}c2?@9)a96Z z^VLYMq|#1T-k?{>@gAyJ#%|!Lfx7tJN|uhhnjB0?rW`5}h9zm*>}+we1Di&Fsa9_bKf5z>^g5Ir z8wih8X6knttLQt1qg3|V?s}Qg0NI8023AKHXJyDtrU~O+3=1O#4NfJ zT;T(_Vx=%>cuC9Y0K4Bz^^vtE;QPcov8*k=F33I%H+8RUjPmFISOf`mUI zi(*2`GlgpR{0vj)C*82zxetz}9*ickJgB1FLQ)u`Dm4}iiVy1Rti?W!Uj6G-tK)xXRJOej;Tw1?9Y1Z`M&d+5(jJ1>GgHly zgJJnW{p6^t|Ms0_Y>Veirk>(+@{nh(Y%V%QFaInTU+*-t59D8&^HhTg7i(Y2h|!T$ z5I|3Z=WNd!3Lk$`&yqKzBZ*Op$;fO&O_JQ`vGUr%LS1hEyS+XCdfR(_ae=#?Z?z8V z)bJ54doou1DO!=X!8Zx6dgXVo`kht%Uc%K8%KnMs!cP^O@(mlNX9~3k$Q$4%)58~H zReygu^~7oCk&^|lQQj*pkr&g86j6UNsF3Pa291q^3-U|0PdExLwUQ4wOQ+Nxz_ty- zsg_0tc6Ypu)!#KHa5)Eftsx2M4WZi5U+-jE=89!&{A+#i0gtYh4G=h%c=DyC<^`vy zSlE)TsOPh;4R?;xisj@)PDM+J)zF`b0XVpnJ`UDSu>e>y|2JnF`_uB z=(6VC`I_JT3d_`f)0}3LRMl7MG(kKf$^5L>o6XYVN6KD((VD&|^0*I}u zUhTZ$h-SDqqlgFrdV^l4E)4SKn{mH#vX+=^GWQO^>z%4u>Tplt$FSg86S0!@_-3N> z-6mog3z>UrbiAs~6xGUI$m$p1Qzbsd)r|M=t^B?$U9;`aIS%YcGb)$)^HZ*e*Z9{D z;c^x-1PSFRRsno$D{UNakH)DEg&r%K9E_#fBN*%acX9Ce>h}5L`v8&vO?eP1qy!8S z!4%OBSkgNWdpg^hfZ3V1G6jO!MS@5$fF**gDB}g*;57L5h-2VA(MO6U%TCLrM$zg4 z4e!u00cyBdS9tg9`^TKBIiYYB8%`6O7#c2H(ohB88tpJ%w9u(5^pgA955PdfsN#qJ|JRAQT2I4ujC!%ecj5A#EFzd@q20+i7W zt5jxMw#MHhlJR@cZo9qr-O-QlfOBDaq;**_>9zE*Ec>|FMNxrsI9SVf}8M-^Z34 zzcy1o6?aqB*HY_f7zB$qRRl%&=Vid)fF>CPq;KDt5USx9p4uoPUu{rlBU{rM+D*>8 zTQy#EX!4}~z!b;ksk-TxF}h^Dw6WAj^0(QU3@tZ!JlH)jF){FVPP37*d>_Y-v@*VQ z!g;glz-XC%AGT(0-|H;CGGd_xwz||g7c0hKd)|xGA*(=7kX0);kgqfWqXQ8*z&gm$ zp;X_)CDe3b4ZoNL_%+Z<>_HR2gV|30Y|x4;9&z&reFw(ro$*1;QJ6eie$H-EL^NPY zU2&J}9y;hTv$vFZRVp>0Q}#vYy*#}{w#~4?!|ddEZMP*0`{}vQ(~fIPSK?AG=Pd`@ z9(j_zmS1PQ%2H*u+B~d){!M|ZbVS;FITQY3iz3xi_79@>Wp_i`Q1)egwK&}48^)`z zxa+CgtI=~In~qAlQpU@9Fs9uIMsIdEdTDH(3S6H0qd2sjHI^XZ9d7lXuiF2!> zbFcao>5lgEH7X9bu$Z;o90Fa#Y;vj@S5j6yEf)YW zJH7vRbNl|L<-PInvZ!AMH#53`bX$v%VtvNrD?F8QSS%PS76pJq;@yIi2Kp1igmpf2 zQ4oeJ79r@V6x3khwt4Loz26&XSYv_o;m^_alUuTwe`PJrs(CHLp7{=VL^04xU+-;g{mBLa^zqL)C@@fpL&si9KyK;&A>Sv;9j?V0~ zASSX6&HCA7mV6V zqc{;;6Ymv6g)KC(dA0N6R~ucfm9J^|w7Q<45G!E7{$N<_NO23J&2!)G_gTvDZ#m|V zeEz5EuY*Xx<;y$&WgHl0#o4XWRDTc*HNq18pf}03-~D&IPUe>>@>jE|!qGX8yT*=? zK_)+eav^@Vu{!BKf0vttgmdN5+D>E`QT78V1iV=tf(8I|C=H}*8l`{|N@$+k(M7`yUC2Mj78aZS|0^~p%fc9DV0 zs_|ma+a(#Hm%$G?s&sMFX})5OsKv#2W-|AvGseG3=c&iv+URqmi0=Sg{$H2wJS7Gy zk@$@=l7jsS!ChKyAiYak<9R|CQzwWxjD(wqv>gH{aT3Oo^8j(YK_O7(5Mn8A#TG67 z3DUp7I(DV13V^|Uo$l~~(ll9@br}SshuMZ6PyN6XU+#$1loQReAfrL(td?4>1mRh) z0(v=HU&GRe{hkWKpAAJC%<4QEooh3G9am6Yj)k8c+i96p`CMpa_7fun#NRkYNp}CN zq3xna;U1OFbZ5N3^>03(xb3|?FQ0pPeO>-|`TYY;hm7jCnJnkolDR5Xk!;B=d`pe^ zeuAC(J2mvjCYs}S8SIVcahk`D53j6m1uUyY#munJxNQs#EymdJ{ZbWpVj39n?Jvy^>D#0Tq>~WJ62hm0nBslL9sGf|U5am%;T8P=Vs?SiL<_KDyUZ@)Tgp}#^>Tc< z#CUzsc*T3!1Ym_?Ntq0$1!022F@it&hxrL#@IZ4iI7c-UKCXl(8R-86oZ+NI@oIf&8m_&Cq5sbGq$> zRDJ=aKDV(4+l^Ct2zNuvPxmfL&gVXU3#HPVOC!OaR_W52I~T^x+gMqB zTDOxw<2jF+z4?3fH7|3Uv+lO_c}AHG2<7q1UGl!gFR^8vnHvlRa|oCZ2I-RpR)Qpk z3f;{$Tn^TMe%!5RUq$~0XKBQUUElEDHk`XNli@SmtiXU7;TW}gPcX7e>LI5!z{CW8 z{F6#PhPW7DSL(y&U=jKzVan}&!Ejh`5^t`FP1R5^07)URarEj++#hSF$-3XY zI-qV}!70c}&MT9^a`U(Kxo@9hN8)@+MS~gUi`Whsx!Q7Y`r|*6I!jkGiH&k>Ec=&> zZ?%}8DPTP9gH(ColpEaT%R54I#7nEQPuwJVNk)8+wSp)LOIDs6Q*fsa3^|)|q0=x^F>>iN(&f;8<-4qI}l~sks34Pg6c!Wj+;!qnT zk`)WEGbOwUYWkD=d^yC{?8QR<--nq=~&mh8e0)M`cEwU=9a%|G@cQ*D4@nD85 z4Oz~A*!2n``%E>XjuLiqN-sCnQ#rcqxgo)fDF05BwJYPpBP%NdX=$N{q8TQ_upBy- zYzRV-jv*LGhBL5PILQxl32nU&>-et;CHDJ;O<3j>7cuLr(TtW4#5M+nT$!GCW?hYK zD=HWEoG&ds#j@&aVGVy3TidcwU6F@>0_qP>if1AYJrtT8*iGz~!?gUTBhe~;y(rZ{ z@DpN>j559Vk+_+onX`a1<3p+Eci4k?RaCfTnECq@V}7#3nE*L#a2!}5U51fIBc3pi zF#I(kXd7*<{TdnV0qc7eAwir&y)FG}Ec^A{P`KbKsPK!7G%GR}08C9`T%XKl7GtdD zLJ7jfLibJ=lH}WbB0zwva1D_qcm(ncu?Hf&)1GOt{Q&f81B6umI(i7TFP$v$aA$jj zGm9G8JhAOW3N>rTix1k<^b_){#0--yT-iHpjqoNqEQeC=)|}M45gC!JN?X_AcTtee&|Qpvg{50#Z131*NMit{w(!p}T^RN$l{Gcu%BEmqJ7V&kfjvv!K z0;*ur6!_kEbv%5ikE>D`&Qxvc3%GjKpO|x5Al}sMVl_b<*nLfOb$q!y+TW5K^E$LD zC04x~!TEDw58kyJvy-V>x&@gnH8+!uZ1CpSCRBPyB??h$MKgv@L`)Je@l(YvjD^7H2~zrf=CN2pCN{57kk*+=iU zS7SCcr_knw(~10!hmk^ptv;^BN&t?8_gi?vJ7*SjF1>4E0Ib;_A?^0~6`_uNMf>gt zv=op#K?H!YSOATEMpE*>rik(p_adHpidF$&cd41Yd7-+l?{630U!QD52D1}(QH4DE z2gE&dOP4j;56Q!HsL*o$$F7wy2DjCKt`jjRM1`Ms+_h8tp7roJnnGOPO4-Qyjrq`L z0zX?U@ZcmN8gM}53u|G4$>%R?sSLs>oI>7aR(?F)Y8}3ey#AhPHW_2FL5%u5_HXy! zd2`mkN59yM2hC-h+K23aF{Rd1QN}dcLW8-?G|PmeqM^^&K$2oO?Ml^E`=}L-3_Y}+ zSt~akp`61oM+A6OG?s}Y?d@da{auNgXbv*{x-PF~SxCP8D8gGT<1Ow(j>$rO{?lrhnre$Sf;(OjoZ9kTdOL?-_ktKG zbO5tkFbO~0jn}%*GhjFFx>Q2|M;_c~DacmGnKL-nmxTRj{akTHE8kixOQ6zN*&d+_ zWgvq!RzSm$Ezd)l;K5-UF#05uUP&C5hQS z8JWdWY1exAHJg?%2`%bl#E#UvXQq7Z*k5(62BTK}vMC3h4_?>{8}0on@u94r$q1N{ zqq7czd`qnut^bN!xxTrudfCf=ADl~_gI7HOR!zdzQcu~TL1@KcLc-87aF2Xab~w{> zByuk&guv!I0F{V1N=n$~PEdcw1<@e}?zDpe8u?ION&+}k?H#_G)7O)lDR1YuOetwT zQs*v-X8eX$eCKmyG6As45g_GkC;ENQyIiN=Jm7QeEr5VY{`Ak6Xw-b9vVZMjl z`~m1)J9o9iw_keIb+rpJ%MC}*2h-xTxjR1C&1G#jDu^tmw$@`z$JbuRL0eQP3af-k zgK*gtofB6VXYH?{?P{;X!H>lb+`#INVN3K``{HV(p_Mtq265Xa>}2Q)c0x6kmJ>?$ zA&RJNYJJjRj*re{E0sZ}qEhGrCTfyUXbMGVM0I$=D>pqa#Ylc4$lQL_701g%cY3{~ z)Z-V7%pdwUQd89rn%^FbTnn@sVV6 z4nkF!L0l@qmIa5dDa<;#P(PV-T}31HO>6LctFrD3d22yUOMXu+$j`g~N6}e^HT||> z_&0Kr1Ed6WG|~+cG7ync0qJry(%s-lDUt3*O1fioiPD`TrDGr^O#HulzwYCXW6$pU zd9Ld`zd>0a6l-_zm?xpW{^mwS#d0=deeSrE6*R88(VkvZEjp%eTgZ5RRyTx!dRr~8 zN1MetzuHd6vqq6}LLU_9XGt>AEK@YG2Y(Sf%re&W=y?Ri5vw}QICg|(_2^0#Mhmyi1AJi~p({X*gOCSgL z^i0qrq|XoFO|kEA5Xz+l3! zoncn*Yv-rbNFlJHw>h3L+*f?91Gb8(6t?0LkkQy-Zdl*wXql=JWvV}qQOI26DD+pB z0G1ozCNgt29E%^!CrYU#(VV;Tdw$+?E(m*o=JClpFVJ?qU+wa!>CDM%k6SPAO#AXX zk|A@V0JZaGMBM$a^-Ny%@WD+xQ9h+AzS|6$jP6s-M-is0f|jlO#AMmG7KCY1L@+o` zv;uz81Ds%pux9Z_kKSZ~cDLWWrshXCc=0(NOX~wFzB(OvnERF2R@WFgq8GrS3l2^& z0|@1HUrUSppxKpLfWH+ojv`%H!Q=M&Liwn>&>chTgaQHEWFl)v-aWc68^ioEf&(xk~(Yk_9EV{ zbNz%Ss?k9f8_3T~1LcO+y99(p!~qyvwvWwC1F$Y%T)o_^@QLM?|l0 z5OF`Xy|?8veDFm@aIC|9S@ASNb-{?oc!=>_d8ad)jjH;lcu;&Wba}z9858hvOiE^E z2`zYh%#XA<7>|IP7E?sA8WhO(e+I3OIiIQv`@;wTr^+4Q2^9Fvrsuv!=b7v&2?tc$ zaqg3+6WdwNcrH_d;U3tej-y_m>do^6$kD7aomajk4(n1svI{gN+#Qfa8~TI^fWLX` z^`~!yswLoeM7TS(iHwgFJ!&)N=(T!Fn{);jfg(slK~S+5Vlz*Z=Li`F9Q3RdQDycjyv{))s^9-N-;!|qR)JYy=8A>*CFe42i) zYtz7|e#36hWa_k0%o66&Rv)Wxz&dg9D9Gbx?}i7xsLgj1*EC=>zb5~(<*Sii`%4|e zr->{t^~<9pgSD@^>4L<+>k+8>CRAsSYU3x0Z)FJ4+|2JTiB7P8||RN`%F z6;OlxQn=N>t?3v>Yf_(-2cmW%gT~!Ss_a*B?|7fRi%$&K(m8ic4mZC!{C%z9M;Yw#6esv8E>c0N}@uqp=zI0?)yP zooH4^k3iC8!y69K?;r%k0Sz6P&SsY{>xKd$Bg}`RgM$M|&hd?ZuwfbU@Nt(m81ekW z{_V44swa~PX3tJlv`{a7X@4o2x!W2L6N%8pB4BhRH{hQLhS5~9bTLJJ1Grr?E+q0h zwK8-%ylQQWDOictVg_{pnQaP3K=!>hqo?!yFa#D(wX;rW{jGMA9G;smNnBq{mgVuL(T(;hQ_2#}FTcr*XR#o&tBv01P0L z0040EL)&_e{+I5M-Wk`Ri(PyXwucT&G~a!C7?g=T>dr;q_mI=kIZSm1iCLPGLNn$lUJ>gBg1*-dXKI`U*e2WmMd--~lU2g1A6a z^}95sa3PP@)ya@0`w}zPEDgf~yNRyc@nVS@@y+s)j*=Y3L0cCvL4^4#jF(p_A2bq0 zT7<|89Wl9feJZjtLyBzg^dHmT%&yY(iL&5uGRN>$Q^&c+5qp`x@(xY!50db6)O+vj zfm*+h6Fc^78nV{yJoNsvs`)b9;`QF?s^iE?Cli-X<(h7jC$5)I9eM{Va$>_+Z)bA!@?A|ElYNg#sq11J2a>^i$(-gL0TZI^HBqC|%m>DcKZ? zW=UwOKhQHrODc=MwS=oXEIl%=;?2~Gcj-;q%-&z~o47!eZp`0+`>Q>kQ$qLDy)JGP zC)JM5D>k@yUh6R z*o@dG#fwq{O%xwJ%51^|QN<7W7OC-*yGnmbQPWS4|9jW6_DZ`*6c=(N2Fy<1$zwJb zt)%lKOF^PVt9&O?NhiNDKHBA#onET7H*xr)r<&cHl#^)0*D&oMo!_!~UI$GpHpx1Q ziBMy>|IhT}0ca$CB6AdHh~-03T+7O4?^3Vs$)J_R^08a-S;_HUt>P!M4jC0qzC&x4 z{^y}22!`AU0RCwMq_m2m$;-Rh6`f!G=94u82Kq<(LBOUbF5Lar1(#7@qg@$HP6Bu% zU_gEkEvE;=7Os2_xQf^0$5x-~8ZJg27@LJ+@%a8o(&%7?TLsAc=$ zr8)^`oKhQF_&Yvw>BMMPT>QA=yCaY;?HfCOBM>N8oL8yW*&=#P-nb=avzjDh@CBWt z{c1+6W=X<))+4ltRMf+zG9)0BaHK_FCL2-x%My;$3WrzmGPbP3LZCp$t!n(z*n27K zF;SL)g@@@GFgIej;noY(` z7S?_{hQ4a;kzzGjiG)8>%JMqS*{rO(k0?wNy!HR?e-Nna+-_tjS!VP7^uF1xaLB1u zjj8L=wBghPw2*X&TdlNxY@V>agJ2Kpb>}`>Y~9UFl`fh$vurdM4Kxgz1=F`*Kd!TPU+lqB|5t0lv|CxSsn?) zS@Pldn)nHrB_4X6_Nqe0wsq_()&8Bk$U!rLDL?HClDS8*wx zngo~F(z5%y>AW)`k~5)1KGVtfyN(yXu9qlc$R>{DF|lcpmmp^!QBXMGP@uSz(>0Uo zI$PktPijf5i3ov3@_@@1SIe>gpP9r5S{@wU_lkwd#c;x@)6>hJ?O#-B546%uJU_7| zr`bAYtz2UpYbPx?Oc>d=l_S}ko4?22AE{a{4|HU{NMx1gWAkg2&PCwe;$%0gZ8iF6 z;WcJXiwEChE~TM&;9hYCswkziKGJf$4DgGyhu}!aYvX+Gj0Qgc*V`XJ#3XxsYT;>Z zLvEiV*!0vfcP-dzzP}>B^HNhsvZx5H~q+l)_CT{T@?i3wWD(;6*c@(IA^l?9| zU1eig#lu-X4Sen2g>qdw>94BLlSt!w^1SM%L?JvmngB|K&y~Wi_*9cf*^pbATHph- zQ}jmQ`$p~~-5?|rx}Gbw!si=So84(t$Q#J>@>%ezD686NySm3R9Ld5=;qjT15(=<5 za>Wl6Zm!*$9Phc8H9Lky+@QMAr;L*Rx>cny#-vv~|NT62lAD}{0F0xrLoEmaWgz{O z9&>s2rRA01GcgpOXAc$7hd%*eg~w0?crid5M2>fOT1^L}B)ev2WI!`=&CL!m}#{a-MmhGH+A%Gjd;~t!P-81(^d9VdXK5-Ou6X9CNBd& zUND(Ccz$qrl2fKJb~hV$L^0z&03tPS(DzoXj68 zEXSTR%k`)dIjP{*E;4uflAqy#NdQ(QML<6BMeu?rx+AZO^FxZWZ&^($nF_Fay^O`_ zrjlY3zs9Hk$fO?%XMl|25JdjLd5e(r5^0o)OW+p5{~4lhSgxV5=w%`1WRPe(6HgW_ zuzWTMgF`$eNW}Jk#jmpPDi2lK-Jy6ekGqF&=%%#m=g+Utq{cNro$w31zfsx0i1g3A za7tS9qv+}LFPb>yJgSgdeFFD?5r@K;rdeD?ZMS=2vK<%CrP^D}meewAZZoyZi#{98 zWvWPbVCN+7l>!IVFHDL_gH_&N^i2pOoLkliK7Ltg={6ou%LV|z*^QSEPea=UfLhoC zW&j9Gx)DYIlY0bQ;bl`m_J^(E8U%;x%KRv;vtDvB4 zJRr~(1QXx_h)wgt%2A!H-zDdd$Tygiz3={6TN%ENr9j@u(HMz5%@92=3A>n)V%|a2AJYN5=sgY&+7=b&ZKb6Gt@e)hzfB6|Jct3{*Uk7_=3-2cJ4Or(lzYDN%2MoR&U6>Omit@c zvTaR0r?Ys_NzFR($JSmXx@zF1c4qr05UcXRCdE|p7alp*uiuwL0d}%7a)va!Sk4Jt zE=?HQR)zCJ$P33{*R#Ly`X8m_{QE zfAupbJ-s6y1%wVO{HjwGYM~8^j!P&V(9(g0M!p)ej-%REFY_mMfNDto}Z@F81$cT3hj^bs9(g zZIh!tA4EU@Ve-5KwQl@#;`q zd@1~01(m_XZ00l9nVS&A2A-P=gk%>&3AhS4h4yRmg{*ysYd?!k{> zg0U1+udX(nie>5Z2_h#|?fIfU6r%>Hap6b8s^W|9bRM@%tXMav3vwdmCzI6B0Uua+ zDjyJf$)1G7;qA@%oHh4wU&J5k^?J+lp*{|2Kb;yT_ zo{sMd37q>+c^jP?patS@F-Hpu86ku?a5xknm{e3aK7I_fNU}Nv0sX-QHlZ6I;*n5D zg*epdlC83hQ?NlR1j)Zz;d0CogZnH0rBf46 z%0V>V-`m%6eZm5+TI?kSBx{a{m4T- zI^@ZZ$Er{LRBh7q_81nuul-Gc$*yI6 zY`K2t#IKfzFReChBk!jhl79;FKv4W?F*!azxD}Fq4JVNf)msTw;DJ3de$n^S(@_+Z zDT{JRM|HkTN^^hbYQU#bS}2vE?W`Vg?A|Fn`n&VJ_DxlqL7=;V8N<(x!alE;JjGTo zOA1X}OSNjihZM!D@r845?6|e90mVZ0hrzAI_;bABrA4jW!arO$MCWvdk1`FTy<>*I7JT3N zS$63JdC`+kdU?FOjK>B%a86|wACWhv%ndVqi#cDJxbE%pTk+an6K-z5O)W1yArb46 zsPKMq>e6Dw95v|;IK3eWb&-T&b)fI%vM&z~EZZ1GULW#3=y<-dgO8nVz8%(sYI{B3 zZNhuz0@cuFu#NMyKQcHzeY^Pi#I>N>+h0VI2w4+c7my1c@S8xC6r0rGfWkW-)Xh+< z)B3>SfzE9-g`n_)a24Iw&XaQ;kuuxZ|f^ZDQTB#vbs&>FfU{*x)aeZ zPdto-4?Gm zuk>$tjFqf$4ccfRm4a=ua%gF04iG=U9xuGTnCiriOJHEDD+3e=p!)zJ!VlAnm?i-9 z3^D11O@Y@|)*nZYi>!<+ZA-}z+J70}$+jKSG5+f&37ibfKC)Me#HX5x{4tprOVQfe zCr5%HdKqd~j(1W193z$=Mzi9?YsZeCqYG=eOmUt|aU7rfwN~G(`YQZhkfA<(($q;? zXxHVF5i+ONpuUS1sWoZP7|w< zFP@m2?rM_6e#gIba+u}B#C)&IY!yGi~qX_&0x0W zVA$L=YvR*H>u2x#MeSu|{c_~h+IjI)(aPKVW??i7Tp2dzx}O&JeNh?1TcejtG$J!t zUJs>T*WQMvGn2bmOE`R$GWo|eF#a$`K1S)-bx-?%4C_4#*L(QMoKH<#f`l}nl=N{n zZ$)~ui&oP)ak=6=V`i}yKk>n&Dyr@18Tlzk>(R4ye&6P`v|=uSG^Vdkd`3IOOxF^B zp3mi>)|32Ct)fI;S#?zj1bjSQf9u?R_*<=3r+0()_Rq8Byt~^w_xszw&*Z%GhEQH6 zRbGPB8=5U5?^sl2S9)sFQa%wmCC3a)5{Lr5lkz1vTBU<9mx!{Xz7Sd0{=ne&nXJHJ zvaQTi+R6)Jig3sh7M?MBx+;57=e3?}B_u%ohD-J3sx~z;>1$zR7Egp0E@*1wy;&H2nuXxj46!t zl=^fI|2xcwsb|LpL`Roj`T-yp&L9EIKP7@u9$yH`iIkY&OHt! zb~L^iCE5C+_Bk@`ovJV&&V#T7l0m%>75bmJA*H72hIM2xL|0y~@J`ndddM z91FU#8#P$S46}Nz=Gcy?v3)D+i2nIHz2(Jguy}!XIg(zdOl`s;CCRmN`?uX_W#JZd zH_Utm>1X)t5j0{{E&frMV2&+we5lf6mUs=os6TaP?^e zzr>t|!;;le7b+TbE+3A)bX}RDsRxBZzM3Ts(z+Me-b{=tRU3X;KlZA5!67!2q{$}D z<0PXjb53Hx>P;!!*;Ki~{$;1Ec%!9Vpjp}g^$-Dc5&ZagOe49&g^k5TG0CUo6fxM&bCy{2?Z=w@gq_S|pxq(CQJ`SG)ihHO1_m^+q!-EQ2{3>=X z7VM;!xZ<#6b8`P<4e(R>#Op}=S%^WqfdHxmt9%jkH8XF|BnBjhD zpZ6p}c`}0JyLSkY!ONOg0sGIK$CTLYJ!}-t&iX=mENRlwcxSUk8YvR815Ho)%}oohj%@$>>&L{E`%P)kzq|4;)yN~t zol}0I9Y3wxz;c<+{nq0BINYY#tzzn%iFA6? z3aTe+E`vslx+xdN9}n~HwlQr;sgBcAiY?rz)JtKQM$c5obJhfyO7 zo{nO&1`d~bN{E8SJXe{mZea-9zAkfq6l8}+W9Q_jvn=(~!ser-e2ka<$;{8Kfj2E0 zPjRnZ48o$zN{*NLQpB{vTDgk3tn{=?<|VwN?3d;-x^a<#F-n7*cuew{Iq#U>=B+jz z9aFrfX0YXv9d4J;h)M!YTVF&7BB1i4(PPbvpRNPfW6-Ne7&`WTHDK#ax!)SoYR{kP zwx#9588;t7;Q0T-YcLGg6&oH6^y_H(%Evq0nXCC^RieQ$HKj6x+u_Q7$XObxK~hT2E3 z5NKnXnN8v3X?Mo~FyZs^5I!jCtv z?}?tbNo(c_?$xo9UCjmj3@Q;g_N&o#!d;kH+Ut|u_fOuq0fm`!eMt;5*ll@_{tagghhad4{q{$can`KB!~L=e65}ILnc?$GT+mQYK8OU00KpXp_5pN(KWKw~ap@uX&|`JLLXhQ*4$o$2 z6y@>$W`?E*3_s|ThY`%mLxAVoe(wl@m!Ot&VdMtOV~35I>dx(KX_;h2*z}_ZmkPo1k-)0+w-6Ku*EXN$a zRXH}5Uwn1o;>EB`rBoVx=JU(AoDfgDXV>xU(VjQ{D%~UktL>0zsm3G-YX+LU$LhX&0mX_h9g*FKBtjB3z-#A zSEr#1ANqWTSwhxx`c)eBRCMddB}o8)P0+U2s>%9u zv76g-%aLM{CxV}i9}xZ>p#s~4H}oB0@n<^Nw|DTL3v4#+mOv0&1|tVRcwO7Uq|etk zX1*!tcz)+6`83i*E4gtCKyv9n5Rm{cevpHHVX;UWk*En39$%Q43qnkX9r!g{HdM$E zY%cIORvygD6_r28#x3!lfE!#E|7H{Uf}!!)kTM}S(op3ki3*Ib`NjK*Tp$%b59sNIxy3ioetC{Sj(L+Ao}9#qUek{cXgJDG@jAzt|&VtSbj`Vjgtyl}=pgyp?r^VrIV!EebdUBh*f1WzIaQ8)IOx1teB~7Cjxs zgT{1It4aqK3TR@&!=pvmuo5#u_BXa9G6=gJP~{H+br~rTo7%Xt3-=3%p7YY&vpK(W?CEJd(cxhz!cgkP)Tn5i>bio4JgnVBXcP`o50u7 zc`}L)AImYw=6HcEoj);L{nmngG3)HPcSMe_ldhv-7EG;7>%k9h`z#-R7o}8a`Z9+k z?0WT=#Mw)4{j+5PSi}AYhVvZx`~K=5(bByw9)U(ObkFB4F)#@L5d?@H0Fqg94ksX< z6y2BK2Cmd0+ki~M0Nxu#k~c{}FOvsi6Rt?lM5vOMFQfqh$d+-hM^S%Q_2e9}EN~5@ zur@`mtVj8~Vrs8QM;QQZ^-SM}G3t4fWM%dc`qV~40z7~jXS%*elp%{Ei@^Sis{;q_ zI71D7BP7Rj`S-nE8_KJJIR$NMVI zIGoEQh#4fTrHGGG)|Bn-xnCO8?jw+aMh8#&G>E2io6uSRz#{PVQ9U^9Z?Xfiv~e!> zo~)dlCMwzlHKI3phcp5y7&n`==!@s7*-JcL|CG=?_b130^a^TIKsuw)#P?cy^-+l4 zM4}WX=Lt)O{HyO0Dzq3KjSs{T~{6gd}x7&0P;-{EgVzXk#?f2##e!WQ_0S zF#Yag3o913`otB?^Ehj`vZFpD4c#AwH1lWtj%a$^(`Bq``72WZJaXOFW=7%&99z z>sQC=F4y^Qd2UlqJ5_9{&`#&bK9g-dyZDcF%NG+UxW^~ng=HX1-Kq@efrzpvK|y$- zH(ppLS<#o%f6D{>{_a$eb!xrBPRFMEm5y1(^rVYb02hZY3q$v+wyw@Z{1ix^;oAx9%Q z1pR14I^Ky$xu#rmRZ-~KjZ@%(6+D(qJqYn`(r-wDYxak#s^@ZL0u#&>GlF07>o^H1 z(q)9lxB^f?PGPN0PcH8qkhf2aw?~Zj+cTak`vuHFsfl9@_xw~g?MmtK_qza-^(@I7 zhEr09aK7=ye!uDQlL0ry&os?v)$69Y0t^2RIbN+sbmk3RSLn{SlWbKb{QSzR=DNDC zcmE`j{=NMc320^$g&geXfWDx>C1q)yn5pC4TeBlllxZZjpy+v~?vqyNqaP25}s z-Phme98Da)>O9Q;QT>GGh96BT5YKcy?mZnoab(jW*E6y2uN~-fLv>Ac_v0cZ_h6G$ z?NXI$Z%i0lpu2U&?4sW1|3`*d#lAjtcEv5yqYL7U=AFE~jqvDjz5$;NYV#?VGTW=N z!ylO{hwq`wYm5G7!_RfYctRYA1m1yYST9&G3=V5VDcW-JtHxs|rV_Bvp`qWJ zg2JkWh0&5vhA3N9y=iNUHPTGi-%BBRU@-M=EyxCUTZNF}3v0As0@thfJT5q{G9KR5 zAj$awWt8FzBDU=kvFxwog}ef4%&60bFdoWckAqq61q;-P^a#J=ngMrA!1YStN7m=d z>&@u7`$azSphM$p;|LH71g7-bRM@k*{Q}-T%ATtCxXm#OeX{2tc(M>wDu7i40;;bn zQEe2^FyAQIs}zIHfy~E{G=6<;*1li#bDWf)Xxh7sEl%edYy9~$1k@d~egqzDKX>%b z^UJll3A{PEI@zQ^wQpKG2e;2@E)lFdZUdQJn<}58YXFT(8*=eXMObG!j&*o#I@*mHdF78W)d0O9YN!l4jfh;V2ZP zoZNgt1d5d&y9LKZH!(kSraL0Ib}uJZLP63*4j&&-7&a&w_zOP7zx zinnCtI?m{S={uF*$aBMH@x9DLjj7Hmw*%<6vM#r2UT!-16VTIqrBw6P9%;2ZDisM~ zRhGFPfAm9HhTea3iIm~q2Z~oR(gMV5#82sgI-*QGYnn%Rn)lWN)z&*Pcb>nv$+9m9 zD!VV%Pp=9wQRuy^@M;w|Aunz$)zPc&8pM-CN!h-5>t-Axrd=T`eK-Jv+T>cSe3UzIF4z3c2#qd*ZP^J95`s z;y2nXY0g04J%NJ$f(Ad84`I`14`Zs&r<|I}TpCCzeQTF@VX{VB-_OJ)mJaTKL6TM{ z=iL=K)$Kp7`P_VLIaVWyrNyJC2^hKO?*7<_W?G-5dPG67HY1IPCGHVG;XQJj>Hs2x zKvEcn3*86gf1ClhHws)Je9)OG6(Kpe>ZAf0>8IbrXYb zE*&S#o_aT@Z1GPok2soAZ~{UWdsPt`c6>NFuO} zE-h{Ko+bwezH&EPL~X2oW;2>oGsMbS3d zA(*DFo|xP+ERCMtTgdSKB6+e_fG?GWGxECJe?Pladp=Q0RE?Cwsq!F1>LItTE*m@@ zN)~Lj9eB$h?d`s2@BL-^s;p7T`65*hU1chUVoOC~@#V7rova+~q26|*Eo7ORQ0>=O z_Po~^Z@GIZypH_iqxr6Ib!iICwW@M3xcFGrYc&cCQ{f`w0~J6a3N+QKVj4R}a#!2A zl~>3(zc5Jy2EdObMzH@KWGUi(qMxwr=>6!}C+C zVnHYTku;UpOV{%*Zu#S7#wYG;Oz$jl=_14*aE4Hb3%ugZCCY+*3(g0_kDq?Oa!0H1 zID6KY=%o=zdfNSDd*=C8J~-?=<$nl&n1GlU!L` zTn)wEuy@0X0651mv$@^3jo#p<2Z}qoKdPJcGK+qj$$57-t^b<)XZ!CMgK@`jcKxfw z$iJU3vLj!g?{~*Ub*Fy}`e*(xWTI<_sr}IZI<%{$qT3sDAAOVc=jv9M&_vW|o!?o# zVW~C^MeBETlP`VKLv2c!yHA&S>-FiTWBqO=<^G!ZKKJv2agm6U+9NvUs^_o?RBmBUw=1wekilM@dZM&D!D)p2WIrw;g z;tI2J`{DhBJ)^23VZ`vFB|wMs_dj}tPy~U0CRA`EN)#bPAS(sMbAbU6qIjf+4Ezk@ zi^~XbeU1dC@d$^vJ4@t4tVQztF@M`X{`dSjq)%NW)ECq&!;GT{1Xs#vK2F(UI0GRH z7595Rxw?+RPmR@6Kks|uC~dCZvtAO9#CXQPCuXM=GJfU-C)W-3Iw68jM6&z{ncPkYM% zwt;uli^7_H2aVdxU~r)=o^$uRRO-j8k`>0*|K`?JJ+CpsarawPj^mGGt$Lu;WwkEt zjhCp(%6?>ZU2-TQ7SN3CQv_=y7S$amH<4)?MM>AYD}x#$eig;T0p!0fp~s%tG;wSCCsW}!YxN#;ZO z;rru-Q^j#n=GdV{MswbnIn@UC@|Ue6NioovtU)V9MR)LWadwMa{lJz+Wa99{3k?mR zH&Q==jxQ1||nsDO!aE|x_AAa(D z_lJMed(tr8M#FUCbmBbAD%}eFWXC7@8<%8U#rZ%F^*j#HOaq9vni5Y?264@Cm2oE@ zu%X}oUYRh><=;E{gc_=AnQ@jwc6}6|DJ^;{GC|w6qE~J>HT{myvuXZjJ4dLZrDCDd z%+r00Z|*|7ZKZ;(;>=|I!N>7+hU@?4-{)Q&eVJGYsIPGpC{&Z=L%NW@Zui+kg)!0I zdA-rKKsoO%jII@QSRaKRE(>0iJh__N4)VSqJbJQUb8vUD)_r$X)ADid^vlu9ELF{~ zt?unJ6Iae__oz+@nw5G2zf6HO+2z1%6z$U9$~KRi^R)9_(7)>~({`KdwXSgQybwW) zQYrQ4T?9(cmSVeoYj~cSEst~mGRnHFbkTkLz3CT64lh6eL4f{>Jtzn{Jg~Z0oNJ`P zDa-Il(f;rpmChrC?2qds#dFc7d36RwxW1chB>${P;iTiR$cLPsw2=w2>7nZ};`+I> z8Z5C@>$5VCxn4tEWOo>SOnlK&cBt!r;yzLBP$_X4G4>5Sy_>Q4$7g;$XZ=Q$R&v6+ zEw!e94J0jhyY^h{llN7_WCtHj^;MLCTA-{SMO^I8>dA)8TTIY}so(nhv6Gdjb@=pY zK6Nn+oSx74iv-ucJ))ElWcKDE@H$!>RUs2v9mjl57*8BzGD%p4{`k=DRcC~m>+qG6 zu1>Tgre=}16)2vd}U)}MzR4Xv#P2gh`?G}wqV0^uu31=b3%7a>Mlw0P6g3Vr^_Vc|F+ysyfP5@{`yt0xP z30A~;H2L=H=XDi!t+!wbn=rI!*?{Cbt-v4l-9&xL2}J#eON~r;`;S!dwnTe=A=UkK zIBlXxHZwu+L6@YxS0{mro`;JKmV&;p5O{jNjr6ss zY*Yu2zL)rkI!l^Y$=YkSj-}iFJ`UjwbE+=m+#zU88BQdjJWGZx4I3L(;ty@ghDb&2 zRWDt;rKXdR07COvBF-6>_>HvZzMSVjoD7s&e+((7KWZLn= zvZ%pk6l@+&55-OSR2504glT@*0>|t^(S@x&gP^ca%Q@BjHY@l}Ps2r*0+n!S!*#0f?hiw|K<<{BdHmvRCW3wcCdD#$; z*VybHwN+M{9)Wu1{VvD7_J{yWD`sN-3FD(%MIIg=>Ew_jaR*%0r-aP~2msDdJD*Kp zn@RA|6Q`$k6*oWs>7;hv*2-Sc)z#I3VAA5i$aTy6aS7*LuPmdJ!jyX^XYZB$%y&n6 zADwR`FymgzYP)kQb(t@6jAx7`=Zm8~U2SUqhIF?C?cAsQTSwj83dzl9G?iM1*mdr9 zIF@_W+$-feJTDr8?ytX`Vi*D| z-~WEw^zp|wB3_c70@RM~Twf&MmyF6{Fd%`u$II zcg*_D{GRL)gIT6Mo_i|4?daRi<942Md$%^F$gdSuA0&{IL>(m=QMuI?P8mg6VZ>aq za<~rx4uC8?rvJof!s=5(pD(#u)3J4(sFFZ*0Z1alD>%#xIKd*ZOVn(?Fynn8EVi4Y zR#V1s+vl;0N!o^sIhhwRHnnW;&j*qpJ@Z#3M;qOSWWV;RP&2le9Yyzuy{4}#N}zq% ztK7qSpY_E$va9mw$+g~1 zV))>A&CS{c2tJ#B}pE66NFbsk%;;N?u zBEfrL8Ih%;w?$eY!<9ECS%PLEUX!Ale%-#SJkV;n8d!RP`6Ykf2x2)3XRs(er z(%{MQs*UJ_en@1N9B(uLa;P^4LCS`_7YUJpj(5Vo2H@U}54iCNZLm`oV_}%Beyu}n zI7k+5%yKkjlWRZE&l#Gm8g$rw^6{U`O=-YSqt{WGXBV+l7u&?&e^k7~Tn{D60|l(Ss_k%e%4>)VT67G!2J%{j$d} z3XTRca8hIhr&b|;#BWP5TN&{}>xga+k%qyn50Kte-r7eRqT#jtIcpF-?`yN}mgo9D z4@Kzrb|sU#ZxK7_ro&(lX|S<;-@k*oNM1agNBQB}eX*(Z2*oK%t8ayg=Aj^|_^4kc%NI50LE!v5sP?*TR(KyfSb z`?iad0afz3 zD}-3OG@KN{)pv2!>jzX4UW8u(7xbHrG%Ry{Fi_al%y2xeb>wUKlLqN^t| zB}U*l;A*%y;UaM0e4>APH7^HjD?3$`d5CJH}GE-4)fxOBIafCADfDBUgH9WLG7jg%rOT}yZO(%rF?uma-y@%@Rp zX3m^*pO6s!#&_)c*WaHE9oo*d5mw0QIIroSjdssw5zo~$*3*NtcHKv}>XGt)8-HB_ z4qtaXsd$~RAKu-GdGYJt2v#h%XZYBCtrvnH*R40Udflw039^6VcXH5b@BJ~Tw7Jga zMwAA1t*D2e!i11|7i!f7?VI9X-H<}3NKr7}M#??iMZx;JcF|KI?*L=ctJ$Z3znV{j zj(2>VHNLG@zU}U>3%J*wt6N%CzdpJJz&oIe z>0n)_2O|WYHpe*@QF1+sg~`RE_G2{b37tmkog|i!?>V)eT!P0lfHbeg!GY7VdVO&@ zcMM)}GfH^aA+UMAvG396h`V1IZRuWZeMp#RZc>k&e`yF4O37K5k-Vx;fQf3uwxI-Lr5G<%ARdTVB9g-alS`T>ODc1BF>?=5rZ zeu=X{Vn@%oSQ!!$$7yDyU=b%+UpB4X;p9@3=HS0jQOW6-(Yd2)w^3FTak%AHo8!`& zm}-F=WNJ+`?Wdri(3tqSVv+14NV>7!1T|D_jEMuM76{tlZ*?^vxD&4G<3o*2B#}q|s8>=ltycSlR(Ifm^DZJ; zanVHTJS4KRQj(cGxtx7cFaqJ-`%*Gcm>}+GUm+!QqbEvi1;C$Fd>sFDC`||AbrAF+ zRn|*`e#va*v53uI=OVOJKVz{)MxBXj`=00TnFRfQWawTGbo_4sDfacxF4hYGcOk^e z0)R-HBuX$!xx`>A^lC_`tZZ{s*e-=~q-pKV4(v$q;j88e6E3^by3oaQXgU7<=~Mpr z7o?X&X)*vNkwB{m%@6@&;fIfxY{x?5BrGA1ns8}})myj?9|gtoXI%_H!Vrxjk#{Wr z=dheH#O=uLVy+|WI{#f^l{i)rtyF`wEiVrlAuR@wOb9~fMFBo$gTJ7ILgC5DB%ERC z@-dGa{|-8*&N<>{#qMK>6U@b|=iX{!v2gO9?yjid2`T<@n1^i+9Id_K>3?>?&9JC^ zrjzb>9F)Pm2S47T9O9mYX`GYiWS0 z%G<3PVQsQ%bYtE4(Gyt`QaO`>&6=5f68R zs}4qfhv!SI>7`cLEP|)kY0NF-iY!`{jATY^HD=s*j{jQWOQjZ{7h$3o3O%;)IPJ;A z+x+G*{Q@^@ucn-Ux99rne(8_BkKY1*iF?|e#2HnzKaWZ4TO6dXm3}RTYV^iIN7uWU zp;L-3wXOoo+$l4xIWt}bw|=VWQ+YMT?{EBzZb-*SnBhZF3u!j*6bb}vQkt;5LJN5S z0Dyw%PzCCxhUz3yD6BdC%J`@8o%;3t0*Cfi$iJQ)^D?b`F=3;f zTR7j1wYM1(v_Lf(UUAq@UHBJkUHkqVvp!eH12C0nP-~bT^ zKrn{?(o;TR7i(>+=-;Hi_kT;L_;OYCv{6yPQDD^hqN_V?G5uT++QrD(%7(cFczzUq!MFZhs|G2O)OuTKYN=iI!7ovV{hq;9wqXXFk5Xm8HcIvi?2Sb$7IBCBrnX~l$gC$BX6fSU~~RQW`LaS$%?sw^6` zlTL^1mL11A#7wy}&DW-DwasG^j?i5-QDUx-@A!ZU=De3B?^B5{45TEJOr3idY;>;c zf*d(acbYoi^}$SMR%c1u194D*KQISL$S*_5{G>d5`HFkBk#l#phqUAYy#0&gYwYTfs8L9<#*w0wESusW4klPWx_XG_Z)g|+y_lTzBbr3C zm>8IWBv=?b>vhdMGb}6zVpsQ-Z*SMee#Ww!rx)Co&-!Y%sTB6mDW7y}p~j8&r^urv zNGD*JTH0b`h2Dd!Rg1HQUHBw(8Hpowf@9xpg*hlvDWma9MC7S1_LO$!#>NZM37`d? zTH|6LGz(MvM-b!oqDg@p2S;NF6@ZfdX#wp#_OU!{h=L(nR1ZjcJILod7v+bl%vxBf z)AbV~?nwMTAa$t`wNuihGM5E~mVl9i0wfP5NsIzre`ZxTksWypf`+E1qT=VHh$U@!hB=roJF5>rBpEI;9HQTGynu;Wb4y198o+ybRQX(6!6wF;yb z8`Nr{zIi53fflnv8uKN8ujL++`7(y3O6p_JJY2etpW%vD4dceCbm<~5V#b<3d38{) zoY1V%W~_8AcyhPLte!Z-5C5|1lN&Au+>yMMGJJ0LHrDu31gs=ul7EX3=YkaM&~R(MQ$+(|K3 ztr5wE7gtSYx@*r}c^c4sfNOl?^tuutp8Le;x=wA(9OmUCeDLfUg9dk_Juj?4_c!OH zMr`Fov z7gwK0)S!ya^NQD~waD?F-7HLr=X9;?o&P~p8}h9NjF)wkl6Sy!l^u#Byc3ZvLya(x zeuo;v4F|Zr&|G=b$-5s|?@LBBh)$2bu$$PklHzQrWAGGdq>fRHVOhkILeHY9i@%g= z&DU?}u4@#%&%ycI=%dbl`s2`pys2Lrs*A?+=aR@`IGwt+M%jrYLePegT~x-H_3)$< zT$OyXI5O{5wVOjP_(eHe?LyTFF7*2cI*z=e6jAcDpMGORj!$n-n7s?j~y{^`791d+aLt`#W z-|D9ZgMwcGj9PRiz|T~C;JFpcep;q5Jwy6)h zD$uE`V5AZz)amMG^Gerq#1!>R!RP#N#_AdpkoVzh;>{*XrqoqZd?aWbZ1W6>-QLBo zL*>&nNHZ0|JAbp>s7rBzaHIN7X}gIMOTrS#9SY6jh7N)$td&ay?jGW7ra#Z zb5IikaTNn|j2RHi|HDK>)W_JW!|y_JH9fX={N;xn=NozX_*HPm^w7fkdDKf(ppK)PbY33c`(jKXQG5;6U+vHXZreWL*6@_Vg*LY5vM*3A z9t-fXdMVsNf|xe?U>rms(5(j?01~Js__d1zP&;%PQr7PNd?QExVmGPAlG)b9$Z>>A zfOoT2=TeN@<4EU(;nF7T&n~I?p`nv*M(*)#xKIH1$vAhjlh59B{d`8!3X8=$V&c^z zO`ZZ?L9WkZXNNf3oS6@!1iWI9uY&7)6XJH9Q)=_B^A}IO*@@9TBX8dK;dI@1q+B=A zMxc@twb204rpKl;f%BM7X0P|z1xG`^f))1eDeDJM2!vBX!Ht6*oUh9Iv!ydRA|&%L zUHfx-W!Zsj$(qO8A)`{0?eL4_57}4BOMP6Cm2cP2HEbHzNxV5^xmpr?0U!v3Z31i& z>~VSA@8GBoEGfquu?)BQdGEF85cI|)xCC~*{Cz9d<{lRvU9sIwwCUK$C|?4t?B~s^ zH(!1JTb>rW@QY+NtQn4rTb?>UzpT&Y^@z)y)yVSWciP$*i@2K+v6hkZ>a^;(gPA*> zkFLXmqfG`g^ro*)SV3@^i&WoVv7G+(qVq=e$0+)?zqEoRFlKs(`SVkC^#X6U7nZwy z(bvk|<>2<^7xO|F0Zvad6&KNO;a{^tA?8s%*z|e@IxFskb8BCM6WTw@DZX0gi<7Ts zQmtSi_R6BPh~;9W8xc5tijT&}MYRRVqu7EJ09(dyS^2q!L_|p7j5`IFsoe0sV#=Ht`tauc)(L_U z$RvXHZ7cMxU=LME+%K7cHaLEPlwXFy3h^j#E#4W#3!r*3$wGqA>sOCO&8NumJFo(wf%b;4gFQBj*CYz#;q~^%+9l z{Ei4%obo9coAsL9bkgD$B?dHzia2j-eqIv(})Qn{F?Bm@|H^rg} z-Xb6o`aG)^|G!|J8o{6(CePQPcPF{8xHT!0v<~<9ZESD7^sp2=I}Y4|rIczFuou0I zZl%lqpkr4h0xV{uPE%E)19sa5qB9MOHfxTQ`9z`)ZRP0#&_*`fbM*GPX6;QSE%naF zKWojU3bq%Mr-EP45rW9}_kNufjzc%s9qKp>J03634?AF2x&@=Y{PT-2=F^P_r2x}I zervCl>fHKp<%)`d>+BHoin}`c8u1S-w?$H5*RQ@OwQRbRjAVO;?u?@(I-ILD>und! z?JiXh$dSKS2xdf==_Br=x5^0F37{P6FWbR2j9tDAH2r=p&oJM_OvA3QbrO zpY^Yxg}Q@|UCl|K*GS}T`-~&M&42mEAh|E9g*yA3M%st#s0jOJr=gyP>|4jjusdL5 z$I#ITXK-B1J;ZQ}7kRc3;ca$W7yC$k@b7fM{{Uv`l_{rPU|{2GmNL;=d^|ti-@LP~ zRgbNv&zhF;SFl-f6ybZw9C@@gO_^X2-!8G)#Emm;PVu>~AH9Y)gk$`=`obnK1lE7i zHC3;v8iD`PKRLt4Bg3(_r8hQ%m5d7ESnqQ?2q?^|sLLE>^Rq`Ja_6F9eYqVUw=4c` zn-sdPAW_A@;J`aCrC|g`S5kX14oDDDbldV;5}Duv-U<>4GIvw1cK9nzIZ7|v;uJU? zQ-bNh4q#fc=Ph2ZFhFl5R~SHvMKj@kA!34`vLy*<^BRK4J3fzl;w({OKt=X;%c#Bp zZ}BE|HBeaMLjXS~`OSA2yn(maus$kj%S4P#!LxG5fLgyyt&<0liZ3~ z%5e~}iLGtSX8xp%TvFq%Re-RSf5Zq1 zMZwB`xG#-mAXTR&G<_lVlVCPPM>z1;E#3zjyG)T8cQy_cmfhX^emUjYGD`BSoVHDIJW&Y%g#df# zBOB>pW{S|o7hn)Q^TAQ;*1qO&Al%~O$Yy*ML-`pTDvq1T0a%Hk6}*j=CL{of9UBTM zO4`fUXzauzj3L&LhX58y?HuKAexgQ0Mg+3L9s|X~Mnm;Bn z?gE|tlp5(Op+ikrLlIx{i~Sl-Kdtv`HyoA)h|Wk&m3H20mIUN6M$)&-k2vHSQ8@)4)6R$d`TzrSNXJeyoR z=@7QNIkG4-_}QFYRU^Wyrr2n2aJyoV6%3__VnuRIO~$sLuJ}EziQ3_yTkA!mD{yqV zV1B^;F#EQus%g~_{;zE9@$qr@?DhJSNuG$F(qsE(*OS24@7k)dWC(l1z3Pqx57!~b z?93p@54+d;WR3ysN&Gz820;{GzFzEmr0}vcWfkD9#R6X}Q88&*cuWd~Nw_>wit$;j zSxc&4Kd!$^^e(L|T_3-+l}!?Iyt)nxs9Dcz*Q3v&Ebx~hTdTKBUOa5L81ZSl;F#@? z@xQNsaC~1-pl!QQ!)|!UBeQxMvO45*f~2_^_x$2wg5^7>lS@zs!<`$ND)0UNPkVoKBkLP}YEh}%a$5Zy}4gh}(vHh5H= z>w_$D$?3l1<2^Cv>V>zHO$g_y4lS=vXO=XbaO+X=y*WnXyzoR&)9q2O=`LmVv0Xap zj{ybUGF{=)f8^_KNG-ByKfv}I89>9=n7GH4)Ge5Vi#w=V*9zcp9egB{tV=-y$N~B7 z?x#6K>OuMP>RcjOJ1zXrg2#gv+B26$gfV+smJS>YNphBm1Tss)mUG2xlP=d$V^FK{ zTf~CWZDQr25<#p>kaR%RYHK;QP6XN^7L*ue1{6NWv!GgJiHyT_29?Ii50#rnj~z|} zr)L%w$E0y0kL!WVpV#AP`P=RcJBkyU^7;+P&`Dsq(RHj1_=J})h%&sM)wp5)so)RWyGm0}^J>hAB&%sPZ>|D_N757+T@1urfR?0VsiHlzPk>g${#;^Ic$c zrA3iFMlfe9dM+3mOK~zc&7c&IZ8|m|CUFF`UChIZIdK2HCZkp7tT16Cd&cu5dIB4W zlwj!pta~{R0*Z7Lp=Y*96!OKFIF+Kzr_NDQD*=HQ$vIe^zr@Ulh0==uid#}Db`%Fs z&m;KA^2!KGu`EFlMdIuimM?6`ig3Tkp9akC(7Mhn`Ap~Dd7h;LV42Wbb@{5RI&;m& zw;tcdpUAOyrr_O|>@wJGo81!T6d?ThcGCr>ao)RkUXHL1 zf(;-TP!I#8wxu!Nsm6E62}9?_Ml&o;0~+k`e8UY<-Fp4I{rAV%2}__dtnuJ^GrDJr zKG;eblQU4PpHs>CJ}p7ti2HMqE-X3w_D4X0*|DSJAN#;NH?@n-&Gj3}L#nBYoOKz) zyy&p2gX)?Wu*wSG#u3BEMdb{O`O0EnoOJSv{j@BNUXUO1ZZS-?y4JDs4rSk7ZKxNK z9FgLRbl``buCmOgesF-v@T9AB`p>9l2|lJtYj|Ybp7ge#l8~{R3<*W1AZI+fpKK4^8%} zrC&}`kkM&}9D4)PBV1L71?YaV{~tV2bm_%J!Xttfj+q+67wgD#=5{XBF==u}HhY~u z*yPA3Qpp?NGR;akb*>7zYWf=)gvIwXCA{Mlr+_6X;bD&NOjS<@>7Rk;(=BL7k{fGl zA^zi-)m11Y(VW3_q+BmtQupN?2Tp7&7--R}b?*DOb{=n?rm|c`+8Ty<_qB1;bRn?; zv_%+NVhV|%)=)d& zY`QItG)$?;NWs~1jDI+OAXp_wcOq!=F7M*P2o+A{emn5)FGTr!o<-e*R1C zVyOMcxu>=CqPKQIg0@#Hl-#cFhaw$c7bsHt3wLNfpE3&x7Oe)qi?>2{3Vtyj8!Ne8 z(Z`ucO3FJnz5H?#>W+%g!`1VxryQ?{zbCNi@$wdB8&(k!S^&LnTe>=gg=;Y`$>v{) zbqqB>n@v{KJ5f@6X66)vUGsC-hk#%?h0$!B-aN^jlUs&lYec#)x%rsBr-+y^Evvla zl1kJzy`B)ocQC#L#Ov{VZ(`tm5q13IocK+=SCy4?5}0^I`Ons%+DyFsb+`AL`-CX6 zKQ4nTm`6XQ{HGUE&3YPtNl?P3ACvV51f`psST4N~A3!r<7AEgcrfPkS8Y>v@;^TBv z8ADurL@=zO4mA_LW-D~OBp@pan|p_*Mq`oDx(Rchi0+)dS!pmdi8kY5iTgGoDik>` z`kE>d-3r|oj>pMaIg1TtKyRKZoa7ZtPVF>z)K6N6|B>NAXTV%ZDshbjGp73mp-eb+oWWTu-^wAGap^#D6ZCb@6t<_fcY&(Nd?U@3> zLJl(v0v=rn*^dQLPXsUUrC5k1rsJBE)-9;n-1m?UcSgC}%4v;NUJEJoHXQf?ICZ>1uWvC3udJ$ao8gc<`g7F)C^?IhPuqg*s%vSUCGr11@w)w=ptsMO zunsqXOCdWaAO%efrmMQ$^IOY!`;I7){6J03M`vO8PB%s}|_@UALfMwd11p zVpXGNrDi?cVlk&WVB>szV?p$=+G&&BW8;})uZ_OqC`q;jJ3}-$~Pe+iH7dkD7ajpWi!sQ#ev2WVp18OX8hV(FH=QtDnxx5Enyw zkB`F0<-5N7A4rO|u~qI9@?)f=YGpMCg|uLyx$;7x#54@$#th%K9=vVDltJDb^ScOLXvX^fjD$F^ZJEb{fB z{XZd>^|bRM`8$6p)~70v`in7bx9!$nYoCno4W-VcHlGmY2=hCVsm{e5H?K~myXDi0 z)r_+=!auloa5q2(Ns9Vj-Y)$0bRS=Vw2OLOA8EhI7j6=2 zysUq9y-0m)X`S-k6w{p9TJu$O-)^qRwRD;khg{RV#GuCAh11u^75LB%<0C5fQ6y;~ z|7*f(4@zn!{?AD-jng&wDow*-`k(ra+jKRlW+GSXr_I}E7$ znv945(6gUKg=jodPYb~9Ni>Dl&H*eCEZm4=b1&xa$qP@8h(;a{CfKM%RtniS^ifPe zFBw0Ekzg0C#z)5-S3)+f2b3thl?cjo78kS2eq$&{fTzW%}iaCvyEj%Yfz)r-I zPAc`consUqT=yDWYy?~LK%V=q>POg~{#$>lHWr7i|0iPMvc`K+I#B&hX{Xh{!|sZ` zBXlKCdy6l{Zs)@Z&oHk@QR_9|8 zl+DA8m}ctUO~M&4-fa?CJL7)xUH2tt%(^bxMh%yzDdCot*=|V$Ea<)nzwXkntQ2;h zX-ix68KdbMVVQ`Rl@-1xhP{!=t=h2J|ua#4NURhdP_0(5azu!f7vCuVlKBFBe*0w^5 zD0dPq%94Ddr8i^DDSry?bO&cv7Pd5N3^OXA?C;vTFXQ2~*6Bc9zAh>Rg$KUC3=g@N(yF=L^6jjChT(OCrN3=e z{~PoPsYZDjcWxsI?zo8AH<i-@WX{HL1kB`I!PP^)=h@JJoi)dI6`E%HBfW58E3f5%2 z3afUlb^Jx&^9>tJYs3qvFf)W_N|y5zqg-m`Zd^CxhlDG=>bfW5CvMg7wb!LHwr#}6 zD1mC60H6P{p{Boq3mdf-)2ri}6xUT8CtsLeXsGqia03(p|TnC_FlOiPeLt^}tQ?;sT&N-#k(8a;zN z5pJlZPSpd-i=!E{f|%uR7U>oD?VlJmtW=2N8Tlr%>)j!(LHy<*P&zSAM`pJ$1!Rf4 zFO#5K{Ze?GB?e0vfkFlF)b#)n6QKAm08r@ zm!qYI4xeC3v#{st^6&9l9ORz~uSlUAGFpX7siJ8k>M{FJ6K>8gy8az4zjwMpx|T>8 z?raq)G}@93qO-`w_ZhyxTne8L$iJ2Ox_7FvWbwr>5mz3}j6z46oLZsUvfiKEZ7N6J z|0T9>^#0HZzQ!fQI?NuSq%#XN{rQGh((5Fz+#A}LEAStfQMhbO{;ZwgB`zW**U1jl zJBP1SoMy@fmW&)W2l3>CBc=6>a8@X#`aby=WuP6Q*EoEbZ_w{Tla|pEq}Eu241=K% z3(tIbtGGSoTcYbr6Od->op{G#Rl63eD5hZXJ58f`??&mM7Mgq0Z&%T*1R4b0U)X%S z{0Emr0~#mA&Uj6WI3mZ7=uwlVxs8DV=|x`229gA2zT{Z5&zd4G%UUr0fKs^MBO<|R z(Cz$*i<8r;f2x!;(kzrHL{^GWTt-)e89$8Y7ubdpAEbB^8kw2?A%V|B`7TyFkFSp) z+$;2hobPu4O;^`$xU}&j(Z<8Sem*KJE=C5;UNO~J6sFJdG}*5u3NY~Pgr9lx2QG8J z7Mr&*3~nPJ&uO`i%m04p+tqfY@u(QP9wTPs$tfXU4M+oe zcKJCq?3I|qz5b@1(A%wSP@y%$G}!5n=mWeBlWhlF5XKr(Vk9^E8 z-Qa9jI~{2^r!_DV4E;EIg6=nJ;dNtcn$H056kNaicTnX7Yk%3tD7`0}X3BcV{z^2f z7F90G3b%ZmRwR40u@F-m&Wqnn-|F-mY2?56?l#{rVe#(p4xt%PCDgQlW^D~;^L7`H zUVm$9*IFuC=A;}SHbfdiatjok*nD}mKp8-uEj)m8iAQB0kAZ(agMEvp#Zzl274X}1gA z6FDuFR-Y`gwYA>{p6c}t^P2U}E>vl9Y=9}DU}!(ir={-j^%)p#Uk`n7D=lg))76TJ5^|V)%@!1Eb6Sg1)I=WxgQbE!t$2)({*E_#; zhLK)iZs45OG!|EG*{T>B97prQP!k>o;Hf&J&MV;JfXOh1xrOx7cK?Bis4!IKDo#pa zuz8}Fv@!+2mCi_E!fF*u+YMkq09hgv6fL?JEqcR_YD#Gyp{Xw;{o%{3uBGk?ekLn* zetHE5RbI5T1L(pggeDa1!hp$h7lPX-6rR4Y!kiYHt$V07?Gm0!ADUujB+ot%IxQ_P z#SxU89z}R>IU5G_Wm0tg^OV%WQTClN!feB7?bGF_cpyb@%-fiPeZO^6!l^Sm8!#wg z;X;rMR2aq_YyGAg8`zd_<1x2Jyczq3#7QnqYZdh$`aRb^N+d_S-Id(cLnYrkt&jjO%b+mode z#p58qj(a#!2^b{Vd$Z?sVX?A49F$f8US7B3%Z)nG+){=uwH+L6l!Zbv@z|6vR81*h zD{)U%umAj>pgHtrFz^` zUtsKnY-RL>ZMW6QY~5#$s_j2JJEm?1cu|OzhV}57bt7qEyQ&||IIc#rrmo_Yoa8t{ zT8L5Fakjvwx^yUsYr48-+nR8LUuhRujEkKK8ygX^yS={5Bq}{9qb-!l8eLwW&d5&C z^(Sc(36oi&%2cEyv%&%Nd}QtOG}^_iKJ0gf-zS)%?4%=j4Y@42#LyHnVGseJT>EsI zf8~*1Fp*)l%$9L}W#jI*-q3gZd({@;P8RmTcLRMfd^TuK|34$s?ORLp`$WKa3JONk zz|9O>Jsc`%s?KqjAp~&(KkUg87l=TY$4%r^=w1djVUM?Y&0R)&ch7}m&t(BpGr4L& zA1^==kFMivo81HyhBf`+fxl$^seM0varY?N62RApiQGo=?`!DeH|AKD=~v&+YQ6ru z!wHYr-PRo;e>Vq*8#Pipd1kD`d_TKB=uOIp=^O>rOi2IAvRZI6Dm=_?E;L)rhgZN4 zcgNdxD%g)}@~b9!c*Rk3OOFVf-O&y3^U`g!V9HPJ>7>~?0kxCnzeFG6b8H@Fhh9D) z-!~n?hR*9@3C*LduthJ=U56_wEjc5@sl(M0`+BGHf>rm5Nd;mk-5W~#o4h@NXK>_4 z*Joe}ZX1OvzOlbxw8lH3zP^iQ*y+BvX&O437wN|%^2wuDn?|be@~kHw2CKQwJ@o_91V#W}5HDf=VRjG`jY{jM zX9Rc98VSgNOD#M6E`&w()h{48NF_1~WK$o6?nAT13hH)S(!qjA%bNIm4_~ABN}dew zWtczB!d9(Ks+;O%W|Xqu45_uJ|9ru6y|Yuq{nC&fC6vIW!>#$}ICauGEl4sNXcnta znJt8(#|aqidgST-)O{;+7(UIZ#L0M2U0zIbK=X~yb`eVW6O7rv{PY9a_PSs@MGRYJ z2+~=?#HxV!l)Zw_9JMkMD&vs*`}FTQTm@k;Sq}t5j`C;}!znd-nv&EPlRtdwlWsbdC0_(hRGP*H&9~>iQb#qa}=eI->Ts1dQ2NCb`-`myI7|7!C({KCtHJJQV(Lg2#fuMz4JGK2`YEk1ck?MnjK{!Aq@ zdypXAJ1bTr|9*vpAIh#^CG37|rTn$NUo-e8KL;YHgc~8Q7LVk4yN_=p>v{MgH7Bx6 z=W#Yv=RDRQQ5xM}78l&Va_iZvzY`odGzJi18hA=C+OP&k7B8n7*q4LxMTn~?OBH$~ zTm9+dXM_svBcCzeRgOV9a@^cZ%!GwX{k0M}w9`ae4Bc2d41gsJ_HPirpg%F=iK(gh za@v14WdkG}icPhG z8}nZQCOyIJs5}NAS7cH9g9vLe$YO1(vihm@E}FDxY&U#l#vDfA`$C3UHM&kP{w|M; zyMcBkyn@@m57!yZa!#=FPQ?0OeJ5?qGh3KdjqhPzKUP>h*BNjn>NOP@0*4~n!F#G~NFXlNn=aw4G28CuR&Ok!2sL)} zTioNuHjj#3bU4sbKCw3)S8;fMjrURIbOYxz1y&`=ZYjGmr0sylaWFP2p)3k#b%)%s z#U&1`n@pPCLr3L5AV3fFIjkI05G6~)-)s{;`dayKUSLxzUN5Fe=D1Y+e)8OKNn(FB z1|2rKksJmvyDgZ~?SXQwUF%%o39p>K2ck z4g1`2IRm3#=fqOxwDs|3-Ph%JJGT$|oyrkUuIL;%3<`e~LDI@%5KvTv$YAh?NcN+M zU8Y*lC6_Q&zW4N(QiX#EMj89;NF5Yt5+r-3y*v1mG{~7Im8cs8e$K`EGJe6TBMSeg zxt$>W`0OV>Q}#t_>sTzgC+!>r@rYP_`F?(Nejd4WQ{JZM@IkN*gw=d z5@COL`e>q9GaFl{EPaU!@$U%bXM2jZOqR31^kLI#gDLK{BY$y7A zEDb5vN5=Yz!}FVnxBNXP$SBPb*7e+v1ZYe{&p#j87#C7!#TS&zy;?@USiLjKGN)8T z_p@x9{hb2`KBeq6_JIBXJpBX3JuW(5Jh7!?EDxEwGG6jIFq*QYSVcmAka45^RNYt=tU%|W~(8WXJ|BjTx%6X zCGypY8c3uE{MP%!SyCV~nJeF6qwHn;PFxYsn+)gkq*OSMS)NNOzvYI8`1UStCf!e=cg}k z42^6Y_Xn;X{^+aj?c>Q;^-J=Q=UZ#*>gv3B4!!8PdWahX6sYD@brzvQ1qJ`k8UmZ2 z^y>AQN2Rp1w8)_D09=i%jz68KXt$#fU>Rz~YYD3D+ztu6D){fp^y#dV8__2p*{~gh zaC%yE;ECeF><)I5XsO@&7mZ(~(GVN0r;ZbOpjX(u#<=9+!v$B-8ks{JSifKoyItR| zPk(!U*}m!3Wwfe%vVYuJ)2tlO$!Xl?ZJ3ernA47`=T)>nu;lBtX(8-+Hh1W`IBEC! zq&h-qX(P`%ih6W+P-k;rHX!#~TZNYFzkyHMN=Cv3-ZFzQlHRPcAol=DdUYRx?4pHs z17??NP90=!`)K=--Qt-(YGlWWt9T8!ubNxe+6CgVGP`+t(Ab?@h+kp=J(l`8+f+u| z6cH=zLIfpxmh55Kl~a5==9xA7Y$J`EI1}at#cFwaxVG}+;J^C;Fe}WnOYQ!*v&~ok zZfEYcp!QQ|5oa}%7st#7jMkyf`EtHrtYPsBJJpMmWMuP&!9^dh_Ur~$ZM&nX>-%%3 zI=_3NIjyi+y>MP;1SGIHC_~H{8E7YoJOGK{$1uBmr(?8!=50*!$8KBq>4BW9hv$jK zHC+nk5iVagM8*4;F6swTJ)vewBr?b)Nl&>L9I@f5(>Cvra zzJZZi2|COfFi9*gB|JFF6^{zS&qV9lnuUO&fV`D18u~#nZu&r|43NYl1x~c+fdbuW zXj?Dc)@p)TbtiJA1dOBNI6De1ogB1JPdkmU|XwmjQItZq(`!o(lwkuW1J1N#|kwh@z7j{QXrVCN?Tqo)9W@nM3#+cn+Gj zFPyG!ZZDhWZ=8R97cZc#cKTINc_gtvc!N^%hjXJAUFw`D$Wm!h97dW)!|N~gWm>HE zT7n3qKXp~S7TU{-c3DCggbACU9SAr=wsmnFv@beyrMxjV$4Bq2cteZ--pg?+VtAE3 z(9kPiLCE`~20iq1g#kV*Kq*VT zX5c;$p#yh@4<26cVWfvcO05hBxQJ*4^cJ`lMY+%Fk*zVh$Br!9`C3kg^=lIKk2OZ9 zYqmoE|N76&E!e2?g%%9%`dn)T)IP7yPdf*H5hg9dCFHZt&Jo)eSXJ4PAeG`W%-oK^ zr=$>fK`RQD2<-(1UM3}pbjf%9nYkU^aQhB(_@s98&$q|gzwzuLtj8adg>Z(;D#K8N zI+6@)6(uEuU{^2!ORX6iWL7%jv7W>qb7O-te!G4BU0Ng(uss`SF>R)TmW zB@}?kwY}6ELH(@FN)LSx6+5l%flVMhOU7!z>{*=xhE<_%dT2O+gu>zNX2u~~8r5k7 zMuvH_zj$M#(n!qIP>;sg1m1e7Mv8C|Bg#SVjoY@bI539)5el3J0T2y>;~p2Jhtav; zk4>1L_ovnH+H|1XK$r9R6DXlxYmVD3X!2^(p>zu-YVs=H3jYAWwL(`r|8D&Lzg;=w z2&we+)yjgePtE@VzWzB32z<>UHE+_=?aBf4q85KH2H{S7Q^|gjd9G|}4Ks3S_x$N~ z;U&*#`ncjcY}z@2IBfLw%VF;~+VD)_KELS-2;7bdQ={_?LsC71peF?3SqXLeuXg>G zm#$wje7o&G{m7@Eu()wxkmZ_xI99*@Co14Yy^K^V6)&OmW4fV>t2`&-ZNuNOgqdoG z8`+n+d6x3O?94nGK22$U-sJSN`>&MiMre#dCz@r{a)S~H#_Y_^R0ePWFkkM6 zq5%j%Oo8$JczgDpSA0pn+<7)njD6*GI3TY?YEs4npr1Pa7hT_ET*KTvv?1H)um4o45OP0R%|3Vu^&}Loix_W)B9h5av)97-?(piJruGK80jvc>%do3aaP?kejhe3}cbr+xijtcd=yo9l zwq$|?nN3j0(6*9w2Pf+yC5h54haeQXQi+;M6ktkVESMLAh@($p+BU*bxWxE7XEICH zrRvbh%W9<8>(iWvuLIm>1qp1Gt(VsUoM|eqfUwWuZ%8CLn#oJZbY>aB7mRq+17``x zZ0ISMu*3(LCeg|pT3!ZaVkT^hZt2Wnj%*hItylgCfCO65cXt{M*Kv&D^m{(_`uV&T znQT015S#hDwycn|BI-tS!4k1!$2)RcWTt!}!LcE{?W)oAw$yycOyh=t3cL?(;{AGr zCq-L~H)aTUO|RWcG#AvK#g*k`E9?6UuHTSGg!~A+2Xw+)-_|7FtN%a^ zF$j|8@-RQ`(_bzRPdarynD{uNz?Wn*BQ(E&Y)DE2?H$h04D6hEb=Nv)GtS`uh1@OVPmO%cslu3Wny|qoARi8P;%yaxv^~ww_n! z#F7o%g0IT-(qFQ8kHp=34WPI8ib#}vDJYC)Wcx2Wau1no(%!bnG`-e(Ic>omFx7=h zUn>?f!#AKT9K{0_>7gAH3|NA#+v#rqnn1`h8$Os#sTt~oV+TcYreN)JjOTPp>!H>! zrxDAI1>>E8N;mHXKkezo-ZLUU#NY1v&#$gNaV31XrUQMDHm`Wa7q406r!Dm=6Z0OFPqo* z4Z^-v#l~(|bt&Lo)2IeTgz3y&e~+8UnbrmJD!z6XrMANAezYzU;0`uJN0TI_g~sHl zMxw|@qZHTL+^Sxdb|zKfObZ9J$J8JrAXnzW^{m*e{46vZa zhnMFow%d2RcWb(X#Ww{NDMhjd$O0gvU2=FUA^={u;VdWxz&4;100o$XXzj2T0INxA z=eqc|+wcAK@`j$M!WUofzQ673G&6dClQ37eI~t^sYu9 zsZl2rMVc=G2E4Sw<%$Z9I@_Ij?Me-vCKfq1IY(xiBnDUn00000sgc9UihTm{<`~m$nu{G9;DT9N-i^+tI=1Qa8r5kz2>wH@E%Qq$W~14qut<*Z>F? z0G{&!01gm`W?2GcpdbVzG8VyNU}P0A8o&fafCU#LAwU8E6GGS#P+z?#Ww)HYnV1)@ zlc}R^*g{gAo~rG;dr5see)t-)MQ)@YLo(dqjOBa)LPF#K5Ey_Ai2zK;C5Aw-0pu8P zH~>rlYbZ4VSb!!%0vJso491i#YQw-gM3EvRWQH#Xp!Wd+9(rYoIAG}YwYGiZSU(jT z?@g23y*6WQH@$bY-AB=Itm<7acF!dv)Cn)bjyqOz@zmWWgaQmGv2fs^F<2RG(zyqO z5RL2x9o!)($sH9y-Q;^_T9N?Sby zF^s)@?Ml45h>O{M$0Q{(YC&(Vrjk-GeA9W%WkKM}UI0v1F3xBHjM<7Lv_QvnXNcoa zFfVxFo5IlTmFahei}4PqcHBL`(XEr-Q5Hc2uoEQfJk@jsY;q4X zGolc4xpmpPj=!h_Y++$3gFb)tvk0exRENk8fCRKn?kx065I}%Lu;S|O`moM&#pSi% zN-Mt|ZPC?jOKRO-bsv74U0e(9ue(SS;US82lB6hwH2~(q^8^jhQ_2zrKoAMsva*@1 zFWSrNaecSlv(}=lr5J()g5)Jxz^JVH`uyxqFRMf9N-ikCwt|9EfC8WZr2tq9U<3e~ z;ZU3J_1$f|J&1C;u-#T}UdM&DCc=V|0xSR)00^ZF7(zJ~Pym*YF+vto3V_u_r1FdN z&Vt(#XkFV4UU0naT~_;8jAf;Mxc9|gUQ&6!`^H}1v)jkzl~b__0qEP*q>2qUvo0?v zW^`Atd(z+EZQIV%E;H$}YER#IS>Wgw$_lv448RG;BGaz8RD-UJz3^#|buy*Vn{O=_ zC;rV}{=UfRuCz$=>iy!5yYi09Sd1B%?_yUH;4GZc#EzB83AAGYfB@);L*5)VUsfTY zlhCg|b@U{rqBZXB>0Nz!2IXgwEp~!9BH7g9us2`*@pAVgTs^O@%g6uzfV9`wsyoLT zm!7qCRQI&hVVsTJYJQ_WTt|+*r}vK6(rKpZ$~I4oF7dnzORQ3$lU0*J706hsZaE}~ zUASBUB%9=({*-Ou3O8JpD`>pdWw8=9ZeAohp&DR}%Wf7~VIm<_MsqT|z);zmnk`im zh6Kr_N)9AqYoK*#7N|%l5tzy?S~_C`Gn?u_TBMB@v^w0Tl{xQ|?0Vi7qrpea7!;SVivK(7`6^rElx^XJ$9>0HnH zJlwebE}F*!Bp!h}u}1ao)(t_vS|%o3ghlm=MUI(70SkhIN`ykj87^X@H;pRfsAoOU zGcLV9pZQeeO@8EkkxxA8#jUh*Q8Kx&5V1*S!Jy7r+U{k2+I5JxV3=;^^E|beuRoZ_`ar*`GoSY^&!j{lty#X+t<|A$cn#CCLEzMFfW80Ni z3OLq|1$%j779~}-9E>9CBXk<(YFvhxj1mPRc32MUO=y}#TMPh0$0yrZiz%A~ESB>S5YjGp>sI+K zj5@fO#STxl>}9rP=f$69KK`|Wh;eSM^`hx4t3r}cBzShsa|}Qhmj#s_6ezn0Sy@?_ z4!7=$=Vspr_x;ngr3HXu(R!qnU0hCfQJCrqU)}!Tyt$neDnz0n00AhtmV#0WunlJc z8q5K}0KlLP)_EVD`kj0z#L#`#-OuX{>qH2kKpC)Lz!Cri03`qd0{{@S3^8lY8ZoIh z4v|%mTK1jx@=~uhyVJj?=6LNqU3OSQc(Vop)}vQ4 z=yL4}uVk;TySMvYcVEvnge;~SZ}*y43!?hN*K5AY>L#yu`cN8B7^`n_f6*yvh)h0> zLeRHH8Cq8+i&xjYlj+XHk5KfhD}}7~WL9zvfRm>8i#sR4ffK?Nh!M-Z7J$FO2636;_ve(z7dkA;8w3f_p zrb{ntJsA(YC*Rht>a@LEoh`x5R=!u?dB8an7d)Z|3LX=VsEpKejn}qz1i+S^*}w{L zN!GGg3P?8aQdRQ3`$;V`x3Kap@x%<1iCISIQwV~`W0imydgr1R7M~ODUicJ#=sb~YeK9cfRVt%lsMpS z+Jy+%Qb}qCV8U|_U;w}nlp+KSzT05&XR8~_eHfH4NJEMPkx40~PA`rXX#tZGcw zd9w5n^~%4K-~y1hbBwR#@mf_Dl?Xdn=Z;UH;4MPLiwdC!BmmbVs##z`&P!J1eB6DV zcWpP>i+-UmZ=Yc*KQI66fDDwTI5LzJBj%9tz9EVVzK(W?i32DhP!c@{Ln?KsvINnA z2I)?3eTlr8#rNO`%bs<&ZEW(|^fpLGWD=4zdo#&4Kzyzg0A<;HOWAQ@zFXyZrJYGv z+TFGb{R`$uq|Iti9H~(y>3}9nWKfJv@E*S!ygG zgyfer))ED&pwM3Yn#JO!41^8DjSR(p*wv1OP3(7PU`Kuo)tT=j16OM_qvQplbz*>r ziz6=`fZOG#ORS`3<-qS69mNH1i#>i{aI*KT*ZsOY_|fH;upA|e%K}O7;)DzrV9iny zSxkVDEP%lvZZqXsB5P_j*|m5hEl+syN{(S}DDwL30hqX2|hT!gZWi=!D&j7c*T(L%P^G90tg zlI_lJ@@C>~?qF?O z*WcUYZ|VpqUE{@e=HAeq7Jx`H4*=N#Nju}4OqnV!Hy|(^0a~-&Y^630YqxvFEzGm@ z)hp%Qs#o3H--NRFwzu`6 zQ<6n6&_$`NHL})Pq1n5xZGH9QC+BJV&EI?b8kY@?mjOt_SxPBDDfrp~U@ZWcGY8ii zKECU|JH6?)doY9t_v)v~KmO-na2Xby10Ggb762laGQ^gMDLil1Zm)mq=UQL|nZEVA zZ3JlLQLI7$c+tj7>}J&Tre5pqen-cvazfudn*H|9nlewH?d^1nE3xd-%GInGp1$#( zg@d0SqTcQzbY!6q=gx2!3TSic@ z;LVc>v@8%Pi5@9ZUD%_QQ+yybM)l=SY>dIQg2uXJvdw(rg4_vwf zI*~L;wZ@ z8Q31g15k*-;{YDV7|1)u1X-;yjwrh?v~I>magiBXy|%X6W^qS|N4*ub+^y@E*J%vP zMU3${>tY&ZW%aI$0sy%nC$!OWyx;38ZHi=OyyJJ;#&Mf(aDzdkTFgcJS=(F#X*49o zEOoPe1&$Hw>RKSKIF)frFybH*0aEa2#36tZL<+?2(MPN6e7McF^U$ETeVsYlJ#i&C zYndQVkRUbCufpha&NFUrILT3v8xIuJw@eyxe*m|98$of8 z?w1}V)%E54K<+PWyxP=v{C03xw&(Oxx0twDu(}j`%2ZFmqUIe9o~xJmG9t5Kpgc-| zW`Wf^{Jz)E)AnQi1lPP`jM(6bQ!0{lsqo`!1WP+mRQ2udNYZ<~Q)>wclpnLNuiJX+ ztIg9(sKC4;1OR|LOMJX67MsOT8pSdiMNx(%GADE(D$q$hJu5@_;yD&)} zN}H(og*xN$QWz!XRX&6Q3Uu?4_yFYzV5Pz{LEs)JV=4#|p?af!v$vZU#|Zmt_}`Ujjb}fv?)K-sZ8y`j z4)>>EA z65j58&&}PNnqAVg@aOOSum6wV|Kxwa>8%u?02nX;r4%dySbzcm!vMel228++ff$-N zKmdTI*0gldrElKP9c5UM3TVy5s2&#sunXIV;pI1Z<=ERcUoX3>)_u2Km&tYB!c(dD z_j~#?U7O)iZfAF=uFXs`c8^l=PIdvsm!r^9^}Lz3m7HD3>S`;H3rFh8FM=q!Ag`Vo zmUD5(67xR(I5{hKnX60A?;?3Q?51?u)p-c=bn1*8O;E*hq=JO0g4QTOdf;+Fv(~9R=mge26lG!^R(Wb zmv4_)qj#5Soz->up3Syf(6G2h38jkKMHkGubc-DrKnCgoj7DdLA|!HtkCWhpP{Mp{ z4K80Z2c8Z_mA1IC77x5!gh|1cZd~celn_FO@2Xrgrxp|iCyFso z=mwWxP*!Er-Dpk@aVYMUBSS$1TF<79E0cl+*~M`JJWSvG4uA{M1K2MDmp0-5#%4uF8TONip6 z?+nn$5g1rDjR7`r(tMxJ#(@EF2RAnW4j4ep4P^B~0C0CdoG*3nKCkAqeq+sUJ-x=Y z?ltgE2&F|wR?qJCbG@r+u}p@rqqi)%sf8!G6}@E<^NR>)v3J^85#IH?>yJA>+*0km z>ZcqN3WES5=BN`1jQ~;Um{;zdF3)R37J_(7buDN7E?X@pmK}MD!KSPkVf0GWg;1ZOg&U$=pkT95P-47S+tp(USqzVT8GCyI@k#%LR-iP~1~)cE$e%h&F2u$APEUG{=pq5AMsi14ez z3kRHt2p%Y|EfR=o>f|M;KYY4=b~i8giOha=_icOHtZnJo#Vy$`dh4M4^Q5nR`B#5! z&K*uWXCN zs^xWCSD?FHW_QVZby64GUD$kowD&c=zIR;=-F89=ZYCJLiP$uYOklr9 zL`}ybV&w2jx@As?Mtd%7| zBs;J+(KJm1wr#_;6l}w_VB3M~CTj3Qzwv&x{r~>+{lEUsk*r>W$9v

rBiA*?WffqMX;kY1QJ3ax+c_>(aXaC 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 z�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�V&cf98l_(5@L`l&e{0;dCbMKTQCKX~ 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 z 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⪙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 z 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 diff --git a/src/apps/blazor/client/App.razor b/src/apps/blazor/client/App.razor deleted file mode 100644 index 95fc72e0f0..0000000000 --- a/src/apps/blazor/client/App.razor +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - @if (@context.User.Identity?.IsAuthenticated is true) - { -

You are not authorized to be here.

- } - else - { - - } - - - - - - - - - - \ No newline at end of file diff --git a/src/apps/blazor/client/Client.csproj b/src/apps/blazor/client/Client.csproj deleted file mode 100644 index 9b732733b7..0000000000 --- a/src/apps/blazor/client/Client.csproj +++ /dev/null @@ -1,27 +0,0 @@ - - - - net9.0 - enable - enable - FSH.Starter.Blazor.Client - FSH.Starter.Blazor.Client - service-worker-assets.js - - - - - - - - - - - - - - - - - - diff --git a/src/apps/blazor/client/Components/ApiHelper.cs b/src/apps/blazor/client/Components/ApiHelper.cs deleted file mode 100644 index 8c6522a460..0000000000 --- a/src/apps/blazor/client/Components/ApiHelper.cs +++ /dev/null @@ -1,70 +0,0 @@ -using FSH.Starter.Blazor.Infrastructure.Api; -using Microsoft.AspNetCore.Components; -using MudBlazor; - -namespace FSH.Starter.Blazor.Client.Components; - -public static class ApiHelper -{ - public static async Task ExecuteCallGuardedAsync( - Func> call, - ISnackbar snackbar, - NavigationManager navigationManager, - FshValidation? customValidation = null, - string? successMessage = null) - { - customValidation?.ClearErrors(); - try - { - var result = await call(); - - if (!string.IsNullOrWhiteSpace(successMessage)) - { - snackbar.Add(successMessage, Severity.Info); - } - - return result; - } - catch (ApiException ex) - { - if (ex.StatusCode == 401) - { - navigationManager.NavigateTo("/logout"); - } - var message = ex.Message switch - { - "TypeError: Failed to fetch" => "Unable to Reach API", - _ => ex.Message - }; - snackbar.Add(message, Severity.Error); - } - - return default; - } - - public static async Task ExecuteCallGuardedAsync( - Func call, - ISnackbar snackbar, - FshValidation? customValidation = null, - string? successMessage = null) - { - customValidation?.ClearErrors(); - try - { - await call(); - - if (!string.IsNullOrWhiteSpace(successMessage)) - { - snackbar.Add(successMessage, Severity.Success); - } - - return true; - } - catch (ApiException ex) - { - snackbar.Add(ex.Message, Severity.Error); - } - - return false; - } -} diff --git a/src/apps/blazor/client/Components/Common/CustomValidation.cs b/src/apps/blazor/client/Components/Common/CustomValidation.cs deleted file mode 100644 index 66ea933dad..0000000000 --- a/src/apps/blazor/client/Components/Common/CustomValidation.cs +++ /dev/null @@ -1,51 +0,0 @@ -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.Components.Forms; - -namespace FSH.Starter.Blazor.Client.Components.Common; - -// See https://docs.microsoft.com/en-us/aspnet/core/blazor/forms-validation?view=aspnetcore-6.0#server-validation-with-a-validator-component -public class CustomValidation : ComponentBase -{ - private ValidationMessageStore? _messageStore; - - [CascadingParameter] - private EditContext? CurrentEditContext { get; set; } - - protected override void OnInitialized() - { - if (CurrentEditContext is null) - { - throw new InvalidOperationException( - $"{nameof(CustomValidation)} requires a cascading " + - $"parameter of type {nameof(EditContext)}. " + - $"For example, you can use {nameof(CustomValidation)} " + - $"inside an {nameof(EditForm)}."); - } - - _messageStore = new(CurrentEditContext); - - CurrentEditContext.OnValidationRequested += (s, e) => - _messageStore?.Clear(); - CurrentEditContext.OnFieldChanged += (s, e) => - _messageStore?.Clear(e.FieldIdentifier); - } - - public void DisplayErrors(IDictionary> errors) - { - if (CurrentEditContext is not null && errors is not null) - { - foreach (var err in errors) - { - _messageStore?.Add(CurrentEditContext.Field(err.Key), err.Value); - } - - CurrentEditContext.NotifyValidationStateChanged(); - } - } - - public void ClearErrors() - { - _messageStore?.Clear(); - CurrentEditContext?.NotifyValidationStateChanged(); - } -} \ No newline at end of file diff --git a/src/apps/blazor/client/Components/Common/DialogServiceExtensions.cs b/src/apps/blazor/client/Components/Common/DialogServiceExtensions.cs deleted file mode 100644 index 90fce2c71a..0000000000 --- a/src/apps/blazor/client/Components/Common/DialogServiceExtensions.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Microsoft.AspNetCore.Components; -using MudBlazor; - -namespace FSH.Starter.Blazor.Client.Components.Common; - -public static class DialogServiceExtensions -{ - public static Task ShowModalAsync(this IDialogService dialogService, DialogParameters parameters) - where TDialog : ComponentBase => - dialogService.ShowModal(parameters).Result!; - - public static IDialogReference ShowModal(this IDialogService dialogService, DialogParameters parameters) - where TDialog : ComponentBase - { - var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Medium, FullWidth = true, BackdropClick = false }; - - return dialogService.Show(string.Empty, parameters, options); - } -} \ No newline at end of file diff --git a/src/apps/blazor/client/Components/Common/FshCustomError.razor b/src/apps/blazor/client/Components/Common/FshCustomError.razor deleted file mode 100644 index 827318bbf1..0000000000 --- a/src/apps/blazor/client/Components/Common/FshCustomError.razor +++ /dev/null @@ -1 +0,0 @@ -Oopsie !! 😔 \ No newline at end of file diff --git a/src/apps/blazor/client/Components/Common/FshTable.cs b/src/apps/blazor/client/Components/Common/FshTable.cs deleted file mode 100644 index 3ba9fdf2a4..0000000000 --- a/src/apps/blazor/client/Components/Common/FshTable.cs +++ /dev/null @@ -1,40 +0,0 @@ -using FSH.Starter.Blazor.Infrastructure.Notifications; -using FSH.Starter.Blazor.Infrastructure.Preferences; -using MediatR.Courier; -using Microsoft.AspNetCore.Components; -using MudBlazor; - -namespace FSH.Starter.Blazor.Client.Components.Common; - -public class FshTable : MudTable -{ - [Inject] - private IClientPreferenceManager ClientPreferences { get; set; } = default!; - [Inject] - protected ICourier Courier { get; set; } = default!; - - - protected override async Task OnInitializedAsync() - { - if (await ClientPreferences.GetPreference() is ClientPreference clientPreference) - { - SetTablePreference(clientPreference.TablePreference); - } - - Courier.SubscribeWeak>(wrapper => - { - SetTablePreference(wrapper.Notification); - StateHasChanged(); - }); - - await base.OnInitializedAsync(); - } - - private void SetTablePreference(FshTablePreference tablePreference) - { - Dense = tablePreference.IsDense; - Striped = tablePreference.IsStriped; - Bordered = tablePreference.HasBorder; - Hover = tablePreference.IsHoverable; - } -} diff --git a/src/apps/blazor/client/Components/Common/TablePager.razor b/src/apps/blazor/client/Components/Common/TablePager.razor deleted file mode 100644 index 71bb4ed697..0000000000 --- a/src/apps/blazor/client/Components/Common/TablePager.razor +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/apps/blazor/client/Components/Dialogs/DeleteConfirmation.razor b/src/apps/blazor/client/Components/Dialogs/DeleteConfirmation.razor deleted file mode 100644 index f69c2336e6..0000000000 --- a/src/apps/blazor/client/Components/Dialogs/DeleteConfirmation.razor +++ /dev/null @@ -1,29 +0,0 @@ - - - - - Delete Confirmation - - - - @ContentText - - - Cancel - Confirm - - - -@code { - [CascadingParameter] - IMudDialogInstance MudDialog { get; set; } = default!; - - [Parameter] - public string? ContentText { get; set; } - - void Submit() - { - MudDialog.Close(DialogResult.Ok(true)); - } - void Cancel() => MudDialog.Cancel(); -} \ No newline at end of file diff --git a/src/apps/blazor/client/Components/Dialogs/Logout.razor b/src/apps/blazor/client/Components/Dialogs/Logout.razor deleted file mode 100644 index 5a0d76f1fb..0000000000 --- a/src/apps/blazor/client/Components/Dialogs/Logout.razor +++ /dev/null @@ -1,39 +0,0 @@ -@namespace FSH.Starter.Blazor.Client.Components.Dialogs - - -@inject IAuthenticationService AuthService - - - - - - Logout Confirmation - - - - @ContentText - - - Cancel - @ButtonText - - - -@code { - [Parameter] public string? ContentText { get; set; } - - [Parameter] public string? ButtonText { get; set; } - - [Parameter] public Color Color { get; set; } - - [CascadingParameter] IMudDialogInstance MudDialog { get; set; } = default!; - - async Task Submit() - { - Navigation.NavigateTo("/logout"); - MudDialog.Close(DialogResult.Ok(true)); - } - - void Cancel() => - MudDialog.Cancel(); -} \ No newline at end of file diff --git a/src/apps/blazor/client/Components/EntityTable/AddEditModal.razor b/src/apps/blazor/client/Components/EntityTable/AddEditModal.razor deleted file mode 100644 index 4d18b0f3c5..0000000000 --- a/src/apps/blazor/client/Components/EntityTable/AddEditModal.razor +++ /dev/null @@ -1,49 +0,0 @@ -@typeparam TRequest - - - - - - - @if (IsCreate) - { - - } - else - { - - } - @Title - - - - - - - - - @ChildContent(RequestModel) - - - - - - - Cancel - - @if (IsCreate) - { - - Save - - } - else - { - - Update - - } - - - - \ No newline at end of file diff --git a/src/apps/blazor/client/Components/EntityTable/AddEditModal.razor.cs b/src/apps/blazor/client/Components/EntityTable/AddEditModal.razor.cs deleted file mode 100644 index dd1aa5efe2..0000000000 --- a/src/apps/blazor/client/Components/EntityTable/AddEditModal.razor.cs +++ /dev/null @@ -1,47 +0,0 @@ -using Microsoft.AspNetCore.Components; -using MudBlazor; - -namespace FSH.Starter.Blazor.Client.Components.EntityTable; - -public partial class AddEditModal : IAddEditModal -{ - [Parameter] - [EditorRequired] - public RenderFragment ChildContent { get; set; } = default!; - [Parameter] - [EditorRequired] - public TRequest RequestModel { get; set; } = default!; - [Parameter] - [EditorRequired] - public Func SaveFunc { get; set; } = default!; - [Parameter] - public Func? OnInitializedFunc { get; set; } - [Parameter] - [EditorRequired] - public string Title { get; set; } = default!; - [Parameter] - public bool IsCreate { get; set; } - [Parameter] - public string? SuccessMessage { get; set; } - - [CascadingParameter] - private IMudDialogInstance MudDialog { get; set; } = default!; - - private FshValidation? _customValidation; - - public void ForceRender() => StateHasChanged(); - - protected override Task OnInitializedAsync() => - OnInitializedFunc is not null - ? OnInitializedFunc() - : Task.CompletedTask; - - private async Task SaveAsync() - { - if (await ApiHelper.ExecuteCallGuardedAsync( - () => SaveFunc(RequestModel), Toast, _customValidation, SuccessMessage)) - { - MudDialog.Close(); - } - } -} \ No newline at end of file diff --git a/src/apps/blazor/client/Components/EntityTable/EntityClientTableContext.cs b/src/apps/blazor/client/Components/EntityTable/EntityClientTableContext.cs deleted file mode 100644 index b9d84fa8e7..0000000000 --- a/src/apps/blazor/client/Components/EntityTable/EntityClientTableContext.cs +++ /dev/null @@ -1,67 +0,0 @@ -namespace FSH.Starter.Blazor.Client.Components.EntityTable; - -/// -/// Initialization Context for the EntityTable Component. -/// Use this one if you want to use Client Paging, Sorting and Filtering. -/// -public class EntityClientTableContext - : EntityTableContext -{ - /// - /// A function that loads all the data for the table from the api and returns a ListResult of TEntity. - /// - public Func?>> LoadDataFunc { get; } - - /// - /// A function that returns a boolean which indicates whether the supplied entity meets the search criteria - /// (the supplied string is the search string entered). - /// - public Func SearchFunc { get; } - - public EntityClientTableContext( - List> fields, - Func?>> loadDataFunc, - Func searchFunc, - Func? idFunc = null, - Func>? getDefaultsFunc = null, - Func? createFunc = null, - Func>? getDetailsFunc = null, - Func? updateFunc = null, - Func? deleteFunc = null, - string? entityName = null, - string? entityNamePlural = null, - string? entityResource = null, - string? searchAction = null, - string? createAction = null, - string? updateAction = null, - string? deleteAction = null, - string? exportAction = null, - Func? editFormInitializedFunc = null, - Func? hasExtraActionsFunc = null, - Func? canUpdateEntityFunc = null, - Func? canDeleteEntityFunc = null) - : base( - fields, - idFunc, - getDefaultsFunc, - createFunc, - getDetailsFunc, - updateFunc, - deleteFunc, - entityName, - entityNamePlural, - entityResource, - searchAction, - createAction, - updateAction, - deleteAction, - exportAction, - editFormInitializedFunc, - hasExtraActionsFunc, - canUpdateEntityFunc, - canDeleteEntityFunc) - { - LoadDataFunc = loadDataFunc; - SearchFunc = searchFunc; - } -} \ No newline at end of file diff --git a/src/apps/blazor/client/Components/EntityTable/EntityField.cs b/src/apps/blazor/client/Components/EntityTable/EntityField.cs deleted file mode 100644 index 5b9d16eaf7..0000000000 --- a/src/apps/blazor/client/Components/EntityTable/EntityField.cs +++ /dev/null @@ -1,34 +0,0 @@ -using Microsoft.AspNetCore.Components; - -namespace FSH.Starter.Blazor.Client.Components.EntityTable; - -public record EntityField(Func ValueFunc, string DisplayName, string SortLabel = "", Type? Type = null, RenderFragment? Template = null) -{ - /// - /// A function that returns the actual value of this field from the supplied entity. - /// - public Func ValueFunc { get; init; } = ValueFunc; - - /// - /// The string that's shown on the UI for this field. - /// - public string DisplayName { get; init; } = DisplayName; - - /// - /// The string that's sent to the api as property to sort on for this field. - /// This is only relevant when using server side sorting. - /// - public string SortLabel { get; init; } = SortLabel; - - /// - /// The type of the field. Default is string, but when boolean, it shows as a checkbox. - /// - public Type? Type { get; init; } = Type; - - /// - /// When supplied this template will be used for this field in stead of the default template. - /// - public RenderFragment? Template { get; init; } = Template; - - public bool CheckedForSearch { get; set; } = true; -} diff --git a/src/apps/blazor/client/Components/EntityTable/EntityServerTableContext.cs b/src/apps/blazor/client/Components/EntityTable/EntityServerTableContext.cs deleted file mode 100644 index c2fb79527a..0000000000 --- a/src/apps/blazor/client/Components/EntityTable/EntityServerTableContext.cs +++ /dev/null @@ -1,66 +0,0 @@ -using FSH.Starter.Blazor.Infrastructure.Api; - -namespace FSH.Starter.Blazor.Client.Components.EntityTable; - -/// -/// Initialization Context for the EntityTable Component. -/// Use this one if you want to use Server Paging, Sorting and Filtering. -/// -public class EntityServerTableContext - : EntityTableContext -{ - /// - /// A function that loads the specified page from the api with the specified search criteria - /// and returns a PaginatedResult of TEntity. - /// - public Func>> SearchFunc { get; } - - public bool EnableAdvancedSearch { get; } - - public EntityServerTableContext( - List> fields, - Func>> searchFunc, - bool enableAdvancedSearch = false, - Func? idFunc = null, - Func>? getDefaultsFunc = null, - Func? createFunc = null, - Func>? getDetailsFunc = null, - Func? updateFunc = null, - Func? deleteFunc = null, - string? entityName = null, - string? entityNamePlural = null, - string? entityResource = null, - string? searchAction = null, - string? createAction = null, - string? updateAction = null, - string? deleteAction = null, - string? exportAction = null, - Func? editFormInitializedFunc = null, - Func? hasExtraActionsFunc = null, - Func? canUpdateEntityFunc = null, - Func? canDeleteEntityFunc = null) - : base( - fields, - idFunc, - getDefaultsFunc, - createFunc, - getDetailsFunc, - updateFunc, - deleteFunc, - entityName, - entityNamePlural, - entityResource, - searchAction, - createAction, - updateAction, - deleteAction, - exportAction, - editFormInitializedFunc, - hasExtraActionsFunc, - canUpdateEntityFunc, - canDeleteEntityFunc) - { - SearchFunc = searchFunc; - EnableAdvancedSearch = enableAdvancedSearch; - } -} \ No newline at end of file diff --git a/src/apps/blazor/client/Components/EntityTable/EntityTable.razor b/src/apps/blazor/client/Components/EntityTable/EntityTable.razor deleted file mode 100644 index cad1b9b48e..0000000000 --- a/src/apps/blazor/client/Components/EntityTable/EntityTable.razor +++ /dev/null @@ -1,150 +0,0 @@ -@typeparam TEntity -@typeparam TId -@typeparam TRequest - -@inject IJSRuntime JS - - - - - - - @if (_canSearch && (Context.AdvancedSearchEnabled || AdvancedSearchContent is not null)) - { - - - - @* @if (Context.AdvancedSearchEnabled) - { -
- - @foreach (var field in Context.Fields) - { - - } -
- } *@ - @AdvancedSearchContent - -
- } - - - - -
- @if (_canCreate) - { - Create - } - Reload -
- - @if (_canSearch && !_advancedSearchExpanded) - { - - - } -
- - - @if (Context.Fields is not null) - { - foreach (var field in Context.Fields) - { - - @if (Context.IsClientContext) - { - @field.DisplayName - } - else - { - @field.DisplayName - } - - } - } - Actions - - - - @foreach (var field in Context.Fields) - { - - @if (field.Template is not null) - { - @field.Template(context) - } - else if (field.Type == typeof(bool)) - { - - } - else - { - - } - - } - - @if (ActionsContent is not null) - { - @ActionsContent(context) - } - else if (HasActions) - { - - @if (CanUpdateEntity(context)) - { - Edit - } - @if (CanDeleteEntity(context)) - { - Delete - } - @if (ExtraActions is not null) - { - @ExtraActions(context) - } - - } - else - { - - No Allowed Actions - - } - - - - - - - -
- -
- - - -
\ No newline at end of file diff --git a/src/apps/blazor/client/Components/EntityTable/EntityTable.razor.cs b/src/apps/blazor/client/Components/EntityTable/EntityTable.razor.cs deleted file mode 100644 index fe7bd405cd..0000000000 --- a/src/apps/blazor/client/Components/EntityTable/EntityTable.razor.cs +++ /dev/null @@ -1,287 +0,0 @@ -using FSH.Starter.Blazor.Client.Components.Common; -using FSH.Starter.Blazor.Client.Components.Dialogs; -using FSH.Starter.Blazor.Infrastructure.Api; -using FSH.Starter.Blazor.Infrastructure.Auth; -using Mapster; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.Components.Authorization; -using MudBlazor; - -namespace FSH.Starter.Blazor.Client.Components.EntityTable; - -public partial class EntityTable - where TRequest : new() -{ - [Parameter] - [EditorRequired] - public EntityTableContext Context { get; set; } = default!; - - [Parameter] - public bool Loading { get; set; } - - [Parameter] - public string? SearchString { get; set; } - [Parameter] - public EventCallback SearchStringChanged { get; set; } - - [Parameter] - public RenderFragment? AdvancedSearchContent { get; set; } - - [Parameter] - public RenderFragment? ActionsContent { get; set; } - [Parameter] - public RenderFragment? ExtraActions { get; set; } - [Parameter] - public RenderFragment? ChildRowContent { get; set; } - - [Parameter] - public RenderFragment? EditFormContent { get; set; } - - [CascadingParameter] - protected Task AuthState { get; set; } = default!; - [Inject] - protected IAuthorizationService AuthService { get; set; } = default!; - - private bool _canSearch; - private bool _canCreate; - private bool _canUpdate; - private bool _canDelete; - private bool _canExport; - - private bool _advancedSearchExpanded; - - private MudTable _table = default!; - private IEnumerable? _entityList; - private int _totalItems; - - protected override async Task OnInitializedAsync() - { - var state = await AuthState; - _canSearch = await CanDoActionAsync(Context.SearchAction, state); - _canCreate = await CanDoActionAsync(Context.CreateAction, state); - _canUpdate = await CanDoActionAsync(Context.UpdateAction, state); - _canDelete = await CanDoActionAsync(Context.DeleteAction, state); - _canExport = await CanDoActionAsync(Context.ExportAction, state); - - await LocalLoadDataAsync(); - } - - public Task ReloadDataAsync() => - Context.IsClientContext - ? LocalLoadDataAsync() - : ServerLoadDataAsync(); - - private async Task CanDoActionAsync(string? action, AuthenticationState state) => - !string.IsNullOrWhiteSpace(action) && - (bool.TryParse(action, out bool isTrue) && isTrue || // check if action equals "True", then it's allowed - Context.EntityResource is { } resource && await AuthService.HasPermissionAsync(state.User, action, resource)); - - private bool HasActions => _canUpdate || _canDelete || Context.HasExtraActionsFunc is not null && Context.HasExtraActionsFunc(); - private bool CanUpdateEntity(TEntity entity) => _canUpdate && (Context.CanUpdateEntityFunc is null || Context.CanUpdateEntityFunc(entity)); - private bool CanDeleteEntity(TEntity entity) => _canDelete && (Context.CanDeleteEntityFunc is null || Context.CanDeleteEntityFunc(entity)); - - // Client side paging/filtering - private bool LocalSearch(TEntity entity) => - Context.ClientContext?.SearchFunc is { } searchFunc - ? searchFunc(SearchString, entity) - : string.IsNullOrWhiteSpace(SearchString); - - private async Task LocalLoadDataAsync() - { - if (Loading || Context.ClientContext is null) - { - return; - } - - Loading = true; - - if (await ApiHelper.ExecuteCallGuardedAsync( - () => Context.ClientContext.LoadDataFunc(), Toast, Navigation) - is List result) - { - _entityList = result; - } - - Loading = false; - } - - // Server Side paging/filtering - - private async Task OnSearchStringChanged(string? text = null) - { - await SearchStringChanged.InvokeAsync(SearchString); - - await ServerLoadDataAsync(); - } - - private async Task ServerLoadDataAsync() - { - if (Context.IsServerContext) - { - await _table.ReloadServerData(); - } - } - - private static bool GetBooleanValue(object valueFunc) - { - if (valueFunc is bool boolValue) - { - return boolValue; - } - return false; - } - - private Func>>? ServerReloadFunc => - Context.IsServerContext ? ServerReload : null; - - private async Task> ServerReload(TableState state, CancellationToken cancellationToken) - { - if (!Loading && Context.ServerContext is not null) - { - Loading = true; - - var filter = GetPaginationFilter(state); - - if (await ApiHelper.ExecuteCallGuardedAsync( - () => Context.ServerContext.SearchFunc(filter), Toast, Navigation) - is { } result) - { - _totalItems = result.TotalCount; - _entityList = result.Items; - } - - Loading = false; - } - - return new TableData { TotalItems = _totalItems, Items = _entityList }; - } - - - private PaginationFilter GetPaginationFilter(TableState state) - { - string[]? orderings = null; - if (!string.IsNullOrEmpty(state.SortLabel)) - { - orderings = state.SortDirection == SortDirection.None - ? new[] { $"{state.SortLabel}" } - : new[] { $"{state.SortLabel} {state.SortDirection}" }; - } - - var filter = new PaginationFilter - { - PageSize = state.PageSize, - PageNumber = state.Page + 1, - Keyword = SearchString, - OrderBy = orderings ?? Array.Empty() - }; - - if (!Context.AllColumnsChecked) - { - filter.AdvancedSearch = new() - { - Fields = Context.SearchFields, - Keyword = filter.Keyword - }; - filter.Keyword = null; - } - - return filter; - } - - private async Task InvokeModal(TEntity? entity = default) - { - bool isCreate = entity is null; - - var parameters = new DialogParameters() - { - { nameof(AddEditModal.ChildContent), EditFormContent }, - { nameof(AddEditModal.OnInitializedFunc), Context.EditFormInitializedFunc }, - { nameof(AddEditModal.IsCreate), isCreate } - }; - - Func saveFunc; - TRequest requestModel; - string title, successMessage; - - if (isCreate) - { - _ = Context.CreateFunc ?? throw new InvalidOperationException("CreateFunc can't be null!"); - - saveFunc = Context.CreateFunc; - - requestModel = - Context.GetDefaultsFunc is not null - && await ApiHelper.ExecuteCallGuardedAsync( - () => Context.GetDefaultsFunc(), Toast, Navigation) - is { } defaultsResult - ? defaultsResult - : new TRequest(); - - title = $"Create {Context.EntityName}"; - successMessage = $"{Context.EntityName} Created"; - } - else - { - _ = Context.IdFunc ?? throw new InvalidOperationException("IdFunc can't be null!"); - _ = Context.UpdateFunc ?? throw new InvalidOperationException("UpdateFunc can't be null!"); - - var id = Context.IdFunc(entity!); - - saveFunc = request => Context.UpdateFunc(id, request); - - requestModel = - Context.GetDetailsFunc is not null - && await ApiHelper.ExecuteCallGuardedAsync( - () => Context.GetDetailsFunc(id!), - Toast, Navigation) - is { } detailsResult - ? detailsResult - : entity!.Adapt(); - - title = $"Edit {Context.EntityName}"; - successMessage = $"{Context.EntityName}Updated"; - } - - parameters.Add(nameof(AddEditModal.SaveFunc), saveFunc); - parameters.Add(nameof(AddEditModal.RequestModel), requestModel); - parameters.Add(nameof(AddEditModal.Title), title); - parameters.Add(nameof(AddEditModal.SuccessMessage), successMessage); - - var dialog = DialogService.ShowModal>(parameters); - - Context.SetAddEditModalRef(dialog); - - var result = await dialog.Result; - - if (!result!.Canceled) - { - await ReloadDataAsync(); - } - } - - private async Task Delete(TEntity entity) - { - _ = Context.IdFunc ?? throw new InvalidOperationException("IdFunc can't be null!"); - TId id = Context.IdFunc(entity); - - string deleteContent = "You're sure you want to delete {0} with id '{1}'?"; - var parameters = new DialogParameters - { - { nameof(DeleteConfirmation.ContentText), string.Format(deleteContent, Context.EntityName, id) } - }; - var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small, FullWidth = true, BackdropClick = false }; - var dialog = DialogService.Show("Delete", parameters, options); - var result = await dialog.Result; - if (!result!.Canceled) - { - _ = Context.DeleteFunc ?? throw new InvalidOperationException("DeleteFunc can't be null!"); - - await ApiHelper.ExecuteCallGuardedAsync( - () => Context.DeleteFunc(id), - Toast); - - await ReloadDataAsync(); - } - } -} diff --git a/src/apps/blazor/client/Components/EntityTable/EntityTableContext.cs b/src/apps/blazor/client/Components/EntityTable/EntityTableContext.cs deleted file mode 100644 index 336e256ef9..0000000000 --- a/src/apps/blazor/client/Components/EntityTable/EntityTableContext.cs +++ /dev/null @@ -1,197 +0,0 @@ -using FSH.Starter.Shared.Authorization; -using MudBlazor; - -namespace FSH.Starter.Blazor.Client.Components.EntityTable; - -/// -/// Abstract base class for the initialization Context of the EntityTable Component. -/// -/// The type of the entity. -/// The type of the id of the entity. -/// The type of the Request which is used on the AddEditModal and which is sent with the CreateFunc and UpdateFunc. -public abstract class EntityTableContext -{ - /// - /// The columns you want to display on the table. - /// - public List> Fields { get; } - - /// - /// A function that returns the Id of the entity. This is only needed when using the CRUD functionality. - /// - public Func? IdFunc { get; } - - /// - /// A function that executes the GetDefaults method on the api (or supplies defaults locally) and returns - /// a Task of Result of TRequest. When not supplied, a TRequest is simply newed up. - /// No need to check for error messages or api exceptions. These are automatically handled by the component. - /// - public Func>? GetDefaultsFunc { get; } - - /// - /// A function that executes the Create method on the api with the supplied entity and returns a Task of Result. - /// No need to check for error messages or api exceptions. These are automatically handled by the component. - /// - public Func? CreateFunc { get; } - - /// - /// A function that executes the GetDetails method on the api with the supplied Id and returns a Task of Result of TRequest. - /// No need to check for error messages or api exceptions. These are automatically handled by the component. - /// When not supplied, the TEntity out of the _entityList is supplied using the IdFunc and converted using mapster. - /// - public Func>? GetDetailsFunc { get; } - - /// - /// A function that executes the Update method on the api with the supplied entity and returns a Task of Result. - /// When not supplied, the TEntity from the list is mapped to TCreateRequest using mapster. - /// No need to check for error messages or api exceptions. These are automatically handled by the component. - /// - public Func? UpdateFunc { get; } - - /// - /// A function that executes the Delete method on the api with the supplied entity id and returns a Task of Result. - /// No need to check for error messages or api exceptions. These are automatically handled by the component. - /// - public Func? DeleteFunc { get; } - - /// - /// The name of the entity. This is used in the title of the add/edit modal and delete confirmation. - /// - public string? EntityName { get; } - - /// - /// The plural name of the entity. This is used in the "Search for ..." placeholder. - /// - public string? EntityNamePlural { get; } - - /// - /// The FSHResource that is representing this entity. This is used in combination with the xxActions to check for permissions. - /// - public string? EntityResource { get; } - - /// - /// The FSHAction name of the search permission. This is FSHAction.Search by default. - /// When empty, no search functionality will be available. - /// When the string is "true", search funtionality will be enabled, - /// otherwise it will only be enabled if the user has permission for this action on the EntityResource. - /// - public string SearchAction { get; } - - /// - /// The permission name of the create permission. This is FSHAction.Create by default. - /// When empty, no create functionality will be available. - /// When the string "true", create funtionality will be enabled, - /// otherwise it will only be enabled if the user has permission for this action on the EntityResource. - /// - public string CreateAction { get; } - - /// - /// The permission name of the update permission. This is FSHAction.Update by default. - /// When empty, no update functionality will be available. - /// When the string is "true", update funtionality will be enabled, - /// otherwise it will only be enabled if the user has permission for this action on the EntityResource. - /// - public string UpdateAction { get; } - - /// - /// The permission name of the delete permission. This is FSHAction.Delete by default. - /// When empty, no delete functionality will be available. - /// When the string is "true", delete funtionality will be enabled, - /// otherwise it will only be enabled if the user has permission for this action on the EntityResource. - /// - public string DeleteAction { get; } - - /// - /// The permission name of the export permission. This is FSHAction.Export by default. - /// - public string ExportAction { get; } - - /// - /// Use this if you want to run initialization during OnInitialized of the AddEdit form. - /// - public Func? EditFormInitializedFunc { get; } - - /// - /// Use this if you want to check for permissions of content in the ExtraActions RenderFragment. - /// The extra actions won't be available when this returns false. - /// - public Func? HasExtraActionsFunc { get; set; } - - /// - /// Use this if you want to disable the update functionality for specific entities in the table. - /// - public Func? CanUpdateEntityFunc { get; set; } - - /// - /// Use this if you want to disable the delete functionality for specific entities in the table. - /// - public Func? CanDeleteEntityFunc { get; set; } - - public EntityTableContext( - List> fields, - Func? idFunc, - Func>? getDefaultsFunc, - Func? createFunc, - Func>? getDetailsFunc, - Func? updateFunc, - Func? deleteFunc, - string? entityName, - string? entityNamePlural, - string? entityResource, - string? searchAction, - string? createAction, - string? updateAction, - string? deleteAction, - string? exportAction, - Func? editFormInitializedFunc, - Func? hasExtraActionsFunc, - Func? canUpdateEntityFunc, - Func? canDeleteEntityFunc) - { - EntityResource = entityResource; - Fields = fields; - EntityName = entityName; - EntityNamePlural = entityNamePlural; - IdFunc = idFunc; - GetDefaultsFunc = getDefaultsFunc; - CreateFunc = createFunc; - GetDetailsFunc = getDetailsFunc; - UpdateFunc = updateFunc; - DeleteFunc = deleteFunc; - SearchAction = searchAction ?? FshActions.Search; - CreateAction = createAction ?? FshActions.Create; - UpdateAction = updateAction ?? FshActions.Update; - DeleteAction = deleteAction ?? FshActions.Delete; - ExportAction = exportAction ?? FshActions.Export; - EditFormInitializedFunc = editFormInitializedFunc; - HasExtraActionsFunc = hasExtraActionsFunc; - CanUpdateEntityFunc = canUpdateEntityFunc; - CanDeleteEntityFunc = canDeleteEntityFunc; - } - - // AddEdit modal - private IDialogReference? _addEditModalRef; - - internal void SetAddEditModalRef(IDialogReference dialog) => - _addEditModalRef = dialog; - - public IAddEditModal AddEditModal => - _addEditModalRef?.Dialog as IAddEditModal - ?? throw new InvalidOperationException("AddEditModal is only available when the modal is shown."); - - // Shortcuts - public EntityClientTableContext? ClientContext => this as EntityClientTableContext; - public EntityServerTableContext? ServerContext => this as EntityServerTableContext; - public bool IsClientContext => ClientContext is not null; - public bool IsServerContext => ServerContext is not null; - - // Advanced Search - public bool AllColumnsChecked => - Fields.All(f => f.CheckedForSearch); - public void AllColumnsCheckChanged(bool checkAll) => - Fields.ForEach(f => f.CheckedForSearch = checkAll); - public bool AdvancedSearchEnabled => - ServerContext?.EnableAdvancedSearch is true; - public List SearchFields => - Fields.Where(f => f.CheckedForSearch).Select(f => f.SortLabel).ToList(); -} diff --git a/src/apps/blazor/client/Components/EntityTable/IAddEditModal.cs b/src/apps/blazor/client/Components/EntityTable/IAddEditModal.cs deleted file mode 100644 index 3ba1ea09bd..0000000000 --- a/src/apps/blazor/client/Components/EntityTable/IAddEditModal.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace FSH.Starter.Blazor.Client.Components.EntityTable; - -public interface IAddEditModal -{ - TRequest RequestModel { get; } - bool IsCreate { get; } - void ForceRender(); -} \ No newline at end of file diff --git a/src/apps/blazor/client/Components/EntityTable/PaginationResponse.cs b/src/apps/blazor/client/Components/EntityTable/PaginationResponse.cs deleted file mode 100644 index 07451aced2..0000000000 --- a/src/apps/blazor/client/Components/EntityTable/PaginationResponse.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace FSH.Starter.Blazor.Client.Components.EntityTable; - -public class PaginationResponse -{ - public List Items { get; set; } = default!; - public int TotalCount { get; set; } - public int CurrentPage { get; set; } = 1; - public int PageSize { get; set; } = 10; -} diff --git a/src/apps/blazor/client/Components/FshValidation.cs b/src/apps/blazor/client/Components/FshValidation.cs deleted file mode 100644 index 1f3ba24ebb..0000000000 --- a/src/apps/blazor/client/Components/FshValidation.cs +++ /dev/null @@ -1,51 +0,0 @@ -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.Components.Forms; - -namespace FSH.Starter.Blazor.Client.Components; - -// See https://docs.microsoft.com/en-us/aspnet/core/blazor/forms-validation?view=aspnetcore-6.0#server-validation-with-a-validator-component -public class FshValidation : ComponentBase -{ - private ValidationMessageStore? _messageStore; - - [CascadingParameter] - private EditContext? CurrentEditContext { get; set; } - - protected override void OnInitialized() - { - if (CurrentEditContext is null) - { - throw new InvalidOperationException( - $"{nameof(FshValidation)} requires a cascading " + - $"parameter of type {nameof(EditContext)}. " + - $"For example, you can use {nameof(FshValidation)} " + - $"inside an {nameof(EditForm)}."); - } - - _messageStore = new(CurrentEditContext); - - CurrentEditContext.OnValidationRequested += (s, e) => - _messageStore?.Clear(); - CurrentEditContext.OnFieldChanged += (s, e) => - _messageStore?.Clear(e.FieldIdentifier); - } - - public void DisplayErrors(IDictionary> errors) - { - if (CurrentEditContext is not null && errors is not null) - { - foreach (var err in errors) - { - _messageStore?.Add(CurrentEditContext.Field(err.Key), err.Value); - } - - CurrentEditContext.NotifyValidationStateChanged(); - } - } - - public void ClearErrors() - { - _messageStore?.Clear(); - CurrentEditContext?.NotifyValidationStateChanged(); - } -} \ No newline at end of file diff --git a/src/apps/blazor/client/Components/General/PageHeader.razor b/src/apps/blazor/client/Components/General/PageHeader.razor deleted file mode 100644 index 07fa0453bb..0000000000 --- a/src/apps/blazor/client/Components/General/PageHeader.razor +++ /dev/null @@ -1,16 +0,0 @@ -@using MudBlazor -
- @Title - @Header - @SubHeader -
-@code { - [Parameter] - public required string Title { get; set; } - - [Parameter] - public required string Header { get; set; } - - [Parameter] - public required string SubHeader { get; set; } -} diff --git a/src/apps/blazor/client/Components/PersonCard.razor b/src/apps/blazor/client/Components/PersonCard.razor deleted file mode 100644 index 15ea230760..0000000000 --- a/src/apps/blazor/client/Components/PersonCard.razor +++ /dev/null @@ -1,21 +0,0 @@ - - - - @if (string.IsNullOrEmpty(this.ImageUri)) - { - @FullName?.ToUpper().FirstOrDefault() - - } - else - { - - - - } - - - @FullName - @Email - - - diff --git a/src/apps/blazor/client/Components/PersonCard.razor.cs b/src/apps/blazor/client/Components/PersonCard.razor.cs deleted file mode 100644 index 23762f0e93..0000000000 --- a/src/apps/blazor/client/Components/PersonCard.razor.cs +++ /dev/null @@ -1,44 +0,0 @@ -using FSH.Starter.Shared.Authorization; -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.Components.Authorization; -namespace FSH.Starter.Blazor.Client.Components; - -public partial class PersonCard -{ - [Parameter] - public string? Class { get; set; } - [Parameter] - public string? Style { get; set; } - - [CascadingParameter] - protected Task AuthState { get; set; } = default!; - - private string? UserId { get; set; } - private string? Email { get; set; } - private string? FullName { get; set; } - private string? ImageUri { get; set; } - - protected override async Task OnAfterRenderAsync(bool firstRender) - { - if (firstRender) - { - await LoadUserData(); - } - } - - private async Task LoadUserData() - { - var user = (await AuthState).User; - if (user.Identity?.IsAuthenticated == true && string.IsNullOrEmpty(UserId)) - { - FullName = user.GetFullName(); - UserId = user.GetUserId(); - Email = user.GetEmail(); - if (user.GetImageUrl() != null) - { - ImageUri = user.GetImageUrl()!.ToString(); - } - StateHasChanged(); - } - } -} diff --git a/src/apps/blazor/client/Components/ThemeManager/ColorPanel.razor b/src/apps/blazor/client/Components/ThemeManager/ColorPanel.razor deleted file mode 100644 index 2b90017e72..0000000000 --- a/src/apps/blazor/client/Components/ThemeManager/ColorPanel.razor +++ /dev/null @@ -1,27 +0,0 @@ - - -
- @ColorType - - -
-
- - - - - @foreach (var color in Colors) - { - - -
-
-
-
- } -
-
-
-
-
\ No newline at end of file diff --git a/src/apps/blazor/client/Components/ThemeManager/ColorPanel.razor.cs b/src/apps/blazor/client/Components/ThemeManager/ColorPanel.razor.cs deleted file mode 100644 index 3f5bd8545f..0000000000 --- a/src/apps/blazor/client/Components/ThemeManager/ColorPanel.razor.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Microsoft.AspNetCore.Components; -using MudBlazor; - -namespace FSH.Starter.Blazor.Client.Components.ThemeManager; - -public partial class ColorPanel -{ - [Parameter] - public List Colors { get; set; } = new(); - - [Parameter] - public string ColorType { get; set; } = string.Empty; - - [Parameter] - public Color CurrentColor { get; set; } - - [Parameter] - public EventCallback OnColorClicked { get; set; } - - protected async Task ColorClicked(string color) - { - await OnColorClicked.InvokeAsync(color); - } -} diff --git a/src/apps/blazor/client/Components/ThemeManager/DarkModePanel.razor b/src/apps/blazor/client/Components/ThemeManager/DarkModePanel.razor deleted file mode 100644 index c7a4e1e8db..0000000000 --- a/src/apps/blazor/client/Components/ThemeManager/DarkModePanel.razor +++ /dev/null @@ -1,17 +0,0 @@ - - -
- @if (_isDarkMode) - { - Switch to Light Mode - } - else - { - Switch to Dark Mode - } - -
-
-
\ No newline at end of file diff --git a/src/apps/blazor/client/Components/ThemeManager/DarkModePanel.razor.cs b/src/apps/blazor/client/Components/ThemeManager/DarkModePanel.razor.cs deleted file mode 100644 index 1a07a9be7b..0000000000 --- a/src/apps/blazor/client/Components/ThemeManager/DarkModePanel.razor.cs +++ /dev/null @@ -1,24 +0,0 @@ -using FSH.Starter.Blazor.Infrastructure.Preferences; -using Microsoft.AspNetCore.Components; - -namespace FSH.Starter.Blazor.Client.Components.ThemeManager; - -public partial class DarkModePanel -{ - private bool _isDarkMode; - - protected override async Task OnInitializedAsync() - { - if (await ClientPreferences.GetPreference() is not ClientPreference themePreference) themePreference = new ClientPreference(); - _isDarkMode = themePreference.IsDarkMode; - } - - [Parameter] - public EventCallback OnIconClicked { get; set; } - - private async Task ToggleDarkMode() - { - _isDarkMode = !_isDarkMode; - await OnIconClicked.InvokeAsync(_isDarkMode); - } -} diff --git a/src/apps/blazor/client/Components/ThemeManager/RadiusPanel.razor b/src/apps/blazor/client/Components/ThemeManager/RadiusPanel.razor deleted file mode 100644 index 56e42f21d8..0000000000 --- a/src/apps/blazor/client/Components/ThemeManager/RadiusPanel.razor +++ /dev/null @@ -1,15 +0,0 @@ - - -
- Border Radius - @Radius.ToString() - -
-
- - - @Radius.ToString() - -
\ No newline at end of file diff --git a/src/apps/blazor/client/Components/ThemeManager/RadiusPanel.razor.cs b/src/apps/blazor/client/Components/ThemeManager/RadiusPanel.razor.cs deleted file mode 100644 index 1c5fc62ab5..0000000000 --- a/src/apps/blazor/client/Components/ThemeManager/RadiusPanel.razor.cs +++ /dev/null @@ -1,28 +0,0 @@ -using FSH.Starter.Blazor.Infrastructure.Preferences; -using Microsoft.AspNetCore.Components; - -namespace FSH.Starter.Blazor.Client.Components.ThemeManager; - -public partial class RadiusPanel -{ - [Parameter] - public double Radius { get; set; } - - [Parameter] - public double MaxValue { get; set; } = 30; - - [Parameter] - public EventCallback OnSliderChanged { get; set; } - - protected override async Task OnInitializedAsync() - { - if (await ClientPreferences.GetPreference() is not ClientPreference themePreference) themePreference = new ClientPreference(); - Radius = themePreference.BorderRadius; - } - - private async Task ChangedSelection(ChangeEventArgs args) - { - Radius = int.Parse(args?.Value?.ToString() ?? "0"); - await OnSliderChanged.InvokeAsync(Radius); - } -} diff --git a/src/apps/blazor/client/Components/ThemeManager/TableCustomizationPanel.razor b/src/apps/blazor/client/Components/ThemeManager/TableCustomizationPanel.razor deleted file mode 100644 index e748aea63e..0000000000 --- a/src/apps/blazor/client/Components/ThemeManager/TableCustomizationPanel.razor +++ /dev/null @@ -1,19 +0,0 @@ - - -
- Table Customization - T - -
-
- - - - - - -
\ No newline at end of file diff --git a/src/apps/blazor/client/Components/ThemeManager/TableCustomizationPanel.razor.cs b/src/apps/blazor/client/Components/ThemeManager/TableCustomizationPanel.razor.cs deleted file mode 100644 index 3bc43580fd..0000000000 --- a/src/apps/blazor/client/Components/ThemeManager/TableCustomizationPanel.razor.cs +++ /dev/null @@ -1,74 +0,0 @@ -using FSH.Starter.Blazor.Infrastructure.Notifications; -using FSH.Starter.Blazor.Infrastructure.Preferences; -using Microsoft.AspNetCore.Components; - -namespace FSH.Starter.Blazor.Client.Components.ThemeManager; - -public partial class TableCustomizationPanel -{ - [Parameter] - public bool IsDense { get; set; } - [Parameter] - public bool IsStriped { get; set; } - [Parameter] - public bool HasBorder { get; set; } - [Parameter] - public bool IsHoverable { get; set; } - [Inject] - protected INotificationPublisher Notifications { get; set; } = default!; - - private FshTablePreference _tablePreference = new(); - - protected override async Task OnInitializedAsync() - { - if (await ClientPreferences.GetPreference() is ClientPreference clientPreference) - { - _tablePreference = clientPreference.TablePreference; - } - - IsDense = _tablePreference.IsDense; - IsStriped = _tablePreference.IsStriped; - HasBorder = _tablePreference.HasBorder; - IsHoverable = _tablePreference.IsHoverable; - } - - [Parameter] - public EventCallback OnDenseSwitchToggled { get; set; } - - [Parameter] - public EventCallback OnStripedSwitchToggled { get; set; } - - [Parameter] - public EventCallback OnBorderdedSwitchToggled { get; set; } - - [Parameter] - public EventCallback OnHoverableSwitchToggled { get; set; } - - private async Task ToggleDenseSwitch() - { - _tablePreference.IsDense = !_tablePreference.IsDense; - await OnDenseSwitchToggled.InvokeAsync(_tablePreference.IsDense); - await Notifications.PublishAsync(_tablePreference); - } - - private async Task ToggleStripedSwitch() - { - _tablePreference.IsStriped = !_tablePreference.IsStriped; - await OnStripedSwitchToggled.InvokeAsync(_tablePreference.IsStriped); - await Notifications.PublishAsync(_tablePreference); - } - - private async Task ToggleBorderedSwitch() - { - _tablePreference.HasBorder = !_tablePreference.HasBorder; - await OnBorderdedSwitchToggled.InvokeAsync(_tablePreference.HasBorder); - await Notifications.PublishAsync(_tablePreference); - } - - private async Task ToggleHoverableSwitch() - { - _tablePreference.IsHoverable = !_tablePreference.IsHoverable; - await OnHoverableSwitchToggled.InvokeAsync(_tablePreference.IsHoverable); - await Notifications.PublishAsync(_tablePreference); - } -} diff --git a/src/apps/blazor/client/Components/ThemeManager/ThemeButton.razor b/src/apps/blazor/client/Components/ThemeManager/ThemeButton.razor deleted file mode 100644 index 364ecc5773..0000000000 --- a/src/apps/blazor/client/Components/ThemeManager/ThemeButton.razor +++ /dev/null @@ -1,16 +0,0 @@ -
- - - -
- - \ No newline at end of file diff --git a/src/apps/blazor/client/Components/ThemeManager/ThemeButton.razor.cs b/src/apps/blazor/client/Components/ThemeManager/ThemeButton.razor.cs deleted file mode 100644 index d5eb45af40..0000000000 --- a/src/apps/blazor/client/Components/ThemeManager/ThemeButton.razor.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.Components.Web; - -namespace FSH.Starter.Blazor.Client.Components.ThemeManager; - -public partial class ThemeButton -{ - [Parameter] - public EventCallback OnClick { get; set; } -} diff --git a/src/apps/blazor/client/Components/ThemeManager/ThemeDrawer.razor b/src/apps/blazor/client/Components/ThemeManager/ThemeDrawer.razor deleted file mode 100644 index ee4022c274..0000000000 --- a/src/apps/blazor/client/Components/ThemeManager/ThemeDrawer.razor +++ /dev/null @@ -1,28 +0,0 @@ - - - - Theme Manager - - - - - -
- - - - - - - -
-
- \ No newline at end of file diff --git a/src/apps/blazor/client/Components/ThemeManager/ThemeDrawer.razor.cs b/src/apps/blazor/client/Components/ThemeManager/ThemeDrawer.razor.cs deleted file mode 100644 index a7373b86f8..0000000000 --- a/src/apps/blazor/client/Components/ThemeManager/ThemeDrawer.razor.cs +++ /dev/null @@ -1,96 +0,0 @@ -using FSH.Starter.Blazor.Infrastructure.Preferences; -using FSH.Starter.Blazor.Infrastructure.Themes; -using Microsoft.AspNetCore.Components; - -namespace FSH.Starter.Blazor.Client.Components.ThemeManager; - -public partial class ThemeDrawer -{ - [Parameter] - public bool ThemeDrawerOpen { get; set; } - - [Parameter] - public EventCallback ThemeDrawerOpenChanged { get; set; } - - [EditorRequired] - [Parameter] - public ClientPreference ThemePreference { get; set; } = default!; - - [EditorRequired] - [Parameter] - public EventCallback ThemePreferenceChanged { get; set; } - - private readonly List _colors = CustomColors.ThemeColors; - - private async Task UpdateThemePrimaryColor(string color) - { - if (ThemePreference is not null) - { - ThemePreference.PrimaryColor = color; - await ThemePreferenceChanged.InvokeAsync(ThemePreference); - } - } - - private async Task UpdateThemeSecondaryColor(string color) - { - if (ThemePreference is not null) - { - ThemePreference.SecondaryColor = color; - await ThemePreferenceChanged.InvokeAsync(ThemePreference); - } - } - - private async Task UpdateBorderRadius(double radius) - { - if (ThemePreference is not null) - { - ThemePreference.BorderRadius = radius; - await ThemePreferenceChanged.InvokeAsync(ThemePreference); - } - } - - private async Task ToggleDarkLightMode(bool isDarkMode) - { - if (ThemePreference is not null) - { - ThemePreference.IsDarkMode = isDarkMode; - await ThemePreferenceChanged.InvokeAsync(ThemePreference); - } - } - - private async Task ToggleEntityTableDense(bool isDense) - { - if (ThemePreference is not null) - { - ThemePreference.TablePreference.IsDense = isDense; - await ThemePreferenceChanged.InvokeAsync(ThemePreference); - } - } - - private async Task ToggleEntityTableStriped(bool isStriped) - { - if (ThemePreference is not null) - { - ThemePreference.TablePreference.IsStriped = isStriped; - await ThemePreferenceChanged.InvokeAsync(ThemePreference); - } - } - - private async Task ToggleEntityTableBorder(bool hasBorder) - { - if (ThemePreference is not null) - { - ThemePreference.TablePreference.HasBorder = hasBorder; - await ThemePreferenceChanged.InvokeAsync(ThemePreference); - } - } - - private async Task ToggleEntityTableHoverable(bool isHoverable) - { - if (ThemePreference is not null) - { - ThemePreference.TablePreference.IsHoverable = isHoverable; - await ThemePreferenceChanged.InvokeAsync(ThemePreference); - } - } -} diff --git a/src/apps/blazor/client/Directory.Packages.props b/src/apps/blazor/client/Directory.Packages.props deleted file mode 100644 index 5a7acff5d7..0000000000 --- a/src/apps/blazor/client/Directory.Packages.props +++ /dev/null @@ -1,22 +0,0 @@ - - - true - true - true - - - true - true - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/apps/blazor/client/Layout/BaseLayout.razor b/src/apps/blazor/client/Layout/BaseLayout.razor deleted file mode 100644 index bd368f82ff..0000000000 --- a/src/apps/blazor/client/Layout/BaseLayout.razor +++ /dev/null @@ -1,29 +0,0 @@ -@inherits LayoutComponentBase - - - - - - - - - - - - @Body - - - - - - - - - - @Body - - - - - \ No newline at end of file diff --git a/src/apps/blazor/client/Layout/BaseLayout.razor.cs b/src/apps/blazor/client/Layout/BaseLayout.razor.cs deleted file mode 100644 index 524a2923df..0000000000 --- a/src/apps/blazor/client/Layout/BaseLayout.razor.cs +++ /dev/null @@ -1,61 +0,0 @@ -using FSH.Starter.Blazor.Infrastructure.Preferences; -using FSH.Starter.Blazor.Infrastructure.Themes; -using MudBlazor; - -namespace FSH.Starter.Blazor.Client.Layout; - -public partial class BaseLayout -{ - private ClientPreference? _themePreference; - private MudTheme _currentTheme = new FshTheme(); - private bool _themeDrawerOpen; - private bool _rightToLeft; - private bool _isDarkMode; - - protected override async Task OnInitializedAsync() - { - _themePreference = await ClientPreferences.GetPreference() as ClientPreference; - if (_themePreference == null) _themePreference = new ClientPreference(); - SetCurrentTheme(_themePreference); - - Toast.Add("Like this project? ", Severity.Info, config => - { - config.BackgroundBlurred = true; - config.Icon = Icons.Custom.Brands.GitHub; - config.Action = "Star us on Github!"; - config.ActionColor = Color.Info; - config.OnClick = snackbar => - { - Navigation.NavigateTo("https://github.com/fullstackhero/dotnet-starter-kit"); - return Task.CompletedTask; - }; - }); - } - - private async Task ToggleDarkLightMode(bool isDarkMode) - { - if (_themePreference is not null) - { - _themePreference.IsDarkMode = isDarkMode; - await ThemePreferenceChanged(_themePreference); - } - } - - private async Task ThemePreferenceChanged(ClientPreference themePreference) - { - SetCurrentTheme(themePreference); - await ClientPreferences.SetPreference(themePreference); - } - - private void SetCurrentTheme(ClientPreference themePreference) - { - _isDarkMode = themePreference.IsDarkMode; - _currentTheme.PaletteLight.Primary = themePreference.PrimaryColor; - _currentTheme.PaletteLight.Secondary = themePreference.SecondaryColor; - _currentTheme.PaletteDark.Primary = themePreference.PrimaryColor; - _currentTheme.PaletteDark.Secondary = themePreference.SecondaryColor; - _currentTheme.LayoutProperties.DefaultBorderRadius = $"{themePreference.BorderRadius}px"; - _currentTheme.LayoutProperties.DefaultBorderRadius = $"{themePreference.BorderRadius}px"; - _rightToLeft = themePreference.IsRTL; - } -} diff --git a/src/apps/blazor/client/Layout/MainLayout.razor b/src/apps/blazor/client/Layout/MainLayout.razor deleted file mode 100644 index 520832e8cb..0000000000 --- a/src/apps/blazor/client/Layout/MainLayout.razor +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - fullstackhero - - - - - Sponsor - - - - Community - Discord - Facebook - - LinkedIn - Buy Me a Coffee! - - Open Collective - - Resources - Documentation - - - - - - - - - - - - -
- - -
- Community - Discord - Facebook - - HrefedIn - Resources - - MudBlazor Documentation - - Quick-Start Guide -
-
- - - - - -
- -
- - Account -
-
- -
- - Dashboard -
-
-
- - Logout - -
-
-
-
-
- - - - - - - @ChildContent - - - - - \ No newline at end of file diff --git a/src/apps/blazor/client/Layout/MainLayout.razor.cs b/src/apps/blazor/client/Layout/MainLayout.razor.cs deleted file mode 100644 index 2b24a45c4e..0000000000 --- a/src/apps/blazor/client/Layout/MainLayout.razor.cs +++ /dev/null @@ -1,55 +0,0 @@ -using FSH.Starter.Blazor.Infrastructure.Preferences; -using Microsoft.AspNetCore.Components; -using MudBlazor; - -namespace FSH.Starter.Blazor.Client.Layout; - -public partial class MainLayout -{ - [Parameter] - public RenderFragment ChildContent { get; set; } = default!; - [Parameter] - public EventCallback OnDarkModeToggle { get; set; } - [Parameter] - public EventCallback OnRightToLeftToggle { get; set; } - - private bool _drawerOpen; - private bool _isDarkMode; - - protected override async Task OnInitializedAsync() - { - if (await ClientPreferences.GetPreference() is ClientPreference preferences) - { - _drawerOpen = preferences.IsDrawerOpen; - _isDarkMode = preferences.IsDarkMode; - } - } - - public async Task ToggleDarkMode() - { - _isDarkMode = !_isDarkMode; - await OnDarkModeToggle.InvokeAsync(_isDarkMode); - } - - private async Task DrawerToggle() - { - _drawerOpen = await ClientPreferences.ToggleDrawerAsync(); - } - private void Logout() - { - var parameters = new DialogParameters - { - { nameof(Components.Dialogs.Logout.ContentText), "Do you want to logout from the system?"}, - { nameof(Components.Dialogs.Logout.ButtonText), "Logout"}, - { nameof(Components.Dialogs.Logout.Color), Color.Error} - }; - - var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small, FullWidth = true }; - DialogService.Show("Logout", parameters, options); - } - - private void Profile() - { - Navigation.NavigateTo("/identity/account"); - } -} diff --git a/src/apps/blazor/client/Layout/MainLayout.razor.css b/src/apps/blazor/client/Layout/MainLayout.razor.css deleted file mode 100644 index 1a95cc0551..0000000000 --- a/src/apps/blazor/client/Layout/MainLayout.razor.css +++ /dev/null @@ -1,81 +0,0 @@ -.page { - position: relative; - display: flex; - flex-direction: column; -} - -main { - flex: 1; -} - -.sidebar { - background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); -} - -.top-row { - background-color: #f7f7f7; - border-bottom: 1px solid #d6d5d5; - justify-content: flex-end; - height: 3.5rem; - display: flex; - align-items: center; -} - - .top-row ::deep a, .top-row ::deep .btn-link { - white-space: nowrap; - margin-left: 1.5rem; - text-decoration: none; - } - - .top-row ::deep a:hover, .top-row ::deep .btn-link:hover { - text-decoration: underline; - } - - .top-row ::deep a:first-child { - overflow: hidden; - text-overflow: ellipsis; - } - -@media (max-width: 640.98px) { - .top-row { - justify-content: space-between; - } - - .top-row ::deep a, .top-row ::deep .btn-link { - margin-left: 0; - } -} - -@media (min-width: 641px) { - .page { - flex-direction: row; - } - - .sidebar { - width: 250px; - height: 100vh; - position: sticky; - top: 0; - } - - .top-row { - position: sticky; - top: 0; - z-index: 1; - } - - .top-row.auth ::deep a:first-child { - flex: 1; - text-align: right; - width: 0; - } - - .top-row, article { - padding-left: 2rem !important; - padding-right: 1.5rem !important; - } -} - -.fsh-shadow { - box-shadow: 0 30px 60px rgba(0,0,0,0.12) !important; -} \ No newline at end of file diff --git a/src/apps/blazor/client/Layout/NavMenu.razor b/src/apps/blazor/client/Layout/NavMenu.razor deleted file mode 100644 index 86ab42d0d2..0000000000 --- a/src/apps/blazor/client/Layout/NavMenu.razor +++ /dev/null @@ -1,32 +0,0 @@ - - - Start - Home - Counter - @if (_canViewAuditTrails) - { - Audit Trail - } - Modules - - Products - Brands - - Todos - @if (CanViewAdministrationGroup) - { - Administration - @if (_canViewUsers) - { - Users - } - @if (_canViewRoles) - { - Roles - } - @if (_canViewTenants) - { - Tenants - } - } - diff --git a/src/apps/blazor/client/Layout/NavMenu.razor.cs b/src/apps/blazor/client/Layout/NavMenu.razor.cs deleted file mode 100644 index 41b598a485..0000000000 --- a/src/apps/blazor/client/Layout/NavMenu.razor.cs +++ /dev/null @@ -1,40 +0,0 @@ -using FSH.Starter.Blazor.Infrastructure.Auth; -using FSH.Starter.Shared.Authorization; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.Components.Authorization; - -namespace FSH.Starter.Blazor.Client.Layout; - -public partial class NavMenu -{ - [CascadingParameter] - protected Task AuthState { get; set; } = default!; - [Inject] - protected IAuthorizationService AuthService { get; set; } = default!; - - private bool _canViewHangfire; - private bool _canViewDashboard; - private bool _canViewRoles; - private bool _canViewUsers; - private bool _canViewProducts; - private bool _canViewBrands; - private bool _canViewTodos; - private bool _canViewTenants; - private bool _canViewAuditTrails; - private bool CanViewAdministrationGroup => _canViewUsers || _canViewRoles || _canViewTenants; - - protected override async Task OnParametersSetAsync() - { - var user = (await AuthState).User; - _canViewHangfire = await AuthService.HasPermissionAsync(user, FshActions.View, FshResources.Hangfire); - _canViewDashboard = await AuthService.HasPermissionAsync(user, FshActions.View, FshResources.Dashboard); - _canViewRoles = await AuthService.HasPermissionAsync(user, FshActions.View, FshResources.Roles); - _canViewUsers = await AuthService.HasPermissionAsync(user, FshActions.View, FshResources.Users); - _canViewProducts = await AuthService.HasPermissionAsync(user, FshActions.View, FshResources.Products); - _canViewBrands = await AuthService.HasPermissionAsync(user, FshActions.View, FshResources.Brands); - _canViewTodos = await AuthService.HasPermissionAsync(user, FshActions.View, FshResources.Todos); - _canViewTenants = await AuthService.HasPermissionAsync(user, FshActions.View, FshResources.Tenants); - _canViewAuditTrails = await AuthService.HasPermissionAsync(user, FshActions.View, FshResources.AuditTrails); - } -} diff --git a/src/apps/blazor/client/Layout/NavMenu.razor.css b/src/apps/blazor/client/Layout/NavMenu.razor.css deleted file mode 100644 index 881d128a5f..0000000000 --- a/src/apps/blazor/client/Layout/NavMenu.razor.css +++ /dev/null @@ -1,83 +0,0 @@ -.navbar-toggler { - background-color: rgba(255, 255, 255, 0.1); -} - -.top-row { - height: 3.5rem; - background-color: rgba(0,0,0,0.4); -} - -.navbar-brand { - font-size: 1.1rem; -} - -.bi { - display: inline-block; - position: relative; - width: 1.25rem; - height: 1.25rem; - margin-right: 0.75rem; - top: -1px; - background-size: cover; -} - -.bi-house-door-fill-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E"); -} - -.bi-plus-square-fill-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E"); -} - -.bi-list-nested-nav-menu { - background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E"); -} - -.nav-item { - font-size: 0.9rem; - padding-bottom: 0.5rem; -} - - .nav-item:first-of-type { - padding-top: 1rem; - } - - .nav-item:last-of-type { - padding-bottom: 1rem; - } - - .nav-item ::deep a { - color: #d7d7d7; - border-radius: 4px; - height: 3rem; - display: flex; - align-items: center; - line-height: 3rem; - } - -.nav-item ::deep a.active { - background-color: rgba(255,255,255,0.37); - color: white; -} - -.nav-item ::deep a:hover { - background-color: rgba(255,255,255,0.1); - color: white; -} - -@media (min-width: 641px) { - .navbar-toggler { - display: none; - } - - .collapse { - /* 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/apps/blazor/client/Layout/NotFound.razor b/src/apps/blazor/client/Layout/NotFound.razor deleted file mode 100644 index 6fe4b2ce57..0000000000 --- a/src/apps/blazor/client/Layout/NotFound.razor +++ /dev/null @@ -1,47 +0,0 @@ -@inherits LayoutComponentBase - - - - -
- - - - - - - - - - - - - - - - - Not Found -
- Go Home -
-
-
- -@code{ - -} \ No newline at end of file diff --git a/src/apps/blazor/client/Layout/NotFound.razor.cs b/src/apps/blazor/client/Layout/NotFound.razor.cs deleted file mode 100644 index 674565ed3e..0000000000 --- a/src/apps/blazor/client/Layout/NotFound.razor.cs +++ /dev/null @@ -1,34 +0,0 @@ -using FSH.Starter.Blazor.Infrastructure.Themes; -using FSH.Starter.Blazor.Infrastructure.Preferences; -using MudBlazor; - -namespace FSH.Starter.Blazor.Client.Layout; - -public partial class NotFound -{ - private ClientPreference? _themePreference; - private MudTheme _theme = new FshTheme(); - private bool _isDarkMode; - - protected override async Task OnInitializedAsync() - { - _themePreference = await ClientPreferences.GetPreference() as ClientPreference; - if (_themePreference == null) _themePreference = new ClientPreference(); - SetCurrentTheme(_themePreference); - } - - private void SetCurrentTheme(ClientPreference themePreference) - { - _isDarkMode = themePreference.IsDarkMode; - //_currentTheme = new FshTheme(); - //if (themePreference.IsDarkMode) - //{ - // _currentTheme. - //} - //_currentTheme.Palette.Primary = themePreference.PrimaryColor; - //_currentTheme.Palette.Secondary = themePreference.SecondaryColor; - //_currentTheme.LayoutProperties.DefaultBorderRadius = $"{themePreference.BorderRadius}px"; - //_currentTheme.LayoutProperties.DefaultBorderRadius = $"{themePreference.BorderRadius}px"; - //_rightToLeft = themePreference.IsRTL; - } -} diff --git a/src/apps/blazor/client/Pages/Auth/ForgotPassword.razor b/src/apps/blazor/client/Pages/Auth/ForgotPassword.razor deleted file mode 100644 index e2b35c86af..0000000000 --- a/src/apps/blazor/client/Pages/Auth/ForgotPassword.razor +++ /dev/null @@ -1,41 +0,0 @@ -@page "/forgot-password" -@attribute [AllowAnonymous] - -Forgot Password - - - - - - - - -
- Forgot Password? - - We can help you by resetting your password. -
-
-
- - - - - - - - - - - - - - - Forgot Password - -
-
\ No newline at end of file diff --git a/src/apps/blazor/client/Pages/Auth/ForgotPassword.razor.cs b/src/apps/blazor/client/Pages/Auth/ForgotPassword.razor.cs deleted file mode 100644 index 419185b954..0000000000 --- a/src/apps/blazor/client/Pages/Auth/ForgotPassword.razor.cs +++ /dev/null @@ -1,30 +0,0 @@ -using FSH.Starter.Blazor.Client.Components; -using FSH.Starter.Blazor.Infrastructure.Api; -using FSH.Starter.Shared.Authorization; -using Microsoft.AspNetCore.Components; - -namespace FSH.Starter.Blazor.Client.Pages.Auth; - -public partial class ForgotPassword -{ - private readonly ForgotPasswordCommand _forgotPasswordRequest = new(); - private FshValidation? _customValidation; - private bool BusySubmitting { get; set; } - - [Inject] - private IApiClient UsersClient { get; set; } = default!; - - private string Tenant { get; set; } = TenantConstants.Root.Id; - - private async Task SubmitAsync() - { - BusySubmitting = true; - - await ApiHelper.ExecuteCallGuardedAsync( - () => UsersClient.ForgotPasswordEndpointAsync(Tenant, _forgotPasswordRequest), - Toast, - _customValidation); - - BusySubmitting = false; - } -} diff --git a/src/apps/blazor/client/Pages/Auth/Login.razor b/src/apps/blazor/client/Pages/Auth/Login.razor deleted file mode 100644 index ed00d61dba..0000000000 --- a/src/apps/blazor/client/Pages/Auth/Login.razor +++ /dev/null @@ -1,46 +0,0 @@ -@page "/login" -@attribute [AllowAnonymous] -@inject IAuthenticationService authService - -Login - -
- Sign In - - Enter your credentials to get started. - -
-
- - - - - - - - - - - - - - - - Register? - - - Forgot password? - - - Sign In - - - Fill Administrator Credentials - - - \ No newline at end of file diff --git a/src/apps/blazor/client/Pages/Auth/Login.razor.cs b/src/apps/blazor/client/Pages/Auth/Login.razor.cs deleted file mode 100644 index 1bd6d7bff1..0000000000 --- a/src/apps/blazor/client/Pages/Auth/Login.razor.cs +++ /dev/null @@ -1,71 +0,0 @@ -using FSH.Starter.Blazor.Client.Components; -using FSH.Starter.Blazor.Infrastructure.Api; -using FSH.Starter.Shared.Authorization; -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.Components.Authorization; -using MudBlazor; - -namespace FSH.Starter.Blazor.Client.Pages.Auth; - -public partial class Login() -{ - [CascadingParameter] - public Task AuthState { get; set; } = default!; - - private FshValidation? _customValidation; - - public bool BusySubmitting { get; set; } - - private readonly TokenGenerationCommand _tokenRequest = new(); - private string TenantId { get; set; } = string.Empty; - private bool _passwordVisibility; - private InputType _passwordInput = InputType.Password; - private string _passwordInputIcon = Icons.Material.Filled.VisibilityOff; - - protected override async Task OnInitializedAsync() - { - var authState = await AuthState; - if (authState.User.Identity?.IsAuthenticated is true) - { - Navigation.NavigateTo("/"); - } - } - - private void TogglePasswordVisibility() - { - if (_passwordVisibility) - { - _passwordVisibility = false; - _passwordInputIcon = Icons.Material.Filled.VisibilityOff; - _passwordInput = InputType.Password; - } - else - { - _passwordVisibility = true; - _passwordInputIcon = Icons.Material.Filled.Visibility; - _passwordInput = InputType.Text; - } - } - - private void FillAdministratorCredentials() - { - _tokenRequest.Email = TenantConstants.Root.EmailAddress; - _tokenRequest.Password = TenantConstants.DefaultPassword; - TenantId = TenantConstants.Root.Id; - } - - private async Task SubmitAsync() - { - BusySubmitting = true; - - if (await ApiHelper.ExecuteCallGuardedAsync( - () => authService.LoginAsync(TenantId, _tokenRequest), - Toast, - _customValidation)) - { - Toast.Add($"Logged in as {_tokenRequest.Email}", Severity.Info); - } - - BusySubmitting = false; - } -} diff --git a/src/apps/blazor/client/Pages/Auth/Logout.razor b/src/apps/blazor/client/Pages/Auth/Logout.razor deleted file mode 100644 index c02ac1597b..0000000000 --- a/src/apps/blazor/client/Pages/Auth/Logout.razor +++ /dev/null @@ -1,11 +0,0 @@ -@page "/logout" -@attribute [AllowAnonymous] -@inject IAuthenticationService AuthService - -@code{ - protected override async Task OnInitializedAsync() - { - await AuthService.LogoutAsync(); - Toast.Add("Logged out", Severity.Error); - } -} \ No newline at end of file diff --git a/src/apps/blazor/client/Pages/Auth/SelfRegister.razor b/src/apps/blazor/client/Pages/Auth/SelfRegister.razor deleted file mode 100644 index 82f71886ce..0000000000 --- a/src/apps/blazor/client/Pages/Auth/SelfRegister.razor +++ /dev/null @@ -1,71 +0,0 @@ -@page "/register" -@attribute [AllowAnonymous] - -Register - - - - - - - - -
-
- - Register - - Enter your details below to set up your new account -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Register - - -
-
\ No newline at end of file diff --git a/src/apps/blazor/client/Pages/Auth/SelfRegister.razor.cs b/src/apps/blazor/client/Pages/Auth/SelfRegister.razor.cs deleted file mode 100644 index 1659c773ab..0000000000 --- a/src/apps/blazor/client/Pages/Auth/SelfRegister.razor.cs +++ /dev/null @@ -1,57 +0,0 @@ -using FSH.Starter.Blazor.Client.Components; -using FSH.Starter.Blazor.Infrastructure.Api; -using FSH.Starter.Shared.Authorization; -using Microsoft.AspNetCore.Components; -using MudBlazor; - -namespace FSH.Starter.Blazor.Client.Pages.Auth; - -public partial class SelfRegister -{ - private readonly RegisterUserCommand _createUserRequest = new(); - private FshValidation? _customValidation; - private bool BusySubmitting { get; set; } - - [Inject] - private IApiClient UsersClient { get; set; } = default!; - - private string Tenant { get; set; } = TenantConstants.Root.Id; - - private bool _passwordVisibility; - private InputType _passwordInput = InputType.Password; - private string _passwordInputIcon = Icons.Material.Filled.VisibilityOff; - - private async Task SubmitAsync() - { - BusySubmitting = true; - - var response = await ApiHelper.ExecuteCallGuardedAsync( - () => UsersClient.SelfRegisterUserEndpointAsync(Tenant, _createUserRequest), - Toast, Navigation, - _customValidation); - - if (response != null) - { - Toast.Add($"user {response.UserId} registered.", Severity.Success); - Navigation.NavigateTo("/login"); - } - - BusySubmitting = false; - } - - private void TogglePasswordVisibility() - { - if (_passwordVisibility) - { - _passwordVisibility = false; - _passwordInputIcon = Icons.Material.Filled.VisibilityOff; - _passwordInput = InputType.Password; - } - else - { - _passwordVisibility = true; - _passwordInputIcon = Icons.Material.Filled.Visibility; - _passwordInput = InputType.Text; - } - } -} diff --git a/src/apps/blazor/client/Pages/Catalog/Brands.razor b/src/apps/blazor/client/Pages/Catalog/Brands.razor deleted file mode 100644 index e805ff3798..0000000000 --- a/src/apps/blazor/client/Pages/Catalog/Brands.razor +++ /dev/null @@ -1,44 +0,0 @@ -@page "/catalog/brands" - - - - - - - - - - - @if (!Context.AddEditModal.IsCreate) - { - - - - } - - - - - - - - -
- @if(!Context.AddEditModal.IsCreate) - { - - View - - - - Delete - - } -
-
-
-
- -
diff --git a/src/apps/blazor/client/Pages/Catalog/Brands.razor.cs b/src/apps/blazor/client/Pages/Catalog/Brands.razor.cs deleted file mode 100644 index 846f2985f4..0000000000 --- a/src/apps/blazor/client/Pages/Catalog/Brands.razor.cs +++ /dev/null @@ -1,50 +0,0 @@ -using FSH.Starter.Blazor.Client.Components.EntityTable; -using FSH.Starter.Blazor.Infrastructure.Api; -using FSH.Starter.Shared.Authorization; -using Mapster; -using Microsoft.AspNetCore.Components; - -namespace FSH.Starter.Blazor.Client.Pages.Catalog; - -public partial class Brands -{ - [Inject] - protected IApiClient _client { get; set; } = default!; - - protected EntityServerTableContext Context { get; set; } = default!; - - private EntityTable _table = default!; - - protected override void OnInitialized() => - Context = new( - entityName: "Brand", - entityNamePlural: "Brands", - entityResource: FshResources.Brands, - fields: new() - { - new(brand => brand.Id, "Id", "Id"), - new(brand => brand.Name, "Name", "Name"), - new(brand => brand.Description, "Description", "Description") - }, - enableAdvancedSearch: true, - idFunc: brand => brand.Id!.Value, - searchFunc: async filter => - { - var brandFilter = filter.Adapt(); - var result = await _client.SearchBrandsEndpointAsync("1", brandFilter); - return result.Adapt>(); - }, - createFunc: async brand => - { - await _client.CreateBrandEndpointAsync("1", brand.Adapt()); - }, - updateFunc: async (id, brand) => - { - await _client.UpdateBrandEndpointAsync("1", id, brand.Adapt()); - }, - deleteFunc: async id => await _client.DeleteBrandEndpointAsync("1", id)); -} - -public class BrandViewModel : UpdateBrandCommand -{ -} diff --git a/src/apps/blazor/client/Pages/Catalog/Products.razor b/src/apps/blazor/client/Pages/Catalog/Products.razor deleted file mode 100644 index f3cb893b1d..0000000000 --- a/src/apps/blazor/client/Pages/Catalog/Products.razor +++ /dev/null @@ -1,64 +0,0 @@ -@page "/catalog/products" - - - - - - - - All Brands - @foreach (var brand in _brands) - { - @brand.Name - } - - Minimum Rate: @_searchMinimumRate.ToString() - Maximum Rate: @_searchMaximumRate.ToString() - - - - @if (!Context.AddEditModal.IsCreate) - { - - - - } - - - - - - - - - - - - @foreach (var brand in _brands) - { - @brand.Name - } - - - - -
- @if(!Context.AddEditModal.IsCreate) - { - - View - - - - Delete - - } -
-
-
-
- -
\ No newline at end of file diff --git a/src/apps/blazor/client/Pages/Catalog/Products.razor.cs b/src/apps/blazor/client/Pages/Catalog/Products.razor.cs deleted file mode 100644 index 46266197cd..0000000000 --- a/src/apps/blazor/client/Pages/Catalog/Products.razor.cs +++ /dev/null @@ -1,108 +0,0 @@ -using FSH.Starter.Blazor.Client.Components.EntityTable; -using FSH.Starter.Blazor.Infrastructure.Api; -using FSH.Starter.Shared.Authorization; -using Mapster; -using Microsoft.AspNetCore.Components; - -namespace FSH.Starter.Blazor.Client.Pages.Catalog; - -public partial class Products -{ - [Inject] - protected IApiClient _client { get; set; } = default!; - - protected EntityServerTableContext Context { get; set; } = default!; - - private EntityTable _table = default!; - - private List _brands = new(); - - protected override async Task OnInitializedAsync() - { - Context = new( - entityName: "Product", - entityNamePlural: "Products", - entityResource: FshResources.Products, - fields: new() - { - new(prod => prod.Id,"Id", "Id"), - new(prod => prod.Name,"Name", "Name"), - new(prod => prod.Description, "Description", "Description"), - new(prod => prod.Price, "Price", "Price"), - new(prod => prod.Brand?.Name, "Brand", "Brand") - }, - enableAdvancedSearch: true, - idFunc: prod => prod.Id!.Value, - searchFunc: async filter => - { - var productFilter = filter.Adapt(); - productFilter.MinimumRate = Convert.ToDouble(SearchMinimumRate); - productFilter.MaximumRate = Convert.ToDouble(SearchMaximumRate); - productFilter.BrandId = SearchBrandId; - var result = await _client.SearchProductsEndpointAsync("1", productFilter); - return result.Adapt>(); - }, - createFunc: async prod => - { - await _client.CreateProductEndpointAsync("1", prod.Adapt()); - }, - updateFunc: async (id, prod) => - { - await _client.UpdateProductEndpointAsync("1", id, prod.Adapt()); - }, - deleteFunc: async id => await _client.DeleteProductEndpointAsync("1", id)); - - await LoadBrandsAsync(); - } - - private async Task LoadBrandsAsync() - { - if (_brands.Count == 0) - { - var response = await _client.SearchBrandsEndpointAsync("1", new SearchBrandsCommand()); - if (response?.Items != null) - { - _brands = response.Items.ToList(); - } - } - } - - // Advanced Search - - private Guid? _searchBrandId; - private Guid? SearchBrandId - { - get => _searchBrandId; - set - { - _searchBrandId = value; - _ = _table.ReloadDataAsync(); - } - } - - private decimal _searchMinimumRate; - private decimal SearchMinimumRate - { - get => _searchMinimumRate; - set - { - _searchMinimumRate = value; - _ = _table.ReloadDataAsync(); - } - } - - private decimal _searchMaximumRate = 9999; - private decimal SearchMaximumRate - { - get => _searchMaximumRate; - set - { - _searchMaximumRate = value; - _ = _table.ReloadDataAsync(); - } - } -} - -public class ProductViewModel : UpdateProductCommand -{ -} diff --git a/src/apps/blazor/client/Pages/Counter.razor b/src/apps/blazor/client/Pages/Counter.razor deleted file mode 100644 index e1ba5df4d9..0000000000 --- a/src/apps/blazor/client/Pages/Counter.razor +++ /dev/null @@ -1,18 +0,0 @@ -@page "/counter" - -Counter - -Counter - -Current count: @currentCount - -Click me - -@code { - private int currentCount = 0; - - private void IncrementCount() - { - currentCount++; - } -} diff --git a/src/apps/blazor/client/Pages/Home.razor b/src/apps/blazor/client/Pages/Home.razor deleted file mode 100644 index 4ab0981f44..0000000000 --- a/src/apps/blazor/client/Pages/Home.razor +++ /dev/null @@ -1,95 +0,0 @@ -@page "/" -@using System.Security.Claims - - - - -
- -
-
- - The best way to start a fullstack .NET 9 Web App. - - - - fullstackhero's - .NET 9 Starter Kit - - - - - Built with the goodness of MudBlazor Component Library - - - - -
- Get Started - Star on GitHub -
-
- - Version 2.0 - - - - - In case you are stuck anywhere or have any queries regarding this implementation, I have compiled a Quick Start Guide for you reference. - Read The Guide - - - - - - - - - Here are few articles that should help you get started with Blazor. - - - - - - - - - - - - Application Claims of the currently logged in user - - @if (Claims is not null) - { - @foreach (var claim in Claims) - { - - - @claim.Type - - @claim.Value - - } - } - - - - - - Liked this Boilerplate? Star us on Github! - -
-
- -@code { - [CascadingParameter] - public Task AuthState { get; set; } = default!; - - public IEnumerable? Claims { get; set; } - - protected override async Task OnInitializedAsync() - { - var authState = await AuthState; - Claims = authState.User.Claims; - } -} \ No newline at end of file diff --git a/src/apps/blazor/client/Pages/Identity/Account/Account.razor b/src/apps/blazor/client/Pages/Identity/Account/Account.razor deleted file mode 100644 index 0e7f7d13a3..0000000000 --- a/src/apps/blazor/client/Pages/Identity/Account/Account.razor +++ /dev/null @@ -1,31 +0,0 @@ -@page "/identity/account" - - - - - - - - @if (!SecurityTabHidden) - { - - - - } - - -@code -{ - [Inject] - public IAuthenticationService AuthService { get; set; } = default!; - - public bool SecurityTabHidden { get; set; } = false; - - protected override void OnInitialized() - { - // if (AuthService.ProviderType == AuthProvider.AzureAd) - // { - // SecurityTabHidden = true; - // } - } -} \ No newline at end of file diff --git a/src/apps/blazor/client/Pages/Identity/Account/Profile.razor b/src/apps/blazor/client/Pages/Identity/Account/Profile.razor deleted file mode 100644 index 63ce561c98..0000000000 --- a/src/apps/blazor/client/Pages/Identity/Account/Profile.razor +++ /dev/null @@ -1,84 +0,0 @@ - - - - -
- @if (!string.IsNullOrEmpty(_imageUrl)) - { - - - - } - else - { - @_firstLetterOfName - } -
- @_profileModel.FirstName @_profileModel.LastName - @_profileModel.Email -
- - -
-
- - - - - - Profile Details - - - - - - - - - - - - - - - - - - - - - - Save Changes - - - - -
\ No newline at end of file diff --git a/src/apps/blazor/client/Pages/Identity/Account/Profile.razor.cs b/src/apps/blazor/client/Pages/Identity/Account/Profile.razor.cs deleted file mode 100644 index f979d3f162..0000000000 --- a/src/apps/blazor/client/Pages/Identity/Account/Profile.razor.cs +++ /dev/null @@ -1,102 +0,0 @@ -using FSH.Starter.Blazor.Client.Components; -using FSH.Starter.Blazor.Client.Components.Dialogs; -using FSH.Starter.Blazor.Infrastructure.Api; -using FSH.Starter.Blazor.Infrastructure.Auth; -using FSH.Starter.Shared.Authorization; -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.Components.Authorization; -using Microsoft.AspNetCore.Components.Forms; -using MudBlazor; - -namespace FSH.Starter.Blazor.Client.Pages.Identity.Account; - -public partial class Profile -{ - [CascadingParameter] - protected Task AuthState { get; set; } = default!; - [Inject] - protected IAuthenticationService AuthService { get; set; } = default!; - [Inject] - protected IApiClient PersonalClient { get; set; } = default!; - - private readonly UpdateUserCommand _profileModel = new(); - - private string? _imageUrl; - private string? _userId; - private char _firstLetterOfName; - - private FshValidation? _customValidation; - - protected override async Task OnInitializedAsync() - { - if ((await AuthState).User is { } user) - { - _userId = user.GetUserId(); - _profileModel.Email = user.GetEmail() ?? string.Empty; - _profileModel.FirstName = user.GetFirstName() ?? string.Empty; - _profileModel.LastName = user.GetSurname() ?? string.Empty; - _profileModel.PhoneNumber = user.GetPhoneNumber(); - if (user.GetImageUrl() != null) - { - _imageUrl = user.GetImageUrl()!.ToString(); - } - if (_userId is not null) _profileModel.Id = _userId; - } - - if (_profileModel.FirstName?.Length > 0) - { - _firstLetterOfName = _profileModel.FirstName.ToUpper().FirstOrDefault(); - } - } - - private async Task UpdateProfileAsync() - { - if (await ApiHelper.ExecuteCallGuardedAsync( - () => PersonalClient.UpdateUserEndpointAsync(_profileModel), Toast, _customValidation)) - { - Toast.Add("Your Profile has been updated. Please Login again to Continue.", Severity.Success); - await AuthService.ReLoginAsync(Navigation.Uri); - } - } - - private async Task UploadFiles(InputFileChangeEventArgs e) - { - var file = e.File; - if (file is not null) - { - string? extension = Path.GetExtension(file.Name); - if (!AppConstants.SupportedImageFormats.Contains(extension.ToLower())) - { - Toast.Add("Image Format Not Supported.", Severity.Error); - return; - } - - string? fileName = $"{_userId}-{Guid.NewGuid():N}"; - fileName = fileName[..Math.Min(fileName.Length, 90)]; - var imageFile = await file.RequestImageFileAsync(AppConstants.StandardImageFormat, AppConstants.MaxImageWidth, AppConstants.MaxImageHeight); - byte[]? buffer = new byte[imageFile.Size]; - await imageFile.OpenReadStream(AppConstants.MaxAllowedSize).ReadAsync(buffer); - string? base64String = $"data:{AppConstants.StandardImageFormat};base64,{Convert.ToBase64String(buffer)}"; - _profileModel.Image = new FileUploadCommand() { Name = fileName, Data = base64String, Extension = extension }; - - await UpdateProfileAsync(); - } - } - - public async Task RemoveImageAsync() - { - string deleteContent = "You're sure you want to delete your Profile Image?"; - var parameters = new DialogParameters - { - { nameof(DeleteConfirmation.ContentText), deleteContent } - }; - var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small, FullWidth = true, BackdropClick = false }; - var dialog = await DialogService.ShowAsync("Delete", parameters, options); - var result = await dialog.Result; - if (!result!.Canceled) - { - _profileModel.DeleteCurrentImage = true; - await UpdateProfileAsync(); - } - } -} diff --git a/src/apps/blazor/client/Pages/Identity/Account/Security.razor b/src/apps/blazor/client/Pages/Identity/Account/Security.razor deleted file mode 100644 index 4e6a3841bb..0000000000 --- a/src/apps/blazor/client/Pages/Identity/Account/Security.razor +++ /dev/null @@ -1,39 +0,0 @@ - - - - - Change Password - - - - - - - - - - - - - - - - - - - - Change Password - - - \ No newline at end of file diff --git a/src/apps/blazor/client/Pages/Identity/Account/Security.razor.cs b/src/apps/blazor/client/Pages/Identity/Account/Security.razor.cs deleted file mode 100644 index e9dcd200da..0000000000 --- a/src/apps/blazor/client/Pages/Identity/Account/Security.razor.cs +++ /dev/null @@ -1,71 +0,0 @@ -using FSH.Starter.Blazor.Client.Components; -using FSH.Starter.Blazor.Infrastructure.Api; -using Microsoft.AspNetCore.Components; -using MudBlazor; - -namespace FSH.Starter.Blazor.Client.Pages.Identity.Account; - -public partial class Security -{ - [Inject] - public IApiClient PersonalClient { get; set; } = default!; - - private readonly ChangePasswordCommand _passwordModel = new(); - - private FshValidation? _customValidation; - - private async Task ChangePasswordAsync() - { - if (await ApiHelper.ExecuteCallGuardedAsync( - () => PersonalClient.ChangePasswordEndpointAsync(_passwordModel), - Toast, - _customValidation, - "Password Changed!")) - { - _passwordModel.Password = string.Empty; - _passwordModel.NewPassword = string.Empty; - _passwordModel.ConfirmNewPassword = string.Empty; - } - } - - private bool _currentPasswordVisibility; - private InputType _currentPasswordInput = InputType.Password; - private string _currentPasswordInputIcon = Icons.Material.Filled.VisibilityOff; - private bool _newPasswordVisibility; - private InputType _newPasswordInput = InputType.Password; - private string _newPasswordInputIcon = Icons.Material.Filled.VisibilityOff; - - private void TogglePasswordVisibility(bool newPassword) - { - if (newPassword) - { - if (_newPasswordVisibility) - { - _newPasswordVisibility = false; - _newPasswordInputIcon = Icons.Material.Filled.VisibilityOff; - _newPasswordInput = InputType.Password; - } - else - { - _newPasswordVisibility = true; - _newPasswordInputIcon = Icons.Material.Filled.Visibility; - _newPasswordInput = InputType.Text; - } - } - else - { - if (_currentPasswordVisibility) - { - _currentPasswordVisibility = false; - _currentPasswordInputIcon = Icons.Material.Filled.VisibilityOff; - _currentPasswordInput = InputType.Password; - } - else - { - _currentPasswordVisibility = true; - _currentPasswordInputIcon = Icons.Material.Filled.Visibility; - _currentPasswordInput = InputType.Text; - } - } - } -} diff --git a/src/apps/blazor/client/Pages/Identity/Roles/RolePermissions.razor b/src/apps/blazor/client/Pages/Identity/Roles/RolePermissions.razor deleted file mode 100644 index 0124ba98f9..0000000000 --- a/src/apps/blazor/client/Pages/Identity/Roles/RolePermissions.razor +++ /dev/null @@ -1,73 +0,0 @@ -@page "/identity/roles/{Id}/permissions" - - - -@if (!_loaded) -{ - -} -else -{ - - @foreach (var group in _groupedRoleClaims.Keys) - { - var selectedRoleClaimsInGroup = _groupedRoleClaims[group].Where(c => c.Enabled).ToList(); - var allRoleClaimsInGroup = _groupedRoleClaims[group].ToList(); - - - -
- - Back - - @if (_canEditRoleClaims) - { - Update Permissions - - } -
- - @if (_canSearchRoleClaims) - { - - - } -
- - - - Permission Name - - - - Description - - - Status - - - - - - - - - - - - - - - - - - -
-
- } -
-} \ No newline at end of file diff --git a/src/apps/blazor/client/Pages/Identity/Roles/RolePermissions.razor.cs b/src/apps/blazor/client/Pages/Identity/Roles/RolePermissions.razor.cs deleted file mode 100644 index 9f92a0e566..0000000000 --- a/src/apps/blazor/client/Pages/Identity/Roles/RolePermissions.razor.cs +++ /dev/null @@ -1,109 +0,0 @@ -using FSH.Starter.Blazor.Client.Components; -using FSH.Starter.Blazor.Infrastructure.Api; -using FSH.Starter.Blazor.Infrastructure.Auth; -using FSH.Starter.Shared.Authorization; -using Mapster; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.Components.Authorization; -using MudBlazor; - -namespace FSH.Starter.Blazor.Client.Pages.Identity.Roles; - -public partial class RolePermissions -{ - [Parameter] - public string Id { get; set; } = default!; // from route - [CascadingParameter] - protected Task AuthState { get; set; } = default!; - [Inject] - protected IAuthorizationService AuthService { get; set; } = default!; - [Inject] - protected IApiClient RolesClient { get; set; } = default!; - - private Dictionary> _groupedRoleClaims = default!; - - public string _title = string.Empty; - public string _description = string.Empty; - - private string _searchString = string.Empty; - - private bool _canEditRoleClaims; - private bool _canSearchRoleClaims; - private bool _loaded; - - static RolePermissions() => TypeAdapterConfig.NewConfig().MapToConstructor(true); - - protected override async Task OnInitializedAsync() - { - var state = await AuthState; - - _canEditRoleClaims = await AuthService.HasPermissionAsync(state.User, FshActions.Update, FshResources.RoleClaims); - _canSearchRoleClaims = await AuthService.HasPermissionAsync(state.User, FshActions.View, FshResources.RoleClaims); - - if (await ApiHelper.ExecuteCallGuardedAsync( - () => RolesClient.GetRolePermissionsEndpointAsync(Id), Toast, Navigation) - is RoleDto role && role.Permissions is not null) - { - _title = string.Format("{0} Permissions", role.Name); - _description = string.Format("Manage {0} Role Permissions", role.Name); - - var permissions = state.User.GetTenant() == TenantConstants.Root.Id - ? FshPermissions.All - : FshPermissions.Admin; - - _groupedRoleClaims = permissions - .GroupBy(p => p.Resource) - .ToDictionary(g => g.Key, g => g.Select(p => - { - var permission = p.Adapt(); - permission.Enabled = role.Permissions.Contains(permission.Name); - return permission; - }).ToList()); - } - - _loaded = true; - } - - private Color GetGroupBadgeColor(int selected, int all) - { - if (selected == 0) - return Color.Error; - - if (selected == all) - return Color.Success; - - return Color.Info; - } - - private async Task SaveAsync() - { - var allPermissions = _groupedRoleClaims.Values.SelectMany(a => a); - var selectedPermissions = allPermissions.Where(a => a.Enabled); - var request = new UpdatePermissionsCommand() - { - RoleId = Id, - Permissions = selectedPermissions.Where(x => x.Enabled).Select(x => x.Name).ToList(), - }; - await ApiHelper.ExecuteCallGuardedAsync( - () => RolesClient.UpdateRolePermissionsEndpointAsync(request.RoleId, request), - Toast, - successMessage: "Updated Permissions."); - Navigation.NavigateTo("/identity/roles"); - } - - private bool Search(PermissionViewModel permission) => - string.IsNullOrWhiteSpace(_searchString) - || permission.Name.Contains(_searchString, StringComparison.OrdinalIgnoreCase) is true - || permission.Description.Contains(_searchString, StringComparison.OrdinalIgnoreCase) is true; -} - -public record PermissionViewModel : FshPermission -{ - public bool Enabled { get; set; } - - public PermissionViewModel(string Description, string Action, string Resource, bool IsBasic = false, bool IsRoot = false) - : base(Description, Action, Resource, IsBasic, IsRoot) - { - } -} diff --git a/src/apps/blazor/client/Pages/Identity/Roles/Roles.razor b/src/apps/blazor/client/Pages/Identity/Roles/Roles.razor deleted file mode 100644 index 55f909cdbd..0000000000 --- a/src/apps/blazor/client/Pages/Identity/Roles/Roles.razor +++ /dev/null @@ -1,28 +0,0 @@ -@page "/identity/roles" - - - - - - @if (_canViewRoleClaims) - { - Manage Permission - } - - - @if (!Context.AddEditModal.IsCreate) - { - - - - } - - - - - - - - - \ No newline at end of file diff --git a/src/apps/blazor/client/Pages/Identity/Roles/Roles.razor.cs b/src/apps/blazor/client/Pages/Identity/Roles/Roles.razor.cs deleted file mode 100644 index 848384182c..0000000000 --- a/src/apps/blazor/client/Pages/Identity/Roles/Roles.razor.cs +++ /dev/null @@ -1,60 +0,0 @@ -using FSH.Starter.Blazor.Client.Components.EntityTable; -using FSH.Starter.Blazor.Infrastructure.Api; -using FSH.Starter.Blazor.Infrastructure.Auth; -using FSH.Starter.Shared.Authorization; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.Components.Authorization; - -namespace FSH.Starter.Blazor.Client.Pages.Identity.Roles; - -public partial class Roles -{ - [CascadingParameter] - protected Task AuthState { get; set; } = default!; - [Inject] - protected IAuthorizationService AuthService { get; set; } = default!; - [Inject] - private IApiClient RolesClient { get; set; } = default!; - - protected EntityClientTableContext Context { get; set; } = default!; - - private bool _canViewRoleClaims; - - protected override async Task OnInitializedAsync() - { - var state = await AuthState; - _canViewRoleClaims = await AuthService.HasPermissionAsync(state.User, FshActions.View, FshResources.RoleClaims); - - Context = new( - entityName: "Role", - entityNamePlural: "Roles", - entityResource: FshResources.Roles, - searchAction: FshActions.View, - fields: new() - { - new(role => role.Id, "Id"), - new(role => role.Name,"Name"), - new(role => role.Description, "Description") - }, - idFunc: role => role.Id, - loadDataFunc: async () => (await RolesClient.GetRolesEndpointAsync()).ToList(), - searchFunc: (searchString, role) => - string.IsNullOrWhiteSpace(searchString) - || role.Name?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true - || role.Description?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true, - createFunc: async role => await RolesClient.CreateOrUpdateRoleEndpointAsync(role), - updateFunc: async (_, role) => await RolesClient.CreateOrUpdateRoleEndpointAsync(role), - deleteFunc: async id => await RolesClient.DeleteRoleEndpointAsync(id!), - hasExtraActionsFunc: () => _canViewRoleClaims, - canUpdateEntityFunc: e => !FshRoles.IsDefault(e.Name!), - canDeleteEntityFunc: e => !FshRoles.IsDefault(e.Name!), - exportAction: string.Empty); - } - - private void ManagePermissions(string? roleId) - { - ArgumentNullException.ThrowIfNull(roleId, nameof(roleId)); - Navigation.NavigateTo($"/identity/roles/{roleId}/permissions"); - } -} diff --git a/src/apps/blazor/client/Pages/Identity/Users/Audit.razor b/src/apps/blazor/client/Pages/Identity/Users/Audit.razor deleted file mode 100644 index 8da26afad7..0000000000 --- a/src/apps/blazor/client/Pages/Identity/Users/Audit.razor +++ /dev/null @@ -1,122 +0,0 @@ -@page "/identity/users/{Id:guid}/audit-trail" -@page "/identity/audit-trail" - - - - - - - - @((context.ShowDetails == true) ? "Hide" : "Show") Trail Details - - - - @if (context.ShowDetails) - { - - - - - - Details for Audit Trail with Id : @context.Id - - - - - - @if (!string.IsNullOrEmpty(context.ModifiedProperties)) - { - - - - - } - @if (!string.IsNullOrEmpty(context.PrimaryKey)) - { - - - - - } - @if (!string.IsNullOrEmpty(context.PreviousValues)) - { - - - - - } - @if (!string.IsNullOrEmpty(context.NewValues)) - { - - - - - } - -
Modified Properties - - @foreach (var column in context.ModifiedProperties.Trim('[').Trim(']').Split(',')) - { - @column.Replace('"', ' ').Trim() - } - -
Primary Key - - @context.PrimaryKey?.Trim('{').Trim('}').Replace('"', ' ').Trim() - -
Previous Values - - - @foreach (var value in context.PreviousValues.Trim('{').Trim('}').Split(',')) - { - @if (_searchInOldValues) - { - - - - } - else - { - @value.Replace('"', ' ').Trim() - } - } - -
Current Values - - - @foreach (var value in context.NewValues.Trim('{').Trim('}').Split(',')) - { - @if (_searchInNewValues) - { - - - - } - else - { - @value.Replace('"', ' ').Trim() - } - } - -
-
-
- -
- } -
- -
- -@code { - private RenderFragment DateFieldTemplate => trail => __builder => - { - - @trail.DateTime.ToString("dd-MMMM-yyyy hh:mm tt") - - - @trail.UTCTime.ToString("dd-MMMM-yyyy hh:mm tt") (UTC) - - }; -} \ No newline at end of file diff --git a/src/apps/blazor/client/Pages/Identity/Users/Audit.razor.cs b/src/apps/blazor/client/Pages/Identity/Users/Audit.razor.cs deleted file mode 100644 index 89b6a39923..0000000000 --- a/src/apps/blazor/client/Pages/Identity/Users/Audit.razor.cs +++ /dev/null @@ -1,89 +0,0 @@ -using FSH.Starter.Blazor.Client.Components.EntityTable; -using FSH.Starter.Blazor.Infrastructure.Api; -using FSH.Starter.Shared.Authorization; -using Mapster; -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.Components.Authorization; -using MudBlazor; - -namespace FSH.Starter.Blazor.Client.Pages.Identity.Users; - -public partial class Audit -{ - [Inject] - private IApiClient ApiClient { get; set; } = default!; - [CascadingParameter] - protected Task AuthState { get; set; } = default!; - [Parameter] - public Guid Id { get; set; } - - protected EntityClientTableContext Context { get; set; } = default!; - - private string? _searchString; - private string? _subHeader; - private MudDateRangePicker _dateRangePicker = default!; - private DateRange? _dateRange; - private bool _searchInOldValues; - private bool _searchInNewValues; - private List _trails = new(); - - // Configure Automapper - static Audit() => - TypeAdapterConfig.NewConfig().Map( - dest => dest.UTCTime, - src => DateTime.SpecifyKind(src.DateTime, DateTimeKind.Utc).ToLocalTime()); - - - - protected override async Task OnInitializedAsync() - { - if (Id == Guid.Empty) - { - var state = await AuthState; - if (state != null) - { - Id = new Guid(state.User.GetUserId()!); - } - } - _subHeader = $"Audit Trail for User {Id}"; - Context = new( - entityNamePlural: "Trails", - searchAction: true.ToString(), - fields: new() - { - new(audit => audit.Id,"Id"), - new(audit => audit.Entity, "Entity"), - new(audit => audit.DateTime, "Date", Template: DateFieldTemplate), - new(audit => audit.Operation, "Operation") - }, - loadDataFunc: async () => _trails = (await ApiClient.GetUserAuditTrailEndpointAsync(Id)).Adapt>(), - searchFunc: (searchString, trail) => - (string.IsNullOrWhiteSpace(searchString) // check Search String - || trail.Entity?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true - || (_searchInOldValues && - trail.PreviousValues?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true) - || (_searchInNewValues && - trail.NewValues?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true)) - && ((_dateRange?.Start is null && _dateRange?.End is null) // check Date Range - || (_dateRange?.Start is not null && _dateRange.End is null && trail.DateTime >= _dateRange.Start) - || (_dateRange?.Start is null && _dateRange?.End is not null && trail.DateTime <= _dateRange.End + new TimeSpan(0, 11, 59, 59, 999)) - || (trail.DateTime >= _dateRange!.Start && trail.DateTime <= _dateRange.End + new TimeSpan(0, 11, 59, 59, 999))), - hasExtraActionsFunc: () => true); - } - - private void ShowBtnPress(Guid id) - { - var trail = _trails.First(f => f.Id == id); - trail.ShowDetails = !trail.ShowDetails; - foreach (var otherTrail in _trails.Except(new[] { trail })) - { - otherTrail.ShowDetails = false; - } - } - - public class RelatedAuditTrail : AuditTrail - { - public bool ShowDetails { get; set; } - public DateTime UTCTime { get; set; } - } -} diff --git a/src/apps/blazor/client/Pages/Identity/Users/UserProfile.razor b/src/apps/blazor/client/Pages/Identity/Users/UserProfile.razor deleted file mode 100644 index 6da18c6e3e..0000000000 --- a/src/apps/blazor/client/Pages/Identity/Users/UserProfile.razor +++ /dev/null @@ -1,147 +0,0 @@ -@page "/identity/users/{Id}/profile" - - - -@if (!_loaded) -{ - -} -else -{ - - - @if (_canToggleUserStatus) - { - - - - - Administrator Settings. - This is an Administrator Only View. - - - - - - - Save Changes - - - - - - } - - - - -
- @if (_imageUrl != null) - { - - - - } - else - { - @_firstLetterOfName - - } -
- @_firstName @_lastName - @_email -
- -
- @if (_imageUrl != null) - { - - View - - } -
- -
-
-
- - - - - Public Profile - - - - - - @_firstName - - - @_lastName - - - @_phoneNumber - - - - @_email - - - - - -
-} - -@code -{ -public class CustomStringToBoolConverter : BoolConverter - { - - public CustomStringToBoolConverter() - { - SetFunc = OnSet; - GetFunc = OnGet; - } - private string TrueString = "User Active"; - private string FalseString = "no, at all"; - private string NullString = "I don't know"; - - private string OnGet(bool? value) - { - try - { - return (value == true) ? TrueString : FalseString; - } - catch (Exception e) - { - UpdateGetError("Conversion error: " + e.Message); - return NullString; - } - } - - private bool? OnSet(string arg) - { - if (arg == null) - return null; - try - { - if (arg == TrueString) - return true; - if (arg == FalseString) - return false; - else - return null; - } - catch (FormatException e) - { - UpdateSetError("Conversion error: " + e.Message); - return null; - } - } - - } -} \ No newline at end of file diff --git a/src/apps/blazor/client/Pages/Identity/Users/UserProfile.razor.cs b/src/apps/blazor/client/Pages/Identity/Users/UserProfile.razor.cs deleted file mode 100644 index e46bc35faa..0000000000 --- a/src/apps/blazor/client/Pages/Identity/Users/UserProfile.razor.cs +++ /dev/null @@ -1,73 +0,0 @@ -using FSH.Starter.Blazor.Client.Components; -using FSH.Starter.Blazor.Infrastructure.Api; -using FSH.Starter.Blazor.Infrastructure.Auth; -using FSH.Starter.Shared.Authorization; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.Components.Authorization; - -namespace FSH.Starter.Blazor.Client.Pages.Identity.Users; - -public partial class UserProfile -{ - [CascadingParameter] - protected Task AuthState { get; set; } = default!; - [Inject] - protected IAuthorizationService AuthService { get; set; } = default!; - [Inject] - protected IApiClient UsersClient { get; set; } = default!; - - [Parameter] - public string? Id { get; set; } - [Parameter] - public string? Title { get; set; } - [Parameter] - public string? Description { get; set; } - - private bool _active; - private bool _emailConfirmed; - private char _firstLetterOfName; - private string? _firstName; - private string? _lastName; - private string? _phoneNumber; - private string? _email; - private Uri? _imageUrl; - private bool _loaded; - private bool _canToggleUserStatus; - - private async Task ToggleUserStatus() - { - var request = new ToggleUserStatusCommand { ActivateUser = _active, UserId = Id }; - await ApiHelper.ExecuteCallGuardedAsync(() => UsersClient.ToggleUserStatusEndpointAsync(Id!, request), Toast); - Navigation.NavigateTo("/identity/users"); - } - - [Parameter] - public string? ImageUrl { get; set; } - - protected override async Task OnInitializedAsync() - { - if (await ApiHelper.ExecuteCallGuardedAsync( - () => UsersClient.GetUserEndpointAsync(Id!), Toast, Navigation) - is UserDetail user) - { - _firstName = user.FirstName; - _lastName = user.LastName; - _email = user.Email; - _phoneNumber = user.PhoneNumber; - _active = user.IsActive; - _emailConfirmed = user.EmailConfirmed; - _imageUrl = user.ImageUrl; - Title = $"{_firstName} {_lastName}'s Profile"; - Description = _email; - if (_firstName?.Length > 0) - { - _firstLetterOfName = _firstName.ToUpperInvariant().FirstOrDefault(); - } - } - - var state = await AuthState; - _canToggleUserStatus = await AuthService.HasPermissionAsync(state.User, FshActions.Update, FshResources.Users); - _loaded = true; - } -} diff --git a/src/apps/blazor/client/Pages/Identity/Users/UserRoles.razor b/src/apps/blazor/client/Pages/Identity/Users/UserRoles.razor deleted file mode 100644 index 9684ead141..0000000000 --- a/src/apps/blazor/client/Pages/Identity/Users/UserRoles.razor +++ /dev/null @@ -1,66 +0,0 @@ -@page "/identity/users/{Id}/roles" - - - -@if (!_loaded) -{ - -} -else -{ - - -
- - Back - - @if (_canEditUsers) - { - - Update - - } -
- - @if (_canSearchRoles) - { - - - } -
- - - Role Name - - - - - Description - - - - - Status - - - - - - - - - - - - - - - - - - -
-} \ No newline at end of file diff --git a/src/apps/blazor/client/Pages/Identity/Users/UserRoles.razor.cs b/src/apps/blazor/client/Pages/Identity/Users/UserRoles.razor.cs deleted file mode 100644 index 66972a46a2..0000000000 --- a/src/apps/blazor/client/Pages/Identity/Users/UserRoles.razor.cs +++ /dev/null @@ -1,78 +0,0 @@ -using FSH.Starter.Blazor.Client.Components; -using FSH.Starter.Blazor.Infrastructure.Api; -using FSH.Starter.Blazor.Infrastructure.Auth; -using FSH.Starter.Shared.Authorization; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.Components.Authorization; - -namespace FSH.Starter.Blazor.Client.Pages.Identity.Users; - -public partial class UserRoles -{ - [Parameter] - public string? Id { get; set; } - [CascadingParameter] - protected Task AuthState { get; set; } = default!; - [Inject] - protected IAuthorizationService AuthService { get; set; } = default!; - [Inject] - protected IApiClient UsersClient { get; set; } = default!; - - private List _userRolesList = default!; - - private string _title = string.Empty; - private string _description = string.Empty; - - private string _searchString = string.Empty; - - private bool _canEditUsers; - private bool _canSearchRoles; - private bool _loaded; - - protected override async Task OnInitializedAsync() - { - var state = await AuthState; - - _canEditUsers = await AuthService.HasPermissionAsync(state.User, FshActions.Update, FshResources.Users); - _canSearchRoles = await AuthService.HasPermissionAsync(state.User, FshActions.View, FshResources.UserRoles); - - if (await ApiHelper.ExecuteCallGuardedAsync( - () => UsersClient.GetUserEndpointAsync(Id!), Toast, Navigation) - is UserDetail user) - { - _title = $"{user.FirstName} {user.LastName}'s Roles"; - _description = string.Format("Manage {0} {1}'s Roles", user.FirstName, user.LastName); - - if (await ApiHelper.ExecuteCallGuardedAsync( - () => UsersClient.GetUserRolesEndpointAsync(user.Id.ToString()), Toast, Navigation) - is ICollection response) - { - _userRolesList = response.ToList(); - } - } - - _loaded = true; - } - - private async Task SaveAsync() - { - var request = new AssignUserRoleCommand() - { - UserRoles = _userRolesList - }; - - Console.WriteLine($"roles : {request.UserRoles.Count}"); - - await ApiHelper.ExecuteCallGuardedAsync( - () => UsersClient.AssignRolesToUserEndpointAsync(Id, request), - Toast, - successMessage: "updated user roles"); - - Navigation.NavigateTo("/identity/users"); - } - - private bool Search(UserRoleDetail userRole) => - string.IsNullOrWhiteSpace(_searchString) - || userRole.RoleName?.Contains(_searchString, StringComparison.OrdinalIgnoreCase) is true; -} diff --git a/src/apps/blazor/client/Pages/Identity/Users/Users.razor b/src/apps/blazor/client/Pages/Identity/Users/Users.razor deleted file mode 100644 index 1986717c19..0000000000 --- a/src/apps/blazor/client/Pages/Identity/Users/Users.razor +++ /dev/null @@ -1,47 +0,0 @@ -@page "/identity/users" - - - - - - View Profile - @if (_canViewRoles) - { - Manage Roles - } - @if (_canViewAuditTrails) - { - View Audit Trails - } - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/apps/blazor/client/Pages/Identity/Users/Users.razor.cs b/src/apps/blazor/client/Pages/Identity/Users/Users.razor.cs deleted file mode 100644 index 24da0adff1..0000000000 --- a/src/apps/blazor/client/Pages/Identity/Users/Users.razor.cs +++ /dev/null @@ -1,99 +0,0 @@ -using FSH.Starter.Blazor.Client.Components.EntityTable; -using FSH.Starter.Blazor.Infrastructure.Api; -using FSH.Starter.Blazor.Infrastructure.Auth; -using FSH.Starter.Shared.Authorization; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.Components.Authorization; -using MudBlazor; - -namespace FSH.Starter.Blazor.Client.Pages.Identity.Users; - -public partial class Users -{ - [CascadingParameter] - protected Task AuthState { get; set; } = default!; - [Inject] - protected IAuthorizationService AuthService { get; set; } = default!; - - [Inject] - protected IApiClient UsersClient { get; set; } = default!; - - protected EntityClientTableContext Context { get; set; } = default!; - - private bool _canExportUsers; - private bool _canViewAuditTrails; - private bool _canViewRoles; - - // Fields for editform - protected string Password { get; set; } = string.Empty; - protected string ConfirmPassword { get; set; } = string.Empty; - - private bool _passwordVisibility; - private InputType _passwordInput = InputType.Password; - private string _passwordInputIcon = Icons.Material.Filled.VisibilityOff; - - protected override async Task OnInitializedAsync() - { - var user = (await AuthState).User; - _canExportUsers = await AuthService.HasPermissionAsync(user, FshActions.Export, FshResources.Users); - _canViewRoles = await AuthService.HasPermissionAsync(user, FshActions.View, FshResources.UserRoles); - _canViewAuditTrails = await AuthService.HasPermissionAsync(user, FshActions.View, FshResources.AuditTrails); - - Context = new( - entityName: "User", - entityNamePlural: "Users", - entityResource: FshResources.Users, - searchAction: FshActions.View, - updateAction: string.Empty, - deleteAction: string.Empty, - fields: new() - { - new(user => user.FirstName,"First Name"), - new(user => user.LastName, "Last Name"), - new(user => user.UserName, "UserName"), - new(user => user.Email, "Email"), - new(user => user.PhoneNumber, "PhoneNumber"), - new(user => user.EmailConfirmed, "Email Confirmation", Type: typeof(bool)), - new(user => user.IsActive, "Active", Type: typeof(bool)) - }, - idFunc: user => user.Id, - loadDataFunc: async () => (await UsersClient.GetUsersListEndpointAsync()).ToList(), - searchFunc: (searchString, user) => - string.IsNullOrWhiteSpace(searchString) - || user.FirstName?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true - || user.LastName?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true - || user.Email?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true - || user.PhoneNumber?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true - || user.UserName?.Contains(searchString, StringComparison.OrdinalIgnoreCase) == true, - createFunc: user => UsersClient.RegisterUserEndpointAsync(user), - hasExtraActionsFunc: () => true, - exportAction: string.Empty); - } - - private void ViewProfile(in Guid userId) => - Navigation.NavigateTo($"/identity/users/{userId}/profile"); - - private void ManageRoles(in Guid userId) => - Navigation.NavigateTo($"/identity/users/{userId}/roles"); - private void ViewAuditTrails(in Guid userId) => - Navigation.NavigateTo($"/identity/users/{userId}/audit-trail"); - - private void TogglePasswordVisibility() - { - if (_passwordVisibility) - { - _passwordVisibility = false; - _passwordInputIcon = Icons.Material.Filled.VisibilityOff; - _passwordInput = InputType.Password; - } - else - { - _passwordVisibility = true; - _passwordInputIcon = Icons.Material.Filled.Visibility; - _passwordInput = InputType.Text; - } - - Context.AddEditModal.ForceRender(); - } -} diff --git a/src/apps/blazor/client/Pages/Multitenancy/Tenants.razor b/src/apps/blazor/client/Pages/Multitenancy/Tenants.razor deleted file mode 100644 index a51e8e0239..0000000000 --- a/src/apps/blazor/client/Pages/Multitenancy/Tenants.razor +++ /dev/null @@ -1,86 +0,0 @@ -@page "/tenants" - -@inject IAuthenticationService Authentication - - - - - - - - - - - - - - - - - - - - @if(_canUpgrade) - { - Upgrade Subscription - } - - @((context.ShowDetails == true) ? "Hide" : "Show") Tenant Details - - @if (_canModify) - { - @if (!context.IsActive) - { - Activate Tenant - } - else - { - Deactivate Tenant - } - } - - - - @if (context.ShowDetails) - { - - - - - - Details for Tenant : - @context.Id - - - - - - - - @if(string.IsNullOrEmpty(context.ConnectionString?.Trim())) - { - Shared Database - } - else - { - - - } - - -
Connection String - - @context.ConnectionString?.Trim() - -
-
-
- -
- } -
- -
\ No newline at end of file diff --git a/src/apps/blazor/client/Pages/Multitenancy/Tenants.razor.cs b/src/apps/blazor/client/Pages/Multitenancy/Tenants.razor.cs deleted file mode 100644 index 3dbc8d41b4..0000000000 --- a/src/apps/blazor/client/Pages/Multitenancy/Tenants.razor.cs +++ /dev/null @@ -1,121 +0,0 @@ -using FSH.Starter.Blazor.Client.Components; -using FSH.Starter.Blazor.Client.Components.EntityTable; -using FSH.Starter.Blazor.Infrastructure.Api; -using FSH.Starter.Blazor.Infrastructure.Auth; -using FSH.Starter.Shared.Authorization; -using Mapster; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.Components.Authorization; -using MudBlazor; - -namespace FSH.Starter.Blazor.Client.Pages.Multitenancy; - -public partial class Tenants -{ - [Inject] - private IApiClient ApiClient { get; set; } = default!; - private string? _searchString; - protected EntityClientTableContext Context { get; set; } = default!; - private List _tenants = new(); - public EntityTable EntityTable { get; set; } = default!; - [CascadingParameter] - protected Task AuthState { get; set; } = default!; - [Inject] - protected IAuthorizationService AuthService { get; set; } = default!; - - private bool _canUpgrade; - private bool _canModify; - - protected override async Task OnInitializedAsync() - { - Context = new( - entityName: "Tenant", - entityNamePlural: "Tenants", - entityResource: FshResources.Tenants, - searchAction: FshActions.View, - deleteAction: string.Empty, - updateAction: string.Empty, - fields: new() - { - new(tenant => tenant.Id, "Id"), - new(tenant => tenant.Name, "Name"), - new(tenant => tenant.AdminEmail, "Admin Email"), - new(tenant => tenant.ValidUpto.ToString("MMM dd, yyyy"), "Valid Upto"), - new(tenant => tenant.IsActive, "Active", Type: typeof(bool)) - }, - loadDataFunc: async () => _tenants = (await ApiClient.GetTenantsEndpointAsync()).Adapt>(), - searchFunc: (searchString, tenantDto) => - string.IsNullOrWhiteSpace(searchString) - || tenantDto.Name.Contains(searchString, StringComparison.OrdinalIgnoreCase), - createFunc: tenant => ApiClient.CreateTenantEndpointAsync(tenant.Adapt()), - hasExtraActionsFunc: () => true, - exportAction: string.Empty); - - var state = await AuthState; - _canUpgrade = await AuthService.HasPermissionAsync(state.User, FshActions.UpgradeSubscription, FshResources.Tenants); - _canModify = await AuthService.HasPermissionAsync(state.User, FshActions.Update, FshResources.Tenants); - } - - private void ViewTenantDetails(string id) - { - var tenant = _tenants.First(f => f.Id == id); - tenant.ShowDetails = !tenant.ShowDetails; - foreach (var otherTenants in _tenants.Except(new[] { tenant })) - { - otherTenants.ShowDetails = false; - } - } - - private async Task ViewUpgradeSubscriptionModalAsync(string id) - { - var tenant = _tenants.First(f => f.Id == id); - var parameters = new DialogParameters - { - { - nameof(UpgradeSubscriptionModal.Request), - new UpgradeSubscriptionCommand - { - Tenant = tenant.Id, - ExtendedExpiryDate = tenant.ValidUpto - } - } - }; - var options = new DialogOptions { CloseButton = true, MaxWidth = MaxWidth.Small, FullWidth = true, BackdropClick = false }; - var dialog = DialogService.Show("Upgrade Subscription", parameters, options); - var result = await dialog.Result; - if (!result.Canceled) - { - await EntityTable.ReloadDataAsync(); - } - } - - private async Task DeactivateTenantAsync(string id) - { - if (await ApiHelper.ExecuteCallGuardedAsync( - () => ApiClient.DisableTenantEndpointAsync(id), - Toast, Navigation, - null, - "Tenant Deactivated.") is not null) - { - await EntityTable.ReloadDataAsync(); - } - } - - private async Task ActivateTenantAsync(string id) - { - if (await ApiHelper.ExecuteCallGuardedAsync( - () => ApiClient.ActivateTenantEndpointAsync(id), - Toast, Navigation, - null, - "Tenant Activated.") is not null) - { - await EntityTable.ReloadDataAsync(); - } - } - - public class TenantViewModel : TenantDetail - { - public bool ShowDetails { get; set; } - } -} diff --git a/src/apps/blazor/client/Pages/Multitenancy/UpgradeSubscriptionModal.razor b/src/apps/blazor/client/Pages/Multitenancy/UpgradeSubscriptionModal.razor deleted file mode 100644 index f91a7b5975..0000000000 --- a/src/apps/blazor/client/Pages/Multitenancy/UpgradeSubscriptionModal.razor +++ /dev/null @@ -1,57 +0,0 @@ -@inject IApiClient TenantsClient - - - - - - - Upgrade Subscription - - - - - - - - - - - - - - - - - Cancel - Upgrade - - - - -@code -{ - [Parameter] public UpgradeSubscriptionCommand Request { get; set; } = new(); - [CascadingParameter] private IMudDialogInstance MudDialog { get; set; } = default!; - DateTime? date = DateTime.Today; - - protected override void OnInitialized() => - date = Request.ExtendedExpiryDate; - - private async Task UpgradeSubscriptionAsync() - { - Request.ExtendedExpiryDate = date.HasValue ? date.Value : Request.ExtendedExpiryDate; - if (await ApiHelper.ExecuteCallGuardedAsync( - () => TenantsClient.UpgradeSubscriptionEndpointAsync(Request), - Toast, Navigation, - null, - "Upgraded Subscription.") is not null) - { - MudDialog.Close(); - } - } - - public void Cancel() - { - MudDialog.Cancel(); - } -} \ No newline at end of file diff --git a/src/apps/blazor/client/Pages/Todos/Todos.razor b/src/apps/blazor/client/Pages/Todos/Todos.razor deleted file mode 100644 index 9c3ce5d704..0000000000 --- a/src/apps/blazor/client/Pages/Todos/Todos.razor +++ /dev/null @@ -1,39 +0,0 @@ -@page "/todos" - - - - - - @if (!Context.AddEditModal.IsCreate) - { - - - - } - - - - - - - - -
- @if(!Context.AddEditModal.IsCreate) - { - - View - - - - Delete - - } -
-
-
-
- -
\ No newline at end of file diff --git a/src/apps/blazor/client/Pages/Todos/Todos.razor.cs b/src/apps/blazor/client/Pages/Todos/Todos.razor.cs deleted file mode 100644 index dfc6111c5c..0000000000 --- a/src/apps/blazor/client/Pages/Todos/Todos.razor.cs +++ /dev/null @@ -1,51 +0,0 @@ -using FSH.Starter.Blazor.Client.Components.EntityTable; -using FSH.Starter.Blazor.Infrastructure.Api; -using FSH.Starter.Shared.Authorization; -using Mapster; -using Microsoft.AspNetCore.Components; - -namespace FSH.Starter.Blazor.Client.Pages.Todos; - -public partial class Todos -{ - [Inject] - protected IApiClient ApiClient { get; set; } = default!; - - protected EntityServerTableContext Context { get; set; } = default!; - - private EntityTable _table = default!; - - protected override void OnInitialized() => - Context = new( - entityName: "Todos", - entityNamePlural: "Todos", - entityResource: FshResources.Todos, - fields: new() - { - new(prod => prod.Id,"Id", "Id"), - new(prod => prod.Title,"Title", "Title"), - new(prod => prod.Note, "Note", "Note") - }, - enableAdvancedSearch: false, - idFunc: prod => prod.Id!.Value, - searchFunc: async filter => - { - var todoFilter = filter.Adapt(); - - var result = await ApiClient.GetTodoListEndpointAsync("1", todoFilter); - return result.Adapt>(); - }, - createFunc: async todo => - { - await ApiClient.CreateTodoEndpointAsync("1", todo.Adapt()); - }, - updateFunc: async (id, todo) => - { - await ApiClient.UpdateTodoEndpointAsync("1", id, todo.Adapt()); - }, - deleteFunc: async id => await ApiClient.DeleteTodoEndpointAsync("1", id)); -} - -public class TodoViewModel : UpdateTodoCommand -{ -} diff --git a/src/apps/blazor/client/Program.cs b/src/apps/blazor/client/Program.cs deleted file mode 100644 index c1026795e2..0000000000 --- a/src/apps/blazor/client/Program.cs +++ /dev/null @@ -1,11 +0,0 @@ -using FSH.Starter.Blazor.Client; -using FSH.Starter.Blazor.Infrastructure; -using Microsoft.AspNetCore.Components.Web; -using Microsoft.AspNetCore.Components.WebAssembly.Hosting; - -var builder = WebAssemblyHostBuilder.CreateDefault(args); -builder.RootComponents.Add("#app"); -builder.RootComponents.Add("head::after"); -builder.Services.AddClientServices(builder.Configuration); - -await builder.Build().RunAsync(); diff --git a/src/apps/blazor/client/Properties/launchSettings.json b/src/apps/blazor/client/Properties/launchSettings.json deleted file mode 100644 index 11f084657d..0000000000 --- a/src/apps/blazor/client/Properties/launchSettings.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "http://json.schemastore.org/launchsettings.json", - "profiles": { - "https": { - "commandName": "Project", - "dotnetRunMessages": false, - "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "applicationUrl": "https://localhost:7100;http://localhost:5100", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} \ No newline at end of file diff --git a/src/apps/blazor/client/_Imports.razor b/src/apps/blazor/client/_Imports.razor deleted file mode 100644 index 198b0183ed..0000000000 --- a/src/apps/blazor/client/_Imports.razor +++ /dev/null @@ -1,34 +0,0 @@ -@using System.Net.Http -@using System.Net.Http.Json -@using FSH.Starter.Blazor.Infrastructure.Preferences -@using Microsoft.AspNetCore.Components.Authorization -@using Microsoft.AspNetCore.Components.Forms -@using Microsoft.AspNetCore.Components.Routing -@using Microsoft.AspNetCore.Components.Web -@using Microsoft.AspNetCore.Components.Web.Virtualization -@using Microsoft.AspNetCore.Components.WebAssembly.Http -@using Microsoft.JSInterop -@using FSH.Starter.Blazor.Client -@using FSH.Starter.Blazor.Client.Layout -@using FSH.Starter.Blazor.Client.Components -@using FSH.Starter.Blazor.Client.Components.General -@using FSH.Starter.Blazor.Client.Components.Dialogs -@using FSH.Starter.Blazor.Client.Components.Common -@using FSH.Starter.Blazor.Client.Components.EntityTable -@using FSH.Starter.Blazor.Infrastructure.Auth -@using MudBlazor -@using Blazored.LocalStorage -@using FSH.Starter.Blazor.Infrastructure.Api -@using FSH.Starter.Blazor.Client.Components.ThemeManager; - -@using FSH.Starter.Blazor.Client.Pages.Auth - -@using Microsoft.AspNetCore.Authorization - -@attribute [Authorize] - -@inject NavigationManager Navigation -@inject ISnackbar Toast -@inject IDialogService DialogService -@inject IConfiguration Config -@inject IClientPreferenceManager ClientPreferences diff --git a/src/apps/blazor/client/wwwroot/appsettings.json b/src/apps/blazor/client/wwwroot/appsettings.json deleted file mode 100644 index f5a8477dca..0000000000 --- a/src/apps/blazor/client/wwwroot/appsettings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "ApiBaseUrl": "https://localhost:7000/" -} \ No newline at end of file diff --git a/src/apps/blazor/client/wwwroot/appsettings.json.TEMPLATE b/src/apps/blazor/client/wwwroot/appsettings.json.TEMPLATE deleted file mode 100644 index 42be8ab4f6..0000000000 --- a/src/apps/blazor/client/wwwroot/appsettings.json.TEMPLATE +++ /dev/null @@ -1,4 +0,0 @@ -{ - "ApiBaseUrl": "${FSHStarterBlazorClient_ApiBaseUrl}" -} - diff --git a/src/apps/blazor/client/wwwroot/css/fsh.css b/src/apps/blazor/client/wwwroot/css/fsh.css deleted file mode 100644 index 495fdb0900..0000000000 --- a/src/apps/blazor/client/wwwroot/css/fsh.css +++ /dev/null @@ -1,7 +0,0 @@ -.mud-navmenu.mud-navmenu-default .mud-nav-link.active:not(.mud-nav-link-disabled) { - color: inherit; -} - -.mud-list { - border: 1px solid var(--mud-palette-lines-default) -} \ No newline at end of file diff --git a/src/apps/blazor/client/wwwroot/favicon.png b/src/apps/blazor/client/wwwroot/favicon.png deleted file mode 100644 index 8422b59695935d180d11d5dbe99653e711097819..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1148 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ℑ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
bc*V300m7E4Zm@WT* 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

)!RQS&Mik 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 diff --git a/src/apps/blazor/client/wwwroot/icon-512.png b/src/apps/blazor/client/wwwroot/icon-512.png deleted file mode 100644 index c2dd4842dc93df73c322218ee03eca142a19a338..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6311 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 diff --git a/src/apps/blazor/client/wwwroot/index.html b/src/apps/blazor/client/wwwroot/index.html deleted file mode 100644 index 8b67346c22..0000000000 --- a/src/apps/blazor/client/wwwroot/index.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - FSH.Starter.Blazor - - - - - - - - - - - -

- - -
-
-
-
-
- -
-
-
- -
- - - - - - diff --git a/src/apps/blazor/client/wwwroot/manifest.webmanifest b/src/apps/blazor/client/wwwroot/manifest.webmanifest deleted file mode 100644 index d2a6b40078..0000000000 --- a/src/apps/blazor/client/wwwroot/manifest.webmanifest +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "FSH.Starter.Blazor", - "short_name": "FSH.Starter.Blazor", - "id": "./", - "start_url": "./", - "display": "standalone", - "background_color": "#ffffff", - "theme_color": "#03173d", - "prefer_related_applications": false, - "icons": [ - { - "src": "icon-512.png", - "type": "image/png", - "sizes": "512x512" - }, - { - "src": "icon-192.png", - "type": "image/png", - "sizes": "192x192" - } - ] -} diff --git a/src/apps/blazor/client/wwwroot/service-worker.js b/src/apps/blazor/client/wwwroot/service-worker.js deleted file mode 100644 index fe614daee0..0000000000 --- a/src/apps/blazor/client/wwwroot/service-worker.js +++ /dev/null @@ -1,4 +0,0 @@ -// 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/apps/blazor/client/wwwroot/service-worker.published.js b/src/apps/blazor/client/wwwroot/service-worker.published.js deleted file mode 100644 index 1f7f543fa5..0000000000 --- a/src/apps/blazor/client/wwwroot/service-worker.published.js +++ /dev/null @@ -1,55 +0,0 @@ -// 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$/ ]; - -// Replace with your base path if you are hosting on a subfolder. Ensure there is a trailing '/'. -const base = "/"; -const baseUrl = new URL(base, self.origin); -const manifestUrlList = self.assetsManifest.assets.map(asset => new URL(asset.url, baseUrl).href); - -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, - // unless that request is for an offline resource. - // If you need some URLs to be server-rendered, edit the following check to exclude those URLs - const shouldServeIndexHtml = event.request.mode === 'navigate' - && !manifestUrlList.some(url => url === event.request.url); - - 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/apps/blazor/infrastructure/Api/ApiClient.cs b/src/apps/blazor/infrastructure/Api/ApiClient.cs deleted file mode 100644 index 0de5930cbf..0000000000 --- a/src/apps/blazor/infrastructure/Api/ApiClient.cs +++ /dev/null @@ -1,6267 +0,0 @@ -//---------------------- -// -// Generated using the NSwag toolchain v14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0)) (http://NSwag.org) -// -//---------------------- - -#nullable enable - -#pragma warning disable 108 // Disable "CS0108 '{derivedDto}.ToJson()' hides inherited member '{dtoBase}.ToJson()'. Use the new keyword if hiding was intended." -#pragma warning disable 114 // Disable "CS0114 '{derivedDto}.RaisePropertyChanged(String)' hides inherited member 'dtoBase.RaisePropertyChanged(String)'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword." -#pragma warning disable 472 // Disable "CS0472 The result of the expression is always 'false' since a value of type 'Int32' is never equal to 'null' of type 'Int32?' -#pragma warning disable 612 // Disable "CS0612 '...' is obsolete" -#pragma warning disable 649 // Disable "CS0649 Field is never assigned to, and will always have its default value null" -#pragma warning disable 1573 // Disable "CS1573 Parameter '...' has no matching param tag in the XML comment for ... -#pragma warning disable 1591 // Disable "CS1591 Missing XML comment for publicly visible type or member ..." -#pragma warning disable 8073 // Disable "CS8073 The result of the expression is always 'false' since a value of type 'T' is never equal to 'null' of type 'T?'" -#pragma warning disable 3016 // Disable "CS3016 Arrays as attribute arguments is not CLS-compliant" -#pragma warning disable 8603 // Disable "CS8603 Possible null reference return" -#pragma warning disable 8604 // Disable "CS8604 Possible null reference argument for parameter" -#pragma warning disable 8625 // Disable "CS8625 Cannot convert null literal to non-nullable reference type" -#pragma warning disable 8765 // Disable "CS8765 Nullability of type of parameter doesn't match overridden member (possibly because of nullability attributes)." - -namespace FSH.Starter.Blazor.Infrastructure.Api -{ - using System = global::System; - - [System.CodeDom.Compiler.GeneratedCode("NSwag", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial interface IApiClient - { - /// - /// creates a brand - /// - /// - /// creates a brand - /// - /// The requested API version - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task CreateBrandEndpointAsync(string version, CreateBrandCommand body); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// creates a brand - /// - /// - /// creates a brand - /// - /// The requested API version - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task CreateBrandEndpointAsync(string version, CreateBrandCommand body, System.Threading.CancellationToken cancellationToken); - - /// - /// gets brand by id - /// - /// - /// gets brand by id - /// - /// The requested API version - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task GetBrandEndpointAsync(string version, System.Guid id); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// gets brand by id - /// - /// - /// gets brand by id - /// - /// The requested API version - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task GetBrandEndpointAsync(string version, System.Guid id, System.Threading.CancellationToken cancellationToken); - - /// - /// update a brand - /// - /// - /// update a brand - /// - /// The requested API version - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task UpdateBrandEndpointAsync(string version, System.Guid id, UpdateBrandCommand body); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// update a brand - /// - /// - /// update a brand - /// - /// The requested API version - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task UpdateBrandEndpointAsync(string version, System.Guid id, UpdateBrandCommand body, System.Threading.CancellationToken cancellationToken); - - /// - /// deletes brand by id - /// - /// - /// deletes brand by id - /// - /// The requested API version - /// No Content - /// A server side error occurred. - System.Threading.Tasks.Task DeleteBrandEndpointAsync(string version, System.Guid id); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// deletes brand by id - /// - /// - /// deletes brand by id - /// - /// The requested API version - /// No Content - /// A server side error occurred. - System.Threading.Tasks.Task DeleteBrandEndpointAsync(string version, System.Guid id, System.Threading.CancellationToken cancellationToken); - - /// - /// Gets a list of brands - /// - /// - /// Gets a list of brands with pagination and filtering support - /// - /// The requested API version - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task SearchBrandsEndpointAsync(string version, SearchBrandsCommand body); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Gets a list of brands - /// - /// - /// Gets a list of brands with pagination and filtering support - /// - /// The requested API version - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task SearchBrandsEndpointAsync(string version, SearchBrandsCommand body, System.Threading.CancellationToken cancellationToken); - - /// - /// creates a product - /// - /// - /// creates a product - /// - /// The requested API version - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task CreateProductEndpointAsync(string version, CreateProductCommand body); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// creates a product - /// - /// - /// creates a product - /// - /// The requested API version - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task CreateProductEndpointAsync(string version, CreateProductCommand body, System.Threading.CancellationToken cancellationToken); - - /// - /// gets product by id - /// - /// - /// gets prodct by id - /// - /// The requested API version - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task GetProductEndpointAsync(string version, System.Guid id); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// gets product by id - /// - /// - /// gets prodct by id - /// - /// The requested API version - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task GetProductEndpointAsync(string version, System.Guid id, System.Threading.CancellationToken cancellationToken); - - /// - /// update a product - /// - /// - /// update a product - /// - /// The requested API version - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task UpdateProductEndpointAsync(string version, System.Guid id, UpdateProductCommand body); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// update a product - /// - /// - /// update a product - /// - /// The requested API version - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task UpdateProductEndpointAsync(string version, System.Guid id, UpdateProductCommand body, System.Threading.CancellationToken cancellationToken); - - /// - /// deletes product by id - /// - /// - /// deletes product by id - /// - /// The requested API version - /// No Content - /// A server side error occurred. - System.Threading.Tasks.Task DeleteProductEndpointAsync(string version, System.Guid id); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// deletes product by id - /// - /// - /// deletes product by id - /// - /// The requested API version - /// No Content - /// A server side error occurred. - System.Threading.Tasks.Task DeleteProductEndpointAsync(string version, System.Guid id, System.Threading.CancellationToken cancellationToken); - - /// - /// Gets a list of products - /// - /// - /// Gets a list of products with pagination and filtering support - /// - /// The requested API version - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task SearchProductsEndpointAsync(string version, SearchProductsCommand body); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Gets a list of products - /// - /// - /// Gets a list of products with pagination and filtering support - /// - /// The requested API version - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task SearchProductsEndpointAsync(string version, SearchProductsCommand body, System.Threading.CancellationToken cancellationToken); - - /// - /// Get role details by ID - /// - /// - /// Retrieve the details of a role by its ID. - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task GetRoleByIdEndpointAsync(string id); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Get role details by ID - /// - /// - /// Retrieve the details of a role by its ID. - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task GetRoleByIdEndpointAsync(string id, System.Threading.CancellationToken cancellationToken); - - /// - /// Delete a role by ID - /// - /// - /// Remove a role from the system by its ID. - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task DeleteRoleEndpointAsync(string id); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Delete a role by ID - /// - /// - /// Remove a role from the system by its ID. - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task DeleteRoleEndpointAsync(string id, System.Threading.CancellationToken cancellationToken); - - /// - /// Get a list of all roles - /// - /// - /// Retrieve a list of all roles available in the system. - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task> GetRolesEndpointAsync(); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Get a list of all roles - /// - /// - /// Retrieve a list of all roles available in the system. - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task> GetRolesEndpointAsync(System.Threading.CancellationToken cancellationToken); - - /// - /// Create or update a role - /// - /// - /// Create a new role or update an existing role. - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task CreateOrUpdateRoleEndpointAsync(CreateOrUpdateRoleCommand body); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Create or update a role - /// - /// - /// Create a new role or update an existing role. - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task CreateOrUpdateRoleEndpointAsync(CreateOrUpdateRoleCommand body, System.Threading.CancellationToken cancellationToken); - - /// - /// get role permissions - /// - /// - /// get role permissions - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task GetRolePermissionsEndpointAsync(string id); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// get role permissions - /// - /// - /// get role permissions - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task GetRolePermissionsEndpointAsync(string id, System.Threading.CancellationToken cancellationToken); - - /// - /// update role permissions - /// - /// - /// update role permissions - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task UpdateRolePermissionsEndpointAsync(string id, UpdatePermissionsCommand body); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// update role permissions - /// - /// - /// update role permissions - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task UpdateRolePermissionsEndpointAsync(string id, UpdatePermissionsCommand body, System.Threading.CancellationToken cancellationToken); - - /// - /// creates a tenant - /// - /// - /// creates a tenant - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task CreateTenantEndpointAsync(CreateTenantCommand body); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// creates a tenant - /// - /// - /// creates a tenant - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task CreateTenantEndpointAsync(CreateTenantCommand body, System.Threading.CancellationToken cancellationToken); - - /// - /// get tenants - /// - /// - /// get tenants - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task> GetTenantsEndpointAsync(); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// get tenants - /// - /// - /// get tenants - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task> GetTenantsEndpointAsync(System.Threading.CancellationToken cancellationToken); - - /// - /// get tenant by id - /// - /// - /// get tenant by id - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task GetTenantByIdEndpointAsync(string id); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// get tenant by id - /// - /// - /// get tenant by id - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task GetTenantByIdEndpointAsync(string id, System.Threading.CancellationToken cancellationToken); - - /// - /// upgrade tenant subscription - /// - /// - /// upgrade tenant subscription - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task UpgradeSubscriptionEndpointAsync(UpgradeSubscriptionCommand body); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// upgrade tenant subscription - /// - /// - /// upgrade tenant subscription - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task UpgradeSubscriptionEndpointAsync(UpgradeSubscriptionCommand body, System.Threading.CancellationToken cancellationToken); - - /// - /// activate tenant - /// - /// - /// activate tenant - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task ActivateTenantEndpointAsync(string id); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// activate tenant - /// - /// - /// activate tenant - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task ActivateTenantEndpointAsync(string id, System.Threading.CancellationToken cancellationToken); - - /// - /// activate tenant - /// - /// - /// activate tenant - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task DisableTenantEndpointAsync(string id); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// activate tenant - /// - /// - /// activate tenant - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task DisableTenantEndpointAsync(string id, System.Threading.CancellationToken cancellationToken); - - /// - /// Creates a todo item - /// - /// - /// Creates a todo item - /// - /// The requested API version - /// Created - /// A server side error occurred. - System.Threading.Tasks.Task CreateTodoEndpointAsync(string version, CreateTodoCommand body); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Creates a todo item - /// - /// - /// Creates a todo item - /// - /// The requested API version - /// Created - /// A server side error occurred. - System.Threading.Tasks.Task CreateTodoEndpointAsync(string version, CreateTodoCommand body, System.Threading.CancellationToken cancellationToken); - - /// - /// gets todo item by id - /// - /// - /// gets todo item by id - /// - /// The requested API version - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task GetTodoEndpointAsync(string version, System.Guid id); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// gets todo item by id - /// - /// - /// gets todo item by id - /// - /// The requested API version - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task GetTodoEndpointAsync(string version, System.Guid id, System.Threading.CancellationToken cancellationToken); - - /// - /// Updates a todo item - /// - /// - /// Updated a todo item - /// - /// The requested API version - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task UpdateTodoEndpointAsync(string version, System.Guid id, UpdateTodoCommand body); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Updates a todo item - /// - /// - /// Updated a todo item - /// - /// The requested API version - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task UpdateTodoEndpointAsync(string version, System.Guid id, UpdateTodoCommand body, System.Threading.CancellationToken cancellationToken); - - /// - /// Deletes a todo item - /// - /// - /// Deleted a todo item - /// - /// The requested API version - /// No Content - /// A server side error occurred. - System.Threading.Tasks.Task DeleteTodoEndpointAsync(string version, System.Guid id); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Deletes a todo item - /// - /// - /// Deleted a todo item - /// - /// The requested API version - /// No Content - /// A server side error occurred. - System.Threading.Tasks.Task DeleteTodoEndpointAsync(string version, System.Guid id, System.Threading.CancellationToken cancellationToken); - - /// - /// Gets a list of todo items with paging support - /// - /// - /// Gets a list of todo items with paging support - /// - /// The requested API version - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task GetTodoListEndpointAsync(string version, PaginationFilter body); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Gets a list of todo items with paging support - /// - /// - /// Gets a list of todo items with paging support - /// - /// The requested API version - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task GetTodoListEndpointAsync(string version, PaginationFilter body, System.Threading.CancellationToken cancellationToken); - - /// - /// refresh JWTs - /// - /// - /// refresh JWTs - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task RefreshTokenEndpointAsync(string tenant, RefreshTokenCommand body); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// refresh JWTs - /// - /// - /// refresh JWTs - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task RefreshTokenEndpointAsync(string tenant, RefreshTokenCommand body, System.Threading.CancellationToken cancellationToken); - - /// - /// generate JWTs - /// - /// - /// generate JWTs - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task TokenGenerationEndpointAsync(string tenant, TokenGenerationCommand body); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// generate JWTs - /// - /// - /// generate JWTs - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task TokenGenerationEndpointAsync(string tenant, TokenGenerationCommand body, System.Threading.CancellationToken cancellationToken); - - /// - /// register user - /// - /// - /// register user - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task RegisterUserEndpointAsync(RegisterUserCommand body); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// register user - /// - /// - /// register user - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task RegisterUserEndpointAsync(RegisterUserCommand body, System.Threading.CancellationToken cancellationToken); - - /// - /// self register user - /// - /// - /// self register user - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task SelfRegisterUserEndpointAsync(string tenant, RegisterUserCommand body); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// self register user - /// - /// - /// self register user - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task SelfRegisterUserEndpointAsync(string tenant, RegisterUserCommand body, System.Threading.CancellationToken cancellationToken); - - /// - /// update user profile - /// - /// - /// update user profile - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task UpdateUserEndpointAsync(UpdateUserCommand body); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// update user profile - /// - /// - /// update user profile - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task UpdateUserEndpointAsync(UpdateUserCommand body, System.Threading.CancellationToken cancellationToken); - - /// - /// Get current user information based on token - /// - /// - /// Get current user information based on token - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task GetMeEndpointAsync(); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Get current user information based on token - /// - /// - /// Get current user information based on token - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task GetMeEndpointAsync(System.Threading.CancellationToken cancellationToken); - - /// - /// get users list - /// - /// - /// get users list - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task> GetUsersListEndpointAsync(); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// get users list - /// - /// - /// get users list - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task> GetUsersListEndpointAsync(System.Threading.CancellationToken cancellationToken); - - /// - /// delete user profile - /// - /// - /// delete user profile - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task DeleteUserEndpointAsync(string id); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// delete user profile - /// - /// - /// delete user profile - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task DeleteUserEndpointAsync(string id, System.Threading.CancellationToken cancellationToken); - - /// - /// Get user profile by ID - /// - /// - /// Get another user's profile details by user ID. - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task GetUserEndpointAsync(string id); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Get user profile by ID - /// - /// - /// Get another user's profile details by user ID. - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task GetUserEndpointAsync(string id, System.Threading.CancellationToken cancellationToken); - - /// - /// Forgot password - /// - /// - /// Generates a password reset token and sends it via email. - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task ForgotPasswordEndpointAsync(string tenant, ForgotPasswordCommand body); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Forgot password - /// - /// - /// Generates a password reset token and sends it via email. - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task ForgotPasswordEndpointAsync(string tenant, ForgotPasswordCommand body, System.Threading.CancellationToken cancellationToken); - - /// - /// Changes password - /// - /// - /// Change password - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task ChangePasswordEndpointAsync(ChangePasswordCommand body); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Changes password - /// - /// - /// Change password - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task ChangePasswordEndpointAsync(ChangePasswordCommand body, System.Threading.CancellationToken cancellationToken); - - /// - /// Reset password - /// - /// - /// Resets the password using the token and new password provided. - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task ResetPasswordEndpointAsync(string tenant, ResetPasswordCommand body); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Reset password - /// - /// - /// Resets the password using the token and new password provided. - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task ResetPasswordEndpointAsync(string tenant, ResetPasswordCommand body, System.Threading.CancellationToken cancellationToken); - - /// - /// Get current user permissions - /// - /// - /// Get current user permissions - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task> GetUserPermissionsAsync(); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Get current user permissions - /// - /// - /// Get current user permissions - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task> GetUserPermissionsAsync(System.Threading.CancellationToken cancellationToken); - - /// - /// Toggle a user's active status - /// - /// - /// Toggle a user's active status - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task ToggleUserStatusEndpointAsync(string id, ToggleUserStatusCommand body); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Toggle a user's active status - /// - /// - /// Toggle a user's active status - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task ToggleUserStatusEndpointAsync(string id, ToggleUserStatusCommand body, System.Threading.CancellationToken cancellationToken); - - /// - /// assign roles - /// - /// - /// assign roles - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task AssignRolesToUserEndpointAsync(string id, AssignUserRoleCommand body); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// assign roles - /// - /// - /// assign roles - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task AssignRolesToUserEndpointAsync(string id, AssignUserRoleCommand body, System.Threading.CancellationToken cancellationToken); - - /// - /// get user roles - /// - /// - /// get user roles - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task> GetUserRolesEndpointAsync(string id); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// get user roles - /// - /// - /// get user roles - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task> GetUserRolesEndpointAsync(string id, System.Threading.CancellationToken cancellationToken); - - /// - /// Get user's audit trail details - /// - /// - /// Get user's audit trail details. - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task> GetUserAuditTrailEndpointAsync(System.Guid id); - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Get user's audit trail details - /// - /// - /// Get user's audit trail details. - /// - /// OK - /// A server side error occurred. - System.Threading.Tasks.Task> GetUserAuditTrailEndpointAsync(System.Guid id, System.Threading.CancellationToken cancellationToken); - - } - - [System.CodeDom.Compiler.GeneratedCode("NSwag", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class ApiClient : IApiClient - { - private System.Net.Http.HttpClient _httpClient; - private static System.Lazy _settings = new System.Lazy(CreateSerializerSettings, true); - private System.Text.Json.JsonSerializerOptions _instanceSettings; - - #pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. - public ApiClient(System.Net.Http.HttpClient httpClient) - #pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. - { - _httpClient = httpClient; - Initialize(); - } - - private static System.Text.Json.JsonSerializerOptions CreateSerializerSettings() - { - var settings = new System.Text.Json.JsonSerializerOptions(); - UpdateJsonSerializerSettings(settings); - return settings; - } - - protected System.Text.Json.JsonSerializerOptions JsonSerializerSettings { get { return _instanceSettings ?? _settings.Value; } } - - static partial void UpdateJsonSerializerSettings(System.Text.Json.JsonSerializerOptions settings); - - partial void Initialize(); - - partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, string url); - partial void PrepareRequest(System.Net.Http.HttpClient client, System.Net.Http.HttpRequestMessage request, System.Text.StringBuilder urlBuilder); - partial void ProcessResponse(System.Net.Http.HttpClient client, System.Net.Http.HttpResponseMessage response); - - /// - /// creates a brand - /// - /// - /// creates a brand - /// - /// The requested API version - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task CreateBrandEndpointAsync(string version, CreateBrandCommand body) - { - return CreateBrandEndpointAsync(version, body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// creates a brand - /// - /// - /// creates a brand - /// - /// The requested API version - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task CreateBrandEndpointAsync(string version, CreateBrandCommand body, System.Threading.CancellationToken cancellationToken) - { - if (version == null) - throw new System.ArgumentNullException("version"); - - if (body == null) - throw new System.ArgumentNullException("body"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var json_ = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(body, JsonSerializerSettings); - var content_ = new System.Net.Http.ByteArrayContent(json_); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/v{version}/catalog/brands" - urlBuilder_.Append("api/v"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))); - urlBuilder_.Append("/catalog/brands"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// gets brand by id - /// - /// - /// gets brand by id - /// - /// The requested API version - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task GetBrandEndpointAsync(string version, System.Guid id) - { - return GetBrandEndpointAsync(version, id, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// gets brand by id - /// - /// - /// gets brand by id - /// - /// The requested API version - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task GetBrandEndpointAsync(string version, System.Guid id, System.Threading.CancellationToken cancellationToken) - { - if (version == null) - throw new System.ArgumentNullException("version"); - - if (id == null) - throw new System.ArgumentNullException("id"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Method = new System.Net.Http.HttpMethod("GET"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/v{version}/catalog/brands/{id}" - urlBuilder_.Append("api/v"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))); - urlBuilder_.Append("/catalog/brands/"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// update a brand - /// - /// - /// update a brand - /// - /// The requested API version - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task UpdateBrandEndpointAsync(string version, System.Guid id, UpdateBrandCommand body) - { - return UpdateBrandEndpointAsync(version, id, body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// update a brand - /// - /// - /// update a brand - /// - /// The requested API version - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task UpdateBrandEndpointAsync(string version, System.Guid id, UpdateBrandCommand body, System.Threading.CancellationToken cancellationToken) - { - if (version == null) - throw new System.ArgumentNullException("version"); - - if (id == null) - throw new System.ArgumentNullException("id"); - - if (body == null) - throw new System.ArgumentNullException("body"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var json_ = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(body, JsonSerializerSettings); - var content_ = new System.Net.Http.ByteArrayContent(json_); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("PUT"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/v{version}/catalog/brands/{id}" - urlBuilder_.Append("api/v"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))); - urlBuilder_.Append("/catalog/brands/"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// deletes brand by id - /// - /// - /// deletes brand by id - /// - /// The requested API version - /// No Content - /// A server side error occurred. - public virtual System.Threading.Tasks.Task DeleteBrandEndpointAsync(string version, System.Guid id) - { - return DeleteBrandEndpointAsync(version, id, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// deletes brand by id - /// - /// - /// deletes brand by id - /// - /// The requested API version - /// No Content - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task DeleteBrandEndpointAsync(string version, System.Guid id, System.Threading.CancellationToken cancellationToken) - { - if (version == null) - throw new System.ArgumentNullException("version"); - - if (id == null) - throw new System.ArgumentNullException("id"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Method = new System.Net.Http.HttpMethod("DELETE"); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/v{version}/catalog/brands/{id}" - urlBuilder_.Append("api/v"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))); - urlBuilder_.Append("/catalog/brands/"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 204) - { - return; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// Gets a list of brands - /// - /// - /// Gets a list of brands with pagination and filtering support - /// - /// The requested API version - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task SearchBrandsEndpointAsync(string version, SearchBrandsCommand body) - { - return SearchBrandsEndpointAsync(version, body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Gets a list of brands - /// - /// - /// Gets a list of brands with pagination and filtering support - /// - /// The requested API version - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task SearchBrandsEndpointAsync(string version, SearchBrandsCommand body, System.Threading.CancellationToken cancellationToken) - { - if (version == null) - throw new System.ArgumentNullException("version"); - - if (body == null) - throw new System.ArgumentNullException("body"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var json_ = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(body, JsonSerializerSettings); - var content_ = new System.Net.Http.ByteArrayContent(json_); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/v{version}/catalog/brands/search" - urlBuilder_.Append("api/v"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))); - urlBuilder_.Append("/catalog/brands/search"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// creates a product - /// - /// - /// creates a product - /// - /// The requested API version - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task CreateProductEndpointAsync(string version, CreateProductCommand body) - { - return CreateProductEndpointAsync(version, body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// creates a product - /// - /// - /// creates a product - /// - /// The requested API version - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task CreateProductEndpointAsync(string version, CreateProductCommand body, System.Threading.CancellationToken cancellationToken) - { - if (version == null) - throw new System.ArgumentNullException("version"); - - if (body == null) - throw new System.ArgumentNullException("body"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var json_ = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(body, JsonSerializerSettings); - var content_ = new System.Net.Http.ByteArrayContent(json_); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/v{version}/catalog/products" - urlBuilder_.Append("api/v"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))); - urlBuilder_.Append("/catalog/products"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// gets product by id - /// - /// - /// gets prodct by id - /// - /// The requested API version - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task GetProductEndpointAsync(string version, System.Guid id) - { - return GetProductEndpointAsync(version, id, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// gets product by id - /// - /// - /// gets prodct by id - /// - /// The requested API version - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task GetProductEndpointAsync(string version, System.Guid id, System.Threading.CancellationToken cancellationToken) - { - if (version == null) - throw new System.ArgumentNullException("version"); - - if (id == null) - throw new System.ArgumentNullException("id"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Method = new System.Net.Http.HttpMethod("GET"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/v{version}/catalog/products/{id}" - urlBuilder_.Append("api/v"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))); - urlBuilder_.Append("/catalog/products/"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// update a product - /// - /// - /// update a product - /// - /// The requested API version - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task UpdateProductEndpointAsync(string version, System.Guid id, UpdateProductCommand body) - { - return UpdateProductEndpointAsync(version, id, body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// update a product - /// - /// - /// update a product - /// - /// The requested API version - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task UpdateProductEndpointAsync(string version, System.Guid id, UpdateProductCommand body, System.Threading.CancellationToken cancellationToken) - { - if (version == null) - throw new System.ArgumentNullException("version"); - - if (id == null) - throw new System.ArgumentNullException("id"); - - if (body == null) - throw new System.ArgumentNullException("body"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var json_ = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(body, JsonSerializerSettings); - var content_ = new System.Net.Http.ByteArrayContent(json_); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("PUT"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/v{version}/catalog/products/{id}" - urlBuilder_.Append("api/v"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))); - urlBuilder_.Append("/catalog/products/"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// deletes product by id - /// - /// - /// deletes product by id - /// - /// The requested API version - /// No Content - /// A server side error occurred. - public virtual System.Threading.Tasks.Task DeleteProductEndpointAsync(string version, System.Guid id) - { - return DeleteProductEndpointAsync(version, id, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// deletes product by id - /// - /// - /// deletes product by id - /// - /// The requested API version - /// No Content - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task DeleteProductEndpointAsync(string version, System.Guid id, System.Threading.CancellationToken cancellationToken) - { - if (version == null) - throw new System.ArgumentNullException("version"); - - if (id == null) - throw new System.ArgumentNullException("id"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Method = new System.Net.Http.HttpMethod("DELETE"); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/v{version}/catalog/products/{id}" - urlBuilder_.Append("api/v"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))); - urlBuilder_.Append("/catalog/products/"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 204) - { - return; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// Gets a list of products - /// - /// - /// Gets a list of products with pagination and filtering support - /// - /// The requested API version - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task SearchProductsEndpointAsync(string version, SearchProductsCommand body) - { - return SearchProductsEndpointAsync(version, body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Gets a list of products - /// - /// - /// Gets a list of products with pagination and filtering support - /// - /// The requested API version - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task SearchProductsEndpointAsync(string version, SearchProductsCommand body, System.Threading.CancellationToken cancellationToken) - { - if (version == null) - throw new System.ArgumentNullException("version"); - - if (body == null) - throw new System.ArgumentNullException("body"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var json_ = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(body, JsonSerializerSettings); - var content_ = new System.Net.Http.ByteArrayContent(json_); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/v{version}/catalog/products/search" - urlBuilder_.Append("api/v"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))); - urlBuilder_.Append("/catalog/products/search"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// Get role details by ID - /// - /// - /// Retrieve the details of a role by its ID. - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task GetRoleByIdEndpointAsync(string id) - { - return GetRoleByIdEndpointAsync(id, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Get role details by ID - /// - /// - /// Retrieve the details of a role by its ID. - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task GetRoleByIdEndpointAsync(string id, System.Threading.CancellationToken cancellationToken) - { - if (id == null) - throw new System.ArgumentNullException("id"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Method = new System.Net.Http.HttpMethod("GET"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/roles/{id}" - urlBuilder_.Append("api/roles/"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// Delete a role by ID - /// - /// - /// Remove a role from the system by its ID. - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task DeleteRoleEndpointAsync(string id) - { - return DeleteRoleEndpointAsync(id, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Delete a role by ID - /// - /// - /// Remove a role from the system by its ID. - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task DeleteRoleEndpointAsync(string id, System.Threading.CancellationToken cancellationToken) - { - if (id == null) - throw new System.ArgumentNullException("id"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Method = new System.Net.Http.HttpMethod("DELETE"); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/roles/{id}" - urlBuilder_.Append("api/roles/"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - return; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// Get a list of all roles - /// - /// - /// Retrieve a list of all roles available in the system. - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task> GetRolesEndpointAsync() - { - return GetRolesEndpointAsync(System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Get a list of all roles - /// - /// - /// Retrieve a list of all roles available in the system. - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task> GetRolesEndpointAsync(System.Threading.CancellationToken cancellationToken) - { - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Method = new System.Net.Http.HttpMethod("GET"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/roles" - urlBuilder_.Append("api/roles"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// Create or update a role - /// - /// - /// Create a new role or update an existing role. - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task CreateOrUpdateRoleEndpointAsync(CreateOrUpdateRoleCommand body) - { - return CreateOrUpdateRoleEndpointAsync(body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Create or update a role - /// - /// - /// Create a new role or update an existing role. - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task CreateOrUpdateRoleEndpointAsync(CreateOrUpdateRoleCommand body, System.Threading.CancellationToken cancellationToken) - { - if (body == null) - throw new System.ArgumentNullException("body"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var json_ = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(body, JsonSerializerSettings); - var content_ = new System.Net.Http.ByteArrayContent(json_); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/roles" - urlBuilder_.Append("api/roles"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// get role permissions - /// - /// - /// get role permissions - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task GetRolePermissionsEndpointAsync(string id) - { - return GetRolePermissionsEndpointAsync(id, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// get role permissions - /// - /// - /// get role permissions - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task GetRolePermissionsEndpointAsync(string id, System.Threading.CancellationToken cancellationToken) - { - if (id == null) - throw new System.ArgumentNullException("id"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Method = new System.Net.Http.HttpMethod("GET"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/roles/{id}/permissions" - urlBuilder_.Append("api/roles/"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - urlBuilder_.Append("/permissions"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// update role permissions - /// - /// - /// update role permissions - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task UpdateRolePermissionsEndpointAsync(string id, UpdatePermissionsCommand body) - { - return UpdateRolePermissionsEndpointAsync(id, body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// update role permissions - /// - /// - /// update role permissions - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task UpdateRolePermissionsEndpointAsync(string id, UpdatePermissionsCommand body, System.Threading.CancellationToken cancellationToken) - { - if (id == null) - throw new System.ArgumentNullException("id"); - - if (body == null) - throw new System.ArgumentNullException("body"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var json_ = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(body, JsonSerializerSettings); - var content_ = new System.Net.Http.ByteArrayContent(json_); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("PUT"); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/roles/{id}/permissions" - urlBuilder_.Append("api/roles/"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - urlBuilder_.Append("/permissions"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - return; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// creates a tenant - /// - /// - /// creates a tenant - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task CreateTenantEndpointAsync(CreateTenantCommand body) - { - return CreateTenantEndpointAsync(body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// creates a tenant - /// - /// - /// creates a tenant - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task CreateTenantEndpointAsync(CreateTenantCommand body, System.Threading.CancellationToken cancellationToken) - { - if (body == null) - throw new System.ArgumentNullException("body"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var json_ = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(body, JsonSerializerSettings); - var content_ = new System.Net.Http.ByteArrayContent(json_); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/tenants" - urlBuilder_.Append("api/tenants"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// get tenants - /// - /// - /// get tenants - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task> GetTenantsEndpointAsync() - { - return GetTenantsEndpointAsync(System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// get tenants - /// - /// - /// get tenants - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task> GetTenantsEndpointAsync(System.Threading.CancellationToken cancellationToken) - { - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Method = new System.Net.Http.HttpMethod("GET"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/tenants" - urlBuilder_.Append("api/tenants"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// get tenant by id - /// - /// - /// get tenant by id - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task GetTenantByIdEndpointAsync(string id) - { - return GetTenantByIdEndpointAsync(id, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// get tenant by id - /// - /// - /// get tenant by id - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task GetTenantByIdEndpointAsync(string id, System.Threading.CancellationToken cancellationToken) - { - if (id == null) - throw new System.ArgumentNullException("id"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Method = new System.Net.Http.HttpMethod("GET"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/tenants/{id}" - urlBuilder_.Append("api/tenants/"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// upgrade tenant subscription - /// - /// - /// upgrade tenant subscription - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task UpgradeSubscriptionEndpointAsync(UpgradeSubscriptionCommand body) - { - return UpgradeSubscriptionEndpointAsync(body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// upgrade tenant subscription - /// - /// - /// upgrade tenant subscription - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task UpgradeSubscriptionEndpointAsync(UpgradeSubscriptionCommand body, System.Threading.CancellationToken cancellationToken) - { - if (body == null) - throw new System.ArgumentNullException("body"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var json_ = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(body, JsonSerializerSettings); - var content_ = new System.Net.Http.ByteArrayContent(json_); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/tenants/upgrade" - urlBuilder_.Append("api/tenants/upgrade"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// activate tenant - /// - /// - /// activate tenant - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task ActivateTenantEndpointAsync(string id) - { - return ActivateTenantEndpointAsync(id, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// activate tenant - /// - /// - /// activate tenant - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task ActivateTenantEndpointAsync(string id, System.Threading.CancellationToken cancellationToken) - { - if (id == null) - throw new System.ArgumentNullException("id"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); - request_.Method = new System.Net.Http.HttpMethod("POST"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/tenants/{id}/activate" - urlBuilder_.Append("api/tenants/"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - urlBuilder_.Append("/activate"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// activate tenant - /// - /// - /// activate tenant - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task DisableTenantEndpointAsync(string id) - { - return DisableTenantEndpointAsync(id, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// activate tenant - /// - /// - /// activate tenant - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task DisableTenantEndpointAsync(string id, System.Threading.CancellationToken cancellationToken) - { - if (id == null) - throw new System.ArgumentNullException("id"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Content = new System.Net.Http.StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"); - request_.Method = new System.Net.Http.HttpMethod("POST"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/tenants/{id}/deactivate" - urlBuilder_.Append("api/tenants/"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - urlBuilder_.Append("/deactivate"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// Creates a todo item - /// - /// - /// Creates a todo item - /// - /// The requested API version - /// Created - /// A server side error occurred. - public virtual System.Threading.Tasks.Task CreateTodoEndpointAsync(string version, CreateTodoCommand body) - { - return CreateTodoEndpointAsync(version, body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Creates a todo item - /// - /// - /// Creates a todo item - /// - /// The requested API version - /// Created - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task CreateTodoEndpointAsync(string version, CreateTodoCommand body, System.Threading.CancellationToken cancellationToken) - { - if (version == null) - throw new System.ArgumentNullException("version"); - - if (body == null) - throw new System.ArgumentNullException("body"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var json_ = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(body, JsonSerializerSettings); - var content_ = new System.Net.Http.ByteArrayContent(json_); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/v{version}/todos" - urlBuilder_.Append("api/v"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))); - urlBuilder_.Append("/todos"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 201) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// gets todo item by id - /// - /// - /// gets todo item by id - /// - /// The requested API version - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task GetTodoEndpointAsync(string version, System.Guid id) - { - return GetTodoEndpointAsync(version, id, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// gets todo item by id - /// - /// - /// gets todo item by id - /// - /// The requested API version - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task GetTodoEndpointAsync(string version, System.Guid id, System.Threading.CancellationToken cancellationToken) - { - if (version == null) - throw new System.ArgumentNullException("version"); - - if (id == null) - throw new System.ArgumentNullException("id"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Method = new System.Net.Http.HttpMethod("GET"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/v{version}/todos/{id}" - urlBuilder_.Append("api/v"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))); - urlBuilder_.Append("/todos/"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// Updates a todo item - /// - /// - /// Updated a todo item - /// - /// The requested API version - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task UpdateTodoEndpointAsync(string version, System.Guid id, UpdateTodoCommand body) - { - return UpdateTodoEndpointAsync(version, id, body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Updates a todo item - /// - /// - /// Updated a todo item - /// - /// The requested API version - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task UpdateTodoEndpointAsync(string version, System.Guid id, UpdateTodoCommand body, System.Threading.CancellationToken cancellationToken) - { - if (version == null) - throw new System.ArgumentNullException("version"); - - if (id == null) - throw new System.ArgumentNullException("id"); - - if (body == null) - throw new System.ArgumentNullException("body"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var json_ = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(body, JsonSerializerSettings); - var content_ = new System.Net.Http.ByteArrayContent(json_); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("PUT"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/v{version}/todos/{id}" - urlBuilder_.Append("api/v"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))); - urlBuilder_.Append("/todos/"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// Deletes a todo item - /// - /// - /// Deleted a todo item - /// - /// The requested API version - /// No Content - /// A server side error occurred. - public virtual System.Threading.Tasks.Task DeleteTodoEndpointAsync(string version, System.Guid id) - { - return DeleteTodoEndpointAsync(version, id, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Deletes a todo item - /// - /// - /// Deleted a todo item - /// - /// The requested API version - /// No Content - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task DeleteTodoEndpointAsync(string version, System.Guid id, System.Threading.CancellationToken cancellationToken) - { - if (version == null) - throw new System.ArgumentNullException("version"); - - if (id == null) - throw new System.ArgumentNullException("id"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Method = new System.Net.Http.HttpMethod("DELETE"); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/v{version}/todos/{id}" - urlBuilder_.Append("api/v"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))); - urlBuilder_.Append("/todos/"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 204) - { - return; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// Gets a list of todo items with paging support - /// - /// - /// Gets a list of todo items with paging support - /// - /// The requested API version - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task GetTodoListEndpointAsync(string version, PaginationFilter body) - { - return GetTodoListEndpointAsync(version, body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Gets a list of todo items with paging support - /// - /// - /// Gets a list of todo items with paging support - /// - /// The requested API version - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task GetTodoListEndpointAsync(string version, PaginationFilter body, System.Threading.CancellationToken cancellationToken) - { - if (version == null) - throw new System.ArgumentNullException("version"); - - if (body == null) - throw new System.ArgumentNullException("body"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var json_ = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(body, JsonSerializerSettings); - var content_ = new System.Net.Http.ByteArrayContent(json_); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/v{version}/todos/search" - urlBuilder_.Append("api/v"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(version, System.Globalization.CultureInfo.InvariantCulture))); - urlBuilder_.Append("/todos/search"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// refresh JWTs - /// - /// - /// refresh JWTs - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task RefreshTokenEndpointAsync(string tenant, RefreshTokenCommand body) - { - return RefreshTokenEndpointAsync(tenant, body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// refresh JWTs - /// - /// - /// refresh JWTs - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task RefreshTokenEndpointAsync(string tenant, RefreshTokenCommand body, System.Threading.CancellationToken cancellationToken) - { - if (body == null) - throw new System.ArgumentNullException("body"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - - if (tenant == null) - throw new System.ArgumentNullException("tenant"); - request_.Headers.TryAddWithoutValidation("tenant", ConvertToString(tenant, System.Globalization.CultureInfo.InvariantCulture)); - var json_ = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(body, JsonSerializerSettings); - var content_ = new System.Net.Http.ByteArrayContent(json_); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/token/refresh" - urlBuilder_.Append("api/token/refresh"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// generate JWTs - /// - /// - /// generate JWTs - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task TokenGenerationEndpointAsync(string tenant, TokenGenerationCommand body) - { - return TokenGenerationEndpointAsync(tenant, body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// generate JWTs - /// - /// - /// generate JWTs - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task TokenGenerationEndpointAsync(string tenant, TokenGenerationCommand body, System.Threading.CancellationToken cancellationToken) - { - if (body == null) - throw new System.ArgumentNullException("body"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - - if (tenant == null) - throw new System.ArgumentNullException("tenant"); - request_.Headers.TryAddWithoutValidation("tenant", ConvertToString(tenant, System.Globalization.CultureInfo.InvariantCulture)); - var json_ = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(body, JsonSerializerSettings); - var content_ = new System.Net.Http.ByteArrayContent(json_); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/token" - urlBuilder_.Append("api/token"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// register user - /// - /// - /// register user - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task RegisterUserEndpointAsync(RegisterUserCommand body) - { - return RegisterUserEndpointAsync(body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// register user - /// - /// - /// register user - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task RegisterUserEndpointAsync(RegisterUserCommand body, System.Threading.CancellationToken cancellationToken) - { - if (body == null) - throw new System.ArgumentNullException("body"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var json_ = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(body, JsonSerializerSettings); - var content_ = new System.Net.Http.ByteArrayContent(json_); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/users/register" - urlBuilder_.Append("api/users/register"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// self register user - /// - /// - /// self register user - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task SelfRegisterUserEndpointAsync(string tenant, RegisterUserCommand body) - { - return SelfRegisterUserEndpointAsync(tenant, body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// self register user - /// - /// - /// self register user - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task SelfRegisterUserEndpointAsync(string tenant, RegisterUserCommand body, System.Threading.CancellationToken cancellationToken) - { - if (body == null) - throw new System.ArgumentNullException("body"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - - if (tenant == null) - throw new System.ArgumentNullException("tenant"); - request_.Headers.TryAddWithoutValidation("tenant", ConvertToString(tenant, System.Globalization.CultureInfo.InvariantCulture)); - var json_ = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(body, JsonSerializerSettings); - var content_ = new System.Net.Http.ByteArrayContent(json_); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/users/self-register" - urlBuilder_.Append("api/users/self-register"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// update user profile - /// - /// - /// update user profile - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task UpdateUserEndpointAsync(UpdateUserCommand body) - { - return UpdateUserEndpointAsync(body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// update user profile - /// - /// - /// update user profile - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task UpdateUserEndpointAsync(UpdateUserCommand body, System.Threading.CancellationToken cancellationToken) - { - if (body == null) - throw new System.ArgumentNullException("body"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var json_ = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(body, JsonSerializerSettings); - var content_ = new System.Net.Http.ByteArrayContent(json_); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("PUT"); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/users/profile" - urlBuilder_.Append("api/users/profile"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - return; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// Get current user information based on token - /// - /// - /// Get current user information based on token - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task GetMeEndpointAsync() - { - return GetMeEndpointAsync(System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Get current user information based on token - /// - /// - /// Get current user information based on token - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task GetMeEndpointAsync(System.Threading.CancellationToken cancellationToken) - { - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Method = new System.Net.Http.HttpMethod("GET"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/users/profile" - urlBuilder_.Append("api/users/profile"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// get users list - /// - /// - /// get users list - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task> GetUsersListEndpointAsync() - { - return GetUsersListEndpointAsync(System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// get users list - /// - /// - /// get users list - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task> GetUsersListEndpointAsync(System.Threading.CancellationToken cancellationToken) - { - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Method = new System.Net.Http.HttpMethod("GET"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/users" - urlBuilder_.Append("api/users"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// delete user profile - /// - /// - /// delete user profile - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task DeleteUserEndpointAsync(string id) - { - return DeleteUserEndpointAsync(id, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// delete user profile - /// - /// - /// delete user profile - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task DeleteUserEndpointAsync(string id, System.Threading.CancellationToken cancellationToken) - { - if (id == null) - throw new System.ArgumentNullException("id"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Method = new System.Net.Http.HttpMethod("DELETE"); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/users/{id}" - urlBuilder_.Append("api/users/"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - return; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// Get user profile by ID - /// - /// - /// Get another user's profile details by user ID. - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task GetUserEndpointAsync(string id) - { - return GetUserEndpointAsync(id, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Get user profile by ID - /// - /// - /// Get another user's profile details by user ID. - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task GetUserEndpointAsync(string id, System.Threading.CancellationToken cancellationToken) - { - if (id == null) - throw new System.ArgumentNullException("id"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Method = new System.Net.Http.HttpMethod("GET"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/users/{id}" - urlBuilder_.Append("api/users/"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// Forgot password - /// - /// - /// Generates a password reset token and sends it via email. - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task ForgotPasswordEndpointAsync(string tenant, ForgotPasswordCommand body) - { - return ForgotPasswordEndpointAsync(tenant, body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Forgot password - /// - /// - /// Generates a password reset token and sends it via email. - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task ForgotPasswordEndpointAsync(string tenant, ForgotPasswordCommand body, System.Threading.CancellationToken cancellationToken) - { - if (body == null) - throw new System.ArgumentNullException("body"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - - if (tenant == null) - throw new System.ArgumentNullException("tenant"); - request_.Headers.TryAddWithoutValidation("tenant", ConvertToString(tenant, System.Globalization.CultureInfo.InvariantCulture)); - var json_ = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(body, JsonSerializerSettings); - var content_ = new System.Net.Http.ByteArrayContent(json_); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/users/forgot-password" - urlBuilder_.Append("api/users/forgot-password"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - return; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// Changes password - /// - /// - /// Change password - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task ChangePasswordEndpointAsync(ChangePasswordCommand body) - { - return ChangePasswordEndpointAsync(body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Changes password - /// - /// - /// Change password - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task ChangePasswordEndpointAsync(ChangePasswordCommand body, System.Threading.CancellationToken cancellationToken) - { - if (body == null) - throw new System.ArgumentNullException("body"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var json_ = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(body, JsonSerializerSettings); - var content_ = new System.Net.Http.ByteArrayContent(json_); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/users/change-password" - urlBuilder_.Append("api/users/change-password"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - return; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// Reset password - /// - /// - /// Resets the password using the token and new password provided. - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task ResetPasswordEndpointAsync(string tenant, ResetPasswordCommand body) - { - return ResetPasswordEndpointAsync(tenant, body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Reset password - /// - /// - /// Resets the password using the token and new password provided. - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task ResetPasswordEndpointAsync(string tenant, ResetPasswordCommand body, System.Threading.CancellationToken cancellationToken) - { - if (body == null) - throw new System.ArgumentNullException("body"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - - if (tenant == null) - throw new System.ArgumentNullException("tenant"); - request_.Headers.TryAddWithoutValidation("tenant", ConvertToString(tenant, System.Globalization.CultureInfo.InvariantCulture)); - var json_ = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(body, JsonSerializerSettings); - var content_ = new System.Net.Http.ByteArrayContent(json_); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/users/reset-password" - urlBuilder_.Append("api/users/reset-password"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - return; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// Get current user permissions - /// - /// - /// Get current user permissions - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task> GetUserPermissionsAsync() - { - return GetUserPermissionsAsync(System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Get current user permissions - /// - /// - /// Get current user permissions - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task> GetUserPermissionsAsync(System.Threading.CancellationToken cancellationToken) - { - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Method = new System.Net.Http.HttpMethod("GET"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/users/permissions" - urlBuilder_.Append("api/users/permissions"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// Toggle a user's active status - /// - /// - /// Toggle a user's active status - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task ToggleUserStatusEndpointAsync(string id, ToggleUserStatusCommand body) - { - return ToggleUserStatusEndpointAsync(id, body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Toggle a user's active status - /// - /// - /// Toggle a user's active status - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task ToggleUserStatusEndpointAsync(string id, ToggleUserStatusCommand body, System.Threading.CancellationToken cancellationToken) - { - if (id == null) - throw new System.ArgumentNullException("id"); - - if (body == null) - throw new System.ArgumentNullException("body"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var json_ = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(body, JsonSerializerSettings); - var content_ = new System.Net.Http.ByteArrayContent(json_); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/users/{id}/toggle-status" - urlBuilder_.Append("api/users/"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - urlBuilder_.Append("/toggle-status"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - return; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// assign roles - /// - /// - /// assign roles - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task AssignRolesToUserEndpointAsync(string id, AssignUserRoleCommand body) - { - return AssignRolesToUserEndpointAsync(id, body, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// assign roles - /// - /// - /// assign roles - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task AssignRolesToUserEndpointAsync(string id, AssignUserRoleCommand body, System.Threading.CancellationToken cancellationToken) - { - if (id == null) - throw new System.ArgumentNullException("id"); - - if (body == null) - throw new System.ArgumentNullException("body"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - var json_ = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(body, JsonSerializerSettings); - var content_ = new System.Net.Http.ByteArrayContent(json_); - content_.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/json"); - request_.Content = content_; - request_.Method = new System.Net.Http.HttpMethod("POST"); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/users/{id}/roles" - urlBuilder_.Append("api/users/"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - urlBuilder_.Append("/roles"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - return; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// get user roles - /// - /// - /// get user roles - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task> GetUserRolesEndpointAsync(string id) - { - return GetUserRolesEndpointAsync(id, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// get user roles - /// - /// - /// get user roles - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task> GetUserRolesEndpointAsync(string id, System.Threading.CancellationToken cancellationToken) - { - if (id == null) - throw new System.ArgumentNullException("id"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Method = new System.Net.Http.HttpMethod("GET"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/users/{id}/roles" - urlBuilder_.Append("api/users/"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - urlBuilder_.Append("/roles"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - /// - /// Get user's audit trail details - /// - /// - /// Get user's audit trail details. - /// - /// OK - /// A server side error occurred. - public virtual System.Threading.Tasks.Task> GetUserAuditTrailEndpointAsync(System.Guid id) - { - return GetUserAuditTrailEndpointAsync(id, System.Threading.CancellationToken.None); - } - - /// A cancellation token that can be used by other objects or threads to receive notice of cancellation. - /// - /// Get user's audit trail details - /// - /// - /// Get user's audit trail details. - /// - /// OK - /// A server side error occurred. - public virtual async System.Threading.Tasks.Task> GetUserAuditTrailEndpointAsync(System.Guid id, System.Threading.CancellationToken cancellationToken) - { - if (id == null) - throw new System.ArgumentNullException("id"); - - var client_ = _httpClient; - var disposeClient_ = false; - try - { - using (var request_ = new System.Net.Http.HttpRequestMessage()) - { - request_.Method = new System.Net.Http.HttpMethod("GET"); - request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json")); - - var urlBuilder_ = new System.Text.StringBuilder(); - - // Operation Path: "api/users/{id}/audit-trails" - urlBuilder_.Append("api/users/"); - urlBuilder_.Append(System.Uri.EscapeDataString(ConvertToString(id, System.Globalization.CultureInfo.InvariantCulture))); - urlBuilder_.Append("/audit-trails"); - - PrepareRequest(client_, request_, urlBuilder_); - - var url_ = urlBuilder_.ToString(); - request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); - - PrepareRequest(client_, request_, url_); - - var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); - var disposeResponse_ = true; - try - { - var headers_ = new System.Collections.Generic.Dictionary>(); - foreach (var item_ in response_.Headers) - headers_[item_.Key] = item_.Value; - if (response_.Content != null && response_.Content.Headers != null) - { - foreach (var item_ in response_.Content.Headers) - headers_[item_.Key] = item_.Value; - } - - ProcessResponse(client_, response_); - - var status_ = (int)response_.StatusCode; - if (status_ == 200) - { - var objectResponse_ = await ReadObjectResponseAsync>(response_, headers_, cancellationToken).ConfigureAwait(false); - if (objectResponse_.Object == null) - { - throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); - } - return objectResponse_.Object; - } - else - { - var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); - throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); - } - } - finally - { - if (disposeResponse_) - response_.Dispose(); - } - } - } - finally - { - if (disposeClient_) - client_.Dispose(); - } - } - - protected struct ObjectResponseResult - { - public ObjectResponseResult(T responseObject, string responseText) - { - this.Object = responseObject; - this.Text = responseText; - } - - public T Object { get; } - - public string Text { get; } - } - - public bool ReadResponseAsString { get; set; } - - protected virtual async System.Threading.Tasks.Task> ReadObjectResponseAsync(System.Net.Http.HttpResponseMessage response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Threading.CancellationToken cancellationToken) - { - if (response == null || response.Content == null) - { - return new ObjectResponseResult(default(T)!, string.Empty); - } - - if (ReadResponseAsString) - { - var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); - try - { - var typedBody = System.Text.Json.JsonSerializer.Deserialize(responseText, JsonSerializerSettings); - return new ObjectResponseResult(typedBody!, responseText); - } - catch (System.Text.Json.JsonException exception) - { - var message = "Could not deserialize the response body string as " + typeof(T).FullName + "."; - throw new ApiException(message, (int)response.StatusCode, responseText, headers, exception); - } - } - else - { - try - { - using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) - { - var typedBody = await System.Text.Json.JsonSerializer.DeserializeAsync(responseStream, JsonSerializerSettings, cancellationToken).ConfigureAwait(false); - return new ObjectResponseResult(typedBody!, string.Empty); - } - } - catch (System.Text.Json.JsonException exception) - { - var message = "Could not deserialize the response body stream as " + typeof(T).FullName + "."; - throw new ApiException(message, (int)response.StatusCode, string.Empty, headers, exception); - } - } - } - - private string ConvertToString(object? value, System.Globalization.CultureInfo cultureInfo) - { - if (value == null) - { - return ""; - } - - if (value is System.Enum) - { - var name = System.Enum.GetName(value.GetType(), value); - if (name != null) - { - var field = System.Reflection.IntrospectionExtensions.GetTypeInfo(value.GetType()).GetDeclaredField(name); - if (field != null) - { - var attribute = System.Reflection.CustomAttributeExtensions.GetCustomAttribute(field, typeof(System.Runtime.Serialization.EnumMemberAttribute)) - as System.Runtime.Serialization.EnumMemberAttribute; - if (attribute != null) - { - return attribute.Value != null ? attribute.Value : name; - } - } - - var converted = System.Convert.ToString(System.Convert.ChangeType(value, System.Enum.GetUnderlyingType(value.GetType()), cultureInfo)); - return converted == null ? string.Empty : converted; - } - } - else if (value is bool) - { - return System.Convert.ToString((bool)value, cultureInfo).ToLowerInvariant(); - } - else if (value is byte[]) - { - return System.Convert.ToBase64String((byte[]) value); - } - else if (value is string[]) - { - return string.Join(",", (string[])value); - } - else if (value.GetType().IsArray) - { - var valueArray = (System.Array)value; - var valueTextArray = new string[valueArray.Length]; - for (var i = 0; i < valueArray.Length; i++) - { - valueTextArray[i] = ConvertToString(valueArray.GetValue(i), cultureInfo); - } - return string.Join(",", valueTextArray); - } - - var result = System.Convert.ToString(value, cultureInfo); - return result == null ? "" : result; - } - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class ActivateTenantResponse - { - - [System.Text.Json.Serialization.JsonPropertyName("status")] - public string? Status { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class AssignUserRoleCommand - { - - [System.Text.Json.Serialization.JsonPropertyName("userRoles")] - public System.Collections.Generic.ICollection? UserRoles { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class AuditTrail - { - - [System.Text.Json.Serialization.JsonPropertyName("id")] - public System.Guid Id { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("userId")] - public System.Guid UserId { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("operation")] - public string? Operation { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("entity")] - public string? Entity { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("dateTime")] - public System.DateTime DateTime { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("previousValues")] - public string? PreviousValues { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("newValues")] - public string? NewValues { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("modifiedProperties")] - public string? ModifiedProperties { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("primaryKey")] - public string? PrimaryKey { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class BrandResponse - { - - [System.Text.Json.Serialization.JsonPropertyName("id")] - public System.Guid? Id { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("name")] - public string? Name { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("description")] - public string? Description { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class BrandResponsePagedList - { - - [System.Text.Json.Serialization.JsonPropertyName("items")] - public System.Collections.Generic.ICollection? Items { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("pageNumber")] - public int PageNumber { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("pageSize")] - public int PageSize { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("totalCount")] - public int TotalCount { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("totalPages")] - public int TotalPages { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("hasPrevious")] - public bool HasPrevious { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("hasNext")] - public bool HasNext { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class ChangePasswordCommand - { - - [System.Text.Json.Serialization.JsonPropertyName("password")] - public string? Password { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("newPassword")] - public string? NewPassword { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("confirmNewPassword")] - public string? ConfirmNewPassword { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class CreateBrandCommand - { - - [System.Text.Json.Serialization.JsonPropertyName("name")] - public string? Name { get; set; } = "Sample Brand"; - - [System.Text.Json.Serialization.JsonPropertyName("description")] - public string? Description { get; set; } = "Descriptive Description"; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class CreateBrandResponse - { - - [System.Text.Json.Serialization.JsonPropertyName("id")] - public System.Guid? Id { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class CreateOrUpdateRoleCommand - { - - [System.Text.Json.Serialization.JsonPropertyName("id")] - public string? Id { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("name")] - public string? Name { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("description")] - public string? Description { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class CreateProductCommand - { - - [System.Text.Json.Serialization.JsonPropertyName("name")] - public string? Name { get; set; } = "Sample Product"; - - [System.Text.Json.Serialization.JsonPropertyName("price")] - public double Price { get; set; } = 10D; - - [System.Text.Json.Serialization.JsonPropertyName("description")] - public string? Description { get; set; } = "Descriptive Description"; - - [System.Text.Json.Serialization.JsonPropertyName("brandId")] - public System.Guid? BrandId { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class CreateProductResponse - { - - [System.Text.Json.Serialization.JsonPropertyName("id")] - public System.Guid? Id { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class CreateTenantCommand - { - - [System.Text.Json.Serialization.JsonPropertyName("id")] - public string? Id { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("name")] - public string? Name { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("connectionString")] - public string? ConnectionString { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("adminEmail")] - public string? AdminEmail { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("issuer")] - public string? Issuer { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class CreateTenantResponse - { - - [System.Text.Json.Serialization.JsonPropertyName("id")] - public string? Id { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class CreateTodoCommand - { - - [System.Text.Json.Serialization.JsonPropertyName("title")] - public string? Title { get; set; } = "Hello World!"; - - [System.Text.Json.Serialization.JsonPropertyName("note")] - public string? Note { get; set; } = "Important Note."; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class CreateTodoResponse - { - - [System.Text.Json.Serialization.JsonPropertyName("id")] - public System.Guid? Id { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class DisableTenantResponse - { - - [System.Text.Json.Serialization.JsonPropertyName("status")] - public string? Status { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class FileUploadCommand - { - - [System.Text.Json.Serialization.JsonPropertyName("name")] - public string? Name { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("extension")] - public string? Extension { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("data")] - public string? Data { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class Filter - { - - [System.Text.Json.Serialization.JsonPropertyName("logic")] - public string? Logic { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("filters")] - public System.Collections.Generic.ICollection? Filters { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("field")] - public string? Field { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("operator")] - public string? Operator { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("value")] - public object? Value { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class ForgotPasswordCommand - { - - [System.Text.Json.Serialization.JsonPropertyName("email")] - public string? Email { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class GetTodoResponse - { - - [System.Text.Json.Serialization.JsonPropertyName("id")] - public System.Guid? Id { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("title")] - public string? Title { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("note")] - public string? Note { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class PaginationFilter - { - - [System.Text.Json.Serialization.JsonPropertyName("advancedSearch")] - public Search AdvancedSearch { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("keyword")] - public string? Keyword { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("advancedFilter")] - public Filter AdvancedFilter { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("pageNumber")] - public int PageNumber { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("pageSize")] - public int PageSize { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("orderBy")] - public System.Collections.Generic.ICollection? OrderBy { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class ProductResponse - { - - [System.Text.Json.Serialization.JsonPropertyName("id")] - public System.Guid? Id { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("name")] - public string? Name { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("description")] - public string? Description { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("price")] - public double Price { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("brand")] - public BrandResponse Brand { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class ProductResponsePagedList - { - - [System.Text.Json.Serialization.JsonPropertyName("items")] - public System.Collections.Generic.ICollection? Items { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("pageNumber")] - public int PageNumber { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("pageSize")] - public int PageSize { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("totalCount")] - public int TotalCount { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("totalPages")] - public int TotalPages { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("hasPrevious")] - public bool HasPrevious { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("hasNext")] - public bool HasNext { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class RefreshTokenCommand - { - - [System.Text.Json.Serialization.JsonPropertyName("token")] - public string? Token { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("refreshToken")] - public string? RefreshToken { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class RegisterUserCommand - { - - [System.Text.Json.Serialization.JsonPropertyName("firstName")] - public string? FirstName { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("lastName")] - public string? LastName { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("email")] - public string? Email { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("userName")] - public string? UserName { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("password")] - public string? Password { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("confirmPassword")] - public string? ConfirmPassword { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("phoneNumber")] - public string? PhoneNumber { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class RegisterUserResponse - { - - [System.Text.Json.Serialization.JsonPropertyName("userId")] - public string? UserId { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class ResetPasswordCommand - { - - [System.Text.Json.Serialization.JsonPropertyName("email")] - public string? Email { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("password")] - public string? Password { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("token")] - public string? Token { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class RoleDto - { - - [System.Text.Json.Serialization.JsonPropertyName("id")] - public string? Id { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("name")] - public string? Name { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("description")] - public string? Description { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("permissions")] - public System.Collections.Generic.ICollection? Permissions { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class Search - { - - [System.Text.Json.Serialization.JsonPropertyName("fields")] - public System.Collections.Generic.ICollection? Fields { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("keyword")] - public string? Keyword { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class SearchBrandsCommand - { - - [System.Text.Json.Serialization.JsonPropertyName("advancedSearch")] - public Search AdvancedSearch { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("keyword")] - public string? Keyword { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("advancedFilter")] - public Filter AdvancedFilter { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("pageNumber")] - public int PageNumber { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("pageSize")] - public int PageSize { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("orderBy")] - public System.Collections.Generic.ICollection? OrderBy { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("name")] - public string? Name { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("description")] - public string? Description { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class SearchProductsCommand - { - - [System.Text.Json.Serialization.JsonPropertyName("advancedSearch")] - public Search AdvancedSearch { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("keyword")] - public string? Keyword { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("advancedFilter")] - public Filter AdvancedFilter { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("pageNumber")] - public int PageNumber { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("pageSize")] - public int PageSize { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("orderBy")] - public System.Collections.Generic.ICollection? OrderBy { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("brandId")] - public System.Guid? BrandId { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("minimumRate")] - public double? MinimumRate { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("maximumRate")] - public double? MaximumRate { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class TenantDetail - { - - [System.Text.Json.Serialization.JsonPropertyName("id")] - public string? Id { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("name")] - public string? Name { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("connectionString")] - public string? ConnectionString { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("adminEmail")] - public string? AdminEmail { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("isActive")] - public bool IsActive { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("validUpto")] - public System.DateTime ValidUpto { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("issuer")] - public string? Issuer { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class TodoDto - { - - [System.Text.Json.Serialization.JsonPropertyName("id")] - public System.Guid? Id { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("title")] - public string? Title { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("note")] - public string? Note { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class TodoDtoPagedList - { - - [System.Text.Json.Serialization.JsonPropertyName("items")] - public System.Collections.Generic.ICollection? Items { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("pageNumber")] - public int PageNumber { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("pageSize")] - public int PageSize { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("totalCount")] - public int TotalCount { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("totalPages")] - public int TotalPages { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("hasPrevious")] - public bool HasPrevious { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("hasNext")] - public bool HasNext { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class ToggleUserStatusCommand - { - - [System.Text.Json.Serialization.JsonPropertyName("activateUser")] - public bool ActivateUser { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("userId")] - public string? UserId { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class TokenGenerationCommand - { - - [System.Text.Json.Serialization.JsonPropertyName("email")] - public string? Email { get; set; } = "admin@root.com"; - - [System.Text.Json.Serialization.JsonPropertyName("password")] - public string? Password { get; set; } = "123Pa$$word!"; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class TokenResponse - { - - [System.Text.Json.Serialization.JsonPropertyName("token")] - public string? Token { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("refreshToken")] - public string? RefreshToken { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("refreshTokenExpiryTime")] - public System.DateTime RefreshTokenExpiryTime { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class UpdateBrandCommand - { - - [System.Text.Json.Serialization.JsonPropertyName("id")] - public System.Guid Id { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("name")] - public string? Name { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("description")] - public string? Description { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class UpdateBrandResponse - { - - [System.Text.Json.Serialization.JsonPropertyName("id")] - public System.Guid? Id { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class UpdatePermissionsCommand - { - - [System.Text.Json.Serialization.JsonPropertyName("roleId")] - public string? RoleId { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("permissions")] - public System.Collections.Generic.ICollection? Permissions { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class UpdateProductCommand - { - - [System.Text.Json.Serialization.JsonPropertyName("id")] - public System.Guid Id { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("name")] - public string? Name { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("price")] - public double Price { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("description")] - public string? Description { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("brandId")] - public System.Guid? BrandId { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class UpdateProductResponse - { - - [System.Text.Json.Serialization.JsonPropertyName("id")] - public System.Guid? Id { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class UpdateTodoCommand - { - - [System.Text.Json.Serialization.JsonPropertyName("id")] - public System.Guid Id { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("title")] - public string? Title { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("note")] - public string? Note { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class UpdateTodoResponse - { - - [System.Text.Json.Serialization.JsonPropertyName("id")] - public System.Guid? Id { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class UpdateUserCommand - { - - [System.Text.Json.Serialization.JsonPropertyName("id")] - public string? Id { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("firstName")] - public string? FirstName { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("lastName")] - public string? LastName { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("phoneNumber")] - public string? PhoneNumber { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("email")] - public string? Email { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("image")] - public FileUploadCommand Image { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("deleteCurrentImage")] - public bool DeleteCurrentImage { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class UpgradeSubscriptionCommand - { - - [System.Text.Json.Serialization.JsonPropertyName("tenant")] - public string? Tenant { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("extendedExpiryDate")] - public System.DateTime ExtendedExpiryDate { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class UpgradeSubscriptionResponse - { - - [System.Text.Json.Serialization.JsonPropertyName("newValidity")] - public System.DateTime NewValidity { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("tenant")] - public string? Tenant { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class UserDetail - { - - [System.Text.Json.Serialization.JsonPropertyName("id")] - public System.Guid Id { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("userName")] - public string? UserName { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("firstName")] - public string? FirstName { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("lastName")] - public string? LastName { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("email")] - public string? Email { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("isActive")] - public bool IsActive { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("emailConfirmed")] - public bool EmailConfirmed { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("phoneNumber")] - public string? PhoneNumber { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("imageUrl")] - public System.Uri? ImageUrl { get; set; } = default!; - - } - - [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class UserRoleDetail - { - - [System.Text.Json.Serialization.JsonPropertyName("roleId")] - public string? RoleId { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("roleName")] - public string? RoleName { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("description")] - public string? Description { get; set; } = default!; - - [System.Text.Json.Serialization.JsonPropertyName("enabled")] - public bool Enabled { get; set; } = default!; - - } - - - - [System.CodeDom.Compiler.GeneratedCode("NSwag", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class ApiException : System.Exception - { - public int StatusCode { get; private set; } - - public string? Response { get; private set; } - - public System.Collections.Generic.IReadOnlyDictionary> Headers { get; private set; } - - public ApiException(string message, int statusCode, string? response, System.Collections.Generic.IReadOnlyDictionary> headers, System.Exception? innerException) - : base(message + "\n\nStatus: " + statusCode + "\nResponse: \n" + ((response == null) ? "(null)" : response.Substring(0, response.Length >= 512 ? 512 : response.Length)), innerException) - { - StatusCode = statusCode; - Response = response; - Headers = headers; - } - - public override string ToString() - { - return string.Format("HTTP Response: \n\n{0}\n\n{1}", Response, base.ToString()); - } - } - - [System.CodeDom.Compiler.GeneratedCode("NSwag", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] - public partial class ApiException : ApiException - { - public TResult Result { get; private set; } - - public ApiException(string message, int statusCode, string? response, System.Collections.Generic.IReadOnlyDictionary> headers, TResult result, System.Exception? innerException) - : base(message, statusCode, response, headers, innerException) - { - Result = result; - } - } - -} - -#pragma warning restore 108 -#pragma warning restore 114 -#pragma warning restore 472 -#pragma warning restore 612 -#pragma warning restore 1573 -#pragma warning restore 1591 -#pragma warning restore 8073 -#pragma warning restore 3016 -#pragma warning restore 8603 -#pragma warning restore 8604 -#pragma warning restore 8625 \ No newline at end of file diff --git a/src/apps/blazor/infrastructure/Api/nswag.json b/src/apps/blazor/infrastructure/Api/nswag.json deleted file mode 100644 index 4d3fb1c43c..0000000000 --- a/src/apps/blazor/infrastructure/Api/nswag.json +++ /dev/null @@ -1,99 +0,0 @@ -{ - "runtime": "Net80", - "defaultVariables": null, - "documentGenerator": { - "fromDocument": { - "json": "", - "url": "https://localhost:7000/swagger/v1/swagger.json", - "output": null, - "newLineBehavior": "Auto" - } - }, - "codeGenerators": { - "openApiToCSharpClient": { - "clientBaseClass": null, - "configurationClass": null, - "generateClientClasses": true, - "generateClientInterfaces": true, - "injectHttpClient": true, - "disposeHttpClient": false, - "protectedMethods": [], - "generateExceptionClasses": true, - "exceptionClass": "ApiException", - "wrapDtoExceptions": true, - "useHttpClientCreationMethod": false, - "httpClientType": "System.Net.Http.HttpClient", - "useHttpRequestMessageCreationMethod": false, - "useBaseUrl": false, - "generateBaseUrlProperty": true, - "generateSyncMethods": false, - "generatePrepareRequestAndProcessResponseAsAsyncMethods": false, - "exposeJsonSerializerSettings": false, - "clientClassAccessModifier": "public", - "typeAccessModifier": "public", - "generateContractsOutput": false, - "contractsNamespace": null, - "contractsOutputFilePath": null, - "parameterDateTimeFormat": "s", - "parameterDateFormat": "yyyy-MM-dd", - "generateUpdateJsonSerializerSettingsMethod": true, - "useRequestAndResponseSerializationSettings": false, - "serializeTypeInformation": false, - "queryNullValue": "", - "className": "ApiClient", - "operationGenerationMode": "MultipleClientsFromOperationId", - "additionalNamespaceUsages": [], - "additionalContractNamespaceUsages": [], - "generateOptionalParameters": false, - "generateJsonMethods": false, - "enforceFlagEnums": false, - "parameterArrayType": "System.Collections.Generic.IEnumerable", - "parameterDictionaryType": "System.Collections.Generic.IDictionary", - "responseArrayType": "System.Collections.Generic.ICollection", - "responseDictionaryType": "System.Collections.Generic.IDictionary", - "wrapResponses": false, - "wrapResponseMethods": [], - "generateResponseClasses": true, - "responseClass": "SwaggerResponse", - "namespace": "FSH.Starter.Blazor.Infrastructure.Api", - "requiredPropertiesMustBeDefined": true, - "dateType": "System.DateTimeOffset", - "jsonConverters": null, - "anyType": "object", - "dateTimeType": "System.DateTime", - "timeType": "System.TimeSpan", - "timeSpanType": "System.TimeSpan", - "arrayType": "System.Collections.Generic.ICollection", - "arrayInstanceType": "System.Collections.ObjectModel.Collection", - "dictionaryType": "System.Collections.Generic.IDictionary", - "dictionaryInstanceType": "System.Collections.Generic.Dictionary", - "arrayBaseType": "System.Collections.ObjectModel.Collection", - "dictionaryBaseType": "System.Collections.Generic.Dictionary", - "classStyle": "Poco", - "jsonLibrary": "SystemTextJson", - "generateDefaultValues": true, - "generateDataAnnotations": true, - "excludedTypeNames": [], - "excludedParameterNames": [], - "handleReferences": false, - "generateImmutableArrayProperties": false, - "generateImmutableDictionaryProperties": false, - "jsonSerializerSettingsTransformationMethod": null, - "inlineNamedArrays": false, - "inlineNamedDictionaries": false, - "inlineNamedTuples": true, - "inlineNamedAny": false, - "generateDtoTypes": true, - "generateOptionalPropertiesAsNullable": false, - "generateNullableReferenceTypes": true, - "templateDirectory": null, - "typeNameGeneratorType": null, - "propertyNameGeneratorType": null, - "enumNameGeneratorType": null, - "serviceHost": null, - "serviceSchemes": null, - "output": "ApiClient.cs", - "newLineBehavior": "Auto" - } - } -} \ No newline at end of file diff --git a/src/apps/blazor/infrastructure/Auth/AuthorizationServiceExtensions.cs b/src/apps/blazor/infrastructure/Auth/AuthorizationServiceExtensions.cs deleted file mode 100644 index df265c8a4b..0000000000 --- a/src/apps/blazor/infrastructure/Auth/AuthorizationServiceExtensions.cs +++ /dev/null @@ -1,13 +0,0 @@ -using FSH.Starter.Shared.Authorization; -using Microsoft.AspNetCore.Authorization; -using System.Security.Claims; - -namespace FSH.Starter.Blazor.Infrastructure.Auth; - -public static class AuthorizationServiceExtensions -{ - public static async Task HasPermissionAsync(this IAuthorizationService service, ClaimsPrincipal user, string action, string resource) - { - return (await service.AuthorizeAsync(user, null, FshPermission.NameFor(action, resource))).Succeeded; - } -} diff --git a/src/apps/blazor/infrastructure/Auth/Extensions.cs b/src/apps/blazor/infrastructure/Auth/Extensions.cs deleted file mode 100644 index 730ef26e7a..0000000000 --- a/src/apps/blazor/infrastructure/Auth/Extensions.cs +++ /dev/null @@ -1,34 +0,0 @@ -using FSH.Starter.Blazor.Infrastructure.Auth.Jwt; -using FSH.Starter.Shared.Authorization; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Components.Authorization; -using Microsoft.AspNetCore.Components.WebAssembly.Authentication; -using Microsoft.AspNetCore.Components.WebAssembly.Authentication.Internal; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; - -namespace FSH.Starter.Blazor.Infrastructure.Auth; -public static class Extensions -{ - public static IServiceCollection AddAuthentication(this IServiceCollection services, IConfiguration config) - { - services.AddScoped() - .AddScoped(sp => (IAuthenticationService)sp.GetRequiredService()) - .AddScoped(sp => (IAccessTokenProvider)sp.GetRequiredService()) - .AddScoped() - .AddScoped(); - - services.AddAuthorizationCore(RegisterPermissionClaims); - services.AddCascadingAuthenticationState(); - return services; - } - - - private static void RegisterPermissionClaims(AuthorizationOptions options) - { - foreach (var permission in FshPermissions.All.Select(p => p.Name)) - { - options.AddPolicy(permission, policy => policy.RequireClaim(FshClaims.Permission, permission)); - } - } -} diff --git a/src/apps/blazor/infrastructure/Auth/IAuthenticationService.cs b/src/apps/blazor/infrastructure/Auth/IAuthenticationService.cs deleted file mode 100644 index 4de354af27..0000000000 --- a/src/apps/blazor/infrastructure/Auth/IAuthenticationService.cs +++ /dev/null @@ -1,15 +0,0 @@ -using FSH.Starter.Blazor.Infrastructure.Api; - -namespace FSH.Starter.Blazor.Infrastructure.Auth; - -public interface IAuthenticationService -{ - - void NavigateToExternalLogin(string returnUrl); - - Task LoginAsync(string tenantId, TokenGenerationCommand request); - - Task LogoutAsync(); - - Task ReLoginAsync(string returnUrl); -} \ No newline at end of file diff --git a/src/apps/blazor/infrastructure/Auth/Jwt/AccessTokenProviderAccessor.cs b/src/apps/blazor/infrastructure/Auth/Jwt/AccessTokenProviderAccessor.cs deleted file mode 100644 index 52df7087ae..0000000000 --- a/src/apps/blazor/infrastructure/Auth/Jwt/AccessTokenProviderAccessor.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Microsoft.AspNetCore.Components.WebAssembly.Authentication; -using Microsoft.AspNetCore.Components.WebAssembly.Authentication.Internal; -using Microsoft.Extensions.DependencyInjection; - -namespace FSH.Starter.Blazor.Infrastructure.Auth.Jwt; - -public class AccessTokenProviderAccessor : IAccessTokenProviderAccessor -{ - private readonly IServiceProvider _provider; - private IAccessTokenProvider? _tokenProvider; - - public AccessTokenProviderAccessor(IServiceProvider provider) => - _provider = provider; - - public IAccessTokenProvider TokenProvider => - _tokenProvider ??= _provider.GetRequiredService(); -} \ No newline at end of file diff --git a/src/apps/blazor/infrastructure/Auth/Jwt/AccessTokenProviderExtensions.cs b/src/apps/blazor/infrastructure/Auth/Jwt/AccessTokenProviderExtensions.cs deleted file mode 100644 index 7004cfe5e4..0000000000 --- a/src/apps/blazor/infrastructure/Auth/Jwt/AccessTokenProviderExtensions.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Microsoft.AspNetCore.Components.WebAssembly.Authentication; - -namespace FSH.Starter.Blazor.Infrastructure.Auth.Jwt; - -public static class AccessTokenProviderExtensions -{ - public static async Task GetAccessTokenAsync(this IAccessTokenProvider tokenProvider) => - (await tokenProvider.RequestAccessToken()) - .TryGetToken(out var token) - ? token.Value - : null; -} \ No newline at end of file diff --git a/src/apps/blazor/infrastructure/Auth/Jwt/JwtAuthenticationHeaderHandler.cs b/src/apps/blazor/infrastructure/Auth/Jwt/JwtAuthenticationHeaderHandler.cs deleted file mode 100644 index 6d9ad7656d..0000000000 --- a/src/apps/blazor/infrastructure/Auth/Jwt/JwtAuthenticationHeaderHandler.cs +++ /dev/null @@ -1,34 +0,0 @@ -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.Components.WebAssembly.Authentication.Internal; -using System.Net.Http.Headers; - -namespace FSH.Starter.Blazor.Infrastructure.Auth.Jwt; -public class JwtAuthenticationHeaderHandler : DelegatingHandler -{ - private readonly IAccessTokenProviderAccessor _tokenProviderAccessor; - private readonly NavigationManager _navigation; - - public JwtAuthenticationHeaderHandler(IAccessTokenProviderAccessor tokenProviderAccessor, NavigationManager navigation) - { - _tokenProviderAccessor = tokenProviderAccessor; - _navigation = navigation; - } - - protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) - { - // skip token endpoints - if (request.RequestUri?.AbsolutePath.Contains("/token") is not true) - { - if (await _tokenProviderAccessor.TokenProvider.GetAccessTokenAsync() is string token) - { - request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token); - } - else - { - _navigation.NavigateTo("/login"); - } - } - - return await base.SendAsync(request, cancellationToken); - } -} \ No newline at end of file diff --git a/src/apps/blazor/infrastructure/Auth/Jwt/JwtAuthenticationService.cs b/src/apps/blazor/infrastructure/Auth/Jwt/JwtAuthenticationService.cs deleted file mode 100644 index f129e35020..0000000000 --- a/src/apps/blazor/infrastructure/Auth/Jwt/JwtAuthenticationService.cs +++ /dev/null @@ -1,242 +0,0 @@ -using System.Security.Claims; -using System.Text.Json; -using Blazored.LocalStorage; -using FSH.Starter.Blazor.Infrastructure.Api; -using FSH.Starter.Blazor.Infrastructure.Storage; -using FSH.Starter.Shared.Authorization; -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.Components.Authorization; -using Microsoft.AspNetCore.Components.WebAssembly.Authentication; - -namespace FSH.Starter.Blazor.Infrastructure.Auth.Jwt; - -// This is a client-side AuthenticationStateProvider that determines the user's authentication state by -// looking for data persisted in the page when it was rendered on the server. This authentication state will -// be fixed for the lifetime of the WebAssembly application. So, if the user needs to log in or out, a full -// page reload is required. -// -// This only provides a user name and email for display purposes. It does not actually include any tokens -// that authenticate to the server when making subsequent requests. That works separately using a -// cookie that will be included on HttpClient requests to the server. -public sealed class JwtAuthenticationService : AuthenticationStateProvider, IAuthenticationService, IAccessTokenProvider -{ - private readonly SemaphoreSlim _semaphore = new(1, 1); - private readonly IApiClient _client; - private readonly ILocalStorageService _localStorage; - private readonly NavigationManager _navigation; - - public JwtAuthenticationService(PersistentComponentState state, ILocalStorageService localStorage, IApiClient client, NavigationManager navigation) - { - _localStorage = localStorage; - _client = client; - _navigation = navigation; - } - - public override async Task GetAuthenticationStateAsync() - { - string? cachedToken = await GetCachedAuthTokenAsync(); - if (string.IsNullOrWhiteSpace(cachedToken)) - { - return new AuthenticationState(new ClaimsPrincipal(new ClaimsIdentity())); - } - - // Generate claimsIdentity from cached token - var claimsIdentity = new ClaimsIdentity(GetClaimsFromJwt(cachedToken), "jwt"); - - // Add cached permissions as claims - if (await GetCachedPermissionsAsync() is List cachedPermissions) - { - claimsIdentity.AddClaims(cachedPermissions.Select(p => new Claim(FshClaims.Permission, p))); - } - - return new AuthenticationState(new ClaimsPrincipal(claimsIdentity)); - } - - public async Task LoginAsync(string tenantId, TokenGenerationCommand request) - { - var tokenResponse = await _client.TokenGenerationEndpointAsync(tenantId, request); - - string? token = tokenResponse.Token; - string? refreshToken = tokenResponse.RefreshToken; - - if (string.IsNullOrWhiteSpace(token) || string.IsNullOrWhiteSpace(refreshToken)) - { - return false; - } - - await CacheAuthTokens(token, refreshToken); - - // Get permissions for the current user and add them to the cache - var permissions = await _client.GetUserPermissionsAsync(); - await CachePermissions(permissions); - - NotifyAuthenticationStateChanged(GetAuthenticationStateAsync()); - - return true; - } - - public async Task LogoutAsync() - { - await ClearCacheAsync(); - - NotifyAuthenticationStateChanged(GetAuthenticationStateAsync()); - - _navigation.NavigateTo("/login"); - } - - public void NavigateToExternalLogin(string returnUrl) - { - throw new NotImplementedException(); - } - - public async Task ReLoginAsync(string returnUrl) - { - await LogoutAsync(); - _navigation.NavigateTo(returnUrl); - } - - public async ValueTask RequestAccessToken(AccessTokenRequestOptions options) - { - return await RequestAccessToken(); - - } - - public async ValueTask RequestAccessToken() - { - // We make sure the access token is only refreshed by one thread at a time. The other ones have to wait. - await _semaphore.WaitAsync(); - try - { - var authState = await GetAuthenticationStateAsync(); - if (authState.User.Identity?.IsAuthenticated is not true) - { - return new AccessTokenResult(AccessTokenResultStatus.RequiresRedirect, new(), "/login", default); - } - - string? token = await GetCachedAuthTokenAsync(); - - //// Check if token needs to be refreshed (when its expiration time is less than 1 minute away) - var expTime = authState.User.GetExpiration(); - var diff = expTime - DateTime.UtcNow; - if (diff.TotalMinutes <= 1) - { - //return new AccessTokenResult(AccessTokenResultStatus.RequiresRedirect, new(), "/login", default); - string? refreshToken = await GetCachedRefreshTokenAsync(); - (bool succeeded, var response) = await TryRefreshTokenAsync(new RefreshTokenCommand { Token = token, RefreshToken = refreshToken }); - if (!succeeded) - { - return new AccessTokenResult(AccessTokenResultStatus.RequiresRedirect, new(), "/login", default); - } - - token = response?.Token; - } - - return new AccessTokenResult(AccessTokenResultStatus.Success, new AccessToken() { Value = token! }, string.Empty, default); - } - finally - { - _semaphore.Release(); - } - } - - private async Task<(bool Succeeded, TokenResponse? Token)> TryRefreshTokenAsync(RefreshTokenCommand request) - { - var authState = await GetAuthenticationStateAsync(); - string? tenantKey = authState.User.GetTenant(); - if (string.IsNullOrWhiteSpace(tenantKey)) - { - throw new InvalidOperationException("Can't refresh token when user is not logged in!"); - } - - try - { - var tokenResponse = await _client.RefreshTokenEndpointAsync(tenantKey, request); - - await CacheAuthTokens(tokenResponse.Token, tokenResponse.RefreshToken); - - return (true, tokenResponse); - } - catch - { - return (false, null); - } - } - - private async ValueTask CacheAuthTokens(string? token, string? refreshToken) - { - await _localStorage.SetItemAsync(StorageConstants.Local.AuthToken, token); - await _localStorage.SetItemAsync(StorageConstants.Local.RefreshToken, refreshToken); - } - - private ValueTask CachePermissions(ICollection permissions) - { - return _localStorage.SetItemAsync(StorageConstants.Local.Permissions, permissions); - } - - private async Task ClearCacheAsync() - { - await _localStorage.RemoveItemAsync(StorageConstants.Local.AuthToken); - await _localStorage.RemoveItemAsync(StorageConstants.Local.RefreshToken); - await _localStorage.RemoveItemAsync(StorageConstants.Local.Permissions); - } - private ValueTask GetCachedAuthTokenAsync() - { - return _localStorage.GetItemAsync(StorageConstants.Local.AuthToken); - } - - private ValueTask GetCachedRefreshTokenAsync() - { - return _localStorage.GetItemAsync(StorageConstants.Local.RefreshToken); - } - - private ValueTask?> GetCachedPermissionsAsync() - { - return _localStorage.GetItemAsync>(StorageConstants.Local.Permissions); - } - - private IEnumerable GetClaimsFromJwt(string jwt) - { - var claims = new List(); - string payload = jwt.Split('.')[1]; - byte[] jsonBytes = ParseBase64WithoutPadding(payload); - var keyValuePairs = JsonSerializer.Deserialize>(jsonBytes); - - if (keyValuePairs is not null) - { - keyValuePairs.TryGetValue(ClaimTypes.Role, out object? roles); - - if (roles is not null) - { - string? rolesString = roles.ToString(); - if (!string.IsNullOrEmpty(rolesString)) - { - if (rolesString.Trim().StartsWith("[")) - { - string[]? parsedRoles = JsonSerializer.Deserialize(rolesString); - - if (parsedRoles is not null) - { - claims.AddRange(parsedRoles.Select(role => new Claim(ClaimTypes.Role, role))); - } - } - else - { - claims.Add(new Claim(ClaimTypes.Role, rolesString)); - } - } - - keyValuePairs.Remove(ClaimTypes.Role); - } - - claims.AddRange(keyValuePairs.Select(kvp => new Claim(kvp.Key, kvp.Value.ToString() ?? string.Empty))); - } - - return claims; - } - private byte[] ParseBase64WithoutPadding(string payload) - { - payload = payload.Trim().Replace('-', '+').Replace('_', '/'); - string base64 = payload.PadRight(payload.Length + (4 - payload.Length % 4) % 4, '='); - return Convert.FromBase64String(base64); - } -} diff --git a/src/apps/blazor/infrastructure/Auth/UserInfo.cs b/src/apps/blazor/infrastructure/Auth/UserInfo.cs deleted file mode 100644 index 28bdcff7e7..0000000000 --- a/src/apps/blazor/infrastructure/Auth/UserInfo.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Security.Claims; - -namespace FSH.Starter.Blazor.Infrastructure.Auth; - -// Add properties to this class and update the server and client AuthenticationStateProviders -// to expose more information about the authenticated user to the client. -public sealed class UserInfo -{ - public required string UserId { get; init; } - public required string Name { get; init; } - - public const string UserIdClaimType = "sub"; - public const string NameClaimType = "name"; - - public static UserInfo FromClaimsPrincipal(ClaimsPrincipal principal) => - new() - { - UserId = GetRequiredClaim(principal, UserIdClaimType), - Name = GetRequiredClaim(principal, NameClaimType), - }; - - public ClaimsPrincipal ToClaimsPrincipal() => - new(new ClaimsIdentity( - [new(UserIdClaimType, UserId), new(NameClaimType, Name)], - authenticationType: nameof(UserInfo), - nameType: NameClaimType, - roleType: null)); - - private static string GetRequiredClaim(ClaimsPrincipal principal, string claimType) => - principal.FindFirst(claimType)?.Value ?? throw new InvalidOperationException($"Could not find required '{claimType}' claim."); -} diff --git a/src/apps/blazor/infrastructure/Directory.Packages.props b/src/apps/blazor/infrastructure/Directory.Packages.props deleted file mode 100644 index 22802bc43d..0000000000 --- a/src/apps/blazor/infrastructure/Directory.Packages.props +++ /dev/null @@ -1,22 +0,0 @@ - - - true - true - true - - - true - true - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/apps/blazor/infrastructure/Extensions.cs b/src/apps/blazor/infrastructure/Extensions.cs deleted file mode 100644 index 10adc054a0..0000000000 --- a/src/apps/blazor/infrastructure/Extensions.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System.Globalization; -using Blazored.LocalStorage; -using FSH.Starter.Blazor.Infrastructure.Api; -using FSH.Starter.Blazor.Infrastructure.Auth; -using FSH.Starter.Blazor.Infrastructure.Auth.Jwt; -using FSH.Starter.Blazor.Infrastructure.Notifications; -using FSH.Starter.Blazor.Infrastructure.Preferences; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using MudBlazor; -using MudBlazor.Services; - -namespace FSH.Starter.Blazor.Infrastructure; -public static class Extensions -{ - private const string ClientName = "FullStackHero.API"; - public static IServiceCollection AddClientServices(this IServiceCollection services, IConfiguration config) - { - services.AddMudServices(configuration => - { - configuration.SnackbarConfiguration.PositionClass = Defaults.Classes.Position.BottomRight; - configuration.SnackbarConfiguration.HideTransitionDuration = 100; - configuration.SnackbarConfiguration.ShowTransitionDuration = 100; - configuration.SnackbarConfiguration.VisibleStateDuration = 3000; - configuration.SnackbarConfiguration.ShowCloseIcon = false; - }); - services.AddBlazoredLocalStorage(); - services.AddAuthentication(config); - services.AddTransient(); - services.AddHttpClient(ClientName, client => - { - client.DefaultRequestHeaders.AcceptLanguage.Clear(); - client.DefaultRequestHeaders.AcceptLanguage.ParseAdd(CultureInfo.DefaultThreadCurrentCulture?.TwoLetterISOLanguageName); - client.BaseAddress = new Uri(config["ApiBaseUrl"]!); - }) - .AddHttpMessageHandler() - .Services - .AddScoped(sp => sp.GetRequiredService().CreateClient(ClientName)); - services.AddTransient(); - services.AddTransient(); - services.AddNotifications(); - return services; - - } -} diff --git a/src/apps/blazor/infrastructure/Infrastructure.csproj b/src/apps/blazor/infrastructure/Infrastructure.csproj deleted file mode 100644 index d53d6be854..0000000000 --- a/src/apps/blazor/infrastructure/Infrastructure.csproj +++ /dev/null @@ -1,30 +0,0 @@ - - - - net9.0 - enable - enable - FSH.Starter.Blazor.Infrastructure - FSH.Starter.Blazor.Infrastructure - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/apps/blazor/infrastructure/Notifications/ConnectionState.cs b/src/apps/blazor/infrastructure/Notifications/ConnectionState.cs deleted file mode 100644 index 69cf9bb2d3..0000000000 --- a/src/apps/blazor/infrastructure/Notifications/ConnectionState.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace FSH.Starter.Blazor.Infrastructure.Notifications; - -public enum ConnectionState -{ - Connected, - Connecting, - Disconnected -} \ No newline at end of file diff --git a/src/apps/blazor/infrastructure/Notifications/ConnectionStateChanged.cs b/src/apps/blazor/infrastructure/Notifications/ConnectionStateChanged.cs deleted file mode 100644 index ae23346385..0000000000 --- a/src/apps/blazor/infrastructure/Notifications/ConnectionStateChanged.cs +++ /dev/null @@ -1,5 +0,0 @@ -using FSH.Starter.Blazor.Shared.Notifications; - -namespace FSH.Starter.Blazor.Infrastructure.Notifications; - -public record ConnectionStateChanged(ConnectionState State, string? Message) : INotificationMessage; \ No newline at end of file diff --git a/src/apps/blazor/infrastructure/Notifications/Extensions.cs b/src/apps/blazor/infrastructure/Notifications/Extensions.cs deleted file mode 100644 index 872b6b8a7a..0000000000 --- a/src/apps/blazor/infrastructure/Notifications/Extensions.cs +++ /dev/null @@ -1,35 +0,0 @@ -using FSH.Starter.Blazor.Shared.Notifications; -using MediatR; -using MediatR.Courier; -using Microsoft.Extensions.DependencyInjection; - -namespace FSH.Starter.Blazor.Infrastructure.Notifications; -internal static class Extensions -{ - public static IServiceCollection AddNotifications(this IServiceCollection services) - { - // Add mediator processing of notifications - var assemblies = AppDomain.CurrentDomain.GetAssemblies(); - - services - .AddMediatR(cfg => - { - cfg.RegisterServicesFromAssemblies(assemblies); - }) - .AddCourier(assemblies) - .AddTransient(); - - // Register handlers for all INotificationMessages - foreach (var eventType in assemblies - .SelectMany(a => a.GetTypes()) - .Where(t => t.GetInterfaces().Any(i => i == typeof(INotificationMessage)))) - { - services.AddSingleton( - typeof(INotificationHandler<>).MakeGenericType( - typeof(NotificationWrapper<>).MakeGenericType(eventType)), - serviceProvider => serviceProvider.GetRequiredService(typeof(MediatRCourier))); - } - - return services; - } -} diff --git a/src/apps/blazor/infrastructure/Notifications/INotificationPublisher.cs b/src/apps/blazor/infrastructure/Notifications/INotificationPublisher.cs deleted file mode 100644 index 8ebca593be..0000000000 --- a/src/apps/blazor/infrastructure/Notifications/INotificationPublisher.cs +++ /dev/null @@ -1,8 +0,0 @@ -using FSH.Starter.Blazor.Shared.Notifications; - -namespace FSH.Starter.Blazor.Infrastructure.Notifications; - -public interface INotificationPublisher -{ - Task PublishAsync(INotificationMessage notification); -} \ No newline at end of file diff --git a/src/apps/blazor/infrastructure/Notifications/NotificationPublisher.cs b/src/apps/blazor/infrastructure/Notifications/NotificationPublisher.cs deleted file mode 100644 index 7bab4ecfc4..0000000000 --- a/src/apps/blazor/infrastructure/Notifications/NotificationPublisher.cs +++ /dev/null @@ -1,24 +0,0 @@ -using FSH.Starter.Blazor.Shared.Notifications; -using MediatR; -using Microsoft.Extensions.Logging; - -namespace FSH.Starter.Blazor.Infrastructure.Notifications; - -public class NotificationPublisher : INotificationPublisher -{ - private readonly ILogger _logger; - private readonly IPublisher _mediator; - - public NotificationPublisher(ILogger logger, IPublisher mediator) => - (_logger, _mediator) = (logger, mediator); - - public Task PublishAsync(INotificationMessage notification) - { - _logger.LogInformation("Publishing Notification : {notification}", notification.GetType().Name); - return _mediator.Publish(CreateNotificationWrapper(notification)); - } - - private INotification CreateNotificationWrapper(INotificationMessage notification) => - (INotification)Activator.CreateInstance( - typeof(NotificationWrapper<>).MakeGenericType(notification.GetType()), notification)!; -} \ No newline at end of file diff --git a/src/apps/blazor/infrastructure/Notifications/NotificationWrapper.cs b/src/apps/blazor/infrastructure/Notifications/NotificationWrapper.cs deleted file mode 100644 index adf1aba2cc..0000000000 --- a/src/apps/blazor/infrastructure/Notifications/NotificationWrapper.cs +++ /dev/null @@ -1,12 +0,0 @@ -using FSH.Starter.Blazor.Shared.Notifications; -using MediatR; - -namespace FSH.Starter.Blazor.Infrastructure.Notifications; - -public class NotificationWrapper : INotification - where TNotificationMessage : INotificationMessage -{ - public NotificationWrapper(TNotificationMessage notification) => Notification = notification; - - public TNotificationMessage Notification { get; } -} \ No newline at end of file diff --git a/src/apps/blazor/infrastructure/Preferences/ClientPreference.cs b/src/apps/blazor/infrastructure/Preferences/ClientPreference.cs deleted file mode 100644 index 0003635571..0000000000 --- a/src/apps/blazor/infrastructure/Preferences/ClientPreference.cs +++ /dev/null @@ -1,14 +0,0 @@ -using FSH.Starter.Blazor.Infrastructure.Themes; - -namespace FSH.Starter.Blazor.Infrastructure.Preferences; - -public class ClientPreference : IPreference -{ - public bool IsDarkMode { get; set; } = true; - public bool IsRTL { get; set; } - public bool IsDrawerOpen { get; set; } - public string PrimaryColor { get; set; } = CustomColors.Light.Primary; - public string SecondaryColor { get; set; } = CustomColors.Light.Secondary; - public double BorderRadius { get; set; } = 5; - public FshTablePreference TablePreference { get; set; } = new FshTablePreference(); -} diff --git a/src/apps/blazor/infrastructure/Preferences/ClientPreferenceManager.cs b/src/apps/blazor/infrastructure/Preferences/ClientPreferenceManager.cs deleted file mode 100644 index bd11448a53..0000000000 --- a/src/apps/blazor/infrastructure/Preferences/ClientPreferenceManager.cs +++ /dev/null @@ -1,136 +0,0 @@ -using System.Text.RegularExpressions; -using Blazored.LocalStorage; -using FSH.Starter.Blazor.Infrastructure.Themes; -using MudBlazor; - -namespace FSH.Starter.Blazor.Infrastructure.Preferences; - -public class ClientPreferenceManager : IClientPreferenceManager -{ - private readonly ILocalStorageService _localStorageService; - - public ClientPreferenceManager( - ILocalStorageService localStorageService) - { - _localStorageService = localStorageService; - } - - public async Task ToggleDarkModeAsync() - { - if (await GetPreference() is ClientPreference preference) - { - preference.IsDarkMode = !preference.IsDarkMode; - await SetPreference(preference); - return !preference.IsDarkMode; - } - - return false; - } - - public async Task ToggleDrawerAsync() - { - if (await GetPreference() is ClientPreference preference) - { - preference.IsDrawerOpen = !preference.IsDrawerOpen; - await SetPreference(preference); - return preference.IsDrawerOpen; - } - - return false; - } - - public async Task ToggleLayoutDirectionAsync() - { - if (await GetPreference() is ClientPreference preference) - { - preference.IsRTL = !preference.IsRTL; - await SetPreference(preference); - return preference.IsRTL; - } - - return false; - } - - public async Task ChangeLanguageAsync(string languageCode) - { - //if (await GetPreference() is ClientPreference preference) - //{ - // var language = Array.Find(LocalizationConstants.SupportedLanguages, a => a.Code == languageCode); - // if (language?.Code is not null) - // { - // preference.LanguageCode = language.Code; - // preference.IsRTL = language.IsRTL; - // } - // else - // { - // preference.LanguageCode = "en-EN"; - // preference.IsRTL = false; - // } - - // await SetPreference(preference); - // return true; - //} - - return false; - } - - public async Task GetCurrentThemeAsync() - { - if (await GetPreference() is ClientPreference preference && preference.IsDarkMode) - return new FshTheme(); - - return new FshTheme(); - } - - public async Task GetPrimaryColorAsync() - { - if (await GetPreference() is ClientPreference preference) - { - string colorCode = preference.PrimaryColor; - if (Regex.Match(colorCode, "^#(?:[0-9a-fA-F]{3,4}){1,2}$").Success) - { - return colorCode; - } - else - { - preference.PrimaryColor = CustomColors.Light.Primary; - await SetPreference(preference); - return preference.PrimaryColor; - } - } - - return CustomColors.Light.Primary; - } - - public async Task IsRTL() - { - if (await GetPreference() is ClientPreference preference) - { - return preference.IsRTL; - } - - return false; - } - - public async Task IsDrawerOpen() - { - if (await GetPreference() is ClientPreference preference) - { - return preference.IsDrawerOpen; - } - - return false; - } - - public static string Preference = "clientPreference"; - - public async Task GetPreference() - { - return await _localStorageService.GetItemAsync(Preference) ?? new ClientPreference(); - } - - public async Task SetPreference(IPreference preference) - { - await _localStorageService.SetItemAsync(Preference, preference as ClientPreference); - } -} diff --git a/src/apps/blazor/infrastructure/Preferences/FshTablePreference.cs b/src/apps/blazor/infrastructure/Preferences/FshTablePreference.cs deleted file mode 100644 index f5595061bd..0000000000 --- a/src/apps/blazor/infrastructure/Preferences/FshTablePreference.cs +++ /dev/null @@ -1,11 +0,0 @@ -using FSH.Starter.Blazor.Shared.Notifications; - -namespace FSH.Starter.Blazor.Infrastructure.Preferences; - -public class FshTablePreference : INotificationMessage -{ - public bool IsDense { get; set; } - public bool IsStriped { get; set; } - public bool HasBorder { get; set; } - public bool IsHoverable { get; set; } -} \ No newline at end of file diff --git a/src/apps/blazor/infrastructure/Preferences/IClientPreferenceManager.cs b/src/apps/blazor/infrastructure/Preferences/IClientPreferenceManager.cs deleted file mode 100644 index 444fd15c3f..0000000000 --- a/src/apps/blazor/infrastructure/Preferences/IClientPreferenceManager.cs +++ /dev/null @@ -1,14 +0,0 @@ -using MudBlazor; - -namespace FSH.Starter.Blazor.Infrastructure.Preferences; - -public interface IClientPreferenceManager : IPreferenceManager -{ - Task GetCurrentThemeAsync(); - - Task ToggleDarkModeAsync(); - - Task ToggleDrawerAsync(); - - Task ToggleLayoutDirectionAsync(); -} \ No newline at end of file diff --git a/src/apps/blazor/infrastructure/Preferences/IPreference.cs b/src/apps/blazor/infrastructure/Preferences/IPreference.cs deleted file mode 100644 index 8909a3ad48..0000000000 --- a/src/apps/blazor/infrastructure/Preferences/IPreference.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace FSH.Starter.Blazor.Infrastructure.Preferences; - -public interface IPreference -{ - -} \ No newline at end of file diff --git a/src/apps/blazor/infrastructure/Preferences/IPreferenceManager.cs b/src/apps/blazor/infrastructure/Preferences/IPreferenceManager.cs deleted file mode 100644 index 041f44603b..0000000000 --- a/src/apps/blazor/infrastructure/Preferences/IPreferenceManager.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace FSH.Starter.Blazor.Infrastructure.Preferences; - -public interface IPreferenceManager -{ - Task SetPreference(IPreference preference); - - Task GetPreference(); - - Task ChangeLanguageAsync(string languageCode); -} \ No newline at end of file diff --git a/src/apps/blazor/infrastructure/Storage/StorageConstants.cs b/src/apps/blazor/infrastructure/Storage/StorageConstants.cs deleted file mode 100644 index 120cf4c5e5..0000000000 --- a/src/apps/blazor/infrastructure/Storage/StorageConstants.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace FSH.Starter.Blazor.Infrastructure.Storage; -public static class StorageConstants -{ - public static class Local - { - public static string Preference = "clientPreference"; - - public static string AuthToken = "authToken"; - public static string RefreshToken = "refreshToken"; - public static string ImageUri = "userImageURL"; - public static string Permissions = "permissions"; - } -} diff --git a/src/apps/blazor/infrastructure/Themes/CustomColors.cs b/src/apps/blazor/infrastructure/Themes/CustomColors.cs deleted file mode 100644 index 5d72078418..0000000000 --- a/src/apps/blazor/infrastructure/Themes/CustomColors.cs +++ /dev/null @@ -1,42 +0,0 @@ -using MudBlazor; - -namespace FSH.Starter.Blazor.Infrastructure.Themes; - -public static class CustomColors -{ - public static readonly List ThemeColors = new() - { - Light.Primary, - Colors.Blue.Default, - Colors.Purple.Default, - Colors.Orange.Default, - Colors.Red.Default, - Colors.Amber.Default, - Colors.DeepPurple.Default, - Colors.Pink.Default, - Colors.Indigo.Default, - Colors.LightBlue.Default, - Colors.Cyan.Default, - Colors.Green.Default, - }; - - public static class Light - { - public const string Primary = "rgba(76,175,80,1)"; - public const string Secondary = "rgba(33,150,243,1)"; - public const string Background = "#FFF"; - public const string AppbarBackground = "#FFF"; - public const string AppbarText = "#6e6e6e"; - } - - public static class Dark - { - public const string Primary = "rgba(76,175,80,1)"; - public const string Secondary = "rgba(33,150,243,1)"; - public const string Background = "#1b1f22"; - public const string AppbarBackground = "#1b1f22"; - public const string DrawerBackground = "#121212"; - public const string Surface = "#202528"; - public const string Disabled = "#545454"; - } -} diff --git a/src/apps/blazor/infrastructure/Themes/CustomTypography.cs b/src/apps/blazor/infrastructure/Themes/CustomTypography.cs deleted file mode 100644 index 69faf18ed2..0000000000 --- a/src/apps/blazor/infrastructure/Themes/CustomTypography.cs +++ /dev/null @@ -1,114 +0,0 @@ -using MudBlazor; - -namespace FSH.Starter.Blazor.Infrastructure.Themes; - -public static class CustomTypography -{ - public static Typography FshTypography => new Typography() - { - Default = new DefaultTypography() - { - FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], - FontSize = ".875rem", - FontWeight = "400", - LineHeight = "1.43", - LetterSpacing = ".01071em" - }, - H1 = new H1Typography() - { - FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], - FontSize = "3rem", - FontWeight = "300", - LineHeight = "1.167", - LetterSpacing = "-.01562em" - }, - H2 = new H2Typography() - { - FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], - FontSize = "2.75rem", - FontWeight = "300", - LineHeight = "1.2", - LetterSpacing = "-.00833em" - }, - H3 = new H3Typography() - { - FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], - FontSize = "2rem", - FontWeight = "400", - LineHeight = "1.167", - LetterSpacing = "0" - }, - H4 = new H4Typography() - { - FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], - FontSize = "1.75rem", - FontWeight = "400", - LineHeight = "1.235", - LetterSpacing = ".00735em" - }, - H5 = new H5Typography() - { - FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], - FontSize = "1.5rem", - FontWeight = "400", - LineHeight = "1.334", - LetterSpacing = "0" - }, - H6 = new H6Typography() - { - FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], - FontSize = "1.25rem", - FontWeight = "400", - LineHeight = "1.6", - LetterSpacing = ".0075em" - }, - Button = new ButtonTypography() - { - FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], - FontSize = ".875rem", - FontWeight = "400", - LineHeight = "1.75", - LetterSpacing = ".02857em" - }, - Body1 = new Body1Typography() - { - FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], - FontSize = "1rem", - FontWeight = "400", - LineHeight = "1.5", - LetterSpacing = ".00938em" - }, - Body2 = new Body2Typography() - { - FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], - FontSize = ".875rem", - FontWeight = "400", - LineHeight = "1.43", - LetterSpacing = ".01071em" - }, - Caption = new CaptionTypography() - { - FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], - FontSize = ".75rem", - FontWeight = "200", - LineHeight = "1.66", - LetterSpacing = ".03333em" - }, - Subtitle1 = new Subtitle1Typography() - { - FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], - FontSize = "1rem", - FontWeight = "400", - LineHeight = "1.57", - LetterSpacing = ".00714em" - }, - Subtitle2 = new Subtitle2Typography() - { - FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], - FontSize = ".875rem", - FontWeight = "400", - LineHeight = "1.57", - LetterSpacing = ".00714em" - } - }; -} diff --git a/src/apps/blazor/infrastructure/Themes/FshTheme.cs b/src/apps/blazor/infrastructure/Themes/FshTheme.cs deleted file mode 100644 index 233ad52ebb..0000000000 --- a/src/apps/blazor/infrastructure/Themes/FshTheme.cs +++ /dev/null @@ -1,57 +0,0 @@ -using MudBlazor; - -namespace FSH.Starter.Blazor.Infrastructure.Themes; - -public class FshTheme : MudTheme -{ - public FshTheme() - { - PaletteLight = new PaletteLight() - { - Primary = CustomColors.Light.Primary, - Secondary = CustomColors.Light.Secondary, - Background = CustomColors.Light.Background, - AppbarBackground = CustomColors.Light.AppbarBackground, - AppbarText = CustomColors.Light.AppbarText, - DrawerBackground = CustomColors.Light.Background, - DrawerText = "rgba(0,0,0, 0.7)", - Success = CustomColors.Light.Primary, - TableLines = "#e0e0e029", - OverlayDark = "hsl(0deg 0% 0% / 75%)" - }; - - PaletteDark = new PaletteDark() - { - Primary = CustomColors.Dark.Primary, - Secondary = CustomColors.Dark.Secondary, - Success = CustomColors.Dark.Primary, - Black = "#27272f", - Background = CustomColors.Dark.Background, - Surface = CustomColors.Dark.Surface, - DrawerBackground = CustomColors.Dark.DrawerBackground, - DrawerText = "rgba(255,255,255, 0.50)", - AppbarBackground = CustomColors.Dark.AppbarBackground, - AppbarText = "rgba(255,255,255, 0.70)", - TextPrimary = "rgba(255,255,255, 0.70)", - TextSecondary = "rgba(255,255,255, 0.50)", - ActionDefault = "#adadb1", - ActionDisabled = "rgba(255,255,255, 0.26)", - ActionDisabledBackground = "rgba(255,255,255, 0.12)", - DrawerIcon = "rgba(255,255,255, 0.50)", - TableLines = "#e0e0e036", - Dark = CustomColors.Dark.DrawerBackground, - Divider = "#e0e0e036", - OverlayDark = "hsl(0deg 0% 0% / 75%)", - TextDisabled = CustomColors.Dark.Disabled - }; - - LayoutProperties = new LayoutProperties() - { - DefaultBorderRadius = "5px" - }; - - Typography = CustomTypography.FshTypography; - Shadows = new Shadow(); - ZIndex = new ZIndex() { Drawer = 1300 }; - } -} \ No newline at end of file diff --git a/src/apps/blazor/nginx.conf b/src/apps/blazor/nginx.conf deleted file mode 100644 index 9c2af758d5..0000000000 --- a/src/apps/blazor/nginx.conf +++ /dev/null @@ -1,19 +0,0 @@ -events { } - -http { - include mime.types; - - types { - application/wasm wasm; - } - - server { - listen 80; - index index.html; - - location / { - root /usr/share/nginx/html; - try_files $uri $uri/ /index.html =404; - } - } -} diff --git a/src/apps/blazor/scripts/nswag-regen.ps1 b/src/apps/blazor/scripts/nswag-regen.ps1 deleted file mode 100644 index 0d88d60bc5..0000000000 --- a/src/apps/blazor/scripts/nswag-regen.ps1 +++ /dev/null @@ -1,20 +0,0 @@ -# This script is cross-platform, supporting all OSes that PowerShell Core/7 runs on. - -$currentDirectory = Get-Location -$rootDirectory = git rev-parse --show-toplevel -$hostDirectory = Join-Path -Path $rootDirectory -ChildPath 'src/apps/blazor/client' -$infrastructurePrj = Join-Path -Path $rootDirectory -ChildPath 'src/apps/blazor/infrastructure/Infrastructure.csproj' - -Write-Host "Make sure you have run the WebAPI project. `n" -Write-Host "Press any key to continue... `n" -$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'); - -Set-Location -Path $hostDirectory -Write-Host "Host Directory is $hostDirectory `n" - -<# Run command #> -dotnet build -t:NSwag $infrastructurePrj - -Set-Location -Path $currentDirectory -Write-Host -NoNewLine 'NSwag Regenerated. Press any key to continue...'; -$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'); diff --git a/src/apps/blazor/shared/Notifications/BasicNotification.cs b/src/apps/blazor/shared/Notifications/BasicNotification.cs deleted file mode 100644 index 6401c24f18..0000000000 --- a/src/apps/blazor/shared/Notifications/BasicNotification.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace FSH.Starter.Blazor.Shared.Notifications; - -public class BasicNotification : INotificationMessage -{ - public enum LabelType - { - Information, - Success, - Warning, - Error - } - - public string? Message { get; set; } - public LabelType Label { get; set; } -} \ No newline at end of file diff --git a/src/apps/blazor/shared/Notifications/INotificationMessage.cs b/src/apps/blazor/shared/Notifications/INotificationMessage.cs deleted file mode 100644 index 48dd686d8e..0000000000 --- a/src/apps/blazor/shared/Notifications/INotificationMessage.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace FSH.Starter.Blazor.Shared.Notifications; - -public interface INotificationMessage -{ -} \ No newline at end of file diff --git a/src/apps/blazor/shared/Notifications/JobNotification.cs b/src/apps/blazor/shared/Notifications/JobNotification.cs deleted file mode 100644 index 9b645a6d66..0000000000 --- a/src/apps/blazor/shared/Notifications/JobNotification.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace FSH.Starter.Blazor.Shared.Notifications; - -public class JobNotification : INotificationMessage -{ - public string? Message { get; set; } - public string? JobId { get; set; } - public decimal Progress { get; set; } -} \ No newline at end of file diff --git a/src/apps/blazor/shared/Notifications/NotificationConstants.cs b/src/apps/blazor/shared/Notifications/NotificationConstants.cs deleted file mode 100644 index 69e0b764b3..0000000000 --- a/src/apps/blazor/shared/Notifications/NotificationConstants.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace FSH.Starter.Blazor.Shared.Notifications; - -public static class NotificationConstants -{ - public const string NotificationFromServer = nameof(NotificationFromServer); -} \ No newline at end of file diff --git a/src/apps/blazor/shared/Notifications/StatsChangedNotification.cs b/src/apps/blazor/shared/Notifications/StatsChangedNotification.cs deleted file mode 100644 index 7b8f4f006f..0000000000 --- a/src/apps/blazor/shared/Notifications/StatsChangedNotification.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace FSH.Starter.Blazor.Shared.Notifications; - -public class StatsChangedNotification : INotificationMessage -{ -} \ No newline at end of file diff --git a/src/apps/blazor/shared/Shared.csproj b/src/apps/blazor/shared/Shared.csproj deleted file mode 100644 index 16aa766eec..0000000000 --- a/src/apps/blazor/shared/Shared.csproj +++ /dev/null @@ -1,11 +0,0 @@ - - - - net9.0 - enable - enable - FSH.Starter.Blazor.Shared - FSH.Starter.Blazor.Shared - - - diff --git a/src/aspire/Host/Host.csproj b/src/aspire/Host/Host.csproj deleted file mode 100644 index 35f6caac53..0000000000 --- a/src/aspire/Host/Host.csproj +++ /dev/null @@ -1,26 +0,0 @@ - - - - FSH.Starter.Aspire - FSH.Starter.Aspire - Exe - net9.0 - enable - enable - true - a007d645-3346-446a-89ab-2bb3fdeebb54 - - - - - - - - - - - - - - - diff --git a/src/aspire/Host/Program.cs b/src/aspire/Host/Program.cs deleted file mode 100644 index 1875e66fa7..0000000000 --- a/src/aspire/Host/Program.cs +++ /dev/null @@ -1,26 +0,0 @@ -var builder = DistributedApplication.CreateBuilder(args); - -builder.AddContainer("grafana", "grafana/grafana") - .WithBindMount("../../../compose/grafana/config", "/etc/grafana", isReadOnly: true) - .WithBindMount("../../../compose/grafana/dashboards", "/var/lib/grafana/dashboards", isReadOnly: true) - .WithHttpEndpoint(port: 3000, targetPort: 3000, name: "http"); - -builder.AddContainer("prometheus", "prom/prometheus") - .WithBindMount("../../../compose/prometheus", "/etc/prometheus", isReadOnly: true) - .WithHttpEndpoint(port: 9090, targetPort: 9090); - -var username = builder.AddParameter("pg-username", "admin"); -var password = builder.AddParameter("pg-password", "admin"); - -var database = builder.AddPostgres("db", username, password, port: 5432) - .WithDataVolume() - .AddDatabase("fullstackhero"); - -var api = builder.AddProject("webapi") - .WaitFor(database); - -var blazor = builder.AddProject("blazor"); - -using var app = builder.Build(); - -await app.RunAsync(); diff --git a/src/aspire/Host/Properties/launchSettings.json b/src/aspire/Host/Properties/launchSettings.json deleted file mode 100644 index 946a56bbb7..0000000000 --- a/src/aspire/Host/Properties/launchSettings.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/launchsettings.json", - "profiles": { - "https": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": true, - "applicationUrl": "https://localhost:7200;http://localhost:5200", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development", - "DOTNET_ENVIRONMENT": "Development", - "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:21192", - "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:22197" - } - } - } -} diff --git a/src/aspire/Host/appsettings.Development.json b/src/aspire/Host/appsettings.Development.json deleted file mode 100644 index 0c208ae918..0000000000 --- a/src/aspire/Host/appsettings.Development.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - } -} diff --git a/src/aspire/Host/appsettings.json b/src/aspire/Host/appsettings.json deleted file mode 100644 index 31c092aa45..0000000000 --- a/src/aspire/Host/appsettings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning", - "Aspire.Hosting.Dcp": "Warning" - } - } -} diff --git a/src/aspire/service-defaults/Extensions.cs b/src/aspire/service-defaults/Extensions.cs deleted file mode 100644 index 7893d5361b..0000000000 --- a/src/aspire/service-defaults/Extensions.cs +++ /dev/null @@ -1,152 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Diagnostics.HealthChecks; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Diagnostics.HealthChecks; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using OpenTelemetry; -using OpenTelemetry.Metrics; -using OpenTelemetry.Resources; -using OpenTelemetry.Trace; - -namespace FSH.Starter.Aspire.ServiceDefaults; - -// Adds common .NET Aspire services: service discovery, resilience, health checks, and OpenTelemetry. -// This project should be referenced by each service project in your solution. -// To learn more about using this project, see https://aka.ms/dotnet/aspire/service-defaults -public static class Extensions -{ - public static IHostApplicationBuilder AddServiceDefaults(this IHostApplicationBuilder builder) - { - builder.ConfigureOpenTelemetry(); - - builder.AddDefaultHealthChecks(); - - builder.Services.AddServiceDiscovery(); - - builder.Services.ConfigureHttpClientDefaults(http => - { - // Turn on resilience by default - http.AddStandardResilienceHandler(); - - // Turn on service discovery by default - http.AddServiceDiscovery(); - }); - - return builder; - } - - public static IHostApplicationBuilder ConfigureOpenTelemetry(this IHostApplicationBuilder builder) - { - #region OpenTelemetry - - // Configure OpenTelemetry service resource details - // See https://github.com/open-telemetry/opentelemetry-specification/tree/main/specification/resource/semantic_conventions - var entryAssembly = System.Reflection.Assembly.GetEntryAssembly(); - var entryAssemblyName = entryAssembly?.GetName(); - var versionAttribute = entryAssembly?.GetCustomAttributes(false) - .OfType() - .FirstOrDefault(); - var resourceServiceName = entryAssemblyName?.Name; - var resourceServiceVersion = versionAttribute?.InformationalVersion ?? entryAssemblyName?.Version?.ToString(); - var attributes = new Dictionary - { - ["host.name"] = Environment.MachineName, - ["service.names"] = - "FSH.Starter.WebApi.Host", //builder.Configuration["OpenTelemetrySettings:ServiceName"]!, //It's a WA Fix because the service.name tag is not completed automatically by Resource.Builder()...AddService(serviceName) https://github.com/open-telemetry/opentelemetry-dotnet/issues/2027 - ["os.description"] = System.Runtime.InteropServices.RuntimeInformation.OSDescription, - ["deployment.environment"] = builder.Environment.EnvironmentName.ToLowerInvariant() - }; - var resourceBuilder = ResourceBuilder.CreateDefault() - .AddService(serviceName: resourceServiceName, serviceVersion: resourceServiceVersion) - .AddTelemetrySdk() - //.AddEnvironmentVariableDetector() - .AddAttributes(attributes); - - #endregion region - - - builder.Logging.AddOpenTelemetry(logging => - { - logging.IncludeFormattedMessage = true; - logging.IncludeScopes = true; - logging.SetResourceBuilder(resourceBuilder); - }); - - builder.Services.AddOpenTelemetry() - .WithMetrics(metrics => - { - metrics.SetResourceBuilder(resourceBuilder) - .AddAspNetCoreInstrumentation() - .AddHttpClientInstrumentation() - .AddRuntimeInstrumentation() - .AddProcessInstrumentation() - .AddMeter(MetricsConstants.Todos) - .AddMeter(MetricsConstants.Catalog); - }) - .WithTracing(tracing => - { - if (builder.Environment.IsDevelopment()) - { - tracing.SetSampler(new AlwaysOnSampler()); - } - - tracing.SetResourceBuilder(resourceBuilder) - .AddAspNetCoreInstrumentation(nci => nci.RecordException = true) - .AddHttpClientInstrumentation() - .AddEntityFrameworkCoreInstrumentation(); - }); - - builder.AddOpenTelemetryExporters(); - - return builder; - } - - private static IHostApplicationBuilder AddOpenTelemetryExporters(this IHostApplicationBuilder builder) - { - var useOtlpExporter = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]); - - if (useOtlpExporter) - { - builder.Services.AddOpenTelemetry().UseOtlpExporter(); - } - - // The following lines enable the Prometheus exporter (requires the OpenTelemetry.Exporter.Prometheus.AspNetCore package) - builder.Services.AddOpenTelemetry() - // BUG: Part of the workaround for https://github.com/open-telemetry/opentelemetry-dotnet-contrib/issues/1617 - .WithMetrics(metrics => metrics.AddPrometheusExporter(options => - { - options.DisableTotalNameSuffixForCounters = true; - })); - - return builder; - } - - public static IHostApplicationBuilder AddDefaultHealthChecks(this IHostApplicationBuilder builder) - { - builder.Services.AddHealthChecks() - // Add a default liveness check to ensure app is responsive - .AddCheck("self", () => HealthCheckResult.Healthy(), ["live"]); - - return builder; - } - - public static WebApplication MapDefaultEndpoints(this WebApplication app) - { - // The following line enables the Prometheus endpoint (requires the OpenTelemetry.Exporter.Prometheus.AspNetCore package) - app.UseOpenTelemetryPrometheusScrapingEndpoint( - context => - { - if (context.Request.Path != "/metrics") return false; - return true; - }); - - // All health checks must pass for app to be considered ready to accept traffic after starting - app.MapHealthChecks("/health").AllowAnonymous(); - // Only health checks tagged with the "live" tag must pass for app to be considered alive - app.MapHealthChecks("/alive", new HealthCheckOptions { Predicate = r => r.Tags.Contains("live") }) - .AllowAnonymous(); - - return app; - } -} diff --git a/src/aspire/service-defaults/MetricsConstants.cs b/src/aspire/service-defaults/MetricsConstants.cs deleted file mode 100644 index 57874dfe95..0000000000 --- a/src/aspire/service-defaults/MetricsConstants.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace FSH.Starter.Aspire.ServiceDefaults; -public static class MetricsConstants -{ - public const string AppName = "fullstackhero"; - public const string Todos = "Todos"; - public const string Catalog = "Catalog"; -} diff --git a/src/aspire/service-defaults/ServiceDefaults.csproj b/src/aspire/service-defaults/ServiceDefaults.csproj deleted file mode 100644 index 26553c1c7b..0000000000 --- a/src/aspire/service-defaults/ServiceDefaults.csproj +++ /dev/null @@ -1,32 +0,0 @@ - - - - FSH.Starter.Aspire.ServiceDefaults - FSH.Starter.Aspire.ServiceDefaults - net9.0 - enable - enable - true - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/global.json b/src/global.json deleted file mode 100644 index d5bf446d0c..0000000000 --- a/src/global.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "sdk": { - "version": "9.0.100", - "rollForward": "latestFeature" - } -} \ No newline at end of file diff --git a/terraform/.gitignore b/terraform/.gitignore deleted file mode 100644 index 4776104d1e..0000000000 --- a/terraform/.gitignore +++ /dev/null @@ -1,38 +0,0 @@ -# Local .terraform directories -**/.terraform/* - -# .tfstate files -*.tfstate -*.tfstate.* - -# Crash log files -crash.log -crash.*.log - -# Exclude all .tfvars files, which are likely to contain sensitive data, such as -# password, private keys, and other secrets. These should not be part of version -# control as they are data points which are potentially sensitive and subject -# to change depending on the environment. -# *.tfvars -# *.tfvars.json - -# Ignore override files as they are usually used to override resources locally and so -# are not checked in -override.tf -override.tf.json -*_override.tf -*_override.tf.json - -# Ignore transient lock info files created by terraform apply -.terraform.tfstate.lock.info - -# Include override files you do wish to add to version control using negated pattern -# !example_override.tf - -# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan -# example: *tfplan* - -# Ignore CLI configuration files -.terraformrc -terraform.rc -.terraform.lock.hcl \ No newline at end of file diff --git a/terraform/README.md b/terraform/README.md deleted file mode 100644 index 4ad56c1cb2..0000000000 --- a/terraform/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# Deploying FullStackHero .NET Starter Kit to AWS with Terraform - -## Pre-Requisites - -1. Ensure you have the latest Terraform installed on your machine. I used `Terraform v1.8.4` at the time of development. -2. You should have installed AWS CLI Tools and authenticated your machine to access AWS. - -## Bootstrapping - -If you are deploying this for the first time, navigate to `./boostrap` and run the following commands - -```terraform -terraform init -terraform plan -terraform apply --auto-approve -``` - -This will provision the required backend resources on AWS that terraform would need in the next steps. Basics this will create an Amazon S3 Bucket, and DynamoDB Table. - -## Deploy - -Navigate to `./environments/dev/` and run the following. - -``` -terraform init -terraform plan -terraform apply --auto-approve -``` - -This will deploy the following, - -- ECS Cluster and Task (.NET Web API) -- RDS PostgreSQL Database Instance -- Required Networking Components like VPC, ALB etc. - -## Destroy - -Once you are done with your testing, ensure that you delete the resources to keep your bill under control. - -```` -terraform destroy --auto-approve -``` -```` diff --git a/terraform/bootstrap/database.tf b/terraform/bootstrap/database.tf deleted file mode 100644 index 05293f37a5..0000000000 --- a/terraform/bootstrap/database.tf +++ /dev/null @@ -1,10 +0,0 @@ -resource "aws_dynamodb_table" "dynamodb-terraform-states" { - name = "fullstackhero-state-locks" - hash_key = "LockID" - read_capacity = 20 - write_capacity = 20 - attribute { - name = "LockID" - type = "S" - } -} diff --git a/terraform/bootstrap/storage.tf b/terraform/bootstrap/storage.tf deleted file mode 100644 index a732bd2645..0000000000 --- a/terraform/bootstrap/storage.tf +++ /dev/null @@ -1,10 +0,0 @@ -resource "aws_s3_bucket" "s3_bucket" { - bucket = "fullstackhero-terraform-backend" - tags = { - Name = "fullstackhero-terraform-backend" - Project = "fullstackhero" - } - lifecycle { - prevent_destroy = true - } -} diff --git a/terraform/environments/dev/compute.tf b/terraform/environments/dev/compute.tf deleted file mode 100644 index 41201d2fea..0000000000 --- a/terraform/environments/dev/compute.tf +++ /dev/null @@ -1,45 +0,0 @@ -module "cluster" { - source = "../../modules/ecs/cluster" - cluster_name = "fullstackhero" -} - -module "webapi" { - source = "../../modules/ecs" - vpc_id = module.vpc.vpc_id - environment = var.environment - cluster_id = module.cluster.id - service_name = "webapi" - container_name = "fsh-webapi" - container_image = "ghcr.io/fullstackhero/webapi:latest" - subnet_ids = [module.vpc.private_a_id, module.vpc.private_b_id] - environment_variables = { - DatabaseOptions__ConnectionString = module.rds.connection_string - DatabaseOptions__Provider = "postgresql" - Serilog__MinimumLevel__Default = "Error" - CorsOptions__AllowedOrigins__0 = "http://${module.blazor.endpoint}" - OriginOptions__OriginUrl = "http://${module.webapi.endpoint}:8080" - } -} - -module "blazor" { - source = "../../modules/ecs" - vpc_id = module.vpc.vpc_id - cluster_id = module.cluster.id - environment = var.environment - container_port = 80 - service_name = "blazor" - container_name = "fsh-blazor" - container_image = "ghcr.io/fullstackhero/blazor:latest" - subnet_ids = [module.vpc.private_a_id, module.vpc.private_b_id] - environment_variables = { - Frontend_FSHStarterBlazorClient_Settings__AppSettingsTemplate = "/usr/share/nginx/html/appsettings.json.TEMPLATE" - Frontend_FSHStarterBlazorClient_Settings__AppSettingsJson = "/usr/share/nginx/html/appsettings.json" - FSHStarterBlazorClient_ApiBaseUrl = "http://${module.webapi.endpoint}:8080" - ApiBaseUrl = "http://${module.webapi.endpoint}:8080" - } - entry_point = [ - "/bin/sh", - "-c", - "envsubst < $${Frontend_FSHStarterBlazorClient_Settings__AppSettingsTemplate} > $${Frontend_FSHStarterBlazorClient_Settings__AppSettingsJson} || echo 'envsubst failed' && find /usr/share/nginx/html -type f | xargs chmod +r || echo 'chmod failed' && echo 'Entry point execution completed' && cat /usr/share/nginx/html/appsettings.json && exec nginx -g 'daemon off;'" - ] -} diff --git a/terraform/environments/dev/database.tf b/terraform/environments/dev/database.tf deleted file mode 100644 index 3547680027..0000000000 --- a/terraform/environments/dev/database.tf +++ /dev/null @@ -1,9 +0,0 @@ -module "rds" { - environment = var.environment - source = "../../modules/rds" - vpc_id = module.vpc.vpc_id - subnet_ids = [module.vpc.private_a_id, module.vpc.private_b_id] - multi_az = false - database_name = "fsh" - cidr_block = module.vpc.cidr_block -} diff --git a/terraform/environments/dev/main.tf b/terraform/environments/dev/main.tf deleted file mode 100644 index e789efddf1..0000000000 --- a/terraform/environments/dev/main.tf +++ /dev/null @@ -1,8 +0,0 @@ -terraform { - backend "s3" { - bucket = "fullstackhero-terraform-backend" - key = "fullstackhero/dev/terraform.tfstate" - region = "us-east-1" - dynamodb_table = "fullstackhero-state-locks" - } -} diff --git a/terraform/environments/dev/network.tf b/terraform/environments/dev/network.tf deleted file mode 100644 index 55e55df792..0000000000 --- a/terraform/environments/dev/network.tf +++ /dev/null @@ -1,3 +0,0 @@ -module "vpc" { - source = "../../modules/vpc" -} diff --git a/terraform/environments/dev/outputs.tf b/terraform/environments/dev/outputs.tf deleted file mode 100644 index 3a04c8c615..0000000000 --- a/terraform/environments/dev/outputs.tf +++ /dev/null @@ -1,7 +0,0 @@ -output "webapi" { - value = "http://${module.webapi.endpoint}:8080" -} - -output "blazor" { - value = "http://${module.blazor.endpoint}" -} diff --git a/terraform/environments/dev/providers.tf b/terraform/environments/dev/providers.tf deleted file mode 100644 index 8e8b661f74..0000000000 --- a/terraform/environments/dev/providers.tf +++ /dev/null @@ -1,16 +0,0 @@ -terraform { - required_version = "~> 1.8" - required_providers { - aws = { - source = "hashicorp/aws" - version = "~> 5.0" - } - } -} - -provider "aws" { - region = var.aws_region - default_tags { - tags = merge(local.common_tags) - } -} diff --git a/terraform/environments/dev/terraform.tfvars b/terraform/environments/dev/terraform.tfvars deleted file mode 100644 index 7ac85169db..0000000000 --- a/terraform/environments/dev/terraform.tfvars +++ /dev/null @@ -1,5 +0,0 @@ -// Default Project Tags -environment = "dev" -owner = "Mukesh Murugan" -project_name = "fullstackhero" -repository = "https://github.com/fullstackhero/dotnet-starter-kit" diff --git a/terraform/environments/dev/variables.tf b/terraform/environments/dev/variables.tf deleted file mode 100644 index 87662c7ee0..0000000000 --- a/terraform/environments/dev/variables.tf +++ /dev/null @@ -1,31 +0,0 @@ -variable "aws_region" { - description = "The AWS region to deploy resources in" - type = string - default = "us-east-1" -} - -variable "environment" { - type = string - default = "dev" -} -variable "owner" { - type = string -} - -variable "project_name" { - type = string -} - -variable "repository" { - type = string -} - - -locals { - common_tags = { - Environment = var.environment - Owner = var.owner - Project = var.project_name - Repository = var.repository - } -} diff --git a/terraform/modules/cloudwatch/main.tf b/terraform/modules/cloudwatch/main.tf deleted file mode 100644 index 3d571382ed..0000000000 --- a/terraform/modules/cloudwatch/main.tf +++ /dev/null @@ -1,4 +0,0 @@ -resource "aws_cloudwatch_log_group" "this" { - name = var.log_group_name - retention_in_days = var.retention_period -} diff --git a/terraform/modules/cloudwatch/variables.tf b/terraform/modules/cloudwatch/variables.tf deleted file mode 100644 index e2eac862f0..0000000000 --- a/terraform/modules/cloudwatch/variables.tf +++ /dev/null @@ -1,8 +0,0 @@ -variable "log_group_name" { - type = string -} - -variable "retention_period" { - type = number - default = 60 -} diff --git a/terraform/modules/ecs/cluster/main.tf b/terraform/modules/ecs/cluster/main.tf deleted file mode 100644 index 236f30bd34..0000000000 --- a/terraform/modules/ecs/cluster/main.tf +++ /dev/null @@ -1,13 +0,0 @@ -resource "aws_ecs_cluster" "this" { - name = var.cluster_name -} - -resource "aws_ecs_cluster_capacity_providers" "this" { - cluster_name = aws_ecs_cluster.this.name - capacity_providers = ["FARGATE"] - default_capacity_provider_strategy { - base = 1 - weight = 100 - capacity_provider = "FARGATE" - } -} diff --git a/terraform/modules/ecs/cluster/outputs.tf b/terraform/modules/ecs/cluster/outputs.tf deleted file mode 100644 index af88b19431..0000000000 --- a/terraform/modules/ecs/cluster/outputs.tf +++ /dev/null @@ -1,3 +0,0 @@ -output "id" { - value = aws_ecs_cluster.this.id -} diff --git a/terraform/modules/ecs/cluster/variables.tf b/terraform/modules/ecs/cluster/variables.tf deleted file mode 100644 index abbf86f798..0000000000 --- a/terraform/modules/ecs/cluster/variables.tf +++ /dev/null @@ -1,3 +0,0 @@ -variable "cluster_name" { - type = string -} diff --git a/terraform/modules/ecs/iam.tf b/terraform/modules/ecs/iam.tf deleted file mode 100644 index 0533ec0115..0000000000 --- a/terraform/modules/ecs/iam.tf +++ /dev/null @@ -1,41 +0,0 @@ -resource "aws_iam_role" "ecs_task_execution_role" { - name = "${var.service_name}-ecs-ter" - assume_role_policy = < Date: Sat, 6 Sep 2025 17:51:45 +0530 Subject: [PATCH 2/4] add mediator --- src/Core/Core.csproj | 1 - src/Core/Runtime/ICurrentUser.cs | 19 +++++++ src/Core/Runtime/ICurrentUserInitializer.cs | 9 +++ src/Directory.Packages.props | 3 + src/Infrastructure/Infrastructure.csproj | 9 ++- src/Infrastructure/Mediator/Extensions.cs | 31 ++++++++++ src/Infrastructure/Mediator/IMediator.cs | 7 +++ src/Infrastructure/Mediator/IRequest.cs | 9 +++ .../Mediator/IRequestHandler.cs | 10 ++++ src/Infrastructure/Mediator/Mediator.cs | 56 +++++++++++++++++++ .../Mediator/Validation/RequestValidation.cs | 25 +++++++++ .../Mediator/Validation/ValidationHelper.cs | 38 +++++++++++++ src/Web/Web.csproj | 1 + 13 files changed, 216 insertions(+), 2 deletions(-) create mode 100644 src/Core/Runtime/ICurrentUser.cs create mode 100644 src/Core/Runtime/ICurrentUserInitializer.cs create mode 100644 src/Infrastructure/Mediator/Extensions.cs create mode 100644 src/Infrastructure/Mediator/IMediator.cs create mode 100644 src/Infrastructure/Mediator/IRequest.cs create mode 100644 src/Infrastructure/Mediator/IRequestHandler.cs create mode 100644 src/Infrastructure/Mediator/Mediator.cs create mode 100644 src/Infrastructure/Mediator/Validation/RequestValidation.cs create mode 100644 src/Infrastructure/Mediator/Validation/ValidationHelper.cs diff --git a/src/Core/Core.csproj b/src/Core/Core.csproj index a1c3aa3eca..43569d6522 100644 --- a/src/Core/Core.csproj +++ b/src/Core/Core.csproj @@ -7,7 +7,6 @@ - \ No newline at end of file diff --git a/src/Core/Runtime/ICurrentUser.cs b/src/Core/Runtime/ICurrentUser.cs new file mode 100644 index 0000000000..363df8f40d --- /dev/null +++ b/src/Core/Runtime/ICurrentUser.cs @@ -0,0 +1,19 @@ +using System.Security.Claims; + +namespace FSH.Framework.Core.ExecutionContext; +public interface ICurrentUser +{ + string? Name { get; } + + Guid GetUserId(); + + string? GetUserEmail(); + + string? GetTenant(); + + bool IsAuthenticated(); + + bool IsInRole(string role); + + IEnumerable? GetUserClaims(); +} \ No newline at end of file diff --git a/src/Core/Runtime/ICurrentUserInitializer.cs b/src/Core/Runtime/ICurrentUserInitializer.cs new file mode 100644 index 0000000000..93bf622e69 --- /dev/null +++ b/src/Core/Runtime/ICurrentUserInitializer.cs @@ -0,0 +1,9 @@ +using System.Security.Claims; + +namespace FSH.Framework.Core.ExecutionContext; +public interface ICurrentUserInitializer +{ + void SetCurrentUser(ClaimsPrincipal user); + + void SetCurrentUserId(string userId); +} \ No newline at end of file diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index a198ef0684..a8c1427e00 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -9,6 +9,9 @@ true + + + diff --git a/src/Infrastructure/Infrastructure.csproj b/src/Infrastructure/Infrastructure.csproj index f8a26110cf..3da9a12c1b 100644 --- a/src/Infrastructure/Infrastructure.csproj +++ b/src/Infrastructure/Infrastructure.csproj @@ -7,8 +7,15 @@ - + + + + + + + + diff --git a/src/Infrastructure/Mediator/Extensions.cs b/src/Infrastructure/Mediator/Extensions.cs new file mode 100644 index 0000000000..65bb8343eb --- /dev/null +++ b/src/Infrastructure/Mediator/Extensions.cs @@ -0,0 +1,31 @@ +using FSH.Framework.Infrastructure.Mediator.Validation; +using Microsoft.Extensions.DependencyInjection; +using System.Reflection; + +namespace FSH.Framework.Infrastructure.Mediator; +public static class Extensions +{ + public static IServiceCollection AddMediator(this IServiceCollection services, params Assembly[] assemblies) + { + ArgumentNullException.ThrowIfNull(services); + + services.AddScoped(); + RegisterHandlers(services, assemblies); + services.Decorate(); + + return services; + } + + internal static void RegisterHandlers(IServiceCollection services, Assembly[] assemblies) + { + // Deduplicate Assemblies + var distinctAssemblies = assemblies.Distinct().ToArray(); + + // Scan for handlers in provided assemblies + services.Scan(scan => scan + .FromAssemblies(distinctAssemblies) + .AddClasses(c => c.AssignableTo(typeof(IRequestHandler<,>))) + .AsImplementedInterfaces() + .WithScopedLifetime()); + } +} \ No newline at end of file diff --git a/src/Infrastructure/Mediator/IMediator.cs b/src/Infrastructure/Mediator/IMediator.cs new file mode 100644 index 0000000000..83c05fd8f8 --- /dev/null +++ b/src/Infrastructure/Mediator/IMediator.cs @@ -0,0 +1,7 @@ +namespace FSH.Framework.Infrastructure.Mediator; + +public interface IMediator +{ + Task SendAsync(IRequest request, CancellationToken cancellationToken = default); + Task SendAsync(IRequest request, CancellationToken cancellationToken = default); +} diff --git a/src/Infrastructure/Mediator/IRequest.cs b/src/Infrastructure/Mediator/IRequest.cs new file mode 100644 index 0000000000..54dc1106a8 --- /dev/null +++ b/src/Infrastructure/Mediator/IRequest.cs @@ -0,0 +1,9 @@ +namespace FSH.Framework.Infrastructure.Mediator; + +public interface IRequest +{ +} + +public interface IRequest +{ +} \ No newline at end of file diff --git a/src/Infrastructure/Mediator/IRequestHandler.cs b/src/Infrastructure/Mediator/IRequestHandler.cs new file mode 100644 index 0000000000..d77c56e5f2 --- /dev/null +++ b/src/Infrastructure/Mediator/IRequestHandler.cs @@ -0,0 +1,10 @@ +namespace FSH.Framework.Infrastructure.Mediator; +public interface IRequestHandler where TRequest : IRequest +{ + Task HandleAsync(TRequest request, CancellationToken cancellationToken); +} + +public interface IRequestHandler where TRequest : IRequest +{ + Task HandleAsync(TRequest request, CancellationToken cancellationToken); +} \ No newline at end of file diff --git a/src/Infrastructure/Mediator/Mediator.cs b/src/Infrastructure/Mediator/Mediator.cs new file mode 100644 index 0000000000..fc3b7679e1 --- /dev/null +++ b/src/Infrastructure/Mediator/Mediator.cs @@ -0,0 +1,56 @@ +namespace FSH.Framework.Infrastructure.Mediator; + +public class Mediator : IMediator +{ + private readonly IServiceProvider _serviceProvider; + + public Mediator(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + public async Task SendAsync(IRequest request, CancellationToken cancellationToken = default) + { + var requestType = request.GetType(); + var responseType = typeof(TResponse); + var handlerType = typeof(IRequestHandler<,>).MakeGenericType(requestType, responseType); + + var handler = _serviceProvider.GetService(handlerType); + if (handler == null) + { + throw new InvalidOperationException($"No handler registered for {requestType.Name}"); + } + + var method = handlerType.GetMethod(nameof(IRequestHandler, TResponse>.HandleAsync)); + if (method == null) + { + throw new InvalidOperationException($"HandleAsync method not found on {handlerType.Name}"); + } + + var result = await (Task)method.Invoke(handler, new object[] { request, cancellationToken })!; + return result; + } + + public async Task SendAsync(IRequest request, CancellationToken cancellationToken = default) + { + var requestType = request.GetType(); + var handlerType = typeof(IRequestHandler<>).MakeGenericType(requestType); + + var handler = _serviceProvider.GetService(handlerType); + if (handler == null) + { + throw new InvalidOperationException($"No handler registered for {requestType.Name}"); + } + + var method = handlerType.GetMethod(nameof(IRequestHandler.HandleAsync)); + if (method == null) + { + throw new InvalidOperationException($"HandleAsync method not found on {handlerType.Name}"); + } + + await (Task)method.Invoke(handler, new object[] { request, cancellationToken })!; + } +} + + + diff --git a/src/Infrastructure/Mediator/Validation/RequestValidation.cs b/src/Infrastructure/Mediator/Validation/RequestValidation.cs new file mode 100644 index 0000000000..1977730505 --- /dev/null +++ b/src/Infrastructure/Mediator/Validation/RequestValidation.cs @@ -0,0 +1,25 @@ +namespace FSH.Framework.Infrastructure.Mediator.Validation; + +internal sealed class RequestValidation : IMediator +{ + private readonly IMediator _inner; + private readonly IServiceProvider _serviceProvider; + + public RequestValidation(IMediator inner, IServiceProvider serviceProvider) + { + _inner = inner; + _serviceProvider = serviceProvider; + } + + public async Task SendAsync(IRequest request, CancellationToken cancellationToken = default) + { + await ValidationHelper.ValidateAsync(request, _serviceProvider, cancellationToken); + return await _inner.SendAsync(request, cancellationToken); + } + + public async Task SendAsync(IRequest request, CancellationToken cancellationToken = default) + { + await ValidationHelper.ValidateAsync(request, _serviceProvider, cancellationToken); + await _inner.SendAsync(request, cancellationToken); + } +} \ No newline at end of file diff --git a/src/Infrastructure/Mediator/Validation/ValidationHelper.cs b/src/Infrastructure/Mediator/Validation/ValidationHelper.cs new file mode 100644 index 0000000000..2b89c89f54 --- /dev/null +++ b/src/Infrastructure/Mediator/Validation/ValidationHelper.cs @@ -0,0 +1,38 @@ +using FluentValidation; +using Microsoft.Extensions.DependencyInjection; + +namespace FSH.Framework.Infrastructure.Mediator.Validation; +internal static class ValidationHelper +{ + public static async Task ValidateAsync(T request, IServiceProvider provider, CancellationToken ct = default) + { + ArgumentNullException.ThrowIfNull(request); + ArgumentNullException.ThrowIfNull(provider); + + var requestType = request.GetType(); + var validatorType = typeof(IValidator<>).MakeGenericType(requestType); + var validators = provider.GetServices(validatorType).Cast().ToList(); + + if (validators.Count == 0) return; + + var contextType = typeof(ValidationContext<>).MakeGenericType(requestType); + var context = Activator.CreateInstance(contextType, request)!; + + var failures = new List(); + + foreach (var validator in validators) + { + var validateAsyncMethod = validator.GetType() + .GetMethod("ValidateAsync", new[] { contextType, typeof(CancellationToken) })!; + + var task = (Task) + validateAsyncMethod.Invoke(validator, new[] { context, ct })!; + + var result = await task; + failures.AddRange(result.Errors.Where(f => f != null)); + } + + if (failures.Count > 0) + throw new ValidationException(failures); + } +} \ No newline at end of file diff --git a/src/Web/Web.csproj b/src/Web/Web.csproj index 179d905b45..cb47d1d60e 100644 --- a/src/Web/Web.csproj +++ b/src/Web/Web.csproj @@ -7,6 +7,7 @@ + From 5a32da237f96f2adedf81fba58f10c5076343162 Mon Sep 17 00:00:00 2001 From: Mukesh Murugan Date: Sat, 6 Sep 2025 18:02:59 +0530 Subject: [PATCH 3/4] upgraded to .net 10 --- global.json | 6 ++++++ src/Directory.Build.props | 2 +- src/Directory.Packages.props | 6 +++--- src/Infrastructure/Mediator/Validation/RequestValidation.cs | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 global.json diff --git a/global.json b/global.json new file mode 100644 index 0000000000..4b378a34be --- /dev/null +++ b/global.json @@ -0,0 +1,6 @@ +{ + "sdk": { + "version": "10.0.100-preview.7", + "rollForward": "latestFeature" + } +} \ No newline at end of file diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 88ecb41494..33780ee01b 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - net9.0 + net10.0 latest diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index a8c1427e00..a9a9673d40 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -10,12 +10,12 @@ - + - + - + \ No newline at end of file diff --git a/src/Infrastructure/Mediator/Validation/RequestValidation.cs b/src/Infrastructure/Mediator/Validation/RequestValidation.cs index 1977730505..f1be86e0bc 100644 --- a/src/Infrastructure/Mediator/Validation/RequestValidation.cs +++ b/src/Infrastructure/Mediator/Validation/RequestValidation.cs @@ -1,6 +1,6 @@ namespace FSH.Framework.Infrastructure.Mediator.Validation; -internal sealed class RequestValidation : IMediator +public sealed class RequestValidation : IMediator { private readonly IMediator _inner; private readonly IServiceProvider _serviceProvider; From 08b981b2c9b6c24225aeb3dc0cd649f47d43cb6e Mon Sep 17 00:00:00 2001 From: Mukesh Murugan Date: Sat, 6 Sep 2025 18:29:25 +0530 Subject: [PATCH 4/4] clenaup --- src/Data/Data.csproj | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 src/Data/Data.csproj diff --git a/src/Data/Data.csproj b/src/Data/Data.csproj deleted file mode 100644 index 7819fc3a63..0000000000 --- a/src/Data/Data.csproj +++ /dev/null @@ -1,6 +0,0 @@ - - - FSH.Framework.Data - FSH.Framework.Data - -

d`_A6ERe4c)5GjFhI5cnW^j*HifqrGdfIO@D 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

FvehY*=ZID13atu?L1TL-L;{eI)nYFE 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 z zfOPex=F>;s&J?z-?(gJKH^1sq#VT20Uao+EaZ6@T)bZ6D3J0;aOC^KWyNnm@9Sq*; z=iXoa?qA-1IQPwW0VIOiLfl=Q7Shsi?j?{3p_)vC)uP^7_|d~Dpc$;ZsK!aTPR-*j zY(3uC+0j@|Bd9Oyyz`lL9w4boD06r2;oU7s5G!SnNabOGk~AcR0IYywrPaGu`4mP8 z0tW!(g;Xp|F9-vPOy~s-rw79#N*D|X0BnJH7wG5{EkR%;I}s;YZ}i|rV4mKEK^4hf z0Tz-Z-httA8wfxbE^qJsbo)(=-x&>ZUVKvwUB zl}mHfY_jsZOpWQTGw;s%$fv!qqL1$tJ2Hu^?H2=*Q~9tG1ntVuc4>JsN})(_D{t*Wv}<3GMVj0s%91Jt9BO8_g9Q;onXIQWZ?|%L1XfNd zCZagj1I$pkt0afkkR7`OFP)w1jgbNb#1+v;ty{zw>7DE)hKjkC%yy62jta4O80N@Whihf4w^AGfb#%0cmZIQ)vB~s;#~`~Svh)d@6O8g*L%O)&nLHArgQQNKoU!8 zLqgJn`JBG&qM2?y zXRcU47{SeEY?v(4dN}SJ-xNZU<$U)74ia^DsAbiVDK_gu6YQz-cjtRSKl+vpkK7K7 zYe)s3(nYWTT~xcDg^@0QzxkJ9d-1Guvp7G$uihPW$aXrpHB;GoJ0;B}lCS}TY|>Sl zmh1C;Ccc=~f%fs8i}?IUcjL*Y<71k8_v2QlZhrFr`rrPQ{pYj)&Ht;XmAAepUHH%N zU*FX?>d&)Z`%bMA89g%a0I=XBKn9`{z!TygaQays>-2t!Kj=R$?%lEr4=}L+S{J0< z{DL>E2tT03AQA;~x{Qr=x%D@A!6M@1I=)n~v&Fk#kF|mkkeQCF)6S5Sj&ft5GRX`%ok?g3vM>o64zoo<3vx#- z-}dmMVf9K~PY1t(XbG!*ui4RCi%K$cqams?ixCB+fWWGy#xy`g5kFYU%c&@cFIj?f{NhzJ# z*yQFkI}rG!yM`APz(&2_@W_yHwBqlOrd=Z}YTB>)F|fd#DU|AxAkp+mlAsL;UhoYk zCx{F^A{kh;BpAnF0wwPBYHnM&uEtVH3upGdFf>^Vsda7d0APop<*zXnq!5T@;V!PI%aIUVIy8CL4;=H2*k#l>^UVB-kwJA%# zdosPg?(V$`U}yuN!hTsw(n4KR;DJE_+Z&KFDC3P5)KDI^qP|~l7`P1FO;|vI;THKx z7#u*u>cs(52LSd{FEcDHpeZ@973j^ER0?~uyCjtxfu*3hwoou+5vhFa?2EM)F-^X! z{<619@3z19yRUs8-d4ZL^pIRDrAZs@39U<+4PYb;tO_%a=dKANGFAySK$Sx9R4D#VR#0TxQW?d72;>|tH)Ji)6gHt+Z{1`|V_VO0=#wF`fB}*hLD@BE@Q?I!8nV1T)psZVwHzt7= zll+(pyO(!AcBbD-jwLyEJ1Lxb8$k7}Tf6X3-Hg|4)k>vI3RRM^O_ng!Y5+ckpo^B; zBFC`SwNF5HRzVS9QZ^$SDPGi0rj-L*jr0!BdQj6_-@6s>xI-;FV3|;6^jXIOxKXyM zq6Di{s34+46%v(Ytx)tnQbjdo^Ufm z`LY34f+$!huGxUr(t2}A=l}WlzHiy-@XD@nkt7l`3IMXf3fEjfX1--*3n0sw0f8X1 zE!XpxeWUOH^I!k}`&aRIu?}{+dZ^>9+wW?6D6G4r-R^E!MF%_(&*4^K%slD@SlW1H zqNGyYeWOz{!R}#8se_f)&^lF1wp;>0np6 z_ur^@`5SJtcP=dJY1zw6!U}+6S8=Z1B~H3I4(a}#SHg>fysQGc3bSZw;0bf~b*7*D zmUH`cUwHB1*SG)k-Cz9Q{eR4Nyb_vbt?1!Z-o4coebf84pR9rouq7q}0Rcedlv<6D zM7udzPjn-$KgTO}^I~b{00#&_hX&Isv%-V5;2hpb5-_NYsji?=B_vSmFbv}wiz=<* zy#o4eX$HPt0>p8njF*MLn36j4o^QqqS8=|bb3UHa(c41AR{i;H2hR&e&w_-sW)^z3+_^~2G#m4bl4T%wOe)wTMl5NDnZw#XE3NjcF6OCsl@pCmVvMkQ+Tlzk<0pKhk-ko? zGx@TvT5B3Js%B`}Tjin2W(MXya7am>QcyP@whfm9^bXsxR+BY8HZ$XH1 zJ4}+3)4~Aq78=O~@)fBl`+!D+fnG8(Sy5mViM1DJQp($GR{HIgRIOwQQ<$W!%3fiH zwI#3;YiT9n%!Kw9w(Av*>n9;=-p~rhyXKIBAW;+WvXTWRmCBn^acb|If9p0+>mN$r zKYf~K%`3J?b=3|QKE2C8Xu06zn@VzW1*GA}G?Z2{k1|Q15M&O)k=_eHtHqkn!K+e0 zmA7=^TyHlcFxmOp+qlPM>;1kr2|-%yNbwjjC{Wd67U0HK1-!{M#uQ-UVt!3{jLVqJ z?FWp3f-GzSXxi10+Aw%z2$qd8t2Ap?x58#UtyVWPvmmIdaLJoUi-x`70T6>QwynSp z?5zPnAZdde!(^$f(a}HN`)R+kHecW0pTGND6VJVS&IVaE))Xh^&Ln7hf!VWaMzY{~ z9GH=DVd~!WV*~wm8`IvI`j*}lO94ift1;^wM-hg1Iz&b9tTrsluf6rd*f_2hu$A@N zLb6v`_GGOKp*7oSD(=@{Guwt>+otZG3$srzIpDbI8ha2B;Rsasm0+Py-VB}VYt`dvXskhinGr&axB>tOd4rs7jT#iQdwz`^OqH{q3mrIz4waC~38^(h?Td zdtQqVz(rML-)eVgZB^zboN`+N?R{6+xsp@A6YFp5L8NNK>1T%BLvYyXzW?=n^?IJL zN6NfyUniA{PLkM4PRG-oEmrQWMsScz^h57=ycWlPpR*5gq?<7+XJbF_eJShc<}~kJ z&e!#Nzct^peLwr(@8)>Ly*tbKBsb-^_fFY{XKuiSfKSiba~F9;Ce~?cO45`B^^j{v zFQ(6PK66H9S$DGYEKRrFHkDe&mk)nFfAajY1fRZr_OJZ!{;!+wmpOc!ofvwpcl3Fh ztXJ>-{Jn>KA5-rg%ooL7$Q(jIU`h}cV`_BO?ew;53H@!n=5E~bddUsP76%{}5TBMP z5CxGS6A6=ewpMf?b4Q8BFiA$Yr9}j}0M!#$xzEJDIBxX}5yb_@Yh9orlP_a=wW5PY zrQ%u(d3#o_e$rjv>Zu>?tu$>1Bkb(f3CCG7ILj#wnQuX`wNr%M#tFfe7JMt&+1fC@ zuNDc{HkRF*aQV1*ynEoTtsJamZJS+e{X#<}xJRKJF)!16!qt@cdueIjp4KxsS@SX$ zuMJdypsSa>lL+BwUvScm3mY2Q6~YPM8DF^wMyy zzPD+1<(l>^pfS|Cyt}9^h`FpTbL)1`R-9J*(7pEHGs}6K%r+lY*iw?&Ugr*uMjV%_l2{*?f&}tYJb0Xv$QOO^BVSSw|y&s zqOfH1BnsPMrUGEK&=XAAYc>GP@yV_)-ah?ZR(@weda~=gb)%1kuN4YwcYek_yJr^% zptaZDmo-yT?y(M6YWm!3vT?OXhAq4!$qgwIe@N@fFj~QVC!KtasmsghU>(;lR zjMb{hikc=%%dnoAh4>BtRu-_ZVWnq{YA-$BxEj4E`7rNn83txm1#h}6fWf3!9>^}K(GQMbpW?q$rz(w1f$4g&~=>+$Y5+p1oMW*qIsrL zXW>ODgdl=D)J`m<=w{&}Ebv7%j1EQ$ z2)mUPpo9P%b%FzDMW=J7*7K3GnqCl?XaRndXXkY~EC86fF_C3eR z?VY;5u5{0#BcV>x+-ek}CDbTKcoc~OkO;V`Cxu2esnQ{5Muy1?jnJy&;rA3j1=qIrJKsvxBLF`&pBmoH=V0H&ryg5+yMgJf@%Dl%48f3 z0M{VP1~^Xm)->v_-K~C|)_T{zuG$eTF-_JjYuE18>sxldcVGXJKCDZ<$?opZYR`q;M_JqB2c$?*TqFux7 zarT(v^YfK|2e~;ye4O=_j64JEQaWbad#9vXlx7K;_2h}Pi^gjmI+bI+JRe_pk^BUy zypoJ~(GfeFwf+8AfAVL({W)8@b1uB^*TwtCP^ZFId+mM89CMGap1Y^l+d99&_k>$m zWyvMQ#0UZ?OguYjqf5S)2K39j=j|`>ufL>c?#4AV-o#-52V|?`ZZ@e}Ml>=+kll)@ zC9~OwObZH=NwziBB{;ZfJXt(UjBum1Od?D|1VTux-37`ZbXV#PXUp8(6^HBTu--x~ z*HeinoLUxb&(T<`>V-vQZEwLCiM(7k3zOVloa{OFYRAMyuKHnuN>sYdU(d2FckSWJ zdeN5lq2a^2v&HB=-0{_uw@QXG=p#7sEH|o0rENWX9)cr2z(B$Yjy%oiEMZH+3$Nd} z_gL}{5?Wi^VVWWB9+S>o&7s+C&&_<`K&kG=gaeTmXta{9oScQqC#B5s-ql!PxT)Pa zS&}2SPRngFskoEQB99LJVV_q?b83^W$l)F{Yj&m8!0Mt)Yb|Ns?rk@Kk)R>S)e7cx zdb{i1d$2IQS99p_Ew8*F1>$WoW=ofM?ZG7Eg6x9842WD%NDjc{lbaD8=VXhsY6BE< zH(#%1m$puTgkTic>UDB%z1K2BnIJ@;)nzh_Ldd7m&B~a7y^kSN)+z9?mp6Em83JPA z5Ar%QbAG3LdmEdCpLyz+`8(%x?dn09j5lxQ24D|{kO(tMg|WS0_QKXo z18%$0Wf!ch^GI&TDD`bV=T)6W%XcyCu3My9SuWnW_awHuyLt%{FeL&8FgP4q_$g0JERGs^>R5j1obsA~s-~VSoU(dSfPJn*kV`v1Y*Sah1cSU7&$0 zhdbQi4mK3|%^KXZ(-u(n^qNkX7Y-%^4Kh#za=B~Oo4mFEQ}3_sv~TB6>P!2^c7ybd z0VYUE+_p*s3c2OX*?*u6&0H7)4 zXrQnb(7DL^Jch>(nca>cy)9=!Mr4sC%V;sBv9qGvr7)w~Np{?*g%`2AOP0&MOZ7;< zg7S4scC`6m#vw0cOTpCLnuen5pW%v%6LmrV3in25${S)<)wf`yablAcV#Uh$Z=CCr4!{P zSWN*HCWl3AY(9YAS>z3P6NWo@6HI_S515TwXthG)VGCL<$tWzZb$Gq^>*qI|@9TA4 zla!Bm(~i4BAvL5aG`HpqX_Ym?)W(Pl37|bSr?;%KjXR=NiQ1GdA((b|SABV851^gd z#=qVS?B{Y1U{1Uay01=dcdo{DP_H{D+3)7w*dRBWN*bhRJ|k1-M`-R9zn9!O@8Pzl zy&Sn0?@G4tqt*zxC?~w)-@@;4S%TKON8e3;&0DyZbJ%;0e}uS(t2HMCP+Q?}oIf8W z9uMOkA1p`QF+2x{Lwbd-p+iz3@BYkxlUwp$;Odof7k&7idBOv~)h)H=#%I>RJ-Z4f z{=I#g`;Gg4^Y5?s_7zC6#1IBw0UJP^?5a`msmb@OKVpCIz31Gz4WPrS8V^VWrpF*- zRjaG3jRTV?Nz`sHlWgOC;!t;6$f59CVVD&y4{oi&qw20^|Wh;3dZUAXOmcOWIcRk61OA~ix`j`#LVX|tB20?|^ z=6X=q^5J!v9+Iv1vGGX@BwEg`NW_WUjjE*>eS=j71w++iY<_NF;wPC391`A)0y+;c z0HvknFp8DEJ|9?p0-3I}B*CVM!lS|T;tl}&9zUQ#D3;h(sM+{}Oqn{ta&K$TtsUF9 z&zl>1(u&u~Q~B~@t>V>6J4(Y&K2_Q6axBr^Yt~TGwQjn~*|B`}>UvU}o`q)b8r)fi zyAVuu1GB@}B)U-EM$s_4*c)Ej7rb_lqRc(<-OR5bXbBvRTM-oK(i1kD1ct8-NE5kK zE_E@w>a^DTTYLyVfNwTwQZ7X0)Q3(%YueA;4F9B+%y7i&;?NLcy$CW0i=K*q^1>s z1!#9hl4T_w1Or+tfC=(LQ3tD5DF6V_*_KxdM3yFavn$;Nf#e=AOM&quYnA}eR}0(P z?Y#f>(eHn{|NOpR`9=5Dcg-xwcU4g>vuk>5R7wkD>>Z1>1uMu72f$2Y0lKlZ*5C&% zVCevm!c(kJj^9lOTUfap@9C~v8L+Ym%ae;Y-Y`UE?GBO$mUn9!W~B@Jbv1_Ad0Q9F z+I&vE^C}m&C4^PF(y(&dy}-&Me*wfrDmlB3ux`u)k-9ZI{J)_1v-Yh$_ zWdK;1FC2@rXRDqE^_T?U+h;OCHZcnThm>I`1>u+y)w)EjbZCps0txrK)1v?*sK`mV z+F6nDp3)dA?p*W;2jE(-U#;;xWDA>h-EP+n3Y=T-t*bnGo_^TRF)Y$AnB!Pc(!8af z*Lymacb1T;AK^uhz$$)CI4K~|;{g|5R(9Oo`4un2QSCglb?&GZg%F)!l$P>(=O)MM zvrfCU_Vrnb7*geWSFmVdt0=TWs3kz+3@d*s6GFpwiqdG{o{{E5`6jz?=A4xtO?`d&d~2UxX_nU6 z<8%kCkd*tmpQ~Iq&)>PUW;lB7FxI`gJ8~^+-uc@tcZ`dFw|GcsLs;|2LzUE;x5SyX z+`{j)pL`3p{2e?8$-K68`<*VsM&MUW{ zc)8bi%$ZDo{cg_}=UwJrUB~q4w8*&K|DJe4bJ;U*Qzv&l&D5=rNL=l`;=OwB?Dzet zz6ZAOTwn$%hP?)pt;VaobK3=zE;_wjzs+yiJL@%KM3Nn9p%_gZ=yw!g!PCg%X-az9 z0#SE1ZgSE+rWw7%g@s%KL{U`BWg8NQAF9G}N5d#DJGwLuAzsNW6}j;pM@wCKy^yQx zxUC+S>rQBM%u;9?v2?Oz?;STJr(1U%D?Z6y&89Tn#k`U(X>a=ZZuZ!#owfB`4?Uc< zhFuOt;tOPwoEV;iW2vztH-`Xpl7VvTH{*~!N?U^yDby_#s-&nx&W$qkm~O>zYs@2H z7j0WsGT#!|*n3Ck9g4(=^RTKY=)vU*E$ZkEQ?vGaQ6RO-MTTU9Fm@mw#R zE#EeGs(fQLbA|aJboFj`=uCS}+RamI=9+H_19jzUJ$l@eKFwG-?Of9Dsq8=iX9)Dc zU>9$Wor$8%tk}lpWgD~$Z*lMFo!`kF$e0U6KvMJ;4CkgdE!-j@D#^fTeh-o`Nenh@ z?nmRYmU+C2ccF3dY|6X)6>u?Pmpaj?#gJjh+I2h3UTgPd)7i@!uk~2E=j!ZzmP@y%krr~d>}`Iq z1%Sv4fwdM_TFYC4-o$uYteVa}AhnlW(zfcdvFyvrk|-7*fQs#RNi?gUyZch#5~eZl zTVIt(8?aphL;%2JJmCdeJ%<{7+I(K$HISfTDL}fGP(!u_3*dMOZ;n`_k?c39qLj%g z3=B3l7WRO4n?5T5a06^BXccTX;+l=BvT%1jdcBQ^UkE_q97!@TP#mByYpcJ0{P~Oi z>%aT^&%gTZx8+!+0D!?$xcjPx8B<_zTY%dhz!nO|!VDHvSXIXQ76wMY%9ynPc%~OG z9Bq(uMfu6M^jM&lUV{KLID~u9uX-({TauZnwyUjT%{qpAu-EXiv~T%rZ!S~=4zNux z2cDKWuTWKKIh1WyF11s0?llf)Z`*oZS7tI;0|dQ5tJh0v-jCr|-Rqrs6u=JRq7KCk z!C(n*h|~;G;r*_kNCbLi(sJz*kc}0AC2xx?YUkQMK}o+%P@}|)vXhq8u8D%B)=|X8 zs5~i*he7jY%kI9Bo>Dx^nR}Twi=ybb*D`k7J&{1?YBOii-Ym*z-*P<~E0K0)RbuHV zmI!ZjgqIe|EOHrk{X(tRsma+_$kH@bdR!?5t~U-8QArbaLblP}vJ0WsDiLBWbgIC4 zmp~PpQVLH15K1Wm1-x_ud3S|Nts34Dq;EYo)yV7P)6eNk+CcP9ljHUEXzCj_(R2j@y=Y*zt-T^T`~| zI<2g5T*e-UrXGai%%yd|kEeP|U604UtuxcTbEqhBB>Sb6CKw)gMtU(_n0-TiHXhL= zlh$0Rqr&$2(GLE-&EHSopW=?WtMK@Dl$)=E9Q)TIy`JB&*ErrouZ;2S@cqrc)ebU_ zGN;&-#9nMkzsuJ!89~B zy;|C|`&Wsu?gSmS5J2|9VDb$Ojl#ySUDO+Z7oOYUmNXaM@?e{#9duG5Z^O1`3p_vq z@^Zm>B)aji9LPQZlVV`%QZR;}_F>rdq`0v@!;rff%+ultLIIj2DaeURqs6T3JM-99 zNrqO_78?s87Y;dTJ@=TsYQc=<)^fE3=o-f5;a1Q4?r2|cZ|l@&dwqM$0rvL~D5v5ILzW`;;^*p!GI=3w^o24Q%#=1zh>MO>jEX45u$?~#t zm+B|G`@7Fwwh64zliM_y2Ee?vw16Ku;$UBc__RW!eA@nAXQ(Av1`~><(5ng(i~(>1 z4v-l{6d3FEmemTut`(1kqj*vCxcOnj7z$pEpb3GHo#$z&c>|hCa9@wFp;#c3!0=!| zBsa*GG&ME3?A7Ys*X}QG|HJ*~|Md5t-=9}Cys`kmY-Q7{%W4$>24f4j;0}u!z*+!C z_E^1v5*f$HB%{<`fHON6-o~rg-o5l-s-U+*qGTTQwzYsxwxuG>@Ml0^^>(*X}M*xq*7qj zhN!vSvaDbQ5*BNVW(C9oyYx{hOLE=CtRnXn-1nOqALgU4Y)H zloRiYD(Jwi(2}==w#Yo<=mIEbWPLvxDWDO=DjY}NbsOw}?)ft1~jWH~q2m&;;icmz7R$6a9*Z%tT{_C_abFH*+3mux64&S(B&SfR?f}rrJ zw9E&INIexT5H@S*<_dJ`Quy-Ebaj$wm2|PdGH28MW`}gLXSa*x4o7OHkA~;(TxFLy zgX3g^8#hTzOj=^)vA&n?w7ck;T7`+;PzuIw;!^eO55K`AAc6T zRXH9rN2j*-L@msRpyx(oE(oDE5_0J*u&$zunSA@)b#}CbT2bx z>dD!rbHl)I^Lw->KUqVj5*m_00g(t%v*QlZ(;f(NBfxTyZI4{7yPEij93&7K+2ehr z3zMH<*HR3H7>_B*iU)PF)(F-suWv z*9%|hYld+!*~1a*HJD}Ml-3KCWZ2k;M5lL`Zm)M(@6AhAs~%6ugw{^5y@gLeNcjQ; zSha!QIG?N?)FZLjz~~-v20anI*mUp82a^DrNs8>}C7Ghea=S^#87=O1i!Uk`qstXc ziW(P|tg+sTdD>>*OA{KoP)GNc3#r!qoYmCZY(+^VeLKq4YU?~Qw-tCDS4b7iih>ZU zS1q`A{WbN-dvSdXc1`c`7AcU6!8Zig)Z51Jn!y*|fJ(`eH#Dp68vwh<`@QX5?7~A^ zw-gsdp-~q#tlTgdJe8!uN7!Jq_>zFXx7xhH$<8$Bm`NCGdx0fvyC0m$n z=?j>Zqb^&1sUZ8JwTunbeRz;j_NCxnLHc(bqDuWn!K zrI)kYyS%Wk%OUN$2FfdzclqWOS&MXi8VW?k;mTnVQdfCn(f+#{?OjDqr6yFE5) zg)(MC`nFb_)oR2F0|hRI06=4df#GBM4KUea`EB4~+@|{5V)>QH1rJa#lUz)qpu=}c zHG*VIto!!hb<|*9%SXWmqfo6XSXn05NuFeK^tF9{?{~M8Ba1^RrC570coMbnfUO45 zFvQ9ZIx7GukhF*z2TYI@0wYP#a%Yp?*sHgfEyZht$C#&=z759C&X?b|4jSC2;W9nB-;wE`}G^GGu8|;SVv&MGLup4U+m8=MG+8}Z>NBIM-uDsmDQWOO!PdL z_m&`}oL!6rql9}z$%>-hgqVwK$ubuA_*&B_mfgO~y0_JEl2p2txG*}t!|a4o(Q3sa z<#t&ki)si3j;kMN=&r^hK&ix-=89qwn(!tpN{AU!u~vpySzB*g$+IP_Q0_$a8}#(f zHC9;cyhAFoeQRk3pGQRmRMAnWAa$%tWXL0=b&(p~0XPMWl*&|U1D@~Z-NmdVnr1ReqQ2E>l$IhA>r)|5!bm^MI|Qo@ehe?9Jh( z--hlvY1+J;4`GkTAnVZ56T9Rrnr*nBPoa%TXl-Doqkr!E-S_AZ4M}H{x>Zwn&b#kF<6BjKljA3D3a9&oZ<+V+db?3iD|c{j-yZLt7fCz~ z6`BEsii*nbMp}<)_VoOL@00I#t@riVF>&?*06=>{1gg^u;phFN;n-1hNRUSuO0n?7 zM40>}k&P$>S!iYRDVZ=l1jzDu84keGlZ0KVq*sa<6z;m~Ns@E`-!zul|U zM7S|??qbrmC3R!s%&ngY6CCQ+^;V=cHtB~mxYkEYjIP- z0O^=FKl21?m*05Uu3Da{o!{9*3im3=XA)UeG$Gb%MXhW>C5ZwrY6A)Y0?5mYz|3Bw z4B*l_4O0^UwH$5t?GPxd7-PJG1YlTzLv?1d1xKK#2L@Pxuy@a|h1#hba~m5@2;{;r zYW$WRCJlh#7Q5Fg9t$SUeqL=sV?ZQR1bsu!g2~j$d!4qi3UDcCq{YBm@V#K0l9Ap!>^WKDcqfU6T{WI;;H$?x>#EZyV}pv z3(Y+Va*JzabscKk_r|+gzi!8SY1WghOfe;Dgq@^KwU*h6&THQmYpEd(r6r7=E7?D< zZQ8O9&p{7J?^s^m`omwJ<+lOM4<>6c+)fDNHtzE)$ylIRBvAX43cPl1EOxmRWg4~W zB`F$gS;&g6CKvIdSX`FIB6D`PF1=-0g&U+(>eNfQCe=<#2xj{@u(p5-%~qVsgzPM; z1di*-V&oqU^&C|*W*ndyziD_ZrK$Y^stzNJ>LS*q1tP^hI` z?F&nT2^74nEPzYzZnc)1h19ClxljT?K!s8WsO=QcDqIi(N<{!lfrD28rQExsWRVCH z-X>~UFg%0x04QK!D*(zp(bOzAWEf@uMC5~igazR^qMcyNu@|-O1?O`2~ZoS&h zVnaN>bJ%3jz2uX_hlkPo%JXD-{cNVU>PXLoxP>*V-s8Oy7wR^wgBZU7x+aG#_+b~z zVp$PI@GUzyp^-o{tf|ckp_$UO9ZURv+?I2scOoUu>l!|hbEQ0pC%jGG^EPTS!lM>j-4y^$=^krdS%z8x!c~^uaDF#jznejNsyJ~ z7FRpFez)`s_Q&qVJ)yzf5EtAi5^<`584OU|ttJEBhGAxcpq@k@K{&S-s;$}s6@@J! z2-6LjTf@WF$uXD$g5f7S~H>{cWZc&t#rda%5M3tA6j$ueLas|eh)(HRrOee?CvFNjjEQ`8wGu% z@Iiqz;M>~NQ;NEzX zbC=yo$4jVf0F&tSuJd%&Jx5!^E6L+_d*F?3g3E0rTl+n+-p*#mW( zMd@1BmKUZHD@h$gp<6ZFtDcnIt@?dhl9_#KQ?NJ`G|e6$y+FUfaARq5sksg;u{Z9) z?)M%oQ4^nuJGp*9SZ6M(H<%rlA`>(gAOaGlL{n&uum`!VVR~$DX{@iO>#ii$zM?}~ zmYfzPeLdkOsWRjiN{P)TSz%fT<#-{(+xx8J%^NVYNGpaI<}G*;S2sp1_N-@pv%lK? zb%#uL!(Gpj6%jo4tFvdii+6z@X9A3Z%0gvP1DC zlDDllJUE!QgQ^SkR?=wAHEGb=lT4M(>bkDy4$ZwQa2EklQL)NQoVYP>1*~bcurLf@ zVTmmv)A}NAh+yzWumyQLGXMZtRIA_n8F*mN+>B1aV;6R}RkmfVbzPEOy?W>?3sM@$ z;jVq&ym!|AW`5ZHpiE11TlPwYKDHTj>A z%MKyldM^v{;sEN|EmXnsl!POcE5uLdwPg^=2pf0ANzqY3TE z)jI=%U9=ms* z7bYhGh76;Z)pTzL3jjhvI}i~p0Hw&RtD~dTulM`;HeGVso{&G&BQAtbUZjwF=Ce_$ zz+}N>iNxHk_=-CuSf@OxC~@X0gkCFd;azlF$F`g9t~00aX*H%~(6uXOf$QGM>|{ts zEpF;2rtD`un|o6|9il)llf91DgawcYh#q#|@9i$R&0gnMo8KHT_xbhc0};ced5tp; ztVr}H(~+fLHY-ZYIU~1(*-mQnBvV5T0UahgS=Jxjbn|@6&w84=jTX(A+-wZQSeqwo z+1;Ka&edNX{BW0f0!BWRDNDFx8+z>DB)flYEQ{YQw%${}6&i|qX*q(uTwm};)oxtn zcHVry>+ht~uNmWLC#&L;@;(fs)C5Tz72$wQo_!b`A!40g$bwU?0{r43jA|iN*`Qgy zmK+RF6c_=MaN$vgJ5Op|FR=_4mv{5%g4gQmVl0HiY_k6yW2d-Aw__Q7h}E&Vj=K}e96Gwt4%0N zTCcm(2!-x=WRx7+#Aa~<$&maVk$}0Kd7cNFwtyUT`boCKvzJp6+q}Wv2A+3*U-6H3 z*N^<(@%P-ld*3_$K5{3YXvr3rle`x5R#x4PtwOrK1~J~APm+xGwduO(TDk76ns#Ht zNvvM#-ZduItu1#**v%Ezx2V}jmGkb7AUDm;4$Ewtcjb_F6bz@8YCsyToN{P6k-;{Q zib~~-ak!bLpqw~=XAL5~g#|$y0^Ejz#d!zip+LDoO(O2lOZm1_d%CT<>^qh2wpwq~ z!*g@9SNAGIOiB|?k4I^i2?_4)UO^VmObkO7qIpAIE^o182Uu;=YRNS45Sw-|SKqpw zH;M{-x+Ev{>3&|zybZ{@7plFs^GO}7EufcFv)AR;z~T~FwbJYH+Hh%kU4YOs45q8A zV~2Ty(y7ng=esvIHGpThVD*jI9VOU|9bGYLOL16Sxj0Y@QAZkn36)GltsRI+jLGZ_bzqo|c1w zY<6KKm#Xu|?nsAMZzYvvQY-M5oC{5@^Q?W^s|D8LfxM~8Y|!Pdffq~ zt?9nFyneHWAAT-sJ+BP!yxCU0T}MElTDPc`Tv)_AEs2r^eXl>STDe^v1ls0f4#NuM#@*S#Q6xE9q3f+x6+@O-_aq0VEWJ$fEcHp%)=9W?zJ0 z_cTGpO4Rfw)>`iZ-AlM!C|K!bvC}LSXB4k+Iz{QOQY{dpypZj7TauL*N69-t8|{N=Luy!M_CjEm=6(2kORop z7!^p~ks=FviPVWGcT^!-#}<;Dw5{6=pEtI7)b7w|`jC>Qn#kll+~FW+l%6c?m5RH4 zY?wWs$^{+OVU?ZN+IBbe?0dA^yYKQ(*#_AiOK#m(dmHSKbn$l~Q+}JbW8n-|Ox$+nQ7cM>nm#^BN1N^N-7 z!dQgHvgMeiW#|YcqR{0E_v>kOjSEh{w{0EN)Gd`xrhH5ey29iP`d00?C^<*YI1vYCx}&}>+vXw#GY|*`1(RId@>Id`)=wZgl5^KCra*fmGQqz%A!quXa;5uD({~ zo?@l0Td{1*rr(VZ;I?q!sUHkrwY6I9&deu?3c(h#!yd-GJji8_cb^%guHHsU67w}RkjDp099*0^fEp1#$*?6x7 zx!zPDLbWe|5umVIu)Ad#m}>xx1tx-7*bGfK)_S_ZJ6Q2OU#PfZ) zvX6ig(Qzd?zy`j9?N6GXY!Zc1OsL)qH?BHyYLqxto%{&%@Nm{`%@DY@lunZDRI~!^ z4fGZ|8L5?1o4KlvZs%s%#wTHCx$s5u{cf)p{+$W@ii*k%c9gr6lD5CIk1Rb9sRbv0 zC;V&5iLE7eJq5KeK@MaU8z#{bx}ZXc7D@9EQDICsaI@z)x6hSY!x&UO!^*CPP_163 zNnP7GX!)MZRgnBL(z0!FQpmL^XX7i#pHcGZd5T#sUHW_>xs?0-G%I^?` zc5s&02@klFp?Fyra# zz1Oy3s;2G4orG{w%E(O_Cf#jJ@2<^Cn$eTiJvq(JE-P8`HOav=g%L_m)w*}vGghkl zY%Di;4PmF+!m3Gj;l)O504}H%s1oi2L)KQPH$AX;nz3vn5{KW6oc2phu=ZVU+n_D1 zEvUA}GXy{h3vZTPU@vctW`VpsCns<2y+u>G@-Az_#-#x~HBSP}w)G;7B}8TK^HMg< zcDrr|)wj}=vR@X0eYa2Ml|k?}Ps)Z|nVH_r)RmlXfG4kY9<%$QBltPYWMT|etz904IOh@ z^XpQjyRV=5@ow(6LqLQ8Y87x6CP-R<1%T%Q5TPU2s&{J3Vo7xibG-&I^*xJHS$BTZ z%UkH&EEXF#u^EId+y*y7w+1$(nQx=dFR(MYSnqDU7n_IzAQpp(CkZd6v;Y9mN{Y&3MFIMv=w3ikR7$yDqf$^R+{2K%wy>5ryDi@%%>rF)TSOTfEKoK%+0$*?i^+4roinSgYMD3gg60^eCRNwhI`-G> z`r~QVmGEM1I6tkKO)|i0O>x*&<$7hmYQYp%d1_pD#p`6W89~z4`eMx@HmY{($Dd(V zhp>tvyssL+y4}mb(vW5O=a&6#k+fA$v=YxLQ>^R)?`+D&Fvp6@K5K9N@OoZZHbuF# z%A$B8nG0D$McIwWERkufB;!roML|;GGx@l=sK-Q@JVzF9yjg@4zgAjUMH^tU3yL$a zmtHZES?XD#_pr4n%ko6AUcDU=H$uc^L3b4$mEG)#fXa)FOSl9lpeNba|r5oo)UV(b_U6>s2I z519cVLj{Pmx>{AQ1eQU$ce7btJ$vqXE4lWYeqy@4R4}IURna7snJzhRiw$)YBln?yAQrmjLW)(M&IiFBe56}i=dfQZm*e5B9bja8hm$TTc#;B z8{J{tMrwg5qdt0hf8FB`Wp@R?Q#JsFFg7V;x0{sQ*2R?VymJNsTQlx2Be3-%!JiP%M_w9TBsz_p=KAoZbqv~wK_|2G++VP{Mc`~UVXau7EM+TeV_#&7>3#Ku3?h}i-fu~EIk#)y zc98aw_Qhs1Zt?v-Q?-QT@CNZJ9I z%x6oc;&#F7MGYrQlPCayR8+F{NJ|<~pcgk2NrBaq!V?Ft9Mql`YHrx3S9;?O+f23b z*o{P|lMR=)8KesXL)E-kZ6e^Z0bm+7=Uo>o61%poG(<@#yimdqsD&Xef&00kG7uV_iQ|Coce-!L0Y0X__z` z8;~r(0|Sqh8K%}S3`@KP?|JghQ^py3uFXVoVkGk+yy|v1X#aYM<{Mrxmc~OcCZ(dyn-$G z1w(^1#(jtEQe2*SOWKlc3+s5sM)g?CEC|-kmwku7&PV=8dp>W+3*}~1sSpmC1-p5Y zXydkm7HLlqyH>{i6>kSwfyqMcH zZG=KuzR9lLT&kBn0*FhkXJ?0_Zcf3n)a7}t(NVDEN+O^TYHo*?p_COwR&42{wa=C@ z2+LZx`X=jnM;-uEl8#VZ{ZMTEmP9M-y{NZR9J?$bsF)?|1y--I-K$>}MF&N%my?~I zzjj%|hP{{NT9emiKTR@Yl>D_xmp^)K5HODO~I)W5!W$hw)H$f0lD6&(b zh&rz;R(W60sbsw_^HRi~yCF&vsJm$ZZ~<+B8LJh@7>Sn`j)D&AtQm-2dgcF5G)BsZqAVuqp!`AC)B14Wv#NN@3H{iUO zSJ*O2aCFu~ksY_Yf5yFnv(3T6Vp(dO*4o#(ncv&*);{eL78^zszP?wzq$3NHN*IL_ z95Z!ml!O2Q2;<%{nO)om2 zSWCMFS|0AYn$6(CBzCu*qDdv!2n$>#UjHs!p}vcr0r zSGopwh8B6jfi@YA^6d#${3aYBS?{-??Djt3)WFi+YElM2@^Wj!{jC9oz>U8r?szTS z?0h{pdVYpiyusCcKS`wD`Q42#uCyd~VQb)ewn;#0Ts==RIZ+YbB->6A_NtwcSx9$C zHx2VHfwi1>H|MIcIIq%D>`o_LbXvEPBp0?6l7imm2raz??c~A@tYKlPAuxaeP<)55 z9Ds+2Bop8Q*rZ`uKwGdA7A_cQYh3KL-E~1JdAF*GEs%3SS^!-7Er87$_o<>JOHh0C1fbfyYpl+tym{y_BM~FWa6-Pxr7q#?!_+(bH3@@ z>&LhEF<stuTnEVN*dsiv340IS6jfY!YjSflNwKzZAH z+j(V0O_W_$ueh;cl$G7B{Ign>JQ!X5`h7pRuY$o|P-$uTN@L6^B{$2Y!cT&PP+Ae_ zFojxp>5Q7T+XA#38Uuzhb_@aD-tw?bu(xdJ^$Y{E-3LHq3kj=u2C-%F+qM>G*@6W| zne$`;xK|3(jpu#c$`*}YpeUA=-&ejU!LKICCqeheypku+oSBxa>)X;w1`zbR2o(w% zY?v{nRauq+6sN)lYDemiUQ2$N7S+coShk?t!|*QU_PW=~uk z2#V(=%Uiv*-^|DQJC!^(Q`&VE9+CxVtvPJBWl%8BYwXQH;gyr}T)e?TfV5fwb+H%B zdOo{l);2(nbxN)m2R2Swm4uPPC$iKIFBvAvO z9Ir)S^^QdLu9i^RX+ntv@(Qagz{1|m1_EZG^p!KG`@8;rw|A~N<**j$0WWEKZIogz zVA%&Yo69A8rpcoP)-i)k>#5ar5V$mc)A(?aa~X&8K<`&6Xk0*8bfg6J)wSrR$EKz2 z6YpYlPu^?$^8KWzF6`aB`LvHcZh3K@OwFsB7FG}tV`NcA1V!DvL7ru0;3b+0nIKK= zdLOzKh8|t-hx_S6yW5*awq#Utt|iPwr`^cty>c@?%+EjcoV!4nr(RNEi&^=a2}-Vk z{6}llgWUmp!xfkb4z6CDjnJ`ADh=NuYw7d57nnPH94Dwi<1D)-Ij$ z>YbIs-HkAH&0Sd|@v=RgMP22juBJ=cIxnwx-N*V++b6Fxj*-vS`rf?G-L^_a_jtJb zyyU%(C}Op-7jc&|n|+t$ehfP8S!;4*#fs}^5HuXM?-CROfn zcW;f&dsB0#l06IOtu4usvTQYP4cwObf@K?byzc9qZI)KIF=nN5sc6q&HLKUtneZ#T zQ7sn78}D8L_uA={c}ihMWlAs1Sk=+dbu@I77w;`#-@RhI9{V}Jzdi4rI_Hg@OL0Z# z3cE|P;6L1#@8s?+zjhgq&Q5D2{yQ5YA2j{v;Bk@R^I7RM`aGXZ7!TA_+*MD;7xb$&buU2+g(u!48XM*P#Loz z7?W+cy$?06YE`W&2zGrXb?5GU+kCpu#U^ourb#OC9+aiJ6kb3C z8B}&nD+EH+1f+%`b_OuWq*JREaL?Gqvaq`iFC~1;CULC-)K--ZV}uqUEx<4iF)u4q6*rbP8nbY#;4picTA^tsYUJEn9o=4_q3qfh zayCz$yzX-KY0VjOOY!zLxp#*1x$CXI^1FNA@+ZpqxJQ)m_8P4_StjVKyHN@U*l_F! z!v*l-Vbza$8yJ9WOyD(m^LEwU?vOdQDww$$ONIOPZ;h6bTPn$BTfy#`v0C?MpYAK~ zfYD>8Jf0e6&;ToU^?b;fUB}zP?TMr}+Qz)#8}&L^Xj6*bSPM$MWKmNbEb1+4oa3Fr zn3S9g+@@X{7c_ERh7=?aEeF-Jult=|cBCKfvKlIj@G@D4SsLwrpD!){CYT}^iY$B5 zK)5A%Ru)FN?5Jf0t3-HF3Iv4it`gx1BbpwaO4NxMUQF(25^$@EHN0CWDTNn`2TD+h z0i=?E-qlj?O4KTmg4|L7gq9xXT}iv)$M4>EPZdP~DcTcqh(rNsNbR(+2Zk^kDy9J7 z=Dbap_HBO3%RMY_ed8WTJK0Q2o2zWutaJby$=Nk|>NRWvGa#{xcejgxHF!%gbMt^& zoZfC`9IrR_hE6uiR3+)zxO@>E$TjT~?~CsOT&)K+>z6A?3$(Bf(DgkjguwpU6|bg z5p}9s2{*)4ffg3$C==GB|6c;)MqwQUARQ}x)a!tTx+kTKd?Wd*pU zZz}j^KQQig19&mLU7JlD3{-FTiyrdqtA;o-TldO)OE_<-w$L;Ir!y=V6jqQmrzzVx zlkKX~9!B{#8J6$2-}HOtwJ51cklHT_vWHDFjT2jcNOn*Dw~ZCj8O(K1%MS+iOC8JR)=F7)kMtFV*_Icy(Rz` ztOlP^z&pP!gLiAN1ML)|Pz|?$qE_Qhg3yEv+Ro-~yJTx~wuCA4T`aV+)LJcm);lZ7cBXFUT|elj z`f2^~?&SOGLK<GE)*OXXN4xL47C9r9jF4T7mR*0++gJ`lPu{q??5V1 zFk!eH+lNpKVXBh1yYdXM4cj|p+q9xfp4gS%_53XiQY-Iq`e$^(vv);`bgT)tsn5%+ zb@qayK-WXY`-!nEDu|=DGrl>NU2L_F0A9G2b>8&}_=-0+vK&;_xZWKeM;@kr^*wxxjeXs z)e{FL+At~^3KK7R?Y)4VXKCz>#x52f81~wlfi_>ZL)YeNZ13Vd_U^v>?}^HLbC=I1 z#Ps0c!S>eMi@zWCTh7XDGn=)yHzu7V$Ifn&GHlOxxg73LkO5h{GH&Fo7$CKS>5%+U zx{{i4U&;ooXTP%RhJx?AAAhN*O#L2$)H>U2>nNekCTK^=wu#^RiLNw`nx)a>(ATp- z`?(jTo1z7Yle4S&(GL1&?|#$m+Xlp-w?zq1q3XQ5T|<{1?0GwN@%wa>pZvHuMy_fY z01)5o0Fs%4I&yeQJ0`hYQ0zNlm+x7>+CMzz+R<4mC^J1f)pd72RhFpXvJh@3QpBmL zs_2N(eKMPG)GBH!OUtFZxJO}rtuNQ35jkGAm1pZU??u$-u2=HY=&Y^lblkE$T+Zx5 z=j@ED&%V4myDp!*EZ{uz^TXTSET3%hyl%{^7<=pt*XDAo*;jhXb!X^v(^`U+#Qywq z_s{VseqX!(zWM!UJOLm6`nLz;pOTuxhZwisYLPw8%fnt#D-^nsV*enyb%uyNS2H)E zak4Ev5Pe$N_i90wC*^GClF9n^2Hv>PIqO2Ky_QRLD{gbGGvx9dZ|^dD!&beMA71lq zp@sKGvrGfGDnD6rc;#(9JkBRR7UHtH@(+#IRl=^-Y716(DFwC=O}sHH!6d+&w!3uF zvx2vix`)5vci)}%b-gL?t*5pd9idt$XZg#oR2A zYUw~^tg;6;7&H$F1ticZd4;(Zi$YLHMP6yyo7df}zPr9ZTzxy|q8t0XZF!56Q~cdEsku9WKiWTsA=F4t)5K6R_p<_n#E zduH0(KG%DuW)}fG;&_sJHm|-S02Fw@o}Y#a-~kneY03&K{53-?6D10K2}=Om;-xx! z0|T%bZixnH3pZerg%@jB97qUw!(=P5VYa<&X)HfL{1{HD0=KG}M>0p5mK8s{WK z&a7u1%HeEhCc!RwGFK}}YrSW&jM!7TTQ$W1mDlXus|&EuA~x1tWO=M8&8wiP5Si2t zxSOTRJB20Ht1DJ(m0edQ$#v{<*_MNPWwvCpw^p~Q$bm>d8wxst0{tCfRmfXG`cd>le&8T2*q22BlEwSPA(y}-OcZ!|%yw|M({Y3^j$x=W$g z=(XOh%L%!b!&SsrZ(Aqc`I3VI60$HWrOmcG6e?Ql)f{IdPTO=$dJ4EY> zwn89OF?o^DZ(&N2-+R=FP$I(Pi+VeP*W=EcX7z?z#IE;Iy^|;s-n;vVy0Vn-QepX8 zFA+>uJy{~-T1r_o@0`MU-?zIXfIvjNE9^Q2?>Yrq;3)}ehs;h&Do#=;N<3&x};AXkFcd^eT)-G6-EUc0C5`9UKb zqW9Ml9ssE@k(L2q02*)G9fLHLEH|ih<6A8v^LYA;)~eg^J}-O5cjI5Ylp6Hc7`Nd*jtNtyOo8vg`~X<_-u81D^~p`6yv%Ldd1rstr8{?KzWc>yt7lw>umFq# zFlH7vH7VY#C``l}(s^v-lGBt#?33?4=-14=RZCD6)U1uJ*V(8YtAZ&?lT>WP(irht z^=%g|HeHM5+GVY|vTL>Mt_+3uKD$nBx4eC=a!B>4Sw2v?#W?~VJt&%STId*!#% z<kiq98|!aM?ARO9tt$t{Z*yPOKK^9JyY1+vl<=B~B3(7KFDPBph+-8`h+ zm06Rw_Vasxx%bh&=IdR)9(&U(t@K(T@0qFGxUK2p`!hXn&oAzRC%xBLn-x&jJMVg- zD6Uu#V!-T5f>3O!U``Cn1X3{+1DFEAlw!f_Iq^o@F4Mi2_4>QZB&}Kd?jeOi(9`1a zN)!6K2RGCN77;I%0vZFffN^u}6As%%2p&KOZ2Gix^EH)H*5%IL;j~=cU8Q@R+w)&Z1CQGI1HN-H3+>1*%zT$oTNWmF_$fPyU+V;SSO0)_*`ERFYGZ}IAV2G9(Q zUoZi4h$u6UdmBUGTm!-japf>G7#xU|??nHrqS!?2wTxLK-{;u%RtB)}n8)#uA6!GB19++mUZDz~P$5JMReY zSXmNgKD+k>{}6O1WCSG}N1~&%V=0-sJH19!e~-!c(^#>*Zjj z9`{>s@e0QBT9*MuSwLmE*)50TWFSixOIs3ZGL}~Wx}WP@(P4`L#-dzBo7?I#L?Ka!K&Wn8BoLNz( ziFb~Pg{4%Aog$<(rL4W{4#69M$`UfAy4%@}(th`QAL}(A*Yeh;_M+sTS0HP=U<-f{ z7_N4QJ*fmIS32GYfdfTyQf}RD^`rsQO#X%k!rF(Xafh82^`0i2msZeH&#icN!{i%% zzW3ULnG3E7-S%lii|z{XolXOJvUPPA8h64n51QRORm|K5`qKElobmx?WU zCP`G=o2ed=)iB#OQ^}^Cw2E&#_N6(NbiKH#t1=iw#3g%7HnW@*kaV_0e6_$I^(%IeY@j6pC@&z>&Jo2xRn<5=5kyl{)ugVMURHNF z%dS`cWx8%LN)2?@L0C0bzabb?RvpJl_ z5Ifrv2ifn+J3g^ofpog~hqwXTqcXt&>ouv_;x=2DYTHY$k#=-l={jx@*M#l8#cSA# zce@`8Wft#)UoAX#U_)pY;N>mEq)^(t6=UbwgZAD{TrSuO^Wvfz+-3?L3TjppbKNu3 zs_AxTO*YL;t2T++R%v}}u}aofy!%Pcde4);_I?7d*PBCYHGQqU(F@z2J3E(#ecKZe z!JEvS@k^$fEfSjs8h}9%V+2V?pWSt{DXNNidG?%#9vfiB)(NR-0&5Vlbi} zDPtq*#Zw3<;FX1M9^k#6GB%un!CLluhegpqhXc^rvMFYvAnz)`A!Jd6SkGAe8j;0G zCKH>%GGeoP-W^6Ugqd}N;BwZ%uGFh|!J^?2`l)i24Z3P+)0=k%aG`4f2>{~i>?%!K zRSXOWtxd65spTcd(7?(`qUf>|jHUN^Yp}~Bk!(2w??XK4r=*pSMbJ%LH$(wa& zySRMIVYt3qe`g}Wds75MB}4U=wd~%mGc2O4sMyhgL>9p`t}P0gw!G3=S>C^SS|0f`6_h={y}*@Rdw2mn*|fSQR5zuPlYAMLhu@4jU6Nhx;W zxq&4>X~3=BP?F}zpA6y_1X%Ba4LozT2Blo3%{3R^eul1Q`8~hkx4AGE-Qd1W0=Vsk zYqHP-cl%+xW852~z1!W+v%TkFlbSg)&4X`^t?f!zC921e+fhlhx^Y4$(|4;Qs6zLM zmWgS7_dTk2?Q`^gZhDWnR1op3mRfO?y5Wm>zSSl7ZfUmraGf|F^Njd7==&CyVnX;wN}$LYcf%h&R`aulNYNLxylJ8P?2$i z&9aEGtm$st>;+qi^K&OIsXR3A9>>*Sso=L9&-C+{xbwY@yPXiZal4%r$&qyldGC=5 z+ACdy?P{a6WY@!n$%Y74``qa#-yF{@43lk(9k(Wtk6Z63LdyJ+Spe})$6));%25V_ zmNcS=WCL4cxlRQoSob6YH>`yla7c2Jwlcw6s3)h_wJSaA-g4W^EhpScChf)@=D={x z%e=8{Z6E=^VFT4Lt4l0k0XBZ;`tCeML$}Fp7>@zxLDF9K>B`XRGQdVPXNAsrrDf8k zN$l2>w$$cfYj@m9g<^#ww?6-(>HBF zccu$yh_V6va@6il07o~D0#CcB#U2H+qR_}Zm3afVL8|wO0=SJ=yyyPDckjM!b!hu< z_wNlU&xhZBHIEZ~DO48M0uSKT?aGQ;j8R7RfC0cdmhVeNWfr;>+jKekO0Z^ZE!$>X znCxy_r{1D3-%Wbn>fQ6npWXLq;4(LS}_i337T?uF;n&_(ppg~Ddk?}Xi`@KueE*B z4ozcMSyBfJNeg3Wb%&y?mJKLugHU#1CtcFMx@gvBIVWmP?m-K$V6T#tTH1UI_nIb? zpi;H8AIj}-=1cu@es0f7CMRiYPMWg%md}2YsG&I%44!P$;FXKcW>|ZXF~DnUk7s!p zx-wU1i!NqG-pf0Ln&np8=!-zYV0d*egb;J3+qiXB6sa#;7^@VJ6%QDQOSf&a8?NIa zbbH5}H*HXp?PuJ2({1cl$inLEiQ|sYX+l?ta5J8eU8_Krot+ZL%C6b!|%mTvUQf=Pi;;y^*I{K>gi;!5T z!|n1+9c7B)ian{hRX^S1XNphm>7&H8SF+?$9SJ>rA{iy}ZLpV`wLu1_rr`hys!~D# z;GmQ0fs>B_J~XE{fXiD0?Tfvb2B%M1?b_@Y+9VzE^4|BiZHv5XRS${8%^EM!sM-L* zWb249X}gx3w=~SUblABntvDLCE?ROwxg3RRo!T=rF;`Hee20rG(*2OY<=>x3^pG8XwXriL{Z%uEerY(k zx#-ij2&|G~JU6~H3UBtho47>+3Ts2sf(I`)d|`N4sK=bj1w1Qv`R*J}l6e=EHsfU% zl1`&esx+*=i#%++&f=b={j6 zY?HWP*36W>m(DJq$0jkiBwE}ho22`;is^C6Rq@`t-jjTMlh9D5VW#(`zvt^E z(Z11M=0%Ib21@ppMho)hhIQ}8e6d8m3ISJSeXdGG~V7Cn9#e28%qfD zV!BFND#pUP>ak4T@s^YgFqyBqjg10s-#vZG>QigFirE#h%DU+pRp2UToX)|9i3tA9v$r@KwbGnuAiFfhDU<;`qu#mqujHk-q zGPlSFxj5W%gOys+17vgU^kh9mmYVG@sGdyFK`H?}N)Soyh!;B`fz$6OiyRTQ0A1u- z`O)CUGQ9}}^S&pthU}bKtyrLwx8`~~_b^+|0Z7Zn^0S+=L8N-#3o{~iKm!*r?KAzB zS@#U}_(~Fv!LoLV@Y<Sa$>TrddbXhmaDlxxVG z06hKc@_OW*_YZUCec5~EeaAle&o90rctT*qt+$xk)2d>cx@(tfH57Z_mZ~yz=zs&; z&YKDw03o6>^yrGswC$~HO-9POne1XnbHgQqlizA9KI7?xS@$Np*?Z*^huwDZca3Z{ zgcM4c5a-<9`(2wH1t(yT&erXtyx@;?+$3)MBDI|w1^teaKCz2uZ(VcrE(Jx^?9&1a z3jpq@xLH7GT2p3>CEC4?>blx2wYgNqXd-oVYi4{{HB=Fai19MO-f<0WO^Nst6LY#j z&YGMq5Eg4UJI|uL?4^_YF6>HK(6X#3MR|9ZcU?8FI4^qET;z3iyV^}keb|R}eHv|} z42q2)$?WV|z57|qZ-&ES=;O7n;A&4UCp+%dw75Q8{jT!6FD!mK|4wwhc~TYJ-tzkz z^=Y7QQ=wLKt66FmR$5b{V@lNqE8FB~4iKlPFb=SqP;c#(Gri_oPM7YaTe!5cuz%aH zFuRl7YO?HIJ?i}OK*4s?~RTc=?8IBYgvf4Hzk~}Sy-lK3%NCM zGhR&cT3Z~eT~}6lWH(jjzN2&xwFY3DlVzFiaucCJS1GmYj$Ylat4>14UdK~Rv}E0b zvSH@y-06!_lwX9!!VC`JZ3`6!0DX=an8#-dhyef=q{Ze}Y(@YP$Xr|WSAXC88uslv z{l?bU%WOBZz9s8DB6j7CaR3+NzyP#_7;9xz%X?5@*sQlE=hm;%xm(_jOZwvJFst89 ztzDP3wk~xNIy4 zfb~*-dtVADK*kPi06=+d45G%>)1!qpJOaSy|nI)G&`FljaBP;MzbGk`!%*3&hYx)RtJ51J^A(^ zC#U!MRepTE@jE;Em42#kmd|9mf?6@X@=Z9eIh}hYc`KXUkr!lmBdoO9Zmlt3+Y-3( z6$kyZ*8w|k18h|$BWAED46+~gy+QA#mtnyJFub(mwX3crTY59rdnHgPkY5ai8(HfW zG~#+%OxAV8j%v+VyrV!_$cIJ;Bu=czZqP|DcQHE*r+V$43fX1l=G(p;am!mYI9X!( z>aB#+O|RV!ia=mlR=@3*m6g&Qmy?bdin>8~u171q*BwPg)R!qc*M`j9^C&9|Z4t^s zMRxq`dXGj{S!xGf=h`5u*IS141PR)c>+Hm%sNCLxMT!R%8|M)f6p}=<6s5o?d49AzG;wIBG_O$EEdlZjWvid7z@gdW6o>TSdt4e=QArH3v#`N*KTy-VtMYE zs1jgbqaBG0biz~MdCd1FC1zd|8OhTVW79PTnvT06nT}TJ0@JT|TbtfEveGddx3g`} zGK5HtL~2px%za`rt@qrycY280OGMd}RzYkWn@n^&WXa@(Zi8YGOaM@uvr z2SD!UV|(8(QNp1;yC*XYe0%+7l@70+-OUbnIkIQ1FY`dTvarAflY=BIi1`XEy&-vE z7D^IVB`zC*$Z8iG8Ih_QSL~L>rG1-7fGS9)0)w7bH%qTI9d}~bTpZC+DRfDA2Xl9p zl{>?2q}fp>cTve@OOdjVi9B#uSb0*`PKc!>riOgBEZLc|MT6ggth%eB}<)rt_WW_a}U~SA-e;F2WYmyIgTq8^7Fwl5ux)TL3;>DnuIc>(D-HEOGKMbYW3*J2U2h1<+7F00$H{Qg&1L|uISPllc0uT(TfFK1MT#C^WstUSY*N?hiJ;7J*_k79xUhQTl zbdV!40st4m<3TG3@xUW67$XJl0O{4rTMcp{$#r(Zx^AzRJz}1vO41meOi6cLPd&G- z_v>?&sq>P0W-m6Ovxt~+i;|Q9OnME$aA10C1HUntw-^{LzzSG66kAT}{bpecF@OLe z8`v-}g^iibT1R?ezwZgtYL(L_Jz%#OWnK?JQ-cSFSs~!%HB(ept8|csIDiLB`n)A! zc43}@n-vZypRkajByA~R*i)8163dumCr-z`y~m?$FpWRs(=*RV9sX zR~gzBSAC{H?%L3ntnTfSF41*sMQQ7}e3?D#?RQ&HWx;iKef52*-|EgU@-sj4cHU~f z&<#M(IjL%T6RUOTxDW|Uv#Fgi1Tymm)ZX=+7i&8j;^nvRuu@~@K$2QkaKK)$r&+2KZA1Sqba9%#mv?p@WAdwaHd0iK(!jW=NVbt_p1W}oOK zRv?CFW!WerHg{UP*ja30tk!N@R~ez3Ow3}zTf43f@3$vwE^kV~j_f)tQ!y6HX^EYk zB6V0lVb)MrJ3a(N0aX}^;u4#blyJxj6tS&P=0WYgfOnmGqxY!WncglCg11Y^XxMFa zp}w^WFI~rRlx{oGl~{@jyi0>90cF6uDk7D<)Cyp!6?&moDg^Ipi+6?ca!w<nT#AWB*gke4FWY89Y>wWNsxP%k-m(f#>3O42izS4_RV4_UAvqLOj4I!o{D-3v4e zq)qY-I`e9GWfI8?b=``->k3bjZE|Z$0+?iOS#0l(!M006(VX1yp=`|y6Hp)oV!Z{r zgfc=Bg;j_HlN#80BS4X`RhCAjM(){2+mO^D5(-PMQ15Z#Hp3eq-E+>+>f65V!sxCr z3LCjmkI9IegLuERVVZ#OL%N0%yv)2BDrzsH?IK7!RTc0Kn?c+{)c`wo4taZg1+TYi zJgsyWFHqh2z4cpl&NzSoB#Bc9(v$!Pkh;MOr87}U#_G~(+s)=XvQi^Z%|2z(O=TNS z2oNDgA?wa{wwkULG;{$ZY6um{wA+aBQplLZ3(eVfr5W!bYj~1u-~p4|SB_^zO@~ji z)$h#mz3iUt{f>3&m!>l0+nU6&?8{OuVVmzEyYBZI`nK9(vu=I5@Lf;ca-r(y_kR~6 zx>1n=C)aFx=M$3m{@(tfwOyMYICnNX$7nm3SRe$jc!rXpBL@guv&G7H3H$|vg~q3y zcBdo*!20GX&yD7jbSib}RMx3ibL&i{((L2S-i9y`7zMr^W`bdP2LYHBkPF6ovr1#f znzr&@2e-!SYlKDup0KhUac+?)l4h-kh5U=6t}@fHKi_Fv=m&F!+^#RbHafFPml50Ghe0_ty0qZYe-#=GEI?546@;0gSTV4h#DZ z8cBDph|T~3VC`uGZ){@?P6g~=UJ^psWCxIItj4x&g-|3p9Ps8XSV)&t7Y&#VNe_%= zp|BF1EnKh{Yasxz8A)q-0l5XVuR%l{ym$=gTWGJT?@Gau#wtc zcapNOEQ4%VBC8^4eI)?ffemZ@)pd2C0FP_&drXt{wrTA3yk%MLG|OH9Guw|DhoX36 zVQF5AEj?_8y*C@T)#mkMtsc26ST1T?l(Q^&+{4aXBP4b?yY+g7C@X9w34LaVizP1i z?JLlcLs8Qy3RIj;FP5>;6g^{kkFF;c6GuvTc2ugDad89ns^7H3T~>Ho*1g6qD88i} zYvJtDi_iq#)@{e(0?4wR>kYFLaT#iPL*L2en{rE3%bm*FrmV24TJK6Trn<$KmNf4w zF{4(!6e|@i@rqc>wIob0C8(sRpm!xG=oD1ETWeQ4Wmi{(up0~Qoy5R3!68#n7IQh& z5+NR;01T=zKxwh&x_r%jt%nc4>i64IJ((Zpb?sela07wR?_x2k^kiBRY~UH#Z47VM zuAFERgh#YMW_a5xRa>B>%XV99t?=4SVG< zt=J0>>11-jn+hff&|Og;loa7XuU&%ic=pVWz?Al&kH2^W$rzuF!jtX6WLxn}tC%Qm zFPmQY*`%BHUKAK-5kUS@r45vVQmJ=B&Rcx)&*=#!-Eg)j^SR99tAtO@4fA%}eL&E9 zy58%tFIw}qy;9|<@xmwpz~bu-z>_4P2aSi|U{q&V4!gUUS@P4mCh}6t7u+>fI&<>4 zMn_eU0#u45*_f#8`_EFJ%&wP{xyH&`xqE$+4>4n-a2Pym-;B ztbQeY(Qf<9d++-R*Kw}$W3NX$#~xoCwuAKcd6v_oeRol$9VSMVGj3{zJb?-t_*UW` z{FY^VYAN=^{R#D*iSLmAT>mNn8DM>iB{ZBwwufXQ0$^7%QFx6YwXl{|ly{9$x*mYD z)2Sr2y^r>plE1cc-*oR*nD44(4t0bzuQg0BbWJZ^O4piJYlnFO43bs{D=9leuFY7I zD$Vx}{B~c+t^%|xw=itWenWPwVWosH(RHDuNDr~c`^cwPFDo@TF-B}OM!kbzL=!XY@$9bcS6M_|g0t8V2pV1)o+@hieM+EHL<25{?xqK-^fDu7|tSN3Su(3jO5Qnfdio_hBT zlAH%IfI1D;Yg!f1fR)mkMj>| zVQyzDx%NVH0$!Z3l(B7%^!fptqYXE^&eO$h!N^#5fS&E_7`^gfqsNQW)@QR>XOfr4 zP-LmX?=0yT+7*M%E-rK5G5ap1n`%{wEwzFY zvUeAvqg7^;qQni9s!CkS?MgrqRUk4YNW!F5ZlW+&1>xAduVdfcYbVGFO(|93U6l|M zhXNcJng&e)_A(3!_BM6eUZ3aVCO^sA*JoaRZ@c>%E(n^j%gtJ7dg$JUHZB7a1!R}k zd%bRJ(HIq7b7-&KT8m114Yp*kwN?Wcy0M91W}Ip8!de>vfC6dQFmGTI-XW=Mm))v0 zl}8!s0NHCDCJm-4v}JoF>74@X&d#UZEi*tkGR5Gf@-02#W|CdA)$dB=MP0%=$d1y{ z%Vz7XW*IgSUF?jSH;uG_QI3*Qr!?>=sRW=M=aSufvh^BZL2_npX#)iEzV4Rye17(WbpJLZh$^5Y4I+AVP6+n8T=eoDAY#Bop52sJGICv?OOn)rMq8?r_{C*X zj3&D>^2f0fN8C$oU!*u!nP*Lw5E6vk22E0}z5@A>D+~sUa#?Re zTRFV~rQwy$@gz-7MW#dx;C^fr_6;3(t<2L><)mI?w2 z29H1@q!BNn%ogl^^)&tuyie{Qbbo(i-+zAhhwf~uK&7qsILu)j7U+c{VgXPAtrjtG zNDNA!)=?S9>xi_v%Du~hI7wG+zd+uU*GTd+uN6|?Rr1ttv+{2SK1^rrQ0%F z8|IoPjiP1fjh99NX&}M+oepI`06K4*^!&;m_HMwMl|w#qc}H~1;kz7l=mzXHZ!rR9 zuMN!3nAdyX+j`TBK$4GbaKYaqlpOCeGrx=%0FLwkZwubodtI;m8f@RO4#C?+zL;I{ zZf>X3ODzj8kEpVF_IQQENtgZ78|Unu+U~1MQz^F47G!JxrEtu6IH7~ zt;Fr!0(K&|q$MJX;&m;hL?tDnA_72cr>S=(0+bS2=`wx#F_}3-Y+Rf_Sk~ zHvkksS^$6-S|J9^2J*s;=e5Sy>toy9d+OKTxpLfo)mQIf(v`@OWxik#EPx{bfI|W}02y;|he-@*3^xQBAVUmX&2J=}tJ}so zcGWg}8E?mE+57SFYyFQTj>N?JQhc zQm=38J(u);4 z7{JZ@jk?{xTf^nil__T(5O8t36`EP9QsdH9dpE*<-~K_lawSMwM%7kDO>!94IlG&d zTApAOo7Y{lv|9^Mz=;F(w2t4sO8(^AW~_GO?zT&h=FtqqG++=CppZZzVRitpnQ;|t z0GO@ynf>p1=KjI=_klg?@BI3C&SU1Cv6~B64>5q3O$i`bkka%3#e(-rD|bt08*7n0 zZZ8{R!Eg3MPTuXa&$cG6WhzRo%RKd*>%On=OUuchgu&W!^idoDaI?}SM)eO=RjSRK z#~i~7c$+OeVNQ6J5D0h&!ED9F^R`_8nY8qrrFoNLVJr-Hr>h2N&n&UN2Uf(Ow_G-c z5KO#FfJK@L0kQ!_Azv)+hE-S1ieOnN);!fc9FG^m0IbV;o_={(RXOZUfm)X2q*kgl z7nOP;cp9e&->@pwwMyAqGxvRfjyyZt(LL>z$BSpGHPLb)@)X%BLTXjCGANLWcbDBL)`SX( zr6hFk3P|WnOlMa@0f=`_Eh@WJfp?<8N>2BSHy-5>q!FVD2Qell?2|Q>c8kAKF?1G~dO;I{aN9U57(%zf2s?c00qkuI9 z^bRgElCIyCxAJDGdM=i2G_yzBYilnQL)UM!_q>yBRXy!l7%9KY$&*}X^+v4+rjz;- zB4a~%7=Ri`h~&T%5jYPi(a*gTJ zY{!t^mTtH^0EuDqCI3vTM09%k?%G=T1|E2H=k?^H-~C>(Jg2|6j?t+91zwnTilN-} z6Ur`Y!%g;J&z*Ta3fd@RJk2KAOI?B7dI3xh-oa{x+g?qq@dSJ0V(sp~VOAQmHLJ03 zH7cA{vUcZ%V!gk|oY`)yvyB$ZK|*&oJ+*gjO|7=aB2_b3)!y>{UGB5T!6e-|Snc#q z^hJ9I`8M-Y8S`D1_qmO{mM)eVuAl-z!7LTPGqpDaWMS|q5QKD-Lg93NfBow95B_Vl zsz1g4=7Z5{eeJdW0ssQI%6MhE1A`SZKt?iUze5CGDXD=0vmrsVH?AvvZvB)jW~#Rr0Nj-YEv9B03uImoNZQdmX3Kc+ zc*F2mEEXH$=H4ds>EOI#^<@kTOSfb9R-Oj|YO1WcNoyBQQiWBv(pBF&xOv&NSZgb^ zkjGFE@gg@yoV3!ab*)yRh>9+7B@Xp=XQV6zd)Jhuv7=`0WvkLzOpG~NDu2D1AG_6CY|s5ZPtpRmU6e~TJplGwi}H4G(v_atCdnCtSyN_ZyR67G*sl1L zY{U4<*6CU^RSUlEW$>aKenWU!%U~!k+o~V0j%v-)(%ZVOZ)r&zLKJ1H@-$%i@t5Z5 zTP(O69v}qO(o9>>#(dMDiCYxq!rp^Ha4gk}T`IONv$`1BXNiv8@-j+qbpztj=NlbE z1!JRHkq`(W2$k7I*OC~8EVzlp^qg#h%H+HJZTITuRW^4mYY;MjlmyFe(ud?@E+Hi3+U( za6C@$)MeV0T?)d&O9yxaI3$WW!6UpYNQqL>f&~C-3r&neW8Pd=*UxP0j`KEx^Y;Ad z{d2FPSsE)0vg;ixvD-aE4gdhcH)dZZ({(9WhP}33HyxZgbIVu@Ve^Fduwd%~pJC&) z^fFD`oGbu@JLYh9WgG2SEDgxiiQ7|X3bi}RFxd>EoQj;O(KRs@m)<>F%?lC|g)@|F zjpB;ENqlP|44Euh-d8M5&k_b_w??&X;Z}GW%z`h87)bCu@dZycQe~8y0!p6&Pme^2 z6?=f0WRe8{q}-N=(s{PFNDL91S~ z?w`5#t*YYq2y#|xMMQfki6TK!LdA_JBLzL>5_Y^{9i6llVjxjC4j2o!KC>%jV(c@+ zi&veMwlZFk0WWPJ$H@b-JJ>Z&ScV}~3!+p=&svSM**CM#eoS)W+L^PYMF^7p z_*-SIiI$0ri8%M{pY`4Qp9v4lr?K(p7yk)%e4Him7HfzCqWd#o#I#=6MV2?Vxkm=( zt>w~vk&h;k0N5~FU&C6idTaCDJr`$F(zVtrMJ7qAoHUmvnIHJ&9`7=?U!x0cm%JBg+(>jkjcwd?N##%#?ywA z?arhz+O|9EY#iE$E|hL2m2V}1BIRHs$Xu)`v-jA-+O;=JF#CqVXtnFVBOZQ`3?vn z76TBHR+3c(l$KXaWwqcfN}_Z~P3H^kT8d0Xp{AQk?XzrVoK(7qV0+f<>(u`4_uXAN z`J^oGS>r!McpA~Rt8$UK| z%gW^5Re-(xh8ja*D2vy2uWT6NtgecdX{3JChn2{Qg4OrQ;6C@c(U10yLRm^>)8%>TvOIYZBdGf zxm;^>VRbrbWwmkk)y=H{iPXCq3Z)bxlya$}Dz&Jccvpsqz`K-!m2^-%%F7+$yn1z2 zy{pyBO{sTf#1fAP5U;XI&<+6pFO=w9e+}owc`+nOj>vyOnCr|tH{e7La z2v8s_h|~Qr6ITEr0f4~1AlOXQTks^WJG)fa+-K~0Oi=4WZl*=r9=>g!c^V-qw=k{3 zz)aff0XfNBdth+CT}RtyV07ILQ(0mgMks>QGYy(*XwHIASn16)(tuJNB@5u@x)yt? zzOk+1fN1B8d>gq7L8=Brlvt<$zB$;a87egZoMwl-DklAj%{;PHN|7*zSW3Vez$8#3 zB`O@81KhAX7$`4Ck^_I-Ea?b5Nx%$jAlaXo#FfB85>n1t7@X#z^?ABOshA7V}NsQmpx}zvwxp3a2 zX!CiIW+$>XTuI67o(Vy5S#6@O`;3r%M<24WrB1s%7bHLNg>J;`?_rI(AI{ze*$b{$ zzZaa?{{9|r?<+eazK>t}7oYyW|EvWw=^EvnkWGj>hiJ{As|n!8MF_fWi*Mw{dtE*= zxgfP6nCSYMPiVKPt;$(ZTh~#&QN4P_s#vu*)-APD8iUGQBLEI#^SbHqQokuX0D<>cC%PX0aiZ0IF za~Oss2V*5|?@;q=RC4yMm&H)fI5QrTCVnu=;<42hW97uXJpH-ed7nSMFYn%BDi|XM z078->1U>+sP!LyO74O3L?5qCq59#ku(+{lNkND2F|J`$0m6Mx>Rz_4v3j&6wK>;i` zfB{NUtZJ3uX?C-RL<(~Nl5!Oft&~!1QO@hz%-8%r*QVmbmJkCXz?yMpyraDm4pxdw zcW<-wJEJfFFuU*;%-ss?;eoVDy8sa6#WJ}~y!EmH6{RYXzSXiJlx^rD7rT*iaSsku!S%)g@|`whRtLT z@;VVKAnzEAu`Jv_s-5LkJcYBEz_5**FhCgEp=<{$3Tak}bK0SGFGRswyL^3M zPN;ONy44aBR@IJeuYBUI%}M*ozUD1A;nES)Oj=EP$yzchIdkiFy8y^#2KknTMSV4o zmES#G+j=1{WQ$pPTb@PuPDh!q7biLy;D6hCEP8&EQ}8IOX`cMEl0enckR~RttbPN?FvvCA$esa zt#_rzt#|Vj?pCxS06bSKUQ#3^-pT2>ga}hzB6F(|F91@+=v@I3h^S;O5(E)pdm(ti z0$M22-KkgC+t&9y-r7Zuc1XRuKY9P$(?r3AO(50#U>f-l2>N{hv8rO92Ou9Qf(WOvWFljb6H23E1%EP>w1t5B5x2^}QC}Tr_DU=DJ zaHI_xG%OLAs;QaX@_bJhM=Ey5{SmUBZggzP-TU!IUE6Pt%_|n?#GLE5M>|Jkdz;G! zU9I5k)P!RqBNR@|6O~$`<0=%)r$)xW+6=-=HwXieBRckolauxD9z3MBwDvV}@%$10 zOcS1_F@S_Djg6ADld*Vu;RKPM=n^9IUK0kV?>tjQfvGsFMNB;|vrw!mJ%Y>lYV9^_ z73;d2@r@|tDB(ztTOz608X2HC+%w96()=uGlMU@k3>(dklW)?bMFx+B4n@n;t&mhrat)mmseb2XuC zv$?BN5OGke&JM5!Sl+46{qyeS+cHF_o?JHF=!hV>TmF04Jt0M`0x%u`gMtDo z93$9dF$6F$MlfI)u7JiSx5SL!XZnkXADp4OCxLE;YZUd#$s12ZVS0R{k) zVWxT6cY`m%&MT)^5p&R2RWVre zW@R<~pdT;>L%=+OR_Uq0Sj9pGpat~CVhUsE5?!@#&+5v!^|e^7(^4+Do@>{`}9|?QWFwK0mC!EqkiZm{K#WuVq4TLplybs1hX3b~9P6}+hXNkuub(ryt!%+;^T2n9>50(-1;2}|PzuIx-OhK8DlOJf<* zvl7u_ylCzcw9BLG;O2JgDy7jo@$On#_0D!~*~(3Y$XQz@=T54sRA>pC5>+Tml%)_A zg9u!$_lZz3sf3`V5UCqLU_q!-D0o+ST^p>~4{#5ymdBX1Oxs+qZK!+v`@DLgySF;M zwyE^~Zh!IJ0X-hiAh4!3HU=P8Eri)NT_Rp5o{YKn9 z@4S1v#0Z87&(z=<*vvsa^?G}wTb;W*!dvpI+AsGWY|%mOwL?HsPoU&S1UvCj6a;3M zt@i1HN~arA+5|ys7*J{8fdye7Xe)=A~^1{|u{@i%n9u-VLiQJ*3 zej$>L1CMN#Q1sR#?47&UMjOXmp`Z{Te<%F7yw&hh8cUTIDKFdMY4a(&YFkm1&LD63 zCRINMJ95L>>J7}9fMqN2Rk_Pr21dY4WXd&jSi!cvth=weONKUAw;GU{0pQt{DNf(W z;n}4QQgT^QtL%LoZMUCec4*Q4PIc(e7t57{R`KduFlN@jZAVeqeUYmiuo274Y824wSTou=c2Mqm&5HBu;w6TR7ko2XF!<0c&T)`YQMie z$C)dF)oLXSf=Ux;pjk>;eaoWO#>s284PdW`!ymGhU4>%Kuq#9u5LmHO3;^`vC9tyn zDX-SKY_B1Jy%h9X^|ApoY6IYGzy>ziz%1TmdA$uX*jRyj05Qp0$d8}p+gURm?A`4mhJ4HB zb&Qp$)SP@9p#k*`AsYS8@N}^Tq^!GxZ7br1K{mJ!jJXSNm@q8ydR1(9u<`=Ss_82I z#$f7gW_CB2v6^OhaRV2Wx?T%0Ui&_mob?xDjM_ZagFrzle?GXdDkm?vZBD| z67eXPh266J9Zey3E5)9bgoRSy*o--1N@n&Nq?XG-cS> z0UGbgy1evbCz3*}1YAOi-MAg0M!!+3es+8Tg?b!I%qw2~Vzb`khBO3R7Ue}HE9;Wp zv4e(IU6m+Oq*hIl3XzuBxuTUsYk^eKxi}|Cg%wIF{Gq%n+4f0+cV$5o3W1`ONJaz* zdBqZF#ky9*wOVlia|9)MKCf-=TkU+*p1!+xZ{MBTyM4^^Wq!H4meOSyGhkAZ-Y{l1 z85RXVrUfRo8kdDD-*AJYmPWIiC4;qsq2^(MG)!t1*J`C$Km`0~xzVdF7zFT&yZ|zQ zkLb(|3^k>&21rW|Y{IQmFo;Peb%}Rr!;oP~vCBSRObc^!hn*IsnREkq;+0CZn&DXF z)-CUIDvJymgbUg-um)7Ecn7{<34|&hu~Kel@RAir7>-tq{)G#cSlSJh`((Yh$TsZG z_HN1aJ$vJd4zh;e5Wx@2J3)p4QxO)Qs7_p(B64em8g}c-izy+l)!G%qsi_v-Go@CN zDe@h(-BnB5ssOnpb!qx`H)KOmvfj3H7s7G28*gcrwe6m{pW zyOfflM?$uMp6@%V)G6EZw&nHV;Eomzl;X18lj0K9!#$i!c)V+GvX-J>J-5#(Y0>9h zFI;K42gnu=*(WalNd3H?IHGVG6{ih3=Y++_A939Lld4fhRP21Zf)R6@Nrew#D-^ey zFIx+(Wa?6Er8Z}Buj%^i+W)L8Y?E@YJ+9Y6!lMvWp|^9Zv1xZ2$1k(LCwbcdRc;?7 zux0Du46v1%mpWd1tzh4oY(!v1UX)M!-S>WTzn{E-QgB_G**nY2&&%T(oULZk>{};o zp_L7Xy}EPjmWohtLNI{TULt9Dc_0y3U>nxi!**TXk%Z+*d;P|anMbILJ3DK|thiJ_ zso=tCnTe_n2xzg^o9{PD`XB%LyZS!h1T7?kSZu!XvMk>)msge`#ue7GTJ4BA`|69A z>@DNBZgCzoGIuI>N!~L+DTVDIfsjUubGMUkZ}k`!5~cC>=k)t3%n@s-;R z1x6=t08k-K=o-_WSF{3*0k8t7brb~{$(}dEFkknfSlmMZ0NlX5J;J1kcRG5`1P-(rHU3)h>JA*C|`+ptSaFm2OCf zJ%s+MDC-%i8s%5%$iZcVCGR?75cF(_=uw#vve`7Ou%09&Is zJ3$6s^MH;rIjgm0S&eZ82$B(d^)iM^#M@a!@oN3LpN( z5MIRP?Phry;Z_#*c0}8E0xnD0D4i?bTdmaAnU9@s{j73Jx!W2#v&`9KdGTd}Y%RUf zP)faDyDV2`z881qN_Z(d7K;pS#BOzEZ3HQhu$RD+Dmk1`u`PKXwbsOxq9?tEBvY_L z0G%%0l|kNB!ci(Yj#yCYT>(%OsnV_Jm7(J4=-t8!;`KUkYkDHl+rgH^BY}3U8c_j!0WIe)#2VTydb%OGP zw}e%*%!a3)DTX!CIZb}x#;p9B=h5vNo&gsOCJB>tPlE~sRHcYF zY#Jsty+w5wrzuclD#y2O@zud0ZI21vXnSfFwuDS>me0fYbmd%Yt!v29a+TDM(yR*s zRW$&hf`AjJvApSx-_Zn9u+KnjefVDJ(DixsBKyS79zHk zU23J>7@*3C=TI3>UQ&e;Vv!LbOey8%X|K%~Dlv?AM5!8Oh{y5{I=NDY_rxOSo=4tl z9yw}liHm4nC`$M9Sm;q0&%Q_No(rnW#RL&qzRj0|ZRZyazViFAwYX?@SGDEh?rsdN z*zfo@XF&j)7U4MU<$;)u$KixiHeP3msH1Iecx(mCA&~|^!JL4GdVan6UIDA&Rk*dg z@@e-ZNl(vt91qZKHY7VqZFhoRuv?IY5wE=^u(j*QjM*}*znN!mbg@R)6f?B%Wv#?? zi;i`*M@#EwDuye(cFT8m&Qk3HqF8{pFekTGkhJI(;cUKZ0ZD=mFwhROmeeK5Ft+h} zY=9x`cG#?fnqN)tqi`yby^N8#@A92Wr4sSZ#!Xaa9~kv6601m;9Y0#>wmZ=vC*z~Nxg0y;&2IgT5troz6 zz(W-Z&>9o8ir0vh(k}B{VZ$XbUOZQBOG(mZ0Qa^$=Y>hre17wMH`L;Y*$i^?R3^dbElwmV4xL}$6 zn5{O`%RJ+ac|Dv-&Ut-V=TrEa{i+3Td%?ms&u#;c!gw|e=NS0I0=>DrYKtlm@2p2w8&I`qJ?5g73mcPz`F$sudZ6l5)q;W zHwiaORIF5i0Hh@aCpUM|Y?qn^Rr5lSiLrwC+%^)rWbfg% zv0W^eYjQ)uASM=kqq9sb&N@RYDzzKcv|@D4SZkv)XUC{QnZU-uMgpxDW}^o2BwKlN zgNqlF@N;ajlw@@$)s~uKL@j88$D{+v@~uQ9d1+Jl+$`9`F?`V(<<>)j$|G(l==t6k zcKF@;LeFba+ZTm*xKF+x*lN~E4M7cpBneN&m;flrhe%}ST@^{Rt>MawSq++1S4vJ} z8>VKrp+<2u2y!8jN|GR1<1^Z_73X%>kYu^LflVwriz38OHr^4;W=HK4c|4Tg(-}e` zTVjv#;+>t@oKltsDLkDTd7k&U)2I>g3cc7fS`@NUZ1Q-bFxrjzh{znKo`v1;l2LJ2 zi2T@*o%uytwdo;Ma+?yk4OwtxvLq^&v*k!ic0pf2s8_=$i1dzCmlfDB)7nW?uhnFGueVZLQ+I4oFo5i*n9&=WG<_8`yAp+ja+22Vn}}d+7Ri1KJmW2QNK~4+zGVi}-dNip zT9WKZu4UT>fSJlHlRMkMbyefHUW3CEUA4HDZqsfjFryq><1P|M{mshW@Ql;leqpfg z;7)=^xM2$bmlO+0V-vrlu-%CWZ^3YwryB_MoX`lpL_mty!7{z@qBC1IcP48Sl-VsL zVRz5&90gV36#gHjRjdMB$R zYj;XSG6F;aNOnR6@0Q*b?=F*;QUEMV=B))#u=MMkYg)dRZ|`xgz3bCgEtyK5_NhO9 z&B2RY!2lizBqM-j$Zr)xx!iG;u zi1BK6^|EgkBG@w99@C(n-ia{lWiOf-3>2s)Rgwrg!zc!$C_B#=NLAo&U=kCpGtvOw z1Z+FUeb}41Texp`?-up8ljgqfd(~;Ju33y7Bm%P&Lh!g_L3H91hnHm$6;Wg{oCw={}Nj3K}RqOzoCL5WQaNd_obZ(_C2X_KCwqT0fjyUM>;j zT7A*%qE$TCENWrn2)~||JiWqBom!)uE!=Q)*IFaqCwFW!>^Ulcv>d|VjtpyqwHL1x zVY_slIycPS;e9hd`Rxz;``Nu0r|VMdElb?IP$A|BoGK%sg|NW9 z3Ks4)Hl#w8uY8$;8Bc2XR@>P7g6GsZF^Nc2K@(JGVXQSp-rnX*?tAsF6Ncpm&~t*|-HOF43%j%W zlb$VNV2igbs&^AipvKz}hKV0)>U{=K57G)eT)$_{qU=BlrW(e&rKlDQ-nBAl?#)WH z38qu^z;zW&p40#irLdBjjaiTiJ*cELMnPa%g|P->bXDfGY-M-*t|_e$YndqRPC#$F zu_Vd0Y320XW*}gbEZNIJc@pGIS~CJmzmj6xg#;>&A$RHN&fNvsPFfRboh39JL!aOewtHvg{(% zZ%7ou85HuCq9~W?;qgV0-Hr9NFgl}1@9V9Reu6?5r0`r8u?x^ZP*CpzVl23k2q~FK zA&N+pLe^4=ck6WlB_XkkoJxfWrNwh003aenp>AdE1wzCEU=!)9WlDusxLvzZ;u)4ORZScK|TFY0v#z1a8V*|pf5}6gNTF4Ls6HK8+WJ%n3 zYlOG(irIV6lgR4X$kH+jZa(2gZ@pnzW7vuWA>URp_fv|}*1Oi!E#~~f(Ih(ZJN`fl z1KK1}A|AL=fDiz_eJ~Vwe5KtPq>CX*0EQQK#p8I_S-wZMgZtJyv>5`w?5!mnY6DzS z3{(&B#PgOLY$O?=m0V4TQYytN%PG+qS2eY?Pqbo-TCH_)?z#*mdwfB$xFu>&xx1^? z8W!IUh^6hE!HdrHGGN-0Nb!z%SYDo1uoNEmwu8j+!ddZw)#IYJ-}bhPGl-e87qWVS zO4+uXMdvsT!`1V>!cB3@TJPFfmvQc^X203wZ7W%lnt6C)t}sY6`=0NaJGvFyg^@eu z)A-_j>W*P28DePzd{AKn7~tNe0(#yyKo|{BqZ9YIfkCJ3HE{9SrrBE7<3#J0q+P-0 zNi&1O%$$VHhA7u{wN)>e_md3}Z)!0&BdMylH{e`tTw#6#3yxQ-sGv)*H}_tp`jumq zX4zp#2SoviUK%d*(s)@QrzHSL1>UxU2&V;x{vnJe&zX9-_!2s zZk`v<7eDW%nf-;}#zV_46Y|Pt0S&Ha?e_(%yS|V@!F(mO9vmM^>T}Qn7?4WmXZL#N zE(O5!U=MkbfUL;PidyZe+ZB`oSQS#aOKfTd@9ny~%6kZdS7PIEkjoo^2-p#ZSMy;2 zFeJ`1i~GL5`q#XJ@QmR_hdJDgMPT73aWKB@TMx8ZNl{`0u`K{LV7D4$6EjAlp~JS) zMf0v$na(1CZgs-3Q4haarHr>#tiA)lMVm6%m!?pUB`2q9FtB(v*0O-65?BE(3r#Dj z0JN)FhE=6hfkR04S1}v&e|4>XEqlG|)7B5lhATO2jd`J#@YalHWTCBs z_nC-???^~VR-PDUkx2FCQci4A$Z1m_OS6WM6j_ z2m>Su!C`O;oLm3^8Vf=L5ChxAPZD{i>jJ|>(&4&m>cNZN0*gDy}(Au zTGWtpyOb(q0z-#YH4C6*ZC^?%g+aAD2M>TT|LWM;akNL=P}2aT`Us<9le{hF62(Ni zcifA8?%H9P?}>?zUUo0{g_kelEF|l8-~$avH$LeAh-!QROEwO|o|(iv1f|@T#afXN z9D;3oVtDn}c(#SdXca{^@QYOv9VSs48cd3ZMCM|8NktNn%Z%8fkq9+1Qs>Z_6s<(D zZD@^c$yADHgPa6TQ0fa zE;m+eukc;Ya!zWZu^+3}q|**}w9*w^RCwUwyWM1x0aHKw6YRO_WxfbUKYPf=*%gi+ z8ZjK0BoN#%b)KU{Z(J*d*tGe1t#!NVP4Jusc&%j##egapy;mW?xujLDxQJ`hZXR|x z1B3Joo4{6D_GaWYu*+(ulzDk!Z59Z2<25ASree`&owvA?uQCCj3#Cz9)nDpSd>UVc702sxFa!Y64cZ8&JlKoS@l*LQ10tF#zReql& zCQVEWyf6D&vvUUG#G2n>KYD)U`DX8QgURG{yX;o?=6kR1Ep`u403*pgm9#RJn1ZbR znqR=M7tr!n>uZF%R$PSD1Ta_OAW1(N;1>i81LD;pf2iLfHNRoMnVi~W5 za=K%ps{yB-c-yW8`?!16YXN`-w1N$lWwii?!U5}GF|>f(G-qVl=9qnzjIkzjL(_F# zy=jw6%WPHargA)Kk#(tJ){|^!nv+)J4NhbB8}4ngZQqXeD*HvI@0td+W?P!Cy$!TF zaLnk-FTVT&?Od&1ws)&I(M*6{4NP=Pv)q|*FEm_uu#3?2u*zOBE)zntr5_=aLpA}*x z2$eA1>LwwG=-5;$stAZEfw;MJ1hfReR=3zL-Gw|Ng`TB~}BM@pgPMJgmyNWi-w zdw|^mfN>@D&hxgV->mQa?pAxXIqiB~m;36zyHls{+xgYI_k0&G0#YnaEvy%aKnw;z zOE;-!V<0uc6_f11G%0qf1`M{s6DQWA4HJQG`PLLxq<858OW4#Ih?}mvf`m@$smCaR ztBDB)AUp?)NU2M^%Q*;p_2Thz9qP#isfw#`l*WA4k;PT#N~vrwud(+sTeVAk^>!^^ zE9YoHq!#j`X1b}=rKv=tr1<*Ij4bc@d|~Sff?k+ zMb36`;FD8nmBNbyvm}aAfDFh0zAy;lT7hUnBGP7O)GMlnv`Dm5H_)Dd_{u1{wNmS( z!I*2eR3z`*PRV|U)<~1q>)Fh>7T!2s6tr-?OrmFbyr^9%7GbwtZZ<>VV!TsGFbYNC z-b)vP)~_4gE-QK~y&<{UncbxhP)EWBdV;)5w$OIBWRclieY7T7m3O+Q*Vw*W8(r$9 z9njeC!1k!$lZuni#^)#Btp%oNe}o$&nPcFz2FL(l>K$*CN-3 zs|#ant-3AAge>KUY!v%?$<%Ut1nIJU@4!%gd5-J2vbZQg5T=5Q@Wf0k{Prx*)U))vOw`gVzwqKt{Aj_Kua-HUGb-kF)QVCkq08@us95i00C@f zg+-7;$my+D9eRB2U-hpTgn>;Ag$*8fKlwro5CssZ@Ijb)rA&f@5pWn9i-FvLvy7Et zwJM=45Uj29%+A7AENm5wH<)k~14_WIdjS(*Z#lN@g02)f@i+Iffth*ivj|849>4)m z#xfNFXiWpdPm6cOi?eXQI^0q!@|HHYvYJeFt$Hui8>QS@VADgpIi;-aT1PcZ+w7{! zS#xG#dgEGPv$2GQ5mIX@o9QaXysGXxu)&Kgleek9vx;{W~!RNyUk;{Z8a*k<#oM#sK1SyDY|3ETld?Idn0X{{?@gkyrK z&n&Q0zzMg4ineVm;AUO(6@{WAV`8ajE>V@Jx!}_>!U^kobBTDH^JP)H3vN5^fO_pE zYt?#4XV8f4WZzwkwhmNrN7=`E?`^lTda=CW1PLBej3!r5`W3iSXb9=oJUTH~Jvu|` zQ%Wn6(9)cUMtzp3s_Wfl&y{}nd?`~pVCM{Qi7pf=r2&FM1{mEqOB>jfa#Hl5!SW4^WCXz?4x~KFXrxDIoGB)U$0&#nR(vB z`?WqOKoOOs>*W@N02PaRoKegrCE+!a2Ze53)N7lpCf7zv3xegQ?#YfjX-0#Gvz2s> z8z$1&*K_T~fy)}`AU$`~$HLl20$doiG zZ&d|LTgjJcWHXG5RgkMi6_FIDC1IM1s1>%+YlG4jwK?i~X$z>gD2wt0+nPluWI@K} z#cdnK{r2uUp?0aAeFFpZEY`luotEX)onc0J&OBMWBPX2Rg6vf9N{aeT>#)ajs;4fX zA=j*8i~3xbvYhN(rCW4RPAH46e)jo$UeJrYIIzs&#GxB?(;)>nnZ2cG9LEDJu<25Z z6er@s9T0%tka?}ul-1W`@q|w8t!vx0RNp22JG<*ZtDUS@^?l1L3J=~rhn@Wx0<3I% zbhFMDz@`^3bGN}%1MdxsnckXdEhoofA<%YEXS()Q?ky7=Z||NuWcqp-WkXz^T3Og> zol6eZM=7)J&?FH8%XQistL=p(cc3|3Uer1s>TO^E8ECu~T7aH_n_Fi~rqKl`sj`-i ziU5e#O(a_c3&F%H1@|_>4BgBRmL!1zSi)@%ZRd&6i}u;QW4G^S!WtNTF%_>4Fzd;H zE2Aog)*AAcuEkmip*1FkOOi=)PO6mNNTqNM+;(;!*m?ss!0-?%YqE?H z%9QPx%sLE%N!SxQ7SIM{0G6L9RQJoGR+r&rHLP4BEKAsn>g`&>esA{BVkn%fo4sOD zmr;+-ukD&vtGlLIs;ZIT9U1^IU~MP>U=`3$$UW5$+a_BdJ#0Q^N0*qrP~(B^x=g(? zTXn5g?p=AQ9a^p4_By?=DxI0YtP7G!x(3F&g?p5#p|6<|2P;7$=@)W5ww$fHH7iN$ z+LMNcfa2B423r6WtrxOO5cPsoHs8TsKwHLD+1q`GYX*jermwMz2J5BY&VH9)U(GAf z7ddtsuGW|hK<^IiZ8ctUgPGG?SZ&<3+?9kw`rXmXLhl8{Qd!#joe0#KWD$`>sC^E# zGk23Gtjca;5)jwg?t9j*n-rv3Wo1P@y%m<8qLsjKfwTTjXnDc4mPypN{#O_oVN-w2STj_KX7y*Ho0Dw+Kq?H8FG{9ci0?O7sZ|jinR=>~P z?{VQry=e*FyX)k|wr}<7o}MSWCZM9(r*XxAToB{}F33s&89O*>6jsiQJ5fol2@Mbh zV!hxM)s&!FY@wZ<^g?iwTWD8fD>6bR1VEy_M@c`E060R)W?^joO~^=#*ufQD)sWp?QT={DJZT~k#=)>zFgct6 zW#TuRbF1!+lQX`NRS1d*d=-%XuObMZ)1D$(P3^in%Gnp>4yh-zAY1a>Gh%_5c)%wk0nEAI~OQb2}$sqg_9W zhEH2$94DaMS2>Oz7f{-JYAXbL9#({}n6ugHs-_{89MaMn=x#pA8IbkY0;*S;23m%Y4!6-RzjRtW17&^@oLFFE0je zHXN+SLuh%sY-5*csnqGs7g$;iUZ;O+Xtg{$Rzwt~Ta~%cZqwSc1v4%<;q36d@j}@_ zw{{qo{YDLwiW(%nIx%!r$Yd_S&U3SMxy%FwG>Hm%-@Gps$051mCv>fkBU#;ml!;rA5*y2J0)9RvJ6WKjB34qKn!gdC; zV4)==*hyAxJ8=Ud0Ei5*0nY%20azU{yIj)>0Asju!?j}di#J>ENHtdJd1k$Z4FJQ!0n0#F9SFAWr8Y&)BQS2Q zQ7eluG&NJoJgAF@a^9g!y4%RvY^QbCVmxVeqWPA40Nh~tU6*C79*5ya)&jQl>TtCiwK)?RV%HRp0!rPsH+T^mDymHmz-u#ig$Zn7;&L1ngD zkrkN2X1{O`u%KDfg%d-emMy&~lH|1+v*x$sE}+N2xeGjFZ^j#0!JWZiw)W93w7Xcb z-$m&{O;5XvahG`ytp474ZSK~1vQe0O@1Hx+{|8NgbZvSlP0~l3pU11fim1QpXvf zTV!eNe3tWik?QsK5qLvMAZw8k-$KHn*pUQ{<~g;U^boh0MI4jGjx8?Cqtdxi6pd<2 zBzU|pS-mdNEw!g5DIE6t2-Ecjxrms;9dY2v2Z> zAqs?MMJNygFbE497m$YE_hfRgT5GKMm#(m3(zV((L+xL?y_eGF z!5IGE0hBNoN=gYPLum>mL=K|#3=U(&UK3QjReFbMqvfGBEb_~Oqu&T~`+VXZ%CRIw z%E$F)ultF{MM#daD49&OhrSYpjEdqV=Lw+fL0^w8IjWhN1z)&$JT{nt&E3|4mn`v^ zYiM@kXoCks*3xtbyLF%b-gSq!?t~uukQ)G^bbuzMgXJaRWkN29mQ*%n6_!*~tK?+Z z8YLVJ1rU)4b?xRln{%eFjtHqWEA69A!z+Dv`I;?-JOtCx;T8%jtLv%OPzZdWbKq|H&CBDh|wCUX}Edb?B>)9SLL@X}!7v}33o z+iqm3?y|PJ+Y89OW>4GzZ^sn2wQ!dVhZy$avajV*4N@)3;w_f1`g{FdDh+OXbyu(L zO)GdW@b>CT0N!vQw%wbpr|a@-yL1-!Jrn31hBtnKZQFsBh9`1kDsb>_IIr_vAp=pR z5in3x&EK18^b!||B$XltH*3qj*|LDB^+O9SFgBgoQ?eqI z>t3NG1{*xD11X~b#a1g2W|Aa)NqGfe?0plD1`qN!3<6BdM)x(?igl3%7#1FH++F42 z#lbW?tS&RCF@Peli@}oIU>D|@hk2)BYFDef&8!$N7E`gE*3F&^-B@Vu4af}wq@`N0 zTK5WDUR%jg8V^9@hNdcpfi?`xGA)eR059->R#nAz!Gb|4xL4It$@8u@dv2wbJD-+y zZn<)|_9@n`x2?^>-Py^fJehBFZ|CMsmk=iHE*AjB!nD)8O4%##j@`bqIy4ss%Wkce zna$XSg~ni}udUeeEN`=c0sDcq2gmDWsEsfKexz5jtps}IIsUy44E%a<`SNXHP4nPc zGSd8l8@4}h;DwuDrTbMoZZlHGc$-&gOJrg7nA@d;*K|rq$CEvGvJ!66N@3AOZzcD{ z(5>JWlDWI3Oi9_9l>{qY`sv|Kve2-^ML-ultn~_1iJslhGg|gVt-9yUY%Eu@0(HNR zVX^DqqzGj=S?X$1L0l=Cmkz+x<)Re8x}FFL;%TA63RSk^RXEn^ltid%K`<^U6x0I;ecnIi}AuBe1EMM{Vo!m0qJ5%2&&fCeN0Aq1~ReL1~&^QVJZ!;A*?_%ke?t^i-bR zkej$ww?xB}SAO05Yx|G!pXxXE92bd}TN?!9y%>r#GB^`n8MQY!TDMUH?FERxVpM93K zl(-dY@u@q)n>Xq+r_$B8cl*VTAmQUt%h4e_r`*{s=U$iTyoXk46hd{;K^C?wr z`xI>(vsl@uJG|WOhP~GSZMPZlZFj54YA>=Zx!aCqMG?#cqpI8W7N%ZOMkkc1SOExq zd3klDU^{}_Ydf2D-Yme%UMp!){>qcyye3PgcW-V!Iy7=LamFl^NUKrdOc$%s}6C49NV(x^W_UfI=YHfTp_XDD6rZT8AK!H^2+5t8L#A^q^zy{#01S}|(a!Yb&Y+{Qr z={5gtBIK&>B3Trh$`$PsFQLd& zy~~?InY@IB5~iJUkx_&9U9*m&6;cF%0)%-diXj7ZTBTBYDz^{~CB!NSgbMEpr2?Ws z5db0V6>SVm)U*RoJn!^MmTzaxywbnsi#hjh^CW!Bxht>rRLh1(C@K&L7a%ciu{ae7 z#WR6uFz{>nu63{eer2$7Sr79JQ3pFr2(h7NaH*-bVX`0+2`;PAcAt=`92D-Q&|$z5 zLc<3sOolW`Vu+0tYv@XRc<)Jzov%w=rU+3ac53`i%bNCA_V?{y+TV7ZXDK72h?cd; zN+zPLaxuig&sy?L4LnZ>k)SZ}k(^hFWX%rYwucM!rU~7HO_)JxbO2iPP}_w!8Qbuh zB|EuScSqfp^J+H>geWNlL?VD7Nlu!INUc!Pu8LTzD6$BymBpE%wI~3pG3QbUg;pyu zd#P`7T=-gs=A5p{noc{t`%XaHwHG0X;s60-BZiJbCZ()Fu_&x3GGGIXqR}B??Yfo9 zXl$tv0X_647H)2=131nz$`7`599lFBIvHgh~vzuhL?LV6%XtJvi( z*NQ#>Y`HUl;1LPIM>OcYW20%WC@p#F6 z@!0lvUg2R(zC3nY6>XwyW(7Pj#(O^XQru<$dmAWits83^l_2XpX;223W?3*DDY2fts#-Bp;pwH@3jhl1sVHM| z$Vme%6xtXL07C(cmxaoLHD$=HtKGAZ)SXxDGkEFr%&oP^oq+Bne{F%Lb+Nd2zT{-EC|z@#ANc z2;>qh1tNpu=BGPmuhz_EzEIJ;TR+f0+eXF$oxDt0eg^f*-MYF=+G^fl)ZnsNdw5gw z+DjH2PC`Oi(aMT?ZFxbRZ=rRBUGBBQ!%7iLZc-NRu+VB90hK}=Zxa$;d2T!!@p#e6 znWniT5f`-*u%?&cb0n0I?ZiN_b|X1U935~ILrds-=RFkFW)k7Vie&kA?k>yrJ z>UDwSB~a=pq*RcC!Xm|zm|?Tfv>LEhJ5ytCK8EDyc9Xkm|FLq>kWYDfYHrfxW*_<5 z1MT%YFqST_001o#fFPg(5JK{Gd67-ElToEG_uPg8?Gv^wcVSxCIPVcV3?3MWg_^)r zn>CEFV!|L&i!@<}EkjKJk+M{%r)<@|^ZiZr59B-jY5zXKa(EoHO=j%s&+TfxA3dUP z^`*b*2T#p0xkOStgK({rBtgRTj>02+M)qIqq+?nBYUEXFm!=h1`g;;BJ z#^|WttRx`>rEFAUZRj$*6i9F^lkw`|^h8D!a2!IT6DM6z zXfdl?y}?{kIj6B(sy02;&209j(=NC-Kv$d_`dv$J+adTVJu{j`aJOd0yfqzDy^+f{ zgT4T=5ZAMn4D~X|nlyV;QEr5+`c`oYE#Ix`4z1PNxU;5rUpJC0+-W(dC7APmH)o%p zzkU1G^sYv-#kFr*n~J8feaoUA!q{eI(#@MAOWTH;f!SfwoA;pFd10##RuaSn&|LUp zAQa}C55nrwhmr&UQCwm%jljvW+v+Yi-c7rEJ8-D=TWfCYfWW`J})iAaJ~Z!O7GQ3ODN*N%aZq&qf&1zuxC z0iYm+JB&A`3#ejRTVH*j%e+A3^*kXAB*_<9+w5gyR*1FQr|r6cAS?{iqObvlH)`n@ zM%UVcG=OoU4DuH9W1KB!F)I)(5|pb-vN2mJB}V7nL!iyO6ToCa0ryr`_g1#6l5C7n zaixXiv;~0GcNR)O!x(~n(gQXo##p5S5a5Ois0{X1&1vXvyG&C7uiI$zti4`2$eqq1 zxhJ>LJ>zm^Jsrz-7lPR=do$a0V}0vvCrO$mrLPc5=(@MOyWd%WNQs%XyJ@DjT1GCW z%*6 zx~fY`ma$!zDul93G8B2083houBr8>^Mu`MUt5*x&09dwmH_2<3$+e$;Qcmg(J00LA9a2LT~U@U-%@E*9j1La`2=urUUbg=F8Kpq+NHZZ7?Q6?k9OQ!v=um+a^h()KbuaVU&)Np|Tulp&gmuY-mZ%*^cuN zJY^muS13_c(#1o~m%a558iT4`DoKtK*pcuvjo2pI|2O}dCOqYiTAtE8@uysy0F&6eKzlt*~K9M0s;se0017~f@lD# zXj2+TqvXy6ATGo%XK2+<8C%&*FrYX_EZ(e7hHbhXJ6~ zst)zJF zxg>Nan*}deEJ?gZU6NuknXy$Xtg#$6kFKWxnWhDBE%F{{FQotiWm#1#0xU!=iU0$S z!5DAV#;zOydKsqxD^}jDRsmep;sG0bZ+)lF)zuUv!LF2hhpDNPFW*w%>pP#dRcdJg z)UBj-7-+BAsL;CUxk}PUC3&R*vg<1SOo^`il9C(Ja#87rCp;_xYT2!F1HhpIFu*9; zB8uI1+mT#b(nO_R)}Gm#0xuL#;bkhCLfy^fuDkX%dik5WJl5Cb+$DRSn>iR7zY$eNPOVFx54Nx|0DyvIQZo3IPS*G6nGJuV<9II_<8!W_aWzs_d_I9pS zShq`+w?moq>J^vy9ap`b z-r3g~-6Tp?38ju(fsm-u^Cfh4q@LuKOsZ>ARfs?QF06=h*GZg|e0{0>(h@ z0cbKTG)vPS_O>h8wQtY-oQI#ThkJdpnaTChZ>i1bVtuQN?zkm;UGfAV6_r>Ov#;(F zS5=)+uD%mBIJ0*oP=l7KXo1{UB*_Y|E z6lW*`gLrvy2cBL#g+_-6ytnFZ9J?;#MfM4M^H`j)rf1Pnc)eUPm4#6(qAeem73#AclKifBwRDwZy4^Uar60juzP(ZK0 zTJc$us2|YEfm_ z0eirvM_uj}Wm!4bF=pjV_CjeU{oL#gz}b{#2OMvd43#at)uarTMX5SoU{&RZ3M# zX{O%V+@A9px0e!hb|JA!66ILyeSF(Gc~haL0`0 z7qHq|n0BoxX-rD%xm&&B9+lSB~{^xm=AwJ2fb$|A%PMakix*zndMt2)v~T zo<}dXuOnHxd{4E@F-3AhZ(ySkae^ z6$b*DU5Pj=id0tuL{g1PjT{F6)JANVsouos?#Aoc*R-`Qrn_0M-tAV|B2Y1Gr8HiFDjTbftbivw zbEspU?pq$a#vZrZD4FZFJL~!FVXLQC+VyJD3G0?`D#_iNm7^n>AX*Y&?-n^SD52aE zVP^v8YAx2M*A;JnuD|sgpTz}dN-oqPSwY)DJ0Et1fs4F863^JPJb-~OIZU7!O)T@k z^U44+PfQR;0%}19=(FhP76SuhI6jzBQ%IX!vIF0nMx-P?w?!yxTl1uQ^!>@_#|-Cs zsaNZFHf{21rsP0mj|K7=P65@C>y(;~N>u5ctN=5ZE^~IOAnY(s}vpv;E zg!(SqzBW0v&y;(csOqyKYtDQ3+5#{ySy#0v6R3bo8^HTkFKM>#tTyCno7J0bwVKDQ zYEH8Zz5`fE7`v-m_0EM&V$fcgU#xaZjms^qp1intlFsGy{#0M<_xADk|9^bHZ}$Dt zceNEl%P@KiI=4G>ucu3Xs9E!Q)mx^MHkLMZ+AA;8CQ-0(EIEn>7SBAt3@To-7ap$_ zFi*X76k^GOEyfT|J3q?a%myXcZ+&Nh zAq_xU;LU0xh}Y;WFLqr81`Y!Z7+_I@S!Tu$L(=0+*mYUJ48p7FE3}qYE;pdqF~AcC zo52=qv3&Nxvd}VUApi(KtA*}>s@0&ej8#>hRy}63N=2QeRGYWF-QoVWq`j^aD!bMO zb*s#ll=WpEKKQIna*_xpm{?q~PSh*d0-?3puB4UnTqR|=ge=R93+OQmVr&Be#shG4 zfY+!8)RWiVAbgi$ShDZb!q^P!+r2a~(%Y7mNMs+!rS2$LM%vNZA|2HdI?$|H%V>_9%_fRoA{DI_q;5uh}Fwdo7Vb{ zmKlr2Nm~~}R8p&cVeE{Om02JLL0ijCW|nD*lwD3l=evZWSe8dJfSOH~ws@jC;Gq+1 zbs@wV3nf`TLbekJt*v{hbSsozrvOC?*{uo_sc|ah>_&;Glq6-TVI`@f2*1ig@~W#s z*KVaMA?Wfdy9#;4)x`)Rf}&F|LgFYe#sTO%L@le;)O%g&3V#3gH@uBK97~7P$=*z# zr`7h_YVWW1SqF^@tJ-U|T0m}9BODRxwbCw}y=jm6*?Te>c75;NI(Bs12jB8UDXXt- zwa@OPZ#b*hqcU4bq$@3oNDQL7YB#`RWWZZ?ZUxmj0cs zkyux_kR|%8tEKr{-^P*mHMeoA5lF<)5=%cE{vxC%@}9P2iv85XY>kWG0AruqinjD4 z8E78kdVSyE5PQmJp2dpk00gDZ4aP0Io$dAYN$=g;H&bu**z>vO^}WrvoawdzSeqFF z93>2(8m%lP0_m#M`y`Th)uBUMT|T$XsvNs2gmAm>u#9KKNGF{)aCz~VI|(&-FM);m zyZZKQ*oI<~-IvWJWSeoh1PO}}qzDBetnk_iPhztS?|BzXd1$F5e!X_3_MOd`nMtj& zlDASAFuB#HX%QC|!>@ROr8XRfHhy1RS5 zfMRuxId!%LRo}Q|0f4~`^2KUn<()@e5Nt6GYg(D5e>Y8l<=(=8EPZ=T?G;#Jy zZsmH9othh}BzN^rb4tGEwEJD}H{Q?h-+y8M`49GA-~9VNr(HF7x5{i$xQg0Ff|EB_ zT2{MgZ`6lpp(lB5-gcp+B_bNGTezPN>QI7|-z;uk0G`Nn2cAVSdjV2eFzqd3MA)D> zk&4o;ygC8eZ0g!cyd?+T7IpyWEnS9LQ$=8O!J%G(2fmwU1q%d zI`3F-`3*}}Y^$Gsq<3M~x~%11bK48fUX#1qw{FKf+WM@|+lJnUJGZpl+jh6cKEG|v zNym#FRWdEQ{^^}-=`AA?3xrZe2yc9%bh`xYc1nf1P-S*m?MudyO3hYIWPF`P0us#y z4gnEsdMSgh_42{A+)#$1jx5^BBy1qwcH<3EMRBE+YODYj)#I{MTT!yZCeRn8Qg;o9TKpDpX$w?5 zxRha|MF7SG39J|MT-SITBX(yg8NrrR2+j;7;UUe>UVu%hQ~!#jn|QSNkq!NeCue zv)PDs{2c4nmL?P%OB>yr_^N9?mZ5HTI4V9o@F)tn1aZGg#w_^0zG1`oGuWTtPBU}0 zYz^ZC0Aj7)j9`>p$&+s(>7$4g4NM z8>bcvh=RKcZ{*w+w-q4WjBsDJ@d94pOXeA=!&?^O3!8vLZ_7~7bx)=5&cmy)q(i=D z^FCnXEyDNQd#CTsX{QKdhtq4X)zn(GO{&}KC?P9N&W2IiUb-CPU9?@l&*_sQAf#{_ z9{YBfXErQZt?q)`ZBgrZMtTNNn7FmtZ0#`V1*zi(ieMmQ>8g)7Atmn0-~$et1Ipg% zurKt|g)K4(V<6QM?-|Th#^%h`m%3|7_hmJUD>y;Zh(IGaUd&!8E1_jeu?88QZV zJKgncHF&w(j_E>TCEc|(UKwLq)^!E|Oh{(-j(}Eap`{4W=~)&B#sHudm}MF+z^YK} zE4Z1w-<^8$iS{+sbhhb6* zV>cUPPvSSZ+m60EJ6yKKzgA1n%-Fv5g&DK5#?D)v|@CzmJBx>oL8zq?yo?`AEDA!ls%|857jn57Z& zM%+=-ib&Uso4rCbEE(=>KO6C`Fgcy7GPo7<&( z+gpSRqN&oaVuyOT^%lo@Bav~V7S)6y9V<&HYZVlwEXrCPy=7&&xG`xxiU<)kr@Suj z8n@~yORp77l?v|*XHJNcPAD%ag;S~$dR?XCy7N-CQd_w$tgiy4P?ADXLZ$#pkpmH= zQ@5#Bx>Rd6R-u(_x``JWoyytf3)qsbGr>iwM zGdNnJ7R=-CNFjTvEv&JCkXkhqp|;so?sMI13XqAK&Vd!4w!(@Aw#-+eft-oO<#why zLmV=r@Q6HhSQd!6i6_7?$*d2v3S{pQ9UFG8XGS~2!Vli%1`!>YQHSu*9$@krbdQih zIO+R$PkUeM`c$RFwMf2wTSjkcb%#1|1^@>j5G53GQL(8GO81mvRZ*nMsD7}ZEUEwk zjk2?=_~KcuctgZ$yu5ZpjMpyn`6BR?`EKQBXA}^_qLjN9&;vx~tz$D^WW= zF=)l2q_K>^%IgBVS}C@E<<=DsOLuuI!87OVUMw4tho4hfmVxQpUV42OMjVxsS)OU{Nt(OcOZAGA z?oP3ZDq9BIF13!NZj>S7v_Lo{DtNm5lP?6X0yow6f6n{2D}JZz4)9%>uG?m#VM zqtffOyuicQ^{y#IKnyTixd4f-4(^?ItdqU-mfxrTUdn8d0SmZd413Mdb*%HzJ&IKa+tI;58{A-Y@?Imog|G}SR=V`Y@6OhX-oWB!zg9yyJuZ?~ zLSWN_h0qp&WYG2wnq?V_foC|tn&TZ9^8&oJnAnvm00u4WTHfD%owN_Wm*1(=OG{Is zR76RFjkFc48F@g`aubxhdXVh5g1#^rjg6Wfh6MM@1)k@*W_G;>7ll^5P?H{0^V@2} zv+^jm%^lMYuDFqn`7?XA!=A~yRqM4@b_W*>=C}6TZjn8Ad%bAoH;mO*a==~N^jm8y zy=J~&Vb+2ZNOSqL8movKMomqVkv|Mz}>3ew1n%CZEaK!G7BW+{2Uu@i33q(a8Z zA|kRbkVS;IxX(k0W%au=tBuya(2j3ZrH^>(AVbCX_S zqY%`6$c`FR00Jy32nEH$){&VTN;4FtGzAuP$}W5 zNAgmr$x#EkMBduz&^7k<&2=CIh$^pMB~kCADgu}?vLdCb+O&e&DitiN6jm$RSTgIh zT)*D?d3#%LZR>od^LFo*eRjR6ANS6$troUh_r<>HN-GVL29U+g6{?V~tPN{pO|crw zT2AJ3>Zxb@{kiwP*T;IsbhYN&zV-Rwp1U5h@VG|3zP)9=?`h18J23M>RO3ypAwYo9q6o6bTdTKSPbFcX$F(WV0GmC38uoelM#TCmuQhj( zdTGwvcQ)&rmoy1)?I)IZ&dM#%|gbr}@s%^z&6eat3 z+pR|nMB8SUexv)|U0^O>#9iwSt$bKe;*fYmKnOez0C>HN-7ej5uN|}r=8lzVezZ#h zpzFys?S#wV^A)EzHn*A(n4@vcu?aVNnu@K0W8WuUD;J7-R!h{5V{`38L{r zE|48yMdOJJF5baC*Yp0YA9CG0uJXjiW{1>Vn2mVNlW00@Inxl5Hu89YHNa7W4QW*> zNr75@&7c(mN$}WOFabaU%p3NupHw<3LZ}YNnl}%Z0SL%rYt^E+5li}boYbX@S7Qkf zDVmm~s=U;D%eQYlcJgIo7bMBE{mf@CY4r_z;cRB_N*m06G|E>vYQgI;Z8RGgQkG%J znvtZ&J=1Fgxlm6J84JS##s(a-hPr;GbGB9qOL-A5C|E6C1&|lDde<(l)e1 zLEy+@jIHHnN8_9Tcj&HafTo~TnX;Ao^7&HL_w{M_TZjtM@WDf`)hb$MtGrv@8doLr zdL{z;Mh0^X<8=w^EhMXTYY_oUGFuu;xz(FNHdJE<jil6rKPL6SB#t=y-@ zY-`?J%JiGy5&N2yQkuGuUWpVDS6!q9OVl~Vwd;_r-b7MK;>zmXDxG@EN|c*Rxvb<& z^_KDS0K1k&Nm%iD^wey}BJF}WYjj&z?Oc|-UbnULhGwOv)P~1u9|4M@cobbPOOOy+ zixOZcjk3BN1ZwAYWi6tm&Pd{Yr^MD#K_nr|w+fPOg^P5-jzkfJQs+*N@T9J7x{3+~ zmE@=uRqvcgfvi*)g^~^{9?!`^~m3pR1f`T5GPy$}92h^D$33 zRuXOXwcj>7p|EKMRKV6=mDZ}Ussb!9tGSe|&*!n%_L1#2%fysQyi`%@@9Vqq|pRjk>hPTh3ul5SfJO~_Y zN*ATgot&r?pkKQjw034bZUe-kCJ>fH=Yu{xaGIDnCP2znn%j1iSwU+gBwZ~$iMHkc zD4_{qAR0*U7BB|5oQCC=alWl{@8jO*->#>k?OxB@+793QO(pr_3LvpWkYTWcg;IbO z#HL80sXEl<}aMXJ3hBiL46-+rDdhKO9ww(E5tzCyO63;; zVOL+9g-fe-`Z`0SYI?=*#%=>ZvRxPUnil1oeVy4-_mbJpnoU}QyQ3FpCDU>lX252@ zV(nK*_S*Em=q`Y=jH|m%cuQw_O})!6m0%i(uQ?F4RJ0ff1(pGjFIX6~nE7C{ui3K~ zefq1b%u5vp^8wn|wqF%-=kM?1@8-LUJ@VGBWjMGT9;Re30}xsXQw*un$2}wg&=cj7 zjV&-hTB2Y>z+4%X1q`Yb07hUy)n4WJj#O4uIeO8)Rl@O5X2TG9vyhWWYr6Lu_e~$@ z-tSJ9$zI9wdww3~>Kdp4(hy{pN+OmF^Oi5%3ot~qXQ#!;hJiFYEE^XX+j|%7rI1;n zsoERBHpKAjKQ)iLn`Nuy7E;}nqy_IFfK!l3YXL2Qo8|@+(DD+QJG6`itcDf<_rMqe zESRQTCO_1xJ@)hMS$1>MmK&0j&u`ziZJ(=i0yvYaG`3#8r5>;AR%a`FtpSCt#;mG5 zA4qP~V8bO@!gY*VT-@fc8AHroUM$q+sRr&b39NM4mN~?nIbJZlFux2NF}!2J-MBVC zVBE!esSPVt+X7}a*r0Fs4AZc?r98Rm`n+wXJ)f<0xi!EtZL+dj<#spc%z+h1KRXr! z9Ns8IK*OXL7#EeH=F(XTTV}D8>9vYY;T(_Zm*b=&5j}RQ)r+z?UX((jvMjP&7Lydr zH?V6lR;-oEP z6+t9*)u_CEL|)%p3RVwTG416Bwd&ivzx2ku_q%7=T_0iJcK3QCul=}OeSGj?v+Ws#RdC<-=`=T^@9k%9uT`mO zW!HCGb;*2OSbhadE2|@|Nxp>O)U@1TB4^Y{jZ zy8_`Mwp&idNhfI`NGyf`RVp>Rc9;DrD{>}H2mvq4W(6?dm>4nOb@76!=Wg7%U_FGXUqie?kJ8b>offuI z6xF7XJ!_?DUhFK&)lycX*}OO&ns-7O_8NmI^fq95px=cQ;J&kf7jmyrMd(UqqcBR6 zi|k7Mey*Ap;tENRU8|waa&@D$8od_V2bInU;BvP}U}g`MO85eRVe`9%a2Q;KTqQtT zb*(j))Y4nOVIEwEx(TKw_tV#jiEiCYgX>md{1-DTzl^h$`bArSbq=q3J?M;$4N=%@ zL)4K&0S^OE5q>FnTTV#;z_#MW-FDw39Tgz%~ z;7v7L)5=#c*ahm=NW8tKGL*i4Yh2|=&z4Z#a`!3 zIBmzT(Ce^a2H!3T!03>==)K7FtRYvv| zD65r@(x`q}VFbM%mslV`^}2D59XnXj^`sNdu(E6Y5fx(aGlV6?6s3U;xCV1(Bdk%E;JDhj{e z6jD3p^HrYix~71{DwJ*&C@FHQDFD=&Na6LUPnWlMhdtIFV)g78SlO@Fes;5-+sA$r z*4telO27Wr-Lxn5-a-$p+3l{|*bBW6#b1ftOcjnfE4}_fEV)w{p#U`}?hrmMj`Iwb0R}Kw?TmLj`78A&fgYzy~z+v3Ot& zhL&Z*4a>KlmowT~(nWnz%&!3i?CdE=-KKG6c@%XYo>tRs?F;g)bXl)bjkH>9FT{|> zOJf=x|?g?Cr4qJ2AEx_NaVg)wQJwaV^K1N zOX+Usu4BuYm;7qHEv~zSq{q&5AldG#yBn^lJ7e?i-LVfSjvZuJTONXVty_A^G3^C( zJxzOsH5MSd@$d}t(e1J!>6v#3X&v`qEdn5_ha@>AU7NEvtFyPkn!_4hYrn+-iTvRo#EAL?FWi?!^|cMF`Kbxq(R11(3(3t0s>U&MCp(aLLw1ZU8C8m z{q0cs`IAW<7|!5Y@3kEHI`bW z#l`>~O4wEnqBP3n63lOXI(Y$^0F>@+vzs&AJ7YQqsm@b%A#DZ)EMjS6ND6wJEX%rj zJ)iA64=3-u&U{-&ul4!*{qA9{l{T$q>LKjSRSdSgS@*z9Pcg?^NjH0w1Yn@O7y!hX z5a?i<04m6SvH*g?6r9aMu6OMYQEn|O2pAYzKxh#2LaRl+h%tu&O%t#-2(t_fGfdf4 z6_FV9kwGVsdwtNd~_1o7v zxXEsZ8rwJ}CgJ^>H`Zju3c(iHwMYPwx|O7?b+@9Rx4SHn-m(iCK@@1GpmsN8L#GBU zLKGr-J=4C2p~ZdHrb)Ft3-6+5r>JFP(e)z2s{#w`g1grvRV}n`RYygbAI1m$$k&hY6%LTB}dz~w`IXDU+my}@$>7; zFo0SX0-6A{&?086Af#*7E31jMQ+v8kE7IBOx3>Cq@0Bm@hxM+hX6t!AzMeDN>l+gQ zajnmG8IX@l_wq{B1eX}a)lt^+WO-HKvRCuE-+sQgtL^T~-aFn8;p(Sj_DS~}dgF@U zxLf*yG{}S3J`l-AYsN%%ktAkGUOSVrgLja`B#Xz#di% zT1`NkCel)yA_(5m(!g$}-Auo?yV*)wTfS}K!_V8K&I|Ac%vSYIYAK{yQBkByQI%zN zDO8H=s1)xyG=8Y-^^Bqd4@JaAC~O59osEtt&)d!3!BUCWuDd>cem(W@P1m!yv5j#V ziCnwlEKG418L}P@35MDUycMicJh^%ojFr}N2&^Q<9+v?_TbX|KbM!j1p1Y5Wc1h^Y zmd3$qzS&XhJ$%tva<;toOJrS14MeisH|*i=ZtaM~vJO6!hQ`_L9flY32C%_6Tnz-!8uR4pRI zh7P~j_3T?$_A^U*^|o;?n`aEe3lCbHWjTlWk>}pKT#4c6vZ!m#nbLWl|HAHI9Y~V^O9Xo}wy$?9rgX=2llNr|nfP&jf-^TJS%GK`LM?SN&_V;u3 zyZ6gFk0-(ky>44{FnWPkFTZREahu4@Js2j|5TU$~1VS)VOmrF=>Aut#%(mDv62q$q zAZP%%r*jpJ+ym+W9RhoKs-`z*4 zX>aSKo^!rE{FKkS>;fnixW0l(_RP4NNR-aBEZ1NmS7Um&%=%dY02>b`&_lK_`Z7!2$!7EX#`IygIM*BjwBu`|{Y0ajt z)L4S#W`eTqY_V*x^;Q5G2W)TzdXWJD{nndV0U#T*F1rPCmS5WtieddUaETuGD%{w+ z#OQJi)N1OcZ{>_Zq38nW`m^fWa4xAmw|iUfz8Z^jn+R(OwdLtq7j9o&jE76JrH|fw zX)AXS)>_(jgo+&$yB??4RTwr!0ohGyILkDG#J3})IJ?9WrHRdVT&u|%J=w{UHx&bT zODwV#IXOX_SQm$;rr^=EnV|@waY*ojsePJQ6NTL=G2ZBa5%1kys(nuNQd#ooech5& z1sq*@9aW}dSD;f?QArTkb&@5-s=Dau=%S8bu3Q+kx|S{l(*<-i0#qfCngV3aJ1N^~ z+X1B*9;C%k&Ng=x?c2vzack>MW=*<0uaujQv}?`nl*78%<@0K{+FV5vX0fWYP%)qd z)&grqF*EGGoo#ATuF^|ui&AEH%GdI(e$Gb{JZd((l~>`?;F^8O*C+qZD50wTn%nX) zYOzn2sFQZJ5+$Lo&u={SV#14QdU=I2n zg2!a(5~xBRfyx${Vc%t+;aI_Ic|G|(KuAY+joKvNUETIf8USbp00Pv!z`~Y>Kn>Cs z`qabpvD;mnR7Z(*ZyikI5pe;qp_N_Bs`hH60O)i|r<*Dw#2})lO7*6EYB#HrQel)v zQP!&Rg5EI}X;jBn+p!@?aUTHHNoVghS1&H^@>lP3Q4Zb;DXUVHRQp(n&}Vj&UhK0J z-}Y%2bECN|RJ^d=$5)E3m$bX2dSA)Kq(aI&F0)ueQCqFBSH*cn_Ia0bi*RadPhpr1 zqpsOX5ux`fQF79#$>H<)XCE@IW*j#eAPFn9)}Dk<03RbMxTQk`&7LoXuxG9I@L28I z9_RY?cAm}6J`cA&=~}kcHrH$sefBM5^_rEK3y4=ySQ?2fFfH7a=jp99x`DxJJ6*Q) z5CIMV+0L5Tpl^2!S$WL^TF=(Y%gWZ>0x)({X(cJS5j$J!Op7`U1Q#%GK$^PuYI`je z$J<+DoyX{<)ijv1Avw9Vx4n+UMIouBuC^Zg%pHE)<4J}BvKp|1ZQaF+;K*hSh5^Pi zcn2?a(-i>ZLx3)LDl#Xg?&>a>?v$K#`c3tixkT~C8eH=4>n&rmI+cVJh>!pr0B*mH zdE>bx>K#!l@5Ls2ktkToT`Cu+=J93%fELyQ4=h1FMA(bCdU>9B@~q7U+x*tMm);n& zZ5u-b*V_JG@3Koxu{7B2tyDlRZe5b(aHzLT&%=`IeXK{RWO7~oaIVYG_ROudAbmBa zY_-bS_88`^Q%me3D^%U~vl!50v9d8^1s10VAYwR#D$o$4maq4E3p7i~cL84AS4FfZ zx4olvKnp-XE3^PF1Opf_v~V2(Xwlkhv9-sgSr*FJv3u!O-&&;gtv!+hn)6f0f z6xM9on_BC2Pbpni>dP{pU2pUX%SD>urszD=Dt&JS?mH=7M(>Ta9P|M7xyBG zN!4%Bu3$w`v%txU#55K%R6p|n$D;$WBYMiv1E=;7-)dNH>vkmzGA66vIlK(#&9nNQ zf*FZcXqTYH_fgo^8r6txXA6*u@Ya{msj+MBOdU6IOHv{_;t^F+qcVkV;$7jyN_B~X zD$1_ZI#5cdI;C`}qRJ|DD=VYqbthP&qXMols&%@+Q_6ziaG*J_-fgRIC`CzWDyOyG z6qE1n^Y$j^wx=`OCL1@ma_7znmtu!pFn4ZshERdcg%$!TWPlc0gjx&OZ@c!bhN_g* zU1d{p>RDUm;akd*>C}$SZo9r)Vz+?4*vHZpp2%c<%}oqMIZr^lYtyZxj>5BDl~-~x z;`h7$`-k`6A5h>h-x&=1e7pX+`{8?ta`eq|mzwW{%3eg2#o4t?Y?ce%u)*0}@ebok zr=hJN$B0;5N86Hj`Bi>_@9aH);r-mNWr%cx0i&P+*!-{zmMu_P%DULJo{DA5l82;3 zZr2u|l_00p9b6%}g;p{H)sa;Zkrkl`MD&Q>Dk!hr^>I5-icnF=vRRh#BK9yZVvHY} zm11%?^-5j!YD*=i6cx;BMUW6P>}D`+np>_B0US)iV`%Kw zB`=N6mS&Jd#k!VjGMS?|+!SMg?N)&it+4FT(|}OS^i+(I72k|WgNGLoLDVF}55ksB z-gG~7_ji$Ta3{l;OC}5EnoM8q`_cB1rSrBz00h7fKh7_>fFOw!o3k=(1`z_#6-tVQ z{eu=#Rb-~MI1pM@TT6Ls=8b!P^4=uZ*)iC9_nN6x-MyO^L{fcw_V%u%hNNYX#&uY8 zRc21F%UViuk`OE;Yae{5v~q6OmG(;c<~@5?m*QC4wwAI}psZf4$mAn?YiiW0_gNbq z^bYk72zCx4LV7^g-6k9t?xn&#kKbCDN?Y%fjS5y(7Brry`yRJz)n6N(<*i>(>8?J`ik052DV)6L zM}4ig`nrB}Kh&4vAz$@wmzLb_9GO&XNxym%hG)@XW^YF?1z3tD!PJ1t4TO~*oak16 zt5>^2eq87IDqTS~A>fx^1AZ4h)G?ls_V)dp!2tK7S!T>=l5b%v*W5KtT6ej1Gj~~! zUiC`pY`S{g0%X=ukag`vvXi&6&SVQ>=Q0WPMkLF+P!vKSVs^WA0-+MFDAkLVKGTj3 z<546-&mB9eM{TIG@0489%4 zr*A*EzBk!t-X7Ow)~)Tvw_Wv^nbX4BSU`)1b}fToMU25zG)sDQl~QYNC6`gT%Wiwy zhH%=#+@5@YEp9a=x+l4xu}}jOT2guBIt~J)$_{Hnbs7hl<%k=&^;*%Y*2=c?)poBy zUhr<<>1VFTc@NN>d*}!gqjXhu2xl0fpl=71qlE59m#)MnW$%J@0}2U=r#xe^mUrJD zdt)6Ptq#LNchJhL#sYwRh_q%Mhct`PG`*K@nlXhu2VX=1E*4b=jGS^W((^p?|JmU+u z_wHGn7vIF9Ls$X7=o*~M&bC#=72=ajTQ=f)_N|{(zqESBs0Etn82m*o&A8)@my>t`X)7!VQwJCFztNnELHYMW@emB>Ma^?3{xsu#k z^JrLlfCtm97Z_8;%WPX^8$(`UEepq5_2%CIQrwLUd+LQ^nFOWgVKA-b{K=i)G3dow z2Wd54$nE?(b9#H-4`8)g3C;^OakWdlsYbVfUw1-xd3DP{4PLDlSN5`Ud-blXt-H6D zE?2&&YoG1yNeh;+_L{Axr9QUJ48bihI?9uRmAMbKf?kSg!47Kx@Wn#5z32gT#pxnz zS4^#7&+aty#VBfO+|bkZIb0}bUO1U3eJ<=<7QrN4w<2stza%-dL|84 zax{(B*;}_4Sd#2~wyW@_wVk272DrdPEPqP?ZnR@BuRI+*b)y%OFC@EWteE!;RQa;}H+@V=4W z=gktjnS$6sO;5LG4DNz(pa!5YmCl&~}gN zv9p^{td}XFoj#{bQTl;fz1SeGb8JX$FTc47%v@q_u2bCuPZfs?tL(Aw&CfvKCY*i zyO)xcm32kQ$&PLu(IT{f%4Vft0Aul3tGgDVFlOD|LyeWbZDUWCnikjhZDdrid2Dar z^SLdPS74cvWOabWS4|T5GKHK|*(6Fs&AHXJCf@_U`^J0vB2d~x7LV~9 zt3elU`6EN}5BgTnU`%NSE$BftH**(XZPQrNoF1^%PV$-W0kb5u_5yNKv!T_lqr9m~ zQq8eSRdh*5ULvYf9+&Gn^}0m5At1b{gu=M!(FKpUyOwUqkjBfSSzg}kvw7}rA4h!( zS;k35$sNVwqNrXNg%n-y#Euuilp$0un-+Fonm2$qdXXizm07qim)NW3d7cV??d?7J zb7|M#?V@u-wi0O@R&$G!)hjSZZefWNWb$aD$GbAzk!D%NC!ERv0LF7Fvc+jKCpH}5 zKng{aG{%E$UAjPgfWXB2Uhm?nZ)YF3YcorsG`(4S@3>iHlw0U)TjHzUUiW5eAwZ~A zUykjCsW8m;T0_U$Q<<)@PE{(6ho##R-txx4bxQ{$SP6hzA%^;+*6Ox-FJ>MGST9qX zo4vVh<#Q(LtJ@I^d)pgmcC&?+&Va|;%1zD1w%yvrQqzF2(6Cpl#FJyQ0mJ+>PkM{a zhE|s~$Z8Boqx+j%YqJ~zFj$73&18WM#~5Bf-bP0N92Em~O@9D1n`JsM+;Aq5I_a=M zsL>dD?|r)t1H%gDH^3MeZITN32{5H3l#Yi81Q34Yc&)%g@Saks{@t9@&R4D(fJ;hB zkf|^Rn592Ab}R zt-4#T*SCikblC1(X)uI7?4)(M7j`DCf)cV@ZQ_UBOezTf9|7O!=GmY=6bePvp$V(%xat)F<88naGM8)FvGYVo)< z2xFjzYr(z1!0uhE$t`WO)ursp&OO~LMVn0MrkJ|PWa~56W@v7dqt3z_k(q=Pqqw8b z3Voogj$|R^z|C&ffgJAB)9(8IrnCF`p26#}gx@iskCwfoor33(2nbe%(_*xRCG@l9 z7KR4bv#~lZrw`&{4gr8v@Ah6~9v}TK9`KrUb{Ip#p3E#qk3BCrU?>6TSd;e#JZ&yj z7UX)xbNB6;d!K%5aZz^+un=aG&_V^v6pN_~P!wM6>WE5~8{j2ssje;0CFl}mh@lL{ z4c-!p)ORs9Oeor1iVh0K8)e+sZTow3;wy}@<8H^Hgg7a~Q7g;IP$_aBEeqjU48p8z zv-$Exy!DH+fb{!zU1;f6^F7D2`#vFWTRn8;&I-ecEv-GYCJl4dY}iA!HG_h4?_LBC za}TSnVkMg7#G3T(x*xfaq8D7!t2B%}Fhjf$00^cro@A65fY07aVmQ6$eD6K?+L9%` z+Ro-~U0rI(PWE1Vt&Qc|jEP{w__80g#$Ie`3XLE3&fO&o;FIB-T(#$G+Y7>SRI$M3h8(YfOKmHtqi=2P;T4nxHruuwql5osdjeY`;Ic6OknV< z>Q-1`ur?)W;4KYoK}(S1=K9<{s#%j0G_|xh*Y%m_eCp1bsXnuxVSVh3Nh3SEA_T!*0CgV zQFVJeTa!zXd?l#+E z9#eVq8<;Izu%tIz7%yw_5Xg;f4}vk-wvP6y9iXldtx6MJLu+B9v9nDugtU6cfaY1- z+k&?=vW_f7xcYJOw%fY!I>GqL5<*qGVkkpdl=gO-Sk!S#XhD1vI^7_K@gN(eSuBqc z(;LtchKd%l6J((tENV$aqYMxexh76R5hGzYvr?{2$FQWAJ%eJtNTorqlmRkUwXpBr zl6zfF5v3?qRYB}ktBO+Icby1YJ>p$0r9e_!+KL516rF`z6YSfDM@lN4g0#Ts6cAog z2|;RO448zBZfW5iQj#Jt8tG>AMvNgyNK0+xhLX}qs_6Us`2L3HIiBM=?)y5=OV=hG ztBVJIF?QN}wcLrVH>B0o5lUx?qtI@aG^oPxqHZjRC=CQkhMt^Ofshowv{i9MD$_ zV3b}!LI-3`JiG=<2+wg%aIn?RP&T*i?0eds$Lr&1oQ@dvW2keK7Q;Z%=OJC1&CQD{ zIMwI7Dt|x?KabY-qfnmQF!t~8?~?a_>K3m30C`=XE`+msINOE`M>yvs{Q5w56czdN zb)2%_JMGWihPjW~CH5x0Cm&AJ=N$GYYpuEFbUsrrp*KDHuJ@&Ky_?00K+*>^U}v@n zy3iNXR?N^E>)`D2%tG=7V9)5iOX3_ZIfUIMg!{|*&17DMo3(ebYhpa9qK$Ow2WA38TSj_qH&Ud8En9 zfoEM=GX$?Z+b+DAv%##Y`UYd%rq9DlXfb&s^)ft=&iNnsF6o7GQTRgF&GDmEvLe{) zWxZC>48|wrtlvelzdq?Cn_ThqjyljfOvcXNXofsLsP(^&UVQ?4G^PZi@4<&Jenr&% z9^P=R*Wj3JyX6%8|9RsL(}Fxnz`I;c^U6gIGVJM6&fI;DJBxVmuhv4$veplkdZa52 zPJx~C(#OJS8lI3jq0W{a#_!;JpC@l~0D_f-IitsM;J1ya91F2D-7Ikr`D@{>DI7eC zm!oAGu|3utjKWVWInw>IG}i7_%kZKK!wmcp(D}||=7@e`AR-p#R?gxcpv&@l?XP=o zdiYWFmD_s0^A~;=!Ic!ylhX=mrI_u`3xMZxT+FUB39vm~TiMk=2vI;vPWtlbk?Y0Y zArnXc3MNI$i&md?=(j-q@;f(Sh5Lc_aMdos(8yzXi#8jWb*Y#ur?~)orrGqv2Ux1C zIhziw*uyCh-Z--%s<^(nC6~;bx0$!&w=p_`fql~Of2ppNJ@WlafJZ!l3a+@s%`~SU z2p%av#aF-rD$gHMT@-5r8(ci}RdGt}i()pIb6{F&K09sLv(|ygt3KsH3*K9Y+P`Y{(DAGI&Z0JMrBG9vCKG)Y!A<|3=z(`o4JnJj-Cfx`mZ$XPL_8 zBb#85E%sp!oVHaw^zdsod%DKMmY`yy zx~x>&cdg}Dg-`JC%{h}(a{*qW%h)0E zhp^%`|L3ZOV;5qP%GqAO>`Pw1V3+Nkm2!4UdHih%p+eoTj}OfoDUfWKv>P&ATX=?0 z{Flu6826vgF7LnVg_~DDTuD$_*Hg{$|7JRGGt-YUOj6G{>>|F5}+NgR1ouw#(UQ!(EPmEva*E+rGM6T957&EfedhfBU2;nbV_Cptfl>Xr3+2Cr$>9$5gr}- zoah}aylTYT+{B@0)4F&{zlZxvY@c0I$^29pGDT^~J80nlBfoM^_2x&!23Yj- z$nsjM*d`K4lvcYclCUK6gl#=w(M5=#ZxpgSp~F>&*M5F&!Jj?~!`NM%SDtUP%2Vp7@;QZ! zR!J$=lL3Fz?s(rFV9vVLHj4cu@>DGCkdOS1%T+p=v^lM*M;Vo+{Y1SkWe3H|*rd1W zoIqru{EA+jmn_Sq0_2ezFiw$AU zQKl8s>`l|5l0T8!=Dv-M6kJJEKcq}{J_r>8z&&_a7eBJ|Qn5C0%6?ZSH?Sik$1pBQ zcBdro`Jc=`K?7096U-LDbmzhZFnOLz4 z(j#2d<3qllgTLR5{1!_po1=@59b?{UOGx0Im_zb%kc`WTTou^Z6mqdW}hEEY~Rd+}=*mE_!aG_j_;7s;uGygAjK%hqJI!%V@cRD&%wgL$VE z0Hxl%aqu8-XcXFS%+6{rapXd51GfM#8iKu5y%V9pjYd=zCLLTzsc9;+mG$(o1`u#kC{ zNjT25xgK!mx~pvg;DG0o(}ivNCifY|TBol~KUckQwPR1&jYjEaTfdnsARa5yMbb7v zJ$%O&2%^a>8^*!7k_Hvq`jz>pqCV3pzItfwoF`xN2DGa>{#z1DbCU8GhH^Q9ccfLh zzZ4Bk(Xqc3WykQ7ighJIL7^r<8PC>wAUd1f%fvzR7k7plWAg5_l&>8TG(wI%%w08F z+{1Zu=AZ~YYroNH+@H2Du$^|1UJOGD$q}Wawi*D9315RZ#=qd?X~nKX+5IVE<(Mp( z76*Gvwh_wE{QkRB7Wo5T(fWsDkoEGXZaV6&#exhb+0>m7eeuqyEj<})zwEr!q*lu~ zOCW7K4EAAEN-;=3p6)3!1O@!8c1Y-9TLhvHXjZzDYMn1bEMSS#zQFP$&*Z0^+9YCA z1XZPVx^cECr_7^0Iue!4w-V{IZH@Nnkay*QZZ%K~rvB6Yvx``d2Pf4J7nK-Hf1__V z1^eeRn-~Jj_1HEMTL@*_Qa~^Q?0EBR08Eb^#o$nZ?3O6(Ds*!(yWD&oV_EQ+2GLsoA^01Td!*$v=k||rW%HiJ zz1gyC2Ayomc?#}r12QkXOpeA;z1Z8Yx7iUY*~ge{O>E#|e9DDJ7CihacyXawGW1#R zepq03(8-bVV3LZEZ1$VDrzV+Gjca&4ApLd6=PR#Lf}Qc(PE-tE;e(D&O$u(YL$b#E zZ@>0?20z(*grSPHD2jYgp!K&2dA>jk`~hf+>Bb|yky@)$DlcNZj5Mp|QXT%+Cv4QXm#3i)^UBJVn0nmt(#9*GkpF7M>g9_efUL--&t(+d{9A4= z9l)CRZ0!JvhQkf)qRq|3%fHl$>lFuVXt&6ZEq+DHMQG4VFdT~rX@;iPiQ19jy%0s%VNAc%?|f-qidk>69k7j@0|Fq z3ZBGoB0fn%W!JTwp7JYf`wSHK$`qU4_=@-F~ znd6N`V)yDu`|=fDiG>QO)WLG)I+dWk)bNHpajzVbT*izK_#;r0{J#|q9CBTOz8BNx zgy8PSLGPj*1o^w|P;*1T49<{U8 ze-Iw7cV5TnJ!BE@6tafd01K1(8j4EY4Sw9O>e05&-Y>V#{=-6N9ik2Tynvsbc!lklDuOWvQK>ru^ z|KoJ_4)}qzdFw>TB5tGad}?R4L94mJ#{XQ?W__hb?_qq5HJR*gr&5e{tDLw1M{bT? z#UI4nVaI1PL|yl4I2taT0>=KT1nUD|`ZgBO-B;Jrg(QIW{ee zUXdO7EBPOkMOs^fYflri?dZ#%-zvJmS>*s(6A4g}dB5+b<%bZRA2g7W6bMJa;{*UC zp)TB6qFIL2aK5k&NIpb`IJ0e+uel{;@TXZu(251H$*2N9wSme%Y&4z5Ug*ScHeu2Zs@6cz-d0`8pRzP|D-hPI(PFF{_ zE|b4PEx;A7DXMINLIbh|e|eG8+O|7+z~<%sDa%-!;4nJX#bD4cjDx3a<$!0Ayfkz` z>b~)+5LaPdxWa9bBp5z86|Isz%qwnZ7qK)x-KfHL@RYzyAZ%c5?SP5c#?Yv8XAH;N zWqRKE`QV|P_*{%4uN+W%#v?Gvuh}xU(q!B=3l|gG>>{na2zvIwNyqL_kRjqszkPO7%T*1otl3*rpmT)#dSD@yEGrCTOer=3kb3d z_t_o}x3bRPdw-+;EyLGQFsUD%mu@80=Fb@WKd+Gl@>2ljpwz~;puUZT5o&+jNG(;u zU#w;l!&p(x#3E^uL?IY%x|LR3n<}a32CH{R)~B>7UwQEaQzu*E`Z= z5Lzr+%x5Sf5BS6>TI!&tV-q8lpaIGv0adCF$|Vh*g#}A{#v3LylgJ+G_p!dV_lxd@v?= zq;(zgPp5BG=kx96{SA>{l3(v;_CvhHmVeWdRH(Uzcr#Fp04bMV$7o?W$F32G{JFn7 zgKyVBxv`5J<&x)*PpbrGt9aNMolwX?)ASDMRiLg_SX;NmI}`j4t9#s+Eiv+-d))q; z^(bT4LQ;9`sn}pj2f;`--|E1=Y^m=#cWvk%a1ZFRW;j5GP`9%sJwtb1cFDf1@7b%t+DZ2J z(N~f^d(60o6(VY}6IeHHbYZ5@y^SIVkXuNW_Pnx|85h6V$57b7fa0)nc4PEinqiYy z$xl~`>px^^Jc9QWI?Oqz6R%+?4ZL!vDQjBu2?p}uoDbvsh!Bm*Kicu$ zPjBs>QF1hJ45+$o1dnnr!zb%exS+|Q*6dl}@rN4kP`8iwJ+02~(phU~v2EA#Dofqm zNpOyt$uF<$NCP`hHAOQ#%=KCv|L)9K$5nUQ*i9mp9*4-+V>3)hQMb~&sP%Q>KS#Zx zK2A?O)}PGIjwo4EM3%XTOQCN)ho|zCS%IxJ8PeNIlC0@yoxv4bGLgZ%6JcBox%6Kv zW%vI40UsO(zqnNNAXurqDnkbgtvW>j<^*62PVr`FJb{Y&O(2`Vr6F@j@fGM;ra3Y@ z?y8uPfhx39?{?Qb@`TyfduJGk@%tqNsSoJIAEfRbW$U@Cw+YK6>T0*Pi^Hhv*aZSO zTif6MV7lk}Y=T@;Q0~hQh0`9=*H@PqFXp6Lr25yuVHEoKXpZ9*;)s3E)=!;_$-`ZR z8+{+@`}gIgUDsDNlFjGSPEx{$P?}id_BzTmnt(+8j$3k!_(;gFK#govG(J850u&f- zS}5IJ<0U@m5!tN_B5zW;6Iod4R9k~#zbr@;b}TdwsJBzdV!wy}7+vg`{KbnHlTPq_(nM*3<{R7yV; z-1RmoKj%Y;N^44yw56Rn*SyL4LnZ|@+ukyiz)yb#yOcS3^OsU^9HOZZIpPj8N^Wd2 zFWGbed9n0efc}?fkf&8A=wol!U?Bm7{Q%kF;Q+s$?wGX%n8uNTk^*rD)*Mv)ar(tr zZyjQo+Q^jRoCB0PK>QP|)C{Z8a#t+eX$-1TaNe0(Vmpe&hg-V*kUyE)GCTHr*ZHq1 zuWQw|vmJnv>Seg7TD^#-B+324bC*PxZ%KV$$*wTO1D4$O%Ed~g#k(suL$0N?-H`8*l zA`;|saCgHA^huMJ+wuwjht=uTgN{AZ0&k98Vv*J>7h7;}&D~*9%zLSiCv*jOyw)JI zUSEbCt!<)!Qs%vRnqNDIo)sS=)c&Ykg}B|xtRyoW=qmHCcS)PPml zaHFnac5#^=yZSOtS^(F(1lJ@EHKzjf~gH5uX*LH9CZKs$({(S+<$Oc8#rGcAjh;f}eM<9qK!wDw3PDunvVj*G-?Y zA-erQ1K4;(aPBKL;uc=Q$TGRM)`7EDcfcl$IEM$2Y||<(ncgu#JZxTvZ-%pE^W^|_CI)S zvi)kj(;U2h;S+tVb+`k1aLBGq6r1u`&ytn$AgnxUg+U)ypW!@W{o<9r(42Y^aN?4H`8BldT1>Mgv*dBqcb~j9P7fJIPd3kbiKst^{Ow*$d zG%QgF5pI)#UP-51ovss8Nqv(80l&Ugv22OhJw>Cn_^H(+T&~p>8as zj-#95pt%Fwl$k7(HV|$%2J0I^#H+5fq#fEGMd$(Kgk20cIEJNpGi%dQe<$bP`N7CQ zZ|#(!84Tc{8`&aj2dyN2ilqVwz8#`6dq3Q7XYk$T=B*IoX)i$5|FSqpGM1kc`eBF* z3@8A5gYa#^P&8tMWS9aA-L+h3@Y-B<0eY?KI4zEk6N~oszW5OSR3qvQS_~ayjGp&B z&DW-3>bRkLba;Ug`hbHr1~-_ihDnQL;N_mVvvG=1ba z83N29n~5k}Of|nipAym*^XD)6!zI{{kY3Fk8H)Gj0OqA&UPj1zKpx`LGDk{a! zQQz*9;1I3QlAhO=<9zTh82RC>j>)DR{wK&_wg#uU16Lgv=2~p~IGH<9SzP~j+P-R@ zHm$1Mf{XUY3BN+@Hz$|obpevm^yF2TZMbsJ{Yx%$vrMBVRFvIE(zwfNg=mS|_6})$ zeqn0R-pUVm`S>4V;YuXP78Pf?Sk`DGY98c`0zhObdP`Mf9P&puatPCQ$TN&-QnacZ*jDjzjD&cE28Qv~7>O{p(`~R88t{fh` zU3oy3qw>NQgA>XDA5W)&f$Bs)>liOcK2fiMAwdK6?WXM6=4bm$MCG>N zq&E(u{Y-}$Cj`-@EsQ}suT!#t2X;3lf-Lbkk)y)omPV*3S+Y}@0;t_ZJU?IDJ4Vp76I z`E7=g)iIBt1+9_~>mQHx$s9S%U0NWSGRfNW8R<;r86uiOf+(s2pP!G`*E>Z#Twkp( zn`P!U5sz085DAN$OlceQJzwwLHv>HV{k;sm-kQ(eeH(r=O+G2NnY~h#9(FDY!(M_?d!Pf>Bh7ikbkW^SkqPqoe-nv z3PQ4Zb3>#j$Sd6@W}-`Qb37D&5kdE~8(h~^CcwxB`zv%a_TU+`XthyVr8{ASG1?T} zIy*6@Q0EPFMCI5j1clA@z2;KP8z3)cbZpFVXZR%dwfO6yO3S&zKOd!!_Nyo0!jA=e zTDdZD2;$XY=#jC}VfmO0a8g~uHCRy+1iJ}qi=E^#X)H)wb$5eeeQYwM zCb|rA4Di$rIYSXNSlBBqFjHD6kLyF+=}^Tmhs$hnx;S?AGO&#`Ia8Rt85M6C!{K^O zvXCJ`>uiczP3*~E3NkBG`PUA=Olx_AZ=)a|9;*W3iW|dTXxccQs58@B1TP0Qgfia{ zLJsOC(B!ScwzzumnP-oov^u?ns5O(ujU>V{UV{1!m4q>#&B5fTr%0n~%j!35K}H}= zC-kmW&xD+pqwD(dk|in<+pgAd6x$OHxAVF2Z8yQrHfYJtBgk(5G!SY4O%NFq#68uO zEM(Zz0@b1g_N_X^XX36N|4~_AfG4LI0?iroe8$Q6Kc?mPsVNy+B1QuCJSRa>*C_P> zOb+dTZnqoH+B|bXq3Wi zo~3B(yd)$IiTyAAkc0ne9ui(f;3KFQEKh`-+E%P!$D&GH+0(ZJw0!Gm}nE-8A^B za}bo!5rH)e>kcqnt*AIVm6C9H^&_)`DhP|;>O-Pi zGg#_ASG$#H3_b{vM;LpsWup27D=h(6nfH;+G2~MH^Ol2(>x*=$yoM@N6!&;@2+w`1=r%r*+} z$#u*G4%O>q4qFz4e6w%3IlQb0mEGBkT>pKuQ`CF}eOM@p}2UjaHSfR~(|>u`It=h~Q&EC9W)znB9WzDmmE{`bouYLYU9)5idVAMstUC zg}2~NXfODq!!Pm?im|WC+#PRzLgni5AOYNK?^krxlLF`8x#t}QH9TLMEh|6tgZng{ zUtPgo*c_l#yo0R0j@*()H1`gWMR$bO{r>F!+gJ5lP=jM+_>;GOM5il(qq5in8{+KD z%u&`JmXtZ_%7kahZDpxMf!W$k5M5$bJr``lh02%kp(;a;6uRD(P;uYo-_p;Lh3=x4 zIqB!e!t^R%^w~D$F#BJom+IQK2`Yg?uX3Xh}sw9fa0y_A30Z3 z1*mSkiib+cLF`E|=2@TCmzAO@O)0N(pU~?9qSoq_?E|Qz^hBFfE019ce%L;7Ubn4c3VY%(5T$FXjH-p+u@xqWh`**l8!&aWN0$c4gomI2l5V&&u(!~lA2 z@i+uid`{_jygrL@e1e_NuqUoA&kg%X(v1 zZ~qkX4{Kg9Te&wiAxC!W<6Hn5h!wJf!FW4Kz`7t#Fb&?2Im%Fr7Kx#c-yyka76@2e zwB!|Ku}a`s9)C{&_hGEH*gdv&Fda5wc6yn2yoG^VPR#uf_l*uVIdImN7v6Q-EWpr| z9<_GH=)XwL1TZ5LW{82l;!B_$Sk0j1*u8L9buG)Z3`?1bTAcx8WA+h&zLrwo$jBibio2k$8neAITe@CiYlmjj^StNn!#tkxU!Lv6? zl0Lz+o@sP!?6a0OuhgLRTn#jaxxByr|ZEa;cnep-~Z@t%lS1p+*ZFDOY>2Fp5Q zQwYc@($(u<#vg)qepv3nuCt{vR_VtVZI`{Ie`vyTY#C59f$ft04OnIE;UlLU2)I_K zvY~lZz5T^_VZO99^ETljoT4;=%EfMjIKZoy<9<VN8|m$n zuN)g86RN{3a+_l>m>3&UK82qKQ#S4x%=iQ=EaR)9ln$+IeU5V*()tg+L0sguX=$i@ z=!CwTdC<87%V9_%Z1FLak50Lm%oz-Jc}LDdpR_pW#S^ZB$5`VSkJ?kLtvBK4!Dex8E!MJh4MIzB%0L%5l4he(M_= zx&z*xHUpbk)2RvZik*b%{|8$gMO`Ua)Hk8-y|`0u5N4QubM&|C;*FMsfRWQ%Lw_1? zHUr*Ism}$>zKXfL*~55MOpcULg@QvatLDwQ`C;^4 zZ9Hqqdl>HE!NNPSsQ;1vLvgNp8ZmgI;pY>A6Up@Ne1DqDTmoPq0Y&J?+j002p6 zVxVLG3FdSHX#ff0u}qJX$e}C%92Ns5u7FE%RAKbym7^5dP2gSAVx1wNs=Br^)gMA&xs56}q;7;RRM$W$f& z5WDvrh4{4e>?TmMhtp2BWk{g~3Xu%oZS%pHD;;a^L-;2`_%y8SBGj#ZvO zH$0sUo^RD{K=S@RR+sI7aP|}|n_q&~jF*pppfjH#MY7`Y0JvVP|Np?qzrL=NHQxcx z!406?-On6;BO3F(FAEv>AFQId8wu1AcPQp~@#S5o{;~3g^lQ{@ zBd8jOn6hd1*kt>4w`F@jeP7*aHG236(XbOO`Rn7yYrmT{*QY7vOd+x_FQv-X z|Ev^K;U*sSa{C+cYYT19x(L|{>*$=&WMZFCh8@y)#`KFOh=XcGtPLb|`1%%1bSvH% zi`w#KTP6-w@6ae=c%d8B*b^6(!>p!oXUI z7EEKIBCoSl)AqNP6!m9oIW~{SXzhN!>^P`RHXkv65`Kr~d#{uZJWb|hg(aNVLB{dq zSHV})|G~p8bl$qM31oAA6O!qHy*YiALXCTUm?1~{(}#{oSoZX-NYQ1Ep3JQKSg$7kjVymix7Sj)Y**Q(&9AG?)h^hVzN<$v zug_9c%)F^iX-hH2aLU3h`ZH4i$7HA1HYi*rl(D;z=FG=u#bfd>B27XpKYOC>le!(> z@A&Ps@=YC;L7%k87f>2S(4x%IL)GGco9 z6=OB1TUaEcmYYT{jApch2&nv`_&0i0yD5iiiNQp6Rjy=zMnHw)X}}A6x!2&u(NL{p zz=vN6^#Fi8Qw8e|M6ugaiMQC4o=iD4x4ejMNuv}bH%_|I)b8TWGDhdk>#C%RrgvVX z`mB?zyd!-y!h0qcc>6CTnA*?(kRr}i*vmrMy=}0azSMvf1wabi(ZctCb0V7qx zP7x^&3!p8dC|Q}bQJ|=YrKnVBkWq8ZhpWch8^~+rAjzf+s#+(JErEe{7p**YpQhh{ zA{_IATX$@luN}sWnWZ>5KH;8CEKo=hynJ~9YA`bCEyG=)8|L*+--6H4;x))*Ng%2pGFh^#=xe2{6Z^De#SN0jEvvSXY!XaZ@>4Tob`~~svg~YI!I@RO zr@2F>RkAm-X`hm<^oN4S39HaAkzCn9=?0jKCP zD#*|+_gNcb;uR0DMu9^CGjBSeglJFVvxZmO#nd%xtJSS6>WH=x-uz^RoZ6$Jwv2Gq zazWeMQgP;>`^NNPibcWW7{F2omGew3z@z?2oS6QXK=RV;%8YUETu&A|=S0aWPcA8v za%1el>XVmou&mcJmoJ$bqVGAJ>rS#4Ui@)$iqI_GYSoUI>{eT^Ck` zpdR_5DzN|r`zf2GsBy3Wd5a~RF}H(jj?YoDDf4f>cY;E@l8AoBV@~@nvY!%f>9syiWeXNZ2%8=#(dN8fb7g2(o|ifT6;y2Zilb2eYQBF5D#MI;HNa+hrqGARRMQqfJHMb zT#xw4S2a#14qg4nY8sv|2CHT5UWvOO1lGcAuL`a%|BGJR{;#^XzCWiFMVI$~(3Q}M;P0%ZQ^_zkbvq#55?F`b;hwmaO+zTw(J zKFoawMcAFdZF(_4~jZKIF=39pAF(@gNr29FI3__-ECT|K6G{mvFGc!pGYRycl%!J{+}QNJ|#b8(N} zQ4lSPzn@78K-s|rZC7R(Q5asEb}4fWM#nJ&WU1*HeCM8dDy-t5c{s!;F}r7>61i_e zvgQg#Bv`F;5D|z60qDYtseisz_i+$j#-O;5-FOO6StjqR)3i>Zh>6D`%tJzfjr!Ln;+|||G$<>V+yrRBo;z-77)%Wvl;|j9qXyp2h#Y;W< zM!W;UwfzyG+FE6VA&^2IzHiIXQeao3p}hu0dm>$Z%wyjCO5f;uA#OgFzs~U!`V1sb zr7Bn1=BUs~B`9gq>yY71d{`I-38Cvi()zOvW>`@o3qN#Msi=Gr4DzQORr{Xc$pR5M z4e3keKEU_zleLzS5(%BdSM8DZ!l5bIA&|=vs@J~nTx7rcPxW2%H`9Mh*G$uJWWh#!E2tEn^! z@Z7;oTPWX1SUo7yH2`IhfKhZ3ka?T}Je<@^F?Fm7jk%cl{;7wU3y&z*Ci}oiS$M&; ziPpd1xapEuDGqU4dLc3%(~Q6(Qap1Kz<7Y~x@UY1*YRux3d=J(8~6}J>G7*x zS4gFtPL9{la*9dTHz%U38bp9ax@ej((l>@4pn#b{Kqb)$&Ja{-%VPGCj4ZmCkl-Zi zB_X%8;F!VjzOOz$*j>ft`Zns~5;R`9+a1`Pr607kFa7XaEN=VtUi7zjpD&Ml*pAtp!t(SbbB@;D;V z`u_Xtf+kSYxq}REeUx)k;6BoxSsai1nx~lNRf0`ymG}WO5}kmSgzred*kk=ub`9_p zO`@1JZ!K>x2(QVGiZo!a41TFV-lG<9xf2@AFq)7k;$-EfA-xDjzYy&Jc%Aejw2g+w3!mHl z&HBCAll%Oi2Zx%SmZmd!kI}+J+QU=rI<~ro8Iy^*> zc#5PlgJnp4CDLXWKP#F;kr7hHV~+S#+elX??#W(M^jzjsRwj&Ue>;b#Hx?d$M6foC zj67cUsheukx(F&w!aLi6l$BkJe_tSSM&r_OusoqHP_~Q6{r`Zs4 zG?o%k=L8o6?__{t37<<2Q#x1>t@o5QnRn)i8>57?GDhku3ic-lC~{0|c#D<0Y49>D z$a!>;ZEwtpnMLSa@;J^OM>kDa2Ody9=dV`9Bh$3=zP)Dxbm)p@n6b&)NU1J;Cz7T1 z>eD8#u57pM*Mn~LJ^f3)wb!5gsrxt42Tf7om-1}g5m=cGgW0C8!l;{PWLrYc74M46 zBn2CjQuq_3L@yf;DOU|rPr35$P@9jF-&?^Ppi3LCW$o%if^FRiHlBHs5H*zpIn}eD zwuaWi0IX!9PYbFfssU5-n@#!WZ+Ej>jb?lXi&;8Z;6U037oIfueX?nN*#eUX3pfCv znf2Kj%Eu^ZClHlF8Hp}SebYJA)8yBAKz(;f-Zd;AS|qKhRMGDk*VKvi4!FzT=oq?8 zGUE7HhpT%;_Wr)}*KKPpP8YxWtt)5Vs`Uww|7s3VsFSwfv{;I6q?`8MaV>N%x=@Xs< z#kGFC-aW5hOM_4ly!Et7NILr!le&6ZhZ3ihQ8b7R?=yNGgL)=&i~q!QZM9Rj=j2mf zk|HKv(5yGTUTmOixnmV`wAg0XqSF(eVcMb^>M#|gbsVWxv*K3DU4#v)dfa&lf}5an zt1Rt8eK((2RVl7tTkih%IMOC^mMNnql$m_Zb%45b0>X@B*+&jZ(?-rbn`^xF3L$g@ zwZA2yoMBV;`z93SHNt^4SE+(H|Z=K@RPIMjy$o2jXPykZiyrvZ-482QMO&xyM$c+W{-D z7>WvP(!#)Qn3-Jb`4AU_XkJ`=Oqqw9_5c&b!$}O$`tQR30a-w%zZ*Bg09NZd2ACyL zi06)X09!Te2>@)|AWNA9m)U~#7SlB`7Vh1>+ex03w54=vA8WE!HqZ5u^Q}Veo-F?7 zf9`+(@8A9&dN*rX@pt-nOM6Sm>)y{^ZYdbXf|-?QJC+92zH?F7i)I0c2`QIY8maoX zlzEGizeW8^R=by=tc8MgySY=`qon0!ExaQ_goMZl!_Y11Mxj0@P0)Y_Y5^BQ01B6d z5N|y$$p97a*c97$?T%fa6}zQMwku)_Llmud3#F8_cC=KiodvIIO14DYRHc++>0RJ; zQU|F5sq$Ju(UnqEc~unTT~+DQQT48!bm`PXnJw`kH&Bi`e&orwv$xOKrrUGf+d234 z^IoqXzur!7UA0(jcea{mBnVm08U+2UFj6P{?qgfU|Wiw8_^HtYcp zrub>0WDgc&g4|lWs|f%YMhp!ih(-&^nXH-!Q&WRzBG+8g2WSwLN+UFOXs$&BW}S71 z=HEih(GY|bVBmr&MLYl+&N`wCz(Q6ER=)=e57RF5zid5#U~a3P?JdK z77KXvG!!OJo8GiZ!miP5K<4T0)uegDYVQkM46RIywVDDs@EDEO_ zlBj*_5(?p2kc+acuX@A9xIRp?-@l>sk?YZ-t|0}d0gR2;(V7ca!b_Hd2s zroAu@)_&GGzAeYtI;}VW(zO+GHJD{Ht5&bTMRFBPuc)~&q3!0hkld1XCuq6xCVk5m zx4S8PpKsn5`<3s_S12q1Ht#G<)N-P-ZW*ij;04N6F8X+(%ihS0cJlC)pQ9@u4ElZHq6{MmBjjfr#Mtx4@ zN_~8ei=mayUQ4QK_Hef=l&LURr)$5~l5rXKx;s~t@+PpMOioxOvud_hzAt@}GU9c;nS0p>17qci$O}kgtc4b&qLXr3GQDe^ zllJjYkZ$(Y)!bvbH7wuu#Ho@Pi#wYDAO^x)ycLu4)cMg>HfEKOt-sf<^s-jQf_kT~ zR9~fpTobgK3bVW{D`_ovy;c3C{*~Roq`!K;*Z;G9e=cmbuCz2D0yD?jzMFZZp`_LF z@^T=s0C#{`09s9G&DH|;uDCLA*c=*@(r!MR*BpzH^c5l zHK5FU!MHQ~r7~n;W)%7Y^Nd+=*%{WAAY8vC*b@e5j~{MtiC3z+Gp&|EMj@ABC50>B zcDVGKO=heA^T>P>HECEN&Umk97m@FMOWJ;H4@sjRh8WZY2P zR+tqjdW>aUP(#~xLyjHQQevJh)azDdMVGLTL$noSQH~je5<|&0F2K|$QQmiF@?+gP zMMP??-X}s=S9KXls;XM*eGBS>bnsdU@#+8_fPktyx_MU-QS_>isIpFhSl!C5lmb#! zJlDCZr+B(cd9Kp6($a%_N(HtTr$d9@rLZ=ixA)ewCO`LEzqc7xmsV)8lWsRJ`_j93 z>+K~F0A8@K#Z>~!=wLC$0DuSkS}n9%Go_%ra$_~6bk!_aP0MJN0LTPi@&p+doF*_` z6V#F!>58Gl{VL5<*}f@a!peF|E3G2F;=Xwjs6BH*EYHA*!?dFa9n+!}in3BhSn|5kttg=8FqD_B@>L_HR=6xfC_~2zdc-guLXR7G z8IKn&{Jf`B$uOqM>WV`fz+jA zdZ}Zv`><;BV%h$9xl#_Hv!I74t1*PVyv4dr>GkNeEPpag}50((h|{VB2pX(~GiOUT?c;vuaE5zE#I>E9E~Vo7iS! z-iJP=Y)-2$=ptjhz{XG}4U5i}lMIv7yyk12$SYg&)&1Zv9fO_?l(uaSS9wW6Nt1ir z(og{mB1HgzXN70z>e3q<29CeloB3`D4KTd5H*hy*ATw1cMnuC2V0OTSnczZjZ2?UP z<E-^3!cXyWDosK1@Y{s~*Zap7& zr&4L}xi*_UtM0j*YdcEh-imVPnIf1a?+zoxy-m)ip1l%95&(*OwUa#sJOO~!AQvV! zR=3G&MQfeUhFWK^F;xK1SZog%P3nu57zAy*nE1*Xq_7e(fkhc|31 z-f2?IwnBHP2pCNlrpvNg_1@3zSHIfZ+Yms0kwgy$^Scbl3??$qmV5P>g|ndEMw981 zRXw(MY&z7E^qbz9v^3OiOOCb*uJ`DW!1Up|CS9wC%$})PwZrEm-HNKA7A#jLJSokh z9srw^8&%JP+Q|i+`c4|eqUBAu*XF63C`5udLFqg6d@UnIg+n zeY~|cQLII_ubl)FyBlwmst8S37Fd+9{I#uz$DBe{SQ)NjdD^rzv_obdn0!LW#u87!`pvsn*lv+Xvl|@9Wibh>i zO1qd2K}rWTs2ZUZC{kThDZ5G$L2xp8Fc>_+{lvJd!m7M2Ozg`zy}P^-nG`Ib0LKu(4iI9o0I^sAFdbl76R-dgF?&rmc?Ek-gjPH`N}0y8fgu=yd*~-`79({^a{p#y|4s^K-s)-}l3U)*FVYZZv3S z+{hTLa@Nkg#zlMY=}T5uZ^MbVYBsKeoPJeCy>Ovwn@XF#xVLxlu6x~vO-KB__|18M zmZDT%xv6>%nrYTm9PayV?{YG*wS?7uymwy7%}`e{D1n$g}sdGfAkA^XMM=EG{Wwdbz+T-TOp>|W8%tx4&a;(f_oYAI{O ziRFc<3U74B3&si^pB@J_ORH*kV7*@L^im!>6q z`?k|oDYKrpFi_(?0LnYVzP{z2U!&OrVCxQerAju?So2K2CCl8Fq~D@tJFm38k~m;9 zSB|250}_1UTwnBFq<$EN^DYgm?gBQ#*T4uYTUn6Bvv;$BM0l~*8Gy*}K45t}cN)!c zkazuYbiyjvt?y-L7Ok6Xq?lP+2Vh145VM|?s;|t*WT$HIMDv155{Y7fTb;737|HUP zAIL&*0O$*dWLhc}0EP?6FaY$KsScStyIM@^;XR~o-o;o4Wa{bwDwi%1EX>w{=h{pv zmp01Py3c#B-Bhw+6;fs1a+jJ%z!@M45C&{{7gK|Qkw}56O5tjP93=68lGmBN$OKjL>b)hk-@B{ma+dTak(t#ZPbGm|BpyRi zb%Oyx42V%txAuQ7(QU+X7fz+j9q5MWxhGdMX1 z0C?~ous|dr7wTZI7??Q);cx&z^B7iv)oLtb1lY=E+iUNszV9mRZMthYfCDyIz#Aa7 zAa08A7*=Z4n?kk>nzRD%N?Yr>U84?H6x7ybb}N~^*KF$AdkURp&w8zLyVxW(VEJC( z8O-xt6Rp;E2X@(2W<3<`)7^?p;ms`&%8^FKVgiY5fJOc`8F`Z@%8AgJAP2ZnfA((QkfA80(a*kc$PQH4vthxGa;ftty~O~ zMp?ZAVG-Y~Ub}~d#OVnx06K_>BdK^_pE-6ra-|A7x;d%>K9&_lJQ^aQBJ6@eYGL2xF`Yy?y%y! zctcz#fN1l3vxrfPj9PMQc1p!T>6I0_cGxC7z7MtKLEhtAR7R>1u}TF zY=DK`W^4tVvuuG4##Bluu}Vvl*WK*)r}gU3`P=&I{N&T7$KT|i_-lU4M{oOfFB|nY zb9XP+3^;=Wp^<9g89~#@!3*20;+2o!#U%|6FHS|o*>!?GVJ%o8bl8CdK(CR=E>7havnphl)XL0Q6p{>Vo-vB7PA88&Ynql6bJ+`Gy+jc z49iU!Rsw-kNf2H%4_$!s9vqfk z%ooCpaRj{Wrd`Np8_Ti_M^X18WXHDSsr+2_H4<^Aa^9-9kbOZUL?8=9a3C-3M6gkN zDg+m`iEvpE0|cOAK`P%cjLHIln)e+!p2eM5`}Ef%cU=e=vbcLP&;R;Wo-EQYGP~$Sgf|$D76~m>##(vhVp5a6%ea6yCfyy zwVTF$aHlsMJv>~iRk>9cc-2b8dW1UHZCm!(z0O3ayJLUKpWW>D?SZcH zIsiNX!ob^wUkpr$01r6i4rQPasa#3$lsfN~j#FRlQ>Zsr1OQU?_TI@7QHlr~jv|B$GC_}ywCDtSlPs+(yrt5zqy>|bAa)({ZgI@> zs8({|oq7kMsFx~b6-%{UY1@?_Nk-}jQ@ty0-L95Sm7#N7bmSt5#CEcojRR zR;vOD9-!oa2!Ponii`fLNqY;TS|VVFJ|S~dgQ|$;ZnZ7H|4OZW)%6^&IajiEN&x@^ zI48ix4hMJ$Aa*#w9RM%}fN|KYfV=L%n3ct5voXdNEURxYWkM9BAz{ws^|W>hfrx3hKPhEaB%hrL*g#T1;XG1S{)M7`n;9*ujFP{b(+-~tEIKq zN+n+LtSD`^?s~m?sJE|_mG-JKinnab=rSy7oFL(C?Jb~II+z68mR^M0VHE*xI27Xs zxV^jv7v#;`zzR%zN!SLtEHZpcp4HLW!7vL~6jy;CyLqh{V4&Jjur7|Gu$0`u_0_dq zidI$DTngTpS3;C}yL;88SDCRUZ;9FF%>L8<)4L3nZ@K3So302TFXFe-^PW0_2G6u` zFfN9L2CtE32IJ-V1AuM(+?dTUo7fguxspU-s~tpW$om_$?zNeP+x2B38aJBHkd^5r zK&6_UN+?pnMy4B+H#?Uq!NmC+!bI5snuX?FUQ~qT7A|XK-r^s|f#vP(?X9Iw=DX;i z16-+@Ocat>nGA^3MIkxgcm5KatUkF(<)RiGGIO^jf!%JuGe2Q7i)`U(7JNH4FyVVp z3W^jwt*}~Is||LR6yP!>i~_-ERC%foc)o_viYJ z-@CtNxx0!20!{!MG0O;G03*REHF(bfP_KBDG?FXn6vvpAjY$VvSb@o_G1(@wdPNl8 zu(#vf=oq|hjOlLad6BqswJGCh8wSCNwa4=|tT)Jh6n#$$)^V}8G@LEX>s(fHR8Tu= zvAc5(G+E}W6b5H=&$hHBZ#e7C&E#b9hGt%JZ*0|iuI%^BEc~IJ`2R`hKOmS3$$roKdcKKA{1kd zFal_X82vLX;>y(#sb`SxPDO zZn1n5m98}3uV__G$_sL>s-qGmKwc81RmyVS)moHlg6pN?IR&SRU71oLgrcZ|qlA|P zC{Hv^!K$C6V}v5TG!LP=a1GZRN@~4W^shX2IaNKKI_-`OaOx#=>ff--fL0 z#^|ZHh$$3j-z)~4NZ*(1B?rp@h%ow_Z^$Y-R(8T>}ojxfF7S#zI^!n z3$M8!`N8qM%C&#WTc7!H-}Qd4%TF$U<+JqtX<*&r5Q&`w6B)9 zc+V1Nyvp>p{?>l0Uocr zL)~Ci9!P>rF&bdp_6D%vLj;~3VuNB<%r{P}<+Z-oQ*g)%z0D?I9N>MtaAV@Oggn?w zZv=3H-ND;zmY0A{sscUhPBe!WOHYkqAb z_EIclDa>wmaTu26d+@kKh@#Z702jz;R}h<>O2|^5it?fKr9K!u!G66BK?jFVRNjTh zZDha;mv=`MwWTrDQN3cb08+UNMU6zKJc#;yO-YxMVz1Rg3ptCrU6~0yLBIqBZndwS zB3Q*b3}lH23G8mM3Lsi;NTYn^Oro>Ub-Aaj~vkm5pS6y2aPsCu?{IB!woffszywG2am0eHS*Vz8m# z+F!c5zrOvI(`QvHc!2kvnE-}&rx`I~#2y3%0NlYC#KA#`a>e>)U=uc^Qd?`zHt-Dc zP##!p#|)Fp-CeUKxb-&Oq1qnL6)=)5nYtTZTxJV{Y%K%5nPjZ*F5Xt#wJ9}M*g>tz z!9xoXWd+O6`dSBSIE?E{^&u?9O+v}xL_hi?M zRStW=U`em}9R}p6#!jF|R7!QiGg~U(#-+~OW&;wSz@MZqTJ9@=HqS+uC9EaO61r%o zBDoMbV1rAdRM3EKJEEdF3SlHg*PE=Avp2D^2tam}K(*VS6 zRPLveM~d5!TjYyWlYVTcm~-d*0D%A`1mFO0ILAA(18@sC;1(EJOjdUcmQ`nB#I$LG zF?M}3BsT7{tUj+loo{~Uhc1`P^2zVd`}&J6zw=ke^X}VJxl5=UTzIOnjbhfBo0l34 zD-6m~h1uNsCUXh*w{_jl5%Em;TY)hX>0QT9Yjp@&fi9eUzC zQCBGN0!CA_=%jW3h8B##5~T^SlYqEULQ%Up z^z4u^l;l!`7Ey{Da;_SA{w}|hn1cfF^3IE!P~L4wZ$K1fby;n;^%-OOy>-ffGMNpE zf!Ze%MYG|puK+Jj)RDwT(Tt>y> z`A_@r{Vutvw$g0f-3pRr<=Cwd?}~sadtqfUXfLd;jk0mE;3ru3S;9%Mm@hnuR_{=*9$^xpCoG+HId@WzAdqaY) z5N86L@$?6+`&$ORO9!+N#d;Us#U?X!X`KO`M3_?mDkum6EeV#8Q%%sCtjev+zKYpV zJZg+-*ITVJt*&}ysi~-UbG_DrMP@9n~~mEqWX52HK90vLY4W@GX8hAPPP4pIbw zT5X%hg?Yx-Fia{n?S2)WwJb85Vv{Y_syExoCm%fQGV^0)JyxvL z>b^E(^US(-)B7#ck|*J;vx|YiUiBXA+Pkc@WVd~(LDUnkA#j?b(HebHI(6torfR~LdIpu zVNui;V3r^NF_EE}?^(;tl4-% z*sJ><5z4j!DC}~D*^Gzk#ai`^m3Qwli>)9MzLoMbNs=Hybgkeun+IDxUP$J>=_RvS zUVF<|Rkr9<@~5}<|Ly&kp4TU8-dis#ZZZR46W9v#n)I-NB^*e}4C_}bH;Xm%q#q=< zhi3q6_inbu#R}J*}xdS7vut0USlVOCe&lqIU-y z1A|T31Tc0$24Wy^La>sg8yK+csJ>TLD*}Vyg4Gx@9N5?%jJoUaVq4waYT*9HJ$Coi z&a$n@PQS1z8Gr{DfK_9-vhC?wR$frmmsa|kNs{EGS|#cBqGa0M@^;VOHP=;rV0m4d z)%K$5qrMZgvvOLWRfg~!tTm(19m=fv=S4qVR@pUU$~GHp6sD_KGXPPe@WvLwn=K|a zL;?U|VWJ?c9B@GOdO5X1 zlyX%S5-U(p^6ny~*e9y@RV=7bl~vSP(Ml} zKqNv@Q9Aj&Z1Um(;?X>6-!EAD!QT(|q0b7&@G8-7c=NuRlpiYX6zi{F;O}j=EP7?yUXX=v9 zACET!=^emgao~~K)9-BF*k-Nqg5|LL8y)~PNfKpwO+P04x9xHeJgvmE8)vz@xN%7? z+TB|wlYig+f8P7sV;MMLuBu_99<*t*Zx;qbcUph4sFf=19c|A-gwzw*5tal1g2p#~j2tqCvrR5I;L=X^R zFiHiG`oh7D#LGl}QB$yc_sDoc9%_9R7aC7IDO`8k5fuypC;|wlC8<7N>-+k8%No~e zwLE)4F(6`w#xb6^kW+!7HZ6;~SU_(>;0;}i=}2v4+-j$q!B!M<`rR}DNJ@8&c$eF2 zx7}tZtsRW6YNjD^+uXFK)h=dt4+yo%^pf{Ax_MS{-ZOD|rRJlID5xngBRJR~2Az1y zjbvo&ZeMn98d_OVDPmPRK!HIpo%w~|>M!dv|73r)Dpv`3Lb%PQ6e17+YyjB+Wm6;q zG-8Cu1F*`cRQJpd2*bqWju%(}LqLj3sa33`1M_Xbg&wf2Mt-)Nmr0wacpD=#Vc1dz zklW$B-kijuH*N&#g6z&Kx4qUYuz2;JD{X!nR-1Qw4MVN>;I4J=^;Sk}*%wB&VYjnW zyDOWvp|4q`ubaSTvf`GUhkg1C^>PbqsfrWjl)JsN4GnDPGKQ;WgIwWB79z8GLFU_P z21FyeUV1oim)k79q{@1wWD{VECI~pKup4IG4O4)26L8UNG)pO?*=W7ACyr}T*wmYH z2B1s^n&!h*GRPAH&wLh6Ys`7?Yq!WD$Xxb&n>nU4%6;$k2nuNj zZdj$X5-^6VyWd*?B1Q&m#a7Fb0Mw{Pa!HRh&hWa!i+Akut{Zl4<@Nr2=6l^5lmvhs zIm;Mq6b8sKGYeOiuGnC)kkBZqtmbmS5%Xtvhc=iN~~!WKdx695V z0IN9+!Oh~=b71&Rcl&qyG-wbvMyfu)g;NA9n+_+=R4 za==>>7R2F)wu^oA_hOG{AZ(iF%&Xz0hwoWVR=XSnUCPQ=RZ(m2mYk4oQV(&gip@;D z7H%+L?O>taeF18fmYN5ox0%hxTG+<8x{F)hw&M-%4lg^6h2EQMg{`AtT6>;(+M0z# zh_AjXxU7p+t1@JsZGD-kvQRdg@Y=c?>ux_`tAZ#wz1-FpwPrGHQ6DE@u2ZeTK(!6L z_X3%p?Em$C|Gs_o0;?zXL0fvjh6j#^PG*3hUsJW(g4w#UK?dM<*R>c7fwWj#ti5BH z<+1n;Z0o@V43>1xb6zkBFeX`2fzlVZ+BI^i8jEAVx_KA?6dV9iPvkN<2(V!Q2NS_m z>JY*xAe*U9`x7nBU0#_NzdN|;7L<4H{30oi__79(yR0k#MY8flKCy7_F7NsDYWZ>j z#yB7b78=8lN^$+dkAmgB_A<4ncPm}kTDb}=iW<_&%N$Fk>?;794JW;LMI}9@#Y@h4 z8LnIL(5=PKFN+o2x$hRkP1W{WzGTxug4=7oluy^qCV^9ylJC5%87rqQW&3pk?Vj<3 zlMJfaU2pdua+Z@}Vh~U?G9gj}QHuGqe*5lw{ndWn;Ti%4qAC?O01^P+9l$_P#bYt@fI-*UceA%RzBZr;Y-O3}F3b#2Mswpd|2MA_~w zU~jH6zH7uDp!JJSo4QhZkU<%TWN;WX&!b5hNaiJE* zk#(6>q(JkcV{s!iFZ85}rm`qYV8t#S;B$vjgmUMj6q?g0C4~eIuie%ZVKr2CR@rw? z?KozEb<}PtV4;3xM~7R97duNqyju%a2k+_?>@HcRWt&~Qw40y7E%LE|3r9e90-SI-01!@UPTW}&kXC86 z@{$z+w$5n)!z~5|Gg(Nh0HGAfY1sl6PhY9FvPKPsu%wBr|Em4SBFm{3nm4X6H2#K^)h(RPqL}*rW)$HO_i-6!n=r-&j zp%g`_KvR_4n(BA2RxYVU?40-zp$hlBGuB*W5O>IEig4O9hMk9w+6}10!zO0FMN|MCP0zrX55MTx^ z5o2h)Z+g?X7La!VG=x1~t!iR9*L|Z6=(!D=3W$$tYKp#tv@`-j9BxNTc_e9V&)Gln{hBGH>NsSkKt!>51T$mETK%ywv zy5wPW!Kx=5KevB+dA}=)6*vS4E2R{@0tmM$f?~v!O=tui3?RlH00)v|c!0nIkl_ru zGsTH%XOL$YB!dULNDfF$jf3|A3&uFSRt8wfc3jPB8uJ#o)piWq7pPWyt5t#RmgCl1 zx{K^{V_V7Ywm;l!Sz50+eQhPj7I>@9c6aB=bJoLUsb;LF4_ZdfwUI64MISiwKT#QB;0J6YL)z%q{2+UQ% zWp=kok$$)1B7|Z$?aNrui8$82J*N$2CIO`z8bvK8X_)6$WfNsjc=a2vT^VG7*)2n1 z(CeZnAn>lCLLTKfl_~|LB1vku-BhVL1dyON3_w5&Ko|@!W_S8Z_}ro`mj#o`eP)lhCoXlv zqVqoN(YKYYSfl6g=9prU5jc7T4q^vR!U-GzAiM#cfMIG);JG1TCELBOyR()F2>=Mp zObi8B_c7Y)jCUj4VpM9x#=DNwV5-F9U3G&nClJ>7vYUvO()l*C07SF5E(e7`119g* zsmTj(1MRyUiYhF!c_+b|U5h#%q#Cz(Ob@hv$&LBf@cP&2dhY1;@M;M!`P7}}oReOO z)f+{}_L{K*_CO*fmb5@X8bPH2Nk}~0T!2ynBx|U~a_dP;LjcIy6)a&hjsm5#(vrJ+ zIm*ej482}&(Uo5=Fkz1<=cnhM9!knpwjO3vI=; zu*+Dj!BvqIs5R|cbS%=!>PdlwN7zcmjIUi7{`Ax*e8?7@&h;kb_JHSD%NYE`cVO>D zZ*%|k^e)NKXPvzAAQxwDoh@{gNpcFin=bL{%bdw~^xC_u7Y5hS4Pdc6Fma$aVfL)>fWlzO-u!rt!5X=c0dr22z}huWJ{^8Yb&<3 ztj@HnidBFpM6>$#tR<}lx5^BG7yy7B;8Nj$kP*&0 z5&K8|^+Qz1go70%0H7R%cL%&;ut9)@DFYrnfEWV~08*g?K!IFJ0Xzl+C}3>l*=m|q z_ONYKv}VR+gTgCZ@MACxqjzT8aNFB{9q{XVeV!V)1kTMvxi|V3m!_(GHC~vjjm<4! zhW2)PNG9cBy=nK`1iG}CKlhQ*U2|Hg*)TTp@7*AsB{4RjF3^{&8L*u6TnTU+0)P-;m>^}brBuB9R+Pytj8 zB1uW{=s<;Ps_XPgky2D2AOR5p0FwZk0h}PO+m16{gR%l}c#`PBd!d6od&V}jO)i02F}5VAu*4kN{Y-u?9=F111Y>0T_X)NJ5MCxS+O5 zPj0samaUH+uPUoy3SnVSIr5|meQ!s%Z;p4c z+ei|xosIEo*$nBh@472nTVnNUX~qy!Rla?bD7LJGd0amtKKZX5n&F-0I99mb*BSgqc^PGstb~7 z=7#l}0A@eNY@Tl2b^U{7c{gOKcJ6E648W){46i}j6>;I-0816G(B{Q8^R6tj7?+w3 zh=T*fm%H&)8A_cFgAS!+FQJT z)AHr6VHCBpJ^9S%+rHjDH=MLcHF(ntdoZyh6#)>CLNNuz^1wo{fSc=vrOh7v-d1;| zmW2YI@F*TUSb2ob=-u50Kmdl?VA%j2av(h6LBInbK)S%-4FKZ?Iyk@sS_%v$No-mL8~NkX@WwE?*9Uh@h9Nz@w+N2ZyVrVW_90l6c= zFljtp5t18-!Qf)K0I~=Hq^Mmk>EX?i3~(&imRL=BY$#Z{@-%j?T@Mdvi?fMPB=-$L zuoQMR7lNWd&jPI#vaB9Rxw{yIM^Q_UwIXDVDgjyj2rXzS;zos*YbmW*QK>{%NG4bdqE{-FuEJHNsH&zU zN(xCB5MUChhKae^cj&B?mKhaoJs6O1FTB~R(fID<#x(1gh`~B#;w-8U_pR;F9s(2U~6O)?jupKbm3e_Qr0y zxnGTJ!@ZypRy9Ua;*~zNlbB%9d7xD9xfXWRO^R_t5l#u$7A0^y1EvY;H|45 z)SR=B?1i*kNlruQtm)Qvm+SP-`aJwnc#yzd4C4*6rSSr9MpU*|Vv22V2z&ulkYIZu zY=JjcuWiuU&Kpa|>cR%L1%7b@b~d2A-D`H6EEMG2i*m9&=-g?o5J@XL7;6eFtD+lE z9gKp@gmI(T4d48NbYI@t#@av>5qRoAB-HX`cdgg91K?ZS(^Vu2_*Q*d;jSk>GhZZb z-e2A=$}2leejqg#W%4c`3Z{Ywy^<|6;<*6KE9A;oDi;s{WW&I)B)Kgs+A=V}P|pCK zWlai9SYu%J<^?1QllmB@#BwWaY(DI@(@S*X@R}V6mLpfxJQ>27rJ;U@*J2d%9E)?u{ENGL7f9w*_bA zAO{CFwq2mh?oP zgD_g{i@_S&A_#*5T|mqAsDnM#0yR5ctcBuXb=MtO-_W<`T1#Dbp>WqFjAg{`BsIOe zT5e+rD0j8^4RN68)&u*zJ-3#Nx#@Ndtq_%5FLTP%g=6y!GP!_@#2&Y8V{pv`nC8-E zZ8J2XSA|7jfdTMquh+ccQ4)&5R!*l*48;hA-#Rh<+?6p#(OkpQo=ZzQ@Euq;XgYK`{253ZLo65ApahzkJ#jwQm)&|K zCqaT7h$1Q77#33w)w{H0dx#`!O7CpZ7k_WO^=hxV@$l6qJAXGW#r%$Pzd`EfC7j4* z=i~(7Bqvxbpja3S0Pz68h7|)YuRFjb4hBph0D>5jtYVe0Al`+~SZfsswUw=!fSBYn zC*{Wakir84+u#TUE~nC3$Lcx}gx8+yfwTmYo7Pf5N+}QlF(nAS zWRakE2~c>H?5YDmIuQy5)w?%VMBB}=v%VFrt#eJ(*3zx#5oJ2Amho8BZk&|YE)}iN zn(^Y=mq9iO2H@KdP0a8%`*YbFj00P^Hm1uJ#BKjs#MP=%o7ov}`QF{V$LA9s?nCzY z(7OX6OSK-yBc$ZhZ_A0NvJ?<-S+%vh;?QE+_Vcl8? zlU|AIMrLxcyw-p>;H{ovU8VPJd2jde9qkT4Fkl0`L3mn_ozUZp!g!6`yuD{WZ6w<6 zWT$^T6IS(F5gFwSTLj8v$hz0sa(j~_tt$XU2fUtu0f$>}u1t@amavD^97$9Q*c&h* z(8TXH^Qn1(a=Z7U&1|^W4Q5WxTpWZ^|omdq^NgI=qlhz_ik-$nAu^A2?`rOzFR%Zi^{1yij{lQrB% zMwIdy!9ZF$tw1ARsknfu;^j&x>X;T<9wDqe*qUBmA?3jK{a9NEj+6v|B)f=840+?mP?ywA(AJGh*1y@vS8;17;9g@S4XXqMW00AX* zD5a$v9J;#(5WgWMl}ouC?F$xu5Hbly!MeU0~5` zE#;b@QN2PxEpx4*Nzq(;Wb5m3X8bHa@ByX(;+)w-P&)UesBiCUbWqE0mEmv%Qf_?~ zp9GlLIktYwhg~^yck4YqdB>5DcGgNlxngf}I(0vY^b##_RjU%Nrdz{jAqKkF$iw(z zJ4R)vPLHHlybRG;J!(RHafr{S-Ksnq-T;D@ZgoKqafa0khbR1hJMLD4V*{;Vin?lI zR8TJ?Ljjd}UN7DaIxo5L)6}QT-+E=0oUg|{zko05&?<@XSAlYd*bHC4Me~ZUVO&)j z?~7}EYtiq8x)9K^RG^Am-l&oW2R-NKCUcfdKpx%*hV-<3jW87>jVQSBxQ)wy(Q+Bz zF8mwu#ZH9aweqYtHGMh1{#qj(laRmZ+hk`30|1WA(&PgS=q-`?SjUW!4PLZ1IV+5n~Vm?gI{h5XbS{Meq#SCe5; zsL=FW&5tNHy#G68qe^m=sT#wvx{{ws>?IVYq~;ppp3ZG)xE!SM`C!0rf)8A;wb_Sk zhIGB19=W`9^=1A<-cZxs>@J;2(hM8-jUai2i;8X+ZK-W-Kc}Z+^pgt3@Z2~3+uiMP zdZ|)aNvad@ckwJqZtrstC_njo-dWadUCCO;#ZR`n4d2<^Hj2l&?MYFa-w9v&`C#IS zuRjFkQd0$G`Mq~ssQGOr%ov!T8Gt!h7l%Z;oPQ8uvOUo6V zw5srer&S*H++?v9m}yxrMqTT5)9{; z?h2a?n3|}YqdSy-7#t=oPD9~CjUK8=zbmL78J#38HvSyV6bZI6nBccid?)xY&ED!L zZ13j4JiOb&a+^`p5S?o3_hFucEiXR>f%Ud*6=b??hH%WJm$YeVg5;#Q!y$Ui ztzUhx3fw$hJL8l(@$semLz>uu?gU0ph;DJAw+q12NS1t^5f|IO` zW@>J!V}xYm1Ck;RAA-@b}Hy-)ll8PS=-v znAIVj`6kuGydPNiDrV{$cylph+c5jo*9XUeWDX3g z4i&XDID3^u^^+KSrF-EW4DA!1?>48^)M6k|fRhWDq~FXyU+XU#?p96e3^A z=E@w#%jVZ3dKbrgPZZs6(n^Kfu^)YoW9|%IaQaw7^z{WK zjT+Q(fOWaJ;Y4a^Kve%x8a)1fZT}8DrYreFW#mx7fWvV_pZk;h#+0!SQl&g&yCsu~ z@bXLO?QrjDZs#irnQ+m{v0wJTR5A5SzAJFY)`pikLGIXgE6GW6Uw07>FJ_9%&s9#Z z0=hn=c+~ViU(;x_t2I>SIik95a{KV$)|_DOn7K~wjA}AY>g5btwvth=E650gIpp8C zKfAf=Y34V1Ov0GpMG&MD&CLnodW z16L+9R?h~{&F!kFgF#+_V=a~Owi_m?CTAI!lN{AmUCU#8#~$TR?!BWXC3?8M9o{DU zeWRN9pBMi-+i&+G?0>Rq)ho(g+0K3IZ^yl(SbhC}7i~ zjS)AmXT6+wAGwG$ar3jR^Z!F#SW!IpC+2C&;aBkio+#tPotCYs^63S6pEXufJJ&I@ z!$60Q&O-z5*j8yfS<6Kx3x>UpG8<)58@Dh_u^7ptNNhOjR>38y_J` zrOOB1gO#e<3&1U++}&O|JcstssuB!l4`_0XgCd%4Vuy!UGm4t+y&U&Mg-aT_dsR$X zxVRDj08lkH>S2niC3Pwr+lLHmRXT$1R$k)?Ul%l(&5-E3x$Laaq2BvLZ^;Ey)v6vB zp{NY@>v*heS$YUrnUK}B5T_(aK4=p|J6(pBElU5~$mU;KrKqR+T0oUo)~FI-0D#m9 zJ{eX3u14h=w9XW#j(Uiaw^6Wn-lr<)4GOtkJP8b}5czM7%a`%;!u%JAgME_+MhvC! z#zGqapx-ZgS}5svuN)Z+E&Svul$i8Qvy%9q=BVeqjVJ4EzpogOSgerMD%#tw3G;O4 zp^_wjjFE?XEPH`xorG5B+k-I!j^n1{ChN5^1ZO(}UOFC70rt&nn<3(u?l6%Gd?wEt^e10J+j@ZdBZn^o~_wx`Qyu=5qSya`UI=L zqBoCVXDfXkXJ5YT>-{gqTY%tohFji#O~qQUwL0Kx;-WR}9ZVysG&pJ%`m6?gzvho@6gR! zHm7Hie8MPK=D0c6jIqbV^#=#Hu+pGu5U=qbJ6VO^5z68N#rE>uTs^1l9%Sq;A~cyY z`gOVI5Q0&1aL{J=UsRW+7ngPmqAE1s2pmZQeSF_sb#G+vS2gqo}F!st#Ovt75EPGo8t!lE-=!q8xUDM5nPg&8ArU{Vo zVH($`3dG^d$TlW1d?>nFN}=U)!!PTDz1W}<1Q%`+MY7&OsTFxtJ4ty)$BdZI6lB(- zoLI>-8ghMLU>zMb#*aZ^H9B)f{v$`oQbm@_L|S{x?%F6U-=DX zT%suU8CEu&H10hYT!m@qK}QC}s{S|yO(!^WObY(|GNbt)0-L6~DxQ9w956qY2ChWs z;ZcG_p)|Ne>MW2z8<-d#yltbE%?ze|U&I2bX_N{?pX znvZE26Gk~NH`*IO^Duh1RK)9@<>*`404o#Uy^IO#(B0AtS>YqNT(@QAc>1#KEcQ0M zb44;-q?ErsU&d?2%rku9t&vd0b5yrJ7EeAwoeSsp6Cl0ZJ%Ur>)IBf(0S_ zK4E5kWHnIw$g<@(VejRm>YpnLSHFAY!2Hv1zV~;q)U93iuL2xp<4S$JfN8ke9>VwQTt6^4VuEsWSEsL@`|8kxC2 z@0KC`x9gqxsLj;Pz?_|8!WtA`@CCLUzOr%33IfeGWMw#h&&@bWUdV98fhkCxjm{-@ z8-=rbd=&h;eu-MT`gwIzd~?ofGx(zZN*!uA$p)J2u5q6~9(j^;L6LuaQ~o7RrE1nY z@1|Ev6$OePt%m}iTZ`nN5Yic&=DlIJ=Rg}U>1CO)ORWyge>>LZ_!WWU2kd<=G)xdb ztTRXDhQE^9)Cx%8m{NIEd5@+=X^%y;#CUqX@q23;H=u%vJ|SW4Eqq~CCI=Zim+Be# z7JjOUxS9y2`tRdEb4{(913_0a4TA+JO5m=J?vrHez)vq4RAFO8go=3q0l0qu3YJ;; z+i|PDubOTiVEjXw6Tq}{f(zC9;g+m6o4ho*cw9qM0GqBmRW5Fv1L$G0P#ncjSfu>9 zvRHtily^62+18k?CI0!vg z*V22u?*SZ*b7>?Tqy}5;e{1T6t?Vy2eR9*z^K^{Qgq7;*1YAIK)&*GlKC0PJ<-Os7 zxN?Jw0aLp|55v)EPSwwuySED)VUg`oUAd~o9S<4wluiyW7}IHLpN7!KH!*OH6fw9) zw9y-r9%>mb{)=3h5(f}oFG|#C$s3IuWRYNd<)ljQ`{f}TE8X!y-8$pi{c`$&K6CVX zW>L_lVux8G&|j}-oQYrUB#KpRFl*>4{T9z3OL-9w zv1kWJ>ZsrUqw`@t&aW;P>AMOnyXFdI*e}lM$xw(wY*tsQr&(&$(yjLyN5@|WQTepK zbqSbv18xHSUoY)DOq+(`^}_j_dadH|xV0#v%WtIDJX`l|c3<}}qWRPoT~Vy1f^^N*GP%B?lqw_$9#Z2Q%? zj39eTu>g(ZoMcJ3PK^+S@M?3{6gqS%r$p)|{`kuE=Ayy$J6w8lOTNvxR-F5|rrWxD z)O6!#*?AB4M%Cz}=v57qR?U?uUl3nVZRk&|YR3Q_Yp<)fl!Zt?PvdIwk7>6$CUGF5 zIrOJAd0ta3pJyjY_4A~w!^4JqpIRRsTiMvVffFleHwPNuFm>AcfCNla8t+ChO0Bjc zYS%;wO#0|$CP@c=rbpsVPZ^o!lTX2JA-df2^##W&5hFD3OU;@gl;>rTEV8*L+*|7# z<6oj9`)y~fvL?C@m-*v6E3H(vbYdRsC=Jwy#GI%#TWWu|DdKbt?$r`dOQr{AwdI7LnnEE$5B1wf~ zk2g{$mI|M0M-7{E7mb$}dCWMrlS|i{y0&?x1_t{|RXZPQe;N6DB5I1Q0s*!cxa^o% zBX;uBKyeI4JWP)?FJGb|(Cyc^&0jn1fvw$#h2*4oh~8a?G&!6T7~z1*!a?xn6mMQ# zQc5#vj0CZJ(L%!t{uoCVL>wbRaAbQ>t=PTvVgE~&M^fYTN$3iVd+fSuL6a0}j@zCl zkwLAAx7NFE(SWe`+P!c}_joLxu)N`WY)d!p8btgPUV?-=q`D7 z9$OxHP=;j3>UV>CRiO7`uI=M}X*{Pl&Nd08EQhhH?>uNk7|fU3OUskD56& zHTYV9Tp01)o_CVyJH;JZwb3|HX?$D>O%_KsP$O#_p-!nOf+Xy*3{w_$=TY93NIpl4 z<_DMx3w&vk#D-WkaCl9%aMYL$iuS|=Jqzr!0A&xbhRIF<4mVDr=(`4OJ0nUJqS`py z%B<6+_x)7%ApSsrszl&TBjszbvd@tN_h>dEnq;Irt>c$!5P>AGawlfX)4sl|e@#$Q z`fRq&awS*$$gx7QIn>MQ8!|zJ$;{K6d+dFtGWLRG?J{ihYjC9S`*|IOuKV9*+6`Yz zi-s6w7kVFd`gKW-X`8QTihh6Dd)#qd+Ukt4&X$PM2>)HXU|0`_+hr z>1h9)8!rtHHr&IR?Gf1x20rtunrFQ4)fr@m$u`pdPO`4+|y8XdqVi6 z_Rpi3DvI~uO+Xh-N=r%$1Nr0d=Lkv-GOTk^It?$-0LCALXB0M5Pqyi06zes<3fJpf zOJef+-|gSsv%U{MEgt{f-*{FQ(MD?*z_@s2kdSjh+z@a98*uNQ&V-w;X_sw?GKUJP zJMQJRzyIZ1WyAu{r(zm{%Pdv;b?fdPUMr1HAIsD~s&B^(pP153^i*cez`P>@ixM1* zTuHRd(=f1x0d5RYbEIx5M>$Eeqs?a1@E8>0O^mXtU6^QTi`GY6b>6(83&R0HkOBB_zHFo9CNiR(*d@ z_$&mV_SV5u1A~p;NDL=HjN$?)+tSjATl!#2( zGyn|}N5nd^WtAqhZ<8w9L^jP=`3ax7T5-R-m0l2FBV{E%j27XUd#^F5vQgHU8_~6~ zJ`=W+`o!HrU3wjJwdgJJvyegK_kGh(Oij~^rfSWJsIgR2ZJs2py zPplCq5TBrQAewLP$Ft1`W*9E3QQdFiD?w^pgEQJJdiTdK>XN40@^;H8iAYh_=~JfE zGzZg@xmiCv%zQ7GO#)_q*b;91#Cu6W4&gsdbzn6J0^?x7l}G+Z%P=L>>xp&wz!33one=S?fc>34Mr1P-g$jyH)JuTCbir?MrN$M$^fa^9A#2 zqGB?up$(Q}47;%OQPh7jhqbWq>29C(Y(J`f#yj{t$818{*$T^*A3xI>hn% z%^zgjFa>a?2``FB@nfMFMkwVP9hT_i7ffnO%jCJho*IO zlKY2};1st`nBc7KCh>-^E2(_lT7SLft<&e@KUMG)nKW)oZ5e9e<6m)|>W$sC3y3>@ zm}4P0DV5f2pv6LYHuPJP^u7^F+`FOdpsT#`1;74R5RD3L{IDg`;@wK{uimr$rjt~u zZ#dpJ{bEAaAK`FuR4&&tBoXwCM1Tm7edR8FUI?Nj0^C73<8bWJSQ~k8zdvda^2Ylp zh=5A`vODGf@>Hzt#jtpIJL3-#BagyRNA7l%x6=ek3lHn8E5MIg2r;JaJ(!z$V1L z!we<(elMREMwz19y+QGr3rS5U*R>W#Uup5*qoBq$s;7cblQpw6O?Woe@HbaVSjAJ2 zK$b3y_Y|E%K$|*#)wV3@kyx^@@mE`f9-G-66IY5-NZ;2yS&(~gv{0SL{hkhM#jsj7 zbh2UCv*!6OgTWv!%k@=PY34yeg8Qky3e(*jKhQoHKf$~k8?>N7`%p0AG(bzxBw9(n zxKu;15P{%kUPczCsG#%Z1(k+HURxQ0V_6Thf{P}f2xTGPh~XDJ(w<}_$sOI_9J;ep zK>$368URR$Q6m8FTVVS-l)jSUBgX@DoVAtAI7HxLQX&?9i*CEGS5 z*1>f6jsH$Rg%sLo%zLEDwxVCVjvkst6kfp-r_?C&lem?|Z^+DibAFr`Gkn^nYvEF4 zS*9>N!~feC$8pvSjc~l-w#Jb9396%^0zBe+qO_Lut*a~w=M1#G%BA@}P*PHQzpF;( zT^QwxZSyiL&9i;MztQVenE^Q^5e}1(M}h;}mK3)PY1e5lqRHG*>2kAmWXWk%d4Jow z+rr$Ay5+nGo!0-#FEbG;Lh}OKmmQ_VmUAiOaSk({6Swg2z-OJ`AKx?nj{IDC5;7&? zv}|lI+POY%(Rp_9z|GotDT=WsL`STJ#`jw5Q^<51w-ob@lzq;qqmglSi6`p!o2)ON zVr1&U&F>F?QM;d^yJ=&O_Si7Uh98HTDP1cIw=Xo;gbiO)?Ed}bv0VAU?9kXdF=It( zk}t%`)R?srEGlc($Kw-PhuJbnZQlOqd>&#jTdBqiL5HyV-c zf?ECHS|sj)JJ#aux?R)iIqE3h{3LN|5^U{C6l!H8S(r(nJrAAdfZ-2;`;8-b4Bzjr z5BQ^P)0LE6HN!T4Bby`VMsmX(v#>vXXA@V)LB4v@0bW;pUowJ~wkV=QMoWJJjM0N~ z-_&2WGL2(lcGh34Mwacls-FK_9<;hL@AK<4H}S{xv_W;OCiDe@F_J0Qg`Rb0+y(Hq zv~z+ai(R#sd`q7ycSJCp5mQR{f(s%i6HE(WpK}_?xVNm)N(3U$%B8BR;5S(siBmiI zdXj|BR+wFM@wDfuRc5UOYbE$zQuDN|X1@4v_(MPac1A=~pi%aHfAO;Gps69j77HJ>4yVU(BL?-@XC)Gl~sek(q z$h`fCzp!hGte@ARv0`^7c?YvYv9?|+0* z{pe1Hirb;pDb16nf!8Wu@5ojSXy}{bt^3g>A-w%xV;gPGGEPsm<1~{slfk2i*$(E7 zD7;RSPx+czQF69`({tYICb`n3Bx+ihvhzAbPd%*Au&mYaq50Xmz~WSIfO$UDRgOZ` zIG9*yQ%}#T)=jCg8bQYY7F=36XG9O$A*KW{=m>Q<(KzE5`i&M|MU)3;?<;8kqkAF` z{samwzLif{vF|Njdgcg>lgZ1&CSW%JS)dVrR}@sU7cowuQFmzMifN(yY+1 z)nCr$byY9JAV^LIX1kFB{Zv3dy&NDlernBXogy`zG+F zrs?O`GX~|pw$olmomH2K)XdN^f}@-`V+^qhpBU?Mw&?QxZa#3etp6ePO?=bKjf3Tm z+Vb9xsX?~Mksn}6?1O5Dl<39L`){IID=(1aMRThokS?U;S?jc%FGX1B{}IQuf{%qZd*qq6zId@AhkLX*W8@k!x+rvslx|bRnGN3xykTGrxgD$G7RTMI&D6 zE`kSsp4}@XtDa%Z%S=ER(&2pa+trDgMr$JSABzH^yoj3WcR0fs>vnk4`MiXX>R}2G5rP>CS&z8Wx)Psw+5Z^i9HSuA84zPu*>0D6@G+K=()M^d^6I-KwdH zWRlMriBF0%*cvgPUY1>-4z4J^$=@o9>Xnj|AMnmqo^YCjrmY~HgRdXGjU|6hspdOi z4aN_Wmu3xeTEJklQY#z`GKthY)~drTaPGcyJg?{!?RZ6oDyhKygsyN>aTK+U|E6yZ z@>?x?6?eU1p17fxepGvgvL3ca5>LKo+ZmERCnQL!-syjpp7{1smhrVraKMaKbi9wQ z*~t+?K$TJbx^C$Gno(s%s_d3>aJw3XP-|1w>pkN_jndaN2o0Bj%5VTebJvMO!%2CT z;4XPQ5-DBqM;CD^beD~L zE}Iptyq5LqJ?x5GH_Jm%NkxAX{JRR| z_t{8IEcZ|Pw=-crdpMo&*3u*daIZ1$9tPdN4adMV*^<0;s)K0G=?0?oT}gagL={z@ zK6Gc`y8jPVlqTR|mZ>2#&UejLkfDfy+zYq9>4|k>Z`Bm|EUv2OU6|Daly-oy=l0GY zm`^EIPLhPWW`NOd;&!vAu&iek|dE=Y8Di@f10;yJ0pKb3z%}Y$!g?4)HVQ zyMb1L4kEEJ(B&vo1GVf)^xHGp-5_p7gK>sgS(~4C#iH;1{e+t))b4xJ&lqCh;CNC^ zaq3FYIj~K-hC@@>0+~UTwBUmi=h~NsD4a0_5L7~;0Dg^HCj{9j8QSMTA)pTSrkD3LCDWBC zWz3W?nwB6<7NTj1Akt;0z`Z6yjs*2R;ibLTy!0l3;5`KYkze|tX#be%&Js|3`f&8OFh2AM{XXt>R_u-y($a(@0m+W!7gtFM>TnJAbBaKKOmfm zyobX^S696E!fj8<0E#gi99V%_{z>K+s*ApK2gWt)isbez&)y1}F7h{-E&kzj$s=%9 z)kRW=?+WCSB9+Rx3*XffsN#_Qoh$3i*Q0e}e4E_I*=Y)ac~_+7HAl0nNh!7vkf@=` zMO$(A^4W znG?-xJTx&>g#tj-CMTtugkc`7#!VZc+A&@^aug=L&C~{}Uz05lVw{tu++FZ1+fAz!c zt7%>UZ%oRN1AoTJ>(t|G5$*LG4JO2YQDP$PR1M=El$$l;lP`%xq{<}_lk9Mc3)|%* z+h>2nZcjG;=7-)rMSpG_ph6iJ)!568QasFd|1EDsH^1$Zv7OarwhG26K|)*V z%dAff^@jC}?9v9cmL};AiNV2ZZf^7-;lkGLmrQ%Nm6rZc$g2d}V#Qqot4T~%zpBHu zaiokftTMRQoktMOxd%+^cZfA&{J1o2jSNf|<6lF}Cm|9;iwd9z!F#B|K&Xri?!xKl z#fIS3+z;vm5eOchXb~c8EV{wyW`RLRTJ;>?ELwRb_r7M|mC83dyX@+FnPp-hGQ-50 zz1+DMq|eYo^*p5(t{UeV@MHGGa}comEnmr8*;iu!B0=d%4uUwQ`$x!*%R68y;%7m^ zBLIX@+#W7dxb;Di2|#GvJ!149HcwcQ=lAYjj$m$z;YS!R9R6?o?n@~N#;B1+JBsht zMZgeBDRn$9N6DB15StSrD^?I;9ENx2H!tNfOA>v<8E=}NEgso+e(w^uXD*d9L-k@r zSIH}Xjy?iA61GxbNy9&PZTTxLe9psx_%v)#KuIz=8`u~{4CpTywF)r_`WmsT>Z%Z< zZczCEudVL+rUVcLJb*T5UD8ZOFyP5YD3N=NFY__EU=U`j_Pp?UcOVK!flc+S6(oZb z+QS_--X^-bEV|uV$E}Uk!HoFyvblJ+{iTsY5828cDQ?MmJ51!Ni75#ZoT866Dw%TiOxjIOF;g%BEO9(6Fsk2J0nzMgqb!b$B)=!brczfDd0i_N}E&7}6W z0J+o4Vrrp=xL6zW(*xi>0396IqKP<0$N^~ct#5+swy;bGTYz@d7I-BAYNXG${ip;~ zuSTr~dY+4}pVzTg^-jnbJprLf^)BO}ASLQ@$_&GXgqmg;rMo^UY$rzlx@v`lnfnt# zu9d;qpwCFzpqjerPDn;(EqMu(yN|ciJpE+U(O152EOhkl_#Ls6*X+f4yRax&Lu~hu zohE^ds93?}-NsAH#|6q9o?kY8dvL5OuKDl9o|6^^fmwmu0~MEaT{Xi7BWAU=b^$v? zN6)7d*@}?YUy5vT@Li&qV#yI*H04>3pt9P?efTw2*;fl5*xR(18szc#4{>Q*N&jc1 zq*vY9I49v4?KFwlD^LSo5sx4E-Y0V5LrF&=84x%XK?aRAB5o1f7^O(OA<#l$-P!WGe)mRJvk9$-0 zpG}|0lO{`lmU^?JEj8k#!~;Tt+@4t`vG^PfW~Fl82Q-k$Dqg_G8J#RzIoPLt${$=m zDnFxc?rOhRTkl^VK&}6Ijn&rBoGNS4W4*uO82islxP61QZf3O+F@{PGwuz*Gas!46M_RO>$u6H+CO|SFi z*M$ILCUxaT4JTcE%@p*%NoNBT8icK_hQAKmI)2@PUO+Q|Ia`|h6fZuhL=}{aU=amC zaaCVcohXe)z&CwU_e62@1ItCQ)(#d2q@&TLOCTBxChlxgV{*z{GZfvl#d2yesV3AE zJ$PW+VZD;8P~F{#SMGuZ@8NgXVa-{S0kSorR{~UiD+&+ekOI#n{5diW@A-v0(PS=L zpG+AKA6(}uVF+0F2LdqgxWmX%Ym9?p%3G^W68+4jIq!K5S}CH)ND6&HtTOPS-0^i# zx#?ps%8;+edxW9Cbrc#Q{hEd`!8#)`cC##1&xzj}Z^D^|m7|()Lc~}yW#%Pn8r}h4 zJ>5}@y?Df?YRJH7BA8~K zl=%lQH%j+fBa|TGm+kUq2J2>i7G<(iKiszQcDL)3aFsD3Lhaig2#kUOV1R9i8Yp{M zyP44dhLCarXuxhL7Kn-a2%hYM6L&=9oFF^5ms8c0>-oP^}Er;EW>JL+_c-dzKZ;qu)qOS33P)KC8 z@>l2$IdlM-eexgz0%%gPj+d3oRlnuPt^JnKo>)I}!hUo#kE;c$%B0krHb4)9Gry>^ z&wThE6T7nhZFt7xVD#Sc>Du&R&fltu$Q*ox2wd8JznZmob(FHwM;5z3BXkJT7&jhDu92_1%;gCwS6D#c2U*+5I3lq68c?0IW+xtM1}~h~VDxJG zzXlZFlw$1kA~SalLd=;mHWX@)t&Q5YCa&8id_${0zI(tl%EfHT;MXG`Oto~@a)zjM zdca&bl3SlvSQT{RVs@f$;^f3q$Z+}h`4B-b zJr}wS8PCeAO6G*hdIVKT7~5|*PCBpwJnMJ*XW$K{LbotT^|0;iz$o_mU&G6*!^LW= zdR^Hvthydi6?*(gDWE5<*pRl^mN*gtr%}8B;(1O+nsW0!J`Eo$^07duA~^ zcuM8133`ohoMiSx#2|g925Bf$Yyq_&;y67xNG)`vZ4=s%D>rj)1Efa2H!W%PL{QE-0 z^9`BA?uD=hU$QK=lwHd?Q#t>;x3qCug<_P?KH0lY%vj!e6huQEgA0$G!mtEP{H=>C^f3OfXD1P1?4~?o-<62Lb@#Wq?@2P3U(9C_p@4hyVUCu=Y2!)D?okYI znl~(3PQI5?C7LMKDx#}iP|XfJ-7LU{)e1)A){W&IK}yB!|1|ruF};(KW*_25W4Tt5;7b21 zB{a?54Lo-1r(`WGIl^Wpl2n}(r*Gp1IjO7OOajpS&%ih^6smy&84vEEV9QO7lzebL zcw&G0`5i|Ka2th_mNenYFb;|DH>L(aEyP|g`$wW)5IMZtm>l97N%%#~wb^$hoaIq{ z!_sbNM^zqYc4;9&7RlPshM~*~=GzZ4Tik6WIJL%ox4YXQd}ivEc@kIapcL}Cj#?f% z*Pl>^+o_1&iG3@}KrC#ZYAme_??#IRHXP;cw?#qzPQSkOd0GNCcMw#qs6CHhCut-t z;%cz~a=BUEJwhT3Qg`NK`hPr*vCImu?T{6ANvWO5(u0yJKn~6HK^G(H|U?cKF zqmtHY+y$qh?ZmB{NehkKmn-9MgcI1s{DaUs@@_lXp*+7ME6HC5`R?!ZxvKI~>sUaB zr92s>2I*xCl>i1%%jN+wr<==gi;@p`);I*wt-HPm`cA#*8W#7$&@RW~N@pd2&9x}* zTjKj)S)C7U-vR&%h-F6y0y>sZI$T%>I~0I?G>fw6Ai|LX@N`ZT%^L_jF8Y6M#5EzE zy+_|MD8$fRl7XOeJS2`Q`&>T6QcZ4Kq{u1IB1oZGuxXx!=R1mWmOaiXCHZuO&QSqU zBbFtU$&oIzzxh6E)-Hhaf_GO3k0#qKpX*GwNmHwE;K6tr;fr=;X6Bq8opN38S&Z2A zyX)uwwf}ea-}zLx$$z*1?LH0uy%75MW;oaBYnZeB|)vh1Fdlj&k?Mlp|iC>2-;KCNue`j3=t4PYGkKkwoGfU@AiSthMn8 z>|py*W#U2p5Bl4dOb^fdQfUKYXSLz*Uh&Zq;l2UGR4HwRYK9Ecq5C!e)r6e zlc^^SxnJs!R|%=Be)YYV@AK;g4kcD;X9gy|O8tZzFQr!7W`9++G8s6alJ;Nj3!PeI z&uCJ2`$fbWY!^V2@a@P+VadbX$y>n7KiHJA`b$!-=H~YazK1}wdM#K_CAi?{iD{#o zF@9x*qABaBwPob!P7*l#agE2jO#m%X0@uSfDQ zky(8i{1FXYIc&$4>`cUC^7pDeDPeBZd93hYkg>FssUtHhDY9u@wXw}$p-P6mdY1^N z9G4aC;oN5a9n)Amt6$Jw+Y!|N>*i>`peI5ojc5{Qw%%g-yEUa*wEo-C*^}?oFTV!} z_GMGABYkGQFJUVWpwfih_I&tTJVGEr>Wow`3*3QZ1moB}3TCa<19Q@y?%^tlROTMR zBfoVY=zEk8b7t>*Ytkal%Hi4azsz5bycgdUdYo&wm3Q_c*jd%RX@~=Z%Egb}x(5t~q>a6b9t5L|UVRTEhMQf<=l8{snw)ZAPN5~BUCY5|TI=HJ* zbeuK|75jrDQo>u@DP5)M2m-ol(;8xpy2sQf5@}^UW_thi#PZH@zkZUn;3jwfX&hM>FmBFcMy@_508Q43MQ}n4W($Y*vQ;=LQqN28Xjp(bJYGq&KrIr3(^J zH>@C)J=2JoG$N&m29h0dP+|NZFru~kaD{KFm%r9QD2^zh(&Z+GX)DZV`pcuNZOg_v z#)MmKvUz$aGY-E6aK^Gf0PVJblj$%ZVSo}t!iLAARj@oj;yJ~?1{yU;#gHskT?ABs zq56R#pCB-^m#1Y+O9Vva3@EkBTcEJtrmp+HOS+@hBgbyvzUlry0Fgj$zv!@LTMs4> zAXBYXV-58VG#ZWfuhFg6)Y@k~Iv-ST?VJ7O{X6G;PL;H<9b+I8MQ8c)VCdzF z)sF41zSlqc|Nl?xdiB5j-~P_~9@>A{r0rorZ|ocf(FO zt67p_;{e?n0o&w3LY$N?_Ipm zc=q*At7vhl*=t4(7OGA`Po!Z4u(x~|L3IAzKvJ-j0w5MwLFtyWz(5desnH^&97TIV zyES)|YM){4`Io8e!)Rr0;4*=SCE8JD` z-{`%6b$#5s4N0rCIqr>G2F-qJu3O`sWaZo3WAg${W9v?BfmaI@S%lfJ8^+cfYs4=- zJQgCa#(lGQZfWfSm`CWQV=Q+q^U_mqT{uWE77J$E3AglsMF=p@N>H#4TU@EYP(JI@ z!1|o$75A=W-8cK5Q4xs1pX35~V~NQonyXi~nEs64_4@awiK1Q%|S^;0x+j zRMy~1U{LuifiZx<0GvgoyfdM66_iD$lt%}6JU|JgLO?>vLSO;F3I~V~TucJ2%xZuK z!0e8FP;`dr3|rdu(PZ!L_1wDNw&-0`r=v42(e5cD zeYrYW$vMeO*m^2?Wk49e*DKUw;eeL4$;@wqMQU(U&+W5-^Y&Woy0^9fa=Qo=XM#L@ z7wEm2DM(VA3=`z!Y&1E$07$b&13Mopwa^3$Dw_qg)laF{y?qbTxG3aLJL?L$f^SI> zAjBQr8?%5oG+rPfCcR`r!0M622-T?X^>+8+Em4#qLbhlwrL>r{{7!DeC?M1=6$h&> zyQO221*z_IOG-iP`b>J~U5E3ks#4l@s|3QXs;W>VWnZUA&qaFfs2(3Z=nX}xDnQnB zr6?#>Y9uJD4pdipyV@&+1i2V617OyyFsl;G7513ouh8DH`^p=Fw?UQ(c^%%@`zvC` zY}UzjFV-U1g{yAwKfnN308R*SIENDefD@z@(sUibZmqlkfDwQd2moV@0mKN505JMb zCHN&)0U>3UZvX>o=EMS|0+^6WlV^*3FI{G3=um1PU}=%@hBIrxg(KD`?j1yCV$+XOmJ2rUWQ0 zUU}@7t9AVHMNyoipH$rj63y1Q%IY|Y7bxK6Td+V)D8REIb5wChSQd&87f zir?VFVOI0t^|mY)zoxQgE#UXG2}swfaw@LgZ827~TDZ0t67PkdiRNTsCeJ%XVJuANNW7INxhCsh`$%L$gYV?u8M?)_1W>l2G>04wBu_xb+ZoF}`@>wLW>yZd;3f0x||HjfCX6Sx3S7eyu{n-$WD zi_5RL_ArnId_(|pz<7eR`*!9HpG^P|L~(#1CTRJ`>u~G45%`lKD&5{%m}vnZ(gn0@ zaiWvdbgIkRFHR%?NNJh(*)xFgz^s6otE%^B#(XP zTRy?Pl3a~pT_LUjtpM=Q@S1aZH?vnnZm2AlptW{^wGLtuEx{HglpM1bGk3zBz3oe_ zd^3MJ9q8)9xhMdGNpfPj6Apgi;wgd-Zupu~%-t8UQdPw>eW4QkB0LD}rTDC}T1A1a zgINSP2*}ANPY3`Y#bVZ=5tRT;6M!O^1b|rvP1A$~zaJL}vxgTYz-qy21%&bi*|3JH zTOj1jSmPxTNNF!$Vmx-|+H0gHqe&{U=&ilUc7|GW-sb1)d>$H}zi?>fajb8o@Ceu1)c{}Lvsu);IDxZA-BDB1ZZU}H;COFGw z^~xe|=@9hVdCMJFcsTdhz^ zyGDCE>e?=})TEby=@(f+Oi|6kg4IM0C{^|DdQo28QQkK(sS_pi=5By-y2T5ns#a`v z9ml)WyM?LZb>)2}Kpg?ZT!yMjy{%F~&{h$2*yDv5MR1F{xi?y==1fbOx z009z?RIa_IZo8lS-~X3$ec%7|i~pDR&y4;3=J|jB_M6vhRv`w29JCWr1bFCt`keq5 zQ2^UxqSNAnkU<9&oSU60`fC6a8m4rtc6r4&MhT_WQ=@|Loqq0 zzP}qbW6D0_J#^cXfV&Hs)1&LSQpV);?7DBu?o2^!&#D*mws&y7EO|#TCR-h|0jL|b zL2}u+r7$)C%E90<{>H+Khya*)A zYO@BN=GHG?_pk0x-R$Wl{tKIItTPGE9^Bst!c&vG+g~k&h0mx7m1ZHKE zRN>%3I50Gp6*Dt-w>OdR-~fOKHSbt53jq)Z=AGUN009*{k%+|?x)1^YL?j4gW>P9e z`&Z5x?}2y$^12fA>U*sq&I;_+%KkjANfswo8Rk`brTt* zA+DOrNdT_#s7~Nmf(UKAnPORIC22`XLQ-KeH?b0yuH2d}QizhRbnjb|3Nvf(hwBUb z8cV@=DIDN}hJ!E(vMpZF1N273ujE-(ydU3vE*o3PsZVuzNlE}fXFO8hG_iMAfQVoK zhjA91fwOTO-*Qzyr z7i$2Ru|cnWes9~0_x6^PL^k8}URNxU&S-DGFIOy)GQFhlCOxNJ4MWs~dK1jbd^UF0 zI^Ni}R@=;KC%kxj9X)mDrL6P3>1Z{Io9?WFAPdPrZXiyyj--9rCl|%!RRA}ENfX>p zgn2%K}ST#!|dv*9u~+e(6z2QQK+jz#{GA#syLD z7Aw2B-)A@1uD6sBgv){+MG1?9k|En!*vz{PTE))Mg;CYJOE0%ps@iplm+V~iz9Y(5 zrONxdsZ`HV=LChQSg8sMXqD`%$NTo;tJNnuD=!hX>rh2R({&1^3J|5~D(I-l0YL;| zNX`w0WD+d5bZ>m4t#bF?mz(wN%dd@jdGl0mwV5-zW%Rs#o_DR<&UZr=_x5i<2o?)i zfCE4Rz#A7hv20eFb_ZrntL=cza=>Z@SO9LpZH3Pg1BihD1_ELyV6DW)NdQ1V3;>{# zFrYwU0E7UFIgUs?abR==0*xPc&%f_=``+E>z+KNa^yB@#^Dg?rd%gGT^rzl;zj>2D zv(lj1;M|op)3O39NIgXFUD~zJe6DYAhp$!py8hw!U!OYb?TZ@u z#q^`zP)aCmWzo2C1rcH>O$-(p!(4GCbri)u4y6c15kiQfyyKo%L@+#yk~cFu5>^fj zoRWL$_MFy^t%1LS8-Gs8z6L z@M2>Ou)?r%8{2?=Xm)(F(v6ks+rPQxH_7x4fqpJ|L#;H}j+OQ7KI!MC01sOw{FaPR z*Ih5fVEZm&(Tyd&|Jc3o{5}8f)lLSl^D?dGX?q*xB&j{jkILO>y&`Vfge}ura;jQA zs4NTHy!Zvid+SUOLlT2l6;N~Yh~g#8G)p)bQx!mh#wep>r z$0}8;g?VT3J;zj6T}{<3Yx-Vzi?YA_@B5t8j#u6R^ZtO!76Y^DP%T3Q##2QB3;`eY zsQ{zCjQW7dQ0L0);dO(_T!IQBU|#+b1WFtLP%K>ons;atA@O-v?l|ssMfww>-8MF-+ipl zYxGP0(B64-wV5P#fE$|@Ak3uA;w-P{ylzi#PDrTSS8>wPMpEsor+`@K&W%{Yy5ptO z5U|$_*z~QQog`B*WrKP-AhCjBMu8D{oQ3!p4^XhugiuPcyjdt|i8U)A)Pdy|V9f?l zy}px{Vc4wQ?zEbPrjgb}wYf^wUEEQaH7hIIL2q1`E7m%~S!av2%BL=~uDKt*c5j4c z?h9N}%BT$sgbFcHHRf z)-YZ6QJiT<6a~Gga%R3M0Y{eBJh=!OjkB)TY>n>vxM>us#gvy`w|X_DC=vygEr+!N z?3%?RqZRTg#x`dh>E&$4K{9161XC^vRPQ2X$Lil%bi}kXy@XC!AyC$aiXqFa+`aWi zFa$1&s>|LMr7VHoC;&nU1uNKCEGoD#ExU(Cgw(qgVNC==h*|v1-_2R0Dufp;#;yP#_cq zK_Dk5xY2qS7B0M!=s}wS>*wz6d*pYo5q;le&8pYc`bIh5Y&$C3y3B*bO~!Y{3YVxO zCb+>UQC_CvHQPL{_JMae5n}g_yOA{9m$e%@uC(}t!0d)Y2m%1O0gbHXloCb)K;iQE zhxJeOpY=cg_xoS}`~I*0jsDmFa`#`lKmXG#b&PCp4LkLDtcu0+D>nWX&S&_$I~l7SjqMSb-{kYFrgdI`3wFdJ%lMXW0qx zN^e4~?jn|lOsnNr5f1UA2AF2AT3RjFsH0kaO>->UY;y`uOG-gKI(n|eo7oE?zs*}k zD1ee0*LHvN+ilr+!K!ylF$oXBxUpG#WyeWcl5TFhTXU_V(cEwzrs59Wr)s0~^`$RV z-@o0>`c5F+`(?F(TwwOX*7DB09*}c5*sG2@Ab~Czh6lh#t@~KgPCH5r-fFA?x9@m4l(5xX6IfktUT#1nB_nCXpbUWN0ed>YCV<5hP;H#n;&B)V zK&xWJfs9H6Seh3IK&z_IYFcQ=&}w;g2T=egl_xE)$a=KdN?_3{oULqehE=b(LuNG- zLhlQAZT8KgkVw{L0ld8}I*Lm&)q!MYdKoAlzbvw~dTR^MdR)oc`WC!9$v5u?25Ws9 zn$Po}sxBS1v~POo;!^#Ho^XMS2GT=`MG?|(R*cz|5ynm}MlyuV7E08NwazB4un06d zrNjuFoX)DVpyJ)431#73(eBmBS|vf!TX|*IpoAiTxUn-5vmENGN2rx68vwGmlO-CI zXFLIRkF#am?Xpo+9a1aqUg&lR5a_`S9TIBQn?f~KuM#NDMUj4ltbnUuy`dH3c|^PW zrDNME2_?P#Uiy>y;d0j4g$SL0P8)VC<@L7fv{o6M8|_0yj!ip%{#1CzzWj} zD_~2)Qfvxh00@_3An?Ee5VWWB0uhX&V4;M9M}@_LaY655cup)V-o`8t^4PtxH~ZGV zJDTg1iqEmq+Kv;I+R&0MN;;eJ(_p@^0997rndlh=%3v;WX+MDc%)Zlm-q~jFy>7Nf z&U$kXexk!c^bqA{AE1K)hzo((NuY1@^jWzfb9YXBixr->gM%k!ix_ZL`6$;cFgRv8-4qM|*7~Z(X@vGAeidTqTN1 z?VhAct7nQUIU6>QvBPXNls5KCiJtbW-?Uy2gV0Ij2DWR$`o4K>r{{Ur13caLN(*<; zfOkKm(Ok*tokq!*r+V&vdi!?rCS93Wn++)4V{n^{-*!u<4(}zv0Z5>?b>K;09f=t{ z+pb>`o8fggisd2P^GpYZ`7zE~zc>TQ;DYh+Yv0{>m)M>vw6SH zVl(fjqLgYOfz=x2N~f^5dy~0T>B-d*kqFtTe8yoffWQDQX<0d(mAh1wE0rXPD8hb4 z(sW%um-Tp^xe#vV<@!8dT%YNs?%1-=J#Wvq`kn6Uyw~So+nTIw1u$=vVc@~ymaNdG zSkv;N)z;<)NArf(>OtFDsZ5Na3nhDAp~{%^4pobzd+oB`Z$IQ?{nl=K@l_waZKWVB zw7_qACZvJ2(zq5B59;YXn{1HtP>rFaySlcTro31m zlKH*lg46GGv+TkaJ9f4*D|3W!257pP5MJL6$r@?GzZYyaE-J*$(3T`C?t{>Sy?gZcXZwN zLu$AwcMnk$vMh>2km#^iu@Dq%sidSuarJIRM0#lzN*OnyLKFhM!pz>2tGAg8u?&C_ z-f;*8ln|k<15uXRc`HIL%Ayl?bQJU!1&i`!1Vnodt{OxfLkU@H zcgw0!uI#GbGM??aS>-C*5h1&xqSPq_PnRg5Bq$F|S}dTpB>?~v5hGGe|O%g9orp|&e-wc>tK^@-<7q0C+^%MH(U56WQxoJ3(*JO;%5pEAk?LA-0XL?~jS+{{w$*2vnFKm>sb5CJ*mohrf^w|nAD zi-`t@oiu}dgIo)c@zu=t36z3c@$h38lD?gz=Aq9`jdlP!ZLC(5DHH+ zpV7QLfn{ml)sFMh`#8UlF7qvy9bk5M*K2PbWLZg9l62?@W*BaVtFt9mu02~RS290+ zH@(H6#+`*z6@gl?MJ)~Y2r*Q>CHwHHag zBuXpMTMn@S>xRho(fgjgP9n1HrV%g{U{@?Kdr1~GSZ`nra*sEFY-|Y_V^b@zvz~kL zvJAI33_HTMJ}+P$!}jgv76rgVgN4DZAFqY?_JU{F42ob8bdsoUL~^_B0dyU%?uwbg}>yj$P!yX_mk=Usc`Jo9#`?Rs%{%tQcKva`i_ zx|)1!NNdGGRmhFaAuv<9Q~+9i*K}7Eup|rX+gcFLguo2XW?uS5-roHUe?$1?>jz7_ z`>=S@SeXqGb=M$gJ5am;le0DFrCzOBs1$p5XH!O~9>HpD^ZV;z04U^U(^)(nezdJt zw_&rI(6cX(gI|kTL1F>}2;d=>?UeZKGW?yow}bgc8a@^kOu8u((L{1&h7aE7~e4$t=5o@SO~Zs=x;%e(5C zlDBS5R-Ch)(B-Ku@X?} zsIr60hadXw`ty8l-(3d^@1!;5sPZZZwJcJQMO2+$g>2rZ6``zm;mjrN#mkSq�FW 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