Showing preview only (1,758K chars total). Download the full file or copy to clipboard to get everything.
Repository: meysamhadeli/booking-microservices-sample
Branch: main
Commit: d99d1a9a9a9d
Files: 555
Total size: 1.5 MB
Directory structure:
gitextract_4va7s4qm/
├── .aspire/
│ └── settings.json
├── .config/
│ └── dotnet-tools.json
├── .dockerignore
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── actions/
│ │ ├── build/
│ │ │ └── action.yml
│ │ ├── build-test/
│ │ │ └── action.yml
│ │ ├── docker-build-publish/
│ │ │ └── action.yml
│ │ └── test/
│ │ └── action.yml
│ ├── release-drafter.yml
│ └── workflows/
│ ├── ci.yml
│ └── release-drafter-labeler.yml
├── .gitignore
├── .husky/
│ ├── commit-msg
│ └── pre-commit
├── CONTRIBUTION.md
├── Directory.Build.props
├── LICENSE
├── README.md
├── assets/
│ ├── booking-microservices.drawio
│ └── vertical-slice-architecture.excalidraw
├── booking-microservices.sln
├── booking.rest
├── commitlint.config.js
├── deployments/
│ ├── configs/
│ │ ├── dashboards.md
│ │ ├── grafana/
│ │ │ ├── dashboards/
│ │ │ │ ├── dotnet-core-endpoint.json
│ │ │ │ ├── dotnet-core.json
│ │ │ │ ├── node-exporter.json
│ │ │ │ ├── postgresql.json
│ │ │ │ └── rabbitmq.json
│ │ │ └── provisioning/
│ │ │ ├── dashboards/
│ │ │ │ └── dashboard.yml
│ │ │ └── datasources/
│ │ │ └── datasource.yml
│ │ ├── loki-config.yaml
│ │ ├── otel-collector-config.yaml
│ │ ├── prometheus.yaml
│ │ └── tempo.yaml
│ ├── docker-compose/
│ │ ├── docker-compose.infrastructure.yaml
│ │ └── docker-compose.yaml
│ └── kubernetes/
│ ├── booking-cert-manager.yml
│ └── booking-microservices.yml
├── global.json
├── package.json
├── scripts/
│ └── setup_kubectl_gitpod.sh
└── src/
├── ApiGateway/
│ ├── Dockerfile
│ └── src/
│ ├── ApiGateway.csproj
│ ├── Program.cs
│ ├── Properties/
│ │ └── launchSettings.json
│ ├── appsettings.Development.json
│ ├── appsettings.docker.json
│ └── appsettings.json
├── Aspire/
│ └── src/
│ ├── AppHost/
│ │ ├── AppHost.csproj
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ └── ServiceDefaults/
│ ├── Extensions.cs
│ └── ServiceDefaults.csproj
├── BuildingBlocks/
│ ├── BuildingBlocks.csproj
│ ├── Caching/
│ │ ├── CachingBehavior.cs
│ │ ├── ICacheRequest.cs
│ │ ├── IInvalidateCacheRequest.cs
│ │ └── InvalidateCachingBehavior.cs
│ ├── Constants/
│ │ └── IdentityConstant.cs
│ ├── Contracts/
│ │ └── EventBus.Messages/
│ │ ├── FlighContracts.cs
│ │ ├── IdentityContracts.cs
│ │ ├── PassengerContracts.cs
│ │ └── ReservationContracts.cs
│ ├── Core/
│ │ ├── CQRS/
│ │ │ ├── ICommand.cs
│ │ │ ├── ICommandHandler.cs
│ │ │ ├── IQuery.cs
│ │ │ └── IQueryHandler.cs
│ │ ├── CompositeEventMapper.cs
│ │ ├── Event/
│ │ │ ├── EventType.cs
│ │ │ ├── IDomainEvent.cs
│ │ │ ├── IEvent.cs
│ │ │ ├── IHaveIntegrationEvent.cs
│ │ │ ├── IIntegrationEvent.cs
│ │ │ ├── IInternalCommand.cs
│ │ │ ├── InternalCommand.cs
│ │ │ └── MessageEnvelope.cs
│ │ ├── EventDispatcher.cs
│ │ ├── IEventDispatcher.cs
│ │ ├── IEventMapper.cs
│ │ ├── IntegrationEventWrapper.cs
│ │ ├── Model/
│ │ │ ├── Aggregate.cs
│ │ │ ├── Entity.cs
│ │ │ ├── IAggregate.cs
│ │ │ ├── IEntity.cs
│ │ │ └── IVersion.cs
│ │ └── Pagination/
│ │ ├── Extensions.cs
│ │ ├── IPageList.cs
│ │ ├── IPageQuery.cs
│ │ ├── IPageRequest.cs
│ │ └── PageList.cs
│ ├── EFCore/
│ │ ├── AppDbContextBase.cs
│ │ ├── DesignTimeDbContextFactoryBase.cs
│ │ ├── EfTxBehavior.cs
│ │ ├── Extensions.cs
│ │ ├── IDataSeeder.cs
│ │ ├── IDbContext.cs
│ │ ├── ISeedManager.cs
│ │ ├── PostgresOptions.cs
│ │ └── SeedManagers.cs
│ ├── EventStoreDB/
│ │ ├── BackgroundWorkers/
│ │ │ └── BackgroundWorker.cs
│ │ ├── Config.cs
│ │ ├── Events/
│ │ │ ├── AggregateEventSourcing.cs
│ │ │ ├── AggregateStreamExtensions.cs
│ │ │ ├── EventTypeMapper.cs
│ │ │ ├── IAggregateEventSourcing.cs
│ │ │ ├── IEventHandler.cs
│ │ │ ├── IExternalEvent.cs
│ │ │ ├── IProjection.cs
│ │ │ ├── StreamEvent.cs
│ │ │ ├── StreamEventExtensions.cs
│ │ │ └── StreamNameMapper.cs
│ │ ├── Extensions.cs
│ │ ├── Projections/
│ │ │ ├── IProjectionProcessor.cs
│ │ │ ├── IProjectionPublisher.cs
│ │ │ └── ProjectionPublisher.cs
│ │ ├── Repository/
│ │ │ ├── EventStoreDBRepository.cs
│ │ │ └── RepositoryExtensions.cs
│ │ ├── Serialization/
│ │ │ ├── EventStoreDBSerializer.cs
│ │ │ ├── JsonObjectContractProvider.cs
│ │ │ ├── NonDefaultConstructorContractResolver.cs
│ │ │ └── SerializationExtensions.cs
│ │ └── Subscriptions/
│ │ ├── EventStoreDBSubscriptionCheckpointRepository.cs
│ │ ├── EventStoreDBSubscriptionToAll.cs
│ │ ├── ISubscriptionCheckpointRepository.cs
│ │ └── InMemorySubscriptionCheckpointRepository.cs
│ ├── Exception/
│ │ ├── AggregateNotFoundException.cs
│ │ ├── AppException.cs
│ │ ├── BadRequestException.cs
│ │ ├── ConflictException.cs
│ │ ├── CustomException.cs
│ │ ├── DomainException.cs
│ │ ├── GrpcExceptionInterceptor.cs
│ │ ├── InternalServerException.cs
│ │ ├── NotFoundException.cs
│ │ ├── ProblemDetailsWithCode.cs
│ │ └── ValidationException.cs
│ ├── HealthCheck/
│ │ ├── Extensions.cs
│ │ └── HealthOptions.cs
│ ├── Jwt/
│ │ ├── AuthHeaderHandler.cs
│ │ └── JwtExtensions.cs
│ ├── Logging/
│ │ └── LoggingBehavior.cs
│ ├── Mapster/
│ │ └── Extensions.cs
│ ├── MassTransit/
│ │ ├── ConsumeFilter.cs
│ │ ├── Extensions.cs
│ │ ├── RabbitMqOptions.cs
│ │ └── TransportType.cs
│ ├── Mongo/
│ │ ├── Extensions.cs
│ │ ├── IMongoDbContext.cs
│ │ ├── IMongoRepository.cs
│ │ ├── IMongoUnitOfWork.cs
│ │ ├── IRepository.cs
│ │ ├── ITransactionAble.cs
│ │ ├── IUnitOfWork.cs
│ │ ├── ImmutablePocoConvention.cs
│ │ ├── MicroBootstrap.Persistence.Mongo.csproj
│ │ ├── MongoDbContext.cs
│ │ ├── MongoOptions.cs
│ │ ├── MongoRepository.cs
│ │ └── MongoUnitOfWork.cs
│ ├── OpenApi/
│ │ ├── Extensions.cs
│ │ └── SecuritySchemeDocumentTransformer.cs
│ ├── OpenTelemetryCollector/
│ │ ├── ActivityExtensions.cs
│ │ ├── ActivityInfo.cs
│ │ ├── Behaviors/
│ │ │ └── ObservabilityPipelineBehavior.cs
│ │ ├── CoreDiagnostics/
│ │ │ ├── Commands/
│ │ │ │ ├── CommandHandlerActivity.cs
│ │ │ │ └── CommandHandlerMetrics.cs
│ │ │ └── Query/
│ │ │ ├── QueryHandlerActivity.cs
│ │ │ └── QueryHandlerMetrics.cs
│ │ ├── CreateActivityInfo.cs
│ │ ├── DiagnosticsProvider/
│ │ │ ├── CustomeDiagnosticsProvider.cs
│ │ │ └── IDiagnosticsProvider.cs
│ │ ├── Extensions.cs
│ │ ├── ObservabilityConstant.cs
│ │ ├── ObservabilityOptions.cs
│ │ └── TelemetryTags.cs
│ ├── PersistMessageProcessor/
│ │ ├── Extensions.cs
│ │ ├── IPersistMessageDbContext.cs
│ │ ├── IPersistMessageProcessor.cs
│ │ ├── MessageDeliveryType.cs
│ │ ├── MessageStatus.cs
│ │ ├── PersistMessage.cs
│ │ ├── PersistMessageBackgroundService.cs
│ │ ├── PersistMessageDbContext.cs
│ │ ├── PersistMessageOptions.cs
│ │ └── PersistMessageProcessor.cs
│ ├── Polly/
│ │ └── Extensions.cs
│ ├── ProblemDetails/
│ │ └── Extensions.cs
│ ├── TestBase/
│ │ ├── TestBase.cs
│ │ └── TestContainers.cs
│ ├── Utils/
│ │ ├── NoSynchronizationContextScope.cs
│ │ ├── ServiceLocator.cs
│ │ └── TypeProvider.cs
│ ├── Validation/
│ │ ├── Extensions.cs
│ │ ├── ValidationBehavior.cs
│ │ ├── ValidationError.cs
│ │ └── ValidationResultModel.cs
│ └── Web/
│ ├── ApiVersioningExtensions.cs
│ ├── AppOptions.cs
│ ├── BaseController.cs
│ ├── ConfigurationExtensions.cs
│ ├── ConfigurationHelper.cs
│ ├── CorrelationExtensions.cs
│ ├── CurrentUserProvider.cs
│ ├── EndpointConfig.cs
│ ├── IMinimalEndpoint.cs
│ ├── MinimalApiExtensions.cs
│ ├── ServiceCollectionExtensions.cs
│ ├── ServiceProviderExtensions.cs
│ └── SlugifyParameterTransformer.cs
└── Services/
├── Booking/
│ ├── Dockerfile
│ ├── src/
│ │ ├── Booking/
│ │ │ ├── AssemblyInfo.cs
│ │ │ ├── Booking/
│ │ │ │ ├── Dtos/
│ │ │ │ │ └── CreateReservation.cs
│ │ │ │ ├── Exceptions/
│ │ │ │ │ ├── BookingAlreadyExistException.cs
│ │ │ │ │ ├── FlightNotFoundException.cs
│ │ │ │ │ ├── InvalidAircraftIdException.cs
│ │ │ │ │ ├── InvalidArriveAirportIdException.cs
│ │ │ │ │ ├── InvalidDepartureAirportIdException.cs
│ │ │ │ │ ├── InvalidFlightDateException.cs
│ │ │ │ │ ├── InvalidFlightNumberException.cs
│ │ │ │ │ ├── InvalidPassengerNameException.cs
│ │ │ │ │ ├── InvalidPriceException.cs
│ │ │ │ │ └── SeatNumberException.cs
│ │ │ │ ├── Features/
│ │ │ │ │ ├── BookingMappings.cs
│ │ │ │ │ └── CreatingBook/
│ │ │ │ │ └── V1/
│ │ │ │ │ └── CreateBooking.cs
│ │ │ │ ├── Models/
│ │ │ │ │ ├── Booking.cs
│ │ │ │ │ └── BookingReadModel.cs
│ │ │ │ └── ValueObjects/
│ │ │ │ ├── PassengerInfo.cs
│ │ │ │ └── Trip.cs
│ │ │ ├── Booking.csproj
│ │ │ ├── BookingEventMapper.cs
│ │ │ ├── BookingProjection.cs
│ │ │ ├── BookingRoot.cs
│ │ │ ├── Configuration/
│ │ │ │ └── GrpcOptions.cs
│ │ │ ├── Data/
│ │ │ │ └── BookingReadDbContext.cs
│ │ │ ├── Extensions/
│ │ │ │ └── Infrastructure/
│ │ │ │ ├── GrpcClientExtensions.cs
│ │ │ │ ├── InfrastructureExtensions.cs
│ │ │ │ └── MediatRExtensions.cs
│ │ │ └── GrpcClient/
│ │ │ └── Protos/
│ │ │ ├── flight.proto
│ │ │ └── passenger.proto
│ │ └── Booking.Api/
│ │ ├── Booking.Api.csproj
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.docker.json
│ │ ├── appsettings.json
│ │ └── appsettings.test.json
│ └── tests/
│ ├── IntegrationTest/
│ │ ├── Booking/
│ │ │ └── Features/
│ │ │ └── CreateBookingTests.cs
│ │ ├── BookingIntegrationTestBase.cs
│ │ ├── Fakes/
│ │ │ ├── FakeCreateBookingCommand.cs
│ │ │ ├── FakeFlightResponse.cs
│ │ │ ├── FakeGetAvailableSeatsResponse.cs
│ │ │ ├── FakePassengerResponse.cs
│ │ │ └── FakeReserveSeatResponse.cs
│ │ ├── Integration.Test.csproj
│ │ └── xunit.runner.json
│ ├── PerformanceTest/
│ │ ├── .openapi-generator/
│ │ │ ├── FILES
│ │ │ └── VERSION
│ │ ├── .openapi-generator-ignore
│ │ ├── README.md
│ │ └── script.js
│ └── tests.sln
├── Flight/
│ ├── Dockerfile
│ ├── src/
│ │ ├── Flight/
│ │ │ ├── Aircrafts/
│ │ │ │ ├── Dtos/
│ │ │ │ │ └── AircraftDto.cs
│ │ │ │ ├── Exceptions/
│ │ │ │ │ ├── AircraftAlreadyExistException.cs
│ │ │ │ │ ├── InvalidAircraftIdException.cs
│ │ │ │ │ ├── InvalidManufacturingYearException.cs
│ │ │ │ │ ├── InvalidModelException.cs
│ │ │ │ │ └── InvalidNameException.cs
│ │ │ │ ├── Features/
│ │ │ │ │ ├── AircraftMappings.cs
│ │ │ │ │ └── CreatingAircraft/
│ │ │ │ │ └── V1/
│ │ │ │ │ ├── CreateAircraft.cs
│ │ │ │ │ └── CreateAircraftMongo.cs
│ │ │ │ ├── Models/
│ │ │ │ │ ├── Aircraft.cs
│ │ │ │ │ └── AircraftReadModel.cs
│ │ │ │ └── ValueObjects/
│ │ │ │ ├── AircraftId.cs
│ │ │ │ ├── ManufacturingYear.cs
│ │ │ │ ├── Model.cs
│ │ │ │ └── Name.cs
│ │ │ ├── Airports/
│ │ │ │ ├── Dtos/
│ │ │ │ │ └── AirportDto.cs
│ │ │ │ ├── Exceptions/
│ │ │ │ │ ├── AirportAlreadyExistException.cs
│ │ │ │ │ ├── InvalidAddressException.cs
│ │ │ │ │ ├── InvalidAirportIdException.cs
│ │ │ │ │ ├── InvalidCodeException.cs
│ │ │ │ │ └── InvalidNameException.cs
│ │ │ │ ├── Features/
│ │ │ │ │ ├── AirportMappings.cs
│ │ │ │ │ └── CreatingAirport/
│ │ │ │ │ └── V1/
│ │ │ │ │ ├── CreateAirport.cs
│ │ │ │ │ └── CreateAirportMongo.cs
│ │ │ │ ├── Models/
│ │ │ │ │ ├── Airport.cs
│ │ │ │ │ └── AirportReadModel.cs
│ │ │ │ └── ValueObjects/
│ │ │ │ ├── Address.cs
│ │ │ │ ├── AirportId.cs
│ │ │ │ ├── Code.cs
│ │ │ │ └── Name.cs
│ │ │ ├── AssemblyInfo.cs
│ │ │ ├── Data/
│ │ │ │ ├── Configurations/
│ │ │ │ │ ├── AircraftConfiguration.cs
│ │ │ │ │ ├── AirportConfiguration.cs
│ │ │ │ │ ├── FlightConfiguration.cs
│ │ │ │ │ └── SeatConfiguration.cs
│ │ │ │ ├── DesignTimeDbContextFactory.cs
│ │ │ │ ├── FlightDbContext.cs
│ │ │ │ ├── FlightReadDbContext.cs
│ │ │ │ ├── Migrations/
│ │ │ │ │ ├── 20230611230948_initial.Designer.cs
│ │ │ │ │ ├── 20230611230948_initial.cs
│ │ │ │ │ └── FlightDbContextModelSnapshot.cs
│ │ │ │ ├── Seed/
│ │ │ │ │ ├── FlightDataSeeder.cs
│ │ │ │ │ └── InitialData.cs
│ │ │ │ └── readme.md
│ │ │ ├── Extensions/
│ │ │ │ └── Infrastructure/
│ │ │ │ ├── InfrastructureExtensions.cs
│ │ │ │ └── MediatRExtensions.cs
│ │ │ ├── Flight.csproj
│ │ │ ├── FlightEventMapper.cs
│ │ │ ├── FlightRoot.cs
│ │ │ ├── Flights/
│ │ │ │ ├── Dtos/
│ │ │ │ │ └── FlightDto.cs
│ │ │ │ ├── Enums/
│ │ │ │ │ └── FlightStatus.cs
│ │ │ │ ├── Exceptions/
│ │ │ │ │ ├── FlightAlreadyExistException.cs
│ │ │ │ │ ├── FlightNotFountException.cs
│ │ │ │ │ ├── InvalidArriveDateException.cs
│ │ │ │ │ ├── InvalidDepartureDateException.cs
│ │ │ │ │ ├── InvalidDurationException.cs
│ │ │ │ │ ├── InvalidFlightDateException.cs
│ │ │ │ │ ├── InvalidFlightIdException.cs
│ │ │ │ │ ├── InvalidFlightNumberException.cs
│ │ │ │ │ └── InvalidPriceException.cs
│ │ │ │ ├── Features/
│ │ │ │ │ ├── CreatingFlight/
│ │ │ │ │ │ └── V1/
│ │ │ │ │ │ ├── CreateFlight.cs
│ │ │ │ │ │ └── CreateFlightMongo.cs
│ │ │ │ │ ├── DeletingFlight/
│ │ │ │ │ │ └── V1/
│ │ │ │ │ │ ├── DeleteFlight.cs
│ │ │ │ │ │ └── DeleteFlightMongo.cs
│ │ │ │ │ ├── FlightMappings.cs
│ │ │ │ │ ├── GettingAvailableFlights/
│ │ │ │ │ │ └── V1/
│ │ │ │ │ │ └── GetAvailableFlights.cs
│ │ │ │ │ ├── GettingFlightById/
│ │ │ │ │ │ └── V1/
│ │ │ │ │ │ └── GetFlightById.cs
│ │ │ │ │ └── UpdatingFlight/
│ │ │ │ │ └── V1/
│ │ │ │ │ ├── UpdateFlight.cs
│ │ │ │ │ └── UpdateFlightMongo.cs
│ │ │ │ ├── Models/
│ │ │ │ │ ├── Flight.cs
│ │ │ │ │ └── FlightReadModel.cs
│ │ │ │ └── ValueObjects/
│ │ │ │ ├── ArriveDate.cs
│ │ │ │ ├── DepartureDate.cs
│ │ │ │ ├── DurationMinutes.cs
│ │ │ │ ├── FlightDate.cs
│ │ │ │ ├── FlightId.cs
│ │ │ │ ├── FlightNumber.cs
│ │ │ │ └── Price.cs
│ │ │ ├── GrpcServer/
│ │ │ │ ├── Protos/
│ │ │ │ │ └── flight.proto
│ │ │ │ └── Services/
│ │ │ │ └── FlightGrpcServices.cs
│ │ │ └── Seats/
│ │ │ ├── Dtos/
│ │ │ │ └── SeatDto.cs
│ │ │ ├── Enums/
│ │ │ │ ├── SeatClass.cs
│ │ │ │ └── SeatType.cs
│ │ │ ├── Exceptions/
│ │ │ │ ├── AllSeatsFullException.cs
│ │ │ │ ├── InvalidSeatIdException.cs
│ │ │ │ ├── InvalidSeatNumberException.cs
│ │ │ │ ├── SeatAlreadyExistException.cs
│ │ │ │ └── SeatNumberIncorrectException.cs
│ │ │ ├── Features/
│ │ │ │ ├── CreatingSeat/
│ │ │ │ │ └── V1/
│ │ │ │ │ ├── CreateSeat.cs
│ │ │ │ │ └── CreateSeatMongo.cs
│ │ │ │ ├── GettingAvailableSeats/
│ │ │ │ │ └── V1/
│ │ │ │ │ └── GetAvailableSeats.cs
│ │ │ │ ├── ReservingSeat/
│ │ │ │ │ └── V1/
│ │ │ │ │ ├── ReserveSeat.cs
│ │ │ │ │ └── ReserveSeatMongo.cs
│ │ │ │ └── SeatMappings.cs
│ │ │ ├── Models/
│ │ │ │ ├── Seat.cs
│ │ │ │ └── SeatReadModel.cs
│ │ │ └── ValueObjects/
│ │ │ ├── SeatId.cs
│ │ │ └── SeatNumber.cs
│ │ └── Flight.Api/
│ │ ├── Flight.Api.csproj
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.docker.json
│ │ ├── appsettings.json
│ │ └── appsettings.test.json
│ └── tests/
│ ├── EndToEndTest/
│ │ ├── EndToEnd.Test.csproj
│ │ ├── Fakes/
│ │ │ ├── FakeCreateFlightCommand.cs
│ │ │ └── FakeCreateFlightMongoCommand.cs
│ │ ├── Flight/
│ │ │ └── Features/
│ │ │ ├── CreateFlightTests.cs
│ │ │ └── GetFlightByIdTests.cs
│ │ ├── FlightEndToEndTestBase.cs
│ │ ├── FlightTestDataSeeder.cs
│ │ ├── Routes/
│ │ │ └── ApiRoutes.cs
│ │ └── xunit.runner.json
│ ├── IntegrationTest/
│ │ ├── Aircraft/
│ │ │ └── Features/
│ │ │ └── CreateAircraftTests.cs
│ │ ├── Airport/
│ │ │ └── Features/
│ │ │ └── CreateAirportTests.cs
│ │ ├── Fakes/
│ │ │ ├── FakeCreateAircraftCommand.cs
│ │ │ ├── FakeCreateAirportCommand.cs
│ │ │ ├── FakeCreateFlightCommand.cs
│ │ │ ├── FakeCreateFlightMongoCommand.cs
│ │ │ ├── FakeCreateSeatCommand.cs
│ │ │ ├── FakeCreateSeatMongoCommand.cs
│ │ │ └── FakeUpdateFlightCommand.cs
│ │ ├── Flight/
│ │ │ └── Features/
│ │ │ ├── CreateFlightTests.cs
│ │ │ ├── DeleteFlightTests.cs
│ │ │ ├── GetAvailableFlightsTests.cs
│ │ │ ├── GetFlightByIdTests.cs
│ │ │ └── UpdateFlightTests.cs
│ │ ├── FlightIntegrationTestBase.cs
│ │ ├── FlightTestDataSeeder.cs
│ │ ├── Integration.Test.csproj
│ │ ├── Seat/
│ │ │ └── Features/
│ │ │ ├── GetAvailableSeatsTests.cs
│ │ │ └── ReserveSeatTests.cs
│ │ └── xunit.runner.json
│ ├── PerformanceTest/
│ │ ├── .openapi-generator/
│ │ │ ├── FILES
│ │ │ └── VERSION
│ │ ├── .openapi-generator-ignore
│ │ ├── README.md
│ │ └── script.js
│ ├── UnitTest/
│ │ ├── Aircraft/
│ │ │ └── Features/
│ │ │ └── CreateAircraftTests/
│ │ │ ├── CreateAircraftCommandHandlerTests.cs
│ │ │ └── CreateAircraftCommandValidatorTests.cs
│ │ ├── Airport/
│ │ │ └── Features/
│ │ │ └── CreateAirportTests/
│ │ │ ├── CreateAirportCommandHandlerTests.cs
│ │ │ └── CreateAirportCommandValidatorTests.cs
│ │ ├── Common/
│ │ │ ├── DbContextFactory.cs
│ │ │ ├── MapperFactory.cs
│ │ │ └── UnitTestFixture.cs
│ │ ├── Fakes/
│ │ │ ├── FakeCreateAircraftCommand.cs
│ │ │ ├── FakeCreateAirportCommand.cs
│ │ │ ├── FakeCreateFlightCommand.cs
│ │ │ ├── FakeCreateSeatCommand.cs
│ │ │ ├── FakeFlightCreate.cs
│ │ │ ├── FakeFlightUpdate.cs
│ │ │ ├── FakeValidateCreateAircraftCommand.cs
│ │ │ ├── FakeValidateCreateAirportCommand.cs
│ │ │ ├── FakeValidateCreateFlightCommand.cs
│ │ │ └── FakeValidateCreateSeatCommand.cs
│ │ ├── Flight/
│ │ │ ├── Features/
│ │ │ │ ├── Domains/
│ │ │ │ │ ├── CreateFlightTests.cs
│ │ │ │ │ └── UpdateFlightTests.cs
│ │ │ │ └── Handlers/
│ │ │ │ └── CreateFlight/
│ │ │ │ ├── CreateFlightCommandHandlerTests.cs
│ │ │ │ └── CreateFlightCommandValidatorTests.cs
│ │ │ └── FlightMappingTests.cs
│ │ ├── Seat/
│ │ │ ├── Features/
│ │ │ │ ├── CreateSeatCommandHandlerTests.cs
│ │ │ │ └── CreateSeatCommandValidatorTests.cs
│ │ │ └── SeatMappingTests.cs
│ │ ├── Unit.Test.csproj
│ │ └── xunit.runner.json
│ └── tests.sln
├── Identity/
│ ├── Dockerfile
│ ├── src/
│ │ ├── Identity/
│ │ │ ├── AssemblyInfo.cs
│ │ │ ├── Configurations/
│ │ │ │ ├── AuthOptions.cs
│ │ │ │ ├── Config.cs
│ │ │ │ └── UserValidator.cs
│ │ │ ├── Data/
│ │ │ │ ├── Configurations/
│ │ │ │ │ ├── RoleClaimConfiguration.cs
│ │ │ │ │ ├── RoleConfiguration.cs
│ │ │ │ │ ├── UserClaimConfiguration.cs
│ │ │ │ │ ├── UserConfiguration.cs
│ │ │ │ │ ├── UserLoginConfiguration.cs
│ │ │ │ │ ├── UserRoleConfiguration.cs
│ │ │ │ │ └── UserTokenConfiguration.cs
│ │ │ │ ├── DesignTimeDbContextFactory.cs
│ │ │ │ ├── IdentityContext.cs
│ │ │ │ ├── Migrations/
│ │ │ │ │ ├── 20230331193410_initial.Designer.cs
│ │ │ │ │ ├── 20230331193410_initial.cs
│ │ │ │ │ └── IdentityContextModelSnapshot.cs
│ │ │ │ ├── Seed/
│ │ │ │ │ ├── IdentityDataSeeder.cs
│ │ │ │ │ └── InitialData.cs
│ │ │ │ └── readme.md
│ │ │ ├── Extensions/
│ │ │ │ └── Infrastructure/
│ │ │ │ ├── IdentityServerExtensions.cs
│ │ │ │ ├── InfrastructureExtensions.cs
│ │ │ │ └── MediatRExtensions.cs
│ │ │ ├── Identity/
│ │ │ │ ├── Constants/
│ │ │ │ │ └── Constants.cs
│ │ │ │ ├── Exceptions/
│ │ │ │ │ └── RegisterIdentityUserException.cs
│ │ │ │ ├── Features/
│ │ │ │ │ ├── IdentityMappings.cs
│ │ │ │ │ └── RegisteringNewUser/
│ │ │ │ │ └── V1/
│ │ │ │ │ └── RegisterNewUser.cs
│ │ │ │ └── Models/
│ │ │ │ ├── Role.cs
│ │ │ │ ├── RoleClaim.cs
│ │ │ │ ├── User.cs
│ │ │ │ ├── UserClaim.cs
│ │ │ │ ├── UserLogin.cs
│ │ │ │ ├── UserRole.cs
│ │ │ │ └── UserToken.cs
│ │ │ ├── Identity.csproj
│ │ │ ├── IdentityEventMapper.cs
│ │ │ └── IdentityRoot.cs
│ │ └── Identity.Api/
│ │ ├── Identity.Api.csproj
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.docker.json
│ │ ├── appsettings.json
│ │ ├── appsettings.test.json
│ │ └── keys/
│ │ ├── is-signing-key-0AC3347A09AA5E44E947F3E30ED54871.json
│ │ ├── is-signing-key-A57781A0405849BDE786A79636460E49.json
│ │ ├── is-signing-key-B3C31EEE2718D3C5004C6E85AD74F26C.json
│ │ └── is-signing-key-E1668D5B7CCDD18C610506FCA7C5D194.json
│ └── tests/
│ ├── IntegrationTest/
│ │ ├── Fakes/
│ │ │ └── FakeRegisterNewUserCommand.cs
│ │ ├── Identity/
│ │ │ └── Features/
│ │ │ └── RegisterNewUserTests.cs
│ │ ├── IdentityIntegrationTestBase.cs
│ │ ├── IdentityTestDataSeeder.cs
│ │ ├── Integration.Test.csproj
│ │ └── xunit.runner.json
│ ├── PerformanceTest/
│ │ ├── .openapi-generator/
│ │ │ ├── FILES
│ │ │ └── VERSION
│ │ ├── .openapi-generator-ignore
│ │ ├── README.md
│ │ └── script.js
│ └── tests.sln
└── Passenger/
├── Dockerfile
├── src/
│ ├── Passenger/
│ │ ├── AssemblyInfo.cs
│ │ ├── Data/
│ │ │ ├── Configurations/
│ │ │ │ └── PassengerConfiguration.cs
│ │ │ ├── DesignTimeDbContextFactory.cs
│ │ │ ├── Migrations/
│ │ │ │ ├── 20230611213031_initial.Designer.cs
│ │ │ │ ├── 20230611213031_initial.cs
│ │ │ │ └── PassengerDbContextModelSnapshot.cs
│ │ │ ├── PassengerDbContext.cs
│ │ │ ├── PassengerReadDbContext.cs
│ │ │ └── readme.md
│ │ ├── Exceptions/
│ │ │ ├── InvalidAgeException.cs
│ │ │ ├── InvalidNameException.cs
│ │ │ ├── InvalidPassengerIdException.cs
│ │ │ ├── InvalidPassportNumberException.cs
│ │ │ ├── PassengerAlreadyExist.cs
│ │ │ └── PassengerNotFoundException.cs
│ │ ├── Extensions/
│ │ │ └── Infrastructure/
│ │ │ ├── InfrastructureExtensions.cs
│ │ │ └── MediatRExtensions.cs
│ │ ├── GrpcServer/
│ │ │ ├── Protos/
│ │ │ │ └── passenger.proto
│ │ │ └── Services/
│ │ │ └── PassengerGrpcServices.cs
│ │ ├── Identity/
│ │ │ └── Consumers/
│ │ │ └── RegisteringNewUser/
│ │ │ └── V1/
│ │ │ ├── PassengerCreatedDomainEvent.cs
│ │ │ └── RegisterNewUser.cs
│ │ ├── Passenger.csproj
│ │ ├── PassengerEventMapper.cs
│ │ ├── PassengerRoot.cs
│ │ └── Passengers/
│ │ ├── Dtos/
│ │ │ └── PassengerDto.cs
│ │ ├── Enums/
│ │ │ └── PassengerType.cs
│ │ ├── Exceptions/
│ │ │ ├── InvalidAgeException.cs
│ │ │ ├── InvalidNameException.cs
│ │ │ ├── InvalidPassportNumberException.cs
│ │ │ ├── PassengerAlreadyExist.cs
│ │ │ └── PassengerNotFoundException.cs
│ │ ├── Features/
│ │ │ ├── CompletingRegisterPassenger/
│ │ │ │ └── V1/
│ │ │ │ ├── CompleteRegisterPassenger.cs
│ │ │ │ └── CompleteRegisterPassengerMongo.cs
│ │ │ ├── GettingPassengerById/
│ │ │ │ └── V1/
│ │ │ │ └── GetPassengerById.cs
│ │ │ └── PassengerMappings.cs
│ │ ├── Models/
│ │ │ ├── Passenger.cs
│ │ │ └── PassengerReadModel.cs
│ │ └── ValueObjects/
│ │ ├── Age.cs
│ │ ├── Name.cs
│ │ ├── PassengerId.cs
│ │ └── PassportNumber.cs
│ └── Passenger.Api/
│ ├── Passenger.Api.csproj
│ ├── Program.cs
│ ├── Properties/
│ │ └── launchSettings.json
│ ├── appsettings.Development.json
│ ├── appsettings.docker.json
│ ├── appsettings.json
│ └── appsettings.test.json
└── tests/
├── IntegrationTest/
│ ├── Fakes/
│ │ ├── FakeCompleteRegisterPassengerCommand.cs
│ │ └── FakeCompleteRegisterPassengerMongoCommand.cs
│ ├── Integration.Test.csproj
│ ├── Passenger/
│ │ └── Features/
│ │ ├── CompleteRegisterPassengerTests.cs
│ │ └── GetPassengerByIdTests.cs
│ ├── PassengerIntegrationTestBase.cs
│ └── xunit.runner.json
├── PerformanceTest/
│ ├── .openapi-generator/
│ │ ├── FILES
│ │ └── VERSION
│ ├── .openapi-generator-ignore
│ ├── README.md
│ └── script.js
└── tests.sln
================================================
FILE CONTENTS
================================================
================================================
FILE: .aspire/settings.json
================================================
{
"appHostPath": "../src/Aspire/src/AppHost/AppHost.csproj"
}
================================================
FILE: .config/dotnet-tools.json
================================================
{
"version": 1,
"isRoot": true,
"tools": {
"dotnet-outdated-tool": {
"version": "4.6.9",
"commands": [
"dotnet-outdated"
]
},
"dotnet-ef": {
"version": "10.0.3",
"commands": [
"dotnet-ef"
]
},
"aspire.cli": {
"version": "13.1.1",
"commands": [
"aspire"
]
},
"csharpier": {
"version": "0.30.6",
"commands": [
"dotnet-csharpier"
]
}
}
}
================================================
FILE: .dockerignore
================================================
**/.classpath
**/.dockerignore
**/.env
**/.git
**/.gitignore
**/.project
**/.settings
**/.toolstarget
**/.vs
**/.vscode
**/*.*proj.user
**/*.dbmdl
**/*.jfm
**/azds.yaml
**/bin/
**/charts
**/docker-compose*
**/Dockerfile*
**/node_modules
**/npm-debug.log
**/obj/
**/.tye/
**/secrets.dev.yaml
**/values.dev.yaml
**/*.jwk
**/keys
LICENSE
README.md
CHANGELOG.md
================================================
FILE: .editorconfig
================================================
# https://editorconfig.org
# https://www.jetbrains.com/help/resharper/Using_EditorConfig.html
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/configuration-files
# When opening a file, EditorConfig plugins look for a file named .editorconfig in the directory of the opened file and in every parent directory. A search for .editorconfig files will stop if the root filepath is reached or an EditorConfig file with `root=true` is found.
# Remove the line below if you want to inherit .editorconfig settings from higher directories
##################################################################################
## https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/
## https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/
## Microsoft Rules
root = true
# All files
[*]
indent_style = space
# Xml files
[*.xml]
indent_size = 2
# C# files
[*.cs]
#### Core EditorConfig Options ####
# Indentation and spacing
indent_size = 4
tab_width = 4
max_line_length = 120
# New line preferences
insert_final_newline = false
#### .NET Coding Conventions ####
[*.{cs,vb}]
# Organize usings
dotnet_separate_import_directive_groups = false
dotnet_sort_system_directives_first = true
file_header_template = unset
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/overview?#enable-on-build
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/language-rules#option-format
# 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
# 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
# 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
# Modifier preferences
dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent
# Expression-level preferences
dotnet_style_coalesce_expression = true:suggestion
dotnet_style_collection_initializer = true:suggestion
dotnet_style_explicit_tuple_names = true:suggestion
dotnet_style_namespace_match_folder = true:suggestion
dotnet_style_null_propagation = true:suggestion
dotnet_style_object_initializer = true:suggestion
dotnet_style_operator_placement_when_wrapping = beginning_of_line
dotnet_style_prefer_auto_properties = true:suggestion
dotnet_style_prefer_collection_expression = when_types_loosely_match:suggestion
dotnet_style_prefer_compound_assignment = true:suggestion
dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion
dotnet_style_prefer_conditional_expression_over_return = true:suggestion
dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed: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
# Field preferences
dotnet_style_readonly_field = true:warning
# Parameter preferences
dotnet_code_quality_unused_parameters = all:suggestion
# Suppression preferences
dotnet_remove_unnecessary_suppression_exclusions = none
#### 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
# 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_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_extended_property_pattern = true:suggestion
csharp_style_prefer_not_pattern = true:suggestion
csharp_style_prefer_pattern_matching = true:silent
csharp_style_prefer_switch_expression = true:suggestion
# Null-checking preferences
csharp_style_conditional_delegate_call = true:suggestion
# Modifier preferences
csharp_prefer_static_anonymous_function = true:suggestion
csharp_prefer_static_local_function = true:warning
csharp_preferred_modifier_order = public,private,protected,internal,file,const,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async:suggestion
csharp_style_prefer_readonly_struct = true:suggestion
csharp_style_prefer_readonly_struct_member = true:suggestion
# Code-block preferences
csharp_prefer_braces = true:silent
csharp_prefer_simple_using_statement = true:suggestion
csharp_style_namespace_declarations = file_scoped:suggestion
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_implicit_object_creation_when_type_is_apparent = true:suggestion
csharp_style_inlined_variable_declaration = true:suggestion
csharp_style_prefer_index_operator = true:suggestion
csharp_style_prefer_local_over_anonymous_function = true:suggestion
csharp_style_prefer_null_check_over_type_check = true:suggestion
csharp_style_prefer_range_operator = true:suggestion
csharp_style_prefer_tuple_swap = true:suggestion
csharp_style_prefer_utf8_string_literals = 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
# 'using' directive preferences
csharp_using_directive_placement = outside_namespace:silent
#### C# Formatting Rules ####
# New line preferences
csharp_new_line_before_catch = true
csharp_new_line_before_else = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_open_brace = all
csharp_new_line_between_query_expression_clauses = true
# Indentation preferences
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents = true
csharp_indent_case_contents_when_block = true
csharp_indent_labels = one_less_than_current
csharp_indent_switch_labels = true
# Space preferences
csharp_space_after_cast = false
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_after_comma = true
csharp_space_after_dot = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_after_semicolon_in_for_statement = true
csharp_space_around_binary_operators = before_and_after
csharp_space_around_declaration_statements = false
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_before_comma = false
csharp_space_before_dot = false
csharp_space_before_open_square_brackets = false
csharp_space_before_semicolon_in_for_statement = false
csharp_space_between_empty_square_brackets = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
csharp_space_between_method_declaration_name_and_open_parenthesis = false
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_parentheses = false
csharp_space_between_square_brackets = false
# Wrapping preferences
csharp_preserve_single_line_blocks = true
csharp_preserve_single_line_statements = true
#### 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.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.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
# 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.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.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
dotnet_naming_symbols.parameters.applicable_kinds = parameter
dotnet_naming_symbols.parameters.applicable_accessibilities = *
dotnet_naming_symbols.parameters.required_modifiers =
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_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
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
dotnet_naming_symbols.local_functions.applicable_kinds = local_function
dotnet_naming_symbols.local_functions.applicable_accessibilities = *
dotnet_naming_symbols.local_functions.required_modifiers =
# Naming styles
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
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
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
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
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
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
##################################################################################
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/
##################################################################################
## Roslyn Code quality rules
dotnet_diagnostic.CA1030.severity = none
dotnet_diagnostic.CA1034.severity = none
dotnet_diagnostic.CA1062.severity = suggestion
dotnet_code_quality.CA1062.exclude_extension_method_this_parameter = true
dotnet_code_quality.exclude_extension_method_this_parameter = true
dotnet_code_quality.null_check_validation_methods = ThrowIfArgumentIsNull
# CA1031: Do not catch general exception types
dotnet_diagnostic.CA1031.severity = none
# CA1303: Do not pass literals as localized parameters
dotnet_diagnostic.CA1303.severity = none
# CA1304: Specify CultureInfo
dotnet_diagnostic.CA1304.severity = error
# CA1307: Specify StringComparison for clarity
dotnet_diagnostic.CA1307.severity = error
# CA1308: Normalize strings to uppercase
dotnet_diagnostic.CA1308.severity = none
# CA1309: Use ordinal StringComparison
dotnet_diagnostic.CA1309.severity = error
# CA1724: Type names should not match namespaces
dotnet_diagnostic.CA1724.severity = none
# CA1819: Properties should not return arrays
dotnet_diagnostic.CA1819.severity = none
# CA1851: Possible multiple enumerations of IEnumerable collection. Related to GH-issue #2000
dotnet_diagnostic.CA1851.severity = suggestion
# CA1859: Use concrete types when possible for improved performance
dotnet_diagnostic.CA1859.severity = suggestion
# CA1860: Avoid using 'Enumerable.Any()' extension method
dotnet_diagnostic.CA1860.severity = warning
# CA1861: Avoid constant arrays as arguments
dotnet_diagnostic.CA1861.severity = none
# CA2007: Do not directly await a Task
dotnet_diagnostic.CA2007.severity = none
# CA2225: Operator overloads have named alternates
dotnet_diagnostic.CA2225.severity = none
# CA3075: Insecure DTD Processing
dotnet_diagnostic.CA3075.severity = none
# CA5369: Use XmlReader for Deserialize
dotnet_diagnostic.CA5369.severity = none
# CA1305: Specify IFormatProvider
dotnet_diagnostic.CA1305.severity = None
# CA1063: Implement IDisposable correctly
dotnet_diagnostic.CA1063.severity = None
# CA2201: Do not raise reserved exception types
dotnet_diagnostic.ca2201.severity = Suggestion
# CA1848: Use the LoggerMessage delegates
dotnet_diagnostic.ca1848.severity = Suggestion
# CA1810: Initialize reference type static fields inline
dotnet_diagnostic.ca1810.severity = Suggestion
# CA1725: Parameter names should match base declaration
dotnet_diagnostic.ca1725.severity = Suggestion
# CA1515: Consider making public types internal
dotnet_diagnostic.CA1515.severity = None
# CA2000: Dispose objects before losing scope
dotnet_diagnostic.CA2000.severity = Suggestion
# CA1707: Identifiers should not contain underscores
dotnet_diagnostic.CA1707.severity = None
# CA1716: Identifiers should not match keywords
dotnet_diagnostic.CA1716.severity = Suggestion
# CA1032: Implement standard exception constructors
dotnet_diagnostic.CA1032.severity = Suggestion
# AV1500: A method should not exceed a predefined number (60-100 lines) of lines
dotnet_diagnostic.AV1500.severity = none
##################################################################################
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/
##################################################################################
## Roslyn Code-style rules
dotnet_diagnostic.IDE0048.severity = Suggestion
dotnet_diagnostic.IDE0028.severity = Suggestion
dotnet_diagnostic.IDE0029.severity = Suggestion
dotnet_diagnostic.IDE0030 .severity = Suggestion
dotnet_diagnostic.IDE0004.severity = error
# IDE0005: Remove unnecessary usings/imports
dotnet_diagnostic.IDE0005.severity = warning
# IDE0051: Remove unused private members (no reads or writes)
dotnet_diagnostic.IDE0051.severity = Suggestion
# IDE0052: Remove unread private members (writes but no reads)
dotnet_diagnostic.IDE0052.severity = warning
# Remove unnecessary using directives (IDE0005)
dotnet_diagnostic.IDE0005.severity = none
# CS1574: XML comment on 'construct' has syntactically incorrect cref attribute 'name'
dotnet_diagnostic.CS1574.severity = error
# IDE0055: Fix formatting
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/csharp-formatting-options
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/dotnet-formatting-options
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0055
# https://csharpier.com/docs/IntegratingWithLinters#code-analysis-rules
dotnet_diagnostic.IDE0055.severity = none
##################################################################################
# https://jetbrains.com.xy2401.com/help/resharper/EditorConfig_Index.html
# https://jetbrains.com.xy2401.com/help/resharper/Reference__Code_Inspections_CSHARP.html
## Resharper
# ReSharper properties
resharper_align_linq_query = true
resharper_align_multiline_array_and_object_initializer = true
resharper_align_multiline_binary_patterns = true
resharper_align_multiline_expression = true
resharper_align_multiline_extends_list = true
resharper_align_multiline_parameter = true
resharper_align_multiline_property_pattern = true
resharper_align_multiline_switch_expression = true
resharper_align_multiple_declaration = true
resharper_align_multline_type_parameter_constrains = true
resharper_align_multline_type_parameter_list = true
resharper_align_tuple_components = true
resharper_braces_for_for = required_for_multiline
resharper_braces_for_foreach = required_for_multiline
resharper_braces_for_ifelse = required_for_multiline
resharper_csharp_alignment_tab_fill_style = optimal_fill
resharper_csharp_indent_type_constraints = false
resharper_csharp_int_align_fix_in_adjacent = false
resharper_csharp_outdent_commas = true
resharper_csharp_stick_comment = false
resharper_csharp_wrap_after_declaration_lpar = true
resharper_csharp_wrap_after_invocation_lpar = true
resharper_csharp_wrap_arguments_style = chop_if_long
resharper_csharp_wrap_before_declaration_rpar = true
resharper_csharp_wrap_before_first_type_parameter_constraint = true
resharper_csharp_wrap_before_ternary_opsigns = false
resharper_csharp_wrap_extends_list_style = chop_if_long
resharper_csharp_wrap_multiple_declaration_style = wrap_if_long
resharper_csharp_wrap_multiple_type_parameter_constraints_style = chop_always
resharper_csharp_wrap_parameters_style = chop_if_long
resharper_enforce_line_ending_style = true
resharper_indent_anonymous_method_block = true
resharper_indent_braces_inside_statement_conditions = false
resharper_indent_nested_fixed_stmt = true
resharper_indent_nested_foreach_stmt = true
resharper_indent_nested_for_stmt = true
resharper_indent_nested_lock_stmt = true
resharper_indent_nested_usings_stmt = true
resharper_indent_nested_while_stmt = true
resharper_keep_existing_declaration_block_arrangement = true
resharper_keep_existing_declaration_parens_arrangement = false
resharper_keep_existing_embedded_arrangement = false
resharper_keep_existing_embedded_block_arrangement = true
resharper_keep_existing_enum_arrangement = true
resharper_keep_existing_invocation_parens_arrangement = false
resharper_keep_existing_property_patterns_arrangement = false
resharper_keep_existing_switch_expression_arrangement = false
resharper_max_array_initializer_elements_on_line = 700
resharper_max_formal_parameters_on_line = 500
resharper_max_invocation_arguments_on_line = 700
resharper_new_line_before_while = true
resharper_place_attribute_on_same_line = false
resharper_place_linq_into_on_new_line = false
resharper_place_simple_case_statement_on_same_line = if_owner_is_single_line
resharper_place_simple_property_pattern_on_single_line = false
resharper_show_autodetect_configure_formatting_tip = false
resharper_space_within_single_line_array_initializer_braces = false
resharper_trailing_comma_in_multiline_lists = true
resharper_trailing_comma_in_singleline_lists = true
resharper_use_heuristics_for_body_style = false
resharper_use_indent_from_vs = false
resharper_use_roslyn_logic_for_evident_types = true
resharper_wrap_array_initializer_style = chop_always
resharper_wrap_chained_binary_expressions = chop_if_long
resharper_wrap_chained_binary_patterns = chop_if_long
resharper_wrap_chained_method_calls = chop_if_long
resharper_wrap_for_stmt_header_style = wrap_if_long
resharper_wrap_switch_expression = chop_if_long
resharper_wrap_verbatim_interpolated_strings = chop_if_long
# ReSharper inspection severities
resharper_arrange_accessor_owner_body_highlighting = none
resharper_arrange_redundant_parentheses_highlighting = hint
resharper_arrange_type_member_modifiers_highlighting = hint
resharper_arrange_type_modifiers_highlighting = hint
resharper_check_namespace_highlighting = none
resharper_enforce_if_statement_braces_highlighting = hint
resharper_inconsistent_naming_highlighting = suggestion
resharper_static_member_in_generic_type_highlighting = none
resharper_suggest_var_or_type_built_in_types_highlighting = hint
resharper_suggest_var_or_type_elsewhere_highlighting = hint
resharper_suggest_var_or_type_simple_types_highlighting = hint
resharper_web_config_module_not_resolved_highlighting = warning
resharper_web_config_type_not_resolved_highlighting = warning
resharper_web_config_wrong_module_highlighting = warning
# https://www.jetbrains.com/help/rider/ClassNeverInstantiated.Global.html
resharper_class_never_instantiated_global_highlighting = none
# Convert lambda expression to method group
resharper_convert_closure_to_method_group_highlighting = none
# Start each element in a object or collection initializer on a new line
resharper_wrap_object_and_collection_initializer_style = chop_always
# Force an empty line
resharper_blank_lines_after_multiline_statements = 1
# Don't remove existing line breaks
resharper_keep_existing_initializer_arrangement = true
resharper_keep_existing_arrangement = true
# We care about that extra else after an else-if
resharper_redundant_if_else_block_highlighting = none
# Don't remove explicit default cases in switch statements
resharper_redundant_empty_switch_section_highlighting = none
resharper_align_multiline_binary_expressions_chain = false
# Only use new() when the type is obvious
resharper_object_creation_when_type_not_evident = explicitly_typed
resharper_object_creation_when_type_evident = target_typed
# Indent 4 spaces per necessary indention
resharper_continuous_indent_multiplier = 1
# Avoid breaking a generic definition
resharper_wrap_before_extends_colon = true
resharper_blank_lines_before_multiline_statements = 1
resharper_parentheses_non_obvious_operations = arithmetic, multiplicative, equality, relational, additive
resharper_parentheses_redundancy_style = remove_if_not_clarifies_precedence
##################################################################################
## https://github.com/DotNetAnalyzers/StyleCopAnalyzers/tree/master/documentation
## https://documentation.help/StyleCop/StyleCop.html
## StyleCop.Analyzers
##################################################################################
# Using directive should appear within a namespace declaration
dotnet_diagnostic.sa1200.severity = None
# Generic type parameter documentation should have text.
dotnet_diagnostic.sa1622.severity = None
# XML comment analysis is disabled due to project configuration
dotnet_diagnostic.sa0001.severity = None
# The file header is missing or not located at the top of the file
dotnet_diagnostic.sa1633.severity = None
# Use string.Empty for empty strings
dotnet_diagnostic.sa1122.severity = None
# Variable '_' should begin with lower-case letter
dotnet_diagnostic.sa1312.severity = None
# Parameter '_' should begin with lower-case letter
dotnet_diagnostic.sa1313.severity = None
# Elements should be documented
dotnet_diagnostic.sa1600.severity = None
# Prefix local calls with this
dotnet_diagnostic.sa1101.severity = None
# 'public' members should come before 'private' members
dotnet_diagnostic.sa1202.severity = None
# Comments should contain text
dotnet_diagnostic.sa1120.severity = None
# Constant fields should appear before non-constant fields
dotnet_diagnostic.sa1203.severity = None
# Field '_blah' should not begin with an underscore
dotnet_diagnostic.sa1309.severity = None
# Use trailing comma in multi-line initializers
dotnet_diagnostic.sa1413.severity = None
# A method should not follow a class
dotnet_diagnostic.sa1201.severity = None
# Elements should be separated by blank line
dotnet_diagnostic.sa1516.severity = None
# The parameter spans multiple lines
dotnet_diagnostic.sa1118.severity = None
# Static members should appear before non-static members
dotnet_diagnostic.sa1204.severity = None
# Put constructor initializers on their own line
dotnet_diagnostic.sa1128.severity = None
# Opening braces should not be preceded by blank line
dotnet_diagnostic.sa1509.severity = None
# The parameter should begin on the line after the previous parameter
dotnet_diagnostic.sa1115.severity = None
# File name should match first type name
dotnet_diagnostic.sa1649.severity = None
# File may only contain a single type
dotnet_diagnostic.sa1402.severity = None
# Enumeration items should be documented
dotnet_diagnostic.sa1602.severity = None
# Element should not be on a single line
dotnet_diagnostic.sa1502.severity = None
# Closing parenthesis should not be preceded by a space
dotnet_diagnostic.sa1009.severity = None
# Closing parenthesis should be on line of last parameter
dotnet_diagnostic.sa1111.severity = None
# Braces should not be ommitted
dotnet_diagnostic.sa1503.severity = None
dotnet_diagnostic.sa1401.severity = None
# The parameters to a C# method or indexer call or declaration are not all on the same line or each on a separate line.
# dotnet_diagnostic.SA1117.severity = Suggestion
# The parameters to a C# method or indexer call or declaration span across multiple lines, but the first parameter does not start on the line after the opening bracket.
# dotnet_diagnostic.SA1116.severity = Suggestion
# A C# partial element is missing a documentation header.
dotnet_diagnostic.sa1601.severity = None
# A <param> tag within a C# element’s documentation header is empty.
dotnet_diagnostic.sa1614.severity = None
# A C# element is missing documentation for its return value.
dotnet_diagnostic.sa1615.severity = None
# The <returns> tag within a C# element’s documentation header is empty.
dotnet_diagnostic.sa1616.severity = None
# An opening brace within a C# element is not spaced correctly.
dotnet_diagnostic.sa1012.severity = Suggestion
# A closing brace within a C# element is not spaced correctly.
dotnet_diagnostic.sa1013.severity = Suggestion
# A call to an instance member of the local class or a base class is not prefixed with 'this.', within a C# code file.
dotnet_diagnostic.sa1101.severity = None
# The keywords within the declaration of an element do not follow a standard ordering scheme.
dotnet_diagnostic.SA1206.severity = None
dotnet_diagnostic.SA1106.severity = None
# https://csharpier.com/docs/IntegratingWithLinters#stylecopanalyzers
# IDE0055: Fix formatting
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/csharp-formatting-options
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/dotnet-formatting-options
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0055
# StyleCopAnalyzers
dotnet_diagnostic.SA1000.severity = none
dotnet_diagnostic.SA1009.severity = none
dotnet_diagnostic.SA1111.severity = none
dotnet_diagnostic.SA1118.severity = none
dotnet_diagnostic.SA1137.severity = none
dotnet_diagnostic.SA1413.severity = none
dotnet_diagnostic.SA1500.severity = none
dotnet_diagnostic.SA1501.severity = none
dotnet_diagnostic.SA1502.severity = none
dotnet_diagnostic.SA1504.severity = none
dotnet_diagnostic.SA1515.severity = none
dotnet_diagnostic.SA1516.severity = none
# for csharpier <= 0.21.0
dotnet_diagnostic.SA1127.severity = none
dotnet_diagnostic.SA1128.severity = none
dotnet_diagnostic.SA1001.severity = none
dotnet_diagnostic.SA1002.severity = none
dotnet_diagnostic.SA1003.severity = none
dotnet_diagnostic.SA1007.severity = none
dotnet_diagnostic.SA1008.severity = none
dotnet_diagnostic.SA1010.severity = none
dotnet_diagnostic.SA1011.severity = none
dotnet_diagnostic.SA1012.severity = none
dotnet_diagnostic.SA1013.severity = none
dotnet_diagnostic.SA1014.severity = none
dotnet_diagnostic.SA1015.severity = none
dotnet_diagnostic.SA1016.severity = none
dotnet_diagnostic.SA1017.severity = none
dotnet_diagnostic.SA1018.severity = none
dotnet_diagnostic.SA1019.severity = none
dotnet_diagnostic.SA1020.severity = none
dotnet_diagnostic.SA1021.severity = none
dotnet_diagnostic.SA1022.severity = none
dotnet_diagnostic.SA1023.severity = none
dotnet_diagnostic.SA1024.severity = none
dotnet_diagnostic.SA1025.severity = none
dotnet_diagnostic.SA1026.severity = none
dotnet_diagnostic.SA1027.severity = none
dotnet_diagnostic.SA1028.severity = none
dotnet_diagnostic.SA1102.severity = none
dotnet_diagnostic.SA1103.severity = none
dotnet_diagnostic.SA1104.severity = none
dotnet_diagnostic.SA1105.severity = none
dotnet_diagnostic.SA1107.severity = none
dotnet_diagnostic.SA1110.severity = none
dotnet_diagnostic.SA1112.severity = none
dotnet_diagnostic.SA1113.severity = none
dotnet_diagnostic.SA1114.severity = none
dotnet_diagnostic.SA1115.severity = none
dotnet_diagnostic.SA1116.severity = none
dotnet_diagnostic.SA1117.severity = none
dotnet_diagnostic.SA1127.severity = none
dotnet_diagnostic.SA1128.severity = none
dotnet_diagnostic.SA1136.severity = none
dotnet_diagnostic.SA1505.severity = none
dotnet_diagnostic.SA1506.severity = none
dotnet_diagnostic.SA1507.severity = none
dotnet_diagnostic.SA1508.severity = none
dotnet_diagnostic.SA1509.severity = none
dotnet_diagnostic.SA1510.severity = none
dotnet_diagnostic.SA1511.severity = none
dotnet_diagnostic.SA1517.severity = none
dotnet_diagnostic.SA1518.severity = none
##################################################################################
## https://github.com/meziantou/Meziantou.Analyzer/tree/main/docs
## Meziantou.Analyzer
# MA0048: File name must match type name
dotnet_diagnostic.ma0048.severity = Suggestion
# MA0051: Method is too long
dotnet_diagnostic.ma0051.severity = Suggestion
# https://www.meziantou.net/string-comparisons-are-harder-than-it-seems.htm
# MA0006 - Use String.Equals instead of equality operator
dotnet_diagnostic.ma0006.severity = Suggestion
# MA0002 - IEqualityComparer<string> or IComparer<string> is missing
dotnet_diagnostic.ma0002.severity = Suggestion
# MA0001 - StringComparison is missing
dotnet_diagnostic.ma0001.severity = Suggestion
# https://cezarypiatek.github.io/post/async-analyzers-p2/#13-pass-cancellation-token
# MA0040: Specify a cancellation token
dotnet_diagnostic.ma0032.severity = Suggestion
# https://cezarypiatek.github.io/post/async-analyzers-p2/#13-pass-cancellation-token
# MA0040: Flow the cancellation token when available
dotnet_diagnostic.ma0040.severity = Suggestion
# https://cezarypiatek.github.io/post/async-analyzers-p2/#14-using-cancellation-token-with-iasyncenumerable
# MA0079: Use a cancellation token using .WithCancellation()
dotnet_diagnostic.ma0079.severity = Suggestion
# https://cezarypiatek.github.io/post/async-analyzers-p2/#14-using-cancellation-token-with-iasyncenumerable
# MA0080: Use a cancellation token using .WithCancellation()
dotnet_diagnostic.ma0080.severity = Suggestion
# Use Task.ConfigureAwait(false) as the current SynchronizationContext is not needed
dotnet_diagnostic.MA0004.severity = none
# Add regex evaluation timeout
dotnet_diagnostic.MA0009.severity = none
# Use an overload of 'ToString' that has a 'System.IFormatProvider' parameter. Already caught by CA1305.
dotnet_diagnostic.MA0011.severity = none
# Use an overload of 'System.ArgumentException' with the parameter name. Just a suggestion since we have a bunch of justified exceptions.
dotnet_diagnostic.MA0015.severity = suggestion
# Use an explicit StringComparer to compute hash codes
dotnet_diagnostic.MA0021.severity = none
# Declare types in namespaces. Already caught by CA1050
dotnet_diagnostic.MA0047.severity = none
# Use an overload of 'GetHashCode' that has a StringComparison parameter
dotnet_diagnostic.MA0074.severity = none
# MA0049: Type name should not match containing namespace
dotnet_diagnostic.MA0049.severity = none
##################################################################################
## https://github.com/JosefPihrt/Roslynator/blob/main/docs/Configuration.md
## https://josefpihrt.github.io/docs/
## Roslynator
##################################################################################
# RCS1036 - Remove redundant empty line.
dotnet_diagnostic.rcs1036.severity = None
# RCS1037 - Remove trailing white-space.
dotnet_diagnostic.rcs1037.severity = None
# RCS1194: Implement exception constructors
dotnet_diagnostic.rcs1194.severity = None
# https://cezarypiatek.github.io/post/async-analyzers-p1/#1-redundant-asyncawait
# RCS1174: Remove redundant async/await.
dotnet_diagnostic.rcs1174.severity = error
# https://cezarypiatek.github.io/post/async-analyzers-p2/#10-returning-null-from-a-task-returning-method
# RCS1210: Return Task.FromResult instead of returning null.
dotnet_diagnostic.rcs1210.severity = error
# https://cezarypiatek.github.io/post/async-analyzers-p2/#9-missing-configureawaitbool
# RCS1090: Call 'ConfigureAwait(false)'.
dotnet_diagnostic.rcs1090.severity = Suggestion
# https://cezarypiatek.github.io/post/async-analyzers-p2/#11-asynchronous-method-names-should-end-with-async
#RCS1046: Asynchronous method name should end with 'Async'.
dotnet_diagnostic.rcs1046.severity = Suggestion
# https://cezarypiatek.github.io/post/async-analyzers-p2/#12-non-asynchronous-method-names-shouldnt-end-with-async
# RCS1047: Non-asynchronous method name should not end with 'Async'.
dotnet_diagnostic.rcs1047.severity = error
# https://github.com/JosefPihrt/Roslynator/blob/master/docs/analyzers/RCS1174.md
# RCS1174: Remove redundant async/await
dotnet_diagnostic.rcs1174.severity = Suggestion
# Combine 'Enumerable.Where' method chain. It doesn't make it more readable in all cases.
dotnet_diagnostic.RCS1112.severity = suggestion
# Inline local variable.
dotnet_diagnostic.RCS1124.severity = suggestion
# Add exception to documentation comment. Nice suggestion, but we don't want to document exceptions for internal code.
dotnet_diagnostic.RCS1140.severity = suggestion
# Missing documentation
dotnet_diagnostic.RCS1141.severity = suggestion
dotnet_diagnostic.RCS1142.severity = suggestion
# Use conditional access. Suggestion because it doesn't always improve readability
dotnet_diagnostic.RCS1146.severity = suggestion
# Enum should declare explicit values. Disabled because we're not storing them.
dotnet_diagnostic.RCS1161.severity = none
# Static member in generic type should use a type parameter. Disabled because it's not always applicable.
dotnet_diagnostic.RCS1158.severity = none
# Add region name to #endregion.
dotnet_diagnostic.RCS1189.severity = none
# Convert comment to documentation comment. Disabled because it also complains about SMELL/REFACTOR comments
dotnet_diagnostic.RCS1181.severity = none
# Use Regex instance instead of static method. Disabled because it's not always worth it.
dotnet_diagnostic.RCS1186.severity = none
# Use bit shift operator.
dotnet_diagnostic.RCS1237.severity = none
# RCS1228: Unused element in documentation comment. (Equivalent to SA1614)
dotnet_diagnostic.RCS1228.severity = suggestion
# RCS1047: Non-asynchronous method name should not end with 'Async'
#dotnet_diagnostic.RCS1047.severity = suggestion
##################################################################################
## https://github.com/semihokur/asyncfixer
## AsyncFixer01
##################################################################################
# https://cezarypiatek.github.io/post/async-analyzers-p1/#1-redundant-asyncawait
# AsyncFixer01: Unnecessary async/await usage
dotnet_diagnostic.asyncfixer01.severity = Suggestion
# https://cezarypiatek.github.io/post/async-analyzers-p1/#2-calling-synchronous-method-inside-the-async-method
# AsyncFixer02: Long-running or blocking operations inside an async method
dotnet_diagnostic.asyncfixer02.severity = error
# https://cezarypiatek.github.io/post/async-analyzers-p1/#3-async-void-method
# AsyncFixer03: Fire & forget async void methods
dotnet_diagnostic.asyncfixer03.severity = error
# https://cezarypiatek.github.io/post/async-analyzers-p1/#6-not-awaited-task-inside-the-using-block
# AsyncFixer04: Fire & forget async call inside a using block
dotnet_diagnostic.asyncfixer04.severity = error
##################################################################################
## https://github.com/microsoft/vs-threading
## Microsoft.VisualStudio.Threading.Analyzers
##################################################################################
# https://cezarypiatek.github.io/post/async-analyzers-p1/#2-calling-synchronous-method-inside-the-async-method
# VSTHRD103: Call async methods when in an async method
dotnet_diagnostic.vsthrd103.severity = Suggestion
# https://cezarypiatek.github.io/post/async-analyzers-p1/#3-async-void-method
# VSTHRD100: Avoid async void methods
dotnet_diagnostic.vsthrd100.severity = error
# https://cezarypiatek.github.io/post/async-analyzers-p1/#4-unsupported-async-delegates
# VSTHRD101: Avoid unsupported async delegates
dotnet_diagnostic.vsthrd101.severity = error
# https://cezarypiatek.github.io/post/async-analyzers-p1/#5-not-awaited-task-within-using-expression
# VSTHRD107: Await Task within using expression
dotnet_diagnostic.vsthrd107.severity = error
# https://cezarypiatek.github.io/post/async-analyzers-p1/#7-unobserved-result-of-asynchronous-method
# VSTHRD110: Observe result of async calls
dotnet_diagnostic.vsthrd110.severity = Suggestion
# https://cezarypiatek.github.io/post/async-analyzers-p2/#8-synchronous-waits
# VSTHRD002: Avoid problematic synchronous waits
dotnet_diagnostic.vsthrd002.severity = Suggestion
# https://cezarypiatek.github.io/post/async-analyzers-p2/#9-missing-configureawaitbool
# VSTHRD111: Use ConfigureAwait(bool)
dotnet_diagnostic.vsthrd111.severity = Suggestion
# https://cezarypiatek.github.io/post/async-analyzers-p2/#10-returning-null-from-a-task-returning-method
# VSTHRD114: Avoid returning a null Task
dotnet_diagnostic.vsthrd114.severity = error
# https://cezarypiatek.github.io/post/async-analyzers-p2/#11-asynchronous-method-names-should-end-with-async
# VSTHRD200: Use "Async" suffix for async methods
dotnet_diagnostic.vsthrd200.severity = Suggestion
# https://cezarypiatek.github.io/post/async-analyzers-p2/#12-non-asynchronous-method-names-shouldnt-end-with-async
# VSTHRD200: Use "Async" suffix for async methods
dotnet_diagnostic.vsthrd200.severity = Suggestion
# VSTHRD003 Avoid awaiting foreign Tasks
dotnet_diagnostic.VSTHRD003.severity = Suggestion
##################################################################################
## https://github.com/hvanbakel/Asyncify-CSharp
## Asyncify
##################################################################################
# https://cezarypiatek.github.io/post/async-analyzers-p2/#8-synchronous-waits
# AsyncifyInvocation: Use Task Async
dotnet_diagnostic.asyncifyinvocation.severity = error
# https://cezarypiatek.github.io/post/async-analyzers-p2/#8-synchronous-waits
# AsyncifyVariable: Use Task Async
dotnet_diagnostic.asyncifyvariable.severity = error
================================================
FILE: .gitattributes
================================================
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
*.sh text eol=lf
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain
================================================
FILE: .github/actions/build/action.yml
================================================
# https://docs.github.com/en/actions/creating-actions/creating-a-composite-action
# https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions
# https://doug.sh/posts/using-composite-actions-with-github-actions/
# https://wallis.dev/blog/composite-github-actions
name: "Build"
description: "Build service"
# Input parameters allow you to specify data that the action expects to use during runtime. GitHub stores input parameters as environment variables.(so they are just string)
# https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#inputs
inputs:
project-path:
description: Project path
required: true
service-name:
description: Service name
required: true
# https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#runs-for-composite-actions
runs:
using: "composite"
steps:
# https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows
# https://devblogs.microsoft.com/dotnet/dotnet-loves-github-actions/
# https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net#caching-dependencies
- name: Cache NuGet Packages
uses: actions/cache@v4
if: success()
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-dotnet-nuget
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '10.x.x'
# https://learn.microsoft.com/en-us/dotnet/core/tools/global-tools
- name: Restore .NET Tools
shell: bash
run: dotnet tool restore
# Note: `Ubuntu` file and folder names are case sensitive, be aware about naming them in solution references. because `Windows` file and folder names as case-insensitive.
# prevent windows case-insensitive for our project with: git config core.ignorecase false; - https://stackoverflow.com/a/27139487/581476
- name: Restore NuGet packages
shell: bash
if: success()
# restore root solution
run: dotnet restore
# npm install, runs `prepare` script automatically in the initialize step
- name: Install NPM Dependencies
shell: bash
if: success()
run: npm install
- name: Format Service
shell: bash
if: ${{ success()}}
run: |
npm run ci-format
- name: Build Service
shell: bash
if: ${{ success()}}
working-directory: ${{ inputs.project-path }}
run: |
dotnet build -c Release --no-restore
================================================
FILE: .github/actions/build-test/action.yml
================================================
# https://docs.github.com/en/actions/creating-actions/creating-a-composite-action
# https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions
# https://doug.sh/posts/using-composite-actions-with-github-actions/
# https://wallis.dev/blog/composite-github-actions
name: "Build-Test"
description: "Build and test service"
# Input parameters allow you to specify data that the action expects to use during runtime. GitHub stores input parameters as environment variables.(so they are just string)
# https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#inputs
inputs:
project-path:
description: Project path
required: true
tests-path:
description: Test path
required: false
default: ''
reports-path:
description: Test report path
required: true
reports-output-path:
description: Test report output path
required: true
service-name:
description: Service name
required: true
# https://stackoverflow.com/questions/70098241/using-secrets-in-composite-actions-github
token:
description: A Github PAT
required: true
# https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#runs-for-composite-actions
runs:
using: "composite"
steps:
- name: Call Composite Action build
uses: ./.github/actions/build
if: success()
id: build-step
with:
project-path: ${{ inputs.project-path }}
service-name: ${{ inputs.service-name }}
- name: Call Composite Action test
uses: ./.github/actions/test
if: ${{ success() && inputs.tests-path != ''}}
id: test-step
with:
tests-path: ${{ inputs.tests-path }}
# wildcard search for files with the ".cobertura.xml" extension in all subdirectories of the current directory
# https://www.jamescroft.co.uk/combining-multiple-code-coverage-results-in-azure-devops/
# https://stackoverflow.com/questions/53255065/dotnet-unit-test-with-coverlet-how-to-get-coverage-for-entire-solution-and-not
reports-path: ${{ github.workspace }}/**/*.cobertura.xml
reports-output-path: ${{ github.workspace }}/output/test-results
service-name: ${{ inputs.service-name }}
token: ${{ inputs.token }}
no-restore: true
================================================
FILE: .github/actions/docker-build-publish/action.yml
================================================
name: "Publish and Build Docker"
description: "Publish and Build Docker "
# Input parameters allow you to specify data that the action expects to use during runtime. GitHub stores input parameters as environment variables.(so they are just string)
# https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#inputs
inputs:
tag-name:
description: "Tag Name"
required: true
image-name:
description: "Image Name"
required: true
registry-username:
description: "Registry username"
required: true
registry-password:
description: "Registry password"
required: true
dockerfile-path:
description: "Dockerfile path"
required: true
# https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#runs-for-composite-actions
runs:
using: "composite"
steps:
##ref: https://docs.docker.com/language/golang/configure-ci-cd/
##ref: https://event-driven.io/en/how_to_buid_and_push_docker_image_with_github_actions
- name: Login to DockerHub
uses: docker/login-action@v2
if: ${{ github.ref == 'refs/heads/main' && success() }}
with:
username: ${{ inputs.registry-username }}
password: ${{ inputs.registry-password }}
- name: Docker Tag Info
shell: bash
run:
echo "Docker tag version is:" ${{ inputs.tag-name }}
- name: Build Docker Image
if: ${{ github.ref == 'refs/heads/main' && success() }}
shell: bash
run: |
docker build -t ${{ inputs.registry-username }}/${{ inputs.image-name }}:${{ inputs.tag-name }} -f "${{ github.workspace }}/${{ inputs.dockerfile-path }}" .
- name: Publish Docker Image
if: ${{ github.ref == 'refs/heads/main' && success() }}
shell: bash
run: |
docker push ${{ inputs.registry-username }}/${{ inputs.image-name }}:${{ inputs.tag-name }}
================================================
FILE: .github/actions/test/action.yml
================================================
# https://docs.github.com/en/actions/creating-actions/creating-a-composite-action
# https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions
# https://doug.sh/posts/using-composite-actions-with-github-actions/
# https://wallis.dev/blog/composite-github-actions
name: "Test"
description: "Test service"
# Input parameters allow you to specify data that the action expects to use during runtime. GitHub stores input parameters as environment variables.(so they are just string)
# https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#inputs
inputs:
tests-path:
description: Test path
required: true
reports-path:
description: Test report path
required: true
reports-output-path:
description: Test report output path
required: true
service-name:
description: Service name
required: true
# https://stackoverflow.com/questions/70098241/using-secrets-in-composite-actions-github
token:
description: A Github PAT
required: true
no-restore:
description: No restore nuget packages, but building tests because they don't build in the build composition action
default: 'true'
# https://docs.github.com/en/actions/creating-actions/metadata-syntax-for-github-actions#runs-for-composite-actions
runs:
using: "composite"
steps:
# see here https://samlearnsazure.blog/2021/01/05/code-coverage-in-github-with-net-core/
# https://www.jamescroft.co.uk/combining-multiple-code-coverage-results-in-azure-devops/
# https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-test#filter-option-details
# https://josef.codes/dotnet-core-filter-out-specific-test-projects-when-running-dotnet-test/
# https://learn.microsoft.com/en-us/dotnet/core/testing/selective-unit-tests?pivots=xunit
# https://stackoverflow.com/questions/53255065/dotnet-unit-test-with-coverlet-how-to-get-coverage-for-entire-solution-and-not
# https://github.com/coverlet-coverage/coverlet/blob/master/Documentation/MSBuildIntegration.md
# https://github.com/coverlet-coverage/coverlet/blob/master/Documentation/MSBuildIntegration.md#filters
- name: Tests
shell: bash
id: tests-step
working-directory: ${{ inputs.tests-path }}
# https://stackoverflow.com/questions/3779701/msbuild-error-msb1008-only-one-project-can-be-specified
# https://octopus.com/blog/githubactions-running-unit-tests
# we should not do 'no-build' here, because our tests not build in build phase (build composite action) and should build here
run: |
for file in $(find . -name "*.csproj" -type f); do
echo "Testing $file"
if [ ${{ inputs.no-restore }} == 'true' ]; then
echo "run tests in no-restore mode"
dotnet test "$file" -c Release --no-restore --logger "trx;LogFileName=test-results.trx" || true
else
echo "run tests in restore nuget mode"
dotnet test "$file" -c Release --logger "trx;LogFileName=test-results.trx" || true
fi
done
# GitHub Api call permissions problem here
# https://github.com/dorny/test-reporter/issues/168
# https://octopus.com/blog/githubactions-running-unit-tests
# https://github.com/dorny/test-reporter/issues/67
# https://github.com/phoenix-actions/test-reporting/pull/21
- name: Test Results
uses: phoenix-actions/test-reporting@v10
id: test-report
if: always()
with:
name: ${{ inputs.service-name }} Test Reports
reporter: dotnet-trx
token: ${{ inputs.token }}
# only-summary: 'true'
output-to: "step-summary"
path: "**/test-results.trx"
# Set action as failed if test report contains any failed test
fail-on-error: true
## https://github.com/dorny/test-reporter#recommended-setup-for-public-repositories
## https://github.com/dorny/test-reporter/blob/0d9714ddc7ff86918ec725a527a3a069419d301a/src/utils/github-utils.ts#L44
## artifact name to download trx test result if it is in seperated workflow with github rest call, if it is not in another workflow skip this
# artifact: "'
================================================
FILE: .github/release-drafter.yml
================================================
# https://johanneskonings.dev/github/2021/02/28/github_automatic_releases_and-changelog/
# https://tiagomichaelsousa.dev/articles/stop-writing-your-changelogs-manually
# https://github.com/release-drafter/release-drafter/issues/551
# https://github.com/release-drafter/release-drafter/pull/1013
# https://github.com/release-drafter/release-drafter/issues/139
# https://github.com/atk4/data/blob/develop/.github/release-drafter.yml
# This release drafter follows the conventions from https://keepachangelog.com, https://common-changelog.org/
# https://www.conventionalcommits.org
name-template: 'v$RESOLVED_VERSION'
tag-template: 'v$RESOLVED_VERSION'
template: |
## What Changed 👀
$CHANGES
**Full Changelog**: https://github.com/$OWNER/$REPOSITORY/compare/$PREVIOUS_TAG...v$RESOLVED_VERSION
categories:
- title: 🚀 Features
labels:
- feature
- title: 🐛 Bug Fixes
labels:
- fix
- bug
- title: 🧪 Test
labels:
- test
- title: 👷 CI
labels:
- ci
- title: ♻️ Refactor
labels:
- changed
- enhancement
- refactor
- title: ⛔️ Deprecated
labels:
- deprecated
- title: 🔐 Security
labels:
- security
- title: 📄 Documentation
labels:
- docs
- documentation
- title: 🧩 Dependency Updates
labels:
- deps
- dependencies
- title: 🧰 Maintenance
label: 'chore'
- title: 📝 Other changes
## putting no labels pr to `Other Changes` category with no label - https://github.com/release-drafter/release-drafter/issues/139#issuecomment-480473934
# https://www.trywilco.com/post/wilco-ci-cd-github-heroku
# https://github.com/release-drafter/release-drafter#autolabeler
# https://github.com/fuxingloh/multi-labeler
# Using regex for defining rules - https://regexr.com/ - https://regex101.com/
autolabeler:
- label: 'chore'
branch:
- '/(chore)\/.*/'
- label: 'security'
branch:
- '/(security)\/.*/'
- label: 'refactor'
branch:
- '/(refactor)\/.*/'
- label: 'docs'
branch:
- '/(docs)\/.*/'
- label: 'ci'
branch:
- '/(ci)\/.*/'
- label: 'test'
branch:
- '/(test)\/.*/'
- label: 'bug'
branch:
- '/(fix)\/.*/'
- label: 'feature'
branch:
- '/(feat)\/.*/'
- label: 'minor'
branch:
- '/(feat)\/.*/'
- label: 'patch'
branch:
- '/(fix)\/.*/'
body:
- '/JIRA-[0-9]{1,4}/'
change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
change-title-escapes: '\<*_&' # You can add # and @ to disable mentions, and add ` to disable code blocks.
version-resolver:
major:
labels:
- major
minor:
labels:
- minor
patch:
labels:
- patch
default: patch
exclude-labels:
- skip-changelog
================================================
FILE: .github/workflows/ci.yml
================================================
name: CI
on:
push:
branches: [ "main"]
paths-ignore:
- "README.md"
pull_request:
branches: [ "main"]
paths-ignore:
- "README.md"
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.sha }}
cancel-in-progress: true
jobs:
ci:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build and Test Flight Microservice
uses: ./.github/actions/build-test
if: success()
id: build-test-flight-step
with:
project-path: 'src/Services/Flight/src/Flight.Api'
tests-path: 'src/Services/Flight/tests/'
# wildcard search for files with the ".cobertura.xml" extension in all subdirectories of the current directory
# https://www.jamescroft.co.uk/combining-multiple-code-coverage-results-in-azure-devops/
# https://stackoverflow.com/questions/53255065/dotnet-unit-test-with-coverlet-how-to-get-coverage-for-entire-solution-and-not
reports-path: ${{ github.workspace }}/**/*.cobertura.xml
reports-output-path: ${{ github.workspace }}/output/test-results
service-name: 'Flight'
token: ${{ secrets.GITHUB_TOKEN }}
- name: Build and Test Identity Microservice
uses: ./.github/actions/build-test
if: success()
id: build-test-identity-step
with:
project-path: 'src/Services/Identity/src/Identity.Api'
tests-path: 'src/Services/Identity/tests/'
# wildcard search for files with the ".cobertura.xml" extension in all subdirectories of the current directory
# https://www.jamescroft.co.uk/combining-multiple-code-coverage-results-in-azure-devops/
# https://stackoverflow.com/questions/53255065/dotnet-unit-test-with-coverlet-how-to-get-coverage-for-entire-solution-and-not
reports-path: ${{ github.workspace }}/**/*.cobertura.xml
reports-output-path: ${{ github.workspace }}/output/test-results
service-name: 'Identity'
token: ${{ secrets.GITHUB_TOKEN }}
- name: Build and Test Passenger Microservice
uses: ./.github/actions/build-test
if: success()
id: build-test-passenger-step
with:
project-path: 'src/Services/Passenger/src/Passenger.Api'
tests-path: 'src/Services/Passenger/tests/'
# wildcard search for files with the ".cobertura.xml" extension in all subdirectories of the current directory
# https://www.jamescroft.co.uk/combining-multiple-code-coverage-results-in-azure-devops/
# https://stackoverflow.com/questions/53255065/dotnet-unit-test-with-coverlet-how-to-get-coverage-for-entire-solution-and-not
reports-path: ${{ github.workspace }}/**/*.cobertura.xml
reports-output-path: ${{ github.workspace }}/output/test-results
service-name: 'Passenger'
token: ${{ secrets.GITHUB_TOKEN }}
- name: Build and Test Booking Microservice
uses: ./.github/actions/build-test
if: success()
id: build-test-booking-step
with:
project-path: 'src/Services/Booking/src/Booking.Api'
tests-path: 'src/Services/Booking/tests/'
# wildcard search for files with the ".cobertura.xml" extension in all subdirectories of the current directory
# https://www.jamescroft.co.uk/combining-multiple-code-coverage-results-in-azure-devops/
# https://stackoverflow.com/questions/53255065/dotnet-unit-test-with-coverlet-how-to-get-coverage-for-entire-solution-and-not
reports-path: ${{ github.workspace }}/**/*.cobertura.xml
reports-output-path: ${{ github.workspace }}/output/test-results
service-name: 'Booking'
token: ${{ secrets.GITHUB_TOKEN }}
- name: Update Release Drafter
if: ${{ github.ref == 'refs/heads/main' && success() }}
id: last_release
uses: release-drafter/release-drafter@v5
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Release Version Info
run:
echo "Release version is:" ${{ steps.last_release.outputs.tag_name }}
- name: Build and Publish Identity Microservice to Docker
if: ${{ github.ref == 'refs/heads/main' && success() }}
uses: ./.github/actions/docker-build-publish
with:
tag-name: ${{ steps.last_release.outputs.tag_name }}
registry-username: ${{ secrets.DOCKERHUB_USERNAME }}
registry-password: ${{ secrets.DOCKERHUB_PASSWORD }}
dockerfile-path: 'src/Services/Identity/Dockerfile'
image-name: 'booking-microservices-identity'
- name: Build and Publish Flight Microservice to Docker
if: ${{ github.ref == 'refs/heads/main' && success() }}
uses: ./.github/actions/docker-build-publish
with:
tag-name: ${{ steps.last_release.outputs.tag_name }}
registry-username: ${{ secrets.DOCKERHUB_USERNAME }}
registry-password: ${{ secrets.DOCKERHUB_PASSWORD }}
dockerfile-path: 'src/Services/Flight/Dockerfile'
image-name: 'booking-microservices-flight'
- name: Build and Publish Passenger Microservice to Docker
if: ${{ github.ref == 'refs/heads/main' && success() }}
uses: ./.github/actions/docker-build-publish
with:
tag-name: ${{ steps.last_release.outputs.tag_name }}
registry-username: ${{ secrets.DOCKERHUB_USERNAME }}
registry-password: ${{ secrets.DOCKERHUB_PASSWORD }}
dockerfile-path: 'src/Services/Passenger/Dockerfile'
image-name: 'booking-microservices-passenger'
- name: Build and Publish Booking Microservice to Docker
if: ${{ github.ref == 'refs/heads/main' && success() }}
uses: ./.github/actions/docker-build-publish
with:
tag-name: ${{ steps.last_release.outputs.tag_name }}
registry-username: ${{ secrets.DOCKERHUB_USERNAME }}
registry-password: ${{ secrets.DOCKERHUB_PASSWORD }}
dockerfile-path: 'src/Services/Booking/Dockerfile'
image-name: 'booking-microservices-booking'
================================================
FILE: .github/workflows/release-drafter-labeler.yml
================================================
name: Release Drafter Auto Labeler
on:
pull_request:
types:
- opened
- synchronize
- reopened
- labeled
- unlabeled
jobs:
auto-labeler:
runs-on: ubuntu-latest
steps:
- uses: release-drafter/release-drafter@v5
with:
config-name: release-drafter.yml
disable-releaser: true # only run auto-labeler for PRs
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# AWS User-specific
.idea/**/aws.xml
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# SonarLint plugin
.idea/sonarlint/
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
# JetBrains Rider
.idea/
*.sln.iml
# Tye
.tye/
*.jwk
# Monitoring
**/grafana-data
# EventStore
**/eventstore
================================================
FILE: .husky/commit-msg
================================================
npx --no -- commitlint --edit ${1}
================================================
FILE: .husky/pre-commit
================================================
npm run format
npm run ci-format
================================================
FILE: CONTRIBUTION.md
================================================
## Contribution
This is great that you'd like to contribute to this project. All change requests should go through the steps described below.
## Pull Requests
**Please, make sure you open an issue before starting with a Pull Request, unless it's a typo or a really obvious error.** Pull requests are the best way to propose changes.
## Conventional commits
Our repository follow [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) specification. Releasing to GitHub and NuGet is done with the support of [semantic-release](https://semantic-release.gitbook.io/semantic-release/).
Pull requests should have a title that follows the specification, otherwise, merging is blocked. If you are not familiar with the specification simply ask maintainers to modify. You can also use this cheatsheet if you want:
- `fix: ` prefix in the title indicates that PR is a bug fix and PATCH release must be triggered.
- `feat: ` prefix in the title indicates that PR is a feature and MINOR release must be triggered.
- `docs: ` prefix in the title indicates that PR is only related to the documentation and there is no need to trigger release.
- `chore: ` prefix in the title indicates that PR is only related to cleanup in the project and there is no need to trigger release.
- `test: ` prefix in the title indicates that PR is only related to tests and there is no need to trigger release.
- `refactor: ` prefix in the title indicates that PR is only related to refactoring and there is no need to trigger release.
## Resources
- [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/)
- [Using Pull Requests](https://help.github.com/articles/about-pull-requests/)
- [GitHub Help](https://help.github.com)
================================================
FILE: Directory.Build.props
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project>
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<PropertyGroup>
<RepositoryRoot>$(MSBuildThisFileDirectory)</RepositoryRoot>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="StyleCop.Analyzers" PrivateAssets="all" Version="1.1.118">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Meziantou.Analyzer" PrivateAssets="all" Version="2.0.299">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Roslynator.Analyzers" PrivateAssets="all" Version="4.15.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Roslynator.CodeAnalysis.Analyzers" PrivateAssets="all" Version="4.15.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Roslynator.Formatting.Analyzers" PrivateAssets="all" Version="4.15.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" PrivateAssets="all" Version="17.14.15">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="AsyncAwaitBestPractices" PrivateAssets="all" Version="10.0.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="CSharpGuidelinesAnalyzer" PrivateAssets="all" Version="3.8.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
<PropertyGroup>
<RunAnalyzersDuringBuild>true</RunAnalyzersDuringBuild>
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
<CodeAnalysisTreatWarningsAsErrors>false</CodeAnalysisTreatWarningsAsErrors>
<AnalysisLevel>latest-Recommended</AnalysisLevel>
<AnalysisMode>Recommended</AnalysisMode>
</PropertyGroup>
</Project>
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2022 Meysam Hadeli
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
<div align="center" style="margin-bottom:20px">
<img src="assets/logo.png" alt="booking-microservices" />
<div align="center">
<a href="https://github.com/meysamhadeli/booking-microservices/actions/workflows/ci.yml"><img alt="ci-status" src="https://github.com/meysamhadeli/booking-microservices/actions/workflows/ci.yml/badge.svg?branch=main&style=flat-square"/></a>
<a href="https://github.com/meysamhadeli/booking-microservices/blob/main/LICENSE"><img alt="build-status" src="https://img.shields.io/github/license/meysamhadeli/booking-microservices?color=%234275f5&style=flat-square"/></a>
</div>
</div>
> 🚀 **A practical microservices with the latest technologies and architectures like Vertical Slice Architecture, Event Sourcing, CQRS, DDD, gRpc, MongoDB, RabbitMq, Masstransit, and Aspire in .Net 10.**
## You can find other version of this project here:
- [Booking with Modular Monolith Architecture](https://github.com/meysamhadeli/booking-modular-monolith)
- [Booking with Monolith Architecture](https://github.com/meysamhadeli/booking-monolith)
<div>
<a href='https://codespaces.new/meysamhadeli/booking-microservices?quickstart=1'><img alt='Open in GitHub Codespaces' src='https://github.com/codespaces/badge.svg'></a>
</div>
# Table of Contents
- [The Goals of This Project](#the-goals-of-this-project)
- [Technologies - Libraries](#technologies---libraries)
- [Key Features](#key-features)
- [When to Use](#when-to-use)
- [Challenges](#challenges)
- [The Domain and Bounded Context - Service Boundary](#the-domain-and-bounded-context---service-boundary)
- [Structure of Project](#structure-of-project)
- [Development Setup](#development-setup)
- [Dotnet Tools Packages](#dotnet-tools-packages)
- [Husky](#husky)
- [Upgrade Nuget Packages](#upgrade-nuget-packages)
- [How to Run](#how-to-run)
- [Config Certificate](#config-certificate)
- [Aspire](#aspire)
- [Docker Compose](#docker-compose)
- [Kubernetes](#kubernetes)
- [Build](#build)
- [Run](#run)
- [Test](#test)
- [Documentation Apis](#documentation-apis)
- [Support](#support)
- [Contribution](#contribution)
## The Goals of This Project
- :sparkle: Using `Vertical Slice Architecture` for `architecture` level.
- :sparkle: Using `Domain Driven Design (DDD)` to implement all `business logic`.
- :sparkle: Using `Rabbitmq` on top of `Masstransit` for `Event Driven Architecture`.
- :sparkle: Using `gRPC` for `internal communication`.
- :sparkle: Using `CQRS` implementation with `MediatR` library.
- :sparkle: Using `Postgres` for `write side` database.
- :sparkle: Using `MongoDB` for `read side` database.
- :sparkle: Using `Event Store` for `write side` of Booking Microservice/Module to store all `historical change` of aggregate.
- :sparkle: Using `Inbox Pattern` for ensuring message idempotency for receiver and `Exactly once Delivery`.
- :sparkle: Using `Outbox Pattern` for ensuring no message is lost and there is at `At Least One Delivery`.
- :sparkle: Using `Unit Testing` for testing small units and mocking our dependencies with `Nsubstitute`.
- :sparkle: Using `End-To-End Testing` and `Integration Testing` for testing `features` with all dependencies using `testcontainers`.
- :sparkle: Using `Fluent Validation` and a `Validation Pipeline Behaviour` on top of `MediatR`.
- :sparkle: Using `Minimal API` for all endpoints.
- :sparkle: Using `AspNetCore OpenApi` for `generating` built-in support `OpenAPI documentation` in ASP.NET Core.
- :sparkle: Using `Health Check` for `reporting` the `health` of app infrastructure components.
- :sparkle: Using `Docker-Compose` and `Kubernetes` for our deployment mechanism.
- :sparkle: Using `Kibana` on top of `Serilog` for `logging`.
- :sparkle: Using `OpenTelemetry` for distributed tracing on top of `Jaeger`.
- :sparkle: Using `OpenTelemetry` for monitoring on top of `Prometheus` and `Grafana`.
- :sparkle: Using `IdentityServer` for authentication and authorization base on `OpenID-Connect` and `OAuth2`.
- :sparkle: Using `Yarp` as a microservices `gateway`.
- :sparkle: Using `Kubernetes` to achieve efficient `scaling` and ensure `high availability` for each of our microservices.
- :sparkle: Using `Nginx Ingress Controller` for `load balancing` between our microservices top of `Kubernetes`.
- :sparkle: Using `cert-manager` to Configure `TLS` in `kubernetes cluster`.
- :sparkle: Using `Aspire` for `service discovery`, `observability`, and `local orchestration` of microservices.
## Technologies - Libraries
- ✔️ **[`.NET 10`](https://github.com/dotnet/aspnetcore)** - .NET Framework and .NET Core, including ASP.NET and ASP.NET Core.
- ✔️ **[`MVC Versioning API`](https://github.com/microsoft/aspnet-api-versioning)** - Set of libraries which add service API versioning to ASP.NET Web API, OData with ASP.NET Web API, and ASP.NET Core.
- ✔️ **[`EF Core`](https://github.com/dotnet/efcore)** - Modern object-database mapper for .NET. It supports LINQ queries, change tracking, updates, and schema migrations.
- ✔️ **[`AspNetCore OpenApi`](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/openapi/aspnetcore-openapi)** - Provides built-in support for OpenAPI document generation in ASP.NET Core.
- ✔️ **[`Masstransit`](https://github.com/MassTransit/MassTransit)** - Distributed Application Framework for .NET.
- ✔️ **[`MediatR`](https://github.com/jbogard/MediatR)** - Simple, unambitious mediator implementation in .NET.
- ✔️ **[`FluentValidation`](https://github.com/FluentValidation/FluentValidation)** - Popular .NET validation library for building strongly-typed validation rules.
- ✔️ **[`Scalar`](https://github.com/scalar/scalar/tree/main/packages/scalar.aspnetcore)** - Scalar provides an easy way to render beautiful API references based on OpenAPI/Swagger documents.
- ✔️ **[`Swagger UI`](https://github.com/domaindrivendev/Swashbuckle.AspNetCore)** - Swagger tools for documenting API's built on ASP.NET Core.
- ✔️ **[`Serilog`](https://github.com/serilog/serilog)** - Simple .NET logging with fully-structured events
- ✔️ **[`Polly`](https://github.com/App-vNext/Polly)** - Polly is a .NET resilience and transient-fault-handling library that allows developers to express policies such as Retry, Circuit Breaker, Timeout, Bulkhead Isolation, and Fallback in a fluent and thread-safe manner.
- ✔️ **[`Scrutor`](https://github.com/khellang/Scrutor)** - Assembly scanning and decoration extensions for Microsoft.Extensions.DependencyInjection
- ✔️ **[`Opentelemetry-dotnet`](https://github.com/open-telemetry/opentelemetry-dotnet)** - The OpenTelemetry .NET Client
- ✔️ **[`DuendeSoftware IdentityServer`](https://github.com/DuendeSoftware/IdentityServer)** - The most flexible and standards-compliant OpenID Connect and OAuth 2.x framework for ASP.NET Core.
- ✔️ **[`EasyCaching`](https://github.com/dotnetcore/EasyCaching)** - Open source caching library that contains basic usages and some advanced usages of caching which can help us to handle caching more easier.
- ✔️ **[`Mapster`](https://github.com/MapsterMapper/Mapster)** - Convention-based object-object mapper in .NET.
- ✔️ **[`Hellang.Middleware.ProblemDetails`](https://github.com/khellang/Middleware/tree/master/src/ProblemDetails)** - A middleware for handling exception in .Net Core.
- ✔️ **[`NewId`](https://github.com/phatboyg/NewId)** - NewId can be used as an embedded unique ID generator that produces 128 bit (16 bytes) sequential IDs.
- ✔️ **[`Yarp`](https://github.com/microsoft/reverse-proxy)** - Reverse proxy toolkit for building fast proxy servers in .NET.
- ✔️ **[`Tye`](https://github.com/dotnet/tye)** - Developer tool that makes developing, testing, and deploying microservices and distributed applications easier.
- ✔️ **[`gRPC-dotnet`](https://github.com/grpc/grpc-dotnet)** - gRPC functionality for .NET.
- ✔️ **[`EventStore`](https://github.com/EventStore/EventStore)** - The open-source, functional database with Complex Event Processing.
- ✔️ **[`MongoDB.Driver`](https://github.com/mongodb/mongo-csharp-driver)** - .NET Driver for MongoDB.
- ✔️ **[`xUnit.net`](https://github.com/xunit/xunit)** - A free, open source, community-focused unit testing tool for the .NET Framework.
- ✔️ **[`Respawn`](https://github.com/jbogard/Respawn)** - Respawn is a small utility to help in resetting test databases to a clean state.
- ✔️ **[`Testcontainers`](https://github.com/testcontainers/testcontainers-dotnet)** - Testcontainers for .NET is a library to support tests with throwaway instances of Docker containers.
- ✔️ **[`K6`](https://github.com/grafana/k6)** - Modern load testing for developers and testers in the DevOps era.
- ✔️ **[`Aspire`](https://github.com/dotnet/aspire)** - .NET stack for building and orchestrating observable, distributed cloud-native applications.
## Key Features
1. **Independent Services**: Each service is a separate project with its own database and deployment pipeline, enabling independent development and deployment.
2. **Decentralized Communication**: Services communicate via APIs (REST, gRPC) or message brokers (RabbitMQ, Kafka), ensuring loose coupling and resilience.
3. **Scalability**: Services can be scaled independently based on demand, allowing efficient resource utilization.
4. **Fault Tolerance**: Failures are isolated, preventing cascading failures and ensuring high availability.
5. **Technology Agnostic**: Services can use different technologies, frameworks, or databases, providing flexibility.
## When to Use
1. **Large and Complex Projects**: Ideal for applications with complex business logic that can be broken into smaller, manageable services.
2. **High Scalability Needs**: Suitable for applications requiring independent scaling of components.
3. **Fault Tolerance and High Availability**: Perfect for systems where failure isolation and uptime are critical.
4. **Distributed Teams**: Enables teams to work independently on different services.
5. **Frequent Updates**: Supports continuous deployment and A/B testing for individual services.
6. **Technology Diversity**: Allows the use of different technologies for different services.
## Challenges
- Increased complexity in management, DevOps overhead, data consistency, latency, and higher costs.
## The Domain And Bounded Context - Service Boundary
- `Identity Service`: The Identity Service is a bounded context for the authentication and authorization of users using [Identity Server](https://github.com/DuendeSoftware/IdentityServer). This service is responsible for creating new users and their corresponding roles and permissions using [.Net Core Identity](https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity) and Jwt authentication and authorization.
- `Flight Service`: The Flight Service is a bounded context `CRUD` service to handle flight related operations.
- `Passenger Service`: The Passenger Service is a bounded context for managing passenger information, tracking activities and subscribing to get notification for out of stock products.
- `Booking Service`: The Booking Service is a bounded context for managing all operation related to booking ticket.

## Structure of Project
In this project, I used [vertical slice architecture](https://jimmybogard.com/vertical-slice-architecture/) at the architectural level and [feature folder structure](http://www.kamilgrzybek.com/design/feature-folders/) to structure my files.
I treat each request as a distinct use case or slice, encapsulating and grouping all concerns from front-end to back.
When adding or changing a feature in an application in n-tire architecture, we are typically touching many "layers" in an application. We are changing the user interface, adding fields to models, modifying validation, and so on. Instead of coupling across a layer, we couple vertically along a slice. We `minimize coupling` `between slices`, and `maximize coupling` `in a slice`.
With this approach, each of our vertical slices can decide for itself how to best fulfill the request. New features only add code, we're not changing shared code and worrying about side effects.
<div align="center">
<img src="./assets/vertical-slice-architecture.png" />
</div>
Instead of grouping related action methods in one controller, as found in traditional ASP.net controllers, I used the [REPR pattern](https://deviq.com/design-patterns/repr-design-pattern). Each action gets its own small endpoint, consisting of a route, the action, and an `IMediator` instance (see [MediatR](https://github.com/jbogard/MediatR)). The request is passed to the `IMediator` instance, routed through a [`Mediatr pipeline`](https://lostechies.com/jimmybogard/2014/09/09/tackling-cross-cutting-concerns-with-a-mediator-pipeline/) where custom [middleware](https://github.com/jbogard/MediatR/wiki/Behaviors) can log, validate and intercept requests. The request is then handled by a request specific `IRequestHandler` which performs business logic before returning the result.
The use of the [mediator pattern](https://dotnetcoretutorials.com/2019/04/30/the-mediator-pattern-in-net-core-part-1-whats-a-mediator/) in my controllers creates clean and [thin controllers](https://codeopinion.com/thin-controllers-cqrs-mediatr/). By separating action logic into individual handlers we support the [Single Responsibility Principle](https://en.wikipedia.org/wiki/Single_responsibility_principle) and [Don't Repeat Yourself principles](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself), this is because traditional controllers tend to become bloated with large action methods and several injected `Services` only being used by a few methods.
I used CQRS to decompose my features into small parts that makes our application:
- Maximize performance, scalability and simplicity.
- Easy to maintain and add features to. Changes only affect one command or query, avoiding breaking changes or creating side effects.
- It gives us better separation of concerns and cross-cutting concern (with help of mediatr behavior pipelines), instead of bloated service classes doing many things.
Using the CQRS pattern, we cut each business functionality into vertical slices, for each of these slices we group classes (see [technical folders structure](http://www.kamilgrzybek.com/design/feature-folders)) specific to that feature together (command, handlers, infrastructure, repository, controllers, etc). In our CQRS pattern each command/query handler is a separate slice. This is where you can reduce coupling between layers. Each handler can be a separated code unit, even copy/pasted. Thanks to that, we can tune down the specific method to not follow general conventions (e.g. use custom SQL query or even different storage). In a traditional layered architecture, when we change the core generic mechanism in one layer, it can impact all methods.
## Development Setup
### Dotnet Tools Packages
For installing our requirement packages with .NET cli tools, we need to install `dotnet tool manifest`.
```bash
dotnet new tool-manifest
```
And after that we can restore our dotnet tools packages with .NET cli tools from `.config` folder and `dotnet-tools.json` file.
```
dotnet tool restore
```
### Husky
Here we use `husky` to handel some pre commit rules and we used `conventional commits` rules and `formatting` as pre commit rules, here in [package.json](.././package.json). of course, we can add more rules for pre commit in future. (find more about husky in the [documentation](https://typicode.github.io/husky/get-started.html))
We need to install `husky` package for `manage` `pre commits hooks` and also I add two packages `@commitlint/cli` and `@commitlint/config-conventional` for handling conventional commits rules in [package.json](.././package.json).
Run the command bellow in the root of project to install all npm dependencies related to husky:
```bash
npm install
```
> Note: In the root of project we have `.husky` folder and it has `commit-msg` file for handling conventional commits rules with provide user friendly message and `pre-commit` file that we can run our `scripts` as a `pre-commit` hooks. that here we call `format` script from [package.json](./package.json) for formatting purpose.
### Upgrade Nuget Packages
For upgrading our nuget packages to last version, we use the great package [dotnet-outdated](https://github.com/dotnet-outdated/dotnet-outdated).
Run the command below in the root of project to upgrade all of packages to last version:
```bash
dotnet outdated -u
```
## How to Run
> ### Config Certificate
Run the following commands to [Config SSL](https://docs.microsoft.com/en-us/aspnet/core/security/docker-compose-https?view=aspnetcore-6.0) in your system:
#### Windows using Linux containers
```bash
dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p password
dotnet dev-certs https --trust
```
> Note: for running this command in `powershell` use `$env:USERPROFILE` instead of `%USERPROFILE%`*
#### macOS or Linux
```bash
dotnet dev-certs https -ep ${HOME}/.aspnet/https/aspnetapp.pfx -p $CREDENTIAL_PLACEHOLDER$
dotnet dev-certs https --trust
```
### Aspire
To run the application using the `Aspire App Host`, execute the following command from the solution root:
```bash
aspire run
```
> Note:The `Aspire dashboard` will be available at `http://localhost:18888`
> ### Docker Compose
To run this app in `Docker`, use the [docker-compose.yaml](./deployments/docker-compose/docker-compose.yaml) and execute the below command at the `root` of the application:
```bash
docker-compose -f ./deployments/docker-compose/docker-compose.yaml up -d
```
> ### Kubernetes
To `configure TLS` in the `Kubernetes cluster`, we need to install `cert-manager` based on the [docs](https://cert-manager.io/docs/installation) and run the following commands to apply TLS in our application. Here, we use [Let's Encrypt](https://letsencrypt.org/) to encrypt our certificate.
```bash
kubectl apply -f ./deployments/kubernetes/booking-cert-manager.yml
```
To apply all necessary `deployments`, `pods`, `services`, `ingress`, and `config maps`, please run the following command:
```bash
kubectl apply -f ./deployments/kubernetes/booking-microservices.yml
```
> ### Build
To `build` all microservices, run this command in the `root` of the project:
```bash
dotnet build
```
> ### Run
To `run` each microservice, run this command in the root of the `Api` folder of each microservice where the `csproj` file is located:
```bash
dotnet run
```
> ### Test
To `test` all microservices, run this command in the `root` of the project:
```bash
dotnet test
```
> ### Documentation Apis
Each microservice provides `API documentation` and navigate to `/swagger` for `Swagger OpenAPI` or `/scalar/v1` for `Scalar OpenAPI` to visit list of endpoints.
As part of API testing, I created the [booking.rest](./booking.rest) file which can be run with the [REST Client](https://github.com/Huachao/vscode-restclient) `VSCode plugin`.
# Support
If you like my work, feel free to:
- ⭐ this repository. And we will be happy together :)
Thanks a bunch for supporting me!
## Contribution
Thanks to all [contributors](https://github.com/meysamhadeli/booking-microservices/graphs/contributors), you're awesome and this wouldn't be possible without you! The goal is to build a categorized, community-driven collection of very well-known resources.
Please follow this [contribution guideline](./CONTRIBUTION.md) to submit a pull request or create the issue.
## Project References & Credits
- [https://github.com/jbogard/ContosoUniversityDotNetCore-Pages](https://github.com/jbogard/ContosoUniversityDotNetCore-Pages)
- [https://github.com/kgrzybek/modular-monolith-with-ddd](https://github.com/kgrzybek/modular-monolith-with-ddd)
- [https://github.com/oskardudycz/EventSourcing.NetCore](https://github.com/oskardudycz/EventSourcing.NetCore)
- [https://github.com/thangchung/clean-architecture-dotnet](https://github.com/thangchung/clean-architecture-dotnet)
- [https://github.com/pdevito3/MessageBusTestingInMemHarness](https://github.com/pdevito3/MessageBusTestingInMemHarness)
## License
This project is made available under the MIT license. See [LICENSE](https://github.com/meysamhadeli/booking-microservices/blob/main/LICENSE) for details.
================================================
FILE: assets/booking-microservices.drawio
================================================
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36" version="28.0.6">
<diagram name="Page-1" id="LwSOovy8OdwzHFtQ82wI">
<mxGraphModel dx="2852" dy="3254" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1100" pageHeight="850" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="Hl4Qm-QQrkKEjvrf066_-2" value="" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Helvetica;fontSize=12;labelBackgroundColor=default;" parent="1" vertex="1">
<mxGeometry x="10" y="-1190" width="1800" height="1390" as="geometry" />
</mxCell>
<mxCell id="PG-S5D8SCmHSsYNVxMVk-73" value="<span style="color: rgba(0, 0, 0, 0); font-family: monospace; font-size: 0px; text-align: start; text-wrap-mode: nowrap;">%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22%26lt%3Bb%26gt%3B%26lt%3Bfont%26gt%3BOutbox%20Processor%26lt%3B%2Ffont%26gt%3B%26lt%3B%2Fb%26gt%3B%22%20style%3D%22text%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Bhtml%3D1%3Balign%3Dcenter%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D18%3BfontFamily%3DComic%20Sans%20MS%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%2298%22%20y%3D%22-84%22%20width%3D%22145%22%20height%3D%2230%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E</span>" style="rounded=1;whiteSpace=wrap;html=1;glass=0;shadow=0;fillColor=#ffe6cc;strokeColor=#d79b00;opacity=50;" parent="1" vertex="1">
<mxGeometry x="80" y="-388" width="310" height="544" as="geometry" />
</mxCell>
<mxCell id="PG-S5D8SCmHSsYNVxMVk-6" value="" style="rounded=1;whiteSpace=wrap;html=1;glass=0;shadow=0;fillColor=#1ba1e2;strokeColor=#006EAF;fontColor=#ffffff;opacity=10;" parent="1" vertex="1">
<mxGeometry x="120" y="-760" width="370" height="220" as="geometry" />
</mxCell>
<mxCell id="PG-S5D8SCmHSsYNVxMVk-49" style="edgeStyle=orthogonalEdgeStyle;shape=connector;curved=0;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;shadow=0;dashed=1;dashPattern=8 8;strokeColor=default;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=12;fontColor=default;labelBackgroundColor=default;elbow=vertical;startSize=8;endArrow=open;endFill=0;endSize=8;flowAnimation=0;" parent="1" source="3LE55ruSKFipPZqCUEyQ-1" target="PG-S5D8SCmHSsYNVxMVk-10" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="PG-S5D8SCmHSsYNVxMVk-50" style="edgeStyle=orthogonalEdgeStyle;shape=connector;curved=0;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;shadow=0;dashed=1;dashPattern=8 8;strokeColor=default;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=12;fontColor=default;labelBackgroundColor=default;elbow=vertical;startSize=8;endArrow=open;endFill=0;endSize=8;flowAnimation=0;" parent="1" source="3LE55ruSKFipPZqCUEyQ-1" target="PG-S5D8SCmHSsYNVxMVk-9" edge="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="PG-S5D8SCmHSsYNVxMVk-143" style="edgeStyle=orthogonalEdgeStyle;shape=connector;curved=0;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;shadow=0;strokeColor=light-dark(#d44e4e, #ededed);align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=12;fontColor=default;labelBackgroundColor=default;elbow=vertical;startSize=8;endArrow=open;endFill=0;endSize=8;flowAnimation=0;" parent="1" source="3LE55ruSKFipPZqCUEyQ-1" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="830" y="-160" as="targetPoint" />
<Array as="points">
<mxPoint x="224" y="-470" />
<mxPoint x="830" y="-470" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="PG-S5D8SCmHSsYNVxMVk-152" style="edgeStyle=orthogonalEdgeStyle;shape=connector;curved=0;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;shadow=0;strokeColor=#23445d;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=12;fontColor=default;labelBackgroundColor=default;elbow=vertical;startSize=8;endArrow=open;endFill=0;endSize=8;flowAnimation=0;fillColor=#bac8d3;" parent="1" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="222.00000000000045" y="-620" as="sourcePoint" />
<mxPoint x="1008" y="-169" as="targetPoint" />
<Array as="points">
<mxPoint x="222" y="-407" />
<mxPoint x="1008" y="-407" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="3LE55ruSKFipPZqCUEyQ-1" value="" style="image;aspect=fixed;html=1;points=[];align=center;fontSize=12;image=img/lib/azure2/app_services/App_Services.svg;" parent="1" vertex="1">
<mxGeometry x="190" y="-691" width="68" height="68" as="geometry" />
</mxCell>
<mxCell id="PG-S5D8SCmHSsYNVxMVk-55" style="edgeStyle=orthogonalEdgeStyle;shape=connector;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;shadow=0;strokeColor=default;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=12;fontColor=default;labelBackgroundColor=default;startSize=8;endArrow=open;endFill=0;endSize=8;flowAnimation=0;elbow=vertical;curved=0;" parent="1" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="855.5799999999999" y="-1080" as="sourcePoint" />
<mxPoint x="306" y="-760" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="PG-S5D8SCmHSsYNVxMVk-58" style="edgeStyle=orthogonalEdgeStyle;shape=connector;curved=0;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;shadow=0;strokeColor=default;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=12;fontColor=default;labelBackgroundColor=default;elbow=vertical;startSize=8;endArrow=open;endFill=0;endSize=8;flowAnimation=0;" parent="1" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="1106.5" y="-760" as="targetPoint" />
<mxPoint x="958" y="-1079" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="3LE55ruSKFipPZqCUEyQ-5" value="" style="aspect=fixed;sketch=0;html=1;dashed=0;whitespace=wrap;verticalLabelPosition=bottom;verticalAlign=top;fillColor=#2875E2;strokeColor=#ffffff;points=[[0.005,0.63,0],[0.1,0.2,0],[0.9,0.2,0],[0.5,0,0],[0.995,0.63,0],[0.72,0.99,0],[0.5,1,0],[0.28,0.99,0]];shape=mxgraph.kubernetes.icon2;prIcon=ing" parent="1" vertex="1">
<mxGeometry x="854.58" y="-1130" width="104.17" height="100" as="geometry" />
</mxCell>
<mxCell id="PG-S5D8SCmHSsYNVxMVk-173" style="edgeStyle=orthogonalEdgeStyle;shape=connector;curved=0;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;shadow=0;strokeColor=#23445d;align=center;verticalAlign=middle;fontFamily=Helvetica;fontSize=12;fontColor=default;labelBackgroundColor=default;elbow=vertical;startSize=8;endArrow=open;endFill=0;endSize=8;flowAnimation=0;fillColor=#bac8d3;" parent="1" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="1119" y="-122" as="targetPoint" />
<mxPoint x="1020" y="-122" as="sourcePoint" />
</mxGeometry>
</mxCell>
<mxCell id="-whiLjia1cdvk5nuR-Pi-1" value="" style="shape=image;imageAspect=0;aspect=fixed;verticalLabelPosition=bottom;verticalAlign=top;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjggMTI4Ij4mI3hhOyAgPHBhdGggZD0iTTY3LjY0OCA2OS43OTdjLTUuMjQ2IDUuMjUtNS4yNDYgMTMuNzU4IDAgMTkuMDA4IDUuMjUgNS4yNDYgMTMuNzU4IDUuMjQ2IDE5LjAwNCAwIDUuMjUtNS4yNSA1LjI1LTEzLjc1OCAwLTE5LjAwOC01LjI0Ni01LjI0Ni0xMy43NTQtNS4yNDYtMTkuMDA0IDBabTE0LjIwNyAxNC4yMTlhNi42NDkgNi42NDkgMCAwIDEtOS40MSAwIDYuNjUgNi42NSAwIDAgMSAwLTkuNDA3IDYuNjQ5IDYuNjQ5IDAgMCAxIDkuNDEgMGMyLjU5OCAyLjU4NiAyLjU5OCA2LjgwOSAwIDkuNDA3Wk04Ni40MyAzLjY3MmwtOC4yMzUgOC4yMzRhNC4xNyA0LjE3IDAgMCAwIDAgNS44NzVsMzIuMTQ5IDMyLjE0OWE0LjE3IDQuMTcgMCAwIDAgNS44NzUgMGw4LjIzNC04LjIzNWMxLjYxLTEuNjEgMS42MS00LjI2MSAwLTUuODdMOTIuMjkgMy42NzFhNC4xNTkgNC4xNTkgMCAwIDAtNS44NiAwWk0yOC43MzggMTA4Ljg5NWEzLjc2MyAzLjc2MyAwIDAgMCAwLTUuMzFsLTQuMTgzLTQuMTg3YTMuNzY4IDMuNzY4IDAgMCAwLTUuMzEzIDBsLTguNjQ0IDguNjQ5LS4wMTYuMDEyLTIuMzcxLTIuMzc1Yy0xLjMxMy0xLjMxMy0zLjQ1LTEuMzEzLTQuNzUgMC0xLjMxMyAxLjMxMi0xLjMxMyAzLjQ0OSAwIDQuNzVsMTQuMjQ2IDE0LjI0MmEzLjM1MyAzLjM1MyAwIDAgMCA0Ljc0NiAwYzEuMy0xLjMxMyAxLjMxMy0zLjQ1IDAtNC43NDZsLTIuMzc1LTIuMzc1LjAxNi0uMDEyWm0wIDAiIGZpbGw9IiNmNWE4MDAiLz4mI3hhOyAgPHBhdGggZD0iTTcyLjI5NyAyNy4zMTMgNTQuMDA0IDQ1LjYwNWMtMS42MjUgMS42MjUtMS42MjUgNC4zMDEgMCA1LjkyNkw2NS4zIDYyLjgyNGM3Ljk4NC01Ljc0NiAxOS4xOC01LjAzNSAyNi4zNjMgMi4xNTNsOS4xNDgtOS4xNDljMS42MjItMS42MjUgMS42MjItNC4yOTcgMC01LjkyMkw3OC4yMiAyNy4zMTNhNC4xODUgNC4xODUgMCAwIDAtNS45MjIgMFpNNjAuNTUgNjcuNTg1bC02LjY3Mi02LjY3MmMtMS41NjMtMS41NjItNC4xMjUtMS41NjItNS42ODQgMGwtMjMuNTMgMjMuNTRhNC4wMzYgNC4wMzYgMCAwIDAgMCA1LjY4N2wxMy4zMzEgMTMuMzMyYTQuMDM2IDQuMDM2IDAgMCAwIDUuNjg4IDBsMTUuMTMyLTE1LjE1N2MtMy4xOTktNi42MDktMi42MjUtMTQuNTkzIDEuNzM1LTIwLjczWm0wIDAiIGZpbGw9IiM0MjVjYzciLz4mI3hhOzwvc3ZnPg==;" parent="1" vertex="1">
<mxGeometry x="953.75" y="-169" width="82" height="82" as="geometry" />
</mxCell>
<mxCell id="PG-S5D8SCmHSsYNVxMVk-9" value="" style="shape=image;imageAspect=0;aspect=fixed;verticalLabelPosition=bottom;verticalAlign=top;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjggMTI4Ij48cGF0aCBkPSJNODguMDM4IDQyLjgxMmMxLjYwNSA0LjY0MyAyLjc2MSA5LjM4MyAzLjE0MSAxNC4yOTYuNDcyIDYuMDk1LjI1NiAxMi4xNDctMS4wMjkgMTguMTQyLS4wMzUuMTY1LS4xMDkuMzItLjE2NC40OC0uNDAzLjAwMS0uODE0LS4wNDktMS4yMDguMDEyLTMuMzI5LjUyMy02LjY1NSAxLjA2NS05Ljk4MSAxLjYwNC0zLjQzOC41NTctNi44ODEgMS4wOTItMTAuMzEzIDEuNjg3LTEuMjE2LjIxLTIuNzIxLS4wNDEtMy4yMTIgMS42NDEtLjAxNC4wNDYtLjE1NC4wNTQtLjIzNS4wOGwuMTY2LTEwLjA1MS0uMTY5LTI0LjI1MiAxLjYwMi0uMjc1YzIuNjItLjQyOSA1LjI0LS44NjQgNy44NjItMS4yODEgMy4xMjktLjQ5NyA2LjI2MS0uOTggOS4zOTItMS40NjUgMS4zODEtLjIxNSAyLjc2NC0uNDEyIDQuMTQ4LS42MTh6IiBmaWxsPSIjNDM5OTM0IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik02MS43MjkgMTEwLjA1NGMtMS42OS0xLjQ1My0zLjQzOS0yLjg0Mi01LjA1OS00LjM3LTguNzE3LTguMjIyLTE1LjA5My0xNy44OTktMTguMjMzLTI5LjU2Ni0uODY1LTMuMjExLTEuNDQyLTYuNDc0LTEuNjI3LTkuNzkyLS4xMy0yLjMyMi0uMzE4LTQuNjY1LS4xNTQtNi45NzUuNDM3LTYuMTQ0IDEuMzI1LTEyLjIyOSAzLjEyNy0xOC4xNDdsLjA5OS0uMTM4Yy4xNzUuMjMzLjQyNy40MzkuNTE2LjcwMiAxLjc1OSA1LjE4IDMuNTA1IDEwLjM2NCA1LjI0MiAxNS41NTEgNS40NTggMTYuMyAxMC45MDkgMzIuNjA0IDE2LjM3NiA0OC45LjEwNy4zMTguMzg0LjU3OS41ODMuODY2bC0uODcgMi45Njl6IiBmaWxsPSIjNDVBNTM4IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik04OC4wMzggNDIuODEyYy0xLjM4NC4yMDYtMi43NjguNDAzLTQuMTQ5LjYxNi0zLjEzMS40ODUtNi4yNjMuOTY4LTkuMzkyIDEuNDY1LTIuNjIyLjQxNy01LjI0Mi44NTItNy44NjIgMS4yODFsLTEuNjAyLjI3NS0uMDEyLTEuMDQ1Yy0uMDUzLS44NTktLjE0NC0xLjcxNy0uMTU0LTIuNTc2LS4wNjktNS40NzgtLjExMi0xMC45NTYtLjE4LTE2LjQzNC0uMDQyLTMuNDI5LS4xMDUtNi44NTctLjE3NS0xMC4yODUtLjA0My0yLjEzLS4wODktNC4yNjEtLjE4NS02LjM4OC0uMDUyLTEuMTQzLS4yMzYtMi4yOC0uMzExLTMuNDIzLS4wNDItLjY1Ny4wMTYtMS4zMTkuMDI5LTEuOTc5LjgxNyAxLjU4MyAxLjYxNiAzLjE3OCAyLjQ1NiA0Ljc0OSAxLjMyNyAyLjQ4NCAzLjQ0MSA0LjMxNCA1LjM0NCA2LjMxMSA3LjUyMyA3Ljg5MiAxMi44NjQgMTcuMDY4IDE2LjE5MyAyNy40MzN6IiBmaWxsPSIjNDZBMDM3IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik02NS4wMzYgODAuNzUzYy4wODEtLjAyNi4yMjItLjAzNC4yMzUtLjA4LjQ5MS0xLjY4MiAxLjk5Ni0xLjQzMSAzLjIxMi0xLjY0MSAzLjQzMi0uNTk0IDYuODc1LTEuMTMgMTAuMzEzLTEuNjg3IDMuMzI2LS41MzkgNi42NTItMS4wODEgOS45ODEtMS42MDQuMzk0LS4wNjIuODA1LS4wMTEgMS4yMDgtLjAxMi0uNjIyIDIuMjItMS4xMTIgNC40ODgtMS45MDEgNi42NDctLjg5NiAyLjQ0OS0xLjk4IDQuODM5LTMuMTMxIDcuMTgyYTQ5LjE0MiA0OS4xNDIgMCAwMS02LjM1MyA5Ljc2M2MtMS45MTkgMi4zMDgtNC4wNTggNC40NDEtNi4yMDIgNi41NDgtMS4xODUgMS4xNjUtMi41ODIgMi4xMTQtMy44ODIgMy4xNjFsLS4zMzctLjIzLTEuMjE0LTEuMDM4LTEuMjU2LTIuNzUzYTQxLjQwMiA0MS40MDIgMCAwMS0xLjM5NC05LjgzOGwuMDIzLS41NjEuMTcxLTIuNDI2Yy4wNTctLjgyOC4xMzMtMS42NTUuMTY4LTIuNDg1LjEyOS0yLjk4Mi4yNDEtNS45NjQuMzU5LTguOTQ2eiIgZmlsbD0iIzQwOTQzMyIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBkPSJNNjUuMDM2IDgwLjc1M2MtLjExOCAyLjk4Mi0uMjMgNS45NjQtLjM1NyA4Ljk0Ny0uMDM1LjgzLS4xMTEgMS42NTctLjE2OCAyLjQ4NWwtLjc2NS4yODljLTEuNjk5LTUuMDAyLTMuMzk5LTkuOTUxLTUuMDYyLTE0LjkxMy0yLjc1LTguMjA5LTUuNDY3LTE2LjQzMS04LjIxMy0yNC42NDJhNDQ5OC44ODcgNDQ5OC44ODcgMCAwMC02LjctMTkuODY3Yy0uMTA1LS4zMS0uNDA3LS41NTItLjYxNy0uODI2bDQuODk2LTkuMDAyYy4xNjguMjkyLjM5LjU2NS40OTYuODc5YTYxNjcuNDc2IDYxNjcuNDc2IDAgMDE2Ljc2OCAyMC4xMThjMi45MTYgOC43MyA1LjgxNCAxNy40NjcgOC43MjggMjYuMTk4LjExNi4zNDkuMzA4LjY3MS40OTEgMS4wNjJsLjY3LS43OC0uMTY3IDEwLjA1MnoiIGZpbGw9IiM0RkFBNDEiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbC1ydWxlPSJldmVub2RkIi8+PHBhdGggZD0iTTQzLjE1NSAzMi4yMjdjLjIxLjI3NC41MTEuNTE2LjYxNy44MjZhNDQ5OC44ODcgNDQ5OC44ODcgMCAwMTYuNyAxOS44NjdjMi43NDYgOC4yMTEgNS40NjMgMTYuNDMzIDguMjEzIDI0LjY0MiAxLjY2MiA0Ljk2MSAzLjM2MiA5LjkxMSA1LjA2MiAxNC45MTNsLjc2NS0uMjg5LS4xNzEgMi40MjYtLjE1NS41NTljLS4yNjYgMi42NTYtLjQ5IDUuMzE4LS44MTQgNy45NjgtLjE2MyAxLjMyOC0uNTA5IDIuNjMyLS43NzIgMy45NDctLjE5OC0uMjg3LS40NzYtLjU0OC0uNTgzLS44NjYtNS40NjctMTYuMjk3LTEwLjkxOC0zMi42LTE2LjM3Ni00OC45YTM4ODguOTcyIDM4ODguOTcyIDAgMDAtNS4yNDItMTUuNTUxYy0uMDg5LS4yNjMtLjM0LS40NjktLjUxNi0uNzAybDMuMjcyLTguODR6IiBmaWxsPSIjNEFBNzNDIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik02NS4yMDIgNzAuNzAybC0uNjcuNzhjLS4xODMtLjM5MS0uMzc1LS43MTQtLjQ5MS0xLjA2Mi0yLjkxMy04LjczMS01LjgxMi0xNy40NjgtOC43MjgtMjYuMTk4YTYxNjcuNDc2IDYxNjcuNDc2IDAgMDAtNi43NjgtMjAuMTE4Yy0uMTA1LS4zMTQtLjMyNy0uNTg4LS40OTYtLjg3OWw2LjA1NS03Ljk2NWMuMTkxLjI1NS40NjMuNDgyLjU2Mi43NjkgMS42ODEgNC45MjEgMy4zNDcgOS44NDggNS4wMDMgMTQuNzc4IDEuNTQ3IDQuNjA0IDMuMDcxIDkuMjE1IDQuNjM2IDEzLjgxMy4xMDUuMzA4LjQ3LjUyNi43MTQuNzg2bC4wMTIgMS4wNDVjLjA1OCA4LjA4Mi4xMTUgMTYuMTY3LjE3MSAyNC4yNTF6IiBmaWxsPSIjNTdBRTQ3IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik02NS4wMjEgNDUuNDA0Yy0uMjQ0LS4yNi0uNjA5LS40NzgtLjcxNC0uNzg2LTEuNTY1LTQuNTk4LTMuMDg5LTkuMjA5LTQuNjM2LTEzLjgxMy0xLjY1Ni00LjkzLTMuMzIyLTkuODU2LTUuMDAzLTE0Ljc3OC0uMDk5LS4yODctLjM3MS0uNTE0LS41NjItLjc2OSAxLjk2OS0xLjkyOCAzLjg3Ny0zLjkyNSA1LjkyNS01Ljc2NCAxLjgyMS0xLjYzNCAzLjI4NS0zLjM4NiAzLjM1Mi01Ljk2OC4wMDMtLjEwNy4wNTktLjIxNC4xNDUtLjUxNGwuNTE5IDEuMzA2Yy0uMDEzLjY2MS0uMDcyIDEuMzIyLS4wMjkgMS45NzkuMDc1IDEuMTQzLjI1OSAyLjI4LjMxMSAzLjQyMy4wOTYgMi4xMjcuMTQyIDQuMjU4LjE4NSA2LjM4OC4wNjkgMy40MjguMTMyIDYuODU2LjE3NSAxMC4yODUuMDY3IDUuNDc4LjExMSAxMC45NTYuMTggMTYuNDM0LjAwOC44NjEuMDk4IDEuNzE4LjE1MiAyLjU3N3oiIGZpbGw9IiM2MEIyNEYiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbC1ydWxlPSJldmVub2RkIi8+PHBhdGggZD0iTTYyLjU5OCAxMDcuMDg1Yy4yNjMtMS4zMTUuNjA5LTIuNjIuNzcyLTMuOTQ3LjMyNS0yLjY0OS41NDgtNS4zMTIuODE0LTcuOTY4bC4wNjYtLjAxLjA2Ni4wMTFhNDEuNDAyIDQxLjQwMiAwIDAwMS4zOTQgOS44MzhjLS4xNzYuMjMyLS40MjUuNDM5LS41MTguNzAxLS43MjcgMi4wNS0xLjQxMiA0LjExNi0yLjE0MyA2LjE2Ni0uMS4yOC0uMzc4LjQ5OC0uNTc0Ljc0NGwtLjc0Ny0yLjU2Ni44Ny0yLjk2OXoiIGZpbGw9IiNBOUFBODgiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbC1ydWxlPSJldmVub2RkIi8+PHBhdGggZD0iTTYyLjQ3NiAxMTIuNjIxYy4xOTYtLjI0Ni40NzUtLjQ2NC41NzQtLjc0NC43MzEtMi4wNSAxLjQxNy00LjExNSAyLjE0My02LjE2Ni4wOTMtLjI2Mi4zNDEtLjQ2OS41MTgtLjcwMWwxLjI1NSAyLjc1NGMtLjI0OC4zNTItLjU5LjY2OS0uNzI4IDEuMDYxbC0yLjQwNCA3LjA1OWMtLjA5OS4yODMtLjQzNy40ODMtLjY2My43MjJsLS42OTUtMy45ODV6IiBmaWxsPSIjQjZCNTk4IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik02My4xNzEgMTE2LjYwNWMuMjI3LS4yMzguNTY0LS40MzkuNjYzLS43MjJsMi40MDQtNy4wNTljLjEzNy0uMzkxLjQ4LS43MDkuNzI4LTEuMDYxbDEuMjE1IDEuMDM3Yy0uNTg3LjU4LS45MTMgMS4yNS0uNzE3IDIuMDk3bC0uMzY5IDEuMjA4Yy0uMTY4LjIwNy0uNDExLjM4Ny0uNDk0LjYyNC0uODM5IDIuNDAzLTEuNjQgNC44MTktMi40ODUgNy4yMjItLjEwNy4zMDUtLjQwNC41NDQtLjYxNC44MTItLjEwOS0xLjM4Ny0uMjItMi43NzEtLjMzMS00LjE1OHoiIGZpbGw9IiNDMkMxQTciIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbC1ydWxlPSJldmVub2RkIi8+PHBhdGggZD0iTTYzLjUwMyAxMjAuNzYzYy4yMDktLjI2OS41MDYtLjUwOC42MTQtLjgxMi44NDUtMi40MDIgMS42NDYtNC44MTggMi40ODUtNy4yMjIuMDgzLS4yMzYuMzI1LS40MTcuNDk0LS42MjRsLS41MDkgNS41NDVjLS4xMzYuMTU3LS4zMzMuMjk0LS4zOTguNDc3LS41NzUgMS42MTQtMS4xMTcgMy4yNC0xLjY5NCA0Ljg1NC0uMTE5LjMzMy0uMzQ3LjYyNy0uNTI1LjkzOC0uMTU4LS4yMDctLjQ0MS0uNDA3LS40NTQtLjYyMy0uMDUxLS44NDEtLjAxNi0xLjY4OC0uMDEzLTIuNTMzeiIgZmlsbD0iI0NFQ0RCNyIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBkPSJNNjMuOTY5IDEyMy45MTljLjE3OC0uMzEyLjQwNi0uNjA2LjUyNS0uOTM4LjU3OC0xLjYxMyAxLjExOS0zLjIzOSAxLjY5NC00Ljg1NC4wNjUtLjE4My4yNjMtLjMxOS4zOTgtLjQ3N2wuMDEyIDMuNjQtMS4yMTggMy4xMjQtMS40MTEtLjQ5NXoiIGZpbGw9IiNEQkRBQzciIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbC1ydWxlPSJldmVub2RkIi8+PHBhdGggZD0iTTY1LjM4IDEyNC40MTVsMS4yMTgtMy4xMjQuMjUxIDMuNjk2LTEuNDY5LS41NzJ6IiBmaWxsPSIjRUJFOURDIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik02Ny40NjQgMTEwLjg5OGMtLjE5Ni0uODQ3LjEyOS0xLjUxOC43MTctMi4wOTdsLjMzNy4yMy0xLjA1NCAxLjg2N3oiIGZpbGw9IiNDRUNEQjciIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbC1ydWxlPSJldmVub2RkIi8+PHBhdGggZD0iTTY0LjMxNiA5NS4xNzJsLS4wNjYtLjAxMS0uMDY2LjAxLjE1NS0uNTU5LS4wMjMuNTZ6IiBmaWxsPSIjNEZBQTQxIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjggMTI4Ij48cGF0aCBkPSJNOTMuODA5IDkyLjExMmMuNzg1LTYuNTMzLjU1LTcuNDkyIDUuNDE2LTYuNDMzbDEuMjM1LjEwOGMzLjc0Mi4xNyA4LjYzNy0uNjAyIDExLjUxMy0xLjkzOCA2LjE5MS0yLjg3MyA5Ljg2MS03LjY2OCAzLjc1OC02LjQwOS0xMy45MjQgMi44NzMtMTQuODgxLTEuODQyLTE0Ljg4MS0xLjg0MiAxNC43MDMtMjEuODE1IDIwLjg0OS00OS41MDggMTUuNTQzLTU2LjI4Ny0xNC40Ny0xOC40ODktMzkuNTE3LTkuNzQ2LTM5LjkzNi05LjUybC0uMTM0LjAyNWMtMi43NTEtLjU3MS01LjgzLS45MTItOS4yODktLjk2OC02LjMwMS0uMTA0LTExLjA4MiAxLjY1Mi0xNC43MDkgNC40MDIgMCAwLTQ0LjY4My0xOC40MDktNDIuNjA0IDIzLjE1MS40NDIgOC44NDEgMTIuNjcyIDY2Ljg5OCAyNy4yNiA0OS4zNjIgNS4zMzItNi40MTIgMTAuNDg0LTExLjgzNCAxMC40ODQtMTEuODM0IDIuNTU4IDEuNjk5IDUuNjIyIDIuNTY3IDguODM0IDIuMjU1bC4yNDktLjIxMmMtLjA3OC43OTYtLjA0NCAxLjU3NS4wOTkgMi40OTctMy43NTcgNC4xOTktMi42NTMgNC45MzYtMTAuMTY2IDYuNDgyLTcuNjAyIDEuNTY2LTMuMTM2IDQuMzU1LS4yMjEgNS4wODQgMy41MzUuODg0IDExLjcxMiAyLjEzNiAxNy4yMzgtNS41OThsLS4yMi44ODJjMS40NzQgMS4xOCAxLjM3NSA4LjQ3NyAxLjU4MyAxMy42OS4yMDkgNS4yMTQuNTU4IDEwLjA3OSAxLjYyMSAxMi45NDggMS4wNjMgMi44NjggMi4zMTcgMTAuMjU2IDEyLjE5MSA4LjE0IDguMjUyLTEuNzY0IDE0LjU2MS00LjMwOSAxNS4xMzYtMjcuOTg1Ii8+PHBhdGggZD0iTTc1LjQ1OCAxMjUuMjU2Yy00LjM2NyAwLTcuMjExLTEuNjg5LTguOTM4LTMuMzItMi42MDctMi40Ni0zLjY0MS01LjYyOS00LjI1OS03LjUyMmwtLjI2Ny0uNzljLTEuMjQ0LTMuMzU4LTEuNjY2LTguMTkzLTEuOTE2LTE0LjQxOS0uMDM4LS45MzUtLjA2NC0xLjg5OC0uMDkzLTIuOTE5LS4wMjEtLjc0Ny0uMDQ3LTEuNjg0LS4wODUtMi42NjRhMTguOCAxOC44IDAgMDEtNC45NjIgMS41NjhjLTMuMDc5LjUyNi02LjM4OS4zNTYtOS44NC0uNTA3LTIuNDM1LS42MDktNC45NjUtMS44NzEtNi40MDctMy44Mi00LjIwMyAzLjY4MS04LjIxMiAzLjE4Mi0xMC4zOTYgMi40NTMtMy44NTMtMS4yODUtNy4zMDEtNC44OTYtMTAuNTQyLTExLjAzNy0yLjMwOS00LjM3NS00LjU0Mi0xMC4wNzUtNi42MzgtMTYuOTQzLTMuNjUtMTEuOTYtNS45NjktMjQuNTU3LTYuMTc1LTI4LjY5M0M0LjI5MiAyMy42OTggNy43NzcgMTQuNDQgMTUuMjk2IDkuMTI5IDI3LjE1Ny43NTEgNDUuMTI4IDUuNjc4IDUxLjY4IDcuOTE1YzQuNDAyLTIuNjUzIDkuNTgxLTMuOTQ0IDE1LjQzMy0zLjg1MSAzLjE0My4wNTEgNi4xMzYuMzI3IDguOTE2LjgyMyAyLjktLjkxMiA4LjYyOC0yLjIyMSAxNS4xODUtMi4xMzkgMTIuMDgxLjE0NCAyMi4wOTIgNC44NTIgMjguOTQ5IDEzLjYxNSA0Ljg5NCA2LjI1MiAyLjQ3NCAxOS4zODEuNTk3IDI2LjY1MS0yLjY0MiAxMC4yMjYtNy4yNzEgMjEuMTAyLTEyLjk1NyAzMC41NyAxLjU0NC4wMTEgMy43ODEtLjE3NCA2Ljk2MS0uODMxIDYuMjc0LTEuMjk1IDguMTA5IDIuMDY5IDguNjA3IDMuNTc1IDEuOTk1IDYuMDQyLTYuNjc3IDEwLjYwOC05LjM4MiAxMS44NjQtMy40NjYgMS42MDktOS4xMTcgMi41ODktMTMuNzQ1IDIuMzc3bC0uMjAyLS4wMTMtMS4yMTYtLjEwNy0uMTIgMS4wMTQtLjExNi45OTFjLS4zMTEgMTEuOTk5LTIuMDI1IDE5LjU5OC01LjU1MiAyNC42MTktMy42OTcgNS4yNjQtOC44MzUgNi43MzktMTMuMzYxIDcuNzA5LTEuNTQ0LjMzLTIuOTQ3LjQ3NC00LjIxOS40NzR6bS05LjE5LTQzLjY3MWMyLjgxOSAyLjI1NiAzLjA2NiA2LjUwMSAzLjI4NyAxNC40MzQuMDI4Ljk5LjA1NCAxLjkyNy4wODkgMi44MDIuMTA2IDIuNjUuMzU1IDguODU1IDEuMzI3IDExLjQ3Ny4xMzcuMzcxLjI2Ljc0Ny4zOSAxLjE0NiAxLjA4MyAzLjMxNiAxLjYyNiA0Ljk3OSA2LjMwOSAzLjk3OCAzLjkzMS0uODQzIDUuOTUyLTEuNTk5IDcuNTM0LTMuODUxIDIuMjk5LTMuMjc0IDMuNTg1LTkuODYgMy44MjEtMTkuNTc1bDQuNzgzLjExNi00Ljc1LS41Ny4xNC0xLjE4NmMuNDU1LTMuOTEuNzgzLTYuNzM0IDMuMzk2LTguNjAyIDIuMDk3LTEuNDk4IDQuNDg2LTEuMzUzIDYuMzg5LTEuMDEtMi4wOTEtMS41OC0yLjY2OS0zLjQzMy0yLjgyMy00LjE5M2wtLjM5OS0xLjk2NSAxLjEyMS0xLjY2M2M2LjQ1Ny05LjU4IDExLjc4MS0yMS4zNTQgMTQuNjA5LTMyLjMwNCAyLjkwNi0xMS4yNTEgMi4wMi0xNy4yMjYgMS4xMzQtMTguMzU2LTExLjcyOS0xNC45ODctMzIuMDY4LTguNzk5LTM0LjE5Mi04LjA5N2wtLjM1OS4xOTQtMS44LjMzNS0uOTIyLS4xOTFjLTIuNTQyLS41MjgtNS4zNjYtLjgyLTguMzkzLS44NjktNC43NTYtLjA4LTguNTkzIDEuMDQ0LTExLjczOSAzLjQzMWwtMi4xODMgMS42NTUtMi41MzMtMS4wNDNjLTUuNDEyLTIuMjEzLTIxLjMwOC02LjY2Mi0yOS42OTYtLjcyMS00LjY1NiAzLjI5OC02Ljc3NyA5Ljc2LTYuMzA1IDE5LjIwNy4xNTYgMy4xMTkgMi4yNzUgMTQuOTI2IDUuNzcxIDI2LjM3NyA0LjgzMSAxNS44MjUgOS4yMjEgMjEuMDgyIDExLjA1NCAyMS42OTMuMzIuMTA4IDEuMTUtLjUzNyAxLjk3Ni0xLjUyOWEyNzAuNzA4IDI3MC43MDggMCAwMTEwLjY5NC0xMi4wN2wyLjc3LTIuOTE1IDMuMzQ5IDIuMjI1YzEuMzUuODk3IDIuODM5IDEuNDA2IDQuMzY4IDEuNTAybDcuOTg3LTYuODEyLTEuMTU3IDExLjgwOGMtLjAyNi4yNjUtLjAzOS42MjYuMDY1IDEuMjk2bC4zNDggMi4yMzgtMS41MSAxLjY4OC0uMTc0LjE5NiA0LjM4OCAyLjAyNSAxLjgzNi0yLjMwMXoiLz48cGF0aCBkPSJNMTE1LjczMSA3Ny40NGMtMTMuOTI1IDIuODczLTE0Ljg4Mi0xLjg0Mi0xNC44ODItMS44NDIgMTQuNzAzLTIxLjgxNiAyMC44NDktNDkuNTEgMTUuNTQ1LTU2LjI4N0MxMDEuOTI0LjgyMyA3Ni44NzUgOS41NjYgNzYuNDU3IDkuNzkzbC0uMTM1LjAyNGMtMi43NTEtLjU3MS01LjgzLS45MTEtOS4yOTEtLjk2Ny02LjMwMS0uMTAzLTExLjA4IDEuNjUyLTE0LjcwNyA0LjQwMiAwIDAtNDQuNjg0LTE4LjQwOC00Mi42MDYgMjMuMTUxLjQ0MiA4Ljg0MiAxMi42NzIgNjYuODk5IDI3LjI2IDQ5LjM2MyA1LjMzMi02LjQxMiAxMC40ODMtMTEuODM0IDEwLjQ4My0xMS44MzQgMi41NTkgMS42OTkgNS42MjIgMi41NjcgOC44MzMgMi4yNTVsLjI1LS4yMTJjLS4wNzguNzk2LS4wNDIgMS41NzUuMSAyLjQ5Ny0zLjc1OCA0LjE5OS0yLjY1NCA0LjkzNi0xMC4xNjcgNi40ODItNy42MDIgMS41NjYtMy4xMzYgNC4zNTUtLjIyIDUuMDg0IDMuNTM0Ljg4NCAxMS43MTIgMi4xMzYgMTcuMjM3LTUuNTk4bC0uMjIxLjg4MmMxLjQ3MyAxLjE4IDIuNTA3IDcuNjcyIDIuMzM0IDEzLjU1Ny0uMTc0IDUuODg1LS4yOSA5LjkyNi44NzEgMTMuMDgyIDEuMTYgMy4xNTYgMi4zMTYgMTAuMjU2IDEyLjE5MiA4LjE0IDguMjUyLTEuNzY4IDEyLjUyOC02LjM1MSAxMy4xMjQtMTMuOTk1LjQyMi01LjQzNSAxLjM3Ny00LjYzMSAxLjQzOC05LjQ5bC43NjctMi4zYy44ODQtNy4zNjcuMTQtOS43NDMgNS4yMjUtOC42MzhsMS4yMzUuMTA4YzMuNzQyLjE3IDguNjM5LS42MDIgMTEuNTE0LTEuOTM4IDYuMTktMi44NzEgOS44NjEtNy42NjcgMy43NTgtNi40MDh6IiBmaWxsPSIjMzM2NzkxIi8+PHBhdGggZD0iTTc1Ljk1NyAxMjIuMzA3Yy04LjIzMiAwLTEwLjg0LTYuNTE5LTExLjkwNy05LjE4NS0xLjU2Mi0zLjkwNy0xLjg5OS0xOS4wNjktMS41NTEtMzEuNTAzYTEuNTkgMS41OSAwIDAxMS42NC0xLjU1IDEuNTk0IDEuNTk0IDAgMDExLjU1IDEuNjM5Yy0uNDAxIDE0LjM0MS4xNjggMjcuMzM3IDEuMzI0IDMwLjIyOSAxLjgwNCA0LjUwOSA0LjU0IDguNDUzIDEyLjI3NSA2Ljc5NiA3LjM0My0xLjU3NSAxMC4wOTMtNC4zNTkgMTEuMzE4LTExLjQ2Ljk0LTUuNDQ5IDIuNzk5LTIwLjk1MSAzLjAyOC0yNC4wMWExLjU5MyAxLjU5MyAwIDAxMS43MS0xLjQ3MiAxLjU5NyAxLjU5NyAwIDAxMS40NzIgMS43MWMtLjIzOSAzLjE4NS0yLjA4OSAxOC42NTctMy4wNjUgMjQuMzE1LTEuNDQ2IDguMzg3LTUuMTg1IDEyLjE5MS0xMy43OTQgMTQuMDM3LTEuNDYzLjMxMy0yLjc5Mi40NTMtNCAuNDU0ek0zMS4zMjEgOTAuNDY2YTYuNzEgNi43MSAwIDAxLTIuMTE2LS4zNWMtNS4zNDctMS43ODQtMTAuNDQtMTAuNDkyLTE1LjEzOC0yNS44ODUtMy41NzYtMTEuNzE3LTUuODQyLTIzLjk0Ny02LjA0MS0yNy45MjItLjU4OS0xMS43ODQgMi40NDUtMjAuMTIxIDkuMDItMjQuNzc4IDEzLjAwNy05LjIxNiAzNC44ODgtLjQ0IDM1LjgxMy0uMDYyYTEuNTk2IDEuNTk2IDAgMDEtMS4yMDcgMi45NTVjLS4yMTEtLjA4Ni0yMS4xOTMtOC40OTItMzIuNzY4LS4yODUtNS42MjIgMy45ODYtOC4yMDMgMTEuMzkyLTcuNjcyIDIyLjAxMS4xNjcgMy4zNDkgMi4yODQgMTUuMjg1IDUuOTA2IDI3LjE0OSA0LjE5NCAxMy43NDIgOC45NjcgMjIuNDEzIDEzLjA5NiAyMy43OS42NDguMjE2IDIuNjIuODczIDUuNDM5LTIuNTE3QTI0NS4yNzIgMjQ1LjI3MiAwIDAxNDUuODggNzMuMDQ2YTEuNTk2IDEuNTk2IDAgMDEyLjMwNCAyLjIwOGMtLjA0OC4wNS00Ljg0NyA1LjA2Ny0xMC4wNzcgMTEuMzU5LTIuNDc3IDIuOTc5LTQuODUxIDMuODUzLTYuNzg2IDMuODUzem02OS40MjktMTMuNDQ1YTEuNTk2IDEuNTk2IDAgMDEtMS4zMjItMi40ODdjMTQuODYzLTIyLjA1NSAyMC4wOC00OC43MDQgMTUuNjEyLTU0LjQxNC01LjYyNC03LjE4Ni0xMy41NjUtMTAuOTM5LTIzLjYwNC0xMS4xNTYtNy40MzMtLjE2LTEzLjM0MSAxLjczOC0xNC4zMDcgMi4wNjlsLS4yNDMuMDk5Yy0uOTcxLjMwNS0xLjcxNi0uMjI3LTEuOTk3LS44NDlhMS42IDEuNiAwIDAxLjYzMS0yLjAyNWMuMDQ2LS4wMjcuMTkyLS4wODkuNDI5LS4xNzZsLS4wMjEuMDA2LjAyMS0uMDA3YzEuNjQxLS42MDEgNy42MzktMi40IDE1LjA2OC0yLjMxNSAxMS4xMDguMTE4IDIwLjI4NCA0LjQwMSAyNi41MzQgMTIuMzg4IDIuOTU3IDMuNzc5IDIuOTY0IDEyLjQ4NS4wMTkgMjMuODg3LTMuMDAyIDExLjYyNS04LjY1MSAyNC4xMTgtMTUuNDk3IDM0LjI3Ny0uMzA2LjQ1Ny0uODEuNzAzLTEuMzIzLjcwM3ptLjc2IDEwLjIxYy0yLjUzOCAwLTQuODEzLS4zNTgtNi4xNzUtMS4xNzQtMS40LS44MzktMS42NjctMS45NzktMS43MDItMi41ODQtLjM4Mi02LjcxIDMuMzItNy44NzggNS4yMDgtOC40MTEtLjI2My0uMzk4LS42MzctLjg2Ni0xLjAyNC0xLjM0OS0xLjEwMS0xLjM3Ni0yLjYwOS0zLjI2LTMuNzcxLTYuMDc4LS4xODItLjQ0LS43NTItMS40NjMtMS40MTItMi42NDgtMy41NzktNi40MTgtMTEuMDI2LTE5Ljc3My02LjI0Mi0yNi42MTIgMi4yMTQtMy4xNjUgNi42MjMtNC40MTEgMTMuMTE5LTMuNzE2Qzk3LjYgMjguODM3IDg4LjUgMTAuNjI1IDY2LjkwNyAxMC4yNzFjLTYuNDk0LS4xMDgtMTEuODIgMS44ODktMTUuODIyIDUuOTMtOC45NiA5LjA0OS04LjYzNiAyNS40MjItOC42MzEgMjUuNTg2YTEuNTk1IDEuNTk1IDAgMTEtMy4xOS4wODRjLS4wMi0uNzI3LS4zNTQtMTcuOTA5IDkuNTU0LTI3LjkxNkM1My40NTUgOS4yNzIgNTkuNTU5IDYuOTYgNjYuOTYgNy4wODFjMTMuODE0LjIyNyAyMi43MDYgNy4yNSAyNy43MzIgMTMuMTAxIDUuNDc5IDYuMzc3IDguMTY1IDEzLjQxMSA4LjM4NiAxNS43NTkuMTY1IDEuNzQ2LTEuMDg4IDIuMDk1LTEuMzQxIDIuMTQ3bC0uNTc2LjAxM2MtNi4zNzUtMS4wMjEtMTAuNDY1LS4zMTItMTIuMTU2IDIuMTA0LTMuNjM5IDUuMjAxIDMuNDA2IDE3LjgzNCA2LjQxNCAyMy4yMjkuNzY4IDEuMzc2IDEuMzIyIDIuMzcxIDEuNTc2IDIuOTg1Ljk4OCAyLjM5NiAyLjI3NyA0LjAwNiAzLjMxMiA1LjMuOTExIDEuMTM4IDEuNyAyLjEyNSAxLjk4MiAzLjI4My4xMzEuMjMgMS45OSAyLjk4IDEzLjAyMS43MDMgMi43NjUtLjU3IDQuNDIzLS4wODMgNC45MyAxLjQ1Ljk5NyAzLjAxNS00LjU5NyA2LjUzMi03LjY5NCA3Ljk3LTIuNzc1IDEuMjktNy4yMDQgMi4xMDYtMTEuMDM2IDIuMTA2em0tNC42OTYtNC4wMjFjLjM1LjM1MyAyLjEwMS45NjIgNS43MjcuODA2IDMuMjI0LS4xMzggNi42MjQtLjgzOSA4LjY2NC0xLjc4NiAyLjYwOS0xLjIxMiA0LjM1MS0yLjU2NyA1LjI1My0zLjQ5MmwtLjUuMDkyYy03LjA1MyAxLjQ1Ni0xMi4wNDIgMS4yNjItMTQuODI4LS41NzdhNi4xNjIgNi4xNjIgMCAwMS0uNTQtLjQwMWMtLjMwMi4xMTktLjU4MS4xOTctLjc4LjI1My0xLjU4LjQ0My0zLjIxNC45MDItMi45OTYgNS4xMDV6bS00NS41NjIgOC45MTVjLTEuNzUyIDAtMy41OTYtLjIzOS01LjQ3OS0uNzEtMS45NTEtLjQ4OC01LjI0LTEuOTU3LTUuMTktNC4zNy4wNTctMi43MDcgMy45OTQtMy41MTkgNS40NzYtMy44MjQgNS4zNTQtMS4xMDMgNS43MDMtMS41NDUgNy4zNzYtMy42Ny40ODgtLjYxOSAxLjA5NS0xLjM5IDEuOTIzLTIuMzE0IDEuMjI5LTEuMzc2IDIuNTcyLTIuMDczIDMuOTkyLTIuMDczLjk4OSAwIDEuOC4zMzUgMi4zMzYuNTU4IDEuNzA4LjcwOCAzLjEzMyAyLjQyIDMuNzE5IDQuNDY3LjUyOSAxLjg0Ny4yNzYgMy42MjUtLjcxIDUuMDA2LTMuMjM3IDQuNTMzLTcuODg2IDYuOTMtMTMuNDQzIDYuOTN6bS03LjIyMi00Ljk0M2MuNDgxLjM3MiAxLjQ0NS44NjkgMi41MTggMS4xMzcgMS42MzEuNDA4IDMuMjEzLjYxNSA0LjcwNS42MTUgNC41NDYgMCA4LjE5Ni0xLjg4MiAxMC44NDctNS41OTQuNTUzLS43NzQuMzg3LTEuNzU3LjIzOS0yLjI3NC0uMzEtMS4wODMtMS4wOC0yLjA2OC0xLjg3My0yLjM5Ny0uNDMtLjE3OC0uNzg3LS4zMTQtMS4xMTUtLjMxNC0uMTc2IDAtLjcxMiAwLTEuNjE0IDEuMDA5YTQxLjE0NiA0MS4xNDYgMCAwMC0xLjc5NCAyLjE2MmMtMi4wODQgMi42NDYtMy4wMzkgMy41NDQtOS4yMzkgNC44MjEtMS41MTMuMzEtMi4yODkuNjI2LTIuNjc0LjgzNXptMTIuMjY5LTcuMzZhMS41OTYgMS41OTYgMCAwMS0xLjU3NS0xLjM1NCA4LjIxOCA4LjIxOCAwIDAxLS4wOC0uNzk5Yy00LjA2NC0uMDc2LTcuOTg1LTEuODItMTAuOTYyLTQuOTI2LTMuNzY0LTMuOTI3LTUuNDc3LTkuMzY4LTQuNjk5LTE0LjkyNy44NDUtNi4wMzcuNTI5LTExLjM2Ni4zNTktMTQuMjI5LS4wNDctLjc5Ni0uMDgxLTEuMzcxLS4wNzktMS43NjkuMDAzLS41MDUuMDEzLTEuODQ0IDQuNDg5LTQuMTEzIDEuNTkyLS44MDcgNC43ODQtMi4yMTUgOC4yNzEtMi41NzYgNS43NzctLjU5NyA5LjU4NSAxLjk3NiAxMC43MjUgNy4yNDYgMy4wNzcgMTQuMjI4LjI0NCAyMC41MjEtMS44MjUgMjUuMTE3LS4zODUuODU2LS43NDkgMS42NjQtMS4wNCAyLjQ0N2wtLjI1Ny42OWMtMS4wOTMgMi45MzEtMi4wMzggNS40NjMtMS43NDggNy4zNTRhMS41OTUgMS41OTUgMCAwMS0xLjMzNSAxLjgxOWwtLjI0NC4wMnpNNDIuNDY0IDQyLjI2bC4wNjIgMS4xMzljLjE3NiAyLjk3NC41MDQgOC41MDgtLjM4NCAxNC44Ni0uNjQxIDQuNTg1Ljc1OSA5LjA2IDMuODQzIDEyLjI3NiAyLjQzNyAyLjU0MiA1LjY0NCAzLjk0NSA4Ljk0IDMuOTQ1aC4wNjhjLjM2OS0xLjU1NS45ODItMy4xOTcgMS42NDItNC45NjZsLjI1NS0uNjg2Yy4zMjktLjg4NC43MTQtMS43NCAxLjEyMi0yLjY0NiAxLjk5MS00LjQyNCA0LjQ3LTkuOTMxIDEuNjE1LTIzLjEzMi0uNTY1LTIuNjE1LTEuOTM2LTQuMTI4LTQuMTg5LTQuNjI3LTQuNjI4LTEuMDIyLTExLjUyNSAyLjQ1OS0xMi45NzQgMy44Mzd6bTkuNjMtLjY3N2MtLjA4LjU2NCAxLjAzMyAyLjA3IDIuNDg1IDIuMjcxIDEuNDQ5LjIwMyAyLjY4OS0uOTc1IDIuNzY4LTEuNTM5LjA3OS0uNTY0LTEuMDMzLTEuMTg2LTIuNDg1LTEuMzg4LTEuNDUxLS4yMDItMi42OTEuMDkyLTIuNzY4LjY1NnptMi44MTggMi44MjZsLS40MDctLjAyOGMtLjktLjEyNS0xLjgxLS42OTItMi40MzMtMS41MTgtLjIxOS0uMjktLjU3Ni0uODUyLS41MDUtMS4zNTQuMTAxLS43MzYuOTk5LTEuMTc3IDIuNC0xLjE3Ny4zMTMgMCAuNjM5LjAyMy45NjcuMDY5Ljc2Ni4xMDYgMS40NzcuMzI3IDIuMDAyLjYyLjkxLjUwOC45NzcgMS4wNzUuOTM2IDEuMzY4LS4xMTIuODEzLTEuNDA1IDIuMDItMi45NiAyLjAyem0tMi4yODktMi43MzJjLjA0NS4zNDguOTA3IDEuNDk2IDIuMDI5IDEuNjUxbC4yNjEuMDE4YzEuMDM2IDAgMS44MS0uODE1IDEuOTAxLTEuMDgyLS4wOTYtLjE4Mi0uNzYyLS42MzQtMi4wMjUtLjgxYTUuODIzIDUuODIzIDAgMDAtLjgyMS0uMDU5Yy0uODEyIDAtMS4yNDMuMTgzLTEuMzQ1LjI4MnptNDMuNjA1LTEuMjQ1Yy4wNzkuNTY0LTEuMDMzIDIuMDctMi40ODQgMi4yNzItMS40NS4yMDItMi42OTEtLjk3NS0yLjc3MS0xLjUzOS0uMDc2LS41NjQgMS4wMzYtMS4xODcgMi40ODYtMS4zODggMS40NS0uMjAzIDIuNjg5LjA5MiAyLjc2OS42NTV6bS0yLjgxOSAyLjU2Yy0xLjM5NiAwLTIuNjAxLTEuMDg2LTIuNy0xLjc5MS0uMTE1LS44NDYgMS4yNzgtMS40ODkgMi43MTItMS42ODguMzE2LS4wNDQuNjI5LS4wNjYuOTMtLjA2NiAxLjIzOCAwIDIuMDU4LjM2MyAyLjE0Ljk0OS4wNTMuMzc5LS4yMzguOTY0LS43MzkgMS40OTItLjMzMS4zNDctMS4wMjYuOTQ4LTEuOTczIDEuMDc5bC0uMzcuMDI1em0uOTQzLTMuMDEzYy0uMjc2IDAtLjU2NC4wMjEtLjg1Ni4wNjEtMS40NDEuMjAxLTIuMzAxLjc3OS0yLjI1OSAxLjA4OS4wNDguMzQxLjk2OCAxLjMzMiAyLjE3MyAxLjMzMmwuMjk3LS4wMjFjLjc4Ny0uMTA5IDEuMzc4LS42MjMgMS42Ni0uOTE5LjQ0My0uNDY1LjYxOS0uOTAzLjU5OC0xLjA1Mi0uMDI4LS4xOTgtLjU2LS40OS0xLjYxMy0uNDl6bTMuOTY1IDMyLjg0M2ExLjU5NCAxLjU5NCAwIDAxLTEuMzI0LTIuNDgzYzMuMzk4LTUuMDc1IDIuNzc2LTEwLjI1IDIuMTc1LTE1LjI1NS0uMjU3LTIuMTMyLS41MjEtNC4zMzctLjQ1My02LjQ1My4wNy0yLjE3Ny4zNDctMy45NzMuNjE0LTUuNzEuMzE3LTIuMDU4LjYxNy00LjAwMi40OTMtNi4zMWExLjU5NSAxLjU5NSAwIDExMy4xODYtLjE3MmMuMTQyIDIuNjM4LS4xOTcgNC44MzgtLjUyNSA2Ljk2Ny0uMjUzIDEuNjQzLS41MTUgMy4zNDItLjU3OCA1LjMyNy0uMDYxIDEuODc0LjE3OCAzLjg2NC40MzEgNS45Ny42NCA1LjMyMiAxLjM2NSAxMS4zNTQtMi42OTEgMTcuNDExYTEuNTk2IDEuNTk2IDAgMDEtMS4zMjguNzA4eiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==;" parent="1" vertex="1">
<mxGeometry x="400" y="-646" width="70" height="70" as="geometry" />
</mxCell>
<mxCell id="PG-S5D8SCmHSsYNVxMVk-10" value="" style="shape=image;imageAspect=0;aspect=fixed;verticalLabelPosition=bottom;verticalAlign=top;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjggMTI4Ij48cGF0aCBkPSJNOTMuODA5IDkyLjExMmMuNzg1LTYuNTMzLjU1LTcuNDkyIDUuNDE2LTYuNDMzbDEuMjM1LjEwOGMzLjc0Mi4xNyA4LjYzNy0uNjAyIDExLjUxMy0xLjkzOCA2LjE5MS0yLjg3MyA5Ljg2MS03LjY2OCAzLjc1OC02LjQwOS0xMy45MjQgMi44NzMtMTQuODgxLTEuODQyLTE0Ljg4MS0xLjg0MiAxNC43MDMtMjEuODE1IDIwLjg0OS00OS41MDggMTUuNTQzLTU2LjI4Ny0xNC40Ny0xOC40ODktMzkuNTE3LTkuNzQ2LTM5LjkzNi05LjUybC0uMTM0LjAyNWMtMi43NTEtLjU3MS01LjgzLS45MTItOS4yODktLjk2OC02LjMwMS0uMTA0LTExLjA4MiAxLjY1Mi0xNC43MDkgNC40MDIgMCAwLTQ0LjY4My0xOC40MDktNDIuNjA0IDIzLjE1MS40NDIgOC44NDEgMTIuNjcyIDY2Ljg5OCAyNy4yNiA0OS4zNjIgNS4zMzItNi40MTIgMTAuNDg0LTExLjgzNCAxMC40ODQtMTEuODM0IDIuNTU4IDEuNjk5IDUuNjIyIDIuNTY3IDguODM0IDIuMjU1bC4yNDktLjIxMmMtLjA3OC43OTYtLjA0NCAxLjU3NS4wOTkgMi40OTctMy43NTcgNC4xOTktMi42NTMgNC45MzYtMTAuMTY2IDYuNDgyLTcuNjAyIDEuNTY2LTMuMTM2IDQuMzU1LS4yMjEgNS4wODQgMy41MzUuODg0IDExLjcxMiAyLjEzNiAxNy4yMzgtNS41OThsLS4yMi44ODJjMS40NzQgMS4xOCAxLjM3NSA4LjQ3NyAxLjU4MyAxMy42OS4yMDkgNS4yMTQuNTU4IDEwLjA3OSAxLjYyMSAxMi45NDggMS4wNjMgMi44NjggMi4zMTcgMTAuMjU2IDEyLjE5MSA4LjE0IDguMjUyLTEuNzY0IDE0LjU2MS00LjMwOSAxNS4xMzYtMjcuOTg1Ii8+PHBhdGggZD0iTTc1LjQ1OCAxMjUuMjU2Yy00LjM2NyAwLTcuMjExLTEuNjg5LTguOTM4LTMuMzItMi42MDctMi40Ni0zLjY0MS01LjYyOS00LjI1OS03LjUyMmwtLjI2Ny0uNzljLTEuMjQ0LTMuMzU4LTEuNjY2LTguMTkzLTEuOTE2LTE0LjQxOS0uMDM4LS45MzUtLjA2NC0xLjg5OC0uMDkzLTIuOTE5LS4wMjEtLjc0Ny0uMDQ3LTEuNjg0LS4wODUtMi42NjRhMTguOCAxOC44IDAgMDEtNC45NjIgMS41NjhjLTMuMDc5LjUyNi02LjM4OS4zNTYtOS44NC0uNTA3LTIuNDM1LS42MDktNC45NjUtMS44NzEtNi40MDctMy44Mi00LjIwMyAzLjY4MS04LjIxMiAzLjE4Mi0xMC4zOTYgMi40NTMtMy44NTMtMS4yODUtNy4zMDEtNC44OTYtMTAuNTQyLTExLjAzNy0yLjMwOS00LjM3NS00LjU0Mi0xMC4wNzUtNi42MzgtMTYuOTQzLTMuNjUtMTEuOTYtNS45NjktMjQuNTU3LTYuMTc1LTI4LjY5M0M0LjI5MiAyMy42OTggNy43NzcgMTQuNDQgMTUuMjk2IDkuMTI5IDI3LjE1Ny43NTEgNDUuMTI4IDUuNjc4IDUxLjY4IDcuOTE1YzQuNDAyLTIuNjUzIDkuNTgxLTMuOTQ0IDE1LjQzMy0zLjg1MSAzLjE0My4wNTEgNi4xMzYuMzI3IDguOTE2LjgyMyAyLjktLjkxMiA4LjYyOC0yLjIyMSAxNS4xODUtMi4xMzkgMTIuMDgxLjE0NCAyMi4wOTIgNC44NTIgMjguOTQ5IDEzLjYxNSA0Ljg5NCA2LjI1MiAyLjQ3NCAxOS4zODEuNTk3IDI2LjY1MS0yLjY0MiAxMC4yMjYtNy4yNzEgMjEuMTAyLTEyLjk1NyAzMC41NyAxLjU0NC4wMTEgMy43ODEtLjE3NCA2Ljk2MS0uODMxIDYuMjc0LTEuMjk1IDguMTA5IDIuMDY5IDguNjA3IDMuNTc1IDEuOTk1IDYuMDQyLTYuNjc3IDEwLjYwOC05LjM4MiAxMS44NjQtMy40NjYgMS42MDktOS4xMTcgMi41ODktMTMuNzQ1IDIuMzc3bC0uMjAyLS4wMTMtMS4yMTYtLjEwNy0uMTIgMS4wMTQtLjExNi45OTFjLS4zMTEgMTEuOTk5LTIuMDI1IDE5LjU5OC01LjU1MiAyNC42MTktMy42OTcgNS4yNjQtOC44MzUgNi43MzktMTMuMzYxIDcuNzA5LTEuNTQ0LjMzLTIuOTQ3LjQ3NC00LjIxOS40NzR6bS05LjE5LTQzLjY3MWMyLjgxOSAyLjI1NiAzLjA2NiA2LjUwMSAzLjI4NyAxNC40MzQuMDI4Ljk5LjA1NCAxLjkyNy4wODkgMi44MDIuMTA2IDIuNjUuMzU1IDguODU1IDEuMzI3IDExLjQ3Ny4xMzcuMzcxLjI2Ljc0Ny4zOSAxLjE0NiAxLjA4MyAzLjMxNiAxLjYyNiA0Ljk3OSA2LjMwOSAzLjk3OCAzLjkzMS0uODQzIDUuOTUyLTEuNTk5IDcuNTM0LTMuODUxIDIuMjk5LTMuMjc0IDMuNTg1LTkuODYgMy44MjEtMTkuNTc1bDQuNzgzLjExNi00Ljc1LS41Ny4xNC0xLjE4NmMuNDU1LTMuOTEuNzgzLTYuNzM0IDMuMzk2LTguNjAyIDIuMDk3LTEuNDk4IDQuNDg2LTEuMzUzIDYuMzg5LTEuMDEtMi4wOTEtMS41OC0yLjY2OS0zLjQzMy0yLjgyMy00LjE5M2wtLjM5OS0xLjk2NSAxLjEyMS0xLjY2M2M2LjQ1Ny05LjU4IDExLjc4MS0yMS4zNTQgMTQuNjA5LTMyLjMwNCAyLjkwNi0xMS4yNTEgMi4wMi0xNy4yMjYgMS4xMzQtMTguMzU2LTExLjcyOS0xNC45ODctMzIuMDY4LTguNzk5LTM0LjE5Mi04LjA5N2wtLjM1OS4xOTQtMS44LjMzNS0uOTIyLS4xOTFjLTIuNTQyLS41MjgtNS4zNjYtLjgyLTguMzkzLS44NjktNC43NTYtLjA4LTguNTkzIDEuMDQ0LTExLjczOSAzLjQzMWwtMi4xODMgMS42NTUtMi41MzMtMS4wNDNjLTUuNDEyLTIuMjEzLTIxLjMwOC02LjY2Mi0yOS42OTYtLjcyMS00LjY1NiAzLjI5OC02Ljc3NyA5Ljc2LTYuMzA1IDE5LjIwNy4xNTYgMy4xMTkgMi4yNzUgMTQuOTI2IDUuNzcxIDI2LjM3NyA0LjgzMSAxNS44MjUgOS4yMjEgMjEuMDgyIDExLjA1NCAyMS42OTMuMzIuMTA4IDEuMTUtLjUzNyAxLjk3Ni0xLjUyOWEyNzAuNzA4IDI3MC43MDggMCAwMTEwLjY5NC0xMi4wN2wyLjc3LTIuOTE1IDMuMzQ5IDIuMjI1YzEuMzUuODk3IDIuODM5IDEuNDA2IDQuMzY4IDEuNTAybDcuOTg3LTYuODEyLTEuMTU3IDExLjgwOGMtLjAyNi4yNjUtLjAzOS42MjYuMDY1IDEuMjk2bC4zNDggMi4yMzgtMS41MSAxLjY4OC0uMTc0LjE5NiA0LjM4OCAyLjAyNSAxLjgzNi0yLjMwMXoiLz48cGF0aCBkPSJNMTE1LjczMSA3Ny40NGMtMTMuOTI1IDIuODczLTE0Ljg4Mi0xLjg0Mi0xNC44ODItMS44NDIgMTQuNzAzLTIxLjgxNiAyMC44NDktNDkuNTEgMTUuNTQ1LTU2LjI4N0MxMDEuOTI0LjgyMyA3Ni44NzUgOS41NjYgNzYuNDU3IDkuNzkzbC0uMTM1LjAyNGMtMi43NTEtLjU3MS01LjgzLS45MTEtOS4yOTEtLjk2Ny02LjMwMS0uMTAzLTExLjA4IDEuNjUyLTE0LjcwNyA0LjQwMiAwIDAtNDQuNjg0LTE4LjQwOC00Mi42MDYgMjMuMTUxLjQ0MiA4Ljg0MiAxMi42NzIgNjYuODk5IDI3LjI2IDQ5LjM2MyA1LjMzMi02LjQxMiAxMC40ODMtMTEuODM0IDEwLjQ4My0xMS44MzQgMi41NTkgMS42OTkgNS42MjIgMi41NjcgOC44MzMgMi4yNTVsLjI1LS4yMTJjLS4wNzguNzk2LS4wNDIgMS41NzUuMSAyLjQ5Ny0zLjc1OCA0LjE5OS0yLjY1NCA0LjkzNi0xMC4xNjcgNi40ODItNy42MDIgMS41NjYtMy4xMzYgNC4zNTUtLjIyIDUuMDg0IDMuNTM0Ljg4NCAxMS43MTIgMi4xMzYgMTcuMjM3LTUuNTk4bC0uMjIxLjg4MmMxLjQ3MyAxLjE4IDIuNTA3IDcuNjcyIDIuMzM0IDEzLjU1Ny0uMTc0IDUuODg1LS4yOSA5LjkyNi44NzEgMTMuMDgyIDEuMTYgMy4xNTYgMi4zMTYgMTAuMjU2IDEyLjE5MiA4LjE0IDguMjUyLTEuNzY4IDEyLjUyOC02LjM1MSAxMy4xMjQtMTMuOTk1LjQyMi01LjQzNSAxLjM3Ny00LjYzMSAxLjQzOC05LjQ5bC43NjctMi4zYy44ODQtNy4zNjcuMTQtOS43NDMgNS4yMjUtOC42MzhsMS4yMzUuMTA4YzMuNzQyLjE3IDguNjM5LS42MDIgMTEuNTE0LTEuOTM4IDYuMTktMi44NzEgOS44NjEtNy42NjcgMy43NTgtNi40MDh6IiBmaWxsPSIjMzM2NzkxIi8+PHBhdGggZD0iTTc1Ljk1NyAxMjIuMzA3Yy04LjIzMiAwLTEwLjg0LTYuNTE5LTExLjkwNy05LjE4NS0xLjU2Mi0zLjkwNy0xLjg5OS0xOS4wNjktMS41NTEtMzEuNTAzYTEuNTkgMS41OSAwIDAxMS42NC0xLjU1IDEuNTk0IDEuNTk0IDAgMDExLjU1IDEuNjM5Yy0uNDAxIDE0LjM0MS4xNjggMjcuMzM3IDEuMzI0IDMwLjIyOSAxLjgwNCA0LjUwOSA0LjU0IDguNDUzIDEyLjI3NSA2Ljc5NiA3LjM0My0xLjU3NSAxMC4wOTMtNC4zNTkgMTEuMzE4LTExLjQ2Ljk0LTUuNDQ5IDIuNzk5LTIwLjk1MSAzLjAyOC0yNC4wMWExLjU5MyAxLjU5MyAwIDAxMS43MS0xLjQ3MiAxLjU5NyAxLjU5NyAwIDAxMS40NzIgMS43MWMtLjIzOSAzLjE4NS0yLjA4OSAxOC42NTctMy4wNjUgMjQuMzE1LTEuNDQ2IDguMzg3LTUuMTg1IDEyLjE5MS0xMy43OTQgMTQuMDM3LTEuNDYzLjMxMy0yLjc5Mi40NTMtNCAuNDU0ek0zMS4zMjEgOTAuNDY2YTYuNzEgNi43MSAwIDAxLTIuMTE2LS4zNWMtNS4zNDctMS43ODQtMTAuNDQtMTAuNDkyLTE1LjEzOC0yNS44ODUtMy41NzYtMTEuNzE3LTUuODQyLTIzLjk0Ny02LjA0MS0yNy45MjItLjU4OS0xMS43ODQgMi40NDUtMjAuMTIxIDkuMDItMjQuNzc4IDEzLjAwNy05LjIxNiAzNC44ODgtLjQ0IDM1LjgxMy0uMDYyYTEuNTk2IDEuNTk2IDAgMDEtMS4yMDcgMi45NTVjLS4yMTEtLjA4Ni0yMS4xOTMtOC40OTItMzIuNzY4LS4yODUtNS42MjIgMy45ODYtOC4yMDMgMTEuMzkyLTcuNjcyIDIyLjAxMS4xNjcgMy4zNDkgMi4yODQgMTUuMjg1IDUuOTA2IDI3LjE0OSA0LjE5NCAxMy43NDIgOC45NjcgMjIuNDEzIDEzLjA5NiAyMy43OS42NDguMjE2IDIuNjIuODczIDUuNDM5LTIuNTE3QTI0NS4yNzIgMjQ1LjI3MiAwIDAxNDUuODggNzMuMDQ2YTEuNTk2IDEuNTk2IDAgMDEyLjMwNCAyLjIwOGMtLjA0OC4wNS00Ljg0NyA1LjA2Ny0xMC4wNzcgMTEuMzU5LTIuNDc3IDIuOTc5LTQuODUxIDMuODUzLTYuNzg2IDMuODUzem02OS40MjktMTMuNDQ1YTEuNTk2IDEuNTk2IDAgMDEtMS4zMjItMi40ODdjMTQuODYzLTIyLjA1NSAyMC4wOC00OC43MDQgMTUuNjEyLTU0LjQxNC01LjYyNC03LjE4Ni0xMy41NjUtMTAuOTM5LTIzLjYwNC0xMS4xNTYtNy40MzMtLjE2LTEzLjM0MSAxLjczOC0xNC4zMDcgMi4wNjlsLS4yNDMuMDk5Yy0uOTcxLjMwNS0xLjcxNi0uMjI3LTEuOTk3LS44NDlhMS42IDEuNiAwIDAxLjYzMS0yLjAyNWMuMDQ2LS4wMjcuMTkyLS4wODkuNDI5LS4xNzZsLS4wMjEuMDA2LjAyMS0uMDA3YzEuNjQxLS42MDEgNy42MzktMi40IDE1LjA2OC0yLjMxNSAxMS4xMDguMTE4IDIwLjI4NCA0LjQwMSAyNi41MzQgMTIuMzg4IDIuOTU3IDMuNzc5IDIuOTY0IDEyLjQ4NS4wMTkgMjMuODg3LTMuMDAyIDExLjYyNS04LjY1MSAyNC4xMTgtMTUuNDk3IDM0LjI3Ny0uMzA2LjQ1Ny0uODEuNzAzLTEuMzIzLjcwM3ptLjc2IDEwLjIxYy0yLjUzOCAwLTQuODEzLS4zNTgtNi4xNzUtMS4xNzQtMS40LS44MzktMS42NjctMS45NzktMS43MDItMi41ODQtLjM4Mi02LjcxIDMuMzItNy44NzggNS4yMDgtOC40MTEtLjI2My0uMzk4LS42MzctLjg2Ni0xLjAyNC0xLjM0OS0xLjEwMS0xLjM3Ni0yLjYwOS0zLjI2LTMuNzcxLTYuMDc4LS4xODItLjQ0LS43NTItMS40NjMtMS40MTItMi42NDgtMy41NzktNi40MTgtMTEuMDI2LTE5Ljc3My02LjI0Mi0yNi42MTIgMi4yMTQtMy4xNjUgNi42MjMtNC40MTEgMTMuMTE5LTMuNzE2Qzk3LjYgMjguODM3IDg4LjUgMTAuNjI1IDY2LjkwNyAxMC4yNzFjLTYuNDk0LS4xMDgtMTEuODIgMS44ODktMTUuODIyIDUuOTMtOC45NiA5LjA0OS04LjYzNiAyNS40MjItOC42MzEgMjUuNTg2YTEuNTk1IDEuNTk1IDAgMTEtMy4xOS4wODRjLS4wMi0uNzI3LS4zNTQtMTcuOTA5IDkuNTU0LTI3LjkxNkM1My40NTUgOS4yNzIgNTkuNTU5IDYuOTYgNjYuOTYgNy4wODFjMTMuODE0LjIyNyAyMi43MDYgNy4yNSAyNy43MzIgMTMuMTAxIDUuNDc5IDYuMzc3IDguMTY1IDEzLjQxMSA4LjM4NiAxNS43NTkuMTY1IDEuNzQ2LTEuMDg4IDIuMDk1LTEuMzQxIDIuMTQ3bC0uNTc2LjAxM2MtNi4zNzUtMS4wMjEtMTAuNDY1LS4zMTItMTIuMTU2IDIuMTA0LTMuNjM5IDUuMjAxIDMuNDA2IDE3LjgzNCA2LjQxNCAyMy4yMjkuNzY4IDEuMzc2IDEuMzIyIDIuMzcxIDEuNTc2IDIuOTg1Ljk4OCAyLjM5NiAyLjI3NyA0LjAwNiAzLjMxMiA1LjMuOTExIDEuMTM4IDEuNyAyLjEyNSAxLjk4MiAzLjI4My4xMzEuMjMgMS45OSAyLjk4IDEzLjAyMS43MDMgMi43NjUtLjU3IDQuNDIzLS4wODMgNC45MyAxLjQ1Ljk5NyAzLjAxNS00LjU5NyA2LjUzMi03LjY5NCA3Ljk3LTIuNzc1IDEuMjktNy4yMDQgMi4xMDYtMTEuMDM2IDIuMTA2em0tNC42OTYtNC4wMjFjLjM1LjM1MyAyLjEwMS45NjIgNS43MjcuODA2IDMuMjI0LS4xMzggNi42MjQtLjgzOSA4LjY2NC0xLjc4NiAyLjYwOS0xLjIxMiA0LjM1MS0yLjU2NyA1LjI1My0zLjQ5MmwtLjUuMDkyYy03LjA1MyAxLjQ1Ni0xMi4wNDIgMS4yNjItMTQuODI4LS41NzdhNi4xNjIgNi4xNjIgMCAwMS0uNTQtLjQwMWMtLjMwMi4xMTktLjU4MS4xOTctLjc4LjI1My0xLjU4LjQ0My0zLjIxNC45MDItMi45OTYgNS4xMDV6bS00NS41NjIgOC45MTVjLTEuNzUyIDAtMy41OTYtLjIzOS01LjQ3OS0uNzEtMS45NTEtLjQ4OC01LjI0LTEuOTU3LTUuMTktNC4zNy4wNTctMi43MDcgMy45OTQtMy41MTkgNS40NzYtMy44MjQgNS4zNTQtMS4xMDMgNS43MDMtMS41NDUgNy4zNzYtMy42Ny40ODgtLjYxOSAxLjA5NS0xLjM5IDEuOTIzLTIuMzE0IDEuMjI5LTEuMzc2IDIuNTcyLTIuMDczIDMuOTkyLTIuMDczLjk4OSAwIDEuOC4zMzUgMi4zMzYuNTU4IDEuNzA4LjcwOCAzLjEzMyAyLjQyIDMuNzE5IDQuNDY3LjUyOSAxLjg0Ny4yNzYgMy42MjUtLjcxIDUuMDA2LTMuMjM3IDQuNTMzLTcuODg2IDYuOTMtMTMuNDQzIDYuOTN6bS03LjIyMi00Ljk0M2MuNDgxLjM3MiAxLjQ0NS44NjkgMi41MTggMS4xMzcgMS42MzEuNDA4IDMuMjEzLjYxNSA0LjcwNS42MTUgNC41NDYgMCA4LjE5Ni0xLjg4MiAxMC44NDctNS41OTQuNTUzLS43NzQuMzg3LTEuNzU3LjIzOS0yLjI3NC0uMzEtMS4wODMtMS4wOC0yLjA2OC0xLjg3My0yLjM5Ny0uNDMtLjE3OC0uNzg3LS4zMTQtMS4xMTUtLjMxNC0uMTc2IDAtLjcxMiAwLTEuNjE0IDEuMDA5YTQxLjE0NiA0MS4xNDYgMCAwMC0xLjc5NCAyLjE2MmMtMi4wODQgMi42NDYtMy4wMzkgMy41NDQtOS4yMzkgNC44MjEtMS41MTMuMzEtMi4yODkuNjI2LTIuNjc0LjgzNXptMTIuMjY5LTcuMzZhMS41OTYgMS41OTYgMCAwMS0xLjU3NS0xLjM1NCA4LjIxOCA4LjIxOCAwIDAxLS4wOC0uNzk5Yy00LjA2NC0uMDc2LTcuOTg1LTEuODItMTAuOTYyLTQuOTI2LTMuNzY0LTMuOTI3LTUuNDc3LTkuMzY4LTQuNjk5LTE0LjkyNy44NDUtNi4wMzcuNTI5LTExLjM2Ni4zNTktMTQuMjI5LS4wNDctLjc5Ni0uMDgxLTEuMzcxLS4wNzktMS43NjkuMDAzLS41MDUuMDEzLTEuODQ0IDQuNDg5LTQuMTEzIDEuNTkyLS44MDcgNC43ODQtMi4yMTUgOC4yNzEtMi41NzYgNS43NzctLjU5NyA5LjU4NSAxLjk3NiAxMC43MjUgNy4yNDYgMy4wNzcgMTQuMjI4LjI0NCAyMC41MjEtMS44MjUgMjUuMTE3LS4zODUuODU2LS43NDkgMS42NjQtMS4wNCAyLjQ0N2wtLjI1Ny42OWMtMS4wOTMgMi45MzEtMi4wMzggNS40NjMtMS43NDggNy4zNTRhMS41OTUgMS41OTUgMCAwMS0xLjMzNSAxLjgxOWwtLjI0NC4wMnpNNDIuNDY0IDQyLjI2bC4wNjIgMS4xMzljLjE3NiAyLjk3NC41MDQgOC41MDgtLjM4NCAxNC44Ni0uNjQxIDQuNTg1Ljc1OSA5LjA2IDMuODQzIDEyLjI3NiAyLjQzNyAyLjU0MiA1LjY0NCAzLjk0NSA4Ljk0IDMuOTQ1aC4wNjhjLjM2OS0xLjU1NS45ODItMy4xOTcgMS42NDItNC45NjZsLjI1NS0uNjg2Yy4zMjktLjg4NC43MTQtMS43NCAxLjEyMi0yLjY0NiAxLjk5MS00LjQyNCA0LjQ3LTkuOTMxIDEuNjE1LTIzLjEzMi0uNTY1LTIuNjE1LTEuOTM2LTQuMTI4LTQuMTg5LTQuNjI3LTQuNjI4LTEuMDIyLTExLjUyNSAyLjQ1OS0xMi45NzQgMy44Mzd6bTkuNjMtLjY3N2MtLjA4LjU2NCAxLjAzMyAyLjA3IDIuNDg1IDIuMjcxIDEuNDQ5LjIwMyAyLjY4OS0uOTc1IDIuNzY4LTEuNTM5LjA3OS0uNTY0LTEuMDMzLTEuMTg2LTIuNDg1LTEuMzg4LTEuNDUxLS4yMDItMi42OTEuMDkyLTIuNzY4LjY1NnptMi44MTggMi44MjZsLS40MDctLjAyOGMtLjktLjEyNS0xLjgxLS42OTItMi40MzMtMS41MTgtLjIxOS0uMjktLjU3Ni0uODUyLS41MDUtMS4zNTQuMTAxLS43MzYuOTk5LTEuMTc3IDIuNC0xLjE3Ny4zMTMgMCAuNjM5LjAyMy45NjcuMDY5Ljc2Ni4xMDYgMS40NzcuMzI3IDIuMDAyLjYyLjkxLjUwOC45NzcgMS4wNzUuOTM2IDEuMzY4LS4xMTIuODEzLTEuNDA1IDIuMDItMi45NiAyLjAyem0tMi4yODktMi43MzJjLjA0NS4zNDguOTA3IDEuNDk2IDIuMDI5IDEuNjUxbC4yNjEuMDE4YzEuMDM2IDAgMS44MS0uODE1IDEuOTAxLTEuMDgyLS4wOTYtLjE4Mi0uNzYyLS42MzQtMi4wMjUtLjgxYTUuODIzIDUuODIzIDAgMDAtLjgyMS0uMDU5Yy0uODEyIDAtMS4yNDMuMTgzLTEuMzQ1LjI4MnptNDMuNjA1LTEuMjQ1Yy4wNzkuNTY0LTEuMDMzIDIuMDctMi40ODQgMi4yNzItMS40NS4yMDItMi42OTEtLjk3NS0yLjc3MS0xLjUzOS0uMDc2LS41NjQgMS4wMzYtMS4xODcgMi40ODYtMS4zODggMS40NS0uMjAzIDIuNjg5LjA5MiAyLjc2OS42NTV6bS0yLjgxOSAyLjU2Yy0xLjM5NiAwLTIuNjAxLTEuMDg2LTIuNy0xLjc5MS0uMTE1LS44NDYgMS4yNzgtMS40ODkgMi43MTItMS42ODguMzE2LS4wNDQuNjI5LS4wNjYuOTMtLjA2NiAxLjIzOCAwIDIuMDU4LjM2MyAyLjE0Ljk0OS4wNTMuMzc5LS4yMzguOTY0LS43MzkgMS40OTItLjMzMS4zNDctMS4wMjYuOTQ4LTEuOTczIDEuMDc5bC0uMzcuMDI1em0uOTQzLTMuMDEzYy0uMjc2IDAtLjU2NC4wMjEtLjg1Ni4wNjEtMS40NDEuMjAxLTIuMzAxLjc3OS0yLjI1OSAxLjA4OS4wNDguMzQxLjk2OCAxLjMzMiAyLjE3MyAxLjMzMmwuMjk3LS4wMjFjLjc4Ny0uMTA5IDEuMzc4LS42MjMgMS42Ni0uOTE5LjQ0My0uNDY1LjYxOS0uOTAzLjU5OC0xLjA1Mi0uMDI4LS4xOTgtLjU2LS40OS0xLjYxMy0uNDl6bTMuOTY1IDMyLjg0M2ExLjU5NCAxLjU5NCAwIDAxLTEuMzI0LTIuNDgzYzMuMzk4LTUuMDc1IDIuNzc2LTEwLjI1IDIuMTc1LTE1LjI1NS0uMjU3LTIuMTMyLS41MjEtNC4zMzctLjQ1My02LjQ1My4wNy0yLjE3Ny4zNDctMy45NzMuNjE0LTUuNzEuMzE3LTIuMDU4LjYxNy00LjAwMi40OTMtNi4zMWExLjU5NSAxLjU5NSAwIDExMy4xODYtLjE3MmMuMTQyIDIuNjM4LS4xOTcgNC44MzgtLjUyNSA2Ljk2Ny0uMjUzIDEuNjQzLS41MTUgMy4zNDItLjU3OCA1LjMyNy0uMDYxIDEuODc0LjE3OCAzLjg2NC40MzEgNS45Ny42NCA1LjMyMiAxLjM2NSAxMS4zNTQtMi42OTEgMTcuNDExYTEuNTk2IDEuNTk2IDAgMDEtMS4zMjguNzA4eiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==;" parent="1" vertex="1">
<mxGeometry x="400" y="-710" width="60" height="60" as="geometry" />
</mxCell>
<mxCell id="PG-S5D8SCmHSsYNVxMVk-11" value="<b><font>Api</font></b>" style="text;strokeColor=none;fillColor=none;html=1;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=18;fontFamily=Comic Sans MS;" parent="1" vertex="1">
<mxGeometry x="190" y="-623" width="70" height="30" as="geometry" />
</mxCell>
<mxCell id="PG-S5D8SCmHSsYNVxMVk-20" value="<b>Identity Service</b>" style="text;strokeColor=none;fillColor=none;html=1;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=20;fontFamily=Comic Sans MS;" parent="1" vertex="1">
<mxGeometry x="170" y="-749" width="170" height="30" as="geometry" />
</mxCell>
<mxCell id="PG-S5D8SCmHSsYNVxMVk-24" value="" style="rounded=1;whiteSpace=wrap;html=1;glass=0;shadow=0;fillColor=#d5e8d4;strokeColor=#82b366;opacity=30;" parent="1" vertex="1">
<mxGeometry x="520" y="-760" width="370" height="220" as="geometry" />
</mxCell>
<mxCell id="PG-S5D8SCmHSsYNVxMVk-25" value="" style="rounded=1;whiteSpace=wrap;html=1;glass=0;shadow=0;fillColor=#e1d5e7;strokeColor=#9673a6;opacity=30;" parent="1" vertex="1">
<mxGeometry x="920" y="-760" width="370" height="220" as="geometry" />
</mxCell>
<mxCell id="PG-S5D8SCmHSsYNVxMVk-26" value="" style="rounded=1;whiteSpace=wrap;html=1;glass=0;shadow=0;fillColor=#bac8d3;strokeColor=#23445d;opacity=20;" parent="1" vertex="1">
<mxGeometry x="1320" y="-760" width="370" height="220" as="geometry" />
</mxCell>
<mxCell id="PG-S5D8SCmHSsYNVxMVk-28" value="" style="shape=image;imageAspect=0;aspect=fixed;verticalLabelPosition=bottom;verticalAlign=top;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjggMTI4Ij48cGF0aCBkPSJNOTMuODA5IDkyLjExMmMuNzg1LTYuNTMzLjU1LTcuNDkyIDUuNDE2LTYuNDMzbDEuMjM1LjEwOGMzLjc0Mi4xNyA4LjYzNy0uNjAyIDExLjUxMy0xLjkzOCA2LjE5MS0yLjg3MyA5Ljg2MS03LjY2OCAzLjc1OC02LjQwOS0xMy45MjQgMi44NzMtMTQuODgxLTEuODQyLTE0Ljg4MS0xLjg0MiAxNC43MDMtMjEuODE1IDIwLjg0OS00OS41MDggMTUuNTQzLTU2LjI4Ny0xNC40Ny0xOC40ODktMzkuNTE3LTkuNzQ2LTM5LjkzNi05LjUybC0uMTM0LjAyNWMtMi43NTEtLjU3MS01LjgzLS45MTItOS4yODktLjk2OC02LjMwMS0uMTA0LTExLjA4MiAxLjY1Mi0xNC43MDkgNC40MDIgMCAwLTQ0LjY4My0xOC40MDktNDIuNjA0IDIzLjE1MS40NDIgOC44NDEgMTIuNjcyIDY2Ljg5OCAyNy4yNiA0OS4zNjIgNS4zMzItNi40MTIgMTAuNDg0LTExLjgzNCAxMC40ODQtMTEuODM0IDIuNTU4IDEuNjk5IDUuNjIyIDIuNTY3IDguODM0IDIuMjU1bC4yNDktLjIxMmMtLjA3OC43OTYtLjA0NCAxLjU3NS4wOTkgMi40OTctMy43NTcgNC4xOTktMi42NTMgNC45MzYtMTAuMTY2IDYuNDgyLTcuNjAyIDEuNTY2LTMuMTM2IDQuMzU1LS4yMjEgNS4wODQgMy41MzUuODg0IDExLjcxMiAyLjEzNiAxNy4yMzgtNS41OThsLS4yMi44ODJjMS40NzQgMS4xOCAxLjM3NSA4LjQ3NyAxLjU4MyAxMy42OS4yMDkgNS4yMTQuNTU4IDEwLjA3OSAxLjYyMSAxMi45NDggMS4wNjMgMi44NjggMi4zMTcgMTAuMjU2IDEyLjE5MSA4LjE0IDguMjUyLTEuNzY0IDE0LjU2MS00LjMwOSAxNS4xMzYtMjcuOTg1Ii8+PHBhdGggZD0iTTc1LjQ1OCAxMjUuMjU2Yy00LjM2NyAwLTcuMjExLTEuNjg5LTguOTM4LTMuMzItMi42MDctMi40Ni0zLjY0MS01LjYyOS00LjI1OS03LjUyMmwtLjI2Ny0uNzljLTEuMjQ0LTMuMzU4LTEuNjY2LTguMTkzLTEuOTE2LTE0LjQxOS0uMDM4LS45MzUtLjA2NC0xLjg5OC0uMDkzLTIuOTE5LS4wMjEtLjc0Ny0uMDQ3LTEuNjg0LS4wODUtMi42NjRhMTguOCAxOC44IDAgMDEtNC45NjIgMS41NjhjLTMuMDc5LjUyNi02LjM4OS4zNTYtOS44NC0uNTA3LTIuNDM1LS42MDktNC45NjUtMS44NzEtNi40MDctMy44Mi00LjIwMyAzLjY4MS04LjIxMiAzLjE4Mi0xMC4zOTYgMi40NTMtMy44NTMtMS4yODUtNy4zMDEtNC44OTYtMTAuNTQyLTExLjAzNy0yLjMwOS00LjM3NS00LjU0Mi0xMC4wNzUtNi42MzgtMTYuOTQzLTMuNjUtMTEuOTYtNS45NjktMjQuNTU3LTYuMTc1LTI4LjY5M0M0LjI5MiAyMy42OTggNy43NzcgMTQuNDQgMTUuMjk2IDkuMTI5IDI3LjE1Ny43NTEgNDUuMTI4IDUuNjc4IDUxLjY4IDcuOTE1YzQuNDAyLTIuNjUzIDkuNTgxLTMuOTQ0IDE1LjQzMy0zLjg1MSAzLjE0My4wNTEgNi4xMzYuMzI3IDguOTE2LjgyMyAyLjktLjkxMiA4LjYyOC0yLjIyMSAxNS4xODUtMi4xMzkgMTIuMDgxLjE0NCAyMi4wOTIgNC44NTIgMjguOTQ5IDEzLjYxNSA0Ljg5NCA2LjI1MiAyLjQ3NCAxOS4zODEuNTk3IDI2LjY1MS0yLjY0MiAxMC4yMjYtNy4yNzEgMjEuMTAyLTEyLjk1NyAzMC41NyAxLjU0NC4wMTEgMy43ODEtLjE3NCA2Ljk2MS0uODMxIDYuMjc0LTEuMjk1IDguMTA5IDIuMDY5IDguNjA3IDMuNTc1IDEuOTk1IDYuMDQyLTYuNjc3IDEwLjYwOC05LjM4MiAxMS44NjQtMy40NjYgMS42MDktOS4xMTcgMi41ODktMTMuNzQ1IDIuMzc3bC0uMjAyLS4wMTMtMS4yMTYtLjEwNy0uMTIgMS4wMTQtLjExNi45OTFjLS4zMTEgMTEuOTk5LTIuMDI1IDE5LjU5OC01LjU1MiAyNC42MTktMy42OTcgNS4yNjQtOC44MzUgNi43MzktMTMuMzYxIDcuNzA5LTEuNTQ0LjMzLTIuOTQ3LjQ3NC00LjIxOS40NzR6bS05LjE5LTQzLjY3MWMyLjgxOSAyLjI1NiAzLjA2NiA2LjUwMSAzLjI4NyAxNC40MzQuMDI4Ljk5LjA1NCAxLjkyNy4wODkgMi44MDIuMTA2IDIuNjUuMzU1IDguODU1IDEuMzI3IDExLjQ3Ny4xMzcuMzcxLjI2Ljc0Ny4zOSAxLjE0NiAxLjA4MyAzLjMxNiAxLjYyNiA0Ljk3OSA2LjMwOSAzLjk3OCAzLjkzMS0uODQzIDUuOTUyLTEuNTk5IDcuNTM0LTMuODUxIDIuMjk5LTMuMjc0IDMuNTg1LTkuODYgMy44MjEtMTkuNTc1bDQuNzgzLjExNi00Ljc1LS41Ny4xNC0xLjE4NmMuNDU1LTMuOTEuNzgzLTYuNzM0IDMuMzk2LTguNjAyIDIuMDk3LTEuNDk4IDQuNDg2LTEuMzUzIDYuMzg5LTEuMDEtMi4wOTEtMS41OC0yLjY2OS0zLjQzMy0yLjgyMy00LjE5M2wtLjM5OS0xLjk2NSAxLjEyMS0xLjY2M2M2LjQ1Ny05LjU4IDExLjc4MS0yMS4zNTQgMTQuNjA5LTMyLjMwNCAyLjkwNi0xMS4yNTEgMi4wMi0xNy4yMjYgMS4xMzQtMTguMzU2LTExLjcyOS0xNC45ODctMzIuMDY4LTguNzk5LTM0LjE5Mi04LjA5N2wtLjM1OS4xOTQtMS44LjMzNS0uOTIyLS4xOTFjLTIuNTQyLS41MjgtNS4zNjYtLjgyLTguMzkzLS44NjktNC43NTYtLjA4LTguNTkzIDEuMDQ0LTExLjczOSAzLjQzMWwtMi4xODMgMS42NTUtMi41MzMtMS4wNDNjLTUuNDEyLTIuMjEzLTIxLjMwOC02LjY2Mi0yOS42OTYtLjcyMS00LjY1NiAzLjI5OC02Ljc3NyA5Ljc2LTYuMzA1IDE5LjIwNy4xNTYgMy4xMTkgMi4yNzUgMTQuOTI2IDUuNzcxIDI2LjM3NyA0LjgzMSAxNS44MjUgOS4yMjEgMjEuMDgyIDExLjA1NCAyMS42OTMuMzIuMTA4IDEuMTUtLjUzNyAxLjk3Ni0xLjUyOWEyNzAuNzA4IDI3MC43MDggMCAwMTEwLjY5NC0xMi4wN2wyLjc3LTIuOTE1IDMuMzQ5IDIuMjI1YzEuMzUuODk3IDIuODM5IDEuNDA2IDQuMzY4IDEuNTAybDcuOTg3LTYuODEyLTEuMTU3IDExLjgwOGMtLjAyNi4yNjUtLjAzOS42MjYuMDY1IDEuMjk2bC4zNDggMi4yMzgtMS41MSAxLjY4OC0uMTc0LjE5NiA0LjM4OCAyLjAyNSAxLjgzNi0yLjMwMXoiLz48cGF0aCBkPSJNMTE1LjczMSA3Ny40NGMtMTMuOTI1IDIuODczLTE0Ljg4Mi0xLjg0Mi0xNC44ODItMS44NDIgMTQuNzAzLTIxLjgxNiAyMC44NDktNDkuNTEgMTUuNTQ1LTU2LjI4N0MxMDEuOTI0LjgyMyA3Ni44NzUgOS41NjYgNzYuNDU3IDkuNzkzbC0uMTM1LjAyNGMtMi43NTEtLjU3MS01LjgzLS45MTEtOS4yOTEtLjk2Ny02LjMwMS0uMTAzLTExLjA4IDEuNjUyLTE0LjcwNyA0LjQwMiAwIDAtNDQuNjg0LTE4LjQwOC00Mi42MDYgMjMuMTUxLjQ0MiA4Ljg0MiAxMi42NzIgNjYuODk5IDI3LjI2IDQ5LjM2MyA1LjMzMi02LjQxMiAxMC40ODMtMTEuODM0IDEwLjQ4My0xMS44MzQgMi41NTkgMS42OTkgNS42MjIgMi41NjcgOC44MzMgMi4yNTVsLjI1LS4yMTJjLS4wNzguNzk2LS4wNDIgMS41NzUuMSAyLjQ5Ny0zLjc1OCA0LjE5OS0yLjY1NCA0LjkzNi0xMC4xNjcgNi40ODItNy42MDIgMS41NjYtMy4xMzYgNC4zNTUtLjIyIDUuMDg0IDMuNTM0Ljg4NCAxMS43MTIgMi4xMzYgMTcuMjM3LTUuNTk4bC0uMjIxLjg4MmMxLjQ3MyAxLjE4IDIuNTA3IDcuNjcyIDIuMzM0IDEzLjU1Ny0uMTc0IDUuODg1LS4yOSA5LjkyNi44NzEgMTMuMDgyIDEuMTYgMy4xNTYgMi4zMTYgMTAuMjU2IDEyLjE5MiA4LjE0IDguMjUyLTEuNzY4IDEyLjUyOC02LjM1MSAxMy4xMjQtMTMuOTk1LjQyMi01LjQzNSAxLjM3Ny00LjYzMSAxLjQzOC05LjQ5bC43NjctMi4zYy44ODQtNy4zNjcuMTQtOS43NDMgNS4yMjUtOC42MzhsMS4yMzUuMTA4YzMuNzQyLjE3IDguNjM5LS42MDIgMTEuNTE0LTEuOTM4IDYuMTktMi44NzEgOS44NjEtNy42NjcgMy43NTgtNi40MDh6IiBmaWxsPSIjMzM2NzkxIi8+PHBhdGggZD0iTTc1Ljk1NyAxMjIuMzA3Yy04LjIzMiAwLTEwLjg0LTYuNTE5LTExLjkwNy05LjE4NS0xLjU2Mi0zLjkwNy0xLjg5OS0xOS4wNjktMS41NTEtMzEuNTAzYTEuNTkgMS41OSAwIDAxMS42NC0xLjU1IDEuNTk0IDEuNTk0IDAgMDExLjU1IDEuNjM5Yy0uNDAxIDE0LjM0MS4xNjggMjcuMzM3IDEuMzI0IDMwLjIyOSAxLjgwNCA0LjUwOSA0LjU0IDguNDUzIDEyLjI3NSA2Ljc5NiA3LjM0My0xLjU3NSAxMC4wOTMtNC4zNTkgMTEuMzE4LTExLjQ2Ljk0LTUuNDQ5IDIuNzk5LTIwLjk1MSAzLjAyOC0yNC4wMWExLjU5MyAxLjU5MyAwIDAxMS43MS0xLjQ3MiAxLjU5NyAxLjU5NyAwIDAxMS40NzIgMS43MWMtLjIzOSAzLjE4NS0yLjA4OSAxOC42NTctMy4wNjUgMjQuMzE1LTEuNDQ2IDguMzg3LTUuMTg1IDEyLjE5MS0xMy43OTQgMTQuMDM3LTEuNDYzLjMxMy0yLjc5Mi40NTMtNCAuNDU0ek0zMS4zMjEgOTAuNDY2YTYuNzEgNi43MSAwIDAxLTIuMTE2LS4zNWMtNS4zNDctMS43ODQtMTAuNDQtMTAuNDkyLTE1LjEzOC0yNS44ODUtMy41NzYtMTEuNzE3LTUuODQyLTIzLjk0Ny02LjA0MS0yNy45MjItLjU4OS0xMS43ODQgMi40NDUtMjAuMTIxIDkuMDItMjQuNzc4IDEzLjAwNy05LjIxNiAzNC44ODgtLjQ0IDM1LjgxMy0uMDYyYTEuNTk2IDEuNTk2IDAgMDEtMS4yMDcgMi45NTVjLS4yMTEtLjA4Ni0yMS4xOTMtOC40OTItMzIuNzY4LS4yODUtNS42MjIgMy45ODYtOC4yMDMgMTEuMzkyLTcuNjcyIDIyLjAxMS4xNjcgMy4zNDkgMi4yODQgMTUuMjg1IDUuOTA2IDI3LjE0OSA0LjE5NCAxMy43NDIgOC45NjcgMjIuNDEzIDEzLjA5NiAyMy43OS42NDguMjE2IDIuNjIuODczIDUuNDM5LTIuNTE3QTI0NS4yNzIgMjQ1LjI3MiAwIDAxNDUuODggNzMuMDQ2YTEuNTk2IDEuNTk2IDAgMDEyLjMwNCAyLjIwOGMtLjA0OC4wNS00Ljg0NyA1LjA2Ny0xMC4wNzcgMTEuMzU5LTIuNDc3IDIuOTc5LTQuODUxIDMuODUzLTYuNzg2IDMuODUzem02OS40MjktMTMuNDQ1YTEuNTk2IDEuNTk2IDAgMDEtMS4zMjItMi40ODdjMTQuODYzLTIyLjA1NSAyMC4wOC00OC43MDQgMTUuNjEyLTU0LjQxNC01LjYyNC03LjE4Ni0xMy41NjUtMTAuOTM5LTIzLjYwNC0xMS4xNTYtNy40MzMtLjE2LTEzLjM0MSAxLjczOC0xNC4zMDcgMi4wNjlsLS4yNDMuMDk5Yy0uOTcxLjMwNS0xLjcxNi0uMjI3LTEuOTk3LS44NDlhMS42IDEuNiAwIDAxLjYzMS0yLjAyNWMuMDQ2LS4wMjcuMTkyLS4wODkuNDI5LS4xNzZsLS4wMjEuMDA2LjAyMS0uMDA3YzEuNjQxLS42MDEgNy42MzktMi40IDE1LjA2OC0yLjMxNSAxMS4xMDguMTE4IDIwLjI4NCA0LjQwMSAyNi41MzQgMTIuMzg4IDIuOTU3IDMuNzc5IDIuOTY0IDEyLjQ4NS4wMTkgMjMuODg3LTMuMDAyIDExLjYyNS04LjY1MSAyNC4xMTgtMTUuNDk3IDM0LjI3Ny0uMzA2LjQ1Ny0uODEuNzAzLTEuMzIzLjcwM3ptLjc2IDEwLjIxYy0yLjUzOCAwLTQuODEzLS4zNTgtNi4xNzUtMS4xNzQtMS40LS44MzktMS42NjctMS45NzktMS43MDItMi41ODQtLjM4Mi02LjcxIDMuMzItNy44NzggNS4yMDgtOC40MTEtLjI2My0uMzk4LS42MzctLjg2Ni0xLjAyNC0xLjM0OS0xLjEwMS0xLjM3Ni0yLjYwOS0zLjI2LTMuNzcxLTYuMDc4LS4xODItLjQ0LS43NTItMS40NjMtMS40MTItMi42NDgtMy41NzktNi40MTgtMTEuMDI2LTE5Ljc3My02LjI0Mi0yNi42MTIgMi4yMTQtMy4xNjUgNi42MjMtNC40MTEgMTMuMTE5LTMuNzE2Qzk3LjYgMjguODM3IDg4LjUgMTAuNjI1IDY2LjkwNyAxMC4yNzFjLTYuNDk0LS4xMDgtMTEuODIgMS44ODktMTUuODIyIDUuOTMtOC45NiA5LjA0OS04LjYzNiAyNS40MjItOC42MzEgMjUuNTg2YTEuNTk1IDEuNTk1IDAgMTEtMy4xOS4wODRjLS4wMi0uNzI3LS4zNTQtMTcuOTA5IDkuNTU0LTI3LjkxNkM1My40NTUgOS4yNzIgNTkuNTU5IDYuOTYgNjYuOTYgNy4wODFjMTMuODE0LjIyNyAyMi43MDYgNy4yNSAyNy43MzIgMTMuMTAxIDUuNDc5IDYuMzc3IDguMTY1IDEzLjQxMSA4LjM4NiAxNS43NTkuMTY1IDEuNzQ2LTEuMDg4IDIuMDk1LTEuMzQxIDIuMTQ3bC0uNTc2LjAxM2MtNi4zNzUtMS4wMjEtMTAuNDY1LS4zMTItMTIuMTU2IDIuMTA0LTMuNjM5IDUuMjAxIDMuNDA2IDE3LjgzNCA2LjQxNCAyMy4yMjkuNzY4IDEuMzc2IDEuMzIyIDIuMzcxIDEuNTc2IDIuOTg1Ljk4OCAyLjM5NiAyLjI3NyA0LjAwNiAzLjMxMiA1LjMuOTExIDEuMTM4IDEuNyAyLjEyNSAxLjk4MiAzLjI4My4xMzEuMjMgMS45OSAyLjk4IDEzLjAyMS43MDMgMi43NjUtLjU3IDQuNDIzLS4wODMgNC45MyAxLjQ1Ljk5NyAzLjAxNS00LjU5NyA2LjUzMi03LjY5NCA3Ljk3LTIuNzc1IDEuMjktNy4yMDQgMi4xMDYtMTEuMDM2IDIuMTA2em0tNC42OTYtNC4wMjFjLjM1LjM1MyAyLjEwMS45NjIgNS43MjcuODA2IDMuMjI0LS4xMzggNi42MjQtLjgzOSA4LjY2NC0xLjc4NiAyLjYwOS0xLjIxMiA0LjM1MS0yLjU2NyA1LjI1My0zLjQ5MmwtLjUuMDkyYy03LjA1MyAxLjQ1Ni0xMi4wNDIgMS4yNjItMTQuODI4LS41NzdhNi4xNjIgNi4xNjIgMCAwMS0uNTQtLjQwMWMtLjMwMi4xMTktLjU4MS4xOTctLjc4LjI1My0xLjU4LjQ0My0zLjIxNC45MDItMi45OTYgNS4xMDV6bS00NS41NjIgOC45MTVjLTEuNzUyIDAtMy41OTYtLjIzOS01LjQ3OS0uNzEtMS45NTEtLjQ4OC01LjI0LTEuOTU3LTUuMTktNC4zNy4wNTctMi43MDcgMy45OTQtMy41MTkgNS40NzYtMy44MjQgNS4zNTQtMS4xMDMgNS43MDMtMS41NDUgNy4zNzYtMy42Ny40ODgtLjYxOSAxLjA5NS0xLjM5IDEuOTIzLTIuMzE0IDEuMjI5LTEuMzc2IDIuNTcyLTIuMDczIDMuOTkyLTIuMDczLjk4OSAwIDEuOC4zMzUgMi4zMzYuNTU4IDEuNzA4LjcwOCAzLjEzMyAyLjQyIDMuNzE5IDQuNDY3LjUyOSAxLjg0Ny4yNzYgMy42MjUtLjcxIDUuMDA2LTMuMjM3IDQuNTMzLTcuODg2IDYuOTMtMTMuNDQzIDYuOTN6bS03LjIyMi00Ljk0M2MuNDgxLjM3MiAxLjQ0NS44NjkgMi41MTggMS4xMzcgMS42MzEuNDA4IDMuMjEzLjYxNSA0LjcwNS42MTUgNC41NDYgMCA4LjE5Ni0xLjg4MiAxMC44NDctNS41OTQuNTUzLS43NzQuMzg3LTEuNzU3LjIzOS0yLjI3NC0uMzEtMS4wODMtMS4wOC0yLjA2OC0xLjg3My0yLjM5Ny0uNDMtLjE3OC0uNzg3LS4zMTQtMS4xMTUtLjMxNC0uMTc2IDAtLjcxMiAwLTEuNjE0IDEuMDA5YTQxLjE0NiA0MS4xNDYgMCAwMC0xLjc5NCAyLjE2MmMtMi4wODQgMi42NDYtMy4wMzkgMy41NDQtOS4yMzkgNC44MjEtMS41MTMuMzEtMi4yODkuNjI2LTIuNjc0LjgzNXptMTIuMjY5LTcuMzZhMS41OTYgMS41OTYgMCAwMS0xLjU3NS0xLjM1NCA4LjIxOCA4LjIxOCAwIDAxLS4wOC0uNzk5Yy00LjA2NC0uMDc2LTcuOTg1LTEuODItMTAuOTYyLTQuOTI2LTMuNzY0LTMuOTI3LTUuNDc3LTkuMzY4LTQuNjk5LTE0LjkyNy44NDUtNi4wMzcuNTI5LTExLjM2Ni4zNTktMTQuMjI5LS4wNDctLjc5Ni0uMDgxLTEuMzcxLS4wNzktMS43NjkuMDAzLS41MDUuMDEzLTEuODQ0IDQuNDg5LTQuMTEzIDEuNTkyLS44MDcgNC43ODQtMi4yMTUgOC4yNzEtMi41NzYgNS43NzctLjU5NyA5LjU4NSAxLjk3NiAxMC43MjUgNy4yNDYgMy4wNzcgMTQuMjI4LjI0NCAyMC41MjEtMS44MjUgMjUuMTE3LS4zODUuODU2LS43NDkgMS42NjQtMS4wNCAyLjQ0N2wtLjI1Ny42OWMtMS4wOTMgMi45MzEtMi4wMzggNS40NjMtMS43NDggNy4zNTRhMS41OTUgMS41OTUgMCAwMS0xLjMzNSAxLjgxOWwtLjI0NC4wMnpNNDIuNDY0IDQyLjI2bC4wNjIgMS4xMzljLjE3NiAyLjk3NC41MDQgOC41MDgtLjM4NCAxNC44Ni0uNjQxIDQuNTg1Ljc1OSA5LjA2IDMuODQzIDEyLjI3NiAyLjQzNyAyLjU0MiA1LjY0NCAzLjk0NSA4Ljk0IDMuOTQ1aC4wNjhjLjM2OS0xLjU1NS45ODItMy4xOTcgMS42NDItNC45NjZsLjI1NS0uNjg2Yy4zMjktLjg4NC43MTQtMS43NCAxLjEyMi0yLjY0NiAxLjk5MS00LjQyNCA0LjQ3LTkuOTMxIDEuNjE1LTIzLjEzMi0uNTY1LTIuNjE1LTEuOTM2LTQuMTI4LTQuMTg5LTQuNjI3LTQuNjI4LTEuMDIyLTExLjUyNSAyLjQ1OS0xMi45NzQgMy44Mzd6bTkuNjMtLjY3N2MtLjA4LjU2NCAxLjAzMyAyLjA3IDIuNDg1IDIuMjcxIDEuNDQ5LjIwMyAyLjY4OS0uOTc1IDIuNzY4LTEuNTM5LjA3OS0uNTY0LTEuMDMzLTEuMTg2LTIuNDg1LTEuMzg4LTEuNDUxLS4yMDItMi42OTEuMDkyLTIuNzY4LjY1NnptMi44MTggMi44MjZsLS40MDctLjAyOGMtLjktLjEyNS0xLjgxLS42OTItMi40MzMtMS41MTgtLjIxOS0uMjktLjU3Ni0uODUyLS41MDUtMS4zNTQuMTAxLS43MzYuOTk5LTEuMTc3IDIuNC0xLjE3Ny4zMTMgMCAuNjM5LjAyMy45NjcuMDY5Ljc2Ni4xMDYgMS40NzcuMzI3IDIuMDAyLjYyLjkxLjUwOC45NzcgMS4wNzUuOTM2IDEuMzY4LS4xMTIuODEzLTEuNDA1IDIuMDItMi45NiAyLjAyem0tMi4yODktMi43MzJjLjA0NS4zNDguOTA3IDEuNDk2IDIuMDI5IDEuNjUxbC4yNjEuMDE4YzEuMDM2IDAgMS44MS0uODE1IDEuOTAxLTEuMDgyLS4wOTYtLjE4Mi0uNzYyLS42MzQtMi4wMjUtLjgxYTUuODIzIDUuODIzIDAgMDAtLjgyMS0uMDU5Yy0uODEyIDAtMS4yNDMuMTgzLTEuMzQ1LjI4MnptNDMuNjA1LTEuMjQ1Yy4wNzkuNTY0LTEuMDMzIDIuMDctMi40ODQgMi4yNzItMS40NS4yMDItMi42OTEtLjk3NS0yLjc3MS0xLjUzOS0uMDc2LS41NjQgMS4wMzYtMS4xODcgMi40ODYtMS4zODggMS40NS0uMjAzIDIuNjg5LjA5MiAyLjc2OS42NTV6bS0yLjgxOSAyLjU2Yy0xLjM5NiAwLTIuNjAxLTEuMDg2LTIuNy0xLjc5MS0uMTE1LS44NDYgMS4yNzgtMS40ODkgMi43MTItMS42ODguMzE2LS4wNDQuNjI5LS4wNjYuOTMtLjA2NiAxLjIzOCAwIDIuMDU4LjM2MyAyLjE0Ljk0OS4wNTMuMzc5LS4yMzguOTY0LS43MzkgMS40OTItLjMzMS4zNDctMS4wMjYuOTQ4LTEuOTczIDEuMDc5bC0uMzcuMDI1em0uOTQzLTMuMDEzYy0uMjc2IDAtLjU2NC4wMjEtLjg1Ni4wNjEtMS40NDEuMjAxLTIuMzAxLjc3OS0yLjI1OSAxLjA4OS4wNDguMzQxLjk2OCAxLjMzMiAyLjE3MyAxLjMzMmwuMjk3LS4wMjFjLjc4Ny0uMTA5IDEuMzc4LS42MjMgMS42Ni0uOTE5LjQ0My0uNDY1LjYxOS0uOTAzLjU5OC0xLjA1Mi0uMDI4LS4xOTgtLjU2LS40OS0xLjYxMy0uNDl6bTMuOTY1IDMyLjg0M2ExLjU5NCAxLjU5NCAwIDAxLTEuMzI0LTIuNDgzYzMuMzk4LTUuMDc1IDIuNzc2LTEwLjI1IDIuMTc1LTE1LjI1NS0uMjU3LTIuMTMyLS41MjEtNC4zMzctLjQ1My02LjQ1My4wNy0yLjE3Ny4zNDctMy45NzMuNjE0LTUuNzEuMzE3LTIuMDU4LjYxNy00LjAwMi40OTMtNi4zMWExLjU5NSAxLjU5NSAwIDExMy4xODYtLjE3MmMuMTQyIDIuNjM4LS4xOTcgNC44MzgtLjUyNSA2Ljk2Ny0uMjUzIDEuNjQzLS41MTUgMy4zNDItLjU3OCA1LjMyNy0uMDYxIDEuODc0LjE3OCAzLjg2NC40MzEgNS45Ny42NCA1LjMyMiAxLjM2NSAxMS4zNTQtMi42OTEgMTcuNDExYTEuNTk2IDEuNTk2IDAgMDEtMS4zMjguNzA4eiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==;" parent="1" vertex="1">
<mxGeometry x="785" y="-710" width="60" height="60" as="geometry" />
</mxCell>
<mxCell id="PG-S5D8SCmHSsYNVxMVk-29" value="" style="shape=image;imageAspect=0;aspect=fixed;verticalLabelPosition=bottom;verticalAlign=top;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjggMTI4Ij48cGF0aCBkPSJNODguMDM4IDQyLjgxMmMxLjYwNSA0LjY0MyAyLjc2MSA5LjM4MyAzLjE0MSAxNC4yOTYuNDcyIDYuMDk1LjI1NiAxMi4xNDctMS4wMjkgMTguMTQyLS4wMzUuMTY1LS4xMDkuMzItLjE2NC40OC0uNDAzLjAwMS0uODE0LS4wNDktMS4yMDguMDEyLTMuMzI5LjUyMy02LjY1NSAxLjA2NS05Ljk4MSAxLjYwNC0zLjQzOC41NTctNi44ODEgMS4wOTItMTAuMzEzIDEuNjg3LTEuMjE2LjIxLTIuNzIxLS4wNDEtMy4yMTIgMS42NDEtLjAxNC4wNDYtLjE1NC4wNTQtLjIzNS4wOGwuMTY2LTEwLjA1MS0uMTY5LTI0LjI1MiAxLjYwMi0uMjc1YzIuNjItLjQyOSA1LjI0LS44NjQgNy44NjItMS4yODEgMy4xMjktLjQ5NyA2LjI2MS0uOTggOS4zOTItMS40NjUgMS4zODEtLjIxNSAyLjc2NC0uNDEyIDQuMTQ4LS42MTh6IiBmaWxsPSIjNDM5OTM0IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik02MS43MjkgMTEwLjA1NGMtMS42OS0xLjQ1My0zLjQzOS0yLjg0Mi01LjA1OS00LjM3LTguNzE3LTguMjIyLTE1LjA5My0xNy44OTktMTguMjMzLTI5LjU2Ni0uODY1LTMuMjExLTEuNDQyLTYuNDc0LTEuNjI3LTkuNzkyLS4xMy0yLjMyMi0uMzE4LTQuNjY1LS4xNTQtNi45NzUuNDM3LTYuMTQ0IDEuMzI1LTEyLjIyOSAzLjEyNy0xOC4xNDdsLjA5OS0uMTM4Yy4xNzUuMjMzLjQyNy40MzkuNTE2LjcwMiAxLjc1OSA1LjE4IDMuNTA1IDEwLjM2NCA1LjI0MiAxNS41NTEgNS40NTggMTYuMyAxMC45MDkgMzIuNjA0IDE2LjM3NiA0OC45LjEwNy4zMTguMzg0LjU3OS41ODMuODY2bC0uODcgMi45Njl6IiBmaWxsPSIjNDVBNTM4IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik04OC4wMzggNDIuODEyYy0xLjM4NC4yMDYtMi43NjguNDAzLTQuMTQ5LjYxNi0zLjEzMS40ODUtNi4yNjMuOTY4LTkuMzkyIDEuNDY1LTIuNjIyLjQxNy01LjI0Mi44NTItNy44NjIgMS4yODFsLTEuNjAyLjI3NS0uMDEyLTEuMDQ1Yy0uMDUzLS44NTktLjE0NC0xLjcxNy0uMTU0LTIuNTc2LS4wNjktNS40NzgtLjExMi0xMC45NTYtLjE4LTE2LjQzNC0uMDQyLTMuNDI5LS4xMDUtNi44NTctLjE3NS0xMC4yODUtLjA0My0yLjEzLS4wODktNC4yNjEtLjE4NS02LjM4OC0uMDUyLTEuMTQzLS4yMzYtMi4yOC0uMzExLTMuNDIzLS4wNDItLjY1Ny4wMTYtMS4zMTkuMDI5LTEuOTc5LjgxNyAxLjU4MyAxLjYxNiAzLjE3OCAyLjQ1NiA0Ljc0OSAxLjMyNyAyLjQ4NCAzLjQ0MSA0LjMxNCA1LjM0NCA2LjMxMSA3LjUyMyA3Ljg5MiAxMi44NjQgMTcuMDY4IDE2LjE5MyAyNy40MzN6IiBmaWxsPSIjNDZBMDM3IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik02NS4wMzYgODAuNzUzYy4wODEtLjAyNi4yMjItLjAzNC4yMzUtLjA4LjQ5MS0xLjY4MiAxLjk5Ni0xLjQzMSAzLjIxMi0xLjY0MSAzLjQzMi0uNTk0IDYuODc1LTEuMTMgMTAuMzEzLTEuNjg3IDMuMzI2LS41MzkgNi42NTItMS4wODEgOS45ODEtMS42MDQuMzk0LS4wNjIuODA1LS4wMTEgMS4yMDgtLjAxMi0uNjIyIDIuMjItMS4xMTIgNC40ODgtMS45MDEgNi42NDctLjg5NiAyLjQ0OS0xLjk4IDQuODM5LTMuMTMxIDcuMTgyYTQ5LjE0MiA0OS4xNDIgMCAwMS02LjM1MyA5Ljc2M2MtMS45MTkgMi4zMDgtNC4wNTggNC40NDEtNi4yMDIgNi41NDgtMS4xODUgMS4xNjUtMi41ODIgMi4xMTQtMy44ODIgMy4xNjFsLS4zMzctLjIzLTEuMjE0LTEuMDM4LTEuMjU2LTIuNzUzYTQxLjQwMiA0MS40MDIgMCAwMS0xLjM5NC05LjgzOGwuMDIzLS41NjEuMTcxLTIuNDI2Yy4wNTctLjgyOC4xMzMtMS42NTUuMTY4LTIuNDg1LjEyOS0yLjk4Mi4yNDEtNS45NjQuMzU5LTguOTQ2eiIgZmlsbD0iIzQwOTQzMyIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBkPSJNNjUuMDM2IDgwLjc1M2MtLjExOCAyLjk4Mi0uMjMgNS45NjQtLjM1NyA4Ljk0Ny0uMDM1LjgzLS4xMTEgMS42NTctLjE2OCAyLjQ4NWwtLjc2NS4yODljLTEuNjk5LTUuMDAyLTMuMzk5LTkuOTUxLTUuMDYyLTE0LjkxMy0yLjc1LTguMjA5LTUuNDY3LTE2LjQzMS04LjIxMy0yNC42NDJhNDQ5OC44ODcgNDQ5OC44ODcgMCAwMC02LjctMTkuODY3Yy0uMTA1LS4zMS0uNDA3LS41NTItLjYxNy0uODI2bDQuODk2LTkuMDAyYy4xNjguMjkyLjM5LjU2NS40OTYuODc5YTYxNjcuNDc2IDYxNjcuNDc2IDAgMDE2Ljc2OCAyMC4xMThjMi45MTYgOC43MyA1LjgxNCAxNy40NjcgOC43MjggMjYuMTk4LjExNi4zNDkuMzA4LjY3MS40OTEgMS4wNjJsLjY3LS43OC0uMTY3IDEwLjA1MnoiIGZpbGw9IiM0RkFBNDEiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbC1ydWxlPSJldmVub2RkIi8+PHBhdGggZD0iTTQzLjE1NSAzMi4yMjdjLjIxLjI3NC41MTEuNTE2LjYxNy44MjZhNDQ5OC44ODcgNDQ5OC44ODcgMCAwMTYuNyAxOS44NjdjMi43NDYgOC4yMTEgNS40NjMgMTYuNDMzIDguMjEzIDI0LjY0MiAxLjY2MiA0Ljk2MSAzLjM2MiA5LjkxMSA1LjA2MiAxNC45MTNsLjc2NS0uMjg5LS4xNzEgMi40MjYtLjE1NS41NTljLS4yNjYgMi42NTYtLjQ5IDUuMzE4LS44MTQgNy45NjgtLjE2MyAxLjMyOC0uNTA5IDIuNjMyLS43NzIgMy45NDctLjE5OC0uMjg3LS40NzYtLjU0OC0uNTgzLS44NjYtNS40NjctMTYuMjk3LTEwLjkxOC0zMi42LTE2LjM3Ni00OC45YTM4ODguOTcyIDM4ODguOTcyIDAgMDAtNS4yNDItMTUuNTUxYy0uMDg5LS4yNjMtLjM0LS40NjktLjUxNi0uNzAybDMuMjcyLTguODR6IiBmaWxsPSIjNEFBNzNDIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik02NS4yMDIgNzAuNzAybC0uNjcuNzhjLS4xODMtLjM5MS0uMzc1LS43MTQtLjQ5MS0xLjA2Mi0yLjkxMy04LjczMS01LjgxMi0xNy40NjgtOC43MjgtMjYuMTk4YTYxNjcuNDc2IDYxNjcuNDc2IDAgMDAtNi43NjgtMjAuMTE4Yy0uMTA1LS4zMTQtLjMyNy0uNTg4LS40OTYtLjg3OWw2LjA1NS03Ljk2NWMuMTkxLjI1NS40NjMuNDgyLjU2Mi43NjkgMS42ODEgNC45MjEgMy4zNDcgOS44NDggNS4wMDMgMTQuNzc4IDEuNTQ3IDQuNjA0IDMuMDcxIDkuMjE1IDQuNjM2IDEzLjgxMy4xMDUuMzA4LjQ3LjUyNi43MTQuNzg2bC4wMTIgMS4wNDVjLjA1OCA4LjA4Mi4xMTUgMTYuMTY3LjE3MSAyNC4yNTF6IiBmaWxsPSIjNTdBRTQ3IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik02NS4wMjEgNDUuNDA0Yy0uMjQ0LS4yNi0uNjA5LS40NzgtLjcxNC0uNzg2LTEuNTY1LTQuNTk4LTMuMDg5LTkuMjA5LTQuNjM2LTEzLjgxMy0xLjY1Ni00LjkzLTMuMzIyLTkuODU2LTUuMDAzLTE0Ljc3OC0uMDk5LS4yODctLjM3MS0uNTE0LS41NjItLjc2OSAxLjk2OS0xLjkyOCAzLjg3Ny0zLjkyNSA1LjkyNS01Ljc2NCAxLjgyMS0xLjYzNCAzLjI4NS0zLjM4NiAzLjM1Mi01Ljk2OC4wMDMtLjEwNy4wNTktLjIxNC4xNDUtLjUxNGwuNTE5IDEuMzA2Yy0uMDEzLjY2MS0uMDcyIDEuMzIyLS4wMjkgMS45NzkuMDc1IDEuMTQzLjI1OSAyLjI4LjMxMSAzLjQyMy4wOTYgMi4xMjcuMTQyIDQuMjU4LjE4NSA2LjM4OC4wNjkgMy40MjguMTMyIDYuODU2LjE3NSAxMC4yODUuMDY3IDUuNDc4LjExMSAxMC45NTYuMTggMTYuNDM0LjAwOC44NjEuMDk4IDEuNzE4LjE1MiAyLjU3N3oiIGZpbGw9IiM2MEIyNEYiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbC1ydWxlPSJldmVub2RkIi8+PHBhdGggZD0iTTYyLjU5OCAxMDcuMDg1Yy4yNjMtMS4zMTUuNjA5LTIuNjIuNzcyLTMuOTQ3LjMyNS0yLjY0OS41NDgtNS4zMTIuODE0LTcuOTY4bC4wNjYtLjAxLjA2Ni4wMTFhNDEuNDAyIDQxLjQwMiAwIDAwMS4zOTQgOS44MzhjLS4xNzYuMjMyLS40MjUuNDM5LS41MTguNzAxLS43MjcgMi4wNS0xLjQxMiA0LjExNi0yLjE0MyA2LjE2Ni0uMS4yOC0uMzc4LjQ5OC0uNTc0Ljc0NGwtLjc0Ny0yLjU2Ni44Ny0yLjk2OXoiIGZpbGw9IiNBOUFBODgiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbC1ydWxlPSJldmVub2RkIi8+PHBhdGggZD0iTTYyLjQ3NiAxMTIuNjIxYy4xOTYtLjI0Ni40NzUtLjQ2NC41NzQtLjc0NC43MzEtMi4wNSAxLjQxNy00LjExNSAyLjE0My02LjE2Ni4wOTMtLjI2Mi4zNDEtLjQ2OS41MTgtLjcwMWwxLjI1NSAyLjc1NGMtLjI0OC4zNTItLjU5LjY2OS0uNzI4IDEuMDYxbC0yLjQwNCA3LjA1OWMtLjA5OS4yODMtLjQzNy40ODMtLjY2My43MjJsLS42OTUtMy45ODV6IiBmaWxsPSIjQjZCNTk4IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik02My4xNzEgMTE2LjYwNWMuMjI3LS4yMzguNTY0LS40MzkuNjYzLS43MjJsMi40MDQtNy4wNTljLjEzNy0uMzkxLjQ4LS43MDkuNzI4LTEuMDYxbDEuMjE1IDEuMDM3Yy0uNTg3LjU4LS45MTMgMS4yNS0uNzE3IDIuMDk3bC0uMzY5IDEuMjA4Yy0uMTY4LjIwNy0uNDExLjM4Ny0uNDk0LjYyNC0uODM5IDIuNDAzLTEuNjQgNC44MTktMi40ODUgNy4yMjItLjEwNy4zMDUtLjQwNC41NDQtLjYxNC44MTItLjEwOS0xLjM4Ny0uMjItMi43NzEtLjMzMS00LjE1OHoiIGZpbGw9IiNDMkMxQTciIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbC1ydWxlPSJldmVub2RkIi8+PHBhdGggZD0iTTYzLjUwMyAxMjAuNzYzYy4yMDktLjI2OS41MDYtLjUwOC42MTQtLjgxMi44NDUtMi40MDIgMS42NDYtNC44MTggMi40ODUtNy4yMjIuMDgzLS4yMzYuMzI1LS40MTcuNDk0LS42MjRsLS41MDkgNS41NDVjLS4xMzYuMTU3LS4zMzMuMjk0LS4zOTguNDc3LS41NzUgMS42MTQtMS4xMTcgMy4yNC0xLjY5NCA0Ljg1NC0uMTE5LjMzMy0uMzQ3LjYyNy0uNTI1LjkzOC0uMTU4LS4yMDctLjQ0MS0uNDA3LS40NTQtLjYyMy0uMDUxLS44NDEtLjAxNi0xLjY4OC0uMDEzLTIuNTMzeiIgZmlsbD0iI0NFQ0RCNyIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBkPSJNNjMuOTY5IDEyMy45MTljLjE3OC0uMzEyLjQwNi0uNjA2LjUyNS0uOTM4LjU3OC0xLjYxMyAxLjExOS0zLjIzOSAxLjY5NC00Ljg1NC4wNjUtLjE4My4yNjMtLjMxOS4zOTgtLjQ3N2wuMDEyIDMuNjQtMS4yMTggMy4xMjQtMS40MTEtLjQ5NXoiIGZpbGw9IiNEQkRBQzciIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbC1ydWxlPSJldmVub2RkIi8+PHBhdGggZD0iTTY1LjM4IDEyNC40MTVsMS4yMTgtMy4xMjQuMjUxIDMuNjk2LTEuNDY5LS41NzJ6IiBmaWxsPSIjRUJFOURDIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik02Ny40NjQgMTEwLjg5OGMtLjE5Ni0uODQ3LjEyOS0xLjUxOC43MTctMi4wOTdsLjMzNy4yMy0xLjA1NCAxLjg2N3oiIGZpbGw9IiNDRUNEQjciIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbC1ydWxlPSJldmVub2RkIi8+PHBhdGggZD0iTTY0LjMxNiA5NS4xNzJsLS4wNjYtLjAxMS0uMDY2LjAxLjE1NS0uNTU5LS4wMjMuNTZ6IiBmaWxsPSIjNEZBQTQxIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjggMTI4Ij48cGF0aCBkPSJNOTMuODA5IDkyLjExMmMuNzg1LTYuNTMzLjU1LTcuNDkyIDUuNDE2LTYuNDMzbDEuMjM1LjEwOGMzLjc0Mi4xNyA4LjYzNy0uNjAyIDExLjUxMy0xLjkzOCA2LjE5MS0yLjg3MyA5Ljg2MS03LjY2OCAzLjc1OC02LjQwOS0xMy45MjQgMi44NzMtMTQuODgxLTEuODQyLTE0Ljg4MS0xLjg0MiAxNC43MDMtMjEuODE1IDIwLjg0OS00OS41MDggMTUuNTQzLTU2LjI4Ny0xNC40Ny0xOC40ODktMzkuNTE3LTkuNzQ2LTM5LjkzNi05LjUybC0uMTM0LjAyNWMtMi43NTEtLjU3MS01LjgzLS45MTItOS4yODktLjk2OC02LjMwMS0uMTA0LTExLjA4MiAxLjY1Mi0xNC43MDkgNC40MDIgMCAwLTQ0LjY4My0xOC40MDktNDIuNjA0IDIzLjE1MS40NDIgOC44NDEgMTIuNjcyIDY2Ljg5OCAyNy4yNiA0OS4zNjIgNS4zMzItNi40MTIgMTAuNDg0LTExLjgzNCAxMC40ODQtMTEuODM0IDIuNTU4IDEuNjk5IDUuNjIyIDIuNTY3IDguODM0IDIuMjU1bC4yNDktLjIxMmMtLjA3OC43OTYtLjA0NCAxLjU3NS4wOTkgMi40OTctMy43NTcgNC4xOTktMi42NTMgNC45MzYtMTAuMTY2IDYuNDgyLTcuNjAyIDEuNTY2LTMuMTM2IDQuMzU1LS4yMjEgNS4wODQgMy41MzUuODg0IDExLjcxMiAyLjEzNiAxNy4yMzgtNS41OThsLS4yMi44ODJjMS40NzQgMS4xOCAxLjM3NSA4LjQ3NyAxLjU4MyAxMy42OS4yMDkgNS4yMTQuNTU4IDEwLjA3OSAxLjYyMSAxMi45NDggMS4wNjMgMi44NjggMi4zMTcgMTAuMjU2IDEyLjE5MSA4LjE0IDguMjUyLTEuNzY0IDE0LjU2MS00LjMwOSAxNS4xMzYtMjcuOTg1Ii8+PHBhdGggZD0iTTc1LjQ1OCAxMjUuMjU2Yy00LjM2NyAwLTcuMjExLTEuNjg5LTguOTM4LTMuMzItMi42MDctMi40Ni0zLjY0MS01LjYyOS00LjI1OS03LjUyMmwtLjI2Ny0uNzljLTEuMjQ0LTMuMzU4LTEuNjY2LTguMTkzLTEuOTE2LTE0LjQxOS0uMDM4LS45MzUtLjA2NC0xLjg5OC0uMDkzLTIuOTE5LS4wMjEtLjc0Ny0uMDQ3LTEuNjg0LS4wODUtMi42NjRhMTguOCAxOC44IDAgMDEtNC45NjIgMS41NjhjLTMuMDc5LjUyNi02LjM4OS4zNTYtOS44NC0uNTA3LTIuNDM1LS42MDktNC45NjUtMS44NzEtNi40MDctMy44Mi00LjIwMyAzLjY4MS04LjIxMiAzLjE4Mi0xMC4zOTYgMi40NTMtMy44NTMtMS4yODUtNy4zMDEtNC44OTYtMTAuNTQyLTExLjAzNy0yLjMwOS00LjM3NS00LjU0Mi0xMC4wNzUtNi42MzgtMTYuOTQzLTMuNjUtMTEuOTYtNS45NjktMjQuNTU3LTYuMTc1LTI4LjY5M0M0LjI5MiAyMy42OTggNy43NzcgMTQuNDQgMTUuMjk2IDkuMTI5IDI3LjE1Ny43NTEgNDUuMTI4IDUuNjc4IDUxLjY4IDcuOTE1YzQuNDAyLTIuNjUzIDkuNTgxLTMuOTQ0IDE1LjQzMy0zLjg1MSAzLjE0My4wNTEgNi4xMzYuMzI3IDguOTE2LjgyMyAyLjktLjkxMiA4LjYyOC0yLjIyMSAxNS4xODUtMi4xMzkgMTIuMDgxLjE0NCAyMi4wOTIgNC44NTIgMjguOTQ5IDEzLjYxNSA0Ljg5NCA2LjI1MiAyLjQ3NCAxOS4zODEuNTk3IDI2LjY1MS0yLjY0MiAxMC4yMjYtNy4yNzEgMjEuMTAyLTEyLjk1NyAzMC41NyAxLjU0NC4wMTEgMy43ODEtLjE3NCA2Ljk2MS0uODMxIDYuMjc0LTEuMjk1IDguMTA5IDIuMDY5IDguNjA3IDMuNTc1IDEuOTk1IDYuMDQyLTYuNjc3IDEwLjYwOC05LjM4MiAxMS44NjQtMy40NjYgMS42MDktOS4xMTcgMi41ODktMTMuNzQ1IDIuMzc3bC0uMjAyLS4wMTMtMS4yMTYtLjEwNy0uMTIgMS4wMTQtLjExNi45OTFjLS4zMTEgMTEuOTk5LTIuMDI1IDE5LjU5OC01LjU1MiAyNC42MTktMy42OTcgNS4yNjQtOC44MzUgNi43MzktMTMuMzYxIDcuNzA5LTEuNTQ0LjMzLTIuOTQ3LjQ3NC00LjIxOS40NzR6bS05LjE5LTQzLjY3MWMyLjgxOSAyLjI1NiAzLjA2NiA2LjUwMSAzLjI4NyAxNC40MzQuMDI4Ljk5LjA1NCAxLjkyNy4wODkgMi44MDIuMTA2IDIuNjUuMzU1IDguODU1IDEuMzI3IDExLjQ3Ny4xMzcuMzcxLjI2Ljc0Ny4zOSAxLjE0NiAxLjA4MyAzLjMxNiAxLjYyNiA0Ljk3OSA2LjMwOSAzLjk3OCAzLjkzMS0uODQzIDUuOTUyLTEuNTk5IDcuNTM0LTMuODUxIDIuMjk5LTMuMjc0IDMuNTg1LTkuODYgMy44MjEtMTkuNTc1bDQuNzgzLjExNi00Ljc1LS41Ny4xNC0xLjE4NmMuNDU1LTMuOTEuNzgzLTYuNzM0IDMuMzk2LTguNjAyIDIuMDk3LTEuNDk4IDQuNDg2LTEuMzUzIDYuMzg5LTEuMDEtMi4wOTEtMS41OC0yLjY2OS0zLjQzMy0yLjgyMy00LjE5M2wtLjM5OS0xLjk2NSAxLjEyMS0xLjY2M2M2LjQ1Ny05LjU4IDExLjc4MS0yMS4zNTQgMTQuNjA5LTMyLjMwNCAyLjkwNi0xMS4yNTEgMi4wMi0xNy4yMjYgMS4xMzQtMTguMzU2LTExLjcyOS0xNC45ODctMzIuMDY4LTguNzk5LTM0LjE5Mi04LjA5N2wtLjM1OS4xOTQtMS44LjMzNS0uOTIyLS4xOTFjLTIuNTQyLS41MjgtNS4zNjYtLjgyLTguMzkzLS44NjktNC43NTYtLjA4LTguNTkzIDEuMDQ0LTExLjczOSAzLjQzMWwtMi4xODMgMS42NTUtMi41MzMtMS4wNDNjLTUuNDEyLTIuMjEzLTIxLjMwOC02LjY2Mi0yOS42OTYtLjcyMS00LjY1NiAzLjI5OC02Ljc3NyA5Ljc2LTYuMzA1IDE5LjIwNy4xNTYgMy4xMTkgMi4yNzUgMTQuOTI2IDUuNzcxIDI2LjM3NyA0LjgzMSAxNS44MjUgOS4yMjEgMjEuMDgyIDExLjA1NCAyMS42OTMuMzIuMTA4IDEuMTUtLjUzNyAxLjk3Ni0xLjUyOWEyNzAuNzA4IDI3MC43MDggMCAwMTEwLjY5NC0xMi4wN2wyLjc3LTIuOTE1IDMuMzQ5IDIuMjI1YzEuMzUuODk3IDIuODM5IDEuNDA2IDQuMzY4IDEuNTAybDcuOTg3LTYuODEyLTEuMTU3IDExLjgwOGMtLjAyNi4yNjUtLjAzOS42MjYuMDY1IDEuMjk2bC4zNDggMi4yMzgtMS41MSAxLjY4OC0uMTc0LjE5NiA0LjM4OCAyLjAyNSAxLjgzNi0yLjMwMXoiLz48cGF0aCBkPSJNMTE1LjczMSA3Ny40NGMtMTMuOTI1IDIuODczLTE0Ljg4Mi0xLjg0Mi0xNC44ODItMS44NDIgMTQuNzAzLTIxLjgxNiAyMC44NDktNDkuNTEgMTUuNTQ1LTU2LjI4N0MxMDEuOTI0LjgyMyA3Ni44NzUgOS41NjYgNzYuNDU3IDkuNzkzbC0uMTM1LjAyNGMtMi43NTEtLjU3MS01LjgzLS45MTEtOS4yOTEtLjk2Ny02LjMwMS0uMTAzLTExLjA4IDEuNjUyLTE0LjcwNyA0LjQwMiAwIDAtNDQuNjg0LTE4LjQwOC00Mi42MDYgMjMuMTUxLjQ0MiA4Ljg0MiAxMi42NzIgNjYuODk5IDI3LjI2IDQ5LjM2MyA1LjMzMi02LjQxMiAxMC40ODMtMTEuODM0IDEwLjQ4My0xMS44MzQgMi41NTkgMS42OTkgNS42MjIgMi41NjcgOC44MzMgMi4yNTVsLjI1LS4yMTJjLS4wNzguNzk2LS4wNDIgMS41NzUuMSAyLjQ5Ny0zLjc1OCA0LjE5OS0yLjY1NCA0LjkzNi0xMC4xNjcgNi40ODItNy42MDIgMS41NjYtMy4xMzYgNC4zNTUtLjIyIDUuMDg0IDMuNTM0Ljg4NCAxMS43MTIgMi4xMzYgMTcuMjM3LTUuNTk4bC0uMjIxLjg4MmMxLjQ3MyAxLjE4IDIuNTA3IDcuNjcyIDIuMzM0IDEzLjU1Ny0uMTc0IDUuODg1LS4yOSA5LjkyNi44NzEgMTMuMDgyIDEuMTYgMy4xNTYgMi4zMTYgMTAuMjU2IDEyLjE5MiA4LjE0IDguMjUyLTEuNzY4IDEyLjUyOC02LjM1MSAxMy4xMjQtMTMuOTk1LjQyMi01LjQzNSAxLjM3Ny00LjYzMSAxLjQzOC05LjQ5bC43NjctMi4zYy44ODQtNy4zNjcuMTQtOS43NDMgNS4yMjUtOC42MzhsMS4yMzUuMTA4YzMuNzQyLjE3IDguNjM5LS42MDIgMTEuNTE0LTEuOTM4IDYuMTktMi44NzEgOS44NjEtNy42NjcgMy43NTgtNi40MDh6IiBmaWxsPSIjMzM2NzkxIi8+PHBhdGggZD0iTTc1Ljk1NyAxMjIuMzA3Yy04LjIzMiAwLTEwLjg0LTYuNTE5LTExLjkwNy05LjE4NS0xLjU2Mi0zLjkwNy0xLjg5OS0xOS4wNjktMS41NTEtMzEuNTAzYTEuNTkgMS41OSAwIDAxMS42NC0xLjU1IDEuNTk0IDEuNTk0IDAgMDExLjU1IDEuNjM5Yy0uNDAxIDE0LjM0MS4xNjggMjcuMzM3IDEuMzI0IDMwLjIyOSAxLjgwNCA0LjUwOSA0LjU0IDguNDUzIDEyLjI3NSA2Ljc5NiA3LjM0My0xLjU3NSAxMC4wOTMtNC4zNTkgMTEuMzE4LTExLjQ2Ljk0LTUuNDQ5IDIuNzk5LTIwLjk1MSAzLjAyOC0yNC4wMWExLjU5MyAxLjU5MyAwIDAxMS43MS0xLjQ3MiAxLjU5NyAxLjU5NyAwIDAxMS40NzIgMS43MWMtLjIzOSAzLjE4NS0yLjA4OSAxOC42NTctMy4wNjUgMjQuMzE1LTEuNDQ2IDguMzg3LTUuMTg1IDEyLjE5MS0xMy43OTQgMTQuMDM3LTEuNDYzLjMxMy0yLjc5Mi40NTMtNCAuNDU0ek0zMS4zMjEgOTAuNDY2YTYuNzEgNi43MSAwIDAxLTIuMTE2LS4zNWMtNS4zNDctMS43ODQtMTAuNDQtMTAuNDkyLTE1LjEzOC0yNS44ODUtMy41NzYtMTEuNzE3LTUuODQyLTIzLjk0Ny02LjA0MS0yNy45MjItLjU4OS0xMS43ODQgMi40NDUtMjAuMTIxIDkuMDItMjQuNzc4IDEzLjAwNy05LjIxNiAzNC44ODgtLjQ0IDM1LjgxMy0uMDYyYTEuNTk2IDEuNTk2IDAgMDEtMS4yMDcgMi45NTVjLS4yMTEtLjA4Ni0yMS4xOTMtOC40OTItMzIuNzY4LS4yODUtNS42MjIgMy45ODYtOC4yMDMgMTEuMzkyLTcuNjcyIDIyLjAxMS4xNjcgMy4zNDkgMi4yODQgMTUuMjg1IDUuOTA2IDI3LjE0OSA0LjE5NCAxMy43NDIgOC45NjcgMjIuNDEzIDEzLjA5NiAyMy43OS42NDguMjE2IDIuNjIuODczIDUuNDM5LTIuNTE3QTI0NS4yNzIgMjQ1LjI3MiAwIDAxNDUuODggNzMuMDQ2YTEuNTk2IDEuNTk2IDAgMDEyLjMwNCAyLjIwOGMtLjA0OC4wNS00Ljg0NyA1LjA2Ny0xMC4wNzcgMTEuMzU5LTIuNDc3IDIuOTc5LTQuODUxIDMuODUzLTYuNzg2IDMuODUzem02OS40MjktMTMuNDQ1YTEuNTk2IDEuNTk2IDAgMDEtMS4zMjItMi40ODdjMTQuODYzLTIyLjA1NSAyMC4wOC00OC43MDQgMTUuNjEyLTU0LjQxNC01LjYyNC03LjE4Ni0xMy41NjUtMTAuOTM5LTIzLjYwNC0xMS4xNTYtNy40MzMtLjE2LTEzLjM0MSAxLjczOC0xNC4zMDcgMi4wNjlsLS4yNDMuMDk5Yy0uOTcxLjMwNS0xLjcxNi0uMjI3LTEuOTk3LS44NDlhMS42IDEuNiAwIDAxLjYzMS0yLjAyNWMuMDQ2LS4wMjcuMTkyLS4wODkuNDI5LS4xNzZsLS4wMjEuMDA2LjAyMS0uMDA3YzEuNjQxLS42MDEgNy42MzktMi40IDE1LjA2OC0yLjMxNSAxMS4xMDguMTE4IDIwLjI4NCA0LjQwMSAyNi41MzQgMTIuMzg4IDIuOTU3IDMuNzc5IDIuOTY0IDEyLjQ4NS4wMTkgMjMuODg3LTMuMDAyIDExLjYyNS04LjY1MSAyNC4xMTgtMTUuNDk3IDM0LjI3Ny0uMzA2LjQ1Ny0uODEuNzAzLTEuMzIzLjcwM3ptLjc2IDEwLjIxYy0yLjUzOCAwLTQuODEzLS4zNTgtNi4xNzUtMS4xNzQtMS40LS44MzktMS42NjctMS45NzktMS43MDItMi41ODQtLjM4Mi02LjcxIDMuMzItNy44NzggNS4yMDgtOC40MTEtLjI2My0uMzk4LS42MzctLjg2Ni0xLjAyNC0xLjM0OS0xLjEwMS0xLjM3Ni0yLjYwOS0zLjI2LTMuNzcxLTYuMDc4LS4xODItLjQ0LS43NTItMS40NjMtMS40MTItMi42NDgtMy41NzktNi40MTgtMTEuMDI2LTE5Ljc3My02LjI0Mi0yNi42MTIgMi4yMTQtMy4xNjUgNi42MjMtNC40MTEgMTMuMTE5LTMuNzE2Qzk3LjYgMjguODM3IDg4LjUgMTAuNjI1IDY2LjkwNyAxMC4yNzFjLTYuNDk0LS4xMDgtMTEuODIgMS44ODktMTUuODIyIDUuOTMtOC45NiA5LjA0OS04LjYzNiAyNS40MjItOC42MzEgMjUuNTg2YTEuNTk1IDEuNTk1IDAgMTEtMy4xOS4wODRjLS4wMi0uNzI3LS4zNTQtMTcuOTA5IDkuNTU0LTI3LjkxNkM1My40NTUgOS4yNzIgNTkuNTU5IDYuOTYgNjYuOTYgNy4wODFjMTMuODE0LjIyNyAyMi43MDYgNy4yNSAyNy43MzIgMTMuMTAxIDUuNDc5IDYuMzc3IDguMTY1IDEzLjQxMSA4LjM4NiAxNS43NTkuMTY1IDEuNzQ2LTEuMDg4IDIuMDk1LTEuMzQxIDIuMTQ3bC0uNTc2LjAxM2MtNi4zNzUtMS4wMjEtMTAuNDY1LS4zMTItMTIuMTU2IDIuMTA0LTMuNjM5IDUuMjAxIDMuNDA2IDE3LjgzNCA2LjQxNCAyMy4yMjkuNzY4IDEuMzc2IDEuMzIyIDIuMzcxIDEuNTc2IDIuOTg1Ljk4OCAyLjM5NiAyLjI3NyA0LjAwNiAzLjMxMiA1LjMuOTExIDEuMTM4IDEuNyAyLjEyNSAxLjk4MiAzLjI4My4xMzEuMjMgMS45OSAyLjk4IDEzLjAyMS43MDMgMi43NjUtLjU3IDQuNDIzLS4wODMgNC45MyAxLjQ1Ljk5NyAzLjAxNS00LjU5NyA2LjUzMi03LjY5NCA3Ljk3LTIuNzc1IDEuMjktNy4yMDQgMi4xMDYtMTEuMDM2IDIuMTA2em0tNC42OTYtNC4wMjFjLjM1LjM1MyAyLjEwMS45NjIgNS43MjcuODA2IDMuMjI0LS4xMzggNi42MjQtLjgzOSA4LjY2NC0xLjc4NiAyLjYwOS0xLjIxMiA0LjM1MS0yLjU2NyA1LjI1My0zLjQ5MmwtLjUuMDkyYy03LjA1MyAxLjQ1Ni0xMi4wNDIgMS4yNjItMTQuODI4LS41NzdhNi4xNjIgNi4xNjIgMCAwMS0uNTQtLjQwMWMtLjMwMi4xMTktLjU4MS4xOTctLjc4LjI1My0xLjU4LjQ0My0zLjIxNC45MDItMi45OTYgNS4xMDV6bS00NS41NjIgOC45MTVjLTEuNzUyIDAtMy41OTYtLjIzOS01LjQ3OS0uNzEtMS45NTEtLjQ4OC01LjI0LTEuOTU3LTUuMTktNC4zNy4wNTctMi43MDcgMy45OTQtMy41MTkgNS40NzYtMy44MjQgNS4zNTQtMS4xMDMgNS43MDMtMS41NDUgNy4zNzYtMy42Ny40ODgtLjYxOSAxLjA5NS0xLjM5IDEuOTIzLTIuMzE0IDEuMjI5LTEuMzc2IDIuNTcyLTIuMDczIDMuOTkyLTIuMDczLjk4OSAwIDEuOC4zMzUgMi4zMzYuNTU4IDEuNzA4LjcwOCAzLjEzMyAyLjQyIDMuNzE5IDQuNDY3LjUyOSAxLjg0Ny4yNzYgMy42MjUtLjcxIDUuMDA2LTMuMjM3IDQuNTMzLTcuODg2IDYuOTMtMTMuNDQzIDYuOTN6bS03LjIyMi00Ljk0M2MuNDgxLjM3MiAxLjQ0NS44NjkgMi41MTggMS4xMzcgMS42MzEuNDA4IDMuMjEzLjYxNSA0LjcwNS42MTUgNC41NDYgMCA4LjE5Ni0xLjg4MiAxMC44NDctNS41OTQuNTUzLS43NzQuMzg3LTEuNzU3LjIzOS0yLjI3NC0uMzEtMS4wODMtMS4wOC0yLjA2OC0xLjg3My0yLjM5Ny0uNDMtLjE3OC0uNzg3LS4zMTQtMS4xMTUtLjMxNC0uMTc2IDAtLjcxMiAwLTEuNjE0IDEuMDA5YTQxLjE0NiA0MS4xNDYgMCAwMC0xLjc5NCAyLjE2MmMtMi4wODQgMi42NDYtMy4wMzkgMy41NDQtOS4yMzkgNC44MjEtMS41MTMuMzEtMi4yODkuNjI2LTIuNjc0LjgzNXptMTIuMjY5LTcuMzZhMS41OTYgMS41OTYgMCAwMS0xLjU3NS0xLjM1NCA4LjIxOCA4LjIxOCAwIDAxLS4wOC0uNzk5Yy00LjA2NC0uMDc2LTcuOTg1LTEuODItMTAuOTYyLTQuOTI2LTMuNzY0LTMuOTI3LTUuNDc3LTkuMzY4LTQuNjk5LTE0LjkyNy44NDUtNi4wMzcuNTI5LTExLjM2Ni4zNTktMTQuMjI5LS4wNDctLjc5Ni0uMDgxLTEuMzcxLS4wNzktMS43NjkuMDAzLS41MDUuMDEzLTEuODQ0IDQuNDg5LTQuMTEzIDEuNTkyLS44MDcgNC43ODQtMi4yMTUgOC4yNzEtMi41NzYgNS43NzctLjU5NyA5LjU4NSAxLjk3NiAxMC43MjUgNy4yNDYgMy4wNzcgMTQuMjI4LjI0NCAyMC41MjEtMS44MjUgMjUuMTE3LS4zODUuODU2LS43NDkgMS42NjQtMS4wNCAyLjQ0N2wtLjI1Ny42OWMtMS4wOTMgMi45MzEtMi4wMzggNS40NjMtMS43NDggNy4zNTRhMS41OTUgMS41OTUgMCAwMS0xLjMzNSAxLjgxOWwtLjI0NC4wMnpNNDIuNDY0IDQyLjI2bC4wNjIgMS4xMzljLjE3NiAyLjk3NC41MDQgOC41MDgtLjM4NCAxNC44Ni0uNjQxIDQuNTg1Ljc1OSA5LjA2IDMuODQzIDEyLjI3NiAyLjQzNyAyLjU0MiA1LjY0NCAzLjk0NSA4Ljk0IDMuOTQ1aC4wNjhjLjM2OS0xLjU1NS45ODItMy4xOTcgMS42NDItNC45NjZsLjI1NS0uNjg2Yy4zMjktLjg4NC43MTQtMS43NCAxLjEyMi0yLjY0NiAxLjk5MS00LjQyNCA0LjQ3LTkuOTMxIDEuNjE1LTIzLjEzMi0uNTY1LTIuNjE1LTEuOTM2LTQuMTI4LTQuMTg5LTQuNjI3LTQuNjI4LTEuMDIyLTExLjUyNSAyLjQ1OS0xMi45NzQgMy44Mzd6bTkuNjMtLjY3N2MtLjA4LjU2NCAxLjAzMyAyLjA3IDIuNDg1IDIuMjcxIDEuNDQ5LjIwMyAyLjY4OS0uOTc1IDIuNzY4LTEuNTM5LjA3OS0uNTY0LTEuMDMzLTEuMTg2LTIuNDg1LTEuMzg4LTEuNDUxLS4yMDItMi42OTEuMDkyLTIuNzY4LjY1NnptMi44MTggMi44MjZsLS40MDctLjAyOGMtLjktLjEyNS0xLjgxLS42OTItMi40MzMtMS41MTgtLjIxOS0uMjktLjU3Ni0uODUyLS41MDUtMS4zNTQuMTAxLS43MzYuOTk5LTEuMTc3IDIuNC0xLjE3Ny4zMTMgMCAuNjM5LjAyMy45NjcuMDY5Ljc2Ni4xMDYgMS40NzcuMzI3IDIuMDAyLjYyLjkxLjUwOC45NzcgMS4wNzUuOTM2IDEuMzY4LS4xMTIuODEzLTEuNDA1IDIuMDItMi45NiAyLjAyem0tMi4yODktMi43MzJjLjA0NS4zNDguOTA3IDEuNDk2IDIuMDI5IDEuNjUxbC4yNjEuMDE4YzEuMDM2IDAgMS44MS0uODE1IDEuOTAxLTEuMDgyLS4wOTYtLjE4Mi0uNzYyLS42MzQtMi4wMjUtLjgxYTUuODIzIDUuODIzIDAgMDAtLjgyMS0uMDU5Yy0uODEyIDAtMS4yNDMuMTgzLTEuMzQ1LjI4MnptNDMuNjA1LTEuMjQ1Yy4wNzkuNTY0LTEuMDMzIDIuMDctMi40ODQgMi4yNzItMS40NS4yMDItMi42OTEtLjk3NS0yLjc3MS0xLjUzOS0uMDc2LS41NjQgMS4wMzYtMS4xODcgMi40ODYtMS4zODggMS40NS0uMjAzIDIuNjg5LjA5MiAyLjc2OS42NTV6bS0yLjgxOSAyLjU2Yy0xLjM5NiAwLTIuNjAxLTEuMDg2LTIuNy0xLjc5MS0uMTE1LS44NDYgMS4yNzgtMS40ODkgMi43MTItMS42ODguMzE2LS4wNDQuNjI5LS4wNjYuOTMtLjA2NiAxLjIzOCAwIDIuMDU4LjM2MyAyLjE0Ljk0OS4wNTMuMzc5LS4yMzguOTY0LS43MzkgMS40OTItLjMzMS4zNDctMS4wMjYuOTQ4LTEuOTczIDEuMDc5bC0uMzcuMDI1em0uOTQzLTMuMDEzYy0uMjc2IDAtLjU2NC4wMjEtLjg1Ni4wNjEtMS40NDEuMjAxLTIuMzAxLjc3OS0yLjI1OSAxLjA4OS4wNDguMzQxLjk2OCAxLjMzMiAyLjE3MyAxLjMzMmwuMjk3LS4wMjFjLjc4Ny0uMTA5IDEuMzc4LS42MjMgMS42Ni0uOTE5LjQ0My0uNDY1LjYxOS0uOTAzLjU5OC0xLjA1Mi0uMDI4LS4xOTgtLjU2LS40OS0xLjYxMy0uNDl6bTMuOTY1IDMyLjg0M2ExLjU5NCAxLjU5NCAwIDAxLTEuMzI0LTIuNDgzYzMuMzk4LTUuMDc1IDIuNzc2LTEwLjI1IDIuMTc1LTE1LjI1NS0uMjU3LTIuMTMyLS41MjEtNC4zMzctLjQ1My02LjQ1My4wNy0yLjE3Ny4zNDctMy45NzMuNjE0LTUuNzEuMzE3LTIuMDU4LjYxNy00LjAwMi40OTMtNi4zMWExLjU5NSAxLjU5NSAwIDExMy4xODYtLjE3MmMuMTQyIDIuNjM4LS4xOTcgNC44MzgtLjUyNSA2Ljk2Ny0uMjUzIDEuNjQzLS41MTUgMy4zNDItLjU3OCA1LjMyNy0uMDYxIDEuODc0LjE3OCAzLjg2NC40MzEgNS45Ny42NCA1LjMyMiAxLjM2NSAxMS4zNTQtMi42OTEgMTcuNDExYTEuNTk2IDEuNTk2IDAgMDEtMS4zMjguNzA4eiIgZmlsbD0iI2ZmZiIvPjwvc3ZnPg==;" parent="1" vertex="1">
<mxGeometry x="785" y="-645" width="70" height="70" as="geometry" />
</mxCell>
<mxCell id="PG-S5D8SCmHSsYNVxMVk-30" value="" style="shape=image;imageAspect=0;aspect=fixed;verticalLabelPosition=bottom;verticalAlign=top;image=data:image/svg+xml,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjggMTI4Ij48cGF0aCBkPSJNODguMDM4IDQyLjgxMmMxLjYwNSA0LjY0MyAyLjc2MSA5LjM4MyAzLjE0MSAxNC4yOTYuNDcyIDYuMDk1LjI1NiAxMi4xNDctMS4wMjkgMTguMTQyLS4wMzUuMTY1LS4xMDkuMzItLjE2NC40OC0uNDAzLjAwMS0uODE0LS4wNDktMS4yMDguMDEyLTMuMzI5LjUyMy02LjY1NSAxLjA2NS05Ljk4MSAxLjYwNC0zLjQzOC41NTctNi44ODEgMS4wOTItMTAuMzEzIDEuNjg3LTEuMjE2LjIxLTIuNzIxLS4wNDEtMy4yMTIgMS42NDEtLjAxNC4wNDYtLjE1NC4wNTQtLjIzNS4wOGwuMTY2LTEwLjA1MS0uMTY5LTI0LjI1MiAxLjYwMi0uMjc1YzIuNjItLjQyOSA1LjI0LS44NjQgNy44NjItMS4yODEgMy4xMjktLjQ5NyA2LjI2MS0uOTggOS4zOTItMS40NjUgMS4zODEtLjIxNSAyLjc2NC0uNDEyIDQuMTQ4LS42MTh6IiBmaWxsPSIjNDM5OTM0IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik02MS43MjkgMTEwLjA1NGMtMS42OS0xLjQ1My0zLjQzOS0yLjg0Mi01LjA1OS00LjM3LTguNzE3LTguMjIyLTE1LjA5My0xNy44OTktMTguMjMzLTI5LjU2Ni0uODY1LTMuMjExLTEuNDQyLTYuNDc0LTEuNjI3LTkuNzkyLS4xMy0yLjMyMi0uMzE4LTQuNjY1LS4xNTQtNi45NzUuNDM3LTYuMTQ0IDEuMzI1LTEyLjIyOSAzLjEyNy0xOC4xNDdsLjA5OS0uMTM4Yy4xNzUuMjMzLjQyNy40MzkuNTE2LjcwMiAxLjc1OSA1LjE4IDMuNTA1IDEwLjM2NCA1LjI0MiAxNS41NTEgNS40NTggMTYuMyAxMC45MDkgMzIuNjA0IDE2LjM3NiA0OC45LjEwNy4zMTguMzg0LjU3OS41ODMuODY2bC0uODcgMi45Njl6IiBmaWxsPSIjNDVBNTM4IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik04OC4wMzggNDIuODEyYy0xLjM4NC4yMDYtMi43NjguNDAzLTQuMTQ5LjYxNi0zLjEzMS40ODUtNi4yNjMuOTY4LTkuMzkyIDEuNDY1LTIuNjIyLjQxNy01LjI0Mi44NTItNy44NjIgMS4yODFsLTEuNjAyLjI3NS0uMDEyLTEuMDQ1Yy0uMDUzLS44NTktLjE0NC0xLjcxNy0uMTU0LTIuNTc2LS4wNjktNS40NzgtLjExMi0xMC45NTYtLjE4LTE2LjQzNC0uMDQyLTMuNDI5LS4xMDUtNi44NTctLjE3NS0xMC4yODUtLjA0My0yLjEzLS4wODktNC4yNjEtLjE4NS02LjM4OC0uMDUyLTEuMTQzLS4yMzYtMi4yOC0uMzExLTMuNDIzLS4wNDItLjY1Ny4wMTYtMS4zMTkuMDI5LTEuOTc5LjgxNyAxLjU4MyAxLjYxNiAzLjE3OCAyLjQ1NiA0Ljc0OSAxLjMyNyAyLjQ4NCAzLjQ0MSA0LjMxNCA1LjM0NCA2LjMxMSA3LjUyMyA3Ljg5MiAxMi44NjQgMTcuMDY4IDE2LjE5MyAyNy40MzN6IiBmaWxsPSIjNDZBMDM3IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik02NS4wMzYgODAuNzUzYy4wODEtLjAyNi4yMjItLjAzNC4yMzUtLjA4LjQ5MS0xLjY4MiAxLjk5Ni0xLjQzMSAzLjIxMi0xLjY0MSAzLjQzMi0uNTk0IDYuODc1LTEuMTMgMTAuMzEzLTEuNjg3IDMuMzI2LS41MzkgNi42NTItMS4wODEgOS45ODEtMS42MDQuMzk0LS4wNjIuODA1LS4wMTEgMS4yMDgtLjAxMi0uNjIyIDIuMjItMS4xMTIgNC40ODgtMS45MDEgNi42NDctLjg5NiAyLjQ0OS0xLjk4IDQuODM5LTMuMTMxIDcuMTgyYTQ5LjE0MiA0OS4xNDIgMCAwMS02LjM1MyA5Ljc2M2MtMS45MTkgMi4zMDgtNC4wNTggNC40NDEtNi4yMDIgNi41NDgtMS4xODUgMS4xNjUtMi41ODIgMi4xMTQtMy44ODIgMy4xNjFsLS4zMzctLjIzLTEuMjE0LTEuMDM4LTEuMjU2LTIuNzUzYTQxLjQwMiA0MS40MDIgMCAwMS0xLjM5NC05LjgzOGwuMDIzLS41NjEuMTcxLTIuNDI2Yy4wNTctLjgyOC4xMzMtMS42NTUuMTY4LTIuNDg1LjEyOS0yLjk4Mi4yNDEtNS45NjQuMzU5LTguOTQ2eiIgZmlsbD0iIzQwOTQzMyIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBkPSJNNjUuMDM2IDgwLjc1M2MtLjExOCAyLjk4Mi0uMjMgNS45NjQtLjM1NyA4Ljk0Ny0uMDM1LjgzLS4xMTEgMS42NTctLjE2OCAyLjQ4NWwtLjc2NS4yODljLTEuNjk5LTUuMDAyLTMuMzk5LTkuOTUxLTUuMDYyLTE0LjkxMy0yLjc1LTguMjA5LTUuNDY3LTE2LjQzMS04LjIxMy0yNC42NDJhNDQ5OC44ODcgNDQ5OC44ODcgMCAwMC02LjctMTkuODY3Yy0uMTA1LS4zMS0uNDA3LS41NTItLjYxNy0uODI2bDQuODk2LTkuMDAyYy4xNjguMjkyLjM5LjU2NS40OTYuODc5YTYxNjcuNDc2IDYxNjcuNDc2IDAgMDE2Ljc2OCAyMC4xMThjMi45MTYgOC43MyA1LjgxNCAxNy40NjcgOC43MjggMjYuMTk4LjExNi4zNDkuMzA4LjY3MS40OTEgMS4wNjJsLjY3LS43OC0uMTY3IDEwLjA1MnoiIGZpbGw9IiM0RkFBNDEiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbC1ydWxlPSJldmVub2RkIi8+PHBhdGggZD0iTTQzLjE1NSAzMi4yMjdjLjIxLjI3NC41MTEuNTE2LjYxNy44MjZhNDQ5OC44ODcgNDQ5OC44ODcgMCAwMTYuNyAxOS44NjdjMi43NDYgOC4yMTEgNS40NjMgMTYuNDMzIDguMjEzIDI0LjY0MiAxLjY2MiA0Ljk2MSAzLjM2MiA5LjkxMSA1LjA2MiAxNC45MTNsLjc2NS0uMjg5LS4xNzEgMi40MjYtLjE1NS41NTljLS4yNjYgMi42NTYtLjQ5IDUuMzE4LS44MTQgNy45NjgtLjE2MyAxLjMyOC0uNTA5IDIuNjMyLS43NzIgMy45NDctLjE5OC0uMjg3LS40NzYtLjU0OC0uNTgzLS44NjYtNS40NjctMTYuMjk3LTEwLjkxOC0zMi42LTE2LjM3Ni00OC45YTM4ODguOTcyIDM4ODguOTcyIDAgMDAtNS4yNDItMTUuNTUxYy0uMDg5LS4yNjMtLjM0LS40NjktLjUxNi0uNzAybDMuMjcyLTguODR6IiBmaWxsPSIjNEFBNzNDIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik02NS4yMDIgNzAuNzAybC0uNjcuNzhjLS4xODMtLjM5MS0uMzc1LS43MTQtLjQ5MS0xLjA2Mi0yLjkxMy04LjczMS01LjgxMi0xNy40NjgtOC43MjgtMjYuMTk4YTYxNjcuNDc2IDYxNjcuNDc2IDAgMDAtNi43NjgtMjAuMTE4Yy0uMTA1LS4zMTQtLjMyNy0uNTg4LS40OTYtLjg3OWw2LjA1NS03Ljk2NWMuMTkxLjI1NS40NjMuNDgyLjU2Mi43NjkgMS42ODEgNC45MjEgMy4zNDcgOS44NDggNS4wMDMgMTQuNzc4IDEuNTQ3IDQuNjA0IDMuMDcxIDkuMjE1IDQuNjM2IDEzLjgxMy4xMDUuMzA4LjQ3LjUyNi43MTQuNzg2bC4wMTIgMS4wNDVjLjA1OCA4LjA4Mi4xMTUgMTYuMTY3LjE3MSAyNC4yNTF6IiBmaWxsPSIjNTdBRTQ3IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik02NS4wMjEgNDUuNDA0Yy0uMjQ0LS4yNi0uNjA5LS40NzgtLjcxNC0uNzg2LTEuNTY1LTQuNTk4LTMuMDg5LTkuMjA5LTQuNjM2LTEzLjgxMy0xLjY1Ni00LjkzLTMuMzIyLTkuODU2LTUuMDAzLTE0Ljc3OC0uMDk5LS4yODctLjM3MS0uNTE0LS41NjItLjc2OSAxLjk2OS0xLjkyOCAzLjg3Ny0zLjkyNSA1LjkyNS01Ljc2NCAxLjgyMS0xLjYzNCAzLjI4NS0zLjM4NiAzLjM1Mi01Ljk2OC4wMDMtLjEwNy4wNTktLjIxNC4xNDUtLjUxNGwuNTE5IDEuMzA2Yy0uMDEzLjY2MS0uMDcyIDEuMzIyLS4wMjkgMS45NzkuMDc1IDEuMTQzLjI1OSAyLjI4LjMxMSAzLjQyMy4wOTYgMi4xMjcuMTQyIDQuMjU4LjE4NSA2LjM4OC4wNjkgMy40MjguMTMyIDYuODU2LjE3NSAxMC4yODUuMDY3IDUuNDc4LjExMSAxMC45NTYuMTggMTYuNDM0LjAwOC44NjEuMDk4IDEuNzE4LjE1MiAyLjU3N3oiIGZpbGw9IiM2MEIyNEYiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbC1ydWxlPSJldmVub2RkIi8+PHBhdGggZD0iTTYyLjU5OCAxMDcuMDg1Yy4yNjMtMS4zMTUuNjA5LTIuNjIuNzcyLTMuOTQ3LjMyNS0yLjY0OS41NDgtNS4zMTIuODE0LTcuOTY4bC4wNjYtLjAxLjA2Ni4wMTFhNDEuNDAyIDQxLjQwMiAwIDAwMS4zOTQgOS44MzhjLS4xNzYuMjMyLS40MjUuNDM5LS41MTguNzAxLS43MjcgMi4wNS0xLjQxMiA0LjExNi0yLjE0MyA2LjE2Ni0uMS4yOC0uMzc4LjQ5OC0uNTc0Ljc0NGwtLjc0Ny0yLjU2Ni44Ny0yLjk2OXoiIGZpbGw9IiNBOUFBODgiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbC1ydWxlPSJldmVub2RkIi8+PHBhdGggZD0iTTYyLjQ3NiAxMTIuNjIxYy4xOTYtLjI0Ni40NzUtLjQ2NC41NzQtLjc0NC43MzEtMi4wNSAxLjQxNy00LjExNSAyLjE0My02LjE2Ni4wOTMtLjI2Mi4zNDEtLjQ2OS41MTgtLjcwMWwxLjI1NSAyLjc1NGMtLjI0OC4zNTItLjU5LjY2OS0uNzI4IDEuMDYxbC0yLjQwNCA3LjA1OWMtLjA5OS4yODMtLjQzNy40ODMtLjY2My43MjJsLS42OTUtMy45ODV6IiBmaWxsPSIjQjZCNTk4IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik02My4xNzEgMTE2LjYwNWMuMjI3LS4yMzguNTY0LS40MzkuNjYzLS43MjJsMi40MDQtNy4wNTljLjEzNy0uMzkxLjQ4LS43MDkuNzI4LTEuMDYxbDEuMjE1IDEuMDM3Yy0uNTg3LjU4LS45MTMgMS4yNS0uNzE3IDIuMDk3bC0uMzY5IDEuMjA4Yy0uMTY4LjIwNy0uNDExLjM4Ny0uNDk0LjYyNC0uODM5IDIuNDAzLTEuNjQgNC44MTktMi40ODUgNy4yMjItLjEwNy4zMDUtLjQwNC41NDQtLjYxNC44MTItLjEwOS0xLjM4Ny0uMjItMi43NzEtLjMzMS00LjE1OHoiIGZpbGw9IiNDMkMxQTciIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbC1ydWxlPSJldmVub2RkIi8+PHBhdGggZD0iTTYzLjUwMyAxMjAuNzYzYy4yMDktLjI2OS41MDYtLjUwOC42MTQtLjgxMi44NDUtMi40MDIgMS42NDYtNC44MTggMi40ODUtNy4yMjIuMDgzLS4yMzYuMzI1LS40MTcuNDk0LS42MjRsLS41MDkgNS41NDVjLS4xMzYuMTU3LS4zMzMuMjk0LS4zOTguNDc3LS41NzUgMS42MTQtMS4xMTcgMy4yNC0xLjY5NCA0Ljg1NC0uMTE5LjMzMy0uMzQ3LjYyNy0uNTI1LjkzOC0uMTU4LS4yMDctLjQ0MS0uNDA3LS40NTQtLjYyMy0uMDUxLS44NDEtLjAxNi0xLjY4OC0uMDEzLTIuNTMzeiIgZmlsbD0iI0NFQ0RCNyIgY2xpcC1ydWxlPSJldmVub2RkIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBkPSJNNjMuOTY5IDEyMy45MTljLjE3OC0uMzEyLjQwNi0uNjA2LjUyNS0uOTM4LjU3OC0xLjYxMyAxLjExOS0zLjIzOSAxLjY5NC00Ljg1NC4wNjUtLjE4My4yNjMtLjMxOS4zOTgtLjQ3N2wuMDEyIDMuNjQtMS4yMTggMy4xMjQtMS40MTEtLjQ5NXoiIGZpbGw9IiNEQkRBQzciIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbC1ydWxlPSJldmVub2RkIi8+PHBhdGggZD0iTTY1LjM4IDEyNC40MTVsMS4yMTgtMy4xMjQuMjUxIDMuNjk2LTEuNDY5LS41NzJ6IiBmaWxsPSIjRUJFOURDIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik02Ny40NjQgMTEwLjg5OGMtLjE5Ni0uODQ3LjEyOS0xLjUxOC43MTctMi4wOTdsLjMzNy4yMy0xLjA1NCAxLjg2N3oiIGZpbGw9IiNDRUNEQjciIGNsaXAtcnVsZT0iZXZlbm9kZCIgZmlsbC1ydWxlPSJldmVub2RkIi8+PHBhdGggZD0iTTY0LjMxNiA5NS4xNzJsLS4wNjYtLjAxMS0uMDY2LjAxLjE1NS0uNTU5LS4wMjMuNTZ6IiBmaWxsPSIjNEZBQTQxIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvc3ZnPg==;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjggMTI4Ij48cGF0aCBkPSJNOTMuODA5IDkyLjExMmMuNzg1LTYuNTMzLjU1LTcuNDkyIDUuNDE2LTYuNDMzbDEuMjM1LjEwOGMzLjc0Mi4xNyA4LjYzNy0uNjAyIDExLjUxMy0xLjkzOCA2LjE5MS0yLjg3MyA5Ljg2MS03LjY2OCAzLjc1OC02LjQwOS0xMy45MjQgMi44NzMtMTQuODgxLTEuODQyLTE0Ljg4MS0xLjg0MiAxNC43MDMtMjEuODE1IDIwLjg0OS00OS41MDggMTUuNTQzLTU2LjI4Ny0xNC40Ny0xOC40ODktMzkuNTE3LTkuNzQ2LTM5LjkzNi05LjUybC0uMTM0LjAyNWMtMi43NTEtLjU3MS01LjgzLS45MTItOS4yODktLjk2OC02LjMwMS0uMTA0LTExLjA4MiAxLjY1Mi0xNC43MDkgNC40MDIgMCAwLTQ0LjY4My0xOC40MDktNDIuNjA0IDIzLjE1MS40NDIgOC44NDEgMTIuNjcyIDY2Ljg5OCAyNy4yNiA0OS4zNjIgNS4zMzItNi40MTIgMTAuNDg0LTExLjgzNCAxMC40ODQtMTEuODM0IDIuNTU4IDEuNjk5IDUuNjIyIDIuNTY3IDguODM0IDIuMjU1bC4yNDktLjIxMmMtLjA3OC43OTYtLjA0NCAxLjU3NS4wOTkgMi40OTctMy43NTcgNC4xOTktMi42NTMgNC45MzYtMTAuMTY2IDYuNDgyLTcuNjAyIDEuNTY2LTMuMTM2IDQuMzU1LS4yMjEgNS4wODQgMy41MzUuODg0IDExLjcxMiAyLjEzNiAxNy4yMzgtNS41OThsLS4yMi44ODJjMS40NzQgMS4xOCAxLjM3NSA4LjQ3NyAxLjU4MyAxMy42OS4yMDkgNS4yMTQuNTU4IDEwLjA3OSAxLjYyMSAxMi45NDggMS4wNjMgMi44NjggMi4zMTcgMTAuMjU2IDEyLjE5MSA4LjE0IDguMjUyLTEuNzY0IDE0LjU2MS00LjMwOSAxNS4xMzYtMjcuOTg1Ii8+PHBhdGggZD0iTTc1LjQ1OCAxMjUuMjU2Yy00LjM2NyAwLTcuMjExLTEuNjg5LTguOTM4LTMuMzItMi42MDctMi40Ni0zLjY0MS01LjYyOS00LjI1OS03LjUyMmwtLjI2Ny0uNzljLTEuMjQ0LTMuMzU4LTEuNjY2LTguMTkzLTEuOTE2LTE0LjQxOS0uMDM4LS45MzUtLjA2NC0xLjg5OC0uMDkzLTIuOTE5LS4wMjEtLjc0Ny0uMDQ3LTEuNjg0LS4wODUtMi42NjRhMTguOCAxOC44IDAgMDEtNC45NjIgMS41NjhjLTMuMDc5LjUyNi02LjM4OS4zNTYtOS44NC0uNTA3LTIuNDM1LS42MDktNC45NjUtMS44NzEtNi40MDctMy44Mi00LjIwMyAzLjY4MS04LjIxMiAzLjE4Mi0xMC4zOTYgMi40NTMtMy44NTMtMS4yODUtNy4zMDEtNC44OTYtMTAuNTQyLTExLjAzNy0yLjMwOS00LjM3NS00LjU0Mi0xMC4wNzUtNi42MzgtMTYuOTQzLTMuNjUtMTEuOTYtNS45NjktMjQuNTU3LTYuMTc1LTI4LjY5M0M0LjI5MiAyMy42OTggNy43NzcgMTQuNDQgMTUuMjk2IDkuMTI5IDI3LjE1Ny43NTEgNDUuMTI4IDUuNjc4IDUxLjY4IDcuOTE1YzQuNDAyLTIuNjUzIDkuNTgxLTMuOTQ0IDE1LjQzMy0zLjg1MSAzLjE0My4wNTEgNi4xMzYuMzI3IDguOTE2LjgyMyAyLjktLjkxMiA4LjYyOC0yLjIyMSAxNS4xODUtMi4xMzkgMTIuMDgxLjE0NCAyMi4wOTIgNC44NTIgMjguOTQ5IDEzLjYxNSA0Ljg5NCA2LjI1MiAyLjQ3NCAxOS4zODEuNTk3IDI2LjY1MS0yLjY0MiAxMC4yMjYtNy4yNzEgMjEuMTAyLTEyLjk1NyAzMC41NyAxLjU0NC4wMTEgMy43ODEtLjE3NCA2Ljk2MS0uODMxIDYuMjc0LTEuMjk1IDguMTA5IDIuMDY5IDguNjA3IDMuNTc1IDEuOTk1IDYuMDQyLTYuNjc3IDEwLjYwOC05LjM4MiAxMS44NjQtMy40NjYgMS42MDktOS4xMTcgMi41ODktMTMuNzQ1IDIuMzc3bC0uMjAyLS4wMTMtMS4yMTYtLjEwNy0uMTIgMS4wMTQtLjExNi45OTFjLS4zMTEgMTEuOTk5LTIuMDI1IDE5LjU5OC01LjU1MiAyNC42MTktMy42OTcgNS4yNjQtOC44MzUgNi43MzktMTMuMzYxIDcuNzA5LTEuNTQ0LjMzLTIuOTQ3LjQ3NC00LjIxOS40NzR6bS05LjE5LTQzLjY3MWMyLjgxOSAyLjI1NiAzLjA2NiA2LjUwMSAzLjI4NyAxNC40MzQuMDI4Ljk5LjA1NCAxLjkyNy4wODkgMi44MDIuMTA2IDIuNjUuMzU1IDguODU1IDEuMzI3IDExLjQ3Ny4xMzcuMzcxLjI2Ljc0Ny4zOSAxLjE0NiAxLjA4MyAzLjMxNiAxLjYyNiA0Ljk3OSA2LjMwOSAzLjk3OCAzLjkzMS0uODQzIDUuOTUyLTEuNTk5IDcuNTM0LTMuODUxIDIuMjk5LTMuMjc0IDMuNTg1LTkuODYgMy44MjEtMTkuNTc1bDQuNzgzLjExNi00Ljc1LS41Ny4xNC0xLjE4NmMuNDU1LTMuOTEuNzgzLTYuNzM0IDMuMzk2LTguNjAyIDIuMDk3LTEuNDk4IDQuNDg2LTEuMzUzIDYuMzg5LTEuMDEtMi4wOTEtMS41OC0yLjY2OS0zLjQzMy0yLjgyMy00LjE5M2wtLjM5OS0xLjk2NSAxLjEyMS0xLjY2M2M2LjQ1Ny05LjU4IDExLjc4MS0yMS4zNTQgMTQuNjA5LTMyLjMwNCAyLjkwNi0xMS4yNTEgMi4wMi0xNy4yMjYgMS4xMzQtMTguMzU2LTExLjcyOS0xNC45ODctMzIuMDY4LTguNzk5LTM0LjE5Mi04LjA5N2wtLjM1OS4xOTQtMS44LjMzNS0uOTIyLS4xOTFjLTIuNTQyLS41MjgtNS4zNjYtLjgyLTguMzkzLS44NjktNC43NTYtLjA4LTguNTkzIDEuMDQ0LTExLjczOSAzLjQzMWwtMi4xODMgMS42NTUtMi41MzMtMS4wNDNjLTUuNDEyLTIuMjEzLTIxLjMwOC02LjY2Mi0yOS42OTYtLjcyMS00LjY1NiAzLjI5OC02Ljc3NyA5Ljc2LTYuMzA1IDE5LjIwNy4xNTYgMy4xMTkgMi4yNzUgMTQuOTI2IDUuNzcxIDI2LjM3NyA0LjgzMSAxNS44MjUgOS4yMjEgMjEuMDgyIDExLjA1NCAyMS42OTMuMzIuMTA4IDEuMTUtLjUzNyAxLjk3Ni0xLjUyOWEyNzAuNzA4IDI3MC43MDggMCAwMTEwLjY5NC0xMi4wN2wyLjc3LTIuOTE1IDMuMzQ5IDIuMjI1YzEuMzUuODk3IDIuODM5IDEuNDA2IDQuMzY4IDEuNTAybDcuOTg3LTYuODEyLTEuMTU3IDExLjgwOGMtLjAyNi4yNjUtLjAzOS42MjYuMDY1IDEuMjk2bC4zNDggMi4yMzgtMS41MSAxLjY4OC0uMTc0LjE5NiA0LjM4OCAyLjAyNSAxLjgzNi0yLjMwMXoiLz48cGF0aCBkPSJNMTE1LjczMSA3Ny40NGMtMTMuOTI1IDIuODczLTE0Ljg4Mi0xLjg0Mi0xNC44ODItMS44NDIgMTQuNzAzLTIxLjgxNiAyMC44NDktNDkuNTEgMTUuNTQ1LTU2LjI4N0MxMDEuOTI0LjgyMyA3Ni44NzUgOS41NjYgNzYuNDU3IDkuNzkzbC0uMTM1LjAyNGMtMi43NTEtLjU3MS01LjgzLS45MTEtOS4yOTEtLjk2Ny02LjMwMS0uMTAzLTExLjA4IDEuNjUyLTE0LjcwNyA0LjQwMiAwIDAtNDQuNjg0LTE4LjQwOC00Mi42MDYgMjMuMTUxLjQ0MiA4Ljg0MiAxMi42NzIgNjYuODk5IDI3LjI2IDQ5LjM2MyA1LjMzMi02LjQxMiAxMC40ODMtMTEuODM0IDEwLjQ4My0xMS44MzQgMi41NTkgMS42OTkgNS42MjIgMi41NjcgOC44MzMgMi4yNTVsLjI1LS4yMTJjLS4wNzguNzk2LS4wNDIgMS41NzUuMSAyLjQ5Ny0zLjc1OCA0LjE5OS0yLjY1NCA0LjkzNi0xMC4xNjcgNi40ODItNy42MDIgMS41NjYtMy4xMzYgNC4zNTUtLjIyIDUuMDg0IDMuNTM0Ljg4NCAxMS43MTIgMi4xMzYgMTcuMjM3LTUuNTk4bC0uMjIxLjg4MmMxLjQ3MyAxLjE4IDIuNTA3IDcuNjcyIDIuMzM0IDEzLjU1Ny0uMTc0IDUuODg1LS4yOSA5LjkyNi44NzEgMTMuMDgyIDEuMTYgMy4xNTYgMi4zMTYgMTAuMjU2IDEyLjE5MiA4LjE0IDguMjUyLTEuNzY4IDEyLjUyOC02LjM1MSAxMy4xMjQtMTMuOTk1LjQyMi01LjQzNSAxLjM3Ny00LjYzMSAxLjQzOC05LjQ5bC43NjctMi4zYy44ODQtNy4zNjcuMTQtOS43NDMgNS4yMjUtOC42MzhsMS4yMzUuMTA4YzMuNzQyLjE3IDguNjM5LS42MDIgMTEuNTE0LTEuOTM4IDYuMTktMi44NzEgOS44NjEtNy42NjcgMy43NTgtNi40MDh6IiBmaWxsPSIjMzM2NzkxIi8+PHBhdGggZD0iTTc1Ljk1NyAxMjIuMzA3Yy04LjIzMiAwLTEwLjg0LTYuNTE5LTExLjkwNy05LjE4NS0xLjU2Mi0zLjkwNy0xLjg5OS0xOS4wNjktMS41NTEtMzEuNTAzYTEuNTkgMS41OSAwIDAxMS42NC0xLjU1IDEuNTk0IDEuNTk0IDAgMDExLjU1IDEuNjM5Yy0uNDAxIDE0LjM0MS4xNjggMjcuMzM3IDEuMzI0IDMwLjIyOSAxLjgwNCA0LjUwOSA0LjU0IDguNDUzIDEyLjI3NSA2Ljc5NiA3LjM0My0xLjU3NSAxMC4wOTMtNC4zNTkgMTEuMzE4LTExLjQ2Ljk0LTUuNDQ5IDIuNzk5LTIwLjk1MSAzLjAyOC0yNC4wMWExLjU5MyAxLjU5MyAwIDAxMS43MS0xLjQ3MiAxLjU5NyAxLjU5NyAwIDAxMS40NzIgMS43MWMtLjIzOSAzLjE4NS0yLjA4OSAxOC42NTctMy4wNjUgMjQuMzE1LTEuNDQ2IDguMzg3LTUuMTg1IDEyLjE5MS0xMy43OTQgMTQuMDM3LTEuNDYzLjMxMy0yLjc5Mi40NTMtNCAuNDU0ek0zMS4zMjEgOTAuNDY2YTYuNzEgNi43MSAwIDAxLTIuMTE2LS4zNWMtNS4zNDctMS43ODQtMTAuNDQtMTAuNDkyLTE1LjEzOC0yNS44ODUtMy41NzYtMTEuNzE3LTUuODQyLTIzLjk0Ny02LjA0MS0yNy45MjItLjU4OS0xMS43ODQgMi40NDUtMjAuMTIxIDkuMDItMjQuNzc4IDEzLjAwNy05LjIxNiAzNC44ODgtLjQ0IDM1LjgxMy0uMDYyYTEuNTk2IDEuNTk2IDAgMDEtMS4yMDcgMi45NTVjLS4yMTEtLjA4Ni0yMS4xOTMtOC40OTItMzIuNzY4LS4yODUtNS42MjIgMy45ODYtOC4yMDMgMTEuMzkyLTcuNjcyIDIyLjAxMS4xNjcgMy4zNDkgMi4yODQgMTUuMjg1IDUuOTA2IDI3LjE0OSA0LjE5NCAxMy43NDIgOC45NjcgMjIuNDEzIDEzLjA5NiAyMy43OS42NDguMjE2IDIuNjIuODczIDUuNDM5LTIuNTE3QTI0NS4yNzIgMjQ1LjI3MiAwIDAxNDUuODggNzMuMDQ2YTEuNTk2IDEuNTk2IDAgMDEyLjMwNCAyLjIwOGMtLjA0OC4wNS00Ljg0NyA1LjA2Ny0xMC4wNzcgMTEuMzU5LTIuNDc3IDIuOTc5LTQuODUxIDMuODUzLTYuNzg2IDMuODUzem02OS40MjktMTMuNDQ1YTEuNTk2IDEuNTk2IDAgMDEtMS4zMjItMi40ODdjMTQuODYzLTIyLjA1NSAyMC4wOC00OC43MDQgMTUuNjEyLTU0LjQxNC01LjYyNC03LjE4Ni0xMy41NjUtMTAuOTM5LTIzLjYwNC0xMS4xNTYtNy40MzMtLjE2LTEzLjM0MSAxLjczOC0xNC4zMDcgMi4wNjlsLS4yNDMuMDk5Yy0uOTcxLjMwNS0xLjcxNi0uMjI3LTEuOTk3LS44NDlhMS42IDEuNiAwIDAxLjYzMS0yLjAyNWMuMDQ2LS4wMjcuMTkyLS4wODkuNDI5LS4xNzZsLS4wMjEuMDA2LjAyMS0uMDA3YzEuNjQxLS42MDEgNy42MzktMi40IDE1LjA2OC0yLjMxNSAxMS4xMDguMTE4IDIwLjI4NCA0LjQwMSAyNi41MzQgMTIuMzg4IDIuOTU3IDMuNzc5IDIuOTY0IDEyLjQ4NS4wMTkgMjMuODg3LTMuMDAyIDExLjYyNS04LjY1MSAyNC4xMTgtMTUuNDk3IDM0LjI3Ny0uMzA2LjQ1Ny0uODEuNzAzLTEuMzIzLjcwM3ptLjc2IDEwLjIxYy0yLjUzOCAwLTQuODEzLS4zNTgtNi4xNzUtMS4xNzQtMS40LS44MzktMS42NjctMS45NzktMS43MDItMi41ODQtLjM4Mi02LjcxIDMuMzItNy44NzggNS4yMDgtOC40MTEtLjI2My0uMzk4LS42MzctLjg2Ni0xLjAyNC0xLjM0OS0xLjEwMS0xLjM3Ni0yLjYwOS0zLjI2LTMuNzcxLTYuMDc4LS4xODItLjQ0LS43NTItMS40NjMtMS40MTItMi42NDgtMy41NzktNi40MTgtMTEuMDI2LTE5Ljc3My02LjI0Mi0yNi42MTIgMi4yMTQtMy4xNjUgNi42MjMtNC40MTEgMTMuMTE5LTMuNzE2Qzk3LjYgMjguODM3IDg4LjUgMTAuNjI1IDY2LjkwNyAxMC4yNzFjLTYuNDk0LS4xMDgtMTEuODIgMS44ODktMTUuODIyIDUuOTMtOC45NiA5LjA0OS04LjYzNiAyNS40MjItOC42MzEgMjUuNTg2YTEuNTk1IDEuNTk1IDAgMTEtMy4xOS4wODRjLS4wMi0uNzI3LS4zNTQtMTcuOTA5IDkuNTU0LTI3LjkxNkM1My40NTUgOS4yNzIgNTkuNTU5IDYuOTYgNjYuOTYgNy4wODFjMTMuODE0LjIyNyAyMi43MDYgNy4yNSAyNy43MzIgMTMuMTAxIDUuNDc5IDYuMzc3IDguMTY1IDEzLjQxMSA4LjM4NiAxNS43NTkuMTY1IDEuNzQ2LTEuMDg4IDIuMDk1LTEuMzQxIDIuMTQ3bC0uNTc2LjAxM2MtNi4zNzUtMS4wMjEtMTAuNDY1LS4zMTItMTIuMTU2IDIuMTA0LTMuNjM5IDUuMjAxIDMuNDA2IDE3LjgzNCA2LjQxNCAyMy4yMjkuNzY4IDEuMzc2IDEuMzIyIDIuMzcxIDEuNTc2IDIuOTg1Ljk4OCAyLjM5NiAyLjI3NyA0LjAwNiAzLjMxMiA1LjMuOTExIDEuMTM4IDEuNyAyLjEyNSAxLjk4MiAzLjI4My4xMzEuMjMgMS45OSAyLjk4IDEzLjAyMS43MDMgMi43NjUtLjU3IDQuNDIzLS4wODMgNC45MyAxLjQ1Ljk5NyAzLjAxNS00LjU5NyA2LjUzMi03LjY5NCA3Ljk3LTIuNzc1IDEuMjktNy4yMDQgMi4xMDYtMTEuMDM2IDIuMTA2em0tNC42OTYtNC4wMjFjLjM1LjM1MyAyLjEwMS45NjIgNS43MjcuODA2IDMuMjI0LS4xMzggNi42MjQtLjgzOSA4LjY2NC0xLjc4NiAyLjYwOS0xLjIxMiA0LjM1MS0yLjU2NyA1LjI1My0zLjQ5MmwtLjUuMDkyYy03LjA1MyAxLjQ1Ni0xMi4wNDIgMS4yNjItMTQuODI4LS41NzdhNi4xNjIgNi4xNjIgMCAwMS0uNTQtLjQwMWMtLjMwMi4xMTktLjU4MS4xOTctLjc4LjI1My0xLjU4LjQ0My0zLjIxNC45MDItMi45OTYgNS4xMDV6bS00NS41NjIgOC45MTVjLTEuNzUyIDAtMy41OTYtLjIzOS01LjQ3OS0uNzEtMS45NTEtLjQ4OC01LjI0LTEuOTU3LTUuMTktNC4zNy4wNTctMi43MDcgMy45OTQtMy41MTkgNS40NzYtMy44MjQgNS4zNTQtMS4xMDMgNS43MDMtMS41NDUgNy4zNzYtMy42Ny40ODgtLjYxOSAxLjA5NS0xLjM5IDEuOTIzLTIuMzE0IDEuMjI5LTEuMzc2IDIuNTcyLTIuMDczIDMuOTkyLTIuMDczLjk4OSAwIDEuOC4zMzUgMi4zMzYuNTU4IDEuNzA4LjcwOCAzLjEzMyAyLjQyIDMuNzE5IDQuNDY3LjUyOSAxLjg0Ny4yNzYgMy42MjUtLjcxIDUuMDA2LTMuMjM3IDQuNTMzLTcuODg2IDYuOTMtMTMuNDQzIDYuOTN6bS03LjIyMi00Ljk0M2MuNDgxLjM3MiAxLjQ0NS44NjkgMi41MTggMS4xMzcgMS42MzEuNDA4IDMuMjEzLjYxNSA0LjcwNS42MTUgNC41NDYgMCA4LjE5Ni0xLjg4MiAxMC44NDctNS41OTQuNTUzLS43NzQuMzg3LTEuNzU3LjIzOS0yLjI3NC0uMzEtMS4wODMtMS4wOC0yLjA2OC0xLjg3My0yLjM5Ny0uNDMtLjE3OC0uNzg3LS4zMTQtMS4xMTUtLjMxNC0uMTc2IDAtLjcxMiAwLTEuNjE0IDEuMDA5YTQxLjE0NiA0MS4xNDYgMCAwMC0xLjc5NCAyLjE2MmMtMi4wODQgMi42NDYtMy4wMzkgMy41NDQtOS4yMzkgNC44MjEtMS41MTMuMzEtMi4yODkuNjI2LTIuNjc0LjgzNXptMTIuMjY5LTcuMzZhMS41OTYgMS41OTYgMCAwMS0xLjU3NS0xLjM1NCA4LjIxOCA4LjIxOCAwIDAxLS4wOC0uNzk5Yy00LjA2NC0uMDc2LTcuOTg1LTEuODItMTAuOTYyLTQuOTI2LTMuNzY0LTMuOTI3LTUuNDc3LTkuMzY4LTQuNjk5LTE0LjkyNy44NDUtNi4wMzcuNTI5LTExLjM2Ni4zNTktMTQuMjI5LS4wNDctLjc5Ni0uMDgxLTEuMzcxLS4wNzktMS43NjkuMD
gitextract_4va7s4qm/
├── .aspire/
│ └── settings.json
├── .config/
│ └── dotnet-tools.json
├── .dockerignore
├── .editorconfig
├── .gitattributes
├── .github/
│ ├── actions/
│ │ ├── build/
│ │ │ └── action.yml
│ │ ├── build-test/
│ │ │ └── action.yml
│ │ ├── docker-build-publish/
│ │ │ └── action.yml
│ │ └── test/
│ │ └── action.yml
│ ├── release-drafter.yml
│ └── workflows/
│ ├── ci.yml
│ └── release-drafter-labeler.yml
├── .gitignore
├── .husky/
│ ├── commit-msg
│ └── pre-commit
├── CONTRIBUTION.md
├── Directory.Build.props
├── LICENSE
├── README.md
├── assets/
│ ├── booking-microservices.drawio
│ └── vertical-slice-architecture.excalidraw
├── booking-microservices.sln
├── booking.rest
├── commitlint.config.js
├── deployments/
│ ├── configs/
│ │ ├── dashboards.md
│ │ ├── grafana/
│ │ │ ├── dashboards/
│ │ │ │ ├── dotnet-core-endpoint.json
│ │ │ │ ├── dotnet-core.json
│ │ │ │ ├── node-exporter.json
│ │ │ │ ├── postgresql.json
│ │ │ │ └── rabbitmq.json
│ │ │ └── provisioning/
│ │ │ ├── dashboards/
│ │ │ │ └── dashboard.yml
│ │ │ └── datasources/
│ │ │ └── datasource.yml
│ │ ├── loki-config.yaml
│ │ ├── otel-collector-config.yaml
│ │ ├── prometheus.yaml
│ │ └── tempo.yaml
│ ├── docker-compose/
│ │ ├── docker-compose.infrastructure.yaml
│ │ └── docker-compose.yaml
│ └── kubernetes/
│ ├── booking-cert-manager.yml
│ └── booking-microservices.yml
├── global.json
├── package.json
├── scripts/
│ └── setup_kubectl_gitpod.sh
└── src/
├── ApiGateway/
│ ├── Dockerfile
│ └── src/
│ ├── ApiGateway.csproj
│ ├── Program.cs
│ ├── Properties/
│ │ └── launchSettings.json
│ ├── appsettings.Development.json
│ ├── appsettings.docker.json
│ └── appsettings.json
├── Aspire/
│ └── src/
│ ├── AppHost/
│ │ ├── AppHost.csproj
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ └── appsettings.json
│ └── ServiceDefaults/
│ ├── Extensions.cs
│ └── ServiceDefaults.csproj
├── BuildingBlocks/
│ ├── BuildingBlocks.csproj
│ ├── Caching/
│ │ ├── CachingBehavior.cs
│ │ ├── ICacheRequest.cs
│ │ ├── IInvalidateCacheRequest.cs
│ │ └── InvalidateCachingBehavior.cs
│ ├── Constants/
│ │ └── IdentityConstant.cs
│ ├── Contracts/
│ │ └── EventBus.Messages/
│ │ ├── FlighContracts.cs
│ │ ├── IdentityContracts.cs
│ │ ├── PassengerContracts.cs
│ │ └── ReservationContracts.cs
│ ├── Core/
│ │ ├── CQRS/
│ │ │ ├── ICommand.cs
│ │ │ ├── ICommandHandler.cs
│ │ │ ├── IQuery.cs
│ │ │ └── IQueryHandler.cs
│ │ ├── CompositeEventMapper.cs
│ │ ├── Event/
│ │ │ ├── EventType.cs
│ │ │ ├── IDomainEvent.cs
│ │ │ ├── IEvent.cs
│ │ │ ├── IHaveIntegrationEvent.cs
│ │ │ ├── IIntegrationEvent.cs
│ │ │ ├── IInternalCommand.cs
│ │ │ ├── InternalCommand.cs
│ │ │ └── MessageEnvelope.cs
│ │ ├── EventDispatcher.cs
│ │ ├── IEventDispatcher.cs
│ │ ├── IEventMapper.cs
│ │ ├── IntegrationEventWrapper.cs
│ │ ├── Model/
│ │ │ ├── Aggregate.cs
│ │ │ ├── Entity.cs
│ │ │ ├── IAggregate.cs
│ │ │ ├── IEntity.cs
│ │ │ └── IVersion.cs
│ │ └── Pagination/
│ │ ├── Extensions.cs
│ │ ├── IPageList.cs
│ │ ├── IPageQuery.cs
│ │ ├── IPageRequest.cs
│ │ └── PageList.cs
│ ├── EFCore/
│ │ ├── AppDbContextBase.cs
│ │ ├── DesignTimeDbContextFactoryBase.cs
│ │ ├── EfTxBehavior.cs
│ │ ├── Extensions.cs
│ │ ├── IDataSeeder.cs
│ │ ├── IDbContext.cs
│ │ ├── ISeedManager.cs
│ │ ├── PostgresOptions.cs
│ │ └── SeedManagers.cs
│ ├── EventStoreDB/
│ │ ├── BackgroundWorkers/
│ │ │ └── BackgroundWorker.cs
│ │ ├── Config.cs
│ │ ├── Events/
│ │ │ ├── AggregateEventSourcing.cs
│ │ │ ├── AggregateStreamExtensions.cs
│ │ │ ├── EventTypeMapper.cs
│ │ │ ├── IAggregateEventSourcing.cs
│ │ │ ├── IEventHandler.cs
│ │ │ ├── IExternalEvent.cs
│ │ │ ├── IProjection.cs
│ │ │ ├── StreamEvent.cs
│ │ │ ├── StreamEventExtensions.cs
│ │ │ └── StreamNameMapper.cs
│ │ ├── Extensions.cs
│ │ ├── Projections/
│ │ │ ├── IProjectionProcessor.cs
│ │ │ ├── IProjectionPublisher.cs
│ │ │ └── ProjectionPublisher.cs
│ │ ├── Repository/
│ │ │ ├── EventStoreDBRepository.cs
│ │ │ └── RepositoryExtensions.cs
│ │ ├── Serialization/
│ │ │ ├── EventStoreDBSerializer.cs
│ │ │ ├── JsonObjectContractProvider.cs
│ │ │ ├── NonDefaultConstructorContractResolver.cs
│ │ │ └── SerializationExtensions.cs
│ │ └── Subscriptions/
│ │ ├── EventStoreDBSubscriptionCheckpointRepository.cs
│ │ ├── EventStoreDBSubscriptionToAll.cs
│ │ ├── ISubscriptionCheckpointRepository.cs
│ │ └── InMemorySubscriptionCheckpointRepository.cs
│ ├── Exception/
│ │ ├── AggregateNotFoundException.cs
│ │ ├── AppException.cs
│ │ ├── BadRequestException.cs
│ │ ├── ConflictException.cs
│ │ ├── CustomException.cs
│ │ ├── DomainException.cs
│ │ ├── GrpcExceptionInterceptor.cs
│ │ ├── InternalServerException.cs
│ │ ├── NotFoundException.cs
│ │ ├── ProblemDetailsWithCode.cs
│ │ └── ValidationException.cs
│ ├── HealthCheck/
│ │ ├── Extensions.cs
│ │ └── HealthOptions.cs
│ ├── Jwt/
│ │ ├── AuthHeaderHandler.cs
│ │ └── JwtExtensions.cs
│ ├── Logging/
│ │ └── LoggingBehavior.cs
│ ├── Mapster/
│ │ └── Extensions.cs
│ ├── MassTransit/
│ │ ├── ConsumeFilter.cs
│ │ ├── Extensions.cs
│ │ ├── RabbitMqOptions.cs
│ │ └── TransportType.cs
│ ├── Mongo/
│ │ ├── Extensions.cs
│ │ ├── IMongoDbContext.cs
│ │ ├── IMongoRepository.cs
│ │ ├── IMongoUnitOfWork.cs
│ │ ├── IRepository.cs
│ │ ├── ITransactionAble.cs
│ │ ├── IUnitOfWork.cs
│ │ ├── ImmutablePocoConvention.cs
│ │ ├── MicroBootstrap.Persistence.Mongo.csproj
│ │ ├── MongoDbContext.cs
│ │ ├── MongoOptions.cs
│ │ ├── MongoRepository.cs
│ │ └── MongoUnitOfWork.cs
│ ├── OpenApi/
│ │ ├── Extensions.cs
│ │ └── SecuritySchemeDocumentTransformer.cs
│ ├── OpenTelemetryCollector/
│ │ ├── ActivityExtensions.cs
│ │ ├── ActivityInfo.cs
│ │ ├── Behaviors/
│ │ │ └── ObservabilityPipelineBehavior.cs
│ │ ├── CoreDiagnostics/
│ │ │ ├── Commands/
│ │ │ │ ├── CommandHandlerActivity.cs
│ │ │ │ └── CommandHandlerMetrics.cs
│ │ │ └── Query/
│ │ │ ├── QueryHandlerActivity.cs
│ │ │ └── QueryHandlerMetrics.cs
│ │ ├── CreateActivityInfo.cs
│ │ ├── DiagnosticsProvider/
│ │ │ ├── CustomeDiagnosticsProvider.cs
│ │ │ └── IDiagnosticsProvider.cs
│ │ ├── Extensions.cs
│ │ ├── ObservabilityConstant.cs
│ │ ├── ObservabilityOptions.cs
│ │ └── TelemetryTags.cs
│ ├── PersistMessageProcessor/
│ │ ├── Extensions.cs
│ │ ├── IPersistMessageDbContext.cs
│ │ ├── IPersistMessageProcessor.cs
│ │ ├── MessageDeliveryType.cs
│ │ ├── MessageStatus.cs
│ │ ├── PersistMessage.cs
│ │ ├── PersistMessageBackgroundService.cs
│ │ ├── PersistMessageDbContext.cs
│ │ ├── PersistMessageOptions.cs
│ │ └── PersistMessageProcessor.cs
│ ├── Polly/
│ │ └── Extensions.cs
│ ├── ProblemDetails/
│ │ └── Extensions.cs
│ ├── TestBase/
│ │ ├── TestBase.cs
│ │ └── TestContainers.cs
│ ├── Utils/
│ │ ├── NoSynchronizationContextScope.cs
│ │ ├── ServiceLocator.cs
│ │ └── TypeProvider.cs
│ ├── Validation/
│ │ ├── Extensions.cs
│ │ ├── ValidationBehavior.cs
│ │ ├── ValidationError.cs
│ │ └── ValidationResultModel.cs
│ └── Web/
│ ├── ApiVersioningExtensions.cs
│ ├── AppOptions.cs
│ ├── BaseController.cs
│ ├── ConfigurationExtensions.cs
│ ├── ConfigurationHelper.cs
│ ├── CorrelationExtensions.cs
│ ├── CurrentUserProvider.cs
│ ├── EndpointConfig.cs
│ ├── IMinimalEndpoint.cs
│ ├── MinimalApiExtensions.cs
│ ├── ServiceCollectionExtensions.cs
│ ├── ServiceProviderExtensions.cs
│ └── SlugifyParameterTransformer.cs
└── Services/
├── Booking/
│ ├── Dockerfile
│ ├── src/
│ │ ├── Booking/
│ │ │ ├── AssemblyInfo.cs
│ │ │ ├── Booking/
│ │ │ │ ├── Dtos/
│ │ │ │ │ └── CreateReservation.cs
│ │ │ │ ├── Exceptions/
│ │ │ │ │ ├── BookingAlreadyExistException.cs
│ │ │ │ │ ├── FlightNotFoundException.cs
│ │ │ │ │ ├── InvalidAircraftIdException.cs
│ │ │ │ │ ├── InvalidArriveAirportIdException.cs
│ │ │ │ │ ├── InvalidDepartureAirportIdException.cs
│ │ │ │ │ ├── InvalidFlightDateException.cs
│ │ │ │ │ ├── InvalidFlightNumberException.cs
│ │ │ │ │ ├── InvalidPassengerNameException.cs
│ │ │ │ │ ├── InvalidPriceException.cs
│ │ │ │ │ └── SeatNumberException.cs
│ │ │ │ ├── Features/
│ │ │ │ │ ├── BookingMappings.cs
│ │ │ │ │ └── CreatingBook/
│ │ │ │ │ └── V1/
│ │ │ │ │ └── CreateBooking.cs
│ │ │ │ ├── Models/
│ │ │ │ │ ├── Booking.cs
│ │ │ │ │ └── BookingReadModel.cs
│ │ │ │ └── ValueObjects/
│ │ │ │ ├── PassengerInfo.cs
│ │ │ │ └── Trip.cs
│ │ │ ├── Booking.csproj
│ │ │ ├── BookingEventMapper.cs
│ │ │ ├── BookingProjection.cs
│ │ │ ├── BookingRoot.cs
│ │ │ ├── Configuration/
│ │ │ │ └── GrpcOptions.cs
│ │ │ ├── Data/
│ │ │ │ └── BookingReadDbContext.cs
│ │ │ ├── Extensions/
│ │ │ │ └── Infrastructure/
│ │ │ │ ├── GrpcClientExtensions.cs
│ │ │ │ ├── InfrastructureExtensions.cs
│ │ │ │ └── MediatRExtensions.cs
│ │ │ └── GrpcClient/
│ │ │ └── Protos/
│ │ │ ├── flight.proto
│ │ │ └── passenger.proto
│ │ └── Booking.Api/
│ │ ├── Booking.Api.csproj
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.docker.json
│ │ ├── appsettings.json
│ │ └── appsettings.test.json
│ └── tests/
│ ├── IntegrationTest/
│ │ ├── Booking/
│ │ │ └── Features/
│ │ │ └── CreateBookingTests.cs
│ │ ├── BookingIntegrationTestBase.cs
│ │ ├── Fakes/
│ │ │ ├── FakeCreateBookingCommand.cs
│ │ │ ├── FakeFlightResponse.cs
│ │ │ ├── FakeGetAvailableSeatsResponse.cs
│ │ │ ├── FakePassengerResponse.cs
│ │ │ └── FakeReserveSeatResponse.cs
│ │ ├── Integration.Test.csproj
│ │ └── xunit.runner.json
│ ├── PerformanceTest/
│ │ ├── .openapi-generator/
│ │ │ ├── FILES
│ │ │ └── VERSION
│ │ ├── .openapi-generator-ignore
│ │ ├── README.md
│ │ └── script.js
│ └── tests.sln
├── Flight/
│ ├── Dockerfile
│ ├── src/
│ │ ├── Flight/
│ │ │ ├── Aircrafts/
│ │ │ │ ├── Dtos/
│ │ │ │ │ └── AircraftDto.cs
│ │ │ │ ├── Exceptions/
│ │ │ │ │ ├── AircraftAlreadyExistException.cs
│ │ │ │ │ ├── InvalidAircraftIdException.cs
│ │ │ │ │ ├── InvalidManufacturingYearException.cs
│ │ │ │ │ ├── InvalidModelException.cs
│ │ │ │ │ └── InvalidNameException.cs
│ │ │ │ ├── Features/
│ │ │ │ │ ├── AircraftMappings.cs
│ │ │ │ │ └── CreatingAircraft/
│ │ │ │ │ └── V1/
│ │ │ │ │ ├── CreateAircraft.cs
│ │ │ │ │ └── CreateAircraftMongo.cs
│ │ │ │ ├── Models/
│ │ │ │ │ ├── Aircraft.cs
│ │ │ │ │ └── AircraftReadModel.cs
│ │ │ │ └── ValueObjects/
│ │ │ │ ├── AircraftId.cs
│ │ │ │ ├── ManufacturingYear.cs
│ │ │ │ ├── Model.cs
│ │ │ │ └── Name.cs
│ │ │ ├── Airports/
│ │ │ │ ├── Dtos/
│ │ │ │ │ └── AirportDto.cs
│ │ │ │ ├── Exceptions/
│ │ │ │ │ ├── AirportAlreadyExistException.cs
│ │ │ │ │ ├── InvalidAddressException.cs
│ │ │ │ │ ├── InvalidAirportIdException.cs
│ │ │ │ │ ├── InvalidCodeException.cs
│ │ │ │ │ └── InvalidNameException.cs
│ │ │ │ ├── Features/
│ │ │ │ │ ├── AirportMappings.cs
│ │ │ │ │ └── CreatingAirport/
│ │ │ │ │ └── V1/
│ │ │ │ │ ├── CreateAirport.cs
│ │ │ │ │ └── CreateAirportMongo.cs
│ │ │ │ ├── Models/
│ │ │ │ │ ├── Airport.cs
│ │ │ │ │ └── AirportReadModel.cs
│ │ │ │ └── ValueObjects/
│ │ │ │ ├── Address.cs
│ │ │ │ ├── AirportId.cs
│ │ │ │ ├── Code.cs
│ │ │ │ └── Name.cs
│ │ │ ├── AssemblyInfo.cs
│ │ │ ├── Data/
│ │ │ │ ├── Configurations/
│ │ │ │ │ ├── AircraftConfiguration.cs
│ │ │ │ │ ├── AirportConfiguration.cs
│ │ │ │ │ ├── FlightConfiguration.cs
│ │ │ │ │ └── SeatConfiguration.cs
│ │ │ │ ├── DesignTimeDbContextFactory.cs
│ │ │ │ ├── FlightDbContext.cs
│ │ │ │ ├── FlightReadDbContext.cs
│ │ │ │ ├── Migrations/
│ │ │ │ │ ├── 20230611230948_initial.Designer.cs
│ │ │ │ │ ├── 20230611230948_initial.cs
│ │ │ │ │ └── FlightDbContextModelSnapshot.cs
│ │ │ │ ├── Seed/
│ │ │ │ │ ├── FlightDataSeeder.cs
│ │ │ │ │ └── InitialData.cs
│ │ │ │ └── readme.md
│ │ │ ├── Extensions/
│ │ │ │ └── Infrastructure/
│ │ │ │ ├── InfrastructureExtensions.cs
│ │ │ │ └── MediatRExtensions.cs
│ │ │ ├── Flight.csproj
│ │ │ ├── FlightEventMapper.cs
│ │ │ ├── FlightRoot.cs
│ │ │ ├── Flights/
│ │ │ │ ├── Dtos/
│ │ │ │ │ └── FlightDto.cs
│ │ │ │ ├── Enums/
│ │ │ │ │ └── FlightStatus.cs
│ │ │ │ ├── Exceptions/
│ │ │ │ │ ├── FlightAlreadyExistException.cs
│ │ │ │ │ ├── FlightNotFountException.cs
│ │ │ │ │ ├── InvalidArriveDateException.cs
│ │ │ │ │ ├── InvalidDepartureDateException.cs
│ │ │ │ │ ├── InvalidDurationException.cs
│ │ │ │ │ ├── InvalidFlightDateException.cs
│ │ │ │ │ ├── InvalidFlightIdException.cs
│ │ │ │ │ ├── InvalidFlightNumberException.cs
│ │ │ │ │ └── InvalidPriceException.cs
│ │ │ │ ├── Features/
│ │ │ │ │ ├── CreatingFlight/
│ │ │ │ │ │ └── V1/
│ │ │ │ │ │ ├── CreateFlight.cs
│ │ │ │ │ │ └── CreateFlightMongo.cs
│ │ │ │ │ ├── DeletingFlight/
│ │ │ │ │ │ └── V1/
│ │ │ │ │ │ ├── DeleteFlight.cs
│ │ │ │ │ │ └── DeleteFlightMongo.cs
│ │ │ │ │ ├── FlightMappings.cs
│ │ │ │ │ ├── GettingAvailableFlights/
│ │ │ │ │ │ └── V1/
│ │ │ │ │ │ └── GetAvailableFlights.cs
│ │ │ │ │ ├── GettingFlightById/
│ │ │ │ │ │ └── V1/
│ │ │ │ │ │ └── GetFlightById.cs
│ │ │ │ │ └── UpdatingFlight/
│ │ │ │ │ └── V1/
│ │ │ │ │ ├── UpdateFlight.cs
│ │ │ │ │ └── UpdateFlightMongo.cs
│ │ │ │ ├── Models/
│ │ │ │ │ ├── Flight.cs
│ │ │ │ │ └── FlightReadModel.cs
│ │ │ │ └── ValueObjects/
│ │ │ │ ├── ArriveDate.cs
│ │ │ │ ├── DepartureDate.cs
│ │ │ │ ├── DurationMinutes.cs
│ │ │ │ ├── FlightDate.cs
│ │ │ │ ├── FlightId.cs
│ │ │ │ ├── FlightNumber.cs
│ │ │ │ └── Price.cs
│ │ │ ├── GrpcServer/
│ │ │ │ ├── Protos/
│ │ │ │ │ └── flight.proto
│ │ │ │ └── Services/
│ │ │ │ └── FlightGrpcServices.cs
│ │ │ └── Seats/
│ │ │ ├── Dtos/
│ │ │ │ └── SeatDto.cs
│ │ │ ├── Enums/
│ │ │ │ ├── SeatClass.cs
│ │ │ │ └── SeatType.cs
│ │ │ ├── Exceptions/
│ │ │ │ ├── AllSeatsFullException.cs
│ │ │ │ ├── InvalidSeatIdException.cs
│ │ │ │ ├── InvalidSeatNumberException.cs
│ │ │ │ ├── SeatAlreadyExistException.cs
│ │ │ │ └── SeatNumberIncorrectException.cs
│ │ │ ├── Features/
│ │ │ │ ├── CreatingSeat/
│ │ │ │ │ └── V1/
│ │ │ │ │ ├── CreateSeat.cs
│ │ │ │ │ └── CreateSeatMongo.cs
│ │ │ │ ├── GettingAvailableSeats/
│ │ │ │ │ └── V1/
│ │ │ │ │ └── GetAvailableSeats.cs
│ │ │ │ ├── ReservingSeat/
│ │ │ │ │ └── V1/
│ │ │ │ │ ├── ReserveSeat.cs
│ │ │ │ │ └── ReserveSeatMongo.cs
│ │ │ │ └── SeatMappings.cs
│ │ │ ├── Models/
│ │ │ │ ├── Seat.cs
│ │ │ │ └── SeatReadModel.cs
│ │ │ └── ValueObjects/
│ │ │ ├── SeatId.cs
│ │ │ └── SeatNumber.cs
│ │ └── Flight.Api/
│ │ ├── Flight.Api.csproj
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.docker.json
│ │ ├── appsettings.json
│ │ └── appsettings.test.json
│ └── tests/
│ ├── EndToEndTest/
│ │ ├── EndToEnd.Test.csproj
│ │ ├── Fakes/
│ │ │ ├── FakeCreateFlightCommand.cs
│ │ │ └── FakeCreateFlightMongoCommand.cs
│ │ ├── Flight/
│ │ │ └── Features/
│ │ │ ├── CreateFlightTests.cs
│ │ │ └── GetFlightByIdTests.cs
│ │ ├── FlightEndToEndTestBase.cs
│ │ ├── FlightTestDataSeeder.cs
│ │ ├── Routes/
│ │ │ └── ApiRoutes.cs
│ │ └── xunit.runner.json
│ ├── IntegrationTest/
│ │ ├── Aircraft/
│ │ │ └── Features/
│ │ │ └── CreateAircraftTests.cs
│ │ ├── Airport/
│ │ │ └── Features/
│ │ │ └── CreateAirportTests.cs
│ │ ├── Fakes/
│ │ │ ├── FakeCreateAircraftCommand.cs
│ │ │ ├── FakeCreateAirportCommand.cs
│ │ │ ├── FakeCreateFlightCommand.cs
│ │ │ ├── FakeCreateFlightMongoCommand.cs
│ │ │ ├── FakeCreateSeatCommand.cs
│ │ │ ├── FakeCreateSeatMongoCommand.cs
│ │ │ └── FakeUpdateFlightCommand.cs
│ │ ├── Flight/
│ │ │ └── Features/
│ │ │ ├── CreateFlightTests.cs
│ │ │ ├── DeleteFlightTests.cs
│ │ │ ├── GetAvailableFlightsTests.cs
│ │ │ ├── GetFlightByIdTests.cs
│ │ │ └── UpdateFlightTests.cs
│ │ ├── FlightIntegrationTestBase.cs
│ │ ├── FlightTestDataSeeder.cs
│ │ ├── Integration.Test.csproj
│ │ ├── Seat/
│ │ │ └── Features/
│ │ │ ├── GetAvailableSeatsTests.cs
│ │ │ └── ReserveSeatTests.cs
│ │ └── xunit.runner.json
│ ├── PerformanceTest/
│ │ ├── .openapi-generator/
│ │ │ ├── FILES
│ │ │ └── VERSION
│ │ ├── .openapi-generator-ignore
│ │ ├── README.md
│ │ └── script.js
│ ├── UnitTest/
│ │ ├── Aircraft/
│ │ │ └── Features/
│ │ │ └── CreateAircraftTests/
│ │ │ ├── CreateAircraftCommandHandlerTests.cs
│ │ │ └── CreateAircraftCommandValidatorTests.cs
│ │ ├── Airport/
│ │ │ └── Features/
│ │ │ └── CreateAirportTests/
│ │ │ ├── CreateAirportCommandHandlerTests.cs
│ │ │ └── CreateAirportCommandValidatorTests.cs
│ │ ├── Common/
│ │ │ ├── DbContextFactory.cs
│ │ │ ├── MapperFactory.cs
│ │ │ └── UnitTestFixture.cs
│ │ ├── Fakes/
│ │ │ ├── FakeCreateAircraftCommand.cs
│ │ │ ├── FakeCreateAirportCommand.cs
│ │ │ ├── FakeCreateFlightCommand.cs
│ │ │ ├── FakeCreateSeatCommand.cs
│ │ │ ├── FakeFlightCreate.cs
│ │ │ ├── FakeFlightUpdate.cs
│ │ │ ├── FakeValidateCreateAircraftCommand.cs
│ │ │ ├── FakeValidateCreateAirportCommand.cs
│ │ │ ├── FakeValidateCreateFlightCommand.cs
│ │ │ └── FakeValidateCreateSeatCommand.cs
│ │ ├── Flight/
│ │ │ ├── Features/
│ │ │ │ ├── Domains/
│ │ │ │ │ ├── CreateFlightTests.cs
│ │ │ │ │ └── UpdateFlightTests.cs
│ │ │ │ └── Handlers/
│ │ │ │ └── CreateFlight/
│ │ │ │ ├── CreateFlightCommandHandlerTests.cs
│ │ │ │ └── CreateFlightCommandValidatorTests.cs
│ │ │ └── FlightMappingTests.cs
│ │ ├── Seat/
│ │ │ ├── Features/
│ │ │ │ ├── CreateSeatCommandHandlerTests.cs
│ │ │ │ └── CreateSeatCommandValidatorTests.cs
│ │ │ └── SeatMappingTests.cs
│ │ ├── Unit.Test.csproj
│ │ └── xunit.runner.json
│ └── tests.sln
├── Identity/
│ ├── Dockerfile
│ ├── src/
│ │ ├── Identity/
│ │ │ ├── AssemblyInfo.cs
│ │ │ ├── Configurations/
│ │ │ │ ├── AuthOptions.cs
│ │ │ │ ├── Config.cs
│ │ │ │ └── UserValidator.cs
│ │ │ ├── Data/
│ │ │ │ ├── Configurations/
│ │ │ │ │ ├── RoleClaimConfiguration.cs
│ │ │ │ │ ├── RoleConfiguration.cs
│ │ │ │ │ ├── UserClaimConfiguration.cs
│ │ │ │ │ ├── UserConfiguration.cs
│ │ │ │ │ ├── UserLoginConfiguration.cs
│ │ │ │ │ ├── UserRoleConfiguration.cs
│ │ │ │ │ └── UserTokenConfiguration.cs
│ │ │ │ ├── DesignTimeDbContextFactory.cs
│ │ │ │ ├── IdentityContext.cs
│ │ │ │ ├── Migrations/
│ │ │ │ │ ├── 20230331193410_initial.Designer.cs
│ │ │ │ │ ├── 20230331193410_initial.cs
│ │ │ │ │ └── IdentityContextModelSnapshot.cs
│ │ │ │ ├── Seed/
│ │ │ │ │ ├── IdentityDataSeeder.cs
│ │ │ │ │ └── InitialData.cs
│ │ │ │ └── readme.md
│ │ │ ├── Extensions/
│ │ │ │ └── Infrastructure/
│ │ │ │ ├── IdentityServerExtensions.cs
│ │ │ │ ├── InfrastructureExtensions.cs
│ │ │ │ └── MediatRExtensions.cs
│ │ │ ├── Identity/
│ │ │ │ ├── Constants/
│ │ │ │ │ └── Constants.cs
│ │ │ │ ├── Exceptions/
│ │ │ │ │ └── RegisterIdentityUserException.cs
│ │ │ │ ├── Features/
│ │ │ │ │ ├── IdentityMappings.cs
│ │ │ │ │ └── RegisteringNewUser/
│ │ │ │ │ └── V1/
│ │ │ │ │ └── RegisterNewUser.cs
│ │ │ │ └── Models/
│ │ │ │ ├── Role.cs
│ │ │ │ ├── RoleClaim.cs
│ │ │ │ ├── User.cs
│ │ │ │ ├── UserClaim.cs
│ │ │ │ ├── UserLogin.cs
│ │ │ │ ├── UserRole.cs
│ │ │ │ └── UserToken.cs
│ │ │ ├── Identity.csproj
│ │ │ ├── IdentityEventMapper.cs
│ │ │ └── IdentityRoot.cs
│ │ └── Identity.Api/
│ │ ├── Identity.Api.csproj
│ │ ├── Program.cs
│ │ ├── Properties/
│ │ │ └── launchSettings.json
│ │ ├── appsettings.Development.json
│ │ ├── appsettings.docker.json
│ │ ├── appsettings.json
│ │ ├── appsettings.test.json
│ │ └── keys/
│ │ ├── is-signing-key-0AC3347A09AA5E44E947F3E30ED54871.json
│ │ ├── is-signing-key-A57781A0405849BDE786A79636460E49.json
│ │ ├── is-signing-key-B3C31EEE2718D3C5004C6E85AD74F26C.json
│ │ └── is-signing-key-E1668D5B7CCDD18C610506FCA7C5D194.json
│ └── tests/
│ ├── IntegrationTest/
│ │ ├── Fakes/
│ │ │ └── FakeRegisterNewUserCommand.cs
│ │ ├── Identity/
│ │ │ └── Features/
│ │ │ └── RegisterNewUserTests.cs
│ │ ├── IdentityIntegrationTestBase.cs
│ │ ├── IdentityTestDataSeeder.cs
│ │ ├── Integration.Test.csproj
│ │ └── xunit.runner.json
│ ├── PerformanceTest/
│ │ ├── .openapi-generator/
│ │ │ ├── FILES
│ │ │ └── VERSION
│ │ ├── .openapi-generator-ignore
│ │ ├── README.md
│ │ └── script.js
│ └── tests.sln
└── Passenger/
├── Dockerfile
├── src/
│ ├── Passenger/
│ │ ├── AssemblyInfo.cs
│ │ ├── Data/
│ │ │ ├── Configurations/
│ │ │ │ └── PassengerConfiguration.cs
│ │ │ ├── DesignTimeDbContextFactory.cs
│ │ │ ├── Migrations/
│ │ │ │ ├── 20230611213031_initial.Designer.cs
│ │ │ │ ├── 20230611213031_initial.cs
│ │ │ │ └── PassengerDbContextModelSnapshot.cs
│ │ │ ├── PassengerDbContext.cs
│ │ │ ├── PassengerReadDbContext.cs
│ │ │ └── readme.md
│ │ ├── Exceptions/
│ │ │ ├── InvalidAgeException.cs
│ │ │ ├── InvalidNameException.cs
│ │ │ ├── InvalidPassengerIdException.cs
│ │ │ ├── InvalidPassportNumberException.cs
│ │ │ ├── PassengerAlreadyExist.cs
│ │ │ └── PassengerNotFoundException.cs
│ │ ├── Extensions/
│ │ │ └── Infrastructure/
│ │ │ ├── InfrastructureExtensions.cs
│ │ │ └── MediatRExtensions.cs
│ │ ├── GrpcServer/
│ │ │ ├── Protos/
│ │ │ │ └── passenger.proto
│ │ │ └── Services/
│ │ │ └── PassengerGrpcServices.cs
│ │ ├── Identity/
│ │ │ └── Consumers/
│ │ │ └── RegisteringNewUser/
│ │ │ └── V1/
│ │ │ ├── PassengerCreatedDomainEvent.cs
│ │ │ └── RegisterNewUser.cs
│ │ ├── Passenger.csproj
│ │ ├── PassengerEventMapper.cs
│ │ ├── PassengerRoot.cs
│ │ └── Passengers/
│ │ ├── Dtos/
│ │ │ └── PassengerDto.cs
│ │ ├── Enums/
│ │ │ └── PassengerType.cs
│ │ ├── Exceptions/
│ │ │ ├── InvalidAgeException.cs
│ │ │ ├── InvalidNameException.cs
│ │ │ ├── InvalidPassportNumberException.cs
│ │ │ ├── PassengerAlreadyExist.cs
│ │ │ └── PassengerNotFoundException.cs
│ │ ├── Features/
│ │ │ ├── CompletingRegisterPassenger/
│ │ │ │ └── V1/
│ │ │ │ ├── CompleteRegisterPassenger.cs
│ │ │ │ └── CompleteRegisterPassengerMongo.cs
│ │ │ ├── GettingPassengerById/
│ │ │ │ └── V1/
│ │ │ │ └── GetPassengerById.cs
│ │ │ └── PassengerMappings.cs
│ │ ├── Models/
│ │ │ ├── Passenger.cs
│ │ │ └── PassengerReadModel.cs
│ │ └── ValueObjects/
│ │ ├── Age.cs
│ │ ├── Name.cs
│ │ ├── PassengerId.cs
│ │ └── PassportNumber.cs
│ └── Passenger.Api/
│ ├── Passenger.Api.csproj
│ ├── Program.cs
│ ├── Properties/
│ │ └── launchSettings.json
│ ├── appsettings.Development.json
│ ├── appsettings.docker.json
│ ├── appsettings.json
│ └── appsettings.test.json
└── tests/
├── IntegrationTest/
│ ├── Fakes/
│ │ ├── FakeCompleteRegisterPassengerCommand.cs
│ │ └── FakeCompleteRegisterPassengerMongoCommand.cs
│ ├── Integration.Test.csproj
│ ├── Passenger/
│ │ └── Features/
│ │ ├── CompleteRegisterPassengerTests.cs
│ │ └── GetPassengerByIdTests.cs
│ ├── PassengerIntegrationTestBase.cs
│ └── xunit.runner.json
├── PerformanceTest/
│ ├── .openapi-generator/
│ │ ├── FILES
│ │ └── VERSION
│ ├── .openapi-generator-ignore
│ ├── README.md
│ └── script.js
└── tests.sln
SYMBOL INDEX (1317 symbols across 418 files)
FILE: src/Aspire/src/ServiceDefaults/Extensions.cs
class Extensions (line 9) | public static class Extensions
method AddServiceDefaults (line 11) | public static IHostApplicationBuilder AddServiceDefaults(this WebAppli...
method UseServiceDefaults (line 34) | public static WebApplication UseServiceDefaults(this WebApplication app)
FILE: src/BuildingBlocks/Caching/CachingBehavior.cs
class CachingBehavior (line 7) | public class CachingBehavior<TRequest, TResponse> : IPipelineBehavior<TR...
method CachingBehavior (line 15) | public CachingBehavior(IEasyCachingProviderFactory cachingFactory,
method Handle (line 22) | public async Task<TResponse> Handle(TRequest request, RequestHandlerDe...
FILE: src/BuildingBlocks/Caching/ICacheRequest.cs
type ICacheRequest (line 3) | public interface ICacheRequest
FILE: src/BuildingBlocks/Caching/IInvalidateCacheRequest.cs
type IInvalidateCacheRequest (line 3) | public interface IInvalidateCacheRequest
FILE: src/BuildingBlocks/Caching/InvalidateCachingBehavior.cs
class InvalidateCachingBehavior (line 7) | public class InvalidateCachingBehavior<TRequest, TResponse> : IPipelineB...
method InvalidateCachingBehavior (line 14) | public InvalidateCachingBehavior(IEasyCachingProviderFactory cachingFa...
method Handle (line 21) | public async Task<TResponse> Handle(TRequest request, RequestHandlerDe...
FILE: src/BuildingBlocks/Constants/IdentityConstant.cs
class IdentityConstant (line 3) | public static class IdentityConstant
class Role (line 5) | public static class Role
FILE: src/BuildingBlocks/Contracts/EventBus.Messages/FlighContracts.cs
type FlightCreated (line 5) | public record FlightCreated(Guid Id) : IIntegrationEvent;
type FlightUpdated (line 6) | public record FlightUpdated(Guid Id) : IIntegrationEvent;
type FlightDeleted (line 7) | public record FlightDeleted(Guid Id) : IIntegrationEvent;
type AircraftCreated (line 8) | public record AircraftCreated(Guid Id) : IIntegrationEvent;
type AirportCreated (line 9) | public record AirportCreated(Guid Id) : IIntegrationEvent;
type SeatCreated (line 10) | public record SeatCreated(Guid Id) : IIntegrationEvent;
type SeatReserved (line 11) | public record SeatReserved(Guid Id) : IIntegrationEvent;
FILE: src/BuildingBlocks/Contracts/EventBus.Messages/IdentityContracts.cs
type UserCreated (line 5) | public record UserCreated(Guid Id, string Name, string PassportNumber) :...
FILE: src/BuildingBlocks/Contracts/EventBus.Messages/PassengerContracts.cs
type PassengerRegistrationCompleted (line 5) | public record PassengerRegistrationCompleted(Guid Id) : IIntegrationEvent;
type PassengerCreated (line 6) | public record PassengerCreated(Guid Id) : IIntegrationEvent;
FILE: src/BuildingBlocks/Contracts/EventBus.Messages/ReservationContracts.cs
type BookingCreated (line 5) | public record BookingCreated(Guid Id) : IIntegrationEvent;
FILE: src/BuildingBlocks/Core/CQRS/ICommand.cs
type ICommand (line 5) | public interface ICommand : ICommand<Unit>
type ICommand (line 9) | public interface ICommand<out T> : IRequest<T>
FILE: src/BuildingBlocks/Core/CQRS/ICommandHandler.cs
type ICommandHandler (line 5) | public interface ICommandHandler<in TCommand> : ICommandHandler<TCommand...
type ICommandHandler (line 10) | public interface ICommandHandler<in TCommand, TResponse> : IRequestHandl...
FILE: src/BuildingBlocks/Core/CQRS/IQuery.cs
type IQuery (line 5) | public interface IQuery<out T> : IRequest<T>
FILE: src/BuildingBlocks/Core/CQRS/IQueryHandler.cs
type IQueryHandler (line 5) | public interface IQueryHandler<in TQuery, TResponse> : IRequestHandler<T...
FILE: src/BuildingBlocks/Core/CompositeEventMapper.cs
class CompositeEventMapper (line 5) | public class CompositeEventMapper : IEventMapper
method CompositeEventMapper (line 9) | public CompositeEventMapper(IEnumerable<IEventMapper> mappers)
method MapToIntegrationEvent (line 14) | public IIntegrationEvent? MapToIntegrationEvent(IDomainEvent @event)
method MapToInternalCommand (line 26) | public IInternalCommand? MapToInternalCommand(IDomainEvent @event)
FILE: src/BuildingBlocks/Core/Event/EventType.cs
type EventType (line 3) | [Flags]
FILE: src/BuildingBlocks/Core/Event/IDomainEvent.cs
type IDomainEvent (line 3) | public interface IDomainEvent : IEvent
FILE: src/BuildingBlocks/Core/Event/IEvent.cs
type IEvent (line 7) | public interface IEvent : INotification
FILE: src/BuildingBlocks/Core/Event/IHaveIntegrationEvent.cs
type IHaveIntegrationEvent (line 3) | public interface IHaveIntegrationEvent
FILE: src/BuildingBlocks/Core/Event/IIntegrationEvent.cs
type IIntegrationEvent (line 5) | [ExcludeFromTopology]
FILE: src/BuildingBlocks/Core/Event/IInternalCommand.cs
type IInternalCommand (line 3) | public interface IInternalCommand : IEvent
FILE: src/BuildingBlocks/Core/Event/InternalCommand.cs
type InternalCommand (line 5) | public record InternalCommand : IInternalCommand, ICommand;
FILE: src/BuildingBlocks/Core/Event/MessageEnvelope.cs
class MessageEnvelope (line 5) | public class MessageEnvelope
method MessageEnvelope (line 7) | public MessageEnvelope(object? message, IDictionary<string, object?>? ...
method MessageEnvelope (line 20) | public MessageEnvelope(TMessage message, IDictionary<string, object?> ...
class MessageEnvelope (line 17) | public class MessageEnvelope<TMessage> : MessageEnvelope
method MessageEnvelope (line 7) | public MessageEnvelope(object? message, IDictionary<string, object?>? ...
method MessageEnvelope (line 20) | public MessageEnvelope(TMessage message, IDictionary<string, object?> ...
FILE: src/BuildingBlocks/Core/EventDispatcher.cs
class EventDispatcher (line 12) | public sealed class EventDispatcher(
method SendAsync (line 21) | public async Task SendAsync<T>(IReadOnlyList<T> events, Type type = null,
method SendAsync (line 70) | public async Task SendAsync<T>(T @event, Type type = null,
method MapDomainEventToIntegrationEventAsync (line 76) | private Task<IReadOnlyList<IIntegrationEvent>> MapDomainEventToIntegra...
method MapDomainEventToInternalCommandAsync (line 106) | private Task<IReadOnlyList<IInternalCommand>> MapDomainEventToInternal...
method GetWrappedIntegrationEvents (line 131) | private IEnumerable<IIntegrationEvent> GetWrappedIntegrationEvents(IRe...
method SetHeaders (line 146) | private IDictionary<string, object> SetHeaders()
FILE: src/BuildingBlocks/Core/IEventDispatcher.cs
type IEventDispatcher (line 5) | public interface IEventDispatcher
method SendAsync (line 7) | public Task SendAsync<T>(IReadOnlyList<T> events, Type type = null, Ca...
method SendAsync (line 9) | public Task SendAsync<T>(T @event, Type type = null, CancellationToken...
FILE: src/BuildingBlocks/Core/IEventMapper.cs
type IEventMapper (line 5) | public interface IEventMapper
method MapToIntegrationEvent (line 7) | IIntegrationEvent? MapToIntegrationEvent(IDomainEvent @event);
method MapToInternalCommand (line 8) | IInternalCommand? MapToInternalCommand(IDomainEvent @event);
FILE: src/BuildingBlocks/Core/IntegrationEventWrapper.cs
type IntegrationEventWrapper (line 5) | public record IntegrationEventWrapper<TDomainEventType>(TDomainEventType...
FILE: src/BuildingBlocks/Core/Model/Aggregate.cs
type Aggregate (line 5) | public abstract record Aggregate<TId> : Entity<TId>, IAggregate<TId>
FILE: src/BuildingBlocks/Core/Model/Entity.cs
type Entity (line 3) | public abstract record Entity<T> : IEntity<T>
FILE: src/BuildingBlocks/Core/Model/IAggregate.cs
type IAggregate (line 5) | public interface IAggregate<T> : IAggregate, IEntity<T>
method ClearDomainEvents (line 12) | IEvent[] ClearDomainEvents();
type IAggregate (line 9) | public interface IAggregate : IEntity
method ClearDomainEvents (line 12) | IEvent[] ClearDomainEvents();
FILE: src/BuildingBlocks/Core/Model/IEntity.cs
type IEntity (line 3) | public interface IEntity<T> : IEntity
type IEntity (line 8) | public interface IEntity : IVersion
FILE: src/BuildingBlocks/Core/Model/IVersion.cs
type IVersion (line 4) | public interface IVersion
FILE: src/BuildingBlocks/Core/Pagination/Extensions.cs
class Extensions (line 6) | public static class Extensions
method ApplyPagingAsync (line 8) | public static async Task<IPageList<TEntity>> ApplyPagingAsync<TEntity>(
FILE: src/BuildingBlocks/Core/Pagination/IPageList.cs
type IPageList (line 3) | public interface IPageList<T>
FILE: src/BuildingBlocks/Core/Pagination/IPageQuery.cs
type IPageQuery (line 5) | public interface IPageQuery<out TResponse> : IPageRequest, IRequest<TRes...
FILE: src/BuildingBlocks/Core/Pagination/IPageRequest.cs
type IPageRequest (line 3) | public interface IPageRequest
FILE: src/BuildingBlocks/Core/Pagination/PageList.cs
type PageList (line 3) | public record PageList<T>(IReadOnlyList<T> Items, int PageNumber, int Pa...
FILE: src/BuildingBlocks/EFCore/AppDbContextBase.cs
class AppDbContextBase (line 12) | public abstract class AppDbContextBase : DbContext, IDbContext
method AppDbContextBase (line 18) | protected AppDbContextBase(DbContextOptions options, ICurrentUserProvi...
method OnModelCreating (line 26) | protected override void OnModelCreating(ModelBuilder builder)
method CreateExecutionStrategy (line 30) | public IExecutionStrategy CreateExecutionStrategy() => Database.Create...
method BeginTransactionAsync (line 32) | public async Task BeginTransactionAsync(CancellationToken cancellation...
method CommitTransactionAsync (line 40) | public async Task CommitTransactionAsync(CancellationToken cancellatio...
method RollbackTransactionAsync (line 59) | public async Task RollbackTransactionAsync(CancellationToken cancellat...
method ExecuteTransactionalAsync (line 74) | public Task ExecuteTransactionalAsync(CancellationToken cancellationTo...
method SaveChangesAsync (line 94) | public override async Task<int> SaveChangesAsync(CancellationToken can...
method GetDomainEvents (line 122) | public IReadOnlyList<IDomainEvent> GetDomainEvents()
method OnBeforeSaving (line 141) | private void OnBeforeSaving()
FILE: src/BuildingBlocks/EFCore/DesignTimeDbContextFactoryBase.cs
class DesignTimeDbContextFactoryBase (line 7) | public abstract class DesignTimeDbContextFactoryBase<TContext> : IDesign...
method CreateDbContext (line 9) | public TContext CreateDbContext(string[] args)
method CreateNewInstance (line 14) | protected abstract TContext CreateNewInstance(DbContextOptions<TContex...
method Create (line 16) | public TContext Create()
method Create (line 23) | private TContext Create(string basePath, string environmentName)
method Create (line 43) | private TContext Create(string connectionString)
FILE: src/BuildingBlocks/EFCore/EfTxBehavior.cs
class EfTxBehavior (line 12) | public class EfTxBehavior<TRequest, TResponse>(
method Handle (line 22) | public async Task<TResponse> Handle(TRequest request, RequestHandlerDe...
FILE: src/BuildingBlocks/EFCore/Extensions.cs
class Extensions (line 16) | public static class Extensions
method AddCustomDbContext (line 18) | public static IServiceCollection AddCustomDbContext<TContext>(this Web...
method UseMigration (line 53) | public static IApplicationBuilder UseMigration<TContext>(this IApplica...
method FilterSoftDeletedProperties (line 64) | public static void FilterSoftDeletedProperties(this ModelBuilder model...
method ToSnakeCaseTables (line 85) | public static void ToSnakeCaseTables(this ModelBuilder modelBuilder)
method MigrateAsync (line 115) | private static async Task MigrateAsync<TContext>(IServiceProvider serv...
method SeedAsync (line 133) | private static async Task SeedAsync(IServiceProvider serviceProvider)
FILE: src/BuildingBlocks/EFCore/IDataSeeder.cs
type IDataSeeder (line 3) | public interface IDataSeeder
method SeedAllAsync (line 5) | Task SeedAllAsync();
type ITestDataSeeder (line 8) | public interface ITestDataSeeder
method SeedAllAsync (line 10) | Task SeedAllAsync();
FILE: src/BuildingBlocks/EFCore/IDbContext.cs
type IDbContext (line 8) | public interface IDbContext
method Set (line 10) | DbSet<TEntity> Set<TEntity>() where TEntity : class;
method GetDomainEvents (line 11) | IReadOnlyList<IDomainEvent> GetDomainEvents();
method SaveChangesAsync (line 12) | Task<int> SaveChangesAsync(CancellationToken cancellationToken = defau...
method BeginTransactionAsync (line 13) | Task BeginTransactionAsync(CancellationToken cancellationToken = defau...
method CommitTransactionAsync (line 14) | Task CommitTransactionAsync(CancellationToken cancellationToken = defa...
method RollbackTransactionAsync (line 15) | Task RollbackTransactionAsync(CancellationToken cancellationToken = de...
method CreateExecutionStrategy (line 16) | IExecutionStrategy CreateExecutionStrategy();
method ExecuteTransactionalAsync (line 17) | Task ExecuteTransactionalAsync(CancellationToken cancellationToken = d...
FILE: src/BuildingBlocks/EFCore/ISeedManager.cs
type ISeedManager (line 3) | public interface ISeedManager
method ExecuteSeedAsync (line 5) | Task ExecuteSeedAsync();
method ExecuteTestSeedAsync (line 6) | Task ExecuteTestSeedAsync();
FILE: src/BuildingBlocks/EFCore/PostgresOptions.cs
class PostgresOptions (line 3) | public class PostgresOptions
FILE: src/BuildingBlocks/EFCore/SeedManagers.cs
class SeedManager (line 8) | public class SeedManager(
method ExecuteSeedAsync (line 14) | public async Task ExecuteSeedAsync()
method ExecuteTestSeedAsync (line 30) | public async Task ExecuteTestSeedAsync()
FILE: src/BuildingBlocks/EventStoreDB/BackgroundWorkers/BackgroundWorker.cs
class BackgroundWorker (line 6) | public class BackgroundWorker : BackgroundService
method BackgroundWorker (line 11) | public BackgroundWorker(
method ExecuteAsync (line 20) | protected override Task ExecuteAsync(CancellationToken stoppingToken) =>
FILE: src/BuildingBlocks/EventStoreDB/Config.cs
class EventStoreOptions (line 15) | public class EventStoreOptions
type EventStoreDBOptions (line 21) | public record EventStoreDBOptions(
class EventStoreDBConfigExtensions (line 25) | public static class EventStoreDBConfigExtensions
method AddEventStoreDB (line 27) | public static IServiceCollection AddEventStoreDB(this IServiceCollecti...
method AddEventStoreDBSubscriptionToAll (line 47) | public static IServiceCollection AddEventStoreDBSubscriptionToAll(
method AddProjections (line 75) | public static IServiceCollection AddProjections(this IServiceCollectio...
method RegisterProjections (line 85) | private static void RegisterProjections(IServiceCollection services, A...
FILE: src/BuildingBlocks/EventStoreDB/Events/AggregateEventSourcing.cs
type AggregateEventSourcing (line 6) | public abstract record AggregateEventSourcing<TId> : Entity<TId>, IAggre...
FILE: src/BuildingBlocks/EventStoreDB/Events/AggregateStreamExtensions.cs
class AggregateStreamExtensions (line 6) | public static class AggregateStreamExtensions
method AggregateStream (line 8) | public static async Task<T?> AggregateStream<T>(
FILE: src/BuildingBlocks/EventStoreDB/Events/EventTypeMapper.cs
class EventTypeMapper (line 6) | public class EventTypeMapper
method AddCustomMap (line 13) | public static void AddCustomMap<T>(string mappedEventTypeName) => AddC...
method AddCustomMap (line 15) | public static void AddCustomMap(Type eventType, string mappedEventType...
method ToName (line 21) | public static string ToName<TEventType>() => ToName(typeof(TEventType));
method ToName (line 23) | public static string ToName(Type eventType) => Instance.typeNameMap.Ge...
method ToType (line 32) | public static Type? ToType(string eventTypeName) => Instance.typeMap.G...
FILE: src/BuildingBlocks/EventStoreDB/Events/IAggregateEventSourcing.cs
type IAggregateEventSourcing (line 6) | public interface IAggregateEventSourcing : IProjection, IEntity
method ClearDomainEvents (line 9) | IDomainEvent[] ClearDomainEvents();
type IAggregateEventSourcing (line 12) | public interface IAggregateEventSourcing<T> : IAggregateEventSourcing, I...
method ClearDomainEvents (line 9) | IDomainEvent[] ClearDomainEvents();
FILE: src/BuildingBlocks/EventStoreDB/Events/IEventHandler.cs
type IEventHandler (line 6) | public interface IEventHandler<in TEvent> : INotificationHandler<TEvent>
FILE: src/BuildingBlocks/EventStoreDB/Events/IExternalEvent.cs
type IExternalEvent (line 5) | public interface IExternalEvent : IEvent
FILE: src/BuildingBlocks/EventStoreDB/Events/IProjection.cs
type IProjection (line 3) | public interface IProjection
method When (line 5) | void When(object @event);
FILE: src/BuildingBlocks/EventStoreDB/Events/StreamEvent.cs
type EventMetadata (line 5) | public record EventMetadata(
class StreamEvent (line 10) | public class StreamEvent : IEvent
method StreamEvent (line 15) | public StreamEvent(object data, EventMetadata metadata)
method StreamEvent (line 26) | public StreamEvent(T data, EventMetadata metadata) : base(data, metadata)
class StreamEvent (line 22) | public class StreamEvent<T> : StreamEvent where T : notnull
method StreamEvent (line 15) | public StreamEvent(object data, EventMetadata metadata)
method StreamEvent (line 26) | public StreamEvent(T data, EventMetadata metadata) : base(data, metadata)
FILE: src/BuildingBlocks/EventStoreDB/Events/StreamEventExtensions.cs
class StreamEventExtensions (line 7) | public static class StreamEventExtensions
method ToStreamEvent (line 9) | public static StreamEvent? ToStreamEvent(this ResolvedEvent resolvedEv...
FILE: src/BuildingBlocks/EventStoreDB/Events/StreamNameMapper.cs
class StreamNameMapper (line 5) | public class StreamNameMapper
method AddCustomMap (line 11) | public static void AddCustomMap<TStream>(string mappedStreamName) =>
method AddCustomMap (line 14) | public static void AddCustomMap(Type streamType, string mappedStreamName)
method ToStreamId (line 18) | public static string ToStreamId<TStream>(object aggregateId, object? t...
method ToStreamId (line 21) | public static string ToStreamId(Type streamType, object aggregateId, o...
FILE: src/BuildingBlocks/EventStoreDB/Extensions.cs
class Extensions (line 9) | public static class Extensions
method AddEventStore (line 12) | public static IServiceCollection AddEventStore(
FILE: src/BuildingBlocks/EventStoreDB/Projections/IProjectionProcessor.cs
type IProjectionProcessor (line 6) | public interface IProjectionProcessor
method ProcessEventAsync (line 8) | Task ProcessEventAsync<T>(StreamEvent<T> streamEvent, CancellationToke...
FILE: src/BuildingBlocks/EventStoreDB/Projections/IProjectionPublisher.cs
type IProjectionPublisher (line 6) | public interface IProjectionPublisher
method PublishAsync (line 8) | Task PublishAsync<T>(StreamEvent<T> streamEvent, CancellationToken can...
method PublishAsync (line 11) | Task PublishAsync(StreamEvent streamEvent, CancellationToken cancellat...
FILE: src/BuildingBlocks/EventStoreDB/Projections/ProjectionPublisher.cs
class ProjectionPublisher (line 7) | public class ProjectionPublisher : IProjectionPublisher
method ProjectionPublisher (line 11) | public ProjectionPublisher(IServiceProvider serviceProvider)
method PublishAsync (line 16) | public async Task PublishAsync<T>(StreamEvent<T> streamEvent, Cancella...
method PublishAsync (line 27) | public Task PublishAsync(StreamEvent streamEvent, CancellationToken ca...
FILE: src/BuildingBlocks/EventStoreDB/Repository/EventStoreDBRepository.cs
type IEventStoreDBRepository (line 7) | public interface IEventStoreDBRepository<T> where T : class, IAggregateE...
method Find (line 9) | Task<T?> Find(Guid id, CancellationToken cancellationToken);
method Add (line 10) | Task<ulong> Add(T aggregate, CancellationToken cancellationToken);
method Update (line 12) | Task<ulong> Update(T aggregate, long? expectedRevision = null,
method Delete (line 15) | Task<ulong> Delete(T aggregate, long? expectedRevision = null, Cancell...
class EventStoreDBRepository (line 18) | public class EventStoreDBRepository<T> : IEventStoreDBRepository<T> wher...
method EventStoreDBRepository (line 23) | public EventStoreDBRepository(EventStoreClient eventStore)
method Find (line 28) | public Task<T?> Find(Guid id, CancellationToken cancellationToken)
method Add (line 36) | public async Task<ulong> Add(T aggregate, CancellationToken cancellati...
method Update (line 47) | public async Task<ulong> Update(T aggregate, long? expectedRevision = ...
method Delete (line 61) | public Task<ulong> Delete(T aggregate, long? expectedRevision = null,
method GetEventsToStore (line 67) | private static IEnumerable<EventData> GetEventsToStore(T aggregate)
FILE: src/BuildingBlocks/EventStoreDB/Repository/RepositoryExtensions.cs
class RepositoryExtensions (line 6) | public static class RepositoryExtensions
method Get (line 8) | public static async Task<T> Get<T>(
method GetAndUpdate (line 19) | public static async Task<ulong> GetAndUpdate<T>(
FILE: src/BuildingBlocks/EventStoreDB/Serialization/EventStoreDBSerializer.cs
class EventStoreDBSerializer (line 8) | public static class EventStoreDBSerializer
method Deserialize (line 13) | public static T? Deserialize<T>(this ResolvedEvent resolvedEvent) wher...
method Deserialize (line 16) | public static object? Deserialize(this ResolvedEvent resolvedEvent)
method ToJsonEventData (line 32) | public static EventData ToJsonEventData(this object @event) =>
FILE: src/BuildingBlocks/EventStoreDB/Serialization/JsonObjectContractProvider.cs
class JsonObjectContractProvider (line 8) | public static class JsonObjectContractProvider
method UsingNonDefaultConstructor (line 13) | public static JsonObjectContract UsingNonDefaultConstructor(
method GetObjectConstructor (line 35) | private static ObjectConstructor<object> GetObjectConstructor(MethodBa...
method GetNonDefaultConstructor (line 48) | private static ConstructorInfo? GetNonDefaultConstructor(Type objectType)
method GetAttributeConstructor (line 58) | private static ConstructorInfo? GetAttributeConstructor(Type objectType)
method GetTheMostSpecificConstructor (line 76) | private static ConstructorInfo? GetTheMostSpecificConstructor(Type obj...
FILE: src/BuildingBlocks/EventStoreDB/Serialization/NonDefaultConstructorContractResolver.cs
class NonDefaultConstructorContractResolver (line 5) | public class NonDefaultConstructorContractResolver : DefaultContractReso...
method CreateObjectContract (line 7) | protected override JsonObjectContract CreateObjectContract(Type object...
FILE: src/BuildingBlocks/EventStoreDB/Serialization/SerializationExtensions.cs
class SerializationExtensions (line 7) | public static class SerializationExtensions
method WithDefaults (line 9) | public static JsonSerializerSettings WithDefaults(this JsonSerializerS...
method WithNonDefaultConstructorContractResolver (line 17) | public static JsonSerializerSettings WithNonDefaultConstructorContract...
method FromJson (line 29) | public static T FromJson<T>(this string json)
method FromJson (line 43) | public static object FromJson(this string json, Type type)
method ToJson (line 54) | public static string ToJson(this object obj)
method ToJsonStringContent (line 64) | public static StringContent ToJsonStringContent(this object obj)
FILE: src/BuildingBlocks/EventStoreDB/Subscriptions/EventStoreDBSubscriptionCheckpointRepository.cs
type CheckpointStored (line 8) | public record CheckpointStored(string SubscriptionId, ulong? Position, D...
class EventStoreDBSubscriptionCheckpointRepository (line 10) | public class EventStoreDBSubscriptionCheckpointRepository : ISubscriptio...
method EventStoreDBSubscriptionCheckpointRepository (line 14) | public EventStoreDBSubscriptionCheckpointRepository(
method Load (line 20) | public async ValueTask<ulong?> Load(string subscriptionId, Cancellatio...
method Store (line 37) | public async ValueTask Store(string subscriptionId, ulong position, Ca...
method GetCheckpointStreamName (line 75) | private static string GetCheckpointStreamName(string subscriptionId) =...
FILE: src/BuildingBlocks/EventStoreDB/Subscriptions/EventStoreDBSubscriptionToAll.cs
class EventStoreDBSubscriptionToAllOptions (line 11) | public class EventStoreDBSubscriptionToAllOptions
class EventStoreDBSubscriptionToAll (line 24) | public class EventStoreDBSubscriptionToAll
method EventStoreDBSubscriptionToAll (line 36) | public EventStoreDBSubscriptionToAll(
method SubscribeToAll (line 52) | public async Task SubscribeToAll(EventStoreDBSubscriptionToAllOptions ...
method HandleEvent (line 77) | private async Task HandleEvent(StreamSubscription subscription, Resolv...
method HandleDrop (line 118) | private void HandleDrop(StreamSubscription _, SubscriptionDroppedReaso...
method Resubscribe (line 133) | private void Resubscribe()
method IsEventWithEmptyData (line 174) | private bool IsEventWithEmptyData(ResolvedEvent resolvedEvent)
method IsCheckpointEvent (line 183) | private bool IsCheckpointEvent(ResolvedEvent resolvedEvent)
FILE: src/BuildingBlocks/EventStoreDB/Subscriptions/ISubscriptionCheckpointRepository.cs
type ISubscriptionCheckpointRepository (line 3) | public interface ISubscriptionCheckpointRepository
method Load (line 5) | ValueTask<ulong?> Load(string subscriptionId, CancellationToken ct);
method Store (line 7) | ValueTask Store(string subscriptionId, ulong position, CancellationTok...
FILE: src/BuildingBlocks/EventStoreDB/Subscriptions/InMemorySubscriptionCheckpointRepository.cs
class InMemorySubscriptionCheckpointRepository (line 5) | public class InMemorySubscriptionCheckpointRepository : ISubscriptionChe...
method Load (line 9) | public ValueTask<ulong?> Load(string subscriptionId, CancellationToken...
method Store (line 14) | public ValueTask Store(string subscriptionId, ulong position, Cancella...
FILE: src/BuildingBlocks/Exception/AggregateNotFoundException.cs
class AggregateNotFoundException (line 3) | public class AggregateNotFoundException : System.Exception
method AggregateNotFoundException (line 5) | public AggregateNotFoundException(string typeName, Guid id) : base($"{...
method For (line 9) | public static AggregateNotFoundException For<T>(Guid id)
FILE: src/BuildingBlocks/Exception/AppException.cs
class AppException (line 5) | public class AppException : CustomException
method AppException (line 7) | public AppException(string message, HttpStatusCode statusCode = HttpSt...
method AppException (line 11) | public AppException(string message, System.Exception innerException, H...
FILE: src/BuildingBlocks/Exception/BadRequestException.cs
class BadRequestException (line 6) | public class BadRequestException : CustomException
method BadRequestException (line 8) | public BadRequestException(string message, int? code = null) : base(me...
FILE: src/BuildingBlocks/Exception/ConflictException.cs
class ConflictException (line 5) | public class ConflictException : CustomException
method ConflictException (line 7) | public ConflictException(string message, int? code = null) : base(mess...
FILE: src/BuildingBlocks/Exception/CustomException.cs
class CustomException (line 5) | public class CustomException : System.Exception
method CustomException (line 7) | public CustomException(
method CustomException (line 16) | public CustomException(
method CustomException (line 26) | public CustomException(
FILE: src/BuildingBlocks/Exception/DomainException.cs
class DomainException (line 6) | public class DomainException : CustomException
method DomainException (line 8) | public DomainException(string message, HttpStatusCode statusCode = Htt...
method DomainException (line 12) | public DomainException(string message, Exception innerException, HttpS...
FILE: src/BuildingBlocks/Exception/GrpcExceptionInterceptor.cs
class GrpcExceptionInterceptor (line 7) | public class GrpcExceptionInterceptor : Interceptor
method UnaryServerHandler (line 9) | public override async Task<TResponse> UnaryServerHandler<TRequest, TRe...
FILE: src/BuildingBlocks/Exception/InternalServerException.cs
class InternalServerException (line 6) | public class InternalServerException : CustomException
method InternalServerException (line 8) | public InternalServerException() : base() { }
method InternalServerException (line 10) | public InternalServerException(string message, int? code) : base(messa...
method InternalServerException (line 12) | public InternalServerException(string message, int? code = null, param...
FILE: src/BuildingBlocks/Exception/NotFoundException.cs
class NotFoundException (line 5) | public class NotFoundException : CustomException
method NotFoundException (line 7) | public NotFoundException(string message, int? code = null) : base(mess...
FILE: src/BuildingBlocks/Exception/ProblemDetailsWithCode.cs
class ProblemDetailsWithCode (line 8) | public class ProblemDetailsWithCode : ProblemDetails
FILE: src/BuildingBlocks/Exception/ValidationException.cs
class ValidationException (line 5) | public class ValidationException : CustomException
method ValidationException (line 7) | public ValidationException(string message, int? code = null) : base(me...
FILE: src/BuildingBlocks/HealthCheck/Extensions.cs
class Extensions (line 16) | public static class Extensions
method AddCustomHealthCheck (line 21) | public static IServiceCollection AddCustomHealthCheck(this IServiceCol...
method UseCustomHealthCheck (line 72) | public static WebApplication UseCustomHealthCheck(this WebApplication ...
FILE: src/BuildingBlocks/HealthCheck/HealthOptions.cs
class HealthOptions (line 3) | public class HealthOptions
FILE: src/BuildingBlocks/Jwt/AuthHeaderHandler.cs
class AuthHeaderHandler (line 6) | public class AuthHeaderHandler : DelegatingHandler
method AuthHeaderHandler (line 10) | public AuthHeaderHandler(IHttpContextAccessor httpContext)
method SendAsync (line 15) | protected override Task<HttpResponseMessage> SendAsync(HttpRequestMess...
FILE: src/BuildingBlocks/Jwt/JwtExtensions.cs
class JwtExtensions (line 10) | public static class JwtExtensions
method AddJwt (line 12) | public static IServiceCollection AddJwt(this IServiceCollection services)
FILE: src/BuildingBlocks/Logging/LoggingBehavior.cs
class LoggingBehavior (line 7) | public class LoggingBehavior<TRequest, TResponse> : IPipelineBehavior<TR...
method LoggingBehavior (line 13) | public LoggingBehavior(ILogger<LoggingBehavior<TRequest, TResponse>> l...
method Handle (line 18) | public async Task<TResponse> Handle(TRequest request, RequestHandlerDe...
FILE: src/BuildingBlocks/Mapster/Extensions.cs
class Extensions (line 8) | public static class Extensions
method AddCustomMapster (line 10) | public static IServiceCollection AddCustomMapster(this IServiceCollect...
FILE: src/BuildingBlocks/MassTransit/ConsumeFilter.cs
class ConsumeFilter (line 8) | public class ConsumeFilter<T> : IFilter<ConsumeContext<T>>
method ConsumeFilter (line 13) | public ConsumeFilter(IPersistMessageProcessor persistMessageProcessor)
method Send (line 18) | public async Task Send(ConsumeContext<T> context, IPipe<ConsumeContext...
method Probe (line 35) | public void Probe(ProbeContext context)
FILE: src/BuildingBlocks/MassTransit/Extensions.cs
class Extensions (line 13) | public static class Extensions
method AddCustomMassTransit (line 15) | public static IServiceCollection AddCustomMassTransit(
method SetupMasstransitConfigurations (line 44) | private static void SetupMasstransitConfigurations(
method AddRetryConfiguration (line 110) | private static void AddRetryConfiguration(IRetryConfigurator retryConf...
FILE: src/BuildingBlocks/MassTransit/RabbitMqOptions.cs
class RabbitMqOptions (line 3) | public class RabbitMqOptions
FILE: src/BuildingBlocks/MassTransit/TransportType.cs
type TransportType (line 3) | public enum TransportType
FILE: src/BuildingBlocks/Mongo/Extensions.cs
class Extensions (line 9) | public static class Extensions
method AddMongoDbContext (line 11) | public static IServiceCollection AddMongoDbContext<TContext>(
method AddMongoDbContext (line 18) | public static IServiceCollection AddMongoDbContext<TContextService, TC...
FILE: src/BuildingBlocks/Mongo/IMongoDbContext.cs
type IMongoDbContext (line 5) | public interface IMongoDbContext : IDisposable
method GetCollection (line 7) | IMongoCollection<T> GetCollection<T>(string? name = null);
method SaveChangesAsync (line 8) | Task<int> SaveChangesAsync(CancellationToken cancellationToken = defau...
method BeginTransactionAsync (line 9) | Task BeginTransactionAsync(CancellationToken cancellationToken = defau...
method CommitTransactionAsync (line 10) | Task CommitTransactionAsync(CancellationToken cancellationToken = defa...
method RollbackTransaction (line 11) | Task RollbackTransaction(CancellationToken cancellationToken = default);
method AddCommand (line 12) | void AddCommand(Func<Task> func);
FILE: src/BuildingBlocks/Mongo/IMongoRepository.cs
type IMongoRepository (line 5) | public interface IMongoRepository<TEntity, in TId> : IRepository<TEntity...
FILE: src/BuildingBlocks/Mongo/IMongoUnitOfWork.cs
type IMongoUnitOfWork (line 3) | public interface IMongoUnitOfWork<out TContext> : IUnitOfWork<TContext> ...
FILE: src/BuildingBlocks/Mongo/IRepository.cs
type IReadRepository (line 6) | public interface IReadRepository<TEntity, in TId>
method FindByIdAsync (line 9) | Task<TEntity?> FindByIdAsync(TId id, CancellationToken cancellationTok...
method FindOneAsync (line 11) | Task<TEntity?> FindOneAsync(
method FindAsync (line 15) | Task<IReadOnlyList<TEntity>> FindAsync(
method GetAllAsync (line 19) | Task<IReadOnlyList<TEntity>> GetAllAsync(CancellationToken cancellatio...
method RawQuery (line 21) | public Task<IReadOnlyList<TEntity>> RawQuery(
type IWriteRepository (line 27) | public interface IWriteRepository<TEntity, in TId>
method AddAsync (line 30) | Task<TEntity> AddAsync(TEntity entity, CancellationToken cancellationT...
method UpdateAsync (line 31) | Task<TEntity> UpdateAsync(TEntity entity, CancellationToken cancellati...
method DeleteRangeAsync (line 32) | Task DeleteRangeAsync(IReadOnlyList<TEntity> entities, CancellationTok...
method DeleteAsync (line 33) | Task DeleteAsync(Expression<Func<TEntity, bool>> predicate, Cancellati...
method DeleteAsync (line 34) | Task DeleteAsync(TEntity entity, CancellationToken cancellationToken =...
method DeleteByIdAsync (line 35) | Task DeleteByIdAsync(TId id, CancellationToken cancellationToken = def...
type IRepository (line 38) | public interface IRepository<TEntity, in TId> :
type IRepository (line 46) | public interface IRepository<TEntity> : IRepository<TEntity, long>
FILE: src/BuildingBlocks/Mongo/ITransactionAble.cs
type ITransactionAble (line 3) | public interface ITransactionAble
method BeginTransactionAsync (line 5) | Task BeginTransactionAsync(CancellationToken cancellationToken = defau...
method RollbackTransactionAsync (line 6) | Task RollbackTransactionAsync(CancellationToken cancellationToken = de...
method CommitTransactionAsync (line 7) | Task CommitTransactionAsync(CancellationToken cancellationToken = defa...
FILE: src/BuildingBlocks/Mongo/IUnitOfWork.cs
type IUnitOfWork (line 3) | public interface IUnitOfWork : IDisposable
method BeginTransactionAsync (line 5) | Task BeginTransactionAsync(CancellationToken cancellationToken = defau...
method CommitAsync (line 6) | Task CommitAsync(CancellationToken cancellationToken = default);
type IUnitOfWork (line 9) | public interface IUnitOfWork<out TContext> : IUnitOfWork
method BeginTransactionAsync (line 5) | Task BeginTransactionAsync(CancellationToken cancellationToken = defau...
method CommitAsync (line 6) | Task CommitAsync(CancellationToken cancellationToken = default);
FILE: src/BuildingBlocks/Mongo/ImmutablePocoConvention.cs
class ImmutablePocoConvention (line 11) | public class ImmutablePocoConvention : ConventionBase, IClassMapConvention
method ImmutablePocoConvention (line 15) | public ImmutablePocoConvention()
method ImmutablePocoConvention (line 20) | public ImmutablePocoConvention(BindingFlags bindingFlags)
method Apply (line 25) | public void Apply(BsonClassMap classMap)
method GetMatchingProperties (line 48) | private static List<PropertyInfo> GetMatchingProperties(
method ParameterMatchProperty (line 68) | private static bool ParameterMatchProperty(ParameterInfo parameter, Pr...
method IsReadOnlyProperty (line 74) | private static bool IsReadOnlyProperty(BsonClassMap classMap, Property...
FILE: src/BuildingBlocks/Mongo/MongoDbContext.cs
class MongoDbContext (line 13) | public class MongoDbContext : IMongoDbContext
method MongoDbContext (line 21) | static MongoDbContext()
method MongoDbContext (line 26) | public MongoDbContext(IOptions<MongoOptions> options)
method RegisterConventions (line 38) | private static void RegisterConventions()
method GetCollection (line 52) | public IMongoCollection<T> GetCollection<T>(string? name = null)
method Dispose (line 57) | public void Dispose()
method SaveChangesAsync (line 65) | public async Task<int> SaveChangesAsync(CancellationToken cancellation...
method BeginTransactionAsync (line 93) | public async Task BeginTransactionAsync(CancellationToken cancellation...
method CommitTransactionAsync (line 99) | public async Task CommitTransactionAsync(CancellationToken cancellatio...
method RollbackTransaction (line 107) | public async Task RollbackTransaction(CancellationToken cancellationTo...
method AddCommand (line 112) | public void AddCommand(Func<Task> func)
method ExecuteTransactionalAsync (line 117) | public async Task ExecuteTransactionalAsync(Func<Task> action, Cancell...
method ExecuteTransactionalAsync (line 133) | public async Task<T> ExecuteTransactionalAsync<T>(
FILE: src/BuildingBlocks/Mongo/MongoOptions.cs
class MongoOptions (line 3) | public class MongoOptions
FILE: src/BuildingBlocks/Mongo/MongoRepository.cs
class MongoRepository (line 8) | public class MongoRepository<TEntity, TId> : IMongoRepository<TEntity, TId>
method MongoRepository (line 14) | public MongoRepository(IMongoDbContext context)
method Dispose (line 20) | public void Dispose()
method FindByIdAsync (line 25) | public Task<TEntity?> FindByIdAsync(TId id, CancellationToken cancella...
method FindOneAsync (line 30) | public Task<TEntity?> FindOneAsync(
method FindAsync (line 37) | public async Task<IReadOnlyList<TEntity>> FindAsync(
method GetAllAsync (line 44) | public async Task<IReadOnlyList<TEntity>> GetAllAsync(CancellationToke...
method RawQuery (line 49) | public Task<IReadOnlyList<TEntity>> RawQuery(
method AddAsync (line 57) | public async Task<TEntity> AddAsync(TEntity entity, CancellationToken ...
method UpdateAsync (line 64) | public async Task<TEntity> UpdateAsync(TEntity entity, CancellationTok...
method DeleteRangeAsync (line 71) | public Task DeleteRangeAsync(IReadOnlyList<TEntity> entities, Cancella...
method DeleteAsync (line 76) | public Task DeleteAsync(
method DeleteAsync (line 81) | public Task DeleteAsync(TEntity entity, CancellationToken cancellation...
method DeleteByIdAsync (line 86) | public Task DeleteByIdAsync(TId id, CancellationToken cancellationToke...
FILE: src/BuildingBlocks/Mongo/MongoUnitOfWork.cs
class MongoUnitOfWork (line 3) | public class MongoUnitOfWork<TContext> : IMongoUnitOfWork<TContext>, ITr...
method MongoUnitOfWork (line 6) | public MongoUnitOfWork(TContext context) => Context = context;
method CommitAsync (line 10) | public async Task CommitAsync(CancellationToken cancellationToken = de...
method BeginTransactionAsync (line 15) | public Task BeginTransactionAsync(CancellationToken cancellationToken ...
method RollbackTransactionAsync (line 20) | public Task RollbackTransactionAsync(CancellationToken cancellationTok...
method CommitTransactionAsync (line 25) | public Task CommitTransactionAsync(CancellationToken cancellationToken...
method Dispose (line 30) | public void Dispose() => Context.Dispose();
FILE: src/BuildingBlocks/OpenApi/Extensions.cs
class Extensions (line 7) | public static class Extensions
method AddAspnetOpenApi (line 10) | public static IServiceCollection AddAspnetOpenApi(this IServiceCollect...
method UseAspnetOpenApi (line 27) | public static IApplicationBuilder UseAspnetOpenApi(this WebApplication...
FILE: src/BuildingBlocks/OpenApi/SecuritySchemeDocumentTransformer.cs
class SecuritySchemeDocumentTransformer (line 4) | public class SecuritySchemeDocumentTransformer : IOpenApiDocumentTransfo...
method TransformAsync (line 6) | public Task TransformAsync(
FILE: src/BuildingBlocks/OpenTelemetryCollector/ActivityExtensions.cs
class ActivityExtensions (line 6) | internal static class ActivityExtensions
method GetParentTags (line 13) | public static Dictionary<string, object?> GetParentTags(this Activity ...
method ExtractImportantInformation (line 56) | public static ActivityInfo ExtractImportantInformation(this Activity a...
method SetOkStatus (line 93) | public static Activity SetOkStatus(this Activity activity, string? des...
method SetUnsetStatus (line 117) | public static Activity SetUnsetStatus(this Activity activity, string? ...
method SetErrorStatus (line 142) | public static Activity SetErrorStatus(this Activity activity, System.E...
method SetExceptionTags (line 159) | public static Activity SetExceptionTags(this Activity activity, System...
FILE: src/BuildingBlocks/OpenTelemetryCollector/ActivityInfo.cs
class ActivityInfo (line 5) | public class ActivityInfo
class ActivityEventInfo (line 24) | public class ActivityEventInfo
FILE: src/BuildingBlocks/OpenTelemetryCollector/Behaviors/ObservabilityPipelineBehavior.cs
class ObservabilityPipelineBehavior (line 8) | public class ObservabilityPipelineBehavior<TRequest, TResponse>(
method Handle (line 17) | public async Task<TResponse> Handle(TRequest message, RequestHandlerDe...
FILE: src/BuildingBlocks/OpenTelemetryCollector/CoreDiagnostics/Commands/CommandHandlerActivity.cs
class CommandHandlerActivity (line 7) | public class CommandHandlerActivity(IDiagnosticsProvider diagnosticsProv...
method Execute (line 9) | public async Task Execute<TCommand>(
method Execute (line 48) | public async Task<TResult> Execute<TCommand, TResult>(
FILE: src/BuildingBlocks/OpenTelemetryCollector/CoreDiagnostics/Commands/CommandHandlerMetrics.cs
class CommandHandlerMetrics (line 9) | public class CommandHandlerMetrics
method CommandHandlerMetrics (line 19) | public CommandHandlerMetrics(IDiagnosticsProvider diagnosticsProvider)
method StartExecuting (line 52) | public void StartExecuting<TCommand>()
method FinishExecuting (line 88) | public void FinishExecuting<TCommand>()
method FailedCommand (line 129) | public void FailedCommand<TCommand>()
FILE: src/BuildingBlocks/OpenTelemetryCollector/CoreDiagnostics/Query/QueryHandlerActivity.cs
class QueryHandlerActivity (line 7) | public class QueryHandlerActivity(IDiagnosticsProvider diagnosticsProvider)
method Execute (line 9) | public async Task<TResult> Execute<TQuery, TResult>(
FILE: src/BuildingBlocks/OpenTelemetryCollector/CoreDiagnostics/Query/QueryHandlerMetrics.cs
class QueryHandlerMetrics (line 8) | public class QueryHandlerMetrics
method QueryHandlerMetrics (line 18) | public QueryHandlerMetrics(IDiagnosticsProvider diagnosticsProvider)
method StartExecuting (line 51) | public void StartExecuting<TQuery>()
method FinishExecuting (line 87) | public void FinishExecuting<TQuery>()
method FailedCommand (line 128) | public void FailedCommand<TQuery>()
FILE: src/BuildingBlocks/OpenTelemetryCollector/CreateActivityInfo.cs
class CreateActivityInfo (line 5) | public class CreateActivityInfo
FILE: src/BuildingBlocks/OpenTelemetryCollector/DiagnosticsProvider/CustomeDiagnosticsProvider.cs
class CustomeDiagnosticsProvider (line 8) | public class CustomeDiagnosticsProvider(IMeterFactory meterFactory, IOpt...
method ExecuteActivityAsync (line 53) | public async Task ExecuteActivityAsync(
method ExecuteActivityAsync (line 89) | public async Task<TResult?> ExecuteActivityAsync<TResult>(
method Dispose (line 126) | public void Dispose()
FILE: src/BuildingBlocks/OpenTelemetryCollector/DiagnosticsProvider/IDiagnosticsProvider.cs
type IDiagnosticsProvider (line 6) | public interface IDiagnosticsProvider : IDisposable
method ExecuteActivityAsync (line 12) | Task ExecuteActivityAsync(
method ExecuteActivityAsync (line 18) | Task<TResult> ExecuteActivityAsync<TResult>(
FILE: src/BuildingBlocks/OpenTelemetryCollector/Extensions.cs
class Extensions (line 30) | public static class Extensions
method AddCustomObservability (line 35) | public static WebApplicationBuilder AddCustomObservability(this WebApp...
method UseCustomObservability (line 182) | public static WebApplication UseCustomObservability(this WebApplicatio...
method AddTracingExporter (line 209) | private static void AddTracingExporter(ObservabilityOptions observabil...
method AddMetricsExporter (line 270) | private static void AddMetricsExporter(ObservabilityOptions observabil...
method AddLoggingExporters (line 315) | private static void AddLoggingExporters(
method AddCoreDiagnostics (line 355) | private static WebApplicationBuilder AddCoreDiagnostics(this WebApplic...
FILE: src/BuildingBlocks/OpenTelemetryCollector/ObservabilityConstant.cs
class ObservabilityConstant (line 3) | public static class ObservabilityConstant
class Components (line 7) | public static class Components
FILE: src/BuildingBlocks/OpenTelemetryCollector/ObservabilityOptions.cs
class ObservabilityOptions (line 3) | public class ObservabilityOptions
class ZipkinOptions (line 24) | public class ZipkinOptions
class JaegerOptions (line 32) | public class JaegerOptions
class OTLPOptions (line 38) | public class OTLPOptions
class AspireDashboardOTLPOptions (line 44) | public class AspireDashboardOTLPOptions
FILE: src/BuildingBlocks/OpenTelemetryCollector/TelemetryTags.cs
class TelemetryTags (line 6) | public static class TelemetryTags
class Tracing (line 10) | public static class Tracing
class Service (line 14) | public static class Service
class Messaging (line 25) | public static class Messaging
class OperationType (line 28) | public static class OperationType
class System (line 37) | public static class System
class RabbitMQ (line 66) | public static class RabbitMQ
method ProducerTags (line 71) | public static IDictionary<string, object?> ProducerTags(
method ConsumerTags (line 87) | public static IDictionary<string, object?> ConsumerTags(
class Kafka (line 106) | public static class Kafka
method ProducerTags (line 112) | public static IDictionary<string, object?> ProducerTags(
method ConsumerTags (line 126) | public static IDictionary<string, object?> ConsumerTags(
class Db (line 148) | public static class Db
class Exception (line 165) | public static class Exception
class Otel (line 174) | public static class Otel
class Message (line 180) | public static class Message
class Application (line 186) | public static class Application
class Commands (line 192) | public static class Commands
class Queries (line 200) | public static class Queries
class Events (line 208) | public static class Events
class Metrics (line 220) | public static class Metrics
class Application (line 222) | public static class Application
class Commands (line 228) | public static class Commands
class Queries (line 240) | public static class Queries
class Events (line 252) | public static class Events
FILE: src/BuildingBlocks/PersistMessageProcessor/Extensions.cs
class Extensions (line 11) | public static class Extensions
method AddPersistMessageProcessor (line 13) | public static IServiceCollection AddPersistMessageProcessor(this WebAp...
FILE: src/BuildingBlocks/PersistMessageProcessor/IPersistMessageDbContext.cs
type IPersistMessageDbContext (line 5) | public interface IPersistMessageDbContext
method SaveChangesAsync (line 8) | Task<int> SaveChangesAsync(CancellationToken cancellationToken = defau...
method ExecuteTransactionalAsync (line 9) | Task ExecuteTransactionalAsync(CancellationToken cancellationToken = d...
FILE: src/BuildingBlocks/PersistMessageProcessor/IPersistMessageProcessor.cs
type IPersistMessageProcessor (line 11) | public interface IPersistMessageProcessor
method PublishMessageAsync (line 13) | Task PublishMessageAsync<TMessageEnvelope>(
method AddReceivedMessageAsync (line 18) | Task<Guid> AddReceivedMessageAsync<TMessageEnvelope>(
method AddInternalMessageAsync (line 23) | Task AddInternalMessageAsync<TCommand>(
method GetByFilterAsync (line 28) | Task<IReadOnlyList<PersistMessage>> GetByFilterAsync(
method ExistMessageAsync (line 32) | Task<PersistMessage> ExistMessageAsync(
method ProcessInboxAsync (line 36) | Task ProcessInboxAsync(
method ProcessAsync (line 40) | Task ProcessAsync(Guid messageId, MessageDeliveryType deliveryType, Ca...
method ProcessAllAsync (line 42) | Task ProcessAllAsync(CancellationToken cancellationToken = default);
FILE: src/BuildingBlocks/PersistMessageProcessor/MessageDeliveryType.cs
type MessageDeliveryType (line 3) | [Flags]
FILE: src/BuildingBlocks/PersistMessageProcessor/MessageStatus.cs
type MessageStatus (line 3) | public enum MessageStatus
FILE: src/BuildingBlocks/PersistMessageProcessor/PersistMessage.cs
class PersistMessage (line 5) | public class PersistMessage : IVersion
method PersistMessage (line 7) | public PersistMessage(Guid id, string dataType, string data, MessageDe...
method ChangeState (line 27) | public void ChangeState(MessageStatus messageStatus)
method IncreaseRetry (line 32) | public void IncreaseRetry()
FILE: src/BuildingBlocks/PersistMessageProcessor/PersistMessageBackgroundService.cs
class PersistMessageBackgroundService (line 8) | public class PersistMessageBackgroundService(
method ExecuteAsync (line 17) | protected override async Task ExecuteAsync(CancellationToken stoppingT...
method StopAsync (line 24) | public override Task StopAsync(CancellationToken cancellationToken)
method ProcessAsync (line 31) | private async Task ProcessAsync(CancellationToken stoppingToken)
FILE: src/BuildingBlocks/PersistMessageProcessor/PersistMessageDbContext.cs
class PersistMessageDbContext (line 9) | public class PersistMessageDbContext : DbContext, IPersistMessageDbContext
method PersistMessageDbContext (line 13) | public PersistMessageDbContext(DbContextOptions<PersistMessageDbContex...
method OnModelCreating (line 22) | protected override void OnModelCreating(ModelBuilder builder)
method ExecuteTransactionalAsync (line 29) | public Task ExecuteTransactionalAsync(CancellationToken cancellationTo...
method SaveChangesAsync (line 49) | public override async Task<int> SaveChangesAsync(CancellationToken can...
method CreatePersistMessageTableIfNotExists (line 78) | public void CreatePersistMessageTableIfNotExists()
method OnBeforeSaving (line 96) | private void OnBeforeSaving()
FILE: src/BuildingBlocks/PersistMessageProcessor/PersistMessageOptions.cs
class PersistMessageOptions (line 3) | public class PersistMessageOptions
FILE: src/BuildingBlocks/PersistMessageProcessor/PersistMessageProcessor.cs
class PersistMessageProcessor (line 14) | public class PersistMessageProcessor : IPersistMessageProcessor
method PersistMessageProcessor (line 20) | public PersistMessageProcessor(
method PublishMessageAsync (line 32) | public async Task PublishMessageAsync<TMessageEnvelope>(
method AddReceivedMessageAsync (line 40) | public Task<Guid> AddReceivedMessageAsync<TMessageEnvelope>(TMessageEn...
method AddInternalMessageAsync (line 46) | public async Task AddInternalMessageAsync<TCommand>(TCommand internalC...
method GetByFilterAsync (line 53) | public async Task<IReadOnlyList<PersistMessage>> GetByFilterAsync(Expr...
method ExistMessageAsync (line 60) | public Task<PersistMessage> ExistMessageAsync(Guid messageId, Cancella...
method ProcessAsync (line 69) | public async Task ProcessAsync(
method ProcessAllAsync (line 109) | public async Task ProcessAllAsync(CancellationToken cancellationToken ...
method ProcessInboxAsync (line 121) | public async Task ProcessInboxAsync(Guid messageId, CancellationToken ...
method ProcessOutboxAsync (line 132) | private async Task<bool> ProcessOutboxAsync(PersistMessage message, Ca...
method ProcessInternalAsync (line 159) | private async Task<bool> ProcessInternalAsync(PersistMessage message, ...
method SavePersistMessageAsync (line 182) | private async Task<Guid> SavePersistMessageAsync(
method ChangeMessageStatusAsync (line 213) | private async Task ChangeMessageStatusAsync(PersistMessage message, Ca...
FILE: src/BuildingBlocks/Polly/Extensions.cs
class Extensions (line 8) | public static class Extensions
method RetryOnFailure (line 12) | public static T RetryOnFailure<T>(this object retrySource, Func<T> act...
FILE: src/BuildingBlocks/ProblemDetails/Extensions.cs
class Extensions (line 13) | public static class Extensions
method UseCustomProblemDetails (line 15) | public static WebApplication UseCustomProblemDetails(this WebApplicati...
FILE: src/BuildingBlocks/TestBase/TestBase.cs
class TestFixture (line 38) | public class TestFixture<TEntryPoint> : IAsyncLifetime
method TestFixture (line 79) | protected TestFixture()
method InitializeAsync (line 132) | public async Task InitializeAsync()
method DisposeAsync (line 138) | public async Task DisposeAsync()
method RegisterServices (line 145) | public virtual void RegisterServices(Action<IServiceCollection> services)
method CreateLogger (line 151) | public ILogger CreateLogger(ITestOutputHelper output)
method ExecuteScopeAsync (line 164) | protected async Task ExecuteScopeAsync(Func<IServiceProvider, Task> ac...
method ExecuteScopeAsync (line 170) | protected async Task<T> ExecuteScopeAsync<T>(Func<IServiceProvider, Ta...
method SendAsync (line 179) | public Task<TResponse> SendAsync<TResponse>(IRequest<TResponse> request)
method SendAsync (line 189) | public Task SendAsync(IRequest request)
method Publish (line 198) | public async Task Publish<TMessage>(TMessage message, CancellationToke...
method WaitForPublishing (line 205) | public async Task<bool> WaitForPublishing<TMessage>(CancellationToken ...
method WaitUntilAsync (line 221) | public Task<bool> WaitUntilAsync(
method WaitUntilConditionMet (line 244) | private async Task<bool> WaitUntilConditionMet(
method StartTestContainerAsync (line 268) | private async Task StartTestContainerAsync()
method StopTestContainerAsync (line 283) | private async Task StopTestContainerAsync()
method AddCustomAppSettings (line 292) | private void AddCustomAppSettings(IConfigurationBuilder configuration)
method AddHttpContextAccessorMock (line 319) | private IHttpContextAccessor AddHttpContextAccessorMock(IServiceProvid...
method ExecuteReadContextAsync (line 484) | public Task ExecuteReadContextAsync(Func<TRContext, Task> action)
method ExecuteReadContextAsync (line 489) | public Task<T> ExecuteReadContextAsync<T>(Func<TRContext, Task<T>> act...
method InsertMongoDbContextAsync (line 494) | public async Task InsertMongoDbContextAsync<T>(string collectionName, ...
class TestWriteFixture (line 333) | public class TestWriteFixture<TEntryPoint, TWContext> : TestFixture<TEnt...
method ExecuteDbContextAsync (line 337) | public Task ExecuteDbContextAsync(Func<TWContext, Task> action)
method ExecuteDbContextAsync (line 342) | public Task ExecuteDbContextAsync(Func<TWContext, ValueTask> action)
method ExecuteDbContextAsync (line 347) | public Task ExecuteDbContextAsync(Func<TWContext, IMediator, Task> act...
method ExecuteDbContextAsync (line 352) | public Task<T> ExecuteDbContextAsync<T>(Func<TWContext, Task<T>> action)
method ExecuteDbContextAsync (line 357) | public Task<T> ExecuteDbContextAsync<T>(Func<TWContext, ValueTask<T>> ...
method ExecuteDbContextAsync (line 362) | public Task<T> ExecuteDbContextAsync<T>(Func<TWContext, IMediator, Tas...
method InsertAsync (line 367) | public Task InsertAsync<T>(params T[] entities)
method InsertAsync (line 381) | public async Task InsertAsync<TEntity>(TEntity entity)
method InsertAsync (line 392) | public Task InsertAsync<TEntity, TEntity2>(TEntity entity, TEntity2 en...
method InsertAsync (line 405) | public Task InsertAsync<TEntity, TEntity2, TEntity3>(TEntity entity, T...
method InsertAsync (line 420) | public Task InsertAsync<TEntity, TEntity2, TEntity3, TEntity4>(
method FindAsync (line 442) | public Task<T> FindAsync<T, TKey>(TKey id)
method FirstOrDefaultAsync (line 448) | public Task<T> FirstOrDefaultAsync<T>()
class TestReadFixture (line 455) | public class TestReadFixture<TEntryPoint, TRContext> : TestFixture<TEntr...
method ExecuteReadContextAsync (line 459) | public Task ExecuteReadContextAsync(Func<TRContext, Task> action)
method ExecuteReadContextAsync (line 464) | public Task<T> ExecuteReadContextAsync<T>(Func<TRContext, Task<T>> act...
method InsertMongoDbContextAsync (line 469) | public async Task InsertMongoDbContextAsync<T>(string collectionName, ...
class TestFixture (line 479) | public class TestFixture<TEntryPoint, TWContext, TRContext> : TestWriteF...
method TestFixture (line 79) | protected TestFixture()
method InitializeAsync (line 132) | public async Task InitializeAsync()
method DisposeAsync (line 138) | public async Task DisposeAsync()
method RegisterServices (line 145) | public virtual void RegisterServices(Action<IServiceCollection> services)
method CreateLogger (line 151) | public ILogger CreateLogger(ITestOutputHelper output)
method ExecuteScopeAsync (line 164) | protected async Task ExecuteScopeAsync(Func<IServiceProvider, Task> ac...
method ExecuteScopeAsync (line 170) | protected async Task<T> ExecuteScopeAsync<T>(Func<IServiceProvider, Ta...
method SendAsync (line 179) | public Task<TResponse> SendAsync<TResponse>(IRequest<TResponse> request)
method SendAsync (line 189) | public Task SendAsync(IRequest request)
method Publish (line 198) | public async Task Publish<TMessage>(TMessage message, CancellationToke...
method WaitForPublishing (line 205) | public async Task<bool> WaitForPublishing<TMessage>(CancellationToken ...
method WaitUntilAsync (line 221) | public Task<bool> WaitUntilAsync(
method WaitUntilConditionMet (line 244) | private async Task<bool> WaitUntilConditionMet(
method StartTestContainerAsync (line 268) | private async Task StartTestContainerAsync()
method StopTestContainerAsync (line 283) | private async Task StopTestContainerAsync()
method AddCustomAppSettings (line 292) | private void AddCustomAppSettings(IConfigurationBuilder configuration)
method AddHttpContextAccessorMock (line 319) | private IHttpContextAccessor AddHttpContextAccessorMock(IServiceProvid...
method ExecuteReadContextAsync (line 484) | public Task ExecuteReadContextAsync(Func<TRContext, Task> action)
method ExecuteReadContextAsync (line 489) | public Task<T> ExecuteReadContextAsync<T>(Func<TRContext, Task<T>> act...
method InsertMongoDbContextAsync (line 494) | public async Task InsertMongoDbContextAsync<T>(string collectionName, ...
class TestFixtureCore (line 504) | public class TestFixtureCore<TEntryPoint> : IAsyncLifetime
method TestFixtureCore (line 513) | public TestFixtureCore(
method InitializeAsync (line 527) | public async Task InitializeAsync()
method DisposeAsync (line 532) | public async Task DisposeAsync()
method InitPostgresAsync (line 539) | private async Task InitPostgresAsync()
method ResetPostgresAsync (line 582) | private async Task ResetPostgresAsync()
method ResetMongoAsync (line 597) | private async Task ResetMongoAsync(CancellationToken cancellationToken...
method ResetRabbitMqAsync (line 614) | private async Task ResetRabbitMqAsync(CancellationToken cancellationTo...
method RegisterTestsServices (line 644) | protected virtual void RegisterTestsServices(IServiceCollection servic...
method SeedDataAsync (line 646) | private async Task SeedDataAsync()
class TestReadBase (line 655) | public abstract class TestReadBase<TEntryPoint, TRContext> : TestFixture...
method TestReadBase (line 660) | protected TestReadBase(
class TestWriteBase (line 672) | public abstract class TestWriteBase<TEntryPoint, TWContext> : TestFixtur...
method TestWriteBase (line 677) | protected TestWriteBase(
class TestBase (line 689) | public abstract class TestBase<TEntryPoint, TWContext, TRContext> : Test...
method TestBase (line 695) | protected TestBase(
FILE: src/BuildingBlocks/TestBase/TestContainers.cs
class TestContainers (line 11) | public static class TestContainers
method TestContainers (line 19) | static TestContainers()
method PostgresTestContainer (line 38) | public static PostgreSqlContainer PostgresTestContainer()
method PostgresPersistTestContainer (line 55) | public static PostgreSqlContainer PostgresPersistTestContainer()
method MongoTestContainer (line 72) | public static MongoDbContainer MongoTestContainer()
method RabbitMqTestContainer (line 88) | public static RabbitMqContainer RabbitMqTestContainer()
method EventStoreTestContainer (line 105) | public static EventStoreDbContainer EventStoreTestContainer()
class RabbitMqContainerOptions (line 117) | public sealed class RabbitMqContainerOptions
class PostgresContainerOptions (line 127) | public sealed class PostgresContainerOptions
class PostgresPersistContainerOptions (line 136) | public sealed class PostgresPersistContainerOptions
class MongoContainerOptions (line 145) | public sealed class MongoContainerOptions
class EventStoreContainerOptions (line 154) | public sealed class EventStoreContainerOptions
FILE: src/BuildingBlocks/Utils/NoSynchronizationContextScope.cs
class NoSynchronizationContextScope (line 3) | public static class NoSynchronizationContextScope
method Enter (line 5) | public static Disposable Enter()
type Disposable (line 12) | public struct Disposable : IDisposable
method Disposable (line 16) | public Disposable(SynchronizationContext? synchronizationContext)
method Dispose (line 21) | public void Dispose() =>
FILE: src/BuildingBlocks/Utils/ServiceLocator.cs
class ServiceLocator (line 6) | public class ServiceLocator
method ServiceLocator (line 11) | public ServiceLocator(IServiceProvider currentServiceProvider)
method SetLocatorProvider (line 24) | public static void SetLocatorProvider(IServiceProvider serviceProvider)
method GetInstance (line 29) | public object GetInstance(Type serviceType)
method GetInstance (line 34) | public TService GetInstance<TService>()
FILE: src/BuildingBlocks/Utils/TypeProvider.cs
class TypeProvider (line 7) | public static class TypeProvider
method IsRecord (line 9) | private static bool IsRecord(this Type objectType)
method GetTypeFromAnyReferencingAssembly (line 17) | public static Type? GetTypeFromAnyReferencingAssembly(string typeName)
method GetFirstMatchingTypeFromCurrentDomainAssembly (line 32) | public static Type? GetFirstMatchingTypeFromCurrentDomainAssembly(stri...
method GetReferencedAssemblies (line 41) | public static IReadOnlyList<Assembly> GetReferencedAssemblies(Assembly...
method GetApplicationPartAssemblies (line 74) | public static IReadOnlyList<Assembly> GetApplicationPartAssemblies(Ass...
FILE: src/BuildingBlocks/Validation/Extensions.cs
class Extensions (line 6) | public static class Extensions
method HandleValidationAsync (line 11) | public static async Task HandleValidationAsync<TRequest>(this IValidat...
FILE: src/BuildingBlocks/Validation/ValidationBehavior.cs
class ValidationBehavior (line 7) | public sealed class ValidationBehavior<TRequest, TResponse> : IPipelineB...
method ValidationBehavior (line 13) | public ValidationBehavior(IServiceProvider serviceProvider)
method Handle (line 18) | public async Task<TResponse> Handle(TRequest request, RequestHandlerDe...
FILE: src/BuildingBlocks/Validation/ValidationError.cs
class ValidationError (line 3) | public class ValidationError
method ValidationError (line 9) | public ValidationError(string field, string message)
FILE: src/BuildingBlocks/Validation/ValidationResultModel.cs
class ValidationResultModel (line 9) | public class ValidationResultModel
method ToString (line 16) | public override string ToString()
FILE: src/BuildingBlocks/Web/ApiVersioningExtensions.cs
class ApiVersioningExtensions (line 6) | public static class ApiVersioningExtensions
method AddCustomVersioning (line 8) | public static void AddCustomVersioning(
FILE: src/BuildingBlocks/Web/AppOptions.cs
class AppOptions (line 3) | public class AppOptions
FILE: src/BuildingBlocks/Web/BaseController.cs
class BaseController (line 10) | [Route(BaseApiPath)]
FILE: src/BuildingBlocks/Web/ConfigurationExtensions.cs
class ConfigurationExtensions (line 10) | public static class ConfigurationExtensions
method GetOptions (line 12) | public static TModel GetOptions<TModel>(this IConfiguration configurat...
method GetOptions (line 19) | public static TModel GetOptions<TModel>(this IServiceCollection servic...
method GetOptions (line 27) | public static TModel GetOptions<TModel>(this WebApplication app, strin...
method AddValidateOptions (line 34) | public static void AddValidateOptions<TModel>(this IServiceCollection ...
FILE: src/BuildingBlocks/Web/ConfigurationHelper.cs
class ConfigurationHelper (line 5) | public static class ConfigurationHelper
method GetConfiguration (line 7) | public static IConfiguration GetConfiguration(string basePath = null)
FILE: src/BuildingBlocks/Web/CorrelationExtensions.cs
class CorrelationExtensions (line 6) | public static class CorrelationExtensions
method UseCorrelationId (line 10) | public static IApplicationBuilder UseCorrelationId(this IApplicationBu...
method GetCorrelationId (line 22) | public static Guid GetCorrelationId(this HttpContext context)
FILE: src/BuildingBlocks/Web/CurrentUserProvider.cs
type ICurrentUserProvider (line 6) | public interface ICurrentUserProvider
method GetCurrentUserId (line 8) | long? GetCurrentUserId();
class CurrentUserProvider (line 11) | public class CurrentUserProvider : ICurrentUserProvider
method CurrentUserProvider (line 15) | public CurrentUserProvider(IHttpContextAccessor httpContextAccessor)
method GetCurrentUserId (line 21) | public long? GetCurrentUserId()
FILE: src/BuildingBlocks/Web/EndpointConfig.cs
class EndpointConfig (line 5) | public class EndpointConfig
FILE: src/BuildingBlocks/Web/IMinimalEndpoint.cs
type IMinimalEndpoint (line 5) | public interface IMinimalEndpoint
method MapEndpoint (line 7) | IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder);
FILE: src/BuildingBlocks/Web/MinimalApiExtensions.cs
class MinimalApiExtensions (line 10) | public static class MinimalApiExtensions
method AddMinimalEndpoints (line 13) | public static IServiceCollection AddMinimalEndpoints(
method MapMinimalEndpoints (line 41) | public static IEndpointRouteBuilder MapMinimalEndpoints(this IEndpoint...
FILE: src/BuildingBlocks/Web/ServiceCollectionExtensions.cs
class ServiceCollectionExtensions (line 6) | public static class ServiceCollectionExtensions
method ReplaceScoped (line 8) | public static void ReplaceScoped<TService, TImplementation>(this IServ...
method ReplaceScoped (line 16) | public static void ReplaceScoped<TService>(this IServiceCollection ser...
method ReplaceTransient (line 24) | public static void ReplaceTransient<TService, TImplementation>(this IS...
method ReplaceTransient (line 32) | public static void ReplaceTransient<TService>(this IServiceCollection ...
method ReplaceSingleton (line 40) | public static void ReplaceSingleton<TService, TImplementation>(this IS...
method ReplaceSingleton (line 48) | public static void ReplaceSingleton<TService>(this IServiceCollection ...
method Unregister (line 56) | public static void Unregister<TService>(this IServiceCollection services)
method ReplaceServiceWithSingletonMock (line 62) | public static IServiceCollection ReplaceServiceWithSingletonMock<TServ...
FILE: src/BuildingBlocks/Web/ServiceProviderExtensions.cs
class ServiceProviderExtensions (line 5) | public static class ServiceProviderExtensions
method StartTestHostedServices (line 7) | public static async Task StartTestHostedServices(
method StopTestHostedServices (line 19) | public static async Task StopTestHostedServices(
FILE: src/BuildingBlocks/Web/SlugifyParameterTransformer.cs
class SlugifyParameterTransformer (line 7) | public class SlugifyParameterTransformer : IOutboundParameterTransformer
method TransformOutbound (line 9) | public string TransformOutbound(object value)
FILE: src/Services/Booking/src/Booking.Api/Program.cs
class Program (line 19) | public partial class Program
FILE: src/Services/Booking/src/Booking/Booking/Dtos/CreateReservation.cs
type BookingResponseDto (line 3) | public record BookingResponseDto(Guid Id, string Name, string FlightNumb...
FILE: src/Services/Booking/src/Booking/Booking/Exceptions/BookingAlreadyExistException.cs
class BookingAlreadyExistException (line 6) | public class BookingAlreadyExistException : AppException
method BookingAlreadyExistException (line 8) | public BookingAlreadyExistException(int? code = default) : base("Booki...
FILE: src/Services/Booking/src/Booking/Booking/Exceptions/FlightNotFoundException.cs
class FlightNotFoundException (line 6) | public class FlightNotFoundException : AppException
method FlightNotFoundException (line 8) | public FlightNotFoundException() : base("Flight doesn't exist!", HttpS...
FILE: src/Services/Booking/src/Booking/Booking/Exceptions/InvalidAircraftIdException.cs
class InvalidAircraftIdException (line 5) | public class InvalidAircraftIdException : DomainException
method InvalidAircraftIdException (line 7) | public InvalidAircraftIdException(Guid aircraftId)
FILE: src/Services/Booking/src/Booking/Booking/Exceptions/InvalidArriveAirportIdException.cs
class InvalidArriveAirportIdException (line 5) | public class InvalidArriveAirportIdException : DomainException
method InvalidArriveAirportIdException (line 7) | public InvalidArriveAirportIdException(Guid arriveAirportId)
FILE: src/Services/Booking/src/Booking/Booking/Exceptions/InvalidDepartureAirportIdException.cs
class InvalidDepartureAirportIdException (line 5) | public class InvalidDepartureAirportIdException : DomainException
method InvalidDepartureAirportIdException (line 7) | public InvalidDepartureAirportIdException(Guid departureAirportId)
FILE: src/Services/Booking/src/Booking/Booking/Exceptions/InvalidFlightDateException.cs
class InvalidFlightDateException (line 5) | public class InvalidFlightDateException : DomainException
method InvalidFlightDateException (line 7) | public InvalidFlightDateException(DateTime flightDate)
FILE: src/Services/Booking/src/Booking/Booking/Exceptions/InvalidFlightNumberException.cs
class InvalidFlightNumberException (line 5) | public class InvalidFlightNumberException : DomainException
method InvalidFlightNumberException (line 7) | public InvalidFlightNumberException(string flightNumber)
FILE: src/Services/Booking/src/Booking/Booking/Exceptions/InvalidPassengerNameException.cs
class InvalidPassengerNameException (line 5) | public class InvalidPassengerNameException : DomainException
method InvalidPassengerNameException (line 7) | public InvalidPassengerNameException(string passengerName)
FILE: src/Services/Booking/src/Booking/Booking/Exceptions/InvalidPriceException.cs
class InvalidPriceException (line 5) | public class InvalidPriceException : DomainException
method InvalidPriceException (line 7) | public InvalidPriceException(decimal price)
FILE: src/Services/Booking/src/Booking/Booking/Exceptions/SeatNumberException.cs
class SeatNumberException (line 5) | public class SeatNumberException : DomainException
method SeatNumberException (line 7) | public SeatNumberException(string seatNumber)
FILE: src/Services/Booking/src/Booking/Booking/Features/BookingMappings.cs
class BookingMappings (line 8) | public class BookingMappings : IRegister
method Register (line 10) | public void Register(TypeAdapterConfig config)
FILE: src/Services/Booking/src/Booking/Booking/Features/CreatingBook/V1/CreateBooking.cs
type CreateBooking (line 24) | public record CreateBooking(Guid PassengerId, Guid FlightId, string Desc...
type CreateBookingResult (line 29) | public record CreateBookingResult(ulong Id);
type BookingCreatedDomainEvent (line 31) | public record BookingCreatedDomainEvent(Guid Id, PassengerInfo Passenger...
type CreateBookingRequestDto (line 33) | public record CreateBookingRequestDto(Guid PassengerId, Guid FlightId, s...
type CreateBookingResponseDto (line 35) | public record CreateBookingResponseDto(ulong Id);
class CreateBookingEndpoint (line 37) | public class CreateBookingEndpoint : IMinimalEndpoint
method MapEndpoint (line 39) | public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
class CreateBookingValidator (line 67) | public class CreateBookingValidator : AbstractValidator<CreateBooking>
method CreateBookingValidator (line 69) | public CreateBookingValidator()
class CreateBookingCommandHandler (line 76) | internal class CreateBookingCommandHandler : ICommandHandler<CreateBooki...
method CreateBookingCommandHandler (line 84) | public CreateBookingCommandHandler(IEventStoreDBRepository<Models.Book...
method Handle (line 97) | public async Task<CreateBookingResult> Handle(CreateBooking command, C...
FILE: src/Services/Booking/src/Booking/Booking/Models/Booking.cs
type Booking (line 8) | public record Booking : AggregateEventSourcing<Guid>
FILE: src/Services/Booking/src/Booking/Booking/Models/BookingReadModel.cs
class BookingReadModel (line 5) | public class BookingReadModel
FILE: src/Services/Booking/src/Booking/Booking/ValueObjects/PassengerInfo.cs
type PassengerInfo (line 5) | public record PassengerInfo
FILE: src/Services/Booking/src/Booking/Booking/ValueObjects/Trip.cs
type Trip (line 5) | public record Trip
FILE: src/Services/Booking/src/Booking/BookingEventMapper.cs
class BookingEventMapper (line 9) | public sealed class BookingEventMapper : IEventMapper
method MapToIntegrationEvent (line 11) | public IIntegrationEvent? MapToIntegrationEvent(IDomainEvent @event)
method MapToInternalCommand (line 20) | public IInternalCommand? MapToInternalCommand(IDomainEvent @event)
FILE: src/Services/Booking/src/Booking/BookingProjection.cs
class BookingProjection (line 14) | public class BookingProjection : IProjectionProcessor
method BookingProjection (line 18) | public BookingProjection(BookingReadDbContext bookingReadDbContext)
method ProcessEventAsync (line 23) | public async Task ProcessEventAsync<T>(StreamEvent<T> streamEvent, Can...
method Apply (line 34) | private async Task Apply(BookingCreatedDomainEvent @event, Cancellatio...
FILE: src/Services/Booking/src/Booking/BookingRoot.cs
class BookingRoot (line 3) | public class BookingRoot
FILE: src/Services/Booking/src/Booking/Configuration/GrpcOptions.cs
class GrpcOptions (line 3) | public class GrpcOptions
FILE: src/Services/Booking/src/Booking/Data/BookingReadDbContext.cs
class BookingReadDbContext (line 10) | public class BookingReadDbContext : MongoDbContext
method BookingReadDbContext (line 12) | public BookingReadDbContext(IOptions<MongoOptions> options) : base(opt...
FILE: src/Services/Booking/src/Booking/Extensions/Infrastructure/GrpcClientExtensions.cs
class GrpcClientExtensions (line 11) | public static class GrpcClientExtensions
method AddGrpcClients (line 13) | public static IServiceCollection AddGrpcClients(this IServiceCollectio...
FILE: src/Services/Booking/src/Booking/Extensions/Infrastructure/InfrastructureExtensions.cs
class InfrastructureExtensions (line 26) | public static class InfrastructureExtensions
method AddInfrastructure (line 28) | public static WebApplicationBuilder AddInfrastructure(this WebApplicat...
method UseInfrastructure (line 73) | public static WebApplication UseInfrastructure(this WebApplication app)
FILE: src/Services/Booking/src/Booking/Extensions/Infrastructure/MediatRExtensions.cs
class MediatRExtensions (line 8) | public static class MediatRExtensions
method AddCustomMediatR (line 10) | public static IServiceCollection AddCustomMediatR(this IServiceCollect...
FILE: src/Services/Booking/tests/IntegrationTest/Booking/Features/CreateBookingTests.cs
class CreateBookingTests (line 20) | public class CreateBookingTests : BookingIntegrationTestBase
method CreateBookingTests (line 22) | public CreateBookingTests(TestReadFixture<Program, BookingReadDbContex...
method RegisterTestsServices (line 25) | protected override void RegisterTestsServices(IServiceCollection servi...
method should_create_booking_to_event_store_currectly (line 31) | [Fact]
method MockPassengerGrpcServices (line 46) | private void MockPassengerGrpcServices(IServiceCollection services)
method MockFlightGrpcServices (line 70) | private void MockFlightGrpcServices(IServiceCollection services)
FILE: src/Services/Booking/tests/IntegrationTest/BookingIntegrationTestBase.cs
class BookingIntegrationTestBase (line 7) | [Collection(IntegrationTestCollection.Name)]
method BookingIntegrationTestBase (line 10) | public BookingIntegrationTestBase(TestReadFixture<Program, BookingRead...
class IntegrationTestCollection (line 14) | [CollectionDefinition(Name)]
FILE: src/Services/Booking/tests/IntegrationTest/Fakes/FakeCreateBookingCommand.cs
class FakeCreateBookingCommand (line 9) | public sealed class FakeCreateBookingCommand : AutoFaker<CreateBooking>
method FakeCreateBookingCommand (line 11) | public FakeCreateBookingCommand()
FILE: src/Services/Booking/tests/IntegrationTest/Fakes/FakeFlightResponse.cs
class FakeFlightResponse (line 8) | public static class FakeFlightResponse
method Generate (line 10) | public static GetFlightByIdResult Generate()
FILE: src/Services/Booking/tests/IntegrationTest/Fakes/FakeGetAvailableSeatsResponse.cs
class FakeGetAvailableSeatsResponse (line 9) | public static class FakeGetAvailableSeatsResponse
method Generate (line 11) | public static GetAvailableSeatsResult Generate()
FILE: src/Services/Booking/tests/IntegrationTest/Fakes/FakePassengerResponse.cs
class FakePassengerResponse (line 6) | public static class FakePassengerResponse
method Generate (line 8) | public static GetPassengerByIdResult Generate()
FILE: src/Services/Booking/tests/IntegrationTest/Fakes/FakeReserveSeatResponse.cs
class FakeReserveSeatResponse (line 6) | public static class FakeReserveSeatResponse
method Generate (line 8) | public static ReserveSeatResult Generate()
FILE: src/Services/Booking/tests/PerformanceTest/script.js
constant BASE_URL (line 18) | const BASE_URL = "/";
constant SLEEP_DURATION (line 21) | const SLEEP_DURATION = 0.1;
FILE: src/Services/Flight/src/Flight.Api/Program.cs
class Program (line 20) | public partial class Program
FILE: src/Services/Flight/src/Flight/Aircrafts/Dtos/AircraftDto.cs
type AircraftDto (line 3) | public record AircraftDto(long Id, string Name, string Model, int Manufa...
FILE: src/Services/Flight/src/Flight/Aircrafts/Exceptions/AircraftAlreadyExistException.cs
class AircraftAlreadyExistException (line 6) | public class AircraftAlreadyExistException : AppException
method AircraftAlreadyExistException (line 8) | public AircraftAlreadyExistException() : base("Aircraft already exist!...
FILE: src/Services/Flight/src/Flight/Aircrafts/Exceptions/InvalidAircraftIdException.cs
class InvalidAircraftIdException (line 5) | public class InvalidAircraftIdException : DomainException
method InvalidAircraftIdException (line 7) | public InvalidAircraftIdException(Guid aircraftId)
FILE: src/Services/Flight/src/Flight/Aircrafts/Exceptions/InvalidManufacturingYearException.cs
class InvalidManufacturingYearException (line 5) | public class InvalidManufacturingYearException : DomainException
method InvalidManufacturingYearException (line 7) | public InvalidManufacturingYearException() : base("ManufacturingYear m...
FILE: src/Services/Flight/src/Flight/Aircrafts/Exceptions/InvalidModelException.cs
class InvalidModelException (line 5) | public class InvalidModelException : DomainException
method InvalidModelException (line 7) | public InvalidModelException() : base("Model cannot be empty or whites...
FILE: src/Services/Flight/src/Flight/Aircrafts/Exceptions/InvalidNameException.cs
class InvalidNameException (line 5) | public class InvalidNameException : DomainException
method InvalidNameException (line 7) | public InvalidNameException() : base("Name cannot be empty or whitespa...
FILE: src/Services/Flight/src/Flight/Aircrafts/Features/AircraftMappings.cs
class AircraftMappings (line 10) | public class AircraftMappings : IRegister
method Register (line 12) | public void Register(TypeAdapterConfig config)
FILE: src/Services/Flight/src/Flight/Aircrafts/Features/CreatingAircraft/V1/CreateAircraft.cs
type CreateAircraft (line 26) | public record CreateAircraft(string Name, string Model, int Manufacturin...
type CreateAircraftResult (line 32) | public record CreateAircraftResult(AircraftId Id);
type AircraftCreatedDomainEvent (line 34) | public record AircraftCreatedDomainEvent
type CreateAircraftRequestDto (line 37) | public record CreateAircraftRequestDto(string Name, string Model, int Ma...
type CreateAircraftResponseDto (line 39) | public record CreateAircraftResponseDto(Guid Id);
class CreateAircraftEndpoint (line 41) | public class CreateAircraftEndpoint : IMinimalEndpoint
method MapEndpoint (line 43) | public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
class CreateAircraftValidator (line 71) | public class CreateAircraftValidator : AbstractValidator<CreateAircraft>
method CreateAircraftValidator (line 73) | public CreateAircraftValidator()
class CreateAircraftHandler (line 81) | internal class CreateAircraftHandler : IRequestHandler<CreateAircraft, C...
method CreateAircraftHandler (line 85) | public CreateAircraftHandler(FlightDbContext flightDbContext)
method Handle (line 90) | public async Task<CreateAircraftResult> Handle(CreateAircraft request,...
FILE: src/Services/Flight/src/Flight/Aircrafts/Features/CreatingAircraft/V1/CreateAircraftMongo.cs
type CreateAircraftMongo (line 18) | public record CreateAircraftMongo(Guid Id, string Name, string Model, in...
class CreateAircraftMongoHandler (line 20) | internal class CreateAircraftMongoHandler : ICommandHandler<CreateAircra...
method CreateAircraftMongoHandler (line 25) | public CreateAircraftMongoHandler(
method Handle (line 33) | public async Task<Unit> Handle(CreateAircraftMongo request, Cancellati...
FILE: src/Services/Flight/src/Flight/Aircrafts/Models/Aircraft.cs
type Aircraft (line 8) | public record Aircraft : Aggregate<AircraftId>
FILE: src/Services/Flight/src/Flight/Aircrafts/Models/AircraftReadModel.cs
class AircraftReadModel (line 5) | public class AircraftReadModel
FILE: src/Services/Flight/src/Flight/Aircrafts/ValueObjects/AircraftId.cs
type AircraftId (line 6) | public record AircraftId
FILE: src/Services/Flight/src/Flight/Aircrafts/ValueObjects/ManufacturingYear.cs
type ManufacturingYear (line 5) | public record ManufacturingYear
FILE: src/Services/Flight/src/Flight/Aircrafts/ValueObjects/Model.cs
type Model (line 5) | public record Model
FILE: src/Services/Flight/src/Flight/Aircrafts/ValueObjects/Name.cs
type Name (line 5) | public record Name
FILE: src/Services/Flight/src/Flight/Airports/Dtos/AirportDto.cs
type AirportDto (line 3) | public record AirportDto(long Id, string Name, string Address, string Co...
FILE: src/Services/Flight/src/Flight/Airports/Exceptions/AirportAlreadyExistException.cs
class AirportAlreadyExistException (line 6) | public class AirportAlreadyExistException : AppException
method AirportAlreadyExistException (line 8) | public AirportAlreadyExistException(int? code = default) : base("Airpo...
FILE: src/Services/Flight/src/Flight/Airports/Exceptions/InvalidAddressException.cs
class InvalidAddressException (line 5) | public class InvalidAddressException : DomainException
method InvalidAddressException (line 7) | public InvalidAddressException() : base("Address cannot be empty or wh...
FILE: src/Services/Flight/src/Flight/Airports/Exceptions/InvalidAirportIdException.cs
class InvalidAirportIdException (line 5) | public class InvalidAirportIdException : DomainException
method InvalidAirportIdException (line 7) | public InvalidAirportIdException(Guid airportId)
FILE: src/Services/Flight/src/Flight/Airports/Exceptions/InvalidCodeException.cs
class InvalidCodeException (line 5) | public class InvalidCodeException : DomainException
method InvalidCodeException (line 7) | public InvalidCodeException() : base("Code cannot be empty or whitespa...
FILE: src/Services/Flight/src/Flight/Airports/Exceptions/InvalidNameException.cs
class InvalidNameException (line 5) | public class InvalidNameException : DomainException
method InvalidNameException (line 7) | public InvalidNameException() : base("Name cannot be empty or whitespa...
FILE: src/Services/Flight/src/Flight/Airports/Features/AirportMappings.cs
class AirportMappings (line 8) | public class AirportMappings : IRegister
method Register (line 10) | public void Register(TypeAdapterConfig config)
FILE: src/Services/Flight/src/Flight/Airports/Features/CreatingAirport/V1/CreateAirport.cs
type CreateAirport (line 24) | public record CreateAirport(string Name, string Address, string Code) : ...
type CreateAirportResult (line 29) | public record CreateAirportResult(Guid Id);
type AirportCreatedDomainEvent (line 31) | public record AirportCreatedDomainEvent
type CreateAirportRequestDto (line 34) | public record CreateAirportRequestDto(string Name, string Address, strin...
type CreateAirportResponseDto (line 36) | public record CreateAirportResponseDto(Guid Id);
class CreateAirportEndpoint (line 38) | public class CreateAirportEndpoint : IMinimalEndpoint
method MapEndpoint (line 40) | public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
class CreateAirportValidator (line 68) | public class CreateAirportValidator : AbstractValidator<CreateAirport>
method CreateAirportValidator (line 70) | public CreateAirportValidator()
class CreateAirportHandler (line 78) | internal class CreateAirportHandler : IRequestHandler<CreateAirport, Cre...
method CreateAirportHandler (line 82) | public CreateAirportHandler(FlightDbContext flightDbContext)
method Handle (line 87) | public async Task<CreateAirportResult> Handle(CreateAirport request, C...
FILE: src/Services/Flight/src/Flight/Airports/Features/CreatingAirport/V1/CreateAirportMongo.cs
type CreateAirportMongo (line 17) | public record CreateAirportMongo(Guid Id, string Name, string Address, s...
class CreateAirportMongoHandler (line 19) | internal class CreateAirportMongoHandler : ICommandHandler<CreateAirport...
method CreateAirportMongoHandler (line 24) | public CreateAirportMongoHandler(
method Handle (line 32) | public async Task<Unit> Handle(CreateAirportMongo request, Cancellatio...
FILE: src/Services/Flight/src/Flight/Airports/Models/Airport.cs
type Airport (line 8) | public record Airport : Aggregate<AirportId>
FILE: src/Services/Flight/src/Flight/Airports/Models/AirportReadModel.cs
class AirportReadModel (line 5) | public class AirportReadModel
FILE: src/Services/Flight/src/Flight/Airports/ValueObjects/Address.cs
class Address (line 5) | public class Address
method Address (line 9) | private Address(string value)
method Of (line 14) | public static Address Of(string value)
FILE: src/Services/Flight/src/Flight/Airports/ValueObjects/AirportId.cs
type AirportId (line 6) | public record AirportId
FILE: src/Services/Flight/src/Flight/Airports/ValueObjects/Code.cs
type Code (line 5) | public record Code
FILE: src/Services/Flight/src/Flight/Airports/ValueObjects/Name.cs
type Name (line 5) | public record Name
FILE: src/Services/Flight/src/Flight/Data/Configurations/AircraftConfiguration.cs
class AircraftConfiguration (line 10) | public class AircraftConfiguration : IEntityTypeConfiguration<Aircraft>
method Configure (line 12) | public void Configure(EntityTypeBuilder<Aircraft> builder)
FILE: src/Services/Flight/src/Flight/Data/Configurations/AirportConfiguration.cs
class AirportConfiguration (line 10) | public class AirportConfiguration : IEntityTypeConfiguration<Airport>
method Configure (line 12) | public void Configure(EntityTypeBuilder<Airport> builder)
FILE: src/Services/Flight/src/Flight/Data/Configurations/FlightConfiguration.cs
class FlightConfiguration (line 12) | public class FlightConfiguration : IEntityTypeConfiguration<Flights.Mode...
method Configure (line 14) | public void Configure(EntityTypeBuilder<Flights.Models.Flight> builder)
FILE: src/Services/Flight/src/Flight/Data/Configurations/SeatConfiguration.cs
class SeatConfiguration (line 10) | public class SeatConfiguration : IEntityTypeConfiguration<Seat>
method Configure (line 12) | public void Configure(EntityTypeBuilder<Seat> builder)
FILE: src/Services/Flight/src/Flight/Data/DesignTimeDbContextFactory.cs
class DesignTimeDbContextFactory (line 6) | public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<Fl...
method CreateDbContext (line 8) | public FlightDbContext CreateDbContext(string[] args)
FILE: src/Services/Flight/src/Flight/Data/FlightDbContext.cs
class FlightDbContext (line 12) | public sealed class FlightDbContext : AppDbContextBase
method FlightDbContext (line 14) | public FlightDbContext(DbContextOptions<FlightDbContext> options, ICur...
method OnModelCreating (line 25) | protected override void OnModelCreating(ModelBuilder builder)
FILE: src/Services/Flight/src/Flight/Data/FlightReadDbContext.cs
class FlightReadDbContext (line 13) | public class FlightReadDbContext : MongoDbContext
method FlightReadDbContext (line 15) | public FlightReadDbContext(IOptions<MongoOptions> options) : base(opti...
FILE: src/Services/Flight/src/Flight/Data/Migrations/20230611230948_initial.Designer.cs
class initial (line 14) | [DbContext(typeof(FlightDbContext))]
method BuildTargetModel (line 19) | protected override void BuildTargetModel(ModelBuilder modelBuilder)
FILE: src/Services/Flight/src/Flight/Data/Migrations/20230611230948_initial.cs
class initial (line 9) | public partial class initial : Migration
method Up (line 12) | protected override void Up(MigrationBuilder migrationBuilder)
method Down (line 148) | protected override void Down(MigrationBuilder migrationBuilder)
FILE: src/Services/Flight/src/Flight/Data/Migrations/FlightDbContextModelSnapshot.cs
class FlightDbContextModelSnapshot (line 13) | [DbContext(typeof(FlightDbContext))]
method BuildModel (line 16) | protected override void BuildModel(ModelBuilder modelBuilder)
FILE: src/Services/Flight/src/Flight/Data/Seed/FlightDataSeeder.cs
class FlightDataSeeder (line 13) | public class FlightDataSeeder(
method SeedAllAsync (line 19) | public async Task SeedAllAsync()
method SeedAirportAsync (line 32) | private async Task SeedAirportAsync()
method SeedAircraftAsync (line 46) | private async Task SeedAircraftAsync()
method SeedSeatAsync (line 61) | private async Task SeedSeatAsync()
method SeedFlightAsync (line 75) | private async Task SeedFlightAsync()
FILE: src/Services/Flight/src/Flight/Data/Seed/InitialData.cs
class InitialData (line 18) | public static class InitialData
method InitialData (line 26) | static InitialData()
FILE: src/Services/Flight/src/Flight/Extensions/Infrastructure/InfrastructureExtensions.cs
class InfrastructureExtensions (line 30) | public static class InfrastructureExtensions
method AddInfrastructure (line 32) | public static WebApplicationBuilder AddInfrastructure(this WebApplicat...
method UseInfrastructure (line 79) | public static WebApplication UseInfrastructure(this WebApplication app)
FILE: src/Services/Flight/src/Flight/Extensions/Infrastructure/MediatRExtensions.cs
class MediatRExtensions (line 10) | public static class MediatRExtensions
method AddCustomMediatR (line 12) | public static IServiceCollection AddCustomMediatR(this IServiceCollect...
FILE: src/Services/Flight/src/Flight/FlightEventMapper.cs
class FlightEventMapper (line 17) | public sealed class FlightEventMapper : IEventMapper
method MapToIntegrationEvent (line 19) | public IIntegrationEvent? MapToIntegrationEvent(IDomainEvent @event)
method MapToInternalCommand (line 34) | public IInternalCommand? MapToInternalCommand(IDomainEvent @event)
FILE: src/Services/Flight/src/Flight/FlightRoot.cs
class FlightRoot (line 3) | public class FlightRoot
FILE: src/Services/Flight/src/Flight/Flights/Dtos/FlightDto.cs
type FlightDto (line 5) | public record FlightDto(Guid Id, string FlightNumber, Guid AircraftId, G...
FILE: src/Services/Flight/src/Flight/Flights/Enums/FlightStatus.cs
type FlightStatus (line 3) | public enum FlightStatus
FILE: src/Services/Flight/src/Flight/Flights/Exceptions/FlightAlreadyExistException.cs
class FlightAlreadyExistException (line 6) | public class FlightAlreadyExistException : AppException
method FlightAlreadyExistException (line 8) | public FlightAlreadyExistException(int? code = default) : base("Flight...
FILE: src/Services/Flight/src/Flight/Flights/Exceptions/FlightNotFountException.cs
class FlightNotFountException (line 6) | public class FlightNotFountException : AppException
method FlightNotFountException (line 8) | public FlightNotFountException() : base("Flight not found!", HttpStatu...
FILE: src/Services/Flight/src/Flight/Flights/Exceptions/InvalidArriveDateException.cs
class InvalidArriveDateException (line 5) | public class InvalidArriveDateException : DomainException
method InvalidArriveDateException (line 7) | public InvalidArriveDateException(DateTime arriveDate)
FILE: src/Services/Flight/src/Flight/Flights/Exceptions/InvalidDepartureDateException.cs
class InvalidDepartureDateException (line 5) | public class InvalidDepartureDateException : DomainException
method InvalidDepartureDateException (line 7) | public InvalidDepartureDateException(DateTime departureDate)
FILE: src/Services/Flight/src/Flight/Flights/Exceptions/InvalidDurationException.cs
class InvalidDurationException (line 5) | public class InvalidDurationException : DomainException
method InvalidDurationException (line 7) | public InvalidDurationException()
FILE: src/Services/Flight/src/Flight/Flights/Exceptions/InvalidFlightDateException.cs
class InvalidFlightDateException (line 5) | public class InvalidFlightDateException : DomainException
method InvalidFlightDateException (line 7) | public InvalidFlightDateException(DateTime flightDate)
FILE: src/Services/Flight/src/Flight/Flights/Exceptions/InvalidFlightIdException.cs
class InvalidFlightIdException (line 5) | public class InvalidFlightIdException : DomainException
method InvalidFlightIdException (line 7) | public InvalidFlightIdException(Guid flightId)
FILE: src/Services/Flight/src/Flight/Flights/Exceptions/InvalidFlightNumberException.cs
class InvalidFlightNumberException (line 5) | public class InvalidFlightNumberException : DomainException
method InvalidFlightNumberException (line 7) | public InvalidFlightNumberException(string flightNumber)
FILE: src/Services/Flight/src/Flight/Flights/Exceptions/InvalidPriceException.cs
class InvalidPriceException (line 5) | public class InvalidPriceException : DomainException
method InvalidPriceException (line 7) | public InvalidPriceException()
FILE: src/Services/Flight/src/Flight/Flights/Features/CreatingFlight/V1/CreateFlight.cs
type CreateFlight (line 26) | public record CreateFlight(string FlightNumber, Guid AircraftId, Guid De...
type CreateFlightResult (line 34) | public record CreateFlightResult(Guid Id);
type FlightCreatedDomainEvent (line 36) | public record FlightCreatedDomainEvent(Guid Id, string FlightNumber, Gui...
type CreateFlightRequestDto (line 40) | public record CreateFlightRequestDto(string FlightNumber, Guid AircraftI...
type CreateFlightResponseDto (line 44) | public record CreateFlightResponseDto(Guid Id);
class CreateFlightEndpoint (line 46) | public class CreateFlightEndpoint : IMinimalEndpoint
method MapEndpoint (line 48) | public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
class CreateFlightValidator (line 76) | public class CreateFlightValidator : AbstractValidator<CreateFlight>
method CreateFlightValidator (line 78) | public CreateFlightValidator()
class CreateFlightHandler (line 97) | internal class CreateFlightHandler : ICommandHandler<CreateFlight, Creat...
method CreateFlightHandler (line 101) | public CreateFlightHandler(FlightDbContext flightDbContext)
method Handle (line 106) | public async Task<CreateFlightResult> Handle(CreateFlight request, Can...
FILE: src/Services/Flight/src/Flight/Flights/Features/CreatingFlight/V1/CreateFlightMongo.cs
type CreateFlightMongo (line 17) | public record CreateFlightMongo(Guid Id, string FlightNumber, Guid Aircr...
class CreateFlightMongoHandler (line 21) | internal class CreateFlightMongoHandler : ICommandHandler<CreateFlightMo...
method CreateFlightMongoHandler (line 26) | public CreateFlightMongoHandler(
method Handle (line 34) | public async Task<Unit> Handle(CreateFlightMongo request, Cancellation...
FILE: src/Services/Flight/src/Flight/Flights/Features/DeletingFlight/V1/DeleteFlight.cs
type DeleteFlight (line 17) | public record DeleteFlight(Guid Id) : ICommand<DeleteFlightResult>, IInt...
type DeleteFlightResult (line 19) | public record DeleteFlightResult(Guid Id);
type FlightDeletedDomainEvent (line 21) | public record FlightDeletedDomainEvent(
class DeleteFlightEndpoint (line 36) | public class DeleteFlightEndpoint : IMinimalEndpoint
method MapEndpoint (line 38) | public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
class DeleteFlightValidator (line 62) | public class DeleteFlightValidator : AbstractValidator<DeleteFlight>
method DeleteFlightValidator (line 64) | public DeleteFlightValidator()
class DeleteFlightHandler (line 70) | internal class DeleteFlightHandler : ICommandHandler<DeleteFlight, Delet...
method DeleteFlightHandler (line 74) | public DeleteFlightHandler(FlightDbContext flightDbContext)
method Handle (line 79) | public async Task<DeleteFlightResult> Handle(
FILE: src/Services/Flight/src/Flight/Flights/Features/DeletingFlight/V1/DeleteFlightMongo.cs
type DeleteFlightMongo (line 17) | public record DeleteFlightMongo(Guid Id, string FlightNumber, Guid Aircr...
class DeleteFlightMongoCommandHandler (line 21) | internal class DeleteFlightMongoCommandHandler : ICommandHandler<DeleteF...
method DeleteFlightMongoCommandHandler (line 26) | public DeleteFlightMongoCommandHandler(
method Handle (line 34) | public async Task<Unit> Handle(DeleteFlightMongo request, Cancellation...
FILE: src/Services/Flight/src/Flight/Flights/Features/FlightMappings.cs
class FlightMappings (line 12) | public class FlightMappings : IRegister
method Register (line 14) | public void Register(TypeAdapterConfig config)
FILE: src/Services/Flight/src/Flight/Flights/Features/GettingAvailableFlights/V1/GetAvailableFlights.cs
type GetAvailableFlights (line 26) | public record GetAvailableFlights : IQuery<GetAvailableFlightsResult>, I...
type GetAvailableFlightsResult (line 32) | public record GetAvailableFlightsResult(IEnumerable<FlightDto> FlightDtos);
type GetAvailableFlightsResponseDto (line 34) | public record GetAvailableFlightsResponseDto(IEnumerable<FlightDto> Flig...
class GetAvailableFlightsEndpoint (line 36) | public class GetAvailableFlightsEndpoint : IMinimalEndpoint
method MapEndpoint (line 38) | public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
class GetAvailableFlightsHandler (line 63) | internal class GetAvailableFlightsHandler : IQueryHandler<GetAvailableFl...
method GetAvailableFlightsHandler (line 68) | public GetAvailableFlightsHandler(IMapper mapper, FlightReadDbContext ...
method Handle (line 74) | public async Task<GetAvailableFlightsResult> Handle(GetAvailableFlight...
FILE: src/Services/Flight/src/Flight/Flights/Features/GettingFlightById/V1/GetFlightById.cs
type GetFlightById (line 23) | public record GetFlightById(Guid Id) : IQuery<GetFlightByIdResult>;
type GetFlightByIdResult (line 25) | public record GetFlightByIdResult(FlightDto FlightDto);
type GetFlightByIdResponseDto (line 27) | public record GetFlightByIdResponseDto(FlightDto FlightDto);
class GetFlightByIdEndpoint (line 29) | public class GetFlightByIdEndpoint : IMinimalEndpoint
method MapEndpoint (line 31) | public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
class GetFlightByIdValidator (line 56) | public class GetFlightByIdValidator : AbstractValidator<GetFlightById>
method GetFlightByIdValidator (line 58) | public GetFlightByIdValidator()
class GetFlightByIdHandler (line 64) | internal class GetFlightByIdHandler : IQueryHandler<GetFlightById, GetFl...
method GetFlightByIdHandler (line 69) | public GetFlightByIdHandler(IMapper mapper, FlightReadDbContext flight...
method Handle (line 75) | public async Task<GetFlightByIdResult> Handle(GetFlightById request, C...
FILE: src/Services/Flight/src/Flight/Flights/Features/UpdatingFlight/V1/UpdateFlight.cs
type UpdateFlight (line 26) | public record UpdateFlight(Guid Id, string FlightNumber, Guid AircraftId...
type UpdateFlightResult (line 34) | public record UpdateFlightResult(Guid Id);
type FlightUpdatedDomainEvent (line 36) | public record FlightUpdatedDomainEvent(Guid Id, string FlightNumber, Gui...
type UpdateFlightRequestDto (line 40) | public record UpdateFlightRequestDto(Guid Id, string FlightNumber, Guid ...
class UpdateFlightEndpoint (line 45) | public class UpdateFlightEndpoint : IMinimalEndpoint
method MapEndpoint (line 47) | public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
class UpdateFlightValidator (line 73) | public class UpdateFlightValidator : AbstractValidator<CreateFlight>
method UpdateFlightValidator (line 75) | public UpdateFlightValidator()
class UpdateFlightHandler (line 94) | internal class UpdateFlightHandler : ICommandHandler<UpdateFlight, Updat...
method UpdateFlightHandler (line 98) | public UpdateFlightHandler(FlightDbContext flightDbContext)
method Handle (line 103) | public async Task<UpdateFlightResult> Handle(UpdateFlight request, Can...
FILE: src/Services/Flight/src/Flight/Flights/Features/UpdatingFlight/V1/UpdateFlightMongo.cs
type UpdateFlightMongo (line 17) | public record UpdateFlightMongo(Guid Id, string FlightNumber, Guid Aircr...
class UpdateFlightMongoCommandHandler (line 22) | internal class UpdateFlightMongoCommandHandler : ICommandHandler<UpdateF...
method UpdateFlightMongoCommandHandler (line 27) | public UpdateFlightMongoCommandHandler(
method Handle (line 35) | public async Task<Unit> Handle(UpdateFlightMongo request, Cancellation...
FILE: src/Services/Flight/src/Flight/Flights/Models/Flight.cs
type Flight (line 12) | public record Flight : Aggregate<FlightId>
FILE: src/Services/Flight/src/Flight/Flights/Models/FlightReadModel.cs
class FlightReadModel (line 5) | public class FlightReadModel
FILE: src/Services/Flight/src/Flight/Flights/ValueObjects/ArriveDate.cs
type ArriveDate (line 6) | public record ArriveDate
FILE: src/Services/Flight/src/Flight/Flights/ValueObjects/DepartureDate.cs
type DepartureDate (line 7) | public record DepartureDate
FILE: src/Services/Flight/src/Flight/Flights/ValueObjects/DurationMinutes.cs
class DurationMinutes (line 5) | public class DurationMinutes
method DurationMinutes (line 9) | private DurationMinutes(decimal value)
method Of (line 14) | public static DurationMinutes Of(decimal value)
FILE: src/Services/Flight/src/Flight/Flights/ValueObjects/FlightDate.cs
type FlightDate (line 6) | public record FlightDate
FILE: src/Services/Flight/src/Flight/Flights/ValueObjects/FlightId.cs
type FlightId (line 6) | public record FlightId
FILE: src/Services/Flight/src/Flight/Flights/ValueObjects/FlightNumber.cs
type FlightNumber (line 5) | public record FlightNumber
FILE: src/Services/Flight/src/Flight/Flights/ValueObjects/Price.cs
class Price (line 5) | public class Price
method Price (line 9) | private Price(decimal value)
method Of (line 14) | public static Price Of(decimal value)
FILE: src/Services/Flight/src/Flight/GrpcServer/Services/FlightGrpcServices.cs
class FlightGrpcServices (line 16) | public class FlightGrpcServices : FlightGrpcService.FlightGrpcServiceBase
method FlightGrpcServices (line 20) | public FlightGrpcServices(IMediator mediator)
method GetById (line 25) | public override async Task<GetFlightByIdResult> GetById(GetByIdRequest...
method GetAvailableSeats (line 31) | public override async Task<GetAvailableSeatsResult> GetAvailableSeats(...
method ReserveSeat (line 50) | public override async Task<ReserveSeatResult> ReserveSeat(ReserveSeatR...
FILE: src/Services/Flight/src/Flight/Seats/Dtos/SeatDto.cs
type SeatDto (line 5) | public record SeatDto(Guid Id, string SeatNumber, Enums.SeatType Type, E...
FILE: src/Services/Flight/src/Flight/Seats/Enums/SeatClass.cs
type SeatClass (line 3) | public enum SeatClass
FILE: src/Services/Flight/src/Flight/Seats/Enums/SeatType.cs
type SeatType (line 3) | public enum SeatType
FILE: src/Services/Flight/src/Flight/Seats/Exceptions/AllSeatsFullException.cs
class AllSeatsFullException (line 5) | public class AllSeatsFullException : AppException
method AllSeatsFullException (line 7) | public AllSeatsFullException() : base("All seats are full!")
FILE: src/Services/Flight/src/Flight/Seats/Exceptions/InvalidSeatIdException.cs
class InvalidSeatIdException (line 5) | public class InvalidSeatIdException : DomainException
method InvalidSeatIdException (line 7) | public InvalidSeatIdException(Guid seatId)
FILE: src/Services/Flight/src/Flight/Seats/Exceptions/InvalidSeatNumberException.cs
class InvalidSeatNumberException (line 5) | public class InvalidSeatNumberException : DomainException
method InvalidSeatNumberException (line 7) | public InvalidSeatNumberException() : base("SeatNumber Cannot be null ...
FILE: src/Services/Flight/src/Flight/Seats/Exceptions/SeatAlreadyExistException.cs
class SeatAlreadyExistException (line 6) | public class SeatAlreadyExistException : AppException
method SeatAlreadyExistException (line 8) | public SeatAlreadyExistException(int? code = default) : base("Seat alr...
FILE: src/Services/Flight/src/Flight/Seats/Exceptions/SeatNumberIncorrectException.cs
class SeatNumberIncorrectException (line 5) | public class SeatNumberIncorrectException : AppException
method SeatNumberIncorrectException (line 7) | public SeatNumberIncorrectException() : base("Seat number is incorrect!")
FILE: src/Services/Flight/src/Flight/Seats/Features/CreatingSeat/V1/CreateSeat.cs
type CreateSeat (line 26) | public record CreateSeat
type CreateSeatResult (line 33) | public record CreateSeatResult(Guid Id);
type SeatCreatedDomainEvent (line 35) | public record SeatCreatedDomainEvent(Guid Id, string SeatNumber, Enums.S...
type CreateSeatRequestDto (line 38) | public record CreateSeatRequestDto(string SeatNumber, Enums.SeatType Typ...
type CreateSeatResponseDto (line 40) | public record CreateSeatResponseDto(Guid Id);
class CreateSeatEndpoint (line 42) | public class CreateSeatEndpoint : IMinimalEndpoint
method MapEndpoint (line 44) | public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
method CreateSeat (line 60) | private async Task<IResult> CreateSeat(CreateSeatRequestDto request, I...
class CreateSeatValidator (line 73) | public class CreateSeatValidator : AbstractValidator<CreateSeat>
method CreateSeatValidator (line 75) | public CreateSeatValidator()
class CreateSeatCommandHandler (line 87) | internal class CreateSeatCommandHandler : IRequestHandler<CreateSeat, Cr...
method CreateSeatCommandHandler (line 91) | public CreateSeatCommandHandler(FlightDbContext flightDbContext)
method Handle (line 96) | public async Task<CreateSeatResult> Handle(CreateSeat command, Cancell...
FILE: src/Services/Flight/src/Flight/Seats/Features/CreatingSeat/V1/CreateSeatMongo.cs
type CreateSeatMongo (line 17) | public record CreateSeatMongo(Guid Id, string SeatNumber, Enums.SeatType...
class CreateSeatMongoHandler (line 20) | internal class CreateSeatMongoHandler : ICommandHandler<CreateSeatMongo>
method CreateSeatMongoHandler (line 25) | public CreateSeatMongoHandler(
method Handle (line 33) | public async Task<Unit> Handle(CreateSeatMongo request, CancellationTo...
FILE: src/Services/Flight/src/Flight/Seats/Features/GettingAvailableSeats/V1/GetAvailableSeats.cs
type GetAvailableSeats (line 26) | public record GetAvailableSeats(Guid FlightId) : IQuery<GetAvailableSeat...
type GetAvailableSeatsResult (line 28) | public record GetAvailableSeatsResult(IEnumerable<SeatDto> SeatDtos);
type GetAvailableSeatsResponseDto (line 30) | public record GetAvailableSeatsResponseDto(IEnumerable<SeatDto> SeatDtos);
class GetAvailableSeatsEndpoint (line 32) | public class GetAvailableSeatsEndpoint : IMinimalEndpoint
method MapEndpoint (line 34) | public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
method GetAvailableSeats (line 50) | private async Task<IResult> GetAvailableSeats(Guid id, IMediator media...
class GetAvailableSeatsValidator (line 60) | public class GetAvailableSeatsValidator : AbstractValidator<GetAvailable...
method GetAvailableSeatsValidator (line 62) | public GetAvailableSeatsValidator()
class GetAvailableSeatsQueryHandler (line 68) | internal class GetAvailableSeatsQueryHandler : IRequestHandler<GetAvaila...
method GetAvailableSeatsQueryHandler (line 73) | public GetAvailableSeatsQueryHandler(IMapper mapper, FlightReadDbConte...
method Handle (line 80) | public async Task<GetAvailableSeatsResult> Handle(GetAvailableSeats qu...
FILE: src/Services/Flight/src/Flight/Seats/Features/ReservingSeat/V1/ReserveSeat.cs
type ReserveSeat (line 22) | public record ReserveSeat(Guid FlightId, string SeatNumber) : ICommand<R...
type ReserveSeatResult (line 24) | public record ReserveSeatResult(Guid Id);
type SeatReservedDomainEvent (line 26) | public record SeatReservedDomainEvent(Guid Id, string SeatNumber, Enums....
type ReserveSeatRequestDto (line 29) | public record ReserveSeatRequestDto(Guid FlightId, string SeatNumber);
type ReserveSeatResponseDto (line 31) | public record ReserveSeatResponseDto(Guid Id);
class ReserveSeatEndpoint (line 33) | public class ReserveSeatEndpoint : IMinimalEndpoint
method MapEndpoint (line 35) | public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
method ReserveSeat (line 51) | private async Task<IResult> ReserveSeat(ReserveSeatRequestDto request,...
class ReserveSeatValidator (line 64) | public class ReserveSeatValidator : AbstractValidator<ReserveSeat>
method ReserveSeatValidator (line 66) | public ReserveSeatValidator()
class ReserveSeatCommandHandler (line 73) | internal class ReserveSeatCommandHandler : IRequestHandler<ReserveSeat, ...
method ReserveSeatCommandHandler (line 77) | public ReserveSeatCommandHandler(FlightDbContext flightDbContext)
method Handle (line 82) | public async Task<ReserveSeatResult> Handle(ReserveSeat command, Cance...
FILE: src/Services/Flight/src/Flight/Seats/Features/ReservingSeat/V1/ReserveSeatMongo.cs
type ReserveSeatMongo (line 15) | public record ReserveSeatMongo(Guid Id, string SeatNumber, Enums.SeatTyp...
class ReserveSeatMongoHandler (line 18) | internal class ReserveSeatMongoHandler : ICommandHandler<ReserveSeatMongo>
method ReserveSeatMongoHandler (line 23) | public ReserveSeatMongoHandler(
method Handle (line 31) | public async Task<Unit> Handle(ReserveSeatMongo command, CancellationT...
FILE: src/Services/Flight/src/Flight/Seats/Features/SeatMappings.cs
class SeatMappings (line 11) | public class SeatMappings : IRegister
method Register (line 13) | public void Register(TypeAdapterConfig config)
FILE: src/Services/Flight/src/Flight/Seats/Models/Seat.cs
type Seat (line 11) | public record Seat : Aggregate<SeatId>
FILE: src/Services/Flight/src/Flight/Seats/Models/SeatReadModel.cs
class SeatReadModel (line 5) | public class SeatReadModel
FILE: src/Services/Flight/src/Flight/Seats/ValueObjects/SeatId.cs
type SeatId (line 6) | public record SeatId
FILE: src/Services/Flight/src/Flight/Seats/ValueObjects/SeatNumber.cs
type SeatNumber (line 5) | public record SeatNumber
FILE: src/Services/Flight/tests/EndToEndTest/Fakes/FakeCreateFlightCommand.cs
class FakeCreateFlightCommand (line 10) | public sealed class FakeCreateFlightCommand : AutoFaker<CreateFlight>
method FakeCreateFlightCommand (line 12) | public FakeCreateFlightCommand()
FILE: src/Services/Flight/tests/EndToEndTest/Fakes/FakeCreateFlightMongoCommand.cs
class FakeCreateFlightMongoCommand (line 9) | public sealed class FakeCreateFlightMongoCommand : AutoFaker<CreateFligh...
method FakeCreateFlightMongoCommand (line 11) | public FakeCreateFlightMongoCommand()
FILE: src/Services/Flight/tests/EndToEndTest/Flight/Features/CreateFlightTests.cs
class CreateFlightTests (line 13) | public class CreateFlightTests : FlightEndToEndTestBase
method CreateFlightTests (line 15) | public CreateFlightTests(TestFixture<Program, FlightDbContext, FlightR...
method should_create_new_flight_to_db_and_publish_message_to_broker (line 20) | [Fact]
FILE: src/Services/Flight/tests/EndToEndTest/Flight/Features/GetFlightByIdTests.cs
class GetFlightByIdTests (line 12) | public class GetFlightByIdTests : FlightEndToEndTestBase
method GetFlightByIdTests (line 14) | public GetFlightByIdTests(TestFixture<Program, FlightDbContext, Flight...
method should_retrive_a_flight_by_id_currectly (line 19) | [Fact]
FILE: src/Services/Flight/tests/EndToEndTest/FlightEndToEndTestBase.cs
class FlightEndToEndTestBase (line 8) | [Collection(EndToEndTestCollection.Name)]
method FlightEndToEndTestBase (line 11) | public FlightEndToEndTestBase(TestFixture<Program, FlightDbContext, Fl...
class EndToEndTestCollection (line 16) | [CollectionDefinition(Name)]
FILE: src/Services/Flight/tests/EndToEndTest/FlightTestDataSeeder.cs
class FlightTestDataSeeder (line 15) | public class FlightTestDataSeeder(
method SeedAllAsync (line 21) | public async Task SeedAllAsync()
method SeedAirportAsync (line 29) | private async Task SeedAirportAsync()
method SeedAircraftAsync (line 43) | private async Task SeedAircraftAsync()
method SeedSeatAsync (line 58) | private async Task SeedSeatAsync()
method SeedFlightAsync (line 72) | private async Task SeedFlightAsync()
FILE: src/Services/Flight/tests/EndToEndTest/Routes/ApiRoutes.cs
class ApiRoutes (line 3) | public static class ApiRoutes
class Flight (line 7) | public static class Flight
FILE: src/Services/Flight/tests/IntegrationTest/Aircraft/Features/CreateAircraftTests.cs
class CreateAircraftTests (line 12) | public class CreateAircraftTests : FlightIntegrationTestBase
method CreateAircraftTests (line 14) | public CreateAircraftTests(
method should_create_new_aircraft_to_db_and_publish_message_to_broker (line 19) | [Fact]
FILE: src/Services/Flight/tests/IntegrationTest/Airport/Features/CreateAirportTests.cs
class CreateAirportTests (line 12) | public class CreateAirportTests : FlightIntegrationTestBase
method CreateAirportTests (line 14) | public CreateAirportTests(
method should_create_new_airport_to_db_and_publish_message_to_broker (line 19) | [Fact]
FILE: src/Services/Flight/tests/IntegrationTest/Fakes/FakeCreateAircraftCommand.cs
class FakeCreateAircraftCommand (line 8) | public class FakeCreateAircraftCommand : AutoFaker<CreateAircraft>
method FakeCreateAircraftCommand (line 10) | public FakeCreateAircraftCommand()
FILE: src/Services/Flight/tests/IntegrationTest/Fakes/FakeCreateAirportCommand.cs
class FakeCreateAirportCommand (line 8) | public class FakeCreateAirportCommand : AutoFaker<CreateAirport>
method FakeCreateAirportCommand (line 10) | public FakeCreateAirportCommand()
FILE: src/Services/Flight/tests/IntegrationTest/Fakes/FakeCreateFlightCommand.cs
class FakeCreateFlightCommand (line 11) | public sealed class FakeCreateFlightCommand : AutoFaker<CreateFlight>
method FakeCreateFlightCommand (line 13) | public FakeCreateFlightCommand()
FILE: src/Services/Flight/tests/IntegrationTest/Fakes/FakeCreateFlightMongoCommand.cs
class FakeCreateFlightMongoCommand (line 10) | public sealed class FakeCreateFlightMongoCommand : AutoFaker<CreateFligh...
method FakeCreateFlightMongoCommand (line 12) | public FakeCreateFlightMongoCommand()
FILE: src/Services/Flight/tests/IntegrationTest/Fakes/FakeCreateSeatCommand.cs
class FakeCreateSeatCommand (line 10) | public class FakeCreateSeatCommand : AutoFaker<CreateSeat>
method FakeCreateSeatCommand (line 12) | public FakeCreateSeatCommand(Guid flightId)
FILE: src/Services/Flight/tests/IntegrationTest/Fakes/FakeCreateSeatMongoCommand.cs
class FakeCreateSeatMongoCommand (line 9) | public class FakeCreateSeatMongoCommand : AutoFaker<CreateSeatMongo>
method FakeCreateSeatMongoCommand (line 11) | public FakeCreateSeatMongoCommand(Guid flightId)
FILE: src/Services/Flight/tests/IntegrationTest/Fakes/FakeUpdateFlightCommand.cs
class FakeUpdateFlightCommand (line 7) | public class FakeUpdateFlightCommand : AutoFaker<UpdateFlight>
method FakeUpdateFlightCommand (line 9) | public FakeUpdateFlightCommand(global::Flight.Flights.Models.Flight fl...
FILE: src/Services/Flight/tests/IntegrationTest/Flight/Features/CreateFlightTests.cs
class CreateFlightTests (line 11) | public class CreateFlightTests : FlightIntegrationTestBase
method CreateFlightTests (line 13) | public CreateFlightTests(
method should_create_new_flight_to_db_and_publish_message_to_broker (line 18) | [Fact]
FILE: src/Services/Flight/tests/IntegrationTest/Flight/Features/DeleteFlightTests.cs
class DeleteFlightTests (line 18) | public class DeleteFlightTests : FlightIntegrationTestBase
method DeleteFlightTests (line 20) | public DeleteFlightTests(
method should_delete_flight_from_db (line 25) | [Fact]
FILE: src/Services/Flight/tests/IntegrationTest/Flight/Features/GetAvailableFlightsTests.cs
class GetAvailableFlightsTests (line 15) | public class GetAvailableFlightsTests : FlightIntegrationTestBase
method GetAvailableFlightsTests (line 17) | public GetAvailableFlightsTests(
method should_return_available_flights (line 22) | [Fact]
FILE: src/Services/Flight/tests/IntegrationTest/Flight/Features/GetFlightByIdTests.cs
class GetFlightByIdTests (line 14) | public class GetFlightByIdTests : FlightIntegrationTestBase
method GetFlightByIdTests (line 16) | public GetFlightByIdTests(
method should_retrive_a_flight_by_id_currectly (line 21) | [Fact]
method should_retrive_a_flight_by_id_from_grpc_service (line 39) | [Fact]
FILE: src/Services/Flight/tests/IntegrationTest/Flight/Features/UpdateFlightTests.cs
class UpdateFlightTests (line 17) | public class UpdateFlightTests : FlightIntegrationTestBase
method UpdateFlightTests (line 19) | public UpdateFlightTests(
method should_update_flight_to_db_and_publish_message_to_broker (line 24) | [Fact]
FILE: src/Services/Flight/tests/IntegrationTest/FlightIntegrationTestBase.cs
class FlightIntegrationTestBase (line 8) | [Collection(IntegrationTestCollection.Name)]
method FlightIntegrationTestBase (line 11) | public FlightIntegrationTestBase(TestFixture<Program, FlightDbContext,...
class IntegrationTestCollection (line 16) | [CollectionDefinition(Name)]
FILE: src/Services/Flight/tests/IntegrationTest/FlightTestDataSeeder.cs
class FlightTestDataSeeder (line 15) | public class FlightTestDataSeeder(
method SeedAllAsync (line 21) | public async Task SeedAllAsync()
method SeedAirportAsync (line 29) | private async Task SeedAirportAsync()
method SeedAircraftAsync (line 43) | private async Task SeedAircraftAsync()
method SeedSeatAsync (line 58) | private async Task SeedSeatAsync()
method SeedFlightAsync (line 72) | private async Task SeedFlightAsync()
FILE: src/Services/Flight/tests/IntegrationTest/Seat/Features/GetAvailableSeatsTests.cs
class GetAvailableSeatsTests (line 15) | public class GetAvailableSeatsTests : FlightIntegrationTestBase
method GetAvailableSeatsTests (line 17) | public GetAvailableSeatsTests(
method should_return_available_seats_from_grpc_service (line 22) | [Fact]
FILE: src/Services/Flight/tests/IntegrationTest/Seat/Features/ReserveSeatTests.cs
class ReserveSeatTests (line 12) | public class ReserveSeatTests : FlightIntegrationTestBase
method ReserveSeatTests (line 14) | public ReserveSeatTests(
method should_return_valid_reserve_seat_from_grpc_service (line 19) | [Fact]
FILE: src/Services/Flight/tests/PerformanceTest/script.js
constant BASE_URL (line 18) | const BASE_URL = "/";
constant SLEEP_DURATION (line 21) | const SLEEP_DURATION = 0.1;
FILE: src/Services/Flight/tests/UnitTest/Aircraft/Features/CreateAircraftTests/CreateAircraftCommandHandlerTests.cs
class CreateAircraftCommandHandlerTests (line 10) | [Collection(nameof(UnitTestFixture))]
method Act (line 16) | public Task<CreateAircraftResult> Act(CreateAircraft command, Cancella...
method CreateAircraftCommandHandlerTests (line 19) | public CreateAircraftCommandHandlerTests(UnitTestFixture fixture)
method handler_with_valid_command_should_create_new_aircraft_and_return_currect_aircraft_dto (line 25) | [Fact]
method handler_with_null_command_should_throw_argument_exception (line 41) | [Fact]
FILE: src/Services/Flight/tests/UnitTest/Aircraft/Features/CreateAircraftTests/CreateAircraftCommandValidatorTests.cs
class CreateAircraftCommandValidatorTests (line 11) | [Collection(nameof(UnitTestFixture))]
method is_valid_should_be_false_when_have_invalid_parameter (line 14) | [Fact]
FILE: src/Services/Flight/tests/UnitTest/Airport/Features/CreateAirportTests/CreateAirportCommandHandlerTests.cs
class CreateAirportCommandHandlerTests (line 11) | [Collection(nameof(UnitTestFixture))]
method CreateAirportCommandHandlerTests (line 18) | public CreateAirportCommandHandlerTests(UnitTestFixture fixture)
method Act (line 24) | public Task<CreateAirportResult> Act(CreateAirport command, Cancellati...
method handler_with_valid_command_should_create_new_airport_and_return_currect_airport_dto (line 27) | [Fact]
method handler_with_null_command_should_throw_argument_exception (line 43) | [Fact]
FILE: src/Services/Flight/tests/UnitTest/Airport/Features/CreateAirportTests/CreateAirportCommandValidatorTests.cs
class CreateAirportCommandValidatorTests (line 11) | [Collection(nameof(UnitTestFixture))]
method is_valid_should_be_false_when_have_invalid_parameter (line 14) | [Fact]
FILE: src/Services/Flight/tests/UnitTest/Common/DbContextFactory.cs
class DbContextFactory (line 16) | public static class DbContextFactory
method Create (line 25) | public static FlightDbContext Create()
method FlightDataSeeder (line 38) | private static void FlightDataSeeder(FlightDbContext context)
method Destroy (line 91) | public static void Destroy(FlightDbContext context)
FILE: src/Services/Flight/tests/UnitTest/Common/MapperFactory.cs
class MapperFactory (line 7) | public static class MapperFactory
method Create (line 9) | public static IMapper Create()
FILE: src/Services/Flight/tests/UnitTest/Common/UnitTestFixture.cs
class FixtureCollection (line 7) | [CollectionDefinition(nameof(UnitTestFixture))]
class UnitTestFixture (line 10) | public class UnitTestFixture : IDisposable
method UnitTestFixture (line 12) | public UnitTestFixture()
method Dispose (line 21) | public void Dispose()
FILE: src/Services/Flight/tests/UnitTest/Fakes/FakeCreateAircraftCommand.cs
class FakeCreateAircraftCommand (line 8) | public class FakeCreateAircraftCommand : AutoFaker<CreateAircraft>
method FakeCreateAircraftCommand (line 10) | public FakeCreateAircraftCommand()
FILE: src/Services/Flight/tests/UnitTest/Fakes/FakeCreateAirportCommand.cs
class FakeCreateAirportCommand (line 8) | public class FakeCreateAirportCommand : AutoFaker<CreateAirport>
method FakeCreateAirportCommand (line 10) | public FakeCreateAirportCommand()
FILE: src/Services/Flight/tests/UnitTest/Fakes/FakeCreateFlightCommand.cs
class FakeCreateFlightCommand (line 10) | public sealed class FakeCreateFlightCommand : AutoFaker<CreateFlight>
method FakeCreateFlightCommand (line 12) | public FakeCreateFlightCommand()
FILE: src/Services/Flight/tests/UnitTest/Fakes/FakeCreateSeatCommand.cs
class FakeCreateSeatCommand (line 11) | public class FakeCreateSeatCommand : AutoFaker<CreateSeat>
method FakeCreateSeatCommand (line 13) | public FakeCreateSeatCommand()
FILE: src/Services/Flight/tests/UnitTest/Fakes/FakeFlightCreate.cs
class FakeFlightCreate (line 7) | public static class FakeFlightCreate
method Generate (line 9) | public static global::Flight.Flights.Models.Flight Generate()
FILE: src/Services/Flight/tests/UnitTest/Fakes/FakeFlightUpdate.cs
class FakeFlightUpdate (line 6) | public static class FakeFlightUpdate
method Generate (line 8) | public static void Generate(Flight flight)
FILE: src/Services/Flight/tests/UnitTest/Fakes/FakeValidateCreateAircraftCommand.cs
class FakeValidateCreateAircraftCommand (line 7) | public class FakeValidateCreateAircraftCommand : AutoFaker<CreateAircraft>
method FakeValidateCreateAircraftCommand (line 9) | public FakeValidateCreateAircraftCommand()
FILE: src/Services/Flight/tests/UnitTest/Fakes/FakeValidateCreateAirportCommand.cs
class FakeValidateCreateAirportCommand (line 7) | public class FakeValidateCreateAirportCommand : AutoFaker<CreateAirport>
method FakeValidateCreateAirportCommand (line 9) | public FakeValidateCreateAirportCommand()
FILE: src/Services/Flight/tests/UnitTest/Fakes/FakeValidateCreateFlightCommand.cs
class FakeValidateCreateFlightCommand (line 9) | public class FakeValidateCreateFlightCommand : AutoFaker<CreateFlight>
method FakeValidateCreateFlightCommand (line 11) | public FakeValidateCreateFlightCommand()
FILE: src/Services/Flight/tests/UnitTest/Fakes/FakeValidateCreateSeatCommand.cs
class FakeValidateCreateSeatCommand (line 9) | public class FakeValidateCreateSeatCommand : AutoFaker<CreateSeat>
method FakeValidateCreateSeatCommand (line 11) | public FakeValidateCreateSeatCommand()
FILE: src/Services/Flight/tests/UnitTest/Flight/Features/Domains/CreateFlightTests.cs
class CreateFlightTests (line 10) | [Collection(nameof(UnitTestFixture))]
method can_create_valid_flight (line 13) | [Fact]
method queue_domain_event_on_create (line 23) | [Fact]
FILE: src/Services/Flight/tests/UnitTest/Flight/Features/Domains/UpdateFlightTests.cs
class UpdateFlightTests (line 10) | [Collection(nameof(UnitTestFixture))]
method can_update_valid_flight (line 13) | [Fact]
method queue_domain_event_on_update (line 26) | [Fact]
FILE: src/Services/Flight/tests/UnitTest/Flight/Features/Handlers/CreateFlight/CreateFlightCommandHandlerTests.cs
class CreateFlightCommandHandlerTests (line 13) | [Collection(nameof(UnitTestFixture))]
method Act (line 19) | public Task<CreateFlightResult> Act(CreateFlight command, Cancellation...
method CreateFlightCommandHandlerTests (line 22) | public CreateFlightCommandHandlerTests(UnitTestFixture fixture)
method handler_with_valid_command_should_create_new_flight_and_return_currect_flight_dto (line 28) | [Fact]
method handler_with_null_command_should_throw_argument_exception (line 44) | [Fact]
FILE: src/Services/Flight/tests/UnitTest/Flight/Features/Handlers/CreateFlight/CreateFlightCommandValidatorTests.cs
class CreateFlightCommandValidatorTests (line 10) | [Collection(nameof(UnitTestFixture))]
method is_valid_should_be_false_when_have_invalid_parameter (line 13) | [Fact]
FILE: src/Services/Flight/tests/UnitTest/Flight/FlightMappingTests.cs
class FlightMappingTests (line 8) | [Collection(nameof(UnitTestFixture))]
method FlightMappingTests (line 13) | public FlightMappingTests(UnitTestFixture fixture)
method should_support_mapping_from_source_to_destination (line 30) | [Theory]
FILE: src/Services/Flight/tests/UnitTest/Seat/Features/CreateSeatCommandHandlerTests.cs
class CreateSeatCommandHandlerTests (line 11) | [Collection(nameof(UnitTestFixture))]
method CreateSeatCommandHandlerTests (line 18) | public CreateSeatCommandHandlerTests(UnitTestFixture fixture)
method Act (line 24) | public Task<CreateSeatResult> Act(CreateSeat command, CancellationToke...
method handler_with_valid_command_should_create_new_seat_and_return_currect_seat_dto (line 29) | [Fact]
method handler_with_null_command_should_throw_argument_exception (line 45) | [Fact]
FILE: src/Services/Flight/tests/UnitTest/Seat/Features/CreateSeatCommandValidatorTests.cs
class CreateSeatCommandValidatorTests (line 11) | [Collection(nameof(UnitTestFixture))]
method is_valid_should_be_false_when_have_invalid_parameter (line 14) | [Fact]
FILE: src/Services/Flight/tests/UnitTest/Seat/SeatMappingTests.cs
class SeatMappingTests (line 8) | [Collection(nameof(UnitTestFixture))]
method SeatMappingTests (line 14) | public SeatMappingTests(UnitTestFixture fixture)
method should_support_mapping_from_source_to_destination (line 32) | [Theory]
FILE: src/Services/Identity/src/Identity.Api/Program.cs
class Program (line 19) | public partial class Program { }
FILE: src/Services/Identity/src/Identity/Configurations/AuthOptions.cs
class AuthOptions (line 3) | public class AuthOptions
FILE: src/Services/Identity/src/Identity/Configurations/Config.cs
class Config (line 8) | public static class Config
FILE: src/Services/Identity/src/Identity/Configurations/UserValidator.cs
class UserValidator (line 10) | public class UserValidator : IResourceOwnerPasswordValidator
method UserValidator (line 15) | public UserValidator(SignInManager<User> signInManager,
method ValidateAsync (line 22) | public async Task ValidateAsync(ResourceOwnerPasswordValidationContext...
FILE: src/Services/Identity/src/Identity/Data/Configurations/RoleClaimConfiguration.cs
class RoleClaimConfiguration (line 7) | public class RoleClaimConfiguration : IEntityTypeConfiguration<RoleClaim>
method Configure (line 9) | public void Configure(EntityTypeBuilder<RoleClaim> builder)
FILE: src/Services/Identity/src/Identity/Data/Configurations/RoleConfiguration.cs
class RoleConfiguration (line 7) | public class RoleConfiguration : IEntityTypeConfiguration<Role>
method Configure (line 9) | public void Configure(EntityTypeBuilder<Role> builder)
FILE: src/Services/Identity/src/Identity/Data/Configurations/UserClaimConfiguration.cs
class UserClaimConfiguration (line 7) | public class UserClaimConfiguration : IEntityTypeConfiguration<UserClaim>
method Configure (line 9) | public void Configure(EntityTypeBuilder<UserClaim> builder)
FILE: src/Services/Identity/src/Identity/Data/Configurations/UserConfiguration.cs
class UserConfiguration (line 7) | public class UserConfiguration : IEntityTypeConfiguration<User>
method Configure (line 9) | public void Configure(EntityTypeBuilder<User> builder)
FILE: src/Services/Identity/src/Identity/Data/Configurations/UserLoginConfiguration.cs
class UserLoginConfiguration (line 7) | public class UserLoginConfiguration : IEntityTypeConfiguration<UserLogin>
method Configure (line 9) | public void Configure(EntityTypeBuilder<UserLogin> builder)
FILE: src/Services/Identity/src/Identity/Data/Configurations/UserRoleConfiguration.cs
class UserRoleConfiguration (line 7) | public class UserRoleConfiguration : IEntityTypeConfiguration<UserRole>
method Configure (line 9) | public void Configure(EntityTypeBuilder<UserRole> builder)
FILE: src/Services/Identity/src/Identity/Data/Configurations/UserTokenConfiguration.cs
class UserTokenConfiguration (line 7) | public class UserTokenConfiguration : IEntityTypeConfiguration<UserToken>
method Configure (line 9) | public void Configure(EntityTypeBuilder<UserToken> builder)
FILE: src/Services/Identity/src/Identity/Data/DesignTimeDbContextFactory.cs
class DesignTimeDbContextFactory (line 6) | public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<Id...
method CreateDbContext (line 8) | public IdentityContext CreateDbContext(string[] args)
FILE: src/Services/Identity/src/Identity/Data/IdentityContext.cs
class IdentityContext (line 21) | public sealed class IdentityContext : IdentityDbContext<User, Role, Guid,
method IdentityContext (line 27) | public IdentityContext(DbContextOptions<IdentityContext> options, ILog...
method OnModelCreating (line 32) | protected override void OnModelCreating(ModelBuilder builder)
method CreateExecutionStrategy (line 40) | public IExecutionStrategy CreateExecutionStrategy() => Database.Create...
method BeginTransactionAsync (line 42) | public async Task BeginTransactionAsync(CancellationToken cancellation...
method CommitTransactionAsync (line 50) | public async Task CommitTransactionAsync(CancellationToken cancellatio...
method RollbackTransactionAsync (line 69) | public async Task RollbackTransactionAsync(CancellationToken cancellat...
method ExecuteTransactionalAsync (line 83) | public Task ExecuteTransactionalAsync(CancellationToken cancellationTo...
method SaveChangesAsync (line 103) | public override async Task<int> SaveChangesAsync(CancellationToken can...
method GetDomainEvents (line 131) | public IReadOnlyList<IDomainEvent> GetDomainEvents()
method OnBeforeSaving (line 148) | private void OnBeforeSaving()
FILE: src/Services/Identity/src/Identity/Data/Migrations/20230331193410_initial.Designer.cs
class initial (line 14) | [DbContext(typeof(IdentityContext))]
method BuildTargetModel (line 19) | protected override void BuildTargetModel(ModelBuilder modelBuilder)
FILE: src/Services/Identity/src/Identity/Data/Migrations/20230331193410_initial.cs
class initial (line 10) | public partial class initial : Migration
method Up (line 13) | protected override void Up(MigrationBuilder migrationBuilder)
method Down (line 209) | protected override void Down(MigrationBuilder migrationBuilder)
FILE: src/Services/Identity/src/Identity/Data/Migrations/IdentityContextModelSnapshot.cs
class IdentityContextModelSnapshot (line 13) | [DbContext(typeof(IdentityContext))]
method BuildModel (line 16) | protected override void BuildModel(ModelBuilder modelBuilder)
FILE: src/Services/Identity/src/Identity/Data/Seed/IdentityDataSeeder.cs
class IdentityDataSeeder (line 16) | public class IdentityDataSeeder : IDataSeeder
method IdentityDataSeeder (line 23) | public IdentityDataSeeder(UserManager<User> userManager,
method SeedAllAsync (line 34) | public async Task SeedAllAsync()
method SeedRoles (line 45) | private async Task SeedRoles()
method SeedUsers (line 58) | private async Task SeedUsers()
FILE: src/Services/Identity/src/Identity/Data/Seed/InitialData.cs
class InitialData (line 8) | public static class InitialData
method InitialData (line 12) | static InitialData()
FILE: src/Services/Identity/src/Identity/Extensions/Infrastructure/IdentityServerExtensions.cs
class IdentityServerExtensions (line 13) | public static class IdentityServerExtensions
method AddCustomIdentityServer (line 15) | public static WebApplicationBuilder AddCustomIdentityServer(this WebAp...
FILE: src/Services/Identity/src/Identity/Extensions/Infrastructure/InfrastructureExtensions.cs
class InfrastructureExtensions (line 24) | public static class InfrastructureExtensions
method AddInfrastructure (line 26) | public static WebApplicationBuilder AddInfrastructure(this WebApplicat...
method UseInfrastructure (line 71) | public static WebApplication UseInfrastructure(this WebApplication app)
FILE: src/Services/Identity/src/Identity/Extensions/Infrastructure/MediatRExtensions.cs
class MediatRExtensions (line 10) | public static class MediatRExtensions
method AddCustomMediatR (line 12) | public static IServiceCollection AddCustomMediatR(this IServiceCollect...
FILE: src/Services/Identity/src/Identity/Identity/Constants/Constants.cs
class Constants (line 3) | public static class Constants
class StandardScopes (line 5) | public static class StandardScopes
FILE: src/Services/Identity/src/Identity/Identity/Exceptions/RegisterIdentityUserException.cs
class RegisterIdentityUserException (line 5) | public class RegisterIdentityUserException : AppException
method RegisterIdentityUserException (line 7) | public RegisterIdentityUserException(string message) : base(message)
FILE: src/Services/Identity/src/Identity/Identity/Features/IdentityMappings.cs
class IdentityMappings (line 7) | public class IdentityMappings : IRegister
method Register (line 9) | public void Register(TypeAdapterConfig config)
FILE: src/Services/Identity/src/Identity/Identity/Features/RegisteringNewUser/V1/RegisterNewUser.cs
type RegisterNewUser (line 26) | public record RegisterNewUser(string FirstName, string LastName, string ...
type RegisterNewUserResult (line 29) | public record RegisterNewUserResult(Guid Id, string FirstName, string La...
type RegisterNewUserRequestDto (line 31) | public record RegisterNewUserRequestDto(string FirstName, string LastNam...
type RegisterNewUserResponseDto (line 34) | public record RegisterNewUserResponseDto(Guid Id, string FirstName, stri...
class RegisterNewUserEndpoint (line 37) | public class RegisterNewUserEndpoint : IMinimalEndpoint
method MapEndpoint (line 39) | public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
class RegisterNewUserValidator (line 67) | public class RegisterNewUserValidator : AbstractValidator<RegisterNewUser>
method RegisterNewUserValidator (line 69) | public RegisterNewUserValidator()
class RegisterNewUserHandler (line 90) | internal class RegisterNewUserHandler : ICommandHandler<RegisterNewUser,...
method RegisterNewUserHandler (line 95) | public RegisterNewUserHandler(UserManager<User> userManager,
method Handle (line 102) | public async Task<RegisterNewUserResult> Handle(RegisterNewUser request,
FILE: src/Services/Identity/src/Identity/Identity/Models/Role.cs
class Role (line 7) | public class Role : IdentityRole<Guid>, IVersion
FILE: src/Services/Identity/src/Identity/Identity/Models/RoleClaim.cs
class RoleClaim (line 7) | public class RoleClaim : IdentityRoleClaim<Guid>, IVersion
FILE: src/Services/Identity/src/Identity/Identity/Models/User.cs
class User (line 8) | public class User : IdentityUser<Guid>, IVersion
FILE: src/Services/Identity/src/Identity/Identity/Models/UserClaim.cs
class UserClaim (line 7) | public class UserClaim : IdentityUserClaim<Guid>, IVersion
FILE: src/Services/Identity/src/Identity/Identity/Models/UserLogin.cs
class UserLogin (line 7) | public class UserLogin : IdentityUserLogin<Guid>, IVersion
FILE: src/Services/Identity/src/Identity/Identity/Models/UserRole.cs
class UserRole (line 7) | public class UserRole : IdentityUserRole<Guid>, IVersion
FILE: src/Services/Identity/src/Identity/Identity/Models/UserToken.cs
class UserToken (line 7) | public class UserToken : IdentityUserToken<Guid>, IVersion
FILE: src/Services/Identity/src/Identity/IdentityEventMapper.cs
class IdentityEventMapper (line 6) | public sealed class IdentityEventMapper : IEventMapper
method MapToIntegrationEvent (line 8) | public IIntegrationEvent? MapToIntegrationEvent(IDomainEvent @event)
method MapToInternalCommand (line 16) | public IInternalCommand? MapToInternalCommand(IDomainEvent @event)
FILE: src/Services/Identity/src/Identity/IdentityRoot.cs
class IdentityRoot (line 3) | public class IdentityRoot
FILE: src/Services/Identity/tests/IntegrationTest/Fakes/FakeRegisterNewUserCommand.cs
class FakeRegisterNewUserCommand (line 7) | public class FakeRegisterNewUserCommand : AutoFaker<RegisterNewUser>
method FakeRegisterNewUserCommand (line 9) | public FakeRegisterNewUserCommand()
FILE: src/Services/Identity/tests/IntegrationTest/Identity/Features/RegisterNewUserTests.cs
class RegisterNewUserTests (line 11) | public class RegisterNewUserTests : IdentityIntegrationTestBase
method RegisterNewUserTests (line 13) | public RegisterNewUserTests(TestWriteFixture<Program, IdentityContext>...
method should_create_new_user_to_db_and_publish_message_to_broker (line 16) | [Fact]
FILE: src/Services/Identity/tests/IntegrationTest/IdentityIntegrationTestBase.cs
class IdentityIntegrationTestBase (line 8) | [Collection(IntegrationTestCollection.Name)]
method IdentityIntegrationTestBase (line 11) | public IdentityIntegrationTestBase(TestWriteFixture<Program, IdentityC...
class IntegrationTestCollection (line 17) | [CollectionDefinition(Name)]
FILE: src/Services/Identity/tests/IntegrationTest/IdentityTestDataSeeder.cs
class IdentityTestDataSeeder (line 12) | public class IdentityTestDataSeeder(
method SeedAllAsync (line 19) | public async Task SeedAllAsync()
method SeedRoles (line 25) | private async Task SeedRoles()
method SeedUsers (line 38) | private async Task SeedUsers()
FILE: src/Services/Identity/tests/PerformanceTest/script.js
constant BASE_URL (line 18) | const BASE_URL = "/";
constant SLEEP_DURATION (line 21) | const SLEEP_DURATION = 0.1;
FILE: src/Services/Passenger/src/Passenger.Api/Program.cs
class Program (line 19) | public partial class Program
FILE: src/Services/Passenger/src/Passenger/Data/Configurations/PassengerConfiguration.cs
class PassengerConfiguration (line 8) | public class PassengerConfiguration : IEntityTypeConfiguration<Passenger...
method Configure (line 10) | public void Configure(EntityTypeBuilder<Passengers.Models.Passenger> b...
FILE: src/Services/Passenger/src/Passenger/Data/DesignTimeDbContextFactory.cs
class DesignTimeDbContextFactory (line 6) | public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<Pa...
method CreateDbContext (line 8) | public PassengerDbContext CreateDbContext(string[] args)
FILE: src/Services/Passenger/src/Passenger/Data/Migrations/20230611213031_initial.Designer.cs
class initial (line 14) | [DbContext(typeof(PassengerDbContext))]
method BuildTargetModel (line 19) | protected override void BuildTargetModel(ModelBuilder modelBuilder)
FILE: src/Services/Passenger/src/Passenger/Data/Migrations/20230611213031_initial.cs
class initial (line 9) | public partial class initial : Migration
method Up (line 12) | protected override void Up(MigrationBuilder migrationBuilder)
method Down (line 37) | protected override void Down(MigrationBuilder migrationBuilder)
FILE: src/Services/Passenger/src/Passenger/Data/Migrations/PassengerDbContextModelSnapshot.cs
class PassengerDbContextModelSnapshot (line 13) | [DbContext(typeof(PassengerDbContext))]
method BuildModel (line 16) | protected override void BuildModel(ModelBuilder modelBuilder)
FILE: src/Services/Passenger/src/Passenger/Data/PassengerDbContext.cs
class PassengerDbContext (line 10) | public sealed class PassengerDbContext : AppDbContextBase
method PassengerDbContext (line 12) | public PassengerDbContext(DbContextOptions<PassengerDbContext> options,
method OnModelCreating (line 20) | protected override void OnModelCreating(ModelBuilder builder)
FILE: src/Services/Passenger/src/Passenger/Data/PassengerReadDbContext.cs
class PassengerReadDbContext (line 10) | public class PassengerReadDbContext : MongoDbContext
method PassengerReadDbContext (line 12) | public PassengerReadDbContext(IOptions<MongoOptions> options) : base(o...
FILE: src/Services/Passenger/src/Passenger/Exceptions/InvalidAgeException.cs
class InvalidAgeException (line 5) | public class InvalidAgeException : DomainException
method InvalidAgeException (line 7) | public InvalidAgeException() : base("Age Cannot be null or negative")
FILE: src/Services/Passenger/src/Passenger/Exceptions/InvalidNameException.cs
class InvalidNameException (line 5) | public class InvalidNameException : DomainException
method InvalidNameException (line 7) | public InvalidNameException() : base("Name cannot be empty or whitespa...
FILE: src/Services/Passenger/src/Passenger/Exceptions/InvalidPassengerIdException.cs
class InvalidPassengerIdException (line 7) | public class InvalidPassengerIdException : DomainException
method InvalidPassengerIdException (line 9) | public InvalidPassengerIdException(Guid passengerId)
FILE: src/Services/Passenger/src/Passenger/Exceptions/InvalidPassportNumberException.cs
class InvalidPassportNumberException (line 5) | public class InvalidPassportNumberException : DomainException
method InvalidPassportNumberException (line 7) | public InvalidPassportNumberException() : base("Passport number cannot...
FILE: src/Services/Passenger/src/Passenger/Exceptions/PassengerAlreadyExist.cs
class PassengerNotExist (line 6) | public class PassengerNotExist : AppException
method PassengerNotExist (line 8) | public PassengerNotExist() : base("Please register before!", HttpStatu...
FILE: src/Services/Passenger/src/Passenger/Exceptions/PassengerNotFoundException.cs
class PassengerNotFoundException (line 6) | public class PassengerNotFoundException : AppException
method PassengerNotFoundException (line 8) | public PassengerNotFoundException() : base("Passenger not found!", Htt...
FILE: src/Services/Passenger/src/Passenger/Extensions/Infrastructure/InfrastructureExtensions.cs
class InfrastructureExtensions (line 28) | public static class InfrastructureExtensions
method AddInfrastructure (line 30) | public static WebApplicationBuilder AddInfrastructure(this WebApplicat...
method UseInfrastructure (line 75) | public static WebApplication UseInfrastructure(this WebApplication app)
FILE: src/Services/Passenger/src/Passenger/Extensions/Infrastructure/MediatRExtensions.cs
class MediatRExtensions (line 9) | public static class MediatRExtensions
method AddCustomMediatR (line 11) | public static IServiceCollection AddCustomMediatR(this IServiceCollect...
FILE: src/Services/Passenger/src/Passenger/GrpcServer/Services/PassengerGrpcServices.cs
class PassengerGrpcServices (line 10) | public class PassengerGrpcServices : PassengerGrpcService.PassengerGrpcS...
method PassengerGrpcServices (line 14) | public PassengerGrpcServices(IMediator mediator)
method GetById (line 19) | public override async Task<GetPassengerByIdResult> GetById(GetByIdRequ...
FILE: src/Services/Passenger/src/Passenger/Identity/Consumers/RegisteringNewUser/V1/PassengerCreatedDomainEvent.cs
type PassengerCreatedDomainEvent (line 5) | public record PassengerCreatedDomainEvent(Guid Id, string Name, string P...
FILE: src/Services/Passenger/src/Passenger/Identity/Consumers/RegisteringNewUser/V1/RegisterNewUser.cs
class RegisterNewUserHandler (line 16) | public class RegisterNewUserHandler : IConsumer<UserCreated>
method RegisterNewUserHandler (line 23) | public RegisterNewUserHandler(PassengerDbContext passengerDbContext,
method Consume (line 34) | public async Task Consume(ConsumeContext<UserCreated> context)
FILE: src/Services/Passenger/src/Passenger/PassengerEventMapper.cs
class PassengerEventMapper (line 10) | public sealed class PassengerEventMapper : IEventMapper
method MapToIntegrationEvent (line 12) | public IIntegrationEvent? MapToIntegrationEvent(IDomainEvent @event)
method MapToInternalCommand (line 22) | public IInternalCommand? MapToInternalCommand(IDomainEvent @event)
FILE: src/Services/Passenger/src/Passenger/PassengerRoot.cs
class PassengerRoot (line 3) | public class PassengerRoot
FILE: src/Services/Passenger/src/Passenger/Passengers/Dtos/PassengerDto.cs
type PassengerDto (line 3) | public record PassengerDto(Guid Id, string Name, string PassportNumber, ...
FILE: src/Services/Passenger/src/Passenger/Passengers/Enums/PassengerType.cs
type PassengerType (line 3) | public enum PassengerType
FILE: src/Services/Passenger/src/Passenger/Passengers/Exceptions/InvalidAgeException.cs
class InvalidAgeException (line 5) | public class InvalidAgeException : BadRequestException
method InvalidAgeException (line 7) | public InvalidAgeException() : base("Age Cannot be null or negative")
FILE: src/Services/Passenger/src/Passenger/Passengers/Exceptions/InvalidNameException.cs
class InvalidNameException (line 6) | public class InvalidNameException : BadRequestException
method InvalidNameException (line 8) | public InvalidNameException() : base("Name cannot be empty or whitespa...
FILE: src/Services/Passenger/src/Passenger/Passengers/Exceptions/InvalidPassportNumberException.cs
class InvalidPassportNumberException (line 6) | public class InvalidPassportNumberException : BadRequestException
method InvalidPassportNumberException (line 8) | public InvalidPassportNumberException() : base("Passport number cannot...
FILE: src/Services/Passenger/src/Passenger/Passengers/Exceptions/PassengerAlreadyExist.cs
class PassengerNotExist (line 5) | public class PassengerNotExist : BadRequestException
method PassengerNotExist (line 7) | public PassengerNotExist(string code = default) : base("Please registe...
FILE: src/Services/Passenger/src/Passenger/Passengers/Exceptions/PassengerNotFoundException.cs
class PassengerNotFoundException (line 5) | public class PassengerNotFoundException : NotFoundException
method PassengerNotFoundException (line 7) | public PassengerNotFoundException(string code = default) : base("Passe...
FILE: src/Services/Passenger/src/Passenger/Passengers/Features/CompletingRegisterPassenger/V1/CompleteRegisterPassenger.cs
type CompleteRegisterPassenger (line 22) | public record CompleteRegisterPassenger(string PassportNumber, Enums.Pas...
type PassengerRegistrationCompletedDomainEvent (line 29) | public record PassengerRegistrationCompletedDomainEvent(
type CompleteRegisterPassengerResult (line 38) | public record CompleteRegisterPassengerResult(PassengerDto PassengerDto);
type CompleteRegisterPassengerRequestDto (line 40) | public record CompleteRegisterPassengerRequestDto(string PassportNumber,...
type CompleteRegisterPassengerResponseDto (line 42) | public record CompleteRegisterPassengerResponseDto(PassengerDto Passenge...
class CompleteRegisterPassengerEndpoint (line 44) | public class CompleteRegisterPassengerEndpoint : IMinimalEndpoint
method MapEndpoint (line 46) | public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
class CompleteRegisterPassengerValidator (line 81) | public class CompleteRegisterPassengerValidator : AbstractValidator<Comp...
method CompleteRegisterPassengerValidator (line 83) | public CompleteRegisterPassengerValidator()
class CompleteRegisterPassengerCommandHandler (line 98) | internal class CompleteRegisterPassengerCommandHandler
method CompleteRegisterPassengerCommandHandler (line 104) | public CompleteRegisterPassengerCommandHandler(IMapper mapper, Passeng...
method Handle (line 110) | public async Task<CompleteRegisterPassengerResult> Handle(
FILE: src/Services/Passenger/src/Passenger/Passengers/Features/CompletingRegisterPassenger/V1/CompleteRegisterPassengerMongo.cs
type CompleteRegisterPassengerMongoCommand (line 14) | public record CompleteRegisterPassengerMongoCommand(Guid Id, string Pass...
class CompleteRegisterPassengerMongoHandler (line 18) | internal class CompleteRegisterPassengerMongoHandler : ICommandHandler<C...
method CompleteRegisterPassengerMongoHandler (line 23) | public CompleteRegisterPassengerMongoHandler(
method Handle (line 31) | public async Task<Unit> Handle(CompleteRegisterPassengerMongoCommand r...
FILE: src/Services/Passenger/src/Passenger/Passengers/Features/GettingPassengerById/V1/GetPassengerById.cs
type GetPassengerById (line 20) | public record GetPassengerById(Guid Id) : IQuery<GetPassengerByIdResult>;
type GetPassengerByIdResult (line 22) | public record GetPassengerByIdResult(PassengerDto PassengerDto);
type GetPassengerByIdResponseDto (line 24) | public record GetPassengerByIdResponseDto(PassengerDto PassengerDto);
class GetPassengerByIdEndpoint (line 26) | public class GetPassengerByIdEndpoint : IMinimalEndpoint
method MapEndpoint (line 28) | public IEndpointRouteBuilder MapEndpoint(IEndpointRouteBuilder builder)
class GetPassengerByIdValidator (line 53) | public class GetPassengerByIdValidator : AbstractValidator<GetPassengerB...
method GetPassengerByIdValidator (line 55) | public GetPassengerByIdValidator()
class GetPassengerByIdHandler (line 61) | internal class GetPassengerByIdHandler : IQueryHandler<GetPassengerById,...
method GetPassengerByIdHandler (line 66) | public GetPassengerByIdHandler(IMapper mapper, PassengerReadDbContext ...
method Handle (line 72) | public async Task<GetPassengerByIdResult> Handle(GetPassengerById quer...
FILE: src/Services/Passenger/src/Passenger/Passengers/Features/PassengerMappings.cs
class PassengerMappings (line 11) | public class PassengerMappings : IRegister
method Register (line 13) | public void Register(TypeAdapterConfig config)
FILE: src/Services/Passenger/src/Passenger/Passengers/Models/Passenger.cs
type Passenger (line 9) | public record Passenger : Aggregate<PassengerId>
FILE: src/Services/Passenger/src/Passenger/Passengers/Models/PassengerReadModel.cs
class PassengerReadModel (line 3) | public class PassengerReadModel
FILE: src/Services/Passenger/src/Passenger/Passengers/ValueObjects/Age.cs
type Age (line 5) | public record Age
FILE: src/Services/Passenger/src/Passenger/Passengers/ValueObjects/Name.cs
type Name (line 5) | public record Name
FILE: src/Services/Passenger/src/Passenger/Passengers/ValueObjects/PassengerId.cs
type PassengerId (line 6) | public record PassengerId
FILE: src/Services/Passenger/src/Passenger/Passengers/ValueObjects/PassportNumber.cs
type PassportNumber (line 5) | public record PassportNumber
FILE: src/Services/Passenger/tests/IntegrationTest/Fakes/FakeCompleteRegisterPassengerCommand.cs
class FakeCompleteRegisterPassengerCommand (line 8) | public sealed class FakeCompleteRegisterPassengerCommand : AutoFaker<Com...
method FakeCompleteRegisterPassengerCommand (line 10) | public FakeCompleteRegisterPassengerCommand(string passportNumber, Gui...
FILE: src/Services/Passenger/tests/IntegrationTest/Fakes/FakeCompleteRegisterPassengerMongoCommand.cs
class FakeCompleteRegisterPassengerMongoCommand (line 8) | public class FakeCompleteRegisterPassengerMongoCommand : AutoFaker<Compl...
method FakeCompleteRegisterPassengerMongoCommand (line 10) | public FakeCompleteRegisterPassengerMongoCommand()
FILE: src/Services/Passenger/tests/IntegrationTest/Passenger/Features/CompleteRegisterPassengerTests.cs
class CompleteRegisterPassengerTests (line 10) | public class CompleteRegisterPassengerTests : PassengerIntegrationTestBase
method CompleteRegisterPassengerTests (line 12) | public CompleteRegisterPassengerTests(
method should_complete_register_passenger_and_update_to_db (line 17) | [Fact]
FILE: src/Services/Passenger/tests/IntegrationTest/Passenger/Features/GetPassengerByIdTests.cs
class GetPassengerByIdTests (line 14) | public class GetPassengerByIdTests : PassengerIntegrationTestBase
method GetPassengerByIdTests (line 16) | public GetPassengerByIdTests(
method should_retrive_a_passenger_by_id_currectly (line 21) | [Fact]
method should_retrive_a_passenger_by_id_from_grpc_service (line 39) | [Fact]
FILE: src/Services/Passenger/tests/IntegrationTest/PassengerIntegrationTestBase.cs
class PassengerIntegrationTestBase (line 8) | [Collection(IntegrationTestCollection.Name)]
method PassengerIntegrationTestBase (line 11) | public PassengerIntegrationTestBase(TestFixture<Program, PassengerDbCo...
class IntegrationTestCollection (line 17) | [CollectionDefinition(Name)]
FILE: src/Services/Passenger/tests/PerformanceTest/script.js
constant BASE_URL (line 18) | const BASE_URL = "/";
constant SLEEP_DURATION (line 21) | const SLEEP_DURATION = 0.1;
Condensed preview — 555 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,752K chars).
[
{
"path": ".aspire/settings.json",
"chars": 63,
"preview": "{\n \"appHostPath\": \"../src/Aspire/src/AppHost/AppHost.csproj\"\n}"
},
{
"path": ".config/dotnet-tools.json",
"chars": 478,
"preview": "{\n \"version\": 1,\n \"isRoot\": true,\n \"tools\": {\n \"dotnet-outdated-tool\": {\n \"version\": \"4.6.9\",\n \"commands"
},
{
"path": ".dockerignore",
"chars": 359,
"preview": "**/.classpath\n**/.dockerignore\n**/.env\n**/.git\n**/.gitignore\n**/.project\n**/.settings\n**/.toolstarget\n**/.vs\n**/.vscode\n"
},
{
"path": ".editorconfig",
"chars": 46903,
"preview": "# https://editorconfig.org\n# https://www.jetbrains.com/help/resharper/Using_EditorConfig.html\n# https://learn.microsoft."
},
{
"path": ".gitattributes",
"chars": 2534,
"preview": "###############################################################################\n# Set default behavior to automatically "
},
{
"path": ".github/actions/build/action.yml",
"chars": 2534,
"preview": "# https://docs.github.com/en/actions/creating-actions/creating-a-composite-action\n# https://docs.github.com/en/actions/"
},
{
"path": ".github/actions/build-test/action.yml",
"chars": 2320,
"preview": "# https://docs.github.com/en/actions/creating-actions/creating-a-composite-action\n# https://docs.github.com/en/actions/"
},
{
"path": ".github/actions/docker-build-publish/action.yml",
"chars": 1894,
"preview": "name: \"Publish and Build Docker\"\ndescription: \"Publish and Build Docker \"\n\n# Input parameters allow you to specify data"
},
{
"path": ".github/actions/test/action.yml",
"chars": 4197,
"preview": "# https://docs.github.com/en/actions/creating-actions/creating-a-composite-action\n# https://docs.github.com/en/actions/"
},
{
"path": ".github/release-drafter.yml",
"chars": 2750,
"preview": "# https://johanneskonings.dev/github/2021/02/28/github_automatic_releases_and-changelog/\n# https://tiagomichaelsousa.dev"
},
{
"path": ".github/workflows/ci.yml",
"chars": 6173,
"preview": "name: CI\n\non:\n push:\n branches: [ \"main\"]\n paths-ignore:\n - \"README.md\"\n pull_request:\n branches: [ \"mai"
},
{
"path": ".github/workflows/release-drafter-labeler.yml",
"chars": 441,
"preview": "name: Release Drafter Auto Labeler\n\non:\n pull_request:\n types:\n - opened\n - synchronize\n - reopened\n "
},
{
"path": ".gitignore",
"chars": 7703,
"preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## G"
},
{
"path": ".husky/commit-msg",
"chars": 34,
"preview": "npx --no -- commitlint --edit ${1}"
},
{
"path": ".husky/pre-commit",
"chars": 33,
"preview": "npm run format\nnpm run ci-format\n"
},
{
"path": "CONTRIBUTION.md",
"chars": 1751,
"preview": "## Contribution\n\nThis is great that you'd like to contribute to this project. All change requests should go through the "
},
{
"path": "Directory.Build.props",
"chars": 2480,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project>\n <PropertyGroup>\n <TargetFramework>net10.0</TargetFramework>\n <I"
},
{
"path": "LICENSE",
"chars": 1070,
"preview": "MIT License\n\nCopyright (c) 2022 Meysam Hadeli\n\nPermission is hereby granted, free of charge, to any person obtaining a c"
},
{
"path": "README.md",
"chars": 20338,
"preview": "<div align=\"center\" style=\"margin-bottom:20px\">\n <img src=\"assets/logo.png\" alt=\"booking-microservices\" />\n <div ali"
},
{
"path": "assets/booking-microservices.drawio",
"chars": 329301,
"preview": "<mxfile host=\"app.diagrams.net\" agent=\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
},
{
"path": "assets/vertical-slice-architecture.excalidraw",
"chars": 10432,
"preview": "{\n \"type\": \"excalidraw\",\n \"version\": 2,\n \"source\": \"https://excalidraw.com\",\n \"elements\": [\n {\n \"type\": \"rec"
},
{
"path": "booking-microservices.sln",
"chars": 26290,
"preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.0.31903"
},
{
"path": "booking.rest",
"chars": 5882,
"preview": "\n## uncommnet this line for use kubernetes ingress controller instead of Yarp\n//@api-gateway=https://booking-microservic"
},
{
"path": "commitlint.config.js",
"chars": 72,
"preview": "module.exports = {\n extends: [\"@commitlint/config-conventional\"],\n }"
},
{
"path": "deployments/configs/dashboards.md",
"chars": 692,
"preview": "# Dashboards\n\n- [Introducing ASP.NET Core metrics and Grafana dashboards in .NET 8](https://devblogs.microsoft.com/dotne"
},
{
"path": "deployments/configs/grafana/dashboards/dotnet-core-endpoint.json",
"chars": 24544,
"preview": "{\n \"__inputs\": [\n {\n \"name\": \"DS_MANAGED_PROMETHEUS_JAMESNK-TELEMETRY\",\n \"label\": \"Managed_Prometheus_jame"
},
{
"path": "deployments/configs/grafana/dashboards/dotnet-core.json",
"chars": 33904,
"preview": "{\n \"__inputs\": [\n {\n \"name\": \"DS_MANAGED_PROMETHEUS_JAMESNK-TELEMETRY\",\n \"label\": \"Managed_Prometheus_jame"
},
{
"path": "deployments/configs/grafana/dashboards/node-exporter.json",
"chars": 24172,
"preview": "{\n \"__inputs\": [],\n \"__requires\": [\n {\n \"type\": \"grafana\",\n \"id\": \"grafana\",\n \"name\": \"Grafana\",\n "
},
{
"path": "deployments/configs/grafana/dashboards/postgresql.json",
"chars": 34258,
"preview": "{\n \"__inputs\": [],\n \"__requires\": [\n {\n \"type\": \"grafana\",\n \"id\": \"grafana\",\n \"name\": \"Grafana\",\n "
},
{
"path": "deployments/configs/grafana/dashboards/rabbitmq.json",
"chars": 222049,
"preview": "{\n \"__inputs\": [\n {\n \"name\": \"DS_PROMETHEUS\",\n \"label\": \"prometheus\",\n \"description\": \"\",\n \"type"
},
{
"path": "deployments/configs/grafana/provisioning/dashboards/dashboard.yml",
"chars": 406,
"preview": "# https://grafana.com/docs/grafana/latest/administration/provisioning/#dashboards\napiVersion: 1\n\nproviders:\n - name: \"d"
},
{
"path": "deployments/configs/grafana/provisioning/datasources/datasource.yml",
"chars": 2264,
"preview": "# https://grafana.com/docs/grafana/latest/administration/provisioning/\n# https://github.com/grafana/tempo/blob/main/exam"
},
{
"path": "deployments/configs/loki-config.yaml",
"chars": 1553,
"preview": "# https://grafana.com/docs/loki/latest/configure/examples/configuration-examples/\n# https://github.com/grafana/loki/issu"
},
{
"path": "deployments/configs/otel-collector-config.yaml",
"chars": 6703,
"preview": "# ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/examples/demo/otel-collector-config.y"
},
{
"path": "deployments/configs/prometheus.yaml",
"chars": 1904,
"preview": "# ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/examples/demo/prometheus.yaml\n# https"
},
{
"path": "deployments/configs/tempo.yaml",
"chars": 1396,
"preview": "# https://grafana.com/docs/tempo/latest/configuration/\n# https://github.com/grafana/tempo/blob/main/example/docker-compo"
},
{
"path": "deployments/docker-compose/docker-compose.infrastructure.yaml",
"chars": 12307,
"preview": "# ref: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/examples/demo/docker-compose.yaml\n# r"
},
{
"path": "deployments/docker-compose/docker-compose.yaml",
"chars": 15297,
"preview": "name: booking-microservices\n\nservices:\n\n #######################################################\n # rabbitmq\n ######"
},
{
"path": "deployments/kubernetes/booking-cert-manager.yml",
"chars": 397,
"preview": "apiVersion: cert-manager.io/v1\nkind: ClusterIssuer\nmetadata:\n name: letsencrypt-staging\nspec:\n acme:\n # Staging API"
},
{
"path": "deployments/kubernetes/booking-microservices.yml",
"chars": 26212,
"preview": "## ref: https://kompose.io\n#######################################################\n# Network\n##########################"
},
{
"path": "global.json",
"chars": 91,
"preview": "{\n \"sdk\": {\n \"version\": \"10.0.103\",\n \"rollForward\": \"latestFeature\"\n }\n }\n"
},
{
"path": "package.json",
"chars": 589,
"preview": "{\n \"name\": \"booking-microservices\",\n \"version\": \"1.0.0\",\n \"description\": \"booking-microservices\",\n \"author\": \"Meysam"
},
{
"path": "scripts/setup_kubectl_gitpod.sh",
"chars": 331,
"preview": "#!/bin/bash\n\n# Download kubectl binary\ncurl -LO \"https://storage.googleapis.com/kubernetes-release/release/$(curl -L -s "
},
{
"path": "src/ApiGateway/Dockerfile",
"chars": 996,
"preview": "# ---------- Build Stage ----------\nFROM mcr.microsoft.com/dotnet/sdk:10.0 AS build\nWORKDIR /src\n\n# Copy solution-level "
},
{
"path": "src/ApiGateway/src/ApiGateway.csproj",
"chars": 156,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n <ItemGroup>\n <ProjectReference Include=\"..\\..\\BuildingBlocks\\BuildingBlocks.c"
},
{
"path": "src/ApiGateway/src/Program.cs",
"chars": 776,
"preview": "using BuildingBlocks.Web;\nusing Figgle;\nusing Figgle.Fonts;\n\nvar builder = WebApplication.CreateBuilder(args);\nvar env ="
},
{
"path": "src/ApiGateway/src/Properties/launchSettings.json",
"chars": 369,
"preview": "{\n \"$schema\": \"https://json.schemastore.org/launchsettings.json\",\n \"profiles\": {\n \"ApiGateway\": {\n \"commandNam"
},
{
"path": "src/ApiGateway/src/appsettings.Development.json",
"chars": 119,
"preview": "{\n \"Logging\": {\n \"LogLevel\": {\n \"Default\": \"Information\",\n \"Microsoft.AspNetCore\": \"Warning\"\n }\n }\n}\n"
},
{
"path": "src/ApiGateway/src/appsettings.docker.json",
"chars": 814,
"preview": "{\n \"LogOptions\": {\n \"Level\": \"Information\",\n \"LogTemplate\": \"{Timestamp:HH:mm:ss} [{Level:u4}] {Message:lj}{NewLi"
},
{
"path": "src/ApiGateway/src/appsettings.json",
"chars": 1903,
"preview": "{\n \"AppOptions\": {\n \"Name\": \"ApiGateway\"\n },\n \"LogOptions\": {\n \"Level\": \"Information\",\n \"LogTemplate\": \"{Tim"
},
{
"path": "src/Aspire/src/AppHost/AppHost.csproj",
"chars": 1583,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <Sdk Name=\"Aspire.AppHost.SDK\" Version=\"13.1.1\"/>\n \n <PropertyGroup>\n <OutputT"
},
{
"path": "src/Aspire/src/AppHost/Program.cs",
"chars": 13263,
"preview": "using System.Net.Sockets;\n\nvar builder = DistributedApplication.CreateBuilder(args);\n\nbuilder.AddDockerComposeEnvironmen"
},
{
"path": "src/Aspire/src/AppHost/Properties/launchSettings.json",
"chars": 688,
"preview": "{\n \"$schema\": \"http://json.schemastore.org/launchsettings.json\",\n \"profiles\": {\n \"AppHost\": {\n "
},
{
"path": "src/Aspire/src/AppHost/appsettings.Development.json",
"chars": 119,
"preview": "{\n \"Logging\": {\n \"LogLevel\": {\n \"Default\": \"Information\",\n \"Microsoft.AspNetCore\": \"Warning\"\n }\n }\n}\n"
},
{
"path": "src/Aspire/src/AppHost/appsettings.json",
"chars": 142,
"preview": "{\n \"Logging\": {\n \"LogLevel\": {\n \"Default\": \"Information\",\n \"Microsoft.AspNetCore\": \"Warning\"\n }\n },\n "
},
{
"path": "src/Aspire/src/ServiceDefaults/Extensions.cs",
"chars": 1233,
"preview": "using BuildingBlocks.HealthCheck;\nusing BuildingBlocks.OpenTelemetryCollector;\nusing Microsoft.AspNetCore.Builder;\nusing"
},
{
"path": "src/Aspire/src/ServiceDefaults/ServiceDefaults.csproj",
"chars": 351,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFramework>net10.0</TargetFramework>\n <ImplicitUsings"
},
{
"path": "src/BuildingBlocks/BuildingBlocks.csproj",
"chars": 7844,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <ItemGroup>\n <PackageReference Include=\"Ardalis.GuardClauses\" Version=\"5.0.0\" />"
},
{
"path": "src/BuildingBlocks/Caching/CachingBehavior.cs",
"chars": 1876,
"preview": "using EasyCaching.Core;\nusing MediatR;\nusing Microsoft.Extensions.Logging;\n\nnamespace BuildingBlocks.Caching;\n\npublic cl"
},
{
"path": "src/BuildingBlocks/Caching/ICacheRequest.cs",
"chars": 153,
"preview": "namespace BuildingBlocks.Caching;\n\npublic interface ICacheRequest\n{\n string CacheKey { get; }\n DateTime? AbsoluteE"
},
{
"path": "src/BuildingBlocks/Caching/IInvalidateCacheRequest.cs",
"chars": 126,
"preview": "namespace BuildingBlocks.Caching\n{\n public interface IInvalidateCacheRequest\n {\n string CacheKey { get; }\n "
},
{
"path": "src/BuildingBlocks/Caching/InvalidateCachingBehavior.cs",
"chars": 1423,
"preview": "using EasyCaching.Core;\nusing MediatR;\nusing Microsoft.Extensions.Logging;\n\nnamespace BuildingBlocks.Caching\n{\n publi"
},
{
"path": "src/BuildingBlocks/Constants/IdentityConstant.cs",
"chars": 206,
"preview": "namespace BuildingBlocks.Constants;\n\npublic static class IdentityConstant\n{\n public static class Role\n {\n p"
},
{
"path": "src/BuildingBlocks/Contracts/EventBus.Messages/FlighContracts.cs",
"chars": 494,
"preview": "using BuildingBlocks.Core.Event;\n\nnamespace BuildingBlocks.Contracts.EventBus.Messages;\n\npublic record FlightCreated(Gui"
},
{
"path": "src/BuildingBlocks/Contracts/EventBus.Messages/IdentityContracts.cs",
"chars": 180,
"preview": "using BuildingBlocks.Core.Event;\n\nnamespace BuildingBlocks.Contracts.EventBus.Messages;\n\npublic record UserCreated(Guid "
},
{
"path": "src/BuildingBlocks/Contracts/EventBus.Messages/PassengerContracts.cs",
"chars": 224,
"preview": "using BuildingBlocks.Core.Event;\n\nnamespace BuildingBlocks.Contracts.EventBus.Messages;\n\npublic record PassengerRegistra"
},
{
"path": "src/BuildingBlocks/Contracts/EventBus.Messages/ReservationContracts.cs",
"chars": 147,
"preview": "using BuildingBlocks.Core.Event;\n\nnamespace BuildingBlocks.Contracts.EventBus.Messages;\n\npublic record BookingCreated(Gu"
},
{
"path": "src/BuildingBlocks/Core/CQRS/ICommand.cs",
"chars": 173,
"preview": "using MediatR;\n\nnamespace BuildingBlocks.Core.CQRS;\n\npublic interface ICommand : ICommand<Unit>\n{\n}\n\npublic interface IC"
},
{
"path": "src/BuildingBlocks/Core/CQRS/ICommandHandler.cs",
"chars": 344,
"preview": "using MediatR;\n\nnamespace BuildingBlocks.Core.CQRS;\n\npublic interface ICommandHandler<in TCommand> : ICommandHandler<TCo"
},
{
"path": "src/BuildingBlocks/Core/CQRS/IQuery.cs",
"chars": 123,
"preview": "using MediatR;\n\nnamespace BuildingBlocks.Core.CQRS;\n\npublic interface IQuery<out T> : IRequest<T>\n where T : notnull\n"
},
{
"path": "src/BuildingBlocks/Core/CQRS/IQueryHandler.cs",
"chars": 213,
"preview": "using MediatR;\n\nnamespace BuildingBlocks.Core.CQRS;\n\npublic interface IQueryHandler<in TQuery, TResponse> : IRequestHand"
},
{
"path": "src/BuildingBlocks/Core/CompositeEventMapper.cs",
"chars": 935,
"preview": "using BuildingBlocks.Core.Event;\n\nnamespace BuildingBlocks.Core;\n\npublic class CompositeEventMapper : IEventMapper\n{\n "
},
{
"path": "src/BuildingBlocks/Core/Event/EventType.cs",
"chars": 142,
"preview": "namespace BuildingBlocks.Core.Event;\n\n[Flags]\npublic enum EventType\n{\n DomainEvent = 1,\n IntegrationEvent = 2,\n "
},
{
"path": "src/BuildingBlocks/Core/Event/IDomainEvent.cs",
"chars": 80,
"preview": "namespace BuildingBlocks.Core.Event;\n\npublic interface IDomainEvent : IEvent\n{\n}"
},
{
"path": "src/BuildingBlocks/Core/Event/IEvent.cs",
"chars": 275,
"preview": "using MediatR;\n\nnamespace BuildingBlocks.Core.Event;\n\nusing global::MassTransit;\n\npublic interface IEvent : INotificatio"
},
{
"path": "src/BuildingBlocks/Core/Event/IHaveIntegrationEvent.cs",
"chars": 80,
"preview": "namespace BuildingBlocks.Core.Event;\n\npublic interface IHaveIntegrationEvent\n{\n}"
},
{
"path": "src/BuildingBlocks/Core/Event/IIntegrationEvent.cs",
"chars": 127,
"preview": "using MassTransit;\n\nnamespace BuildingBlocks.Core.Event;\n\n[ExcludeFromTopology]\npublic interface IIntegrationEvent : IEv"
},
{
"path": "src/BuildingBlocks/Core/Event/IInternalCommand.cs",
"chars": 84,
"preview": "namespace BuildingBlocks.Core.Event;\n\npublic interface IInternalCommand : IEvent\n{\n}"
},
{
"path": "src/BuildingBlocks/Core/Event/InternalCommand.cs",
"chars": 130,
"preview": "using BuildingBlocks.Core.CQRS;\n\nnamespace BuildingBlocks.Core.Event;\n\npublic record InternalCommand : IInternalCommand,"
},
{
"path": "src/BuildingBlocks/Core/Event/MessageEnvelope.cs",
"chars": 680,
"preview": "using Google.Protobuf;\n\nnamespace BuildingBlocks.Core.Event;\n\npublic class MessageEnvelope\n{\n public MessageEnvelope("
},
{
"path": "src/BuildingBlocks/Core/EventDispatcher.cs",
"chars": 5758,
"preview": "using System.Security.Claims;\nusing BuildingBlocks.Core.Event;\nusing BuildingBlocks.PersistMessageProcessor;\nusing Build"
},
{
"path": "src/BuildingBlocks/Core/IEventDispatcher.cs",
"chars": 378,
"preview": "using BuildingBlocks.Core.Event;\n\nnamespace BuildingBlocks.Core;\n\npublic interface IEventDispatcher\n{\n public Task Se"
},
{
"path": "src/BuildingBlocks/Core/IEventMapper.cs",
"chars": 231,
"preview": "using BuildingBlocks.Core.Event;\n\nnamespace BuildingBlocks.Core;\n\npublic interface IEventMapper\n{\n IIntegrationEvent?"
},
{
"path": "src/BuildingBlocks/Core/IntegrationEventWrapper.cs",
"chars": 214,
"preview": "using BuildingBlocks.Core.Event;\n\nnamespace BuildingBlocks.Core;\n\npublic record IntegrationEventWrapper<TDomainEventType"
},
{
"path": "src/BuildingBlocks/Core/Model/Aggregate.cs",
"chars": 576,
"preview": "using BuildingBlocks.Core.Event;\n\nnamespace BuildingBlocks.Core.Model;\n\npublic abstract record Aggregate<TId> : Entity<T"
},
{
"path": "src/BuildingBlocks/Core/Model/Entity.cs",
"chars": 375,
"preview": "namespace BuildingBlocks.Core.Model;\n\npublic abstract record Entity<T> : IEntity<T>\n{\n public T Id { get; set; }\n "
},
{
"path": "src/BuildingBlocks/Core/Model/IAggregate.cs",
"chars": 262,
"preview": "using BuildingBlocks.Core.Event;\n\nnamespace BuildingBlocks.Core.Model;\n\npublic interface IAggregate<T> : IAggregate, IEn"
},
{
"path": "src/BuildingBlocks/Core/Model/IEntity.cs",
"chars": 370,
"preview": "namespace BuildingBlocks.Core.Model;\n\npublic interface IEntity<T> : IEntity\n{\n public T Id { get; set; }\n}\n\npublic in"
},
{
"path": "src/BuildingBlocks/Core/Model/IVersion.cs",
"chars": 137,
"preview": "namespace BuildingBlocks.Core.Model;\n\n// For handling optimistic concurrency\npublic interface IVersion\n{\n long Versio"
},
{
"path": "src/BuildingBlocks/Core/Pagination/Extensions.cs",
"chars": 1245,
"preview": "namespace BuildingBlocks.Core.Pagination;\n\nusing Sieve.Models;\nusing Sieve.Services;\n\npublic static class Extensions\n{\n "
},
{
"path": "src/BuildingBlocks/Core/Pagination/IPageList.cs",
"chars": 423,
"preview": "namespace BuildingBlocks.Core.Pagination;\n\npublic interface IPageList<T>\n where T : class\n{\n int CurrentPageSize {"
},
{
"path": "src/BuildingBlocks/Core/Pagination/IPageQuery.cs",
"chars": 169,
"preview": "namespace BuildingBlocks.Core.Pagination;\n\nusing MediatR;\n\npublic interface IPageQuery<out TResponse> : IPageRequest, IR"
},
{
"path": "src/BuildingBlocks/Core/Pagination/IPageRequest.cs",
"chars": 214,
"preview": "namespace BuildingBlocks.Core.Pagination;\n\npublic interface IPageRequest\n{\n int PageNumber { get; init; }\n int Pag"
},
{
"path": "src/BuildingBlocks/Core/Pagination/PageList.cs",
"chars": 871,
"preview": "namespace BuildingBlocks.Core.Pagination;\n\npublic record PageList<T>(IReadOnlyList<T> Items, int PageNumber, int PageSiz"
},
{
"path": "src/BuildingBlocks/EFCore/AppDbContextBase.cs",
"chars": 6183,
"preview": "using System.Collections.Immutable;\nusing BuildingBlocks.Core.Event;\nusing BuildingBlocks.Core.Model;\nusing BuildingBloc"
},
{
"path": "src/BuildingBlocks/EFCore/DesignTimeDbContextFactoryBase.cs",
"chars": 2202,
"preview": "using Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Design;\nusing Microsoft.Extensions.Configuratio"
},
{
"path": "src/BuildingBlocks/EFCore/EfTxBehavior.cs",
"chars": 2870,
"preview": "using System.Text.Json;\nusing System.Transactions;\nusing BuildingBlocks.Core;\nusing BuildingBlocks.PersistMessageProcess"
},
{
"path": "src/BuildingBlocks/EFCore/Extensions.cs",
"chars": 5354,
"preview": "using System.Linq.Expressions;\nusing BuildingBlocks.Core.Model;\nusing BuildingBlocks.Web;\nusing Humanizer;\nusing Microso"
},
{
"path": "src/BuildingBlocks/EFCore/IDataSeeder.cs",
"chars": 188,
"preview": "namespace BuildingBlocks.EFCore\n{\n public interface IDataSeeder\n {\n Task SeedAllAsync();\n }\n\n public "
},
{
"path": "src/BuildingBlocks/EFCore/IDbContext.cs",
"chars": 743,
"preview": "using BuildingBlocks.Core.Event;\nusing Microsoft.EntityFrameworkCore;\n\nnamespace BuildingBlocks.EFCore;\n\nusing Microsoft"
},
{
"path": "src/BuildingBlocks/EFCore/ISeedManager.cs",
"chars": 129,
"preview": "namespace BuildingBlocks.EFCore;\n\npublic interface ISeedManager\n{\n Task ExecuteSeedAsync();\n Task ExecuteTestSeedA"
},
{
"path": "src/BuildingBlocks/EFCore/PostgresOptions.cs",
"chars": 115,
"preview": "namespace BuildingBlocks.EFCore;\n\npublic class PostgresOptions\n{\n public string ConnectionString { get; set; }\n}"
},
{
"path": "src/BuildingBlocks/EFCore/SeedManagers.cs",
"chars": 1435,
"preview": "using Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Hosting;\n"
},
{
"path": "src/BuildingBlocks/EventStoreDB/BackgroundWorkers/BackgroundWorker.cs",
"chars": 843,
"preview": "using Microsoft.Extensions.Hosting;\nusing Microsoft.Extensions.Logging;\n\nnamespace BuildingBlocks.EventStoreDB.Backgroun"
},
{
"path": "src/BuildingBlocks/EventStoreDB/Config.cs",
"chars": 3407,
"preview": "using System.Reflection;\nusing BuildingBlocks.EventStoreDB.BackgroundWorkers;\nusing BuildingBlocks.EventStoreDB.Projecti"
},
{
"path": "src/BuildingBlocks/EventStoreDB/Events/AggregateEventSourcing.cs",
"chars": 760,
"preview": "using BuildingBlocks.Core.Event;\nusing BuildingBlocks.Core.Model;\n\nnamespace BuildingBlocks.EventStoreDB.Events\n{\n pu"
},
{
"path": "src/BuildingBlocks/EventStoreDB/Events/AggregateStreamExtensions.cs",
"chars": 1115,
"preview": "using BuildingBlocks.EventStoreDB.Serialization;\nusing EventStore.Client;\n\nnamespace BuildingBlocks.EventStoreDB.Events;"
},
{
"path": "src/BuildingBlocks/EventStoreDB/Events/EventTypeMapper.cs",
"chars": 1597,
"preview": "using System.Collections.Concurrent;\nusing BuildingBlocks.Utils;\n\nnamespace BuildingBlocks.EventStoreDB.Events;\n\npublic "
},
{
"path": "src/BuildingBlocks/EventStoreDB/Events/IAggregateEventSourcing.cs",
"chars": 396,
"preview": "using BuildingBlocks.Core.Event;\nusing BuildingBlocks.Core.Model;\n\nnamespace BuildingBlocks.EventStoreDB.Events\n{\n pu"
},
{
"path": "src/BuildingBlocks/EventStoreDB/Events/IEventHandler.cs",
"chars": 198,
"preview": "using BuildingBlocks.Core.Event;\nusing MediatR;\n\nnamespace BuildingBlocks.EventStoreDB.Events;\n\npublic interface IEventH"
},
{
"path": "src/BuildingBlocks/EventStoreDB/Events/IExternalEvent.cs",
"chars": 125,
"preview": "using BuildingBlocks.Core.Event;\n\nnamespace BuildingBlocks.EventStoreDB.Events;\n\npublic interface IExternalEvent : IEven"
},
{
"path": "src/BuildingBlocks/EventStoreDB/Events/IProjection.cs",
"chars": 109,
"preview": "namespace BuildingBlocks.EventStoreDB.Events;\n\npublic interface IProjection\n{\n void When(object @event);\n}"
},
{
"path": "src/BuildingBlocks/EventStoreDB/Events/StreamEvent.cs",
"chars": 592,
"preview": "using BuildingBlocks.Core.Event;\n\nnamespace BuildingBlocks.EventStoreDB.Events;\n\npublic record EventMetadata(\n ulong "
},
{
"path": "src/BuildingBlocks/EventStoreDB/Events/StreamEventExtensions.cs",
"chars": 702,
"preview": "using System.Diagnostics.Eventing.Reader;\nusing BuildingBlocks.EventStoreDB.Serialization;\nusing EventStore.Client;\n\nnam"
},
{
"path": "src/BuildingBlocks/EventStoreDB/Events/StreamNameMapper.cs",
"chars": 969,
"preview": "using System.Collections.Concurrent;\n\nnamespace BuildingBlocks.EventStoreDB.Events;\n\npublic class StreamNameMapper\n{\n "
},
{
"path": "src/BuildingBlocks/EventStoreDB/Extensions.cs",
"chars": 777,
"preview": "using System.Reflection;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.DependencyInjection;\n\nname"
},
{
"path": "src/BuildingBlocks/EventStoreDB/Projections/IProjectionProcessor.cs",
"chars": 289,
"preview": "using BuildingBlocks.EventStoreDB.Events;\nusing MediatR;\n\nnamespace BuildingBlocks.EventStoreDB.Projections;\n\npublic int"
},
{
"path": "src/BuildingBlocks/EventStoreDB/Projections/IProjectionPublisher.cs",
"chars": 380,
"preview": "using BuildingBlocks.EventStoreDB.Events;\nusing MediatR;\n\nnamespace BuildingBlocks.EventStoreDB.Projections;\n\npublic int"
},
{
"path": "src/BuildingBlocks/EventStoreDB/Projections/ProjectionPublisher.cs",
"chars": 1386,
"preview": "using BuildingBlocks.EventStoreDB.Events;\nusing MediatR;\nusing Microsoft.Extensions.DependencyInjection;\n\nnamespace Buil"
},
{
"path": "src/BuildingBlocks/EventStoreDB/Repository/EventStoreDBRepository.cs",
"chars": 2569,
"preview": "using BuildingBlocks.EventStoreDB.Events;\nusing BuildingBlocks.EventStoreDB.Serialization;\nusing EventStore.Client;\n\nnam"
},
{
"path": "src/BuildingBlocks/EventStoreDB/Repository/RepositoryExtensions.cs",
"chars": 1008,
"preview": "using BuildingBlocks.EventStoreDB.Events;\nusing BuildingBlocks.Exception;\n\nnamespace BuildingBlocks.EventStoreDB.Reposit"
},
{
"path": "src/BuildingBlocks/EventStoreDB/Serialization/EventStoreDBSerializer.cs",
"chars": 1266,
"preview": "using System.Text;\nusing BuildingBlocks.EventStoreDB.Events;\nusing EventStore.Client;\nusing Newtonsoft.Json;\n\nnamespace "
},
{
"path": "src/BuildingBlocks/EventStoreDB/Serialization/JsonObjectContractProvider.cs",
"chars": 2995,
"preview": "using System.Collections.Concurrent;\nusing System.Reflection;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Serialization"
},
{
"path": "src/BuildingBlocks/EventStoreDB/Serialization/NonDefaultConstructorContractResolver.cs",
"chars": 465,
"preview": "using Newtonsoft.Json.Serialization;\n\nnamespace BuildingBlocks.EventStoreDB.Serialization;\n\npublic class NonDefaultConst"
},
{
"path": "src/BuildingBlocks/EventStoreDB/Serialization/SerializationExtensions.cs",
"chars": 2273,
"preview": "using System.Text;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Converters;\n\nnamespace BuildingBlocks.EventStoreDB.Seria"
},
{
"path": "src/BuildingBlocks/EventStoreDB/Subscriptions/EventStoreDBSubscriptionCheckpointRepository.cs",
"chars": 2736,
"preview": "using BuildingBlocks.Core.Event;\nusing BuildingBlocks.EventStoreDB.Events;\nusing BuildingBlocks.EventStoreDB.Serializati"
},
{
"path": "src/BuildingBlocks/EventStoreDB/Subscriptions/EventStoreDBSubscriptionToAll.cs",
"chars": 7548,
"preview": "using BuildingBlocks.EventStoreDB.Events;\nusing BuildingBlocks.EventStoreDB.Projections;\nusing BuildingBlocks.Utils;\nusi"
},
{
"path": "src/BuildingBlocks/EventStoreDB/Subscriptions/ISubscriptionCheckpointRepository.cs",
"chars": 264,
"preview": "namespace BuildingBlocks.EventStoreDB.Subscriptions;\n\npublic interface ISubscriptionCheckpointRepository\n{\n ValueTask"
},
{
"path": "src/BuildingBlocks/EventStoreDB/Subscriptions/InMemorySubscriptionCheckpointRepository.cs",
"chars": 677,
"preview": "using System.Collections.Concurrent;\n\nnamespace BuildingBlocks.EventStoreDB.Subscriptions;\n\npublic class InMemorySubscri"
},
{
"path": "src/BuildingBlocks/Exception/AggregateNotFoundException.cs",
"chars": 367,
"preview": "namespace BuildingBlocks.Exception;\n\npublic class AggregateNotFoundException : System.Exception\n{\n public AggregateNo"
},
{
"path": "src/BuildingBlocks/Exception/AppException.cs",
"chars": 477,
"preview": "using System.Net;\n\nnamespace BuildingBlocks.Exception;\n\npublic class AppException : CustomException\n{\n public AppExce"
},
{
"path": "src/BuildingBlocks/Exception/BadRequestException.cs",
"chars": 283,
"preview": "using System;\nusing System.Net;\n\nnamespace BuildingBlocks.Exception\n{\n public class BadRequestException : CustomExcep"
},
{
"path": "src/BuildingBlocks/Exception/ConflictException.cs",
"chars": 262,
"preview": "using System.Net;\n\nnamespace BuildingBlocks.Exception\n{\n public class ConflictException : CustomException\n {\n "
},
{
"path": "src/BuildingBlocks/Exception/CustomException.cs",
"chars": 909,
"preview": "using System.Net;\n\nnamespace BuildingBlocks.Exception;\n\npublic class CustomException : System.Exception\n{\n public Cus"
},
{
"path": "src/BuildingBlocks/Exception/DomainException.cs",
"chars": 534,
"preview": "using System.Net;\nusing BuildingBlocks.Exception;\n\nnamespace SmartCharging.Infrastructure.Exceptions\n{\n public class "
},
{
"path": "src/BuildingBlocks/Exception/GrpcExceptionInterceptor.cs",
"chars": 633,
"preview": "using Grpc.Core;\nusing Grpc.Core.Interceptors;\nusing Microsoft.Extensions.Logging;\n\nnamespace BuildingBlocks.Exception;\n"
},
{
"path": "src/BuildingBlocks/Exception/InternalServerException.cs",
"chars": 553,
"preview": "using System.Globalization;\nusing System.Net;\n\nnamespace BuildingBlocks.Exception\n{\n public class InternalServerExcep"
},
{
"path": "src/BuildingBlocks/Exception/NotFoundException.cs",
"chars": 262,
"preview": "using System.Net;\n\nnamespace BuildingBlocks.Exception\n{\n public class NotFoundException : CustomException\n {\n "
},
{
"path": "src/BuildingBlocks/Exception/ProblemDetailsWithCode.cs",
"chars": 295,
"preview": "using System.Text.Json.Serialization;\nusing Microsoft.AspNetCore.Mvc;\n\nnamespace BuildingBlocks.Exception;\n\nusing Proble"
},
{
"path": "src/BuildingBlocks/Exception/ValidationException.cs",
"chars": 268,
"preview": "using System.Net;\n\nnamespace BuildingBlocks.Exception\n{\n public class ValidationException : CustomException\n {\n "
},
{
"path": "src/BuildingBlocks/HealthCheck/Extensions.cs",
"chars": 3815,
"preview": "using BuildingBlocks.EFCore;\nusing BuildingBlocks.EventStoreDB;\nusing BuildingBlocks.MassTransit;\nusing BuildingBlocks.M"
},
{
"path": "src/BuildingBlocks/HealthCheck/HealthOptions.cs",
"chars": 115,
"preview": "namespace BuildingBlocks.HealthCheck;\n\npublic class HealthOptions\n{\n public bool Enabled { get; set; } = true;\n}"
},
{
"path": "src/BuildingBlocks/Jwt/AuthHeaderHandler.cs",
"chars": 764,
"preview": "using System.Net.Http.Headers;\nusing Microsoft.AspNetCore.Http;\n\nnamespace BuildingBlocks.Jwt;\n\npublic class AuthHeaderH"
},
{
"path": "src/BuildingBlocks/Jwt/JwtExtensions.cs",
"chars": 3093,
"preview": "using BuildingBlocks.Constants;\nusing BuildingBlocks.Web;\nusing Duende.IdentityServer.EntityFramework.Entities;\nusing Mi"
},
{
"path": "src/BuildingBlocks/Logging/LoggingBehavior.cs",
"chars": 1453,
"preview": "using System.Diagnostics;\nusing MediatR;\nusing Microsoft.Extensions.Logging;\n\nnamespace BuildingBlocks.Logging;\n\npublic "
},
{
"path": "src/BuildingBlocks/Mapster/Extensions.cs",
"chars": 557,
"preview": "using System.Reflection;\nusing Mapster;\nusing MapsterMapper;\nusing Microsoft.Extensions.DependencyInjection;\n\nnamespace "
},
{
"path": "src/BuildingBlocks/MassTransit/ConsumeFilter.cs",
"chars": 1099,
"preview": "using BuildingBlocks.Core.Event;\nusing BuildingBlocks.PersistMessageProcessor;\nusing MassTransit;\n\nnamespace BuildingBlo"
},
{
"path": "src/BuildingBlocks/MassTransit/Extensions.cs",
"chars": 4046,
"preview": "using System.Reflection;\nusing BuildingBlocks.Web;\nusing MassTransit;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsof"
},
{
"path": "src/BuildingBlocks/MassTransit/RabbitMqOptions.cs",
"chars": 277,
"preview": "namespace BuildingBlocks.MassTransit;\n\npublic class RabbitMqOptions\n{\n public string HostName { get; set; }\n publi"
},
{
"path": "src/BuildingBlocks/MassTransit/TransportType.cs",
"chars": 95,
"preview": "namespace BuildingBlocks.MassTransit;\n\npublic enum TransportType\n{\n RabbitMq,\n InMemory\n}"
},
{
"path": "src/BuildingBlocks/Mongo/Extensions.cs",
"chars": 2141,
"preview": "using Microsoft.AspNetCore.Builder;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.DependencyInjec"
},
{
"path": "src/BuildingBlocks/Mongo/IMongoDbContext.cs",
"chars": 522,
"preview": "using MongoDB.Driver;\n\nnamespace BuildingBlocks.Mongo;\n\npublic interface IMongoDbContext : IDisposable\n{\n IMongoColle"
},
{
"path": "src/BuildingBlocks/Mongo/IMongoRepository.cs",
"chars": 192,
"preview": "using BuildingBlocks.Core.Model;\n\nnamespace BuildingBlocks.Mongo;\n\npublic interface IMongoRepository<TEntity, in TId> : "
},
{
"path": "src/BuildingBlocks/Mongo/IMongoUnitOfWork.cs",
"chars": 148,
"preview": "namespace BuildingBlocks.Mongo;\n\npublic interface IMongoUnitOfWork<out TContext> : IUnitOfWork<TContext> where TContext "
},
{
"path": "src/BuildingBlocks/Mongo/IRepository.cs",
"chars": 1804,
"preview": "using System.Linq.Expressions;\nusing BuildingBlocks.Core.Model;\n\nnamespace BuildingBlocks.Mongo;\n\npublic interface IRead"
},
{
"path": "src/BuildingBlocks/Mongo/ITransactionAble.cs",
"chars": 311,
"preview": "namespace BuildingBlocks.Mongo;\n\npublic interface ITransactionAble\n{\n Task BeginTransactionAsync(CancellationToken ca"
},
{
"path": "src/BuildingBlocks/Mongo/IUnitOfWork.cs",
"chars": 346,
"preview": "namespace BuildingBlocks.Mongo;\n\npublic interface IUnitOfWork : IDisposable\n{\n Task BeginTransactionAsync(Cancellatio"
},
{
"path": "src/BuildingBlocks/Mongo/ImmutablePocoConvention.cs",
"chars": 3409,
"preview": "using System.Reflection;\nusing MongoDB.Bson.Serialization;\nusing MongoDB.Bson.Serialization.Conventions;\n\nnamespace Buil"
},
{
"path": "src/BuildingBlocks/Mongo/MicroBootstrap.Persistence.Mongo.csproj",
"chars": 422,
"preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n <PropertyGroup>\n <TargetFramework>net6.0</TargetFramework>\n <ImplicitUsings>e"
},
{
"path": "src/BuildingBlocks/Mongo/MongoDbContext.cs",
"chars": 4463,
"preview": "using System.Globalization;\nusing Microsoft.Extensions.Options;\nusing MongoDB.Bson;\nusing MongoDB.Bson.Serialization;\nus"
},
{
"path": "src/BuildingBlocks/Mongo/MongoOptions.cs",
"chars": 238,
"preview": "namespace BuildingBlocks.Mongo;\n\npublic class MongoOptions\n{\n public string ConnectionString { get; set; } = null!;\n "
},
{
"path": "src/BuildingBlocks/Mongo/MongoRepository.cs",
"chars": 2979,
"preview": "using System.Linq.Expressions;\nusing BuildingBlocks.Core.Model;\nusing MongoDB.Driver;\nusing MongoDB.Driver.Linq;\n\nnamesp"
},
{
"path": "src/BuildingBlocks/Mongo/MongoUnitOfWork.cs",
"chars": 957,
"preview": "namespace BuildingBlocks.Mongo;\n\npublic class MongoUnitOfWork<TContext> : IMongoUnitOfWork<TContext>, ITransactionAble\n "
},
{
"path": "src/BuildingBlocks/OpenApi/Extensions.cs",
"chars": 1765,
"preview": "using Microsoft.AspNetCore.Builder;\nusing Microsoft.Extensions.DependencyInjection;\nusing Scalar.AspNetCore;\n\nnamespace "
},
{
"path": "src/BuildingBlocks/OpenApi/SecuritySchemeDocumentTransformer.cs",
"chars": 1693,
"preview": "using Microsoft.AspNetCore.OpenApi;\nusing Microsoft.OpenApi;\n\npublic class SecuritySchemeDocumentTransformer : IOpenApiD"
},
{
"path": "src/BuildingBlocks/OpenTelemetryCollector/ActivityExtensions.cs",
"chars": 6882,
"preview": "using System.Diagnostics;\nusing System.Globalization;\n\nnamespace BuildingBlocks.OpenTelemetryCollector;\n\ninternal static"
},
{
"path": "src/BuildingBlocks/OpenTelemetryCollector/ActivityInfo.cs",
"chars": 1007,
"preview": "using System.Diagnostics;\n\nnamespace BuildingBlocks.OpenTelemetryCollector;\n\npublic class ActivityInfo\n{\n public stri"
},
{
"path": "src/BuildingBlocks/OpenTelemetryCollector/Behaviors/ObservabilityPipelineBehavior.cs",
"chars": 2623,
"preview": "using BuildingBlocks.Core.CQRS;\nusing BuildingBlocks.OpenTelemetryCollector.CoreDiagnostics.Commands;\nusing BuildingBloc"
},
{
"path": "src/BuildingBlocks/OpenTelemetryCollector/CoreDiagnostics/Commands/CommandHandlerActivity.cs",
"chars": 3525,
"preview": "using System.Diagnostics;\nusing BuildingBlocks.Core.CQRS;\nusing BuildingBlocks.OpenTelemetryCollector.DiagnosticsProvide"
},
{
"path": "src/BuildingBlocks/OpenTelemetryCollector/CoreDiagnostics/Commands/CommandHandlerMetrics.cs",
"chars": 5860,
"preview": "using System.Diagnostics;\nusing System.Diagnostics.Metrics;\nusing BuildingBlocks.Core.CQRS;\nusing BuildingBlocks.OpenTel"
},
{
"path": "src/BuildingBlocks/OpenTelemetryCollector/CoreDiagnostics/Query/QueryHandlerActivity.cs",
"chars": 1876,
"preview": "using System.Diagnostics;\nusing BuildingBlocks.Core.CQRS;\nusing BuildingBlocks.OpenTelemetryCollector.DiagnosticsProvide"
},
{
"path": "src/BuildingBlocks/OpenTelemetryCollector/CoreDiagnostics/Query/QueryHandlerMetrics.cs",
"chars": 5681,
"preview": "using System.Diagnostics;\nusing System.Diagnostics.Metrics;\nusing BuildingBlocks.Core.CQRS;\nusing BuildingBlocks.OpenTel"
},
{
"path": "src/BuildingBlocks/OpenTelemetryCollector/CreateActivityInfo.cs",
"chars": 416,
"preview": "using System.Diagnostics;\n\nnamespace BuildingBlocks.OpenTelemetryCollector;\n\npublic class CreateActivityInfo\n{\n publi"
},
{
"path": "src/BuildingBlocks/OpenTelemetryCollector/DiagnosticsProvider/CustomeDiagnosticsProvider.cs",
"chars": 4046,
"preview": "using System.Diagnostics;\nusing System.Diagnostics.Metrics;\nusing System.Reflection;\nusing Microsoft.Extensions.Options;"
},
{
"path": "src/BuildingBlocks/OpenTelemetryCollector/DiagnosticsProvider/IDiagnosticsProvider.cs",
"chars": 715,
"preview": "using System.Diagnostics;\nusing System.Diagnostics.Metrics;\n\nnamespace BuildingBlocks.OpenTelemetryCollector.Diagnostics"
},
{
"path": "src/BuildingBlocks/OpenTelemetryCollector/Extensions.cs",
"chars": 16850,
"preview": "using System.Diagnostics;\nusing System.Reflection;\nusing BuildingBlocks.OpenTelemetryCollector.CoreDiagnostics.Commands;"
},
{
"path": "src/BuildingBlocks/OpenTelemetryCollector/ObservabilityConstant.cs",
"chars": 538,
"preview": "namespace BuildingBlocks.OpenTelemetryCollector;\n\npublic static class ObservabilityConstant\n{\n public static string I"
},
{
"path": "src/BuildingBlocks/OpenTelemetryCollector/ObservabilityOptions.cs",
"chars": 1874,
"preview": "namespace BuildingBlocks.OpenTelemetryCollector;\n\npublic class ObservabilityOptions\n{\n public string InstrumentationN"
},
{
"path": "src/BuildingBlocks/OpenTelemetryCollector/TelemetryTags.cs",
"chars": 13129,
"preview": "namespace BuildingBlocks.OpenTelemetryCollector;\n\n/// <summary>\n/// Telemetry tags use for adding tags to activities as "
},
{
"path": "src/BuildingBlocks/PersistMessageProcessor/Extensions.cs",
"chars": 2402,
"preview": "using BuildingBlocks.Web;\nusing Humanizer;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.EntityFrameworkCore;\nusin"
},
{
"path": "src/BuildingBlocks/PersistMessageProcessor/IPersistMessageDbContext.cs",
"chars": 346,
"preview": "using Microsoft.EntityFrameworkCore;\n\nnamespace BuildingBlocks.PersistMessageProcessor;\n\npublic interface IPersistMessag"
},
{
"path": "src/BuildingBlocks/PersistMessageProcessor/IPersistMessageProcessor.cs",
"chars": 1909,
"preview": "using System.Linq.Expressions;\nusing BuildingBlocks.Core.Event;\n\nnamespace BuildingBlocks.PersistMessageProcessor;\n\n// R"
},
{
"path": "src/BuildingBlocks/PersistMessageProcessor/MessageDeliveryType.cs",
"chars": 159,
"preview": "namespace BuildingBlocks.PersistMessageProcessor;\n\n[Flags]\npublic enum MessageDeliveryType\n{\n Unknown = 0,\n Outbox"
},
{
"path": "src/BuildingBlocks/PersistMessageProcessor/MessageStatus.cs",
"chars": 135,
"preview": "namespace BuildingBlocks.PersistMessageProcessor;\n\npublic enum MessageStatus\n{\n Unknown = 0,\n InProgress = 1,\n "
},
{
"path": "src/BuildingBlocks/PersistMessageProcessor/PersistMessage.cs",
"chars": 1023,
"preview": "using BuildingBlocks.Core.Model;\nnamespace BuildingBlocks.PersistMessageProcessor;\n\n\npublic class PersistMessage : IVers"
},
{
"path": "src/BuildingBlocks/PersistMessageProcessor/PersistMessageBackgroundService.cs",
"chars": 1552,
"preview": "using Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Hosting;\nusing Microsoft.Extensions.Logging;\n"
},
{
"path": "src/BuildingBlocks/PersistMessageProcessor/PersistMessageDbContext.cs",
"chars": 3939,
"preview": "using BuildingBlocks.Core.Model;\nusing BuildingBlocks.EFCore;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.Exten"
},
{
"path": "src/BuildingBlocks/PersistMessageProcessor/PersistMessageOptions.cs",
"chars": 230,
"preview": "namespace BuildingBlocks.PersistMessageProcessor;\n\npublic class PersistMessageOptions\n{\n public int? Interval { get; "
},
{
"path": "src/BuildingBlocks/PersistMessageProcessor/PersistMessageProcessor.cs",
"chars": 8162,
"preview": "using System.Linq.Expressions;\nusing System.Text.Json;\nusing Ardalis.GuardClauses;\nusing BuildingBlocks.Core.Event;\nusin"
},
{
"path": "src/BuildingBlocks/Polly/Extensions.cs",
"chars": 757,
"preview": "using Microsoft.Extensions.Logging;\n\nnamespace BuildingBlocks.Polly;\n\nusing global::Polly;\nusing Exception = System.Exce"
},
{
"path": "src/BuildingBlocks/ProblemDetails/Extensions.cs",
"chars": 5460,
"preview": "namespace BuildingBlocks.ProblemDetails;\n\nusing Exception;\nusing Grpc.Core;\nusing Microsoft.AspNetCore.Builder;\nusing Mi"
},
{
"path": "src/BuildingBlocks/TestBase/TestBase.cs",
"chars": 24997,
"preview": "using System.Net;\nusing System.Security.Claims;\nusing BuildingBlocks.Core.Event;\nusing BuildingBlocks.Core.Model;\nusing "
},
{
"path": "src/BuildingBlocks/TestBase/TestContainers.cs",
"chars": 6404,
"preview": "using DotNet.Testcontainers.Builders;\n\nnamespace BuildingBlocks.TestBase;\n\nusing Testcontainers.EventStoreDb;\nusing Test"
},
{
"path": "src/BuildingBlocks/Utils/NoSynchronizationContextScope.cs",
"chars": 703,
"preview": "namespace BuildingBlocks.Utils;\n\npublic static class NoSynchronizationContextScope\n{\n public static Disposable Enter("
},
{
"path": "src/BuildingBlocks/Utils/ServiceLocator.cs",
"chars": 964,
"preview": "using Microsoft.Extensions.DependencyInjection;\n\nnamespace BuildingBlocks.Utils;\n\n//ref: https://dotnetcoretutorials.com"
},
{
"path": "src/BuildingBlocks/Utils/TypeProvider.cs",
"chars": 3043,
"preview": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing Microsoft.AspNetCore.Mvc.ApplicationParts;\n\nnamesp"
},
{
"path": "src/BuildingBlocks/Validation/Extensions.cs",
"chars": 668,
"preview": "using BuildingBlocks.Exception;\nusing FluentValidation;\n\nnamespace BuildingBlocks.Validation\n{\n public static class E"
},
{
"path": "src/BuildingBlocks/Validation/ValidationBehavior.cs",
"chars": 883,
"preview": "using FluentValidation;\nusing MediatR;\nusing Microsoft.Extensions.DependencyInjection;\n\nnamespace BuildingBlocks.Validat"
},
{
"path": "src/BuildingBlocks/Validation/ValidationError.cs",
"chars": 332,
"preview": "namespace BuildingBlocks.Validation\n{\n public class ValidationError\n {\n public string Field { get; }\n\n "
},
{
"path": "src/BuildingBlocks/Validation/ValidationResultModel.cs",
"chars": 539,
"preview": "using System.Collections.Generic;\nusing System.Linq;\nusing System.Net;\nusing System.Text.Json;\nusing FluentValidation.Re"
}
]
// ... and 355 more files (download for full content)
About this extraction
This page contains the full source code of the meysamhadeli/booking-microservices-sample GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 555 files (1.5 MB), approximately 512.0k tokens, and a symbol index with 1317 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.