From 4998ab96cac35856726690b539c3433e0fa00beb Mon Sep 17 00:00:00 2001 From: Victor Chang Date: Thu, 10 Nov 2022 21:46:10 -0800 Subject: [PATCH 01/14] Refactor DB repositories for EF Signed-off-by: Victor Chang --- .../Api/IInformaticsGatewayRepository.cs | 45 --- src/Database/Api/Log.9000.cs | 32 ++ ...loy.InformaticsGateway.Database.Api.csproj | 4 +- ...IDestinationApplicationEntityRepository.cs | 36 ++ .../IInferenceRequestRepository.cs | 21 +- .../IMonaiApplicationEntityRepository.cs | 36 ++ .../Api/Repositories/IPayloadRepository.cs | 38 +++ .../ISourceApplicationEntityRepository.cs | 36 ++ .../IStorageMetadataRepository.cs} | 22 +- src/Database/DatabaseManager.cs | 10 +- ...stinationApplicationEntityConfiguration.cs | 2 +- .../InferenceRequestConfiguration.cs | 2 +- .../MonaiApplicationEntityConfiguration.cs | 2 +- .../Configuration/PayloadConfiguration.cs | 2 +- .../EntityFramework/Configuration/SR.cs | 2 +- .../SourceApplicationEntityConfiguration.cs | 2 +- ...orageMetadataWrapperEntityConfiguration.cs | 4 +- .../InformaticsGatewayContext.cs | 2 +- .../InformaticsGatewayContextFactory.cs | 3 +- .../InformaticsGatewayRepository.cs | 137 -------- .../EntityFramework/Logging/Log.9100.cs | 50 +++ .../DestinationApplicationEntityRepository.cs | 135 ++++++++ .../InferenceRequestRepository.cs | 220 ++++++++++++ .../MonaiApplicationEntityRepository.cs | 135 ++++++++ .../Repositories/PayloadRepository.cs | 150 ++++++++ .../SourceApplicationEntityRepository.cs | 135 ++++++++ .../Repositories}/StorageMetadataWrapper.cs | 17 +- .../StorageMetadataWrapperRepository.cs | 200 +++++++++++ ...tinationApplicationEntityRepositoryTest.cs | 159 +++++++++ .../Test/InMemoryDatabaseFixture.cs | 107 ++++++ .../Test/InferenceRequestRepositoryTest.cs | 255 ++++++++++++++ ...teway.Database.EntityFramework.Test.csproj | 30 ++ .../MonaiApplicationEntityRepositoryTest.cs | 163 +++++++++ .../SourceApplicationEntityRepositoryTest.cs | 155 +++++++++ .../Test/SqliteDatabaseFixture.cs | 112 ++++++ .../StorageMetadataWrapperRepositoryTest.cs | 254 ++++++++++++++ .../Test/StorageMetadataWrapperTest.cs | 4 +- src/Database/EntityFramework/Test/Usings.cs | 1 + .../Common/PayloadExtensions.cs | 101 ------ .../Log.2000.InferenceRequestRepository.cs | 22 -- .../Log.2100.StorageInfoWrapperRepository.cs | 33 -- .../Logging/Log.3000.PayloadAssembler.cs | 5 +- src/InformaticsGateway/Program.cs | 4 +- .../InferenceRequestRepository.cs | 182 ---------- .../StorageMetadataWrapperRepository.cs | 180 ---------- .../Connectors/DataRetrievalService.cs | 101 +++--- .../Services/Connectors/PayloadAssembler.cs | 37 +- .../Services/Connectors/PayloadExtensions.cs | 2 +- .../Connectors/PayloadMoveActionHandler.cs | 18 +- .../PayloadNotificationActionHandler.cs | 31 +- .../Connectors/PayloadNotificationService.cs | 24 +- .../Services/Export/DicomWebExportService.cs | 12 +- .../Services/Export/ScuExportService.cs | 10 +- .../Http/DestinationAeTitleController.cs | 39 +-- .../Services/Http/InferenceController.cs | 22 +- .../Services/Http/MonaiAeTitleController.cs | 28 +- .../Services/Http/SourceAeTitleController.cs | 37 +- .../Services/Scp/ApplicationEntityManager.cs | 38 ++- .../Services/Scp/IApplicationEntityManager.cs | 4 +- .../Services/Scp/ScpServiceInternal.cs | 32 +- .../InferenceRequestRepositoryTest.cs | 247 -------------- .../InformaticsGatewayRepositoryTest.cs | 243 ------------- .../StorageInfoWrapperRepositoryTest.cs | 319 ------------------ .../Connectors/DataRetrievalServiceTest.cs | 43 ++- .../Connectors/PayloadAssemblerTest.cs | 57 +--- .../PayloadMoveActionHandlerTest.cs | 8 +- .../PayloadNotificationActionHandlerTest.cs | 12 +- .../PayloadNotificationServiceTest.cs | 161 +-------- .../Export/DicomWebExportServiceTest.cs | 10 +- .../Services/Export/ScuExportServiceTest.cs | 22 +- .../Http/DestinationAeTitleControllerTest.cs | 83 +++-- .../Services/Http/InferenceControllerTest.cs | 26 +- .../Http/MonaiAeTitleControllerTest.cs | 53 ++- .../Http/SourceAeTitleControllerTest.cs | 72 ++-- .../Scp/ApplicationEntityManagerTest.cs | 82 ++--- .../Test/Services/Scp/ScpServiceTest.cs | 40 +-- src/Monai.Deploy.InformaticsGateway.sln | 20 ++ ...InformaticsGateway.Integration.Test.csproj | 11 +- .../ExportServicesStepDefinitions.cs | 3 +- .../HealthLevel7Definitions.cs | 2 +- tests/Integration.Test/appsettings.json | 8 +- tests/Integration.Test/nlog.config | 12 +- 82 files changed, 2983 insertions(+), 2233 deletions(-) delete mode 100644 src/Database/Api/IInformaticsGatewayRepository.cs create mode 100644 src/Database/Api/Log.9000.cs create mode 100644 src/Database/Api/Repositories/IDestinationApplicationEntityRepository.cs rename src/{InformaticsGateway => Database/Api}/Repositories/IInferenceRequestRepository.cs (74%) create mode 100644 src/Database/Api/Repositories/IMonaiApplicationEntityRepository.cs create mode 100644 src/Database/Api/Repositories/IPayloadRepository.cs create mode 100644 src/Database/Api/Repositories/ISourceApplicationEntityRepository.cs rename src/{InformaticsGateway/Repositories/IStorageMetadataWrapperRepository.cs => Database/Api/Repositories/IStorageMetadataRepository.cs} (71%) delete mode 100644 src/Database/EntityFramework/InformaticsGatewayRepository.cs create mode 100644 src/Database/EntityFramework/Logging/Log.9100.cs create mode 100644 src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs create mode 100644 src/Database/EntityFramework/Repositories/InferenceRequestRepository.cs create mode 100644 src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs create mode 100644 src/Database/EntityFramework/Repositories/PayloadRepository.cs create mode 100644 src/Database/EntityFramework/Repositories/SourceApplicationEntityRepository.cs rename src/Database/{Api => EntityFramework/Repositories}/StorageMetadataWrapper.cs (74%) create mode 100644 src/Database/EntityFramework/Repositories/StorageMetadataWrapperRepository.cs create mode 100644 src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs create mode 100644 src/Database/EntityFramework/Test/InMemoryDatabaseFixture.cs create mode 100644 src/Database/EntityFramework/Test/InferenceRequestRepositoryTest.cs create mode 100644 src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj create mode 100644 src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs create mode 100644 src/Database/EntityFramework/Test/SourceApplicationEntityRepositoryTest.cs create mode 100644 src/Database/EntityFramework/Test/SqliteDatabaseFixture.cs create mode 100644 src/Database/EntityFramework/Test/StorageMetadataWrapperRepositoryTest.cs rename src/Database/{Api => EntityFramework}/Test/StorageMetadataWrapperTest.cs (97%) create mode 100644 src/Database/EntityFramework/Test/Usings.cs delete mode 100644 src/InformaticsGateway/Common/PayloadExtensions.cs delete mode 100644 src/InformaticsGateway/Logging/Log.2100.StorageInfoWrapperRepository.cs delete mode 100644 src/InformaticsGateway/Repositories/InferenceRequestRepository.cs delete mode 100644 src/InformaticsGateway/Repositories/StorageMetadataWrapperRepository.cs delete mode 100644 src/InformaticsGateway/Test/Repositories/InferenceRequestRepositoryTest.cs delete mode 100644 src/InformaticsGateway/Test/Repositories/InformaticsGatewayRepositoryTest.cs delete mode 100644 src/InformaticsGateway/Test/Repositories/StorageInfoWrapperRepositoryTest.cs diff --git a/src/Database/Api/IInformaticsGatewayRepository.cs b/src/Database/Api/IInformaticsGatewayRepository.cs deleted file mode 100644 index ec9072dc5..000000000 --- a/src/Database/Api/IInformaticsGatewayRepository.cs +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2021-2022 MONAI Consortium - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -using Microsoft.EntityFrameworkCore.ChangeTracking; - -namespace Monai.Deploy.InformaticsGateway.Database.Api -{ - public interface IInformaticsGatewayRepository where T : class - { - IQueryable AsQueryable(); - - Task FindAsync(params object[] keyValues); - - Task SaveChangesAsync(CancellationToken cancellationToken = default); - - Task> ToListAsync(); - - EntityEntry Update(T entity); - - EntityEntry Remove(T entity); - - void RemoveRange(params T[] entities); - - Task> AddAsync(T item, CancellationToken cancellationToken = default); - - T FirstOrDefault(Func p); - - void Detach(T job); - - bool Any(Func p); - } -} diff --git a/src/Database/Api/Log.9000.cs b/src/Database/Api/Log.9000.cs new file mode 100644 index 000000000..2f6905e6f --- /dev/null +++ b/src/Database/Api/Log.9000.cs @@ -0,0 +1,32 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Microsoft.Extensions.Logging; + +namespace Monai.Deploy.InformaticsGateway.Database.Api +{ + public static partial class Log + { + [LoggerMessage(EventId = 9000, Level = LogLevel.Error, Message = "Error adding item {type} to the database.")] + public static partial void ErrorAddItem(this ILogger logger, string @type, Exception ex); + + [LoggerMessage(EventId = 9001, Level = LogLevel.Error, Message = "Error updating item {type} in the database.")] + public static partial void ErrorUpdateItem(this ILogger logger, string @type, Exception ex); + + [LoggerMessage(EventId = 9002, Level = LogLevel.Error, Message = "Error deleting item {type} from the database.")] + public static partial void ErrorDeleteItem(this ILogger logger, string @type, Exception ex); + } +} diff --git a/src/Database/Api/Monai.Deploy.InformaticsGateway.Database.Api.csproj b/src/Database/Api/Monai.Deploy.InformaticsGateway.Database.Api.csproj index dfe506948..9fb905da1 100644 --- a/src/Database/Api/Monai.Deploy.InformaticsGateway.Database.Api.csproj +++ b/src/Database/Api/Monai.Deploy.InformaticsGateway.Database.Api.csproj @@ -17,7 +17,7 @@ - Monai.Deploy.InformaticsGateway.Database.Repositories + Monai.Deploy.InformaticsGateway.Database.Api net6.0 enable enable @@ -31,10 +31,12 @@ + + diff --git a/src/Database/Api/Repositories/IDestinationApplicationEntityRepository.cs b/src/Database/Api/Repositories/IDestinationApplicationEntityRepository.cs new file mode 100644 index 000000000..ffc58fa17 --- /dev/null +++ b/src/Database/Api/Repositories/IDestinationApplicationEntityRepository.cs @@ -0,0 +1,36 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Linq.Expressions; +using Monai.Deploy.InformaticsGateway.Api; + +namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories +{ + public interface IDestinationApplicationEntityRepository + { + Task> ToListAsync(CancellationToken cancellationToken = default); + + Task FindByNameAsync(string name, CancellationToken cancellationToken = default); + + Task AddAsync(DestinationApplicationEntity item, CancellationToken cancellationToken = default); + + Task UpdateAsync(DestinationApplicationEntity entity, CancellationToken cancellationToken = default); + + Task RemoveAsync(DestinationApplicationEntity entity, CancellationToken cancellationToken = default); + + Task ContainsAsync(Expression> predicate, CancellationToken cancellationToken = default); + } +} diff --git a/src/InformaticsGateway/Repositories/IInferenceRequestRepository.cs b/src/Database/Api/Repositories/IInferenceRequestRepository.cs similarity index 74% rename from src/InformaticsGateway/Repositories/IInferenceRequestRepository.cs rename to src/Database/Api/Repositories/IInferenceRequestRepository.cs index 02f3fe67d..b20a56278 100644 --- a/src/InformaticsGateway/Repositories/IInferenceRequestRepository.cs +++ b/src/Database/Api/Repositories/IInferenceRequestRepository.cs @@ -2,7 +2,7 @@ * Copyright 2021-2022 MONAI Consortium * Copyright 2019-2021 NVIDIA Corporation * - * Licensed under the Apache License, Version 2.0 (the "License"); + * Licensed under the Apache License, Version 2.0 (the "License", CancellationToken cancellationToken = default); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * @@ -15,12 +15,9 @@ * limitations under the License. */ -using System; -using System.Threading; -using System.Threading.Tasks; using Monai.Deploy.InformaticsGateway.Api.Rest; -namespace Monai.Deploy.InformaticsGateway.Repositories +namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories { /// /// Interface for access stored inference requests. @@ -31,7 +28,7 @@ public interface IInferenceRequestRepository /// Adds new inference request to the repository. /// /// The inference request to be added. - Task Add(InferenceRequest inferenceRequest); + Task AddAsync(InferenceRequest inferenceRequest, CancellationToken cancellationToken = default); /// /// Updates an inference request's status. @@ -40,7 +37,7 @@ public interface IInferenceRequestRepository /// /// The inference request to be updated. /// Current status of the inference request. - Task Update(InferenceRequest inferenceRequest, InferenceRequestStatus status); + Task UpdateAsync(InferenceRequest inferenceRequest, InferenceRequestStatus status, CancellationToken cancellationToken = default); /// /// Take returns the next pending inference request for data retrieval. @@ -48,31 +45,31 @@ public interface IInferenceRequestRepository /// /// cancellation token used to cancel the action. /// - Task Take(CancellationToken cancellationToken); + Task TakeAsync(CancellationToken cancellationToken = default); /// /// Get returns the specified inference request. /// /// The transactionId of the request. - InferenceRequest GetInferenceRequest(string transactionId); + Task GetInferenceRequestAsync(string transactionId, CancellationToken cancellationToken = default); /// /// Get returns the specified inference request. /// /// The internal ID of the request. - Task GetInferenceRequest(Guid inferenceRequestId); + Task GetInferenceRequestAsync(Guid inferenceRequestId, CancellationToken cancellationToken = default); /// /// Exists checks whether if an existing request with the same transaction ID exists. /// /// /// - bool Exists(string transactionId); + Task ExistsAsync(string transactionId, CancellationToken cancellationToken = default); /// /// GetStatus returns the status of the specified inference request. /// /// The transactionId from the original request. - Task GetStatus(string transactionId); + Task GetStatusAsync(string transactionId, CancellationToken cancellationToken = default); } } diff --git a/src/Database/Api/Repositories/IMonaiApplicationEntityRepository.cs b/src/Database/Api/Repositories/IMonaiApplicationEntityRepository.cs new file mode 100644 index 000000000..1b803385e --- /dev/null +++ b/src/Database/Api/Repositories/IMonaiApplicationEntityRepository.cs @@ -0,0 +1,36 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Linq.Expressions; +using Monai.Deploy.InformaticsGateway.Api; + +namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories +{ + public interface IMonaiApplicationEntityRepository + { + Task> ToListAsync(CancellationToken cancellationToken = default); + + Task FindByNameAsync(string name, CancellationToken cancellationToken = default); + + Task AddAsync(MonaiApplicationEntity item, CancellationToken cancellationToken = default); + + Task UpdateAsync(MonaiApplicationEntity entity, CancellationToken cancellationToken = default); + + Task RemoveAsync(MonaiApplicationEntity entity, CancellationToken cancellationToken = default); + + Task ContainsAsync(Expression> predicate, CancellationToken cancellationToken = default); + } +} diff --git a/src/Database/Api/Repositories/IPayloadRepository.cs b/src/Database/Api/Repositories/IPayloadRepository.cs new file mode 100644 index 000000000..5449af8da --- /dev/null +++ b/src/Database/Api/Repositories/IPayloadRepository.cs @@ -0,0 +1,38 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Linq.Expressions; +using Monai.Deploy.InformaticsGateway.Api.Storage; + +namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories +{ + public interface IPayloadRepository + { + Task> ToListAsync(CancellationToken cancellationToken = default); + + Task AddAsync(Payload item, CancellationToken cancellationToken = default); + + Task UpdateAsync(Payload entity, CancellationToken cancellationToken = default); + + Task RemoveAsync(Payload entity, CancellationToken cancellationToken = default); + + Task ContainsAsync(Expression> predicate, CancellationToken cancellationToken = default); + + Task RemovePendingPayloadsAsync(CancellationToken cancellationToken = default); + + Task> GetPayloadsInStateAsync(CancellationToken cancellationToken = default, params Payload.PayloadState[] states); + } +} diff --git a/src/Database/Api/Repositories/ISourceApplicationEntityRepository.cs b/src/Database/Api/Repositories/ISourceApplicationEntityRepository.cs new file mode 100644 index 000000000..6826ca639 --- /dev/null +++ b/src/Database/Api/Repositories/ISourceApplicationEntityRepository.cs @@ -0,0 +1,36 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Linq.Expressions; +using Monai.Deploy.InformaticsGateway.Api; + +namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories +{ + public interface ISourceApplicationEntityRepository + { + Task> ToListAsync(CancellationToken cancellationToken = default); + + Task FindByNameAsync(string name, CancellationToken cancellationToken = default); + + Task AddAsync(SourceApplicationEntity item, CancellationToken cancellationToken = default); + + Task UpdateAsync(SourceApplicationEntity entity, CancellationToken cancellationToken = default); + + Task RemoveAsync(SourceApplicationEntity entity, CancellationToken cancellationToken = default); + + Task ContainsAsync(Expression> predicate, CancellationToken cancellationToken = default); + } +} diff --git a/src/InformaticsGateway/Repositories/IStorageMetadataWrapperRepository.cs b/src/Database/Api/Repositories/IStorageMetadataRepository.cs similarity index 71% rename from src/InformaticsGateway/Repositories/IStorageMetadataWrapperRepository.cs rename to src/Database/Api/Repositories/IStorageMetadataRepository.cs index 82405c09c..04870ac1a 100644 --- a/src/InformaticsGateway/Repositories/IStorageMetadataWrapperRepository.cs +++ b/src/Database/Api/Repositories/IStorageMetadataRepository.cs @@ -2,7 +2,7 @@ * Copyright 2021-2022 MONAI Consortium * Copyright 2019-2021 NVIDIA Corporation * - * Licensed under the Apache License, Version 2.0 (the "License"); + * Licensed under the Apache License, Version 2.0 (the "License", CancellationToken cancellationToken = default); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * @@ -15,58 +15,56 @@ * limitations under the License. */ -using System.Collections.Generic; -using System.Threading.Tasks; using Monai.Deploy.InformaticsGateway.Api.Storage; -namespace Monai.Deploy.InformaticsGateway.Repositories +namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories { /// /// Interface for accessing storage metadata objects. /// - public interface IStorageMetadataWrapperRepository + public interface IStorageMetadataRepository { /// /// Adds new storage metadata object to the repository. /// /// The storage metadata object to be added. - Task AddAsync(FileStorageMetadata metadata); + Task AddAsync(FileStorageMetadata metadata, CancellationToken cancellationToken = default); /// /// Updates an storage metadata object's status. /// /// The storage metadata object to be updated. - Task UpdateAsync(FileStorageMetadata metadata); + Task UpdateAsync(FileStorageMetadata metadata, CancellationToken cancellationToken = default); /// /// Adds or updates an storage metadata object's status. /// /// The storage metadata object to be added/updated. - Task AddOrUpdateAsync(FileStorageMetadata metadata); + Task AddOrUpdateAsync(FileStorageMetadata metadata, CancellationToken cancellationToken = default); /// /// Gets all storage metadata objects associated with the correlation ID. /// /// Correlation ID - IList GetFileStorageMetdadata(string correlationId); + Task> GetFileStorageMetdadataAsync(string correlationId, CancellationToken cancellationToken = default); /// /// Gets the specified storage metadata object. /// /// Correlation ID /// The unique identity representing the object. - FileStorageMetadata GetFileStorageMetdadata(string correlationId, string identity); + Task GetFileStorageMetdadataAsync(string correlationId, string identity, CancellationToken cancellationToken = default); /// /// Deletes the specified storage metadata object. /// /// Correlation ID /// The unique identity representing the object. - Task DeleteAsync(string correlationId, string identity); + Task DeleteAsync(string correlationId, string identity, CancellationToken cancellationToken = default); /// /// Deletes all pending storage metadata objects. /// - Task DeletePendingUploadsAsync(); + Task DeletePendingUploadsAsync(CancellationToken cancellationToken = default); } } diff --git a/src/Database/DatabaseManager.cs b/src/Database/DatabaseManager.cs index 7b4a1a136..fea2d8694 100644 --- a/src/Database/DatabaseManager.cs +++ b/src/Database/DatabaseManager.cs @@ -19,8 +19,9 @@ using Microsoft.Extensions.DependencyInjection; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Database.EntityFramework; -using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configurations; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration; namespace Monai.Deploy.InformaticsGateway.Database { @@ -39,7 +40,12 @@ public static IServiceCollection ConfigureDatabase(this IServiceCollection servi { case "Sqlite": services.AddScoped(); - services.AddScoped(typeof(IInformaticsGatewayRepository<>), typeof(InformaticsGatewayRepository<>)); + services.AddScoped(typeof(IDestinationApplicationEntityRepository), typeof(EntityFramework.Repositories.DestinationApplicationEntityRepository)); + services.AddScoped(typeof(IInferenceRequestRepository), typeof(EntityFramework.Repositories.InferenceRequestRepository)); + services.AddScoped(typeof(IMonaiApplicationEntityRepository), typeof(EntityFramework.Repositories.MonaiApplicationEntityRepository)); + services.AddScoped(typeof(ISourceApplicationEntityRepository), typeof(EntityFramework.Repositories.SourceApplicationEntityRepository)); + services.AddScoped(typeof(IStorageMetadataRepository), typeof(EntityFramework.Repositories.StorageMetadataWrapperRepository)); + services.AddScoped(typeof(IPayloadRepository), typeof(EntityFramework.Repositories.PayloadRepository)); services.AddDbContext( options => options.UseSqlite(connectionStringConfigurationSection[SR.DatabaseConnectionStringKey]), ServiceLifetime.Transient); diff --git a/src/Database/EntityFramework/Configuration/DestinationApplicationEntityConfiguration.cs b/src/Database/EntityFramework/Configuration/DestinationApplicationEntityConfiguration.cs index 845d4b96c..296095528 100644 --- a/src/Database/EntityFramework/Configuration/DestinationApplicationEntityConfiguration.cs +++ b/src/Database/EntityFramework/Configuration/DestinationApplicationEntityConfiguration.cs @@ -19,7 +19,7 @@ using Microsoft.EntityFrameworkCore.Metadata.Builders; using Monai.Deploy.InformaticsGateway.Api; -namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configurations +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration { internal class DestinationApplicationEntityConfiguration : IEntityTypeConfiguration { diff --git a/src/Database/EntityFramework/Configuration/InferenceRequestConfiguration.cs b/src/Database/EntityFramework/Configuration/InferenceRequestConfiguration.cs index 70de97896..8a876e8a3 100644 --- a/src/Database/EntityFramework/Configuration/InferenceRequestConfiguration.cs +++ b/src/Database/EntityFramework/Configuration/InferenceRequestConfiguration.cs @@ -25,7 +25,7 @@ using Microsoft.EntityFrameworkCore.Metadata.Builders; using Monai.Deploy.InformaticsGateway.Api.Rest; -namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configurations +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration { internal class InferenceRequestConfiguration : IEntityTypeConfiguration { diff --git a/src/Database/EntityFramework/Configuration/MonaiApplicationEntityConfiguration.cs b/src/Database/EntityFramework/Configuration/MonaiApplicationEntityConfiguration.cs index 4e79c3f6b..17d807911 100644 --- a/src/Database/EntityFramework/Configuration/MonaiApplicationEntityConfiguration.cs +++ b/src/Database/EntityFramework/Configuration/MonaiApplicationEntityConfiguration.cs @@ -25,7 +25,7 @@ using Microsoft.EntityFrameworkCore.Metadata.Builders; using Monai.Deploy.InformaticsGateway.Api; -namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configurations +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration { internal class MonaiApplicationEntityConfiguration : IEntityTypeConfiguration { diff --git a/src/Database/EntityFramework/Configuration/PayloadConfiguration.cs b/src/Database/EntityFramework/Configuration/PayloadConfiguration.cs index b9d635418..129f1ad9d 100644 --- a/src/Database/EntityFramework/Configuration/PayloadConfiguration.cs +++ b/src/Database/EntityFramework/Configuration/PayloadConfiguration.cs @@ -24,7 +24,7 @@ using Microsoft.EntityFrameworkCore.Metadata.Builders; using Monai.Deploy.InformaticsGateway.Api.Storage; -namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configurations +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration { internal class PayloadConfiguration : IEntityTypeConfiguration { diff --git a/src/Database/EntityFramework/Configuration/SR.cs b/src/Database/EntityFramework/Configuration/SR.cs index 6bbab8ff2..ebcae9fc9 100644 --- a/src/Database/EntityFramework/Configuration/SR.cs +++ b/src/Database/EntityFramework/Configuration/SR.cs @@ -15,7 +15,7 @@ * limitations under the License. */ -namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configurations +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration { public static class SR { diff --git a/src/Database/EntityFramework/Configuration/SourceApplicationEntityConfiguration.cs b/src/Database/EntityFramework/Configuration/SourceApplicationEntityConfiguration.cs index 2fc81f657..73d9d81e3 100644 --- a/src/Database/EntityFramework/Configuration/SourceApplicationEntityConfiguration.cs +++ b/src/Database/EntityFramework/Configuration/SourceApplicationEntityConfiguration.cs @@ -18,7 +18,7 @@ using Microsoft.EntityFrameworkCore; using Monai.Deploy.InformaticsGateway.Api; -namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configurations +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration { internal class SourceApplicationEntityConfiguration : IEntityTypeConfiguration { diff --git a/src/Database/EntityFramework/Configuration/StorageMetadataWrapperEntityConfiguration.cs b/src/Database/EntityFramework/Configuration/StorageMetadataWrapperEntityConfiguration.cs index 3991abdac..1e6dbcf07 100644 --- a/src/Database/EntityFramework/Configuration/StorageMetadataWrapperEntityConfiguration.cs +++ b/src/Database/EntityFramework/Configuration/StorageMetadataWrapperEntityConfiguration.cs @@ -17,9 +17,9 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; -namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configurations +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration { internal class StorageMetadataWrapperEntityConfiguration : IEntityTypeConfiguration { diff --git a/src/Database/EntityFramework/InformaticsGatewayContext.cs b/src/Database/EntityFramework/InformaticsGatewayContext.cs index 91b0be743..34051d623 100644 --- a/src/Database/EntityFramework/InformaticsGatewayContext.cs +++ b/src/Database/EntityFramework/InformaticsGatewayContext.cs @@ -18,7 +18,7 @@ using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.Extensions.Logging; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configurations; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration; namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework { diff --git a/src/Database/EntityFramework/InformaticsGatewayContextFactory.cs b/src/Database/EntityFramework/InformaticsGatewayContextFactory.cs index 9bbf82a08..f623c0c2c 100644 --- a/src/Database/EntityFramework/InformaticsGatewayContextFactory.cs +++ b/src/Database/EntityFramework/InformaticsGatewayContextFactory.cs @@ -18,6 +18,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using Microsoft.Extensions.Configuration; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration; namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework { @@ -35,7 +36,7 @@ public InformaticsGatewayContext CreateDbContext(string[] args) var builder = new DbContextOptionsBuilder(); - var connectionString = configuration.GetConnectionString(Configurations.SR.DatabaseConnectionStringKey); + var connectionString = configuration.GetConnectionString(SR.DatabaseConnectionStringKey); builder.UseSqlite(connectionString); return new InformaticsGatewayContext(builder.Options); diff --git a/src/Database/EntityFramework/InformaticsGatewayRepository.cs b/src/Database/EntityFramework/InformaticsGatewayRepository.cs deleted file mode 100644 index 68feb8f74..000000000 --- a/src/Database/EntityFramework/InformaticsGatewayRepository.cs +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright 2021-2022 MONAI Consortium - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -using Ardalis.GuardClauses; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.ChangeTracking; -using Microsoft.Extensions.DependencyInjection; -using Monai.Deploy.InformaticsGateway.Database.Api; - -namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework -{ - public class InformaticsGatewayRepository : IDisposable, IInformaticsGatewayRepository where T : class - { - private readonly IServiceScope _scope; - private readonly InformaticsGatewayContext _informaticsGatewayContext; - private bool _disposedValue; - - public InformaticsGatewayRepository(IServiceScopeFactory serviceScopeFactory) - { - if (serviceScopeFactory is null) - { - throw new ArgumentNullException(nameof(serviceScopeFactory)); - } - - _scope = serviceScopeFactory.CreateScope(); - _informaticsGatewayContext = _scope.ServiceProvider.GetRequiredService(); - } - - public IQueryable AsQueryable() - { - return _informaticsGatewayContext.Set().AsQueryable(); - } - - public async Task> ToListAsync() - { - return await _informaticsGatewayContext.Set().ToListAsync().ConfigureAwait(false); - } - - public async Task FindAsync(params object[] keyValues) - { - Guard.Against.Null(keyValues, nameof(keyValues)); - - return await _informaticsGatewayContext.FindAsync(keyValues).ConfigureAwait(false); - } - - public EntityEntry Update(T entity) - { - Guard.Against.Null(entity, nameof(entity)); - - return _informaticsGatewayContext.Update(entity); - } - - public EntityEntry Remove(T entity) - { - Guard.Against.Null(entity, nameof(entity)); - return _informaticsGatewayContext.Remove(entity); - } - - public void RemoveRange(params T[] entities) - { - _informaticsGatewayContext.RemoveRange(entities); - } - - public async Task SaveChangesAsync(CancellationToken cancellationToken = default) - { - return await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); - } - - public async Task> AddAsync(T item, CancellationToken cancellationToken = default) - { - Guard.Against.Null(item, nameof(item)); - - return await _informaticsGatewayContext.AddAsync(item, cancellationToken).ConfigureAwait(false); - } - -#pragma warning disable S927 // Parameter names should match base declaration and other partial definitions - - public T FirstOrDefault(Func func) -#pragma warning restore S927 // Parameter names should match base declaration and other partial definitions - { - Guard.Against.Null(func, nameof(func)); - - return _informaticsGatewayContext.Set().FirstOrDefault(func); - } - -#pragma warning disable S927 // Parameter names should match base declaration and other partial definitions - - public void Detach(T item) -#pragma warning restore S927 // Parameter names should match base declaration and other partial definitions - { - Guard.Against.Null(item, nameof(item)); - _informaticsGatewayContext.Entry(item).State = EntityState.Detached; - } - -#pragma warning disable S927 // Parameter names should match base declaration and other partial definitions - - public bool Any(Func func) -#pragma warning restore S927 // Parameter names should match base declaration and other partial definitions - { - Guard.Against.Null(func, nameof(func)); - return _informaticsGatewayContext.Set().Any(func); - } - - protected virtual void Dispose(bool disposing) - { - if (!_disposedValue) - { - if (disposing) - { - _scope.Dispose(); - } - - _disposedValue = true; - } - } - - public void Dispose() - { - // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method - Dispose(disposing: true); - GC.SuppressFinalize(this); - } - } -} diff --git a/src/Database/EntityFramework/Logging/Log.9100.cs b/src/Database/EntityFramework/Logging/Log.9100.cs new file mode 100644 index 000000000..2fd25943a --- /dev/null +++ b/src/Database/EntityFramework/Logging/Log.9100.cs @@ -0,0 +1,50 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Microsoft.Extensions.Logging; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Logging +{ + public static partial class Log + { + [LoggerMessage(EventId = 9100, Level = LogLevel.Error, Message = "Error performing database action. Waiting {timespan} before next retry. Retry attempt {retryCount}...")] + public static partial void DatabaseErrorRetry(this ILogger logger, TimeSpan timespan, int retryCount, Exception ex); + + [LoggerMessage(EventId = 9101, Level = LogLevel.Debug, Message = "Storage metadata saved to the database.")] + public static partial void StorageMetadataSaved(this ILogger logger); + + [LoggerMessage(EventId = 9102, Level = LogLevel.Error, Message = "Error querying pending inference request.")] + public static partial void ErrorQueryingForPendingInferenceRequest(this ILogger logger, Exception ex); + + [LoggerMessage(EventId = 9103, Level = LogLevel.Debug, Message = "Inference request saved.")] + public static partial void InferenceRequestSaved(this ILogger logger); + + [LoggerMessage(EventId = 9104, Level = LogLevel.Warning, Message = "Exceeded maximum retries.")] + public static partial void InferenceRequestUpdateExceededMaximumRetries(this ILogger logger); + + [LoggerMessage(EventId = 9105, Level = LogLevel.Information, Message = "Failed to process inference request, will retry later.")] + public static partial void InferenceRequestUpdateRetryLater(this ILogger logger); + + [LoggerMessage(EventId = 9106, Level = LogLevel.Debug, Message = "Updating request {transactionId} to InProgress.")] + public static partial void InferenceRequestSetToInProgress(this ILogger logger, string transactionId); + + [LoggerMessage(EventId = 9107, Level = LogLevel.Debug, Message = "Updating inference request.")] + public static partial void InferenceRequestUpdateState(this ILogger logger); + + [LoggerMessage(EventId = 9108, Level = LogLevel.Information, Message = "Inference request updated.")] + public static partial void InferenceRequestUpdated(this ILogger logger); + } +} diff --git a/src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs b/src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs new file mode 100644 index 000000000..78ee166b1 --- /dev/null +++ b/src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs @@ -0,0 +1,135 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Linq.Expressions; +using Ardalis.GuardClauses; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Logging; +using Polly; +using Polly.Retry; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories +{ + public class DestinationApplicationEntityRepository : IDestinationApplicationEntityRepository, IDisposable + { + private readonly ILogger _logger; + private readonly IServiceScope _scope; + private readonly InformaticsGatewayContext _informaticsGatewayContext; + private readonly AsyncRetryPolicy _retryPolicy; + private readonly DbSet _dataset; + private bool _disposedValue; + + public DestinationApplicationEntityRepository( + IServiceScopeFactory serviceScopeFactory, + ILogger logger, + IOptions options) + { + Guard.Against.Null(serviceScopeFactory); + Guard.Against.Null(options); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + _scope = serviceScopeFactory.CreateScope(); + _informaticsGatewayContext = _scope.ServiceProvider.GetRequiredService(); + _retryPolicy = Policy.Handle().WaitAndRetryAsync( + options.Value.Database.Retries.RetryDelays, + (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + _dataset = _informaticsGatewayContext.Set(); + } + + public async Task AddAsync(DestinationApplicationEntity item, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _dataset.AddAsync(item, cancellationToken).ConfigureAwait(false); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + }).ConfigureAwait(false); + } + + public async Task ContainsAsync(Expression> predicate, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var func = predicate.Compile(); + return await Task.FromResult(_dataset.Any(func)).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task FindByNameAsync(string name, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return await _dataset.FirstOrDefaultAsync(p => p.Name.Equals(name), cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task RemoveAsync(DestinationApplicationEntity entity, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var result = _dataset.Remove(entity); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + }).ConfigureAwait(false); + } + + public async Task> ToListAsync(CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return await _dataset.ToListAsync(cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task UpdateAsync(DestinationApplicationEntity entity, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var result = _dataset.Update(entity); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + }).ConfigureAwait(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _informaticsGatewayContext.Dispose(); + _scope.Dispose(); + } + + _disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} diff --git a/src/Database/EntityFramework/Repositories/InferenceRequestRepository.cs b/src/Database/EntityFramework/Repositories/InferenceRequestRepository.cs new file mode 100644 index 000000000..890a8ee97 --- /dev/null +++ b/src/Database/EntityFramework/Repositories/InferenceRequestRepository.cs @@ -0,0 +1,220 @@ +/* + * Copyright 2021-2022 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Ardalis.GuardClauses; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Rest; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Logging; +using Polly; +using Polly.Retry; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories +{ + public class InferenceRequestRepository : IInferenceRequestRepository, IDisposable + { + private readonly ILogger _logger; + private readonly IOptions _options; + private readonly IServiceScope _scope; + private readonly InformaticsGatewayContext _informaticsGatewayContext; + private readonly AsyncRetryPolicy _retryPolicy; + private readonly DbSet _dataset; + private bool _disposedValue; + + public ServiceStatus Status { get; set; } = ServiceStatus.Unknown; + + public InferenceRequestRepository( + IServiceScopeFactory serviceScopeFactory, + ILogger logger, + IOptions options) + { + Guard.Against.Null(serviceScopeFactory); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _options = options ?? throw new ArgumentNullException(nameof(options)); + _scope = serviceScopeFactory.CreateScope(); + _informaticsGatewayContext = _scope.ServiceProvider.GetRequiredService(); + _retryPolicy = Policy.Handle().WaitAndRetryAsync( + options.Value.Database.Retries.RetryDelays, + (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + _dataset = _informaticsGatewayContext.Set(); + } + + public async Task AddAsync(InferenceRequest inferenceRequest, CancellationToken cancellationToken = default) + { + Guard.Against.Null(inferenceRequest); + + using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "TransactionId", inferenceRequest.TransactionId } }); + await _retryPolicy.ExecuteAsync(async () => + { + await _dataset.AddAsync(inferenceRequest).ConfigureAwait(false); + await _informaticsGatewayContext.SaveChangesAsync().ConfigureAwait(false); + _informaticsGatewayContext.Entry(inferenceRequest).State = EntityState.Detached; + _logger.InferenceRequestSaved(); + }) + .ConfigureAwait(false); + } + + public async Task UpdateAsync(InferenceRequest inferenceRequest, InferenceRequestStatus status, CancellationToken cancellationToken = default) + { + Guard.Against.Null(inferenceRequest); + + using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "TransactionId", inferenceRequest.TransactionId } }); + + if (status == InferenceRequestStatus.Success) + { + inferenceRequest.State = InferenceRequestState.Completed; + inferenceRequest.Status = InferenceRequestStatus.Success; + } + else + { + if (++inferenceRequest.TryCount > _options.Value.Database.Retries.DelaysMilliseconds.Length) + { + _logger.InferenceRequestUpdateExceededMaximumRetries(); + inferenceRequest.State = InferenceRequestState.Completed; + inferenceRequest.Status = InferenceRequestStatus.Fail; + } + else + { + _logger.InferenceRequestUpdateRetryLater(); + inferenceRequest.State = InferenceRequestState.Queued; + } + } + + await Save(inferenceRequest).ConfigureAwait(false); + } + + public async Task TakeAsync(CancellationToken cancellationToken = default) + { + while (!cancellationToken.IsCancellationRequested) + { + try + { + var inferenceRequest = await _dataset.FirstOrDefaultAsync(p => p.State == InferenceRequestState.Queued, cancellationToken: cancellationToken).ConfigureAwait(false); + + if (inferenceRequest is not null) + { + using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "TransactionId", inferenceRequest.TransactionId } }); + inferenceRequest.State = InferenceRequestState.InProcess; + _logger.InferenceRequestSetToInProgress(inferenceRequest.TransactionId); + await Save(inferenceRequest).ConfigureAwait(false); + return inferenceRequest; + } + await Task.Delay(250, cancellationToken).ConfigureAwait(false); + } + catch (Exception ex) + { + _logger.ErrorQueryingForPendingInferenceRequest(ex); + } + } + + throw new OperationCanceledException("cancellation requested."); + } + + public async Task GetInferenceRequestAsync(string transactionId, CancellationToken cancellationToken = default) + { + Guard.Against.NullOrWhiteSpace(transactionId); + + return await _retryPolicy.ExecuteAsync(async () => + { + return await _dataset.FirstOrDefaultAsync(p => p.TransactionId.Equals(transactionId), cancellationToken: cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task GetInferenceRequestAsync(Guid inferenceRequestId, CancellationToken cancellationToken = default) + { + Guard.Against.NullOrEmpty(inferenceRequestId); + + return await _retryPolicy.ExecuteAsync(async () => + { + return await _dataset.FirstOrDefaultAsync(p => p.InferenceRequestId.Equals(inferenceRequestId), cancellationToken: cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task ExistsAsync(string transactionId, CancellationToken cancellationToken = default) + { + Guard.Against.NullOrWhiteSpace(transactionId); + + return await _retryPolicy.ExecuteAsync(async () => + { + return await GetInferenceRequestAsync(transactionId, cancellationToken).ConfigureAwait(false) is not null; + }).ConfigureAwait(false); + } + + public async Task GetStatusAsync(string transactionId, CancellationToken cancellationToken = default) + { + Guard.Against.NullOrWhiteSpace(transactionId); + + return await _retryPolicy.ExecuteAsync(async () => + { + var response = new InferenceStatusResponse(); + var item = await GetInferenceRequestAsync(transactionId, cancellationToken).ConfigureAwait(false); + if (item is null) + { + return null; + } + + response.TransactionId = item.TransactionId; + + return await Task.FromResult(response).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + private async Task Save(InferenceRequest inferenceRequest) + { + Guard.Against.Null(inferenceRequest); + + await _retryPolicy.ExecuteAsync(async () => + { + _logger.InferenceRequestUpdateState(); + if (inferenceRequest.State == InferenceRequestState.Completed) + { + _informaticsGatewayContext.Entry(inferenceRequest).State = EntityState.Detached; + } + _dataset.Update(inferenceRequest); + await _informaticsGatewayContext.SaveChangesAsync().ConfigureAwait(false); + _logger.InferenceRequestUpdated(); + }).ConfigureAwait(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _informaticsGatewayContext.Dispose(); + _scope.Dispose(); + } + + _disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} diff --git a/src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs b/src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs new file mode 100644 index 000000000..8ff711ed0 --- /dev/null +++ b/src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs @@ -0,0 +1,135 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Linq.Expressions; +using Ardalis.GuardClauses; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Logging; +using Polly; +using Polly.Retry; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories +{ + public class MonaiApplicationEntityRepository : IMonaiApplicationEntityRepository, IDisposable + { + private readonly ILogger _logger; + private readonly IServiceScope _scope; + private readonly InformaticsGatewayContext _informaticsGatewayContext; + private readonly AsyncRetryPolicy _retryPolicy; + private readonly DbSet _dataset; + private bool _disposedValue; + + public MonaiApplicationEntityRepository( + IServiceScopeFactory serviceScopeFactory, + ILogger logger, + IOptions options) + { + Guard.Against.Null(serviceScopeFactory); + Guard.Against.Null(options); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + _scope = serviceScopeFactory.CreateScope(); + _informaticsGatewayContext = _scope.ServiceProvider.GetRequiredService(); + _retryPolicy = Policy.Handle().WaitAndRetryAsync( + options.Value.Database.Retries.RetryDelays, + (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + _dataset = _informaticsGatewayContext.Set(); + } + + public async Task AddAsync(MonaiApplicationEntity item, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _dataset.AddAsync(item, cancellationToken).ConfigureAwait(false); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + }).ConfigureAwait(false); + } + + public async Task ContainsAsync(Expression> predicate, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var func = predicate.Compile(); + return await Task.FromResult(_dataset.Any(func)).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task FindByNameAsync(string name, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return await _dataset.FirstOrDefaultAsync(p => p.Name.Equals(name), cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task RemoveAsync(MonaiApplicationEntity entity, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var result = _dataset.Remove(entity); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + }).ConfigureAwait(false); + } + + public async Task> ToListAsync(CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return await _dataset.ToListAsync(cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task UpdateAsync(MonaiApplicationEntity entity, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var result = _dataset.Update(entity); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + }).ConfigureAwait(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _informaticsGatewayContext.Dispose(); + _scope.Dispose(); + } + + _disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} diff --git a/src/Database/EntityFramework/Repositories/PayloadRepository.cs b/src/Database/EntityFramework/Repositories/PayloadRepository.cs new file mode 100644 index 000000000..ce07d92ea --- /dev/null +++ b/src/Database/EntityFramework/Repositories/PayloadRepository.cs @@ -0,0 +1,150 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Linq.Expressions; +using Ardalis.GuardClauses; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Storage; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Logging; +using Polly; +using Polly.Retry; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories +{ + public class PayloadRepository : IPayloadRepository, IDisposable + { + private readonly ILogger _logger; + private readonly IServiceScope _scope; + private readonly InformaticsGatewayContext _informaticsGatewayContext; + private readonly AsyncRetryPolicy _retryPolicy; + private readonly DbSet _dataset; + private bool _disposedValue; + + public PayloadRepository( + IServiceScopeFactory serviceScopeFactory, + ILogger logger, + IOptions options) + { + Guard.Against.Null(serviceScopeFactory); + Guard.Against.Null(options); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + _scope = serviceScopeFactory.CreateScope(); + _informaticsGatewayContext = _scope.ServiceProvider.GetRequiredService(); + _retryPolicy = Policy.Handle().WaitAndRetryAsync( + options.Value.Database.Retries.RetryDelays, + (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + _dataset = _informaticsGatewayContext.Set(); + } + + public async Task AddAsync(Payload item, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _dataset.AddAsync(item, cancellationToken).ConfigureAwait(false); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + }).ConfigureAwait(false); + } + + public async Task ContainsAsync(Expression> predicate, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return await _dataset.AnyAsync(predicate, cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task RemoveAsync(Payload entity, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var result = _dataset.Remove(entity); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + }).ConfigureAwait(false); + } + + public async Task> ToListAsync(CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return await _dataset.ToListAsync(cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task UpdateAsync(Payload entity, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var result = _dataset.Update(entity); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + }).ConfigureAwait(false); + } + + public async Task RemovePendingPayloadsAsync(CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var count = 0; + await _dataset.Where(p => p.State == Payload.PayloadState.Created).ForEachAsync( + p => + { + _dataset.Remove(p); + count++; + }).ConfigureAwait(false); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return count; + }).ConfigureAwait(false); + } + + public async Task> GetPayloadsInStateAsync(CancellationToken cancellationToken = default, params Payload.PayloadState[] states) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return await _dataset.Where(p => states.Contains(p.State)).ToListAsync(cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _informaticsGatewayContext.Dispose(); + _scope.Dispose(); + } + + _disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} diff --git a/src/Database/EntityFramework/Repositories/SourceApplicationEntityRepository.cs b/src/Database/EntityFramework/Repositories/SourceApplicationEntityRepository.cs new file mode 100644 index 000000000..96f7b357b --- /dev/null +++ b/src/Database/EntityFramework/Repositories/SourceApplicationEntityRepository.cs @@ -0,0 +1,135 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Linq.Expressions; +using Ardalis.GuardClauses; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Logging; +using Polly; +using Polly.Retry; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories +{ + public class SourceApplicationEntityRepository : ISourceApplicationEntityRepository, IDisposable + { + private readonly ILogger _logger; + private readonly IServiceScope _scope; + private readonly InformaticsGatewayContext _informaticsGatewayContext; + private readonly AsyncRetryPolicy _retryPolicy; + private readonly DbSet _dataset; + private bool _disposedValue; + + public SourceApplicationEntityRepository( + IServiceScopeFactory serviceScopeFactory, + ILogger logger, + IOptions options) + { + Guard.Against.Null(serviceScopeFactory); + Guard.Against.Null(options); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + _scope = serviceScopeFactory.CreateScope(); + _informaticsGatewayContext = _scope.ServiceProvider.GetRequiredService(); + _retryPolicy = Policy.Handle().WaitAndRetryAsync( + options.Value.Database.Retries.RetryDelays, + (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + _dataset = _informaticsGatewayContext.Set(); + } + + public async Task AddAsync(SourceApplicationEntity item, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _dataset.AddAsync(item, cancellationToken).ConfigureAwait(false); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + }).ConfigureAwait(false); + } + + public async Task ContainsAsync(Expression> predicate, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var func = predicate.Compile(); + return await Task.FromResult(_dataset.Any(func)).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task FindByNameAsync(string name, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return await _dataset.FirstOrDefaultAsync(p => p.Name.Equals(name), cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task RemoveAsync(SourceApplicationEntity entity, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var result = _dataset.Remove(entity); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + }).ConfigureAwait(false); + } + + public async Task> ToListAsync(CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return await _dataset.ToListAsync(cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task UpdateAsync(SourceApplicationEntity entity, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var result = _dataset.Update(entity); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return result.Entity; + }).ConfigureAwait(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _informaticsGatewayContext.Dispose(); + _scope.Dispose(); + } + + _disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} diff --git a/src/Database/Api/StorageMetadataWrapper.cs b/src/Database/EntityFramework/Repositories/StorageMetadataWrapper.cs similarity index 74% rename from src/Database/Api/StorageMetadataWrapper.cs rename to src/Database/EntityFramework/Repositories/StorageMetadataWrapper.cs index f6a92aa39..45e92f601 100644 --- a/src/Database/Api/StorageMetadataWrapper.cs +++ b/src/Database/EntityFramework/Repositories/StorageMetadataWrapper.cs @@ -19,7 +19,7 @@ using Ardalis.GuardClauses; using Monai.Deploy.InformaticsGateway.Api.Storage; -namespace Monai.Deploy.InformaticsGateway.Database.Api +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories { public class StorageMetadataWrapper { @@ -43,7 +43,7 @@ private StorageMetadataWrapper() public StorageMetadataWrapper(FileStorageMetadata metadata) { - Guard.Against.Null(metadata, nameof(metadata)); + Guard.Against.Null(metadata); CorrelationId = metadata.CorrelationId; Identity = metadata.Id; @@ -52,14 +52,19 @@ public StorageMetadataWrapper(FileStorageMetadata metadata) public void Update(FileStorageMetadata metadata) { - Guard.Against.Null(metadata, nameof(metadata)); + Guard.Against.Null(metadata); IsUploaded = metadata.IsUploaded; - Value = JsonSerializer.Serialize(metadata); - TypeName = metadata.GetType().AssemblyQualifiedName; + Value = JsonSerializer.Serialize(metadata); // Must be here + + if (metadata.GetType() is null || string.IsNullOrWhiteSpace(metadata.GetType().AssemblyQualifiedName)) + { + throw new ArgumentException("Unable to determine the type", nameof(metadata)); + } + TypeName = metadata.GetType().AssemblyQualifiedName!; } - public FileStorageMetadata GetObject() + public FileStorageMetadata? GetObject() { var type = Type.GetType(TypeName, true); return JsonSerializer.Deserialize(Value, type) as FileStorageMetadata; diff --git a/src/Database/EntityFramework/Repositories/StorageMetadataWrapperRepository.cs b/src/Database/EntityFramework/Repositories/StorageMetadataWrapperRepository.cs new file mode 100644 index 000000000..b31b4aa05 --- /dev/null +++ b/src/Database/EntityFramework/Repositories/StorageMetadataWrapperRepository.cs @@ -0,0 +1,200 @@ +/* + * Copyright 2021-2022 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Data; +using Ardalis.GuardClauses; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Rest; +using Monai.Deploy.InformaticsGateway.Api.Storage; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Logging; +using Polly; +using Polly.Retry; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories +{ + public class StorageMetadataWrapperRepository : IStorageMetadataRepository, IDisposable + { + private readonly ILogger _logger; + private readonly IServiceScope _scope; + private readonly InformaticsGatewayContext _informaticsGatewayContext; + private readonly AsyncRetryPolicy _retryPolicy; + private readonly DbSet _dataset; + private bool _disposedValue; + + public ServiceStatus Status { get; set; } = ServiceStatus.Unknown; + + public StorageMetadataWrapperRepository( + IServiceScopeFactory serviceScopeFactory, + ILogger logger, + IOptions options) + { + Guard.Against.Null(serviceScopeFactory); + Guard.Against.Null(options); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + _scope = serviceScopeFactory.CreateScope(); + _informaticsGatewayContext = _scope.ServiceProvider.GetRequiredService(); + _retryPolicy = Policy.Handle(p => p is not ArgumentException).WaitAndRetryAsync( + options.Value.Database.Retries.RetryDelays, + (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + _dataset = _informaticsGatewayContext.Set(); + } + + + public async Task AddAsync(FileStorageMetadata metadata, CancellationToken cancellationToken = default) + { + Guard.Against.Null(metadata); + + using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "CorrelationId", metadata.CorrelationId }, { "Identity", metadata.Id } }); + await _retryPolicy.ExecuteAsync(async () => + { + var obj = new StorageMetadataWrapper(metadata); + await _dataset.AddAsync(obj, cancellationToken).ConfigureAwait(false); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + _informaticsGatewayContext.Entry(obj).State = Microsoft.EntityFrameworkCore.EntityState.Detached; + _logger.StorageMetadataSaved(); + }) + .ConfigureAwait(false); + } + + public async Task UpdateAsync(FileStorageMetadata metadata, CancellationToken cancellationToken = default) + { + + Guard.Against.Null(metadata); + + using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "CorrelationId", metadata.CorrelationId }, { "Identity", metadata.Id } }); + await _retryPolicy.ExecuteAsync(async () => + { + var obj = await _dataset.FirstOrDefaultAsync(p => p.Identity == metadata.Id && p.CorrelationId == metadata.CorrelationId, cancellationToken).ConfigureAwait(false); + + if (obj is null) + { + throw new ArgumentException("Matching wrapper storage object not found"); + } + + obj.Update(metadata); + _dataset.Update(obj); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + _informaticsGatewayContext.Entry(obj).State = Microsoft.EntityFrameworkCore.EntityState.Detached; + _logger.StorageMetadataSaved(); + }) + .ConfigureAwait(false); + } + + public async Task AddOrUpdateAsync(FileStorageMetadata metadata, CancellationToken cancellationToken = default) + { + + Guard.Against.Null(metadata); + + var existing = await GetFileStorageMetdadataAsync(metadata.CorrelationId, metadata.Id, cancellationToken).ConfigureAwait(false); + + if (existing is not null) + { + await UpdateAsync(metadata, cancellationToken).ConfigureAwait(false); + } + else + { + await AddAsync(metadata, cancellationToken).ConfigureAwait(false); + } + } + + public async Task> GetFileStorageMetdadataAsync(string correlationId, CancellationToken cancellationToken = default) + { + Guard.Against.NullOrWhiteSpace(correlationId); + + return await _retryPolicy.ExecuteAsync(async () => + { + return await _dataset + .Where(p => p.CorrelationId.Equals(correlationId)) + .Select(p => p.GetObject()) + .ToListAsync(cancellationToken: cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task GetFileStorageMetdadataAsync(string correlationId, string identity, CancellationToken cancellationToken = default) + { + Guard.Against.NullOrWhiteSpace(correlationId); + Guard.Against.NullOrWhiteSpace(identity); + + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _dataset.FirstOrDefaultAsync(p => p.CorrelationId.Equals(correlationId) && p.Identity.Equals(identity), cancellationToken).ConfigureAwait(false); + return result?.GetObject(); + }).ConfigureAwait(false); + } + + public async Task DeleteAsync(string correlationId, string identity, CancellationToken cancellationToken = default) + { + Guard.Against.NullOrWhiteSpace(correlationId); + Guard.Against.NullOrWhiteSpace(identity); + + var toBeDeleted = await _dataset.FirstOrDefaultAsync(p => p.CorrelationId.Equals(correlationId) && p.Identity.Equals(identity), cancellationToken).ConfigureAwait(false); + + if (toBeDeleted is not null) + { + return await _retryPolicy.ExecuteAsync(async () => + { + _dataset.Remove(toBeDeleted); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return true; + }).ConfigureAwait(false); + } + return false; + } + public async Task DeletePendingUploadsAsync(CancellationToken cancellationToken = default) + { + await _retryPolicy.ExecuteAsync(async () => + { + var toBeDeleted = _dataset.Where(p => !p.IsUploaded); + + if (await toBeDeleted.AnyAsync(cancellationToken).ConfigureAwait(false)) + { + _dataset.RemoveRange(toBeDeleted.ToArray()); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + } + }).ConfigureAwait(false); + + } + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _informaticsGatewayContext.Dispose(); + _scope.Dispose(); + } + + _disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} diff --git a/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs new file mode 100644 index 000000000..92db35397 --- /dev/null +++ b/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs @@ -0,0 +1,159 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; +using Moq; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test +{ + [Collection("SqliteDatabase")] + public class DestinationApplicationEntityRepositoryTest //: IClassFixture + { + private readonly SqliteDatabaseFixture _databaseFixture; + + private readonly Mock _serviceScopeFactory; + private readonly Mock> _logger; + private readonly IOptions _options; + + private readonly Mock _serviceScope; + private readonly IServiceProvider _serviceProvider; + + public DestinationApplicationEntityRepositoryTest(SqliteDatabaseFixture databaseFixture) + { + _databaseFixture = databaseFixture ?? throw new ArgumentNullException(nameof(databaseFixture)); + _databaseFixture.InitDatabaseWithDestinationApplicationEntities(); + + _serviceScopeFactory = new Mock(); + _logger = new Mock>(); + _options = Options.Create(new InformaticsGatewayConfiguration()); + + _serviceScope = new Mock(); + var services = new ServiceCollection(); + services.AddScoped(p => _logger.Object); + services.AddScoped(p => databaseFixture.DatabaseContext); + + _serviceProvider = services.BuildServiceProvider(); + _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); + _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); + + _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); + } + + [Fact] + public async Task GivenADestinationApplicationEntity_WhenAddingToDatabase_ExpectItToBeSaved() + { + var aet = new DestinationApplicationEntity { AeTitle = "AET", HostIp = "1.2.3.4", Port = 114, Name = "AET" }; + + var store = new DestinationApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + await store.AddAsync(aet).ConfigureAwait(false); + var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name.Equals(aet.Name)).ConfigureAwait(false); + + Assert.NotNull(actual); + Assert.Equal(aet.AeTitle, actual!.AeTitle); + Assert.Equal(aet.HostIp, actual!.HostIp); + Assert.Equal(aet.Port, actual!.Port); + Assert.Equal(aet.Name, actual!.Name); + } + + [Fact] + public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToReturnMatchingObjects() + { + var store = new DestinationApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1", StringComparison.Ordinal)).ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.AeTitle != "AET1" && p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.Port == 114 && p.HostIp == "1.2.3.4").ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.Port == 999).ConfigureAwait(false); + Assert.False(result); + } + + [Fact] + public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturnMatchingEntity() + { + var store = new DestinationApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var actual = await store.FindByNameAsync("AET1").ConfigureAwait(false); + Assert.NotNull(actual); + Assert.Equal("AET1", actual!.AeTitle); + Assert.Equal("1.2.3.4", actual!.HostIp); + Assert.Equal(114, actual!.Port); + Assert.Equal("AET1", actual!.Name); + + actual = await store.FindByNameAsync("AET6").ConfigureAwait(false); + Assert.Null(actual); + } + + [Fact] + public async Task GivenADestinationApplicationEntity_WhenRemoveIsCalled_ExpectItToDeleted() + { + var store = new DestinationApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var expected = await store.FindByNameAsync("AET5").ConfigureAwait(false); + Assert.NotNull(expected); + + var actual = await store.RemoveAsync(expected!).ConfigureAwait(false); + Assert.Same(expected, actual); + + var dbResult = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name == "AET5").ConfigureAwait(false); + Assert.Null(dbResult); + } + + [Fact] + public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenToListIsCalled_ExpectAllEntitiesToBeReturned() + { + var store = new DestinationApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var expected = await _databaseFixture.DatabaseContext.Set().ToListAsync().ConfigureAwait(false); + var actual = await store.ToListAsync().ConfigureAwait(false); + + Assert.Equal(expected, actual); + } + + [Fact] + public async Task GivenADestinationApplicationEntity_WhenUpdatedIsCalled_ExpectItToSaved() + { + var store = new DestinationApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var expected = await store.FindByNameAsync("AET3").ConfigureAwait(false); + Assert.NotNull(expected); + + expected!.AeTitle = "AET100"; + expected!.Port = 1000; + expected!.HostIp = "loalhost"; + + var actual = await store.UpdateAsync(expected).ConfigureAwait(false); + Assert.Equal(expected, actual); + + var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(false); + Assert.NotNull(dbResult); + Assert.Equal(expected.AeTitle, dbResult!.AeTitle); + Assert.Equal(expected.HostIp, dbResult!.HostIp); + Assert.Equal(expected.Port, dbResult!.Port); + } + } +} diff --git a/src/Database/EntityFramework/Test/InMemoryDatabaseFixture.cs b/src/Database/EntityFramework/Test/InMemoryDatabaseFixture.cs new file mode 100644 index 000000000..c42d41938 --- /dev/null +++ b/src/Database/EntityFramework/Test/InMemoryDatabaseFixture.cs @@ -0,0 +1,107 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Microsoft.EntityFrameworkCore; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test +{ + [CollectionDefinition("InMemoryDatabase")] + public class InMemoryDatabaseCollection : ICollectionFixture + { + // This class has no code, and is never created. Its purpose is simply + // to be the place to apply [CollectionDefinition] and all the + // ICollectionFixture<> interfaces. + } + + public class InMemoryDatabaseFixture + { + public InformaticsGatewayContext DatabaseContext { get; set; } + + public InMemoryDatabaseFixture() + { + var options = new DbContextOptionsBuilder() + .UseInMemoryDatabase(databaseName: "InMemoryDatabase") + .Options; + DatabaseContext = new InformaticsGatewayContext(options); + DatabaseContext.Database.EnsureDeleted(); + } + + public void InitDatabaseWithDestinationApplicationEntities() + { + var aet1 = new DestinationApplicationEntity { AeTitle = "AET1", HostIp = "1.2.3.4", Port = 114, Name = "AET1" }; + var aet2 = new DestinationApplicationEntity { AeTitle = "AET2", HostIp = "1.2.3.4", Port = 114, Name = "AET2" }; + var aet3 = new DestinationApplicationEntity { AeTitle = "AET3", HostIp = "1.2.3.4", Port = 114, Name = "AET3" }; + var aet4 = new DestinationApplicationEntity { AeTitle = "AET4", HostIp = "1.2.3.4", Port = 114, Name = "AET4" }; + var aet5 = new DestinationApplicationEntity { AeTitle = "AET5", HostIp = "1.2.3.4", Port = 114, Name = "AET5" }; + + var set = DatabaseContext.Set(); + set.RemoveRange(set.ToList()); + set.Add(aet1); + set.Add(aet2); + set.Add(aet3); + set.Add(aet4); + set.Add(aet5); + + DatabaseContext.SaveChanges(); + } + + public void InitDatabaseWithMonaiApplicationEntities() + { + var aet1 = new MonaiApplicationEntity { AeTitle = "AET1", Name = "AET1" }; + var aet2 = new MonaiApplicationEntity { AeTitle = "AET2", Name = "AET2" }; + var aet3 = new MonaiApplicationEntity { AeTitle = "AET3", Name = "AET3" }; + var aet4 = new MonaiApplicationEntity { AeTitle = "AET4", Name = "AET4" }; + var aet5 = new MonaiApplicationEntity { AeTitle = "AET5", Name = "AET5" }; + + var set = DatabaseContext.Set(); + set.RemoveRange(set.ToList()); + set.Add(aet1); + set.Add(aet2); + set.Add(aet3); + set.Add(aet4); + set.Add(aet5); + + DatabaseContext.SaveChanges(); + } + + public void InitDatabaseWithSourceApplicationEntities() + { + var aet1 = new SourceApplicationEntity { AeTitle = "AET1", Name = "AET1", HostIp = "1.2.3.4" }; + var aet2 = new SourceApplicationEntity { AeTitle = "AET2", Name = "AET2", HostIp = "1.2.3.4" }; + var aet3 = new SourceApplicationEntity { AeTitle = "AET3", Name = "AET3", HostIp = "1.2.3.4" }; + var aet4 = new SourceApplicationEntity { AeTitle = "AET4", Name = "AET4", HostIp = "1.2.3.4" }; + var aet5 = new SourceApplicationEntity { AeTitle = "AET5", Name = "AET5", HostIp = "1.2.3.4" }; + + var set = DatabaseContext.Set(); + set.RemoveRange(set.ToList()); + set.Add(aet1); + set.Add(aet2); + set.Add(aet3); + set.Add(aet4); + set.Add(aet5); + + DatabaseContext.SaveChanges(); + } + + + public void Dispose() + { + DatabaseContext.Dispose(); + } + } +} diff --git a/src/Database/EntityFramework/Test/InferenceRequestRepositoryTest.cs b/src/Database/EntityFramework/Test/InferenceRequestRepositoryTest.cs new file mode 100644 index 000000000..5e48d7192 --- /dev/null +++ b/src/Database/EntityFramework/Test/InferenceRequestRepositoryTest.cs @@ -0,0 +1,255 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Rest; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; +using Moq; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test +{ + [Collection("SqliteDatabase")] + public class InferenceRequestRepositoryTest + { + private readonly SqliteDatabaseFixture _databaseFixture; + + private readonly Mock _serviceScopeFactory; + private readonly Mock> _logger; + private readonly IOptions _options; + + private readonly Mock _serviceScope; + private readonly IServiceProvider _serviceProvider; + + public InferenceRequestRepositoryTest(SqliteDatabaseFixture databaseFixture) + { + _databaseFixture = databaseFixture;// new SqliteDatabaseFixture(); + + _serviceScopeFactory = new Mock(); + _logger = new Mock>(); + _options = Options.Create(new InformaticsGatewayConfiguration()); + + _serviceScope = new Mock(); + var services = new ServiceCollection(); + services.AddScoped(p => _logger.Object); + services.AddScoped(p => _databaseFixture.DatabaseContext); + + _serviceProvider = services.BuildServiceProvider(); + _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); + _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); + + _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); + } + + [Fact] + public async Task GivenAnInferenceRequest_WhenAddingToDatabase_ExpectItToBeSaved() + { + var inferenceRequest = CreateInferenceRequest(); + + var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); + await store.AddAsync(inferenceRequest).ConfigureAwait(false); + var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.InferenceRequestId.Equals(inferenceRequest.InferenceRequestId)).ConfigureAwait(false); + + Assert.NotNull(actual); + Assert.Equal(inferenceRequest.InferenceRequestId, actual!.InferenceRequestId); + Assert.Equal(inferenceRequest.State, actual!.State); + Assert.Equal(inferenceRequest.Status, actual!.Status); + Assert.Equal(inferenceRequest.TransactionId, actual!.TransactionId); + Assert.Equal(inferenceRequest.TryCount, actual!.TryCount); + } + + [Fact] + public async Task GivenAFailedInferenceRequstThatExceededRetries_WhenUpdateIsCalled_ShallMarkAsFailed() + { + var inferenceRequest = new InferenceRequest + { + TransactionId = Guid.NewGuid().ToString(), + TryCount = 3 + }; + + var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); + await store.AddAsync(inferenceRequest).ConfigureAwait(false); + await store.UpdateAsync(inferenceRequest, InferenceRequestStatus.Fail); + + var result = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.TransactionId == inferenceRequest.TransactionId).ConfigureAwait(false); + Assert.NotNull(result); + Assert.Equal(InferenceRequestState.Completed, result!.State); + Assert.Equal(InferenceRequestStatus.Fail, result!.Status); + } + + [Fact] + public async Task GivenAFailedInferenceRequst_WhenUpdateIsCalled_ShallRetryLater() + { + var inferenceRequest = new InferenceRequest + { + TransactionId = Guid.NewGuid().ToString(), + TryCount = 1 + }; + + var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); + await store.AddAsync(inferenceRequest).ConfigureAwait(false); + await store.UpdateAsync(inferenceRequest, InferenceRequestStatus.Fail).ConfigureAwait(false); + + var result = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.TransactionId == inferenceRequest.TransactionId).ConfigureAwait(false); + Assert.NotNull(result); + Assert.Equal(InferenceRequestState.Queued, result!.State); + Assert.Equal(InferenceRequestStatus.Unknown, result!.Status); + Assert.Equal(2, result!.TryCount); + } + + [Fact] + public async Task GivenASuccessfulInferenceRequest_WhenUpdateIsCalled_ShallMarkAsCompleted() + { + var inferenceRequest = new InferenceRequest + { + TransactionId = Guid.NewGuid().ToString() + }; + + var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + await store.AddAsync(inferenceRequest).ConfigureAwait(false); + await store.UpdateAsync(inferenceRequest, InferenceRequestStatus.Success).ConfigureAwait(false); + + var result = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.TransactionId == inferenceRequest.TransactionId).ConfigureAwait(false); + Assert.NotNull(result); + Assert.Equal(InferenceRequestState.Completed, result!.State); + Assert.Equal(InferenceRequestStatus.Success, result!.Status); + } + + [Fact] + public async Task GivenAQueuedInferenceRequests_WhenTakeIsCalled_ShallReturnFirstQueued() + { + var set = _databaseFixture.DatabaseContext.Set(); + set.RemoveRange(set.ToList()); + await _databaseFixture.DatabaseContext.SaveChangesAsync().ConfigureAwait(false); + var inferenceRequestInProcess = CreateInferenceRequest(InferenceRequestState.InProcess); + var inferenceRequestCompleted = CreateInferenceRequest(InferenceRequestState.Completed); + var inferenceRequestQueued = CreateInferenceRequest(); + + var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); + await store.AddAsync(inferenceRequestInProcess).ConfigureAwait(false); + await store.AddAsync(inferenceRequestCompleted).ConfigureAwait(false); + await store.AddAsync(inferenceRequestQueued).ConfigureAwait(false); + + var actual = await store.TakeAsync().ConfigureAwait(false); + Assert.NotNull(actual); + Assert.Equal(inferenceRequestQueued.InferenceRequestId, actual!.InferenceRequestId); + Assert.Equal(InferenceRequestState.InProcess, actual!.State); + Assert.Equal(inferenceRequestQueued.Status, actual!.Status); + Assert.Equal(inferenceRequestQueued.TransactionId, actual!.TransactionId); + Assert.Equal(inferenceRequestQueued.TryCount, actual!.TryCount); + } + + [Fact] + public async Task GivenNoQueuedInferenceRequests_WhenTakeIsCalled_ShallReturnNotReturnAnything() + { + _databaseFixture.Clear(); + + var cancellationTokenSource = new CancellationTokenSource(); + var inferenceRequestInProcess = CreateInferenceRequest(InferenceRequestState.InProcess); + var inferenceRequestCompleted = CreateInferenceRequest(InferenceRequestState.Completed); + + var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); + await store.AddAsync(inferenceRequestInProcess).ConfigureAwait(false); + await store.AddAsync(inferenceRequestCompleted).ConfigureAwait(false); + + cancellationTokenSource.CancelAfter(500); + await Assert.ThrowsAsync(async () => await store.TakeAsync(cancellationTokenSource.Token).ConfigureAwait(false)); + } + + [Fact] + public async Task GivenInferenceRequests_WhenGetInferenceRequestIsCalled_ShallReturnMatchingObject() + { + var inferenceRequest1 = CreateInferenceRequest(); + var inferenceRequest2 = CreateInferenceRequest(); + var inferenceRequest3 = CreateInferenceRequest(); + + var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); + await store.AddAsync(inferenceRequest1).ConfigureAwait(false); + await store.AddAsync(inferenceRequest2).ConfigureAwait(false); + await store.AddAsync(inferenceRequest3).ConfigureAwait(false); + + var result = await store.GetInferenceRequestAsync(inferenceRequest1.TransactionId).ConfigureAwait(false); + Assert.Equal(inferenceRequest1.TransactionId, result.TransactionId); + result = await store.GetInferenceRequestAsync(inferenceRequest2.TransactionId).ConfigureAwait(false); + Assert.Equal(inferenceRequest2.TransactionId, result.TransactionId); + result = await store.GetInferenceRequestAsync(inferenceRequest3.TransactionId).ConfigureAwait(false); + Assert.Equal(inferenceRequest3.TransactionId, result.TransactionId); + + result = await store.GetInferenceRequestAsync(inferenceRequest1.InferenceRequestId).ConfigureAwait(false); + Assert.Equal(inferenceRequest1.TransactionId, result.TransactionId); + result = await store.GetInferenceRequestAsync(inferenceRequest2.InferenceRequestId).ConfigureAwait(false); + Assert.Equal(inferenceRequest2.TransactionId, result.TransactionId); + result = await store.GetInferenceRequestAsync(inferenceRequest3.InferenceRequestId).ConfigureAwait(false); + Assert.Equal(inferenceRequest3.TransactionId, result.TransactionId); + } + + [Fact] + public async Task GivenInferenceRequests_WhenExistsCalled_ShallReturnCorrectValue() + { + var inferenceRequest = CreateInferenceRequest(); + + var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); + await store.AddAsync(inferenceRequest).ConfigureAwait(false); + + var result = await store.ExistsAsync(inferenceRequest.TransactionId).ConfigureAwait(false); + Assert.True(result); + + result = await store.ExistsAsync("random").ConfigureAwait(false); + Assert.False(result); + } + + [Fact] + public async Task GivenAMatchingInferenceRequest_WhenGetStatusCalled_ShallReturnStatus() + { + var inferenceRequest = CreateInferenceRequest(); + + var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); + await store.AddAsync(inferenceRequest).ConfigureAwait(false); + + var result = await store.GetStatusAsync(inferenceRequest.TransactionId).ConfigureAwait(false); + + Assert.NotNull(result); + Assert.Equal(inferenceRequest.TransactionId, result.TransactionId); + } + + [Fact] + public async Task GivenNoMatchingInferenceRequest_WhenGetStatusCalled_ShallReturnStatus() + { + var inferenceRequest = CreateInferenceRequest(); + + var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); + await store.AddAsync(inferenceRequest).ConfigureAwait(false); + + var result = await store.GetStatusAsync("bogus").ConfigureAwait(false); + + Assert.Null(result); + } + + private InferenceRequest CreateInferenceRequest(InferenceRequestState state = InferenceRequestState.Queued) => new InferenceRequest + { + InferenceRequestId = Guid.NewGuid(), + State = state, + Status = InferenceRequestStatus.Unknown, + TransactionId = Guid.NewGuid().ToString(), + TryCount = 0, + }; + } +} diff --git a/src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj b/src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj new file mode 100644 index 000000000..532b72237 --- /dev/null +++ b/src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj @@ -0,0 +1,30 @@ + + + + net6.0 + enable + enable + + false + + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + diff --git a/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs new file mode 100644 index 000000000..b306af659 --- /dev/null +++ b/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs @@ -0,0 +1,163 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; +using Moq; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test +{ + [Collection("SqliteDatabase")] + public class MonaiApplicationEntityRepositoryTest //: IClassFixture + { + private readonly SqliteDatabaseFixture _databaseFixture; + + private readonly Mock _serviceScopeFactory; + private readonly Mock> _logger; + private readonly IOptions _options; + + private readonly Mock _serviceScope; + private readonly IServiceProvider _serviceProvider; + + public MonaiApplicationEntityRepositoryTest(SqliteDatabaseFixture databaseFixture) + { + _databaseFixture = databaseFixture ?? throw new ArgumentNullException(nameof(databaseFixture)); + _databaseFixture.InitDatabaseWithMonaiApplicationEntities(); + + _serviceScopeFactory = new Mock(); + _logger = new Mock>(); + _options = Options.Create(new InformaticsGatewayConfiguration()); + + _serviceScope = new Mock(); + var services = new ServiceCollection(); + services.AddScoped(p => _logger.Object); + services.AddScoped(p => databaseFixture.DatabaseContext); + + _serviceProvider = services.BuildServiceProvider(); + _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); + _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); + + _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); + } + + [Fact] + public async Task GivenAMonaiApplicationEntity_WhenAddingToDatabase_ExpectItToBeSaved() + { + var aet = new MonaiApplicationEntity + { + AeTitle = "AET", + Name = "AET", + Timeout = 100, + AllowedSopClasses = new List { "1", "2", "3" }, + Workflows = new List { "W1", "W2" }, + Grouping = "G", + IgnoredSopClasses = new List { "4", "5" } + }; + + var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + await store.AddAsync(aet).ConfigureAwait(false); + var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name.Equals(aet.Name)).ConfigureAwait(false); + + Assert.NotNull(actual); + Assert.Equal(aet.AeTitle, actual!.AeTitle); + Assert.Equal(aet.Name, actual!.Name); + Assert.Equal(aet.Timeout, actual!.Timeout); + Assert.Equal(aet.AllowedSopClasses, actual!.AllowedSopClasses); + Assert.Equal(aet.Workflows, actual!.Workflows); + Assert.Equal(aet.Grouping, actual!.Grouping); + Assert.Equal(aet.IgnoredSopClasses, actual!.IgnoredSopClasses); + } + + [Fact] + public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToReturnMatchingObjects() + { + var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1", StringComparison.Ordinal)).ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.Name != "AET2").ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.Name == "AET6").ConfigureAwait(false); + Assert.False(result); + } + + [Fact] + public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturnMatchingEntity() + { + var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var actual = await store.FindByNameAsync("AET1").ConfigureAwait(false); + Assert.NotNull(actual); + Assert.Equal("AET1", actual!.AeTitle); + Assert.Equal("AET1", actual!.Name); + + actual = await store.FindByNameAsync("AET6").ConfigureAwait(false); + Assert.Null(actual); + } + + [Fact] + public async Task GivenAMonaiApplicationEntity_WhenRemoveIsCalled_ExpectItToDeleted() + { + var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var expected = await store.FindByNameAsync("AET5").ConfigureAwait(false); + Assert.NotNull(expected); + + var actual = await store.RemoveAsync(expected!).ConfigureAwait(false); + Assert.Same(expected, actual); + + var dbResult = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name == "AET5").ConfigureAwait(false); + Assert.Null(dbResult); + } + + [Fact] + public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenToListIsCalled_ExpectAllEntitiesToBeReturned() + { + var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var expected = await _databaseFixture.DatabaseContext.Set().ToListAsync().ConfigureAwait(false); + var actual = await store.ToListAsync().ConfigureAwait(false); + + Assert.Equal(expected, actual); + } + + [Fact] + public async Task GivenAMonaiApplicationEntity_WhenUpdatedIsCalled_ExpectItToSaved() + { + var store = new MonaiApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var expected = await store.FindByNameAsync("AET3").ConfigureAwait(false); + Assert.NotNull(expected); + + expected!.AeTitle = "AET100"; + + var actual = await store.UpdateAsync(expected).ConfigureAwait(false); + Assert.Equal(expected, actual); + + var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(false); + Assert.NotNull(dbResult); + Assert.Equal(expected.AeTitle, dbResult!.AeTitle); + } + } +} diff --git a/src/Database/EntityFramework/Test/SourceApplicationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/SourceApplicationEntityRepositoryTest.cs new file mode 100644 index 000000000..6f3b993ea --- /dev/null +++ b/src/Database/EntityFramework/Test/SourceApplicationEntityRepositoryTest.cs @@ -0,0 +1,155 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; +using Moq; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test +{ + [Collection("SqliteDatabase")] + public class SourceApplicationEntityRepositoryTest //: IClassFixture + { + private readonly SqliteDatabaseFixture _databaseFixture; + + private readonly Mock _serviceScopeFactory; + private readonly Mock> _logger; + private readonly IOptions _options; + + private readonly Mock _serviceScope; + private readonly IServiceProvider _serviceProvider; + + public SourceApplicationEntityRepositoryTest(SqliteDatabaseFixture databaseFixture) + { + _databaseFixture = databaseFixture ?? throw new ArgumentNullException(nameof(databaseFixture)); + _databaseFixture.InitDatabaseWithSourceApplicationEntities(); + + _serviceScopeFactory = new Mock(); + _logger = new Mock>(); + _options = Options.Create(new InformaticsGatewayConfiguration()); + + _serviceScope = new Mock(); + var services = new ServiceCollection(); + services.AddScoped(p => _logger.Object); + services.AddScoped(p => databaseFixture.DatabaseContext); + + _serviceProvider = services.BuildServiceProvider(); + _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); + _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); + + _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); + } + + [Fact] + public async Task GivenASourceApplicationEntity_WhenAddingToDatabase_ExpectItToBeSaved() + { + var aet = new SourceApplicationEntity + { + AeTitle = "AET", + Name = "AET", + HostIp = "localhost" + }; + + var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + await store.AddAsync(aet).ConfigureAwait(false); + var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name.Equals(aet.Name)).ConfigureAwait(false); + + Assert.NotNull(actual); + Assert.Equal(aet.AeTitle, actual!.AeTitle); + Assert.Equal(aet.Name, actual!.Name); + Assert.Equal(aet.HostIp, actual!.HostIp); + } + + [Fact] + public async Task GivenAExpressionFilter_WhenContainsAsyncIsCalled_ExpectItToReturnMatchingObjects() + { + var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var result = await store.ContainsAsync(p => p.AeTitle == "AET1").ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.AeTitle.Equals("AET1", StringComparison.Ordinal)).ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.Name != "AET2").ConfigureAwait(false); + Assert.True(result); + result = await store.ContainsAsync(p => p.Name == "AET6").ConfigureAwait(false); + Assert.False(result); + } + + [Fact] + public async Task GivenAAETitleName_WhenFindByNameAsyncIsCalled_ExpectItToReturnMatchingEntity() + { + var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var actual = await store.FindByNameAsync("AET1").ConfigureAwait(false); + Assert.NotNull(actual); + Assert.Equal("AET1", actual!.AeTitle); + Assert.Equal("AET1", actual!.Name); + + actual = await store.FindByNameAsync("AET6").ConfigureAwait(false); + Assert.Null(actual); + } + + [Fact] + public async Task GivenASourceApplicationEntity_WhenRemoveIsCalled_ExpectItToDeleted() + { + var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var expected = await store.FindByNameAsync("AET5").ConfigureAwait(false); + Assert.NotNull(expected); + + var actual = await store.RemoveAsync(expected!).ConfigureAwait(false); + Assert.Same(expected, actual); + + var dbResult = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Name == "AET5").ConfigureAwait(false); + Assert.Null(dbResult); + } + + [Fact] + public async Task GivenDestinationApplicationEntitiesInTheDatabase_WhenToListIsCalled_ExpectAllEntitiesToBeReturned() + { + var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var expected = await _databaseFixture.DatabaseContext.Set().ToListAsync().ConfigureAwait(false); + var actual = await store.ToListAsync().ConfigureAwait(false); + + Assert.Equal(expected, actual); + } + + [Fact] + public async Task GivenASourceApplicationEntity_WhenUpdatedIsCalled_ExpectItToSaved() + { + var store = new SourceApplicationEntityRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + var expected = await store.FindByNameAsync("AET3").ConfigureAwait(false); + Assert.NotNull(expected); + + expected!.AeTitle = "AET100"; + + var actual = await store.UpdateAsync(expected).ConfigureAwait(false); + Assert.Equal(expected, actual); + + var dbResult = await store.FindByNameAsync("AET3").ConfigureAwait(false); + Assert.NotNull(dbResult); + Assert.Equal(expected.AeTitle, dbResult!.AeTitle); + } + } +} diff --git a/src/Database/EntityFramework/Test/SqliteDatabaseFixture.cs b/src/Database/EntityFramework/Test/SqliteDatabaseFixture.cs new file mode 100644 index 000000000..aa52fd850 --- /dev/null +++ b/src/Database/EntityFramework/Test/SqliteDatabaseFixture.cs @@ -0,0 +1,112 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Microsoft.EntityFrameworkCore; +using Monai.Deploy.InformaticsGateway.Api; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test +{ + [CollectionDefinition("SqliteDatabase")] + public class SqliteDatabaseCollection : ICollectionFixture + { + // This class has no code, and is never created. Its purpose is simply + // to be the place to apply [CollectionDefinition] and all the + // ICollectionFixture<> interfaces. + } + + public class SqliteDatabaseFixture + { + public InformaticsGatewayContext DatabaseContext { get; set; } + + public SqliteDatabaseFixture() + { + var options = new DbContextOptionsBuilder() + .UseSqlite("DataSource=file::memory:?cache=shared") + .Options; + DatabaseContext = new InformaticsGatewayContext(options); + DatabaseContext.Database.EnsureCreated(); + } + + public void InitDatabaseWithDestinationApplicationEntities() + { + var aet1 = new DestinationApplicationEntity { AeTitle = "AET1", HostIp = "1.2.3.4", Port = 114, Name = "AET1" }; + var aet2 = new DestinationApplicationEntity { AeTitle = "AET2", HostIp = "1.2.3.4", Port = 114, Name = "AET2" }; + var aet3 = new DestinationApplicationEntity { AeTitle = "AET3", HostIp = "1.2.3.4", Port = 114, Name = "AET3" }; + var aet4 = new DestinationApplicationEntity { AeTitle = "AET4", HostIp = "1.2.3.4", Port = 114, Name = "AET4" }; + var aet5 = new DestinationApplicationEntity { AeTitle = "AET5", HostIp = "1.2.3.4", Port = 114, Name = "AET5" }; + + var set = DatabaseContext.Set(); + set.RemoveRange(set.ToList()); + set.Add(aet1); + set.Add(aet2); + set.Add(aet3); + set.Add(aet4); + set.Add(aet5); + + DatabaseContext.SaveChanges(); + } + + public void InitDatabaseWithMonaiApplicationEntities() + { + var aet1 = new MonaiApplicationEntity { AeTitle = "AET1", Name = "AET1" }; + var aet2 = new MonaiApplicationEntity { AeTitle = "AET2", Name = "AET2" }; + var aet3 = new MonaiApplicationEntity { AeTitle = "AET3", Name = "AET3" }; + var aet4 = new MonaiApplicationEntity { AeTitle = "AET4", Name = "AET4" }; + var aet5 = new MonaiApplicationEntity { AeTitle = "AET5", Name = "AET5" }; + + var set = DatabaseContext.Set(); + set.RemoveRange(set.ToList()); + set.Add(aet1); + set.Add(aet2); + set.Add(aet3); + set.Add(aet4); + set.Add(aet5); + + DatabaseContext.SaveChanges(); + } + + public void InitDatabaseWithSourceApplicationEntities() + { + var aet1 = new SourceApplicationEntity { AeTitle = "AET1", Name = "AET1", HostIp = "1.2.3.4" }; + var aet2 = new SourceApplicationEntity { AeTitle = "AET2", Name = "AET2", HostIp = "1.2.3.4" }; + var aet3 = new SourceApplicationEntity { AeTitle = "AET3", Name = "AET3", HostIp = "1.2.3.4" }; + var aet4 = new SourceApplicationEntity { AeTitle = "AET4", Name = "AET4", HostIp = "1.2.3.4" }; + var aet5 = new SourceApplicationEntity { AeTitle = "AET5", Name = "AET5", HostIp = "1.2.3.4" }; + + var set = DatabaseContext.Set(); + set.RemoveRange(set.ToList()); + set.Add(aet1); + set.Add(aet2); + set.Add(aet3); + set.Add(aet4); + set.Add(aet5); + + DatabaseContext.SaveChanges(); + } + + public void Clear() where T : class + { + var set = DatabaseContext.Set(); + set.RemoveRange(set.ToList()); + DatabaseContext.SaveChanges(); + } + + public void Dispose() + { + DatabaseContext.Dispose(); + } + } +} diff --git a/src/Database/EntityFramework/Test/StorageMetadataWrapperRepositoryTest.cs b/src/Database/EntityFramework/Test/StorageMetadataWrapperRepositoryTest.cs new file mode 100644 index 000000000..232e3d3b3 --- /dev/null +++ b/src/Database/EntityFramework/Test/StorageMetadataWrapperRepositoryTest.cs @@ -0,0 +1,254 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Text.Json; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Rest; +using Monai.Deploy.InformaticsGateway.Api.Storage; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; +using Moq; + +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test +{ + [Collection("SqliteDatabase")] + public class StorageMetadataWrapperRepositoryTest //: IClassFixture + { + private readonly SqliteDatabaseFixture _databaseFixture; + + private readonly Mock _serviceScopeFactory; + private readonly Mock> _logger; + private readonly IOptions _options; + + private readonly Mock _serviceScope; + private readonly IServiceProvider _serviceProvider; + + public StorageMetadataWrapperRepositoryTest(SqliteDatabaseFixture databaseFixture) + { + _databaseFixture = databaseFixture ?? throw new ArgumentNullException(nameof(databaseFixture)); + + _serviceScopeFactory = new Mock(); + _logger = new Mock>(); + _options = Options.Create(new InformaticsGatewayConfiguration()); + + _serviceScope = new Mock(); + var services = new ServiceCollection(); + services.AddScoped(p => _logger.Object); + services.AddScoped(p => databaseFixture.DatabaseContext); + + _serviceProvider = services.BuildServiceProvider(); + _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); + _serviceScope.Setup(p => p.ServiceProvider).Returns(_serviceProvider); + + _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; + _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); + } + + [Fact] + public void GivenStorageMetadataWrapperRepositoryType_WhenInitialized_TheConstructorShallGuardAllParameters() + { + Assert.Throws(() => new StorageMetadataWrapperRepository(null, null, null)); + Assert.Throws(() => new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, null)); + + _ = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); + } + + [Fact] + public async Task GivenADicomStorageMetadataObject_WhenAddingToDatabase_ExpectItToBeSaved() + { + var metadata = CreateMetadataObject(); + + var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); + await store.AddAsync(metadata).ConfigureAwait(false); + var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Identity.Equals(metadata.Id)).ConfigureAwait(false); + + Assert.NotNull(actual); + Assert.Equal(metadata.CorrelationId, actual!.CorrelationId); + Assert.Equal(metadata.IsUploaded, actual!.IsUploaded); + Assert.Equal(metadata.GetType().AssemblyQualifiedName, actual!.TypeName); + Assert.Equal(JsonSerializer.Serialize(metadata), actual!.Value); + } + + [Fact] + public async Task GivenANonExistedDicomStorageMetadataObject_WhenSavedToDatabase_ThrowsArgumentException() + { + var metadata1 = CreateMetadataObject(); + var metadata2 = CreateMetadataObject(); + + var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + await store.AddOrUpdateAsync(metadata1).ConfigureAwait(false); + await Assert.ThrowsAsync(async () => await store.UpdateAsync(metadata2).ConfigureAwait(false)).ConfigureAwait(false); + } + + [Fact] + public async Task GivenAnExistingDicomStorageMetadataObject_WhenUpdated_ExpectItToBeSaved() + { + var metadata = CreateMetadataObject(); + + var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); + await store.AddAsync(metadata).ConfigureAwait(false); + metadata.SetWorkflows("A", "B", "C"); + metadata.File.SetUploaded("bucket"); + + await store.AddOrUpdateAsync(metadata).ConfigureAwait(false); + + var actual = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Identity.Equals(metadata.Id)).ConfigureAwait(false); + + Assert.NotNull(actual); + Assert.Equal(metadata.CorrelationId, actual!.CorrelationId); + Assert.Equal(metadata.IsUploaded, actual!.IsUploaded); + Assert.Equal(metadata.GetType().AssemblyQualifiedName, actual!.TypeName); + Assert.Equal(JsonSerializer.Serialize(metadata), actual!.Value); + + var unwrapped = actual.GetObject(); + Assert.NotNull(unwrapped); + + Assert.Equal(metadata.Workflows, unwrapped.Workflows); + Assert.Equal(metadata.File.TemporaryBucketName, unwrapped.File.TemporaryBucketName); + } + + [Fact] + public async Task GivenACorrelationId_WhenGetFileStorageMetdadataIsCalled_ExpectMatchingFileStorageMetadataToBeReturned() + { + var correlationId = Guid.NewGuid(); + var list = new List{ + CreateMetadataObject(correlationId), + CreateMetadataObject(correlationId), + CreateMetadataObject(), + new FhirFileStorageMetadata( + correlationId.ToString(), + Guid.NewGuid().ToString(), + Guid.NewGuid().ToString(), + FhirStorageFormat.Json), + new FhirFileStorageMetadata( + Guid.NewGuid().ToString(), + Guid.NewGuid().ToString(), + Guid.NewGuid().ToString(), + FhirStorageFormat.Json), + }; + + var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); + + foreach (var item in list) + { + await store.AddOrUpdateAsync(item).ConfigureAwait(false); + } + + var results = await store.GetFileStorageMetdadataAsync(correlationId.ToString()).ConfigureAwait(false); + + Assert.Equal(3, results.Count); + + Assert.Collection(results, + (item) => item!.Id.Equals(list[0].Id), + (item) => item!.Id.Equals(list[1].Id), + (item) => item!.Id.Equals(list[2].Id)); + } + + [Fact] + public async Task GivenACorrelationIdAndAnIdentity_WhenGetFileStorageMetdadataIsCalled_ExpectMatchingFileStorageMetadataToBeReturned() + { + var correlationId = Guid.NewGuid().ToString(); + var identifier = Guid.NewGuid().ToString(); + var expected = new DicomFileStorageMetadata( + correlationId, + identifier, + Guid.NewGuid().ToString(), + Guid.NewGuid().ToString(), + Guid.NewGuid().ToString()); + + var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); + await store.AddOrUpdateAsync(expected).ConfigureAwait(false); + + var match = await store.GetFileStorageMetdadataAsync(correlationId, identifier).ConfigureAwait(false); + + Assert.NotNull(match); + Assert.Equal(expected.Id, match!.Id); + Assert.Equal(expected.CorrelationId, match.CorrelationId); + } + + [Fact] + public async Task GivenACorrelationIdAndAnIdentity_WhenDeleteAsyncIsCalled_ExpectMatchingInstanceToBeDeleted() + { + var correlationId = Guid.NewGuid().ToString(); + var identifier = Guid.NewGuid().ToString(); + var expected = new DicomFileStorageMetadata( + correlationId, + identifier, + Guid.NewGuid().ToString(), + Guid.NewGuid().ToString(), + Guid.NewGuid().ToString()); + + var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); + await store.AddAsync(expected).ConfigureAwait(false); + var result = await store.DeleteAsync(correlationId, identifier).ConfigureAwait(false); + Assert.True(result); + + var stored = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Identity == identifier).ConfigureAwait(false); + Assert.Null(stored); + } + + [Fact] + public async Task GivenACorrelationIdAndAnIdentity_WhenDeleteAsyncIsCalledWithoutAMatch_ExpectNothingIsDeleted() + { + var correlationId = Guid.NewGuid().ToString(); + var identifier = Guid.NewGuid().ToString(); + var pending = CreateMetadataObject(); + + var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); + await store.AddAsync(pending).ConfigureAwait(false); + + var result = await store.DeleteAsync(correlationId, identifier).ConfigureAwait(false); + Assert.False(result); + + var stored = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.Identity == pending.Id).ConfigureAwait(false); + Assert.NotNull(stored); + } + + [Fact] + public async Task GivenStorageMetadataObjects_WhenDeletingPendingUploadsObject_ExpectAllPendingObjectsToBeDeleted() + { + _databaseFixture.Clear(); + + var pending = CreateMetadataObject(); + var uploaded = CreateMetadataObject(); + uploaded.File.SetUploaded("bucket"); + uploaded.JsonFile.SetUploaded("bucket"); + + var store = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); + await store.AddAsync(pending).ConfigureAwait(false); + await store.AddAsync(uploaded).ConfigureAwait(false); + + await store.DeletePendingUploadsAsync().ConfigureAwait(false); + + var result = await _databaseFixture.DatabaseContext.Set().ToListAsync().ConfigureAwait(false); + Assert.Single(result); + Assert.Equal(uploaded.Id, result[0].Identity); + } + + private static DicomFileStorageMetadata CreateMetadataObject() => CreateMetadataObject(Guid.NewGuid()); + + private static DicomFileStorageMetadata CreateMetadataObject(Guid corrleationId) => new( + corrleationId.ToString(), + Guid.NewGuid().ToString(), + Guid.NewGuid().ToString(), + Guid.NewGuid().ToString(), + Guid.NewGuid().ToString()); + } +} diff --git a/src/Database/Api/Test/StorageMetadataWrapperTest.cs b/src/Database/EntityFramework/Test/StorageMetadataWrapperTest.cs similarity index 97% rename from src/Database/Api/Test/StorageMetadataWrapperTest.cs rename to src/Database/EntityFramework/Test/StorageMetadataWrapperTest.cs index e549bf809..c57da9734 100644 --- a/src/Database/Api/Test/StorageMetadataWrapperTest.cs +++ b/src/Database/EntityFramework/Test/StorageMetadataWrapperTest.cs @@ -16,9 +16,9 @@ using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Api.Storage; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; -namespace Monai.Deploy.InformaticsGateway.Database.Test +namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test { public class StorageMetadataWrapperTest { diff --git a/src/Database/EntityFramework/Test/Usings.cs b/src/Database/EntityFramework/Test/Usings.cs new file mode 100644 index 000000000..8c927eb74 --- /dev/null +++ b/src/Database/EntityFramework/Test/Usings.cs @@ -0,0 +1 @@ +global using Xunit; \ No newline at end of file diff --git a/src/InformaticsGateway/Common/PayloadExtensions.cs b/src/InformaticsGateway/Common/PayloadExtensions.cs deleted file mode 100644 index 190a65347..000000000 --- a/src/InformaticsGateway/Common/PayloadExtensions.cs +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2021-2022 MONAI Consortium - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Ardalis.GuardClauses; -using Microsoft.Extensions.Logging; -using Monai.Deploy.InformaticsGateway.Api.Storage; -using Monai.Deploy.InformaticsGateway.Database.Api; -using Monai.Deploy.InformaticsGateway.Logging; -using Polly; - -namespace Monai.Deploy.InformaticsGateway.Common -{ - internal static class PayloadExtensions - { - public static async Task UpdatePayload(this Payload payload, IEnumerable retryDelays, ILogger logger, IInformaticsGatewayRepository repository) - { - Guard.Against.Null(payload, nameof(payload)); - Guard.Against.NullOrEmpty(retryDelays, nameof(retryDelays)); - Guard.Against.Null(logger, nameof(logger)); - Guard.Against.Null(repository, nameof(repository)); - - await Policy - .Handle() - .WaitAndRetryAsync( - retryDelays, - (exception, timeSpan, retryCount, context) => - { - logger.ErrorSavingPayload(timeSpan, retryCount, exception); - }) - .ExecuteAsync(async () => - { - await repository.SaveChangesAsync().ConfigureAwait(false); - logger.PayloadSaved(payload.Id); - }) - .ConfigureAwait(false); - } - - public static async Task AddPayaloadToDatabase(this Payload payload, IEnumerable retryDelays, ILogger logger, IInformaticsGatewayRepository repository) - { - Guard.Against.Null(payload, nameof(payload)); - Guard.Against.NullOrEmpty(retryDelays, nameof(retryDelays)); - Guard.Against.Null(logger, nameof(logger)); - Guard.Against.Null(repository, nameof(repository)); - await Policy - .Handle() - .WaitAndRetryAsync( - retryDelays, - (exception, timeSpan, retryCount, context) => - { - logger.ErrorAddingPayload(timeSpan, retryCount, exception); - }) - .ExecuteAsync(async () => - { - await repository.AddAsync(payload).ConfigureAwait(false); - await repository.SaveChangesAsync().ConfigureAwait(false); - logger.PayloadAdded(payload.Id); - }) - .ConfigureAwait(false); - } - - public static async Task DeletePayload(this Payload payload, IEnumerable retryDelays, ILogger logger, IInformaticsGatewayRepository repository) - { - Guard.Against.Null(payload, nameof(payload)); - Guard.Against.NullOrEmpty(retryDelays, nameof(retryDelays)); - Guard.Against.Null(logger, nameof(logger)); - Guard.Against.Null(repository, nameof(repository)); - - await Policy - .Handle() - .WaitAndRetryAsync( - retryDelays, - (exception, timeSpan, retryCount, context) => - { - logger.ErrorDeletingPayload(timeSpan, retryCount, exception); - }) - .ExecuteAsync(async () => - { - repository.Remove(payload); - await repository.SaveChangesAsync().ConfigureAwait(false); - logger.PayloadDeleted(payload.Id); - }) - .ConfigureAwait(false); - } - } -} diff --git a/src/InformaticsGateway/Logging/Log.2000.InferenceRequestRepository.cs b/src/InformaticsGateway/Logging/Log.2000.InferenceRequestRepository.cs index 68ab07fab..ec28a1a8d 100644 --- a/src/InformaticsGateway/Logging/Log.2000.InferenceRequestRepository.cs +++ b/src/InformaticsGateway/Logging/Log.2000.InferenceRequestRepository.cs @@ -21,28 +21,6 @@ namespace Monai.Deploy.InformaticsGateway.Logging { public static partial class Log { - [LoggerMessage(EventId = 2000, Level = LogLevel.Error, Message = "Error saving inference request. Waiting {timeSpan} before next retry. Retry attempt {retryCount}.")] - public static partial void ErrorSavingInferenceRequest(this ILogger logger, TimeSpan timespan, int retryCount, Exception ex); - [LoggerMessage(EventId = 2001, Level = LogLevel.Debug, Message = "Inference request saved.")] - public static partial void InferenceRequestSaved(this ILogger logger); - - [LoggerMessage(EventId = 2002, Level = LogLevel.Warning, Message = "Exceeded maximum retries.")] - public static partial void InferenceRequestUpdateExceededMaximumRetries(this ILogger logger); - - [LoggerMessage(EventId = 2003, Level = LogLevel.Information, Message = "Will retry later.")] - public static partial void InferenceRequestUpdateRetryLater(this ILogger logger); - - [LoggerMessage(EventId = 2004, Level = LogLevel.Debug, Message = "Updating request {transactionId} to InProgress.")] - public static partial void InferenceRequestSetToInProgress(this ILogger logger, string transactionId); - - [LoggerMessage(EventId = 2005, Level = LogLevel.Debug, Message = "Updating inference request.")] - public static partial void InferenceRequestUpdateState(this ILogger logger); - - [LoggerMessage(EventId = 2006, Level = LogLevel.Information, Message = "Inference request updated.")] - public static partial void InferenceRequestUpdated(this ILogger logger); - - [LoggerMessage(EventId = 2007, Level = LogLevel.Error, Message = "Error while updating inference request. Waiting {timespan} before next retry. Retry attempt {retryCount}...")] - public static partial void InferenceRequestUpdateError(this ILogger logger, TimeSpan timespan, int retryCount, Exception ex); } } diff --git a/src/InformaticsGateway/Logging/Log.2100.StorageInfoWrapperRepository.cs b/src/InformaticsGateway/Logging/Log.2100.StorageInfoWrapperRepository.cs deleted file mode 100644 index 2161368fd..000000000 --- a/src/InformaticsGateway/Logging/Log.2100.StorageInfoWrapperRepository.cs +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2022 MONAI Consortium - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -using System; -using Microsoft.Extensions.Logging; - -namespace Monai.Deploy.InformaticsGateway.Logging -{ - public static partial class Log - { - [LoggerMessage(EventId = 2100, Level = LogLevel.Error, Message = "Error saving file storage object. Waiting {timeSpan} before next retry. Retry attempt {retryCount}.")] - public static partial void ErrorSavingFileStorageMetadata(this ILogger logger, TimeSpan timespan, int retryCount, Exception ex); - - [LoggerMessage(EventId = 2101, Level = LogLevel.Debug, Message = "Storage metadata saved to the database.")] - public static partial void StorageMetadataSaved(this ILogger logger); - - [LoggerMessage(EventId = 2102, Level = LogLevel.Error, Message = "Error deleting objects that are pending upload. Waiting {timeSpan} before next retry. Retry attempt {retryCount}.")] - public static partial void ErrorDeletingPendingUploads(this ILogger logger, TimeSpan timespan, int retryCount, Exception ex); - } -} diff --git a/src/InformaticsGateway/Logging/Log.3000.PayloadAssembler.cs b/src/InformaticsGateway/Logging/Log.3000.PayloadAssembler.cs index c0891be6f..ea27adfe0 100644 --- a/src/InformaticsGateway/Logging/Log.3000.PayloadAssembler.cs +++ b/src/InformaticsGateway/Logging/Log.3000.PayloadAssembler.cs @@ -24,9 +24,6 @@ public static partial class Log [LoggerMessage(EventId = 3000, Level = LogLevel.Information, Message = "[Startup] Removing payloads from database.")] public static partial void RemovingPendingPayloads(this ILogger logger); - [LoggerMessage(EventId = 3001, Level = LogLevel.Information, Message = "[Startup] Payload {payloadId} removed from database.")] - public static partial void PendingPayloadsRemoved(this ILogger logger, Guid payloadId); - [LoggerMessage(EventId = 3002, Level = LogLevel.Information, Message = "[Startup] {count} payloads restored from database.")] public static partial void TotalNumberOfPayloadsRemoved(this ILogger logger, int count); @@ -34,7 +31,7 @@ public static partial class Log public static partial void FileAddedToBucket(this ILogger logger, string key, int count); [LoggerMessage(EventId = 3004, Level = LogLevel.Trace, Message = "Number of incomplete payloads waiting for processing: {count}.")] - public static partial void BucketActive(this ILogger logger, int count); + public static partial void BucketsActive(this ILogger logger, int count); [LoggerMessage(EventId = 3005, Level = LogLevel.Trace, Message = "Checking elapsed time for bucket: {key}.")] public static partial void BucketElapsedTime(this ILogger logger, string key); diff --git a/src/InformaticsGateway/Program.cs b/src/InformaticsGateway/Program.cs index 271255416..6f186bd5a 100644 --- a/src/InformaticsGateway/Program.cs +++ b/src/InformaticsGateway/Program.cs @@ -29,6 +29,8 @@ using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; using Monai.Deploy.InformaticsGateway.Database; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Monai.Deploy.InformaticsGateway.Repositories; using Monai.Deploy.InformaticsGateway.Services.Common; using Monai.Deploy.InformaticsGateway.Services.Connectors; @@ -110,7 +112,7 @@ internal static IHostBuilder CreateHostBuilder(string[] args) => services.AddTransient(); services.AddTransient(); - services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); diff --git a/src/InformaticsGateway/Repositories/InferenceRequestRepository.cs b/src/InformaticsGateway/Repositories/InferenceRequestRepository.cs deleted file mode 100644 index a44cfdba7..000000000 --- a/src/InformaticsGateway/Repositories/InferenceRequestRepository.cs +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright 2021-2022 MONAI Consortium - * Copyright 2019-2021 NVIDIA Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -using System; -using System.Threading; -using System.Threading.Tasks; -using Ardalis.GuardClauses; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Api.Rest; -using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Database.Api; -using Monai.Deploy.InformaticsGateway.Logging; -using Polly; - -namespace Monai.Deploy.InformaticsGateway.Repositories -{ - public class InferenceRequestRepository : IInferenceRequestRepository - { - private readonly ILogger _logger; - private readonly IInformaticsGatewayRepository _inferenceRequestRepository; - private readonly IOptions _options; - - public ServiceStatus Status { get; set; } = ServiceStatus.Unknown; - - public InferenceRequestRepository( - ILogger logger, - IInformaticsGatewayRepository inferenceRequestRepository, - IOptions options) - { - _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - _inferenceRequestRepository = inferenceRequestRepository ?? throw new ArgumentNullException(nameof(inferenceRequestRepository)); - _options = options ?? throw new ArgumentNullException(nameof(options)); - } - - public async Task Add(InferenceRequest inferenceRequest) - { - Guard.Against.Null(inferenceRequest, nameof(inferenceRequest)); - - using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "TransactionId", inferenceRequest.TransactionId } }); - await Policy - .Handle() - .WaitAndRetryAsync( - _options.Value.Database.Retries.RetryDelays, - (exception, timeSpan, retryCount, context) => - { - _logger.ErrorSavingInferenceRequest(timeSpan, retryCount, exception); - }) - .ExecuteAsync(async () => - { - await _inferenceRequestRepository.AddAsync(inferenceRequest).ConfigureAwait(false); - await _inferenceRequestRepository.SaveChangesAsync().ConfigureAwait(false); - _inferenceRequestRepository.Detach(inferenceRequest); - _logger.InferenceRequestSaved(); - }) - .ConfigureAwait(false); - } - - public async Task Update(InferenceRequest inferenceRequest, InferenceRequestStatus status) - { - Guard.Against.Null(inferenceRequest, nameof(inferenceRequest)); - - using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "TransactionId", inferenceRequest.TransactionId } }); - - if (status == InferenceRequestStatus.Success) - { - inferenceRequest.State = InferenceRequestState.Completed; - inferenceRequest.Status = InferenceRequestStatus.Success; - } - else - { - if (++inferenceRequest.TryCount > _options.Value.Database.Retries.DelaysMilliseconds.Length) - { - _logger.InferenceRequestUpdateExceededMaximumRetries(); - inferenceRequest.State = InferenceRequestState.Completed; - inferenceRequest.Status = InferenceRequestStatus.Fail; - } - else - { - _logger.InferenceRequestUpdateRetryLater(); - inferenceRequest.State = InferenceRequestState.Queued; - } - } - - await Save(inferenceRequest).ConfigureAwait(false); - } - - public async Task Take(CancellationToken cancellationToken) - { - while (!cancellationToken.IsCancellationRequested) - { - var inferenceRequest = _inferenceRequestRepository.FirstOrDefault(p => p.State == InferenceRequestState.Queued); - - if (inferenceRequest is not null) - { - using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "TransactionId", inferenceRequest.TransactionId } }); - inferenceRequest.State = InferenceRequestState.InProcess; - _logger.InferenceRequestSetToInProgress(inferenceRequest.TransactionId); - await Save(inferenceRequest).ConfigureAwait(false); - return inferenceRequest; - } - await Task.Delay(250, cancellationToken).ConfigureAwait(false); - } - - throw new OperationCanceledException("cancellation requsted"); - } - - public InferenceRequest GetInferenceRequest(string transactionId) - { - Guard.Against.NullOrWhiteSpace(transactionId, nameof(transactionId)); - return _inferenceRequestRepository.FirstOrDefault(p => p.TransactionId.Equals(transactionId, StringComparison.OrdinalIgnoreCase)); - } - - public async Task GetInferenceRequest(Guid inferenceRequestId) - { - Guard.Against.NullOrEmpty(inferenceRequestId, nameof(inferenceRequestId)); - return await _inferenceRequestRepository.FindAsync(inferenceRequestId).ConfigureAwait(false); - } - - public bool Exists(string transactionId) - { - Guard.Against.NullOrWhiteSpace(transactionId, nameof(transactionId)); - return GetInferenceRequest(transactionId) is not null; - } - - public async Task GetStatus(string transactionId) - { - Guard.Against.NullOrWhiteSpace(transactionId, nameof(transactionId)); - - var response = new InferenceStatusResponse(); - var item = GetInferenceRequest(transactionId); - if (item is null) - { - return null; - } - - response.TransactionId = item.TransactionId; - - return await Task.FromResult(response).ConfigureAwait(false); - } - - private async Task Save(InferenceRequest inferenceRequest) - { - Guard.Against.Null(inferenceRequest, nameof(inferenceRequest)); - - await Policy - .Handle() - .WaitAndRetryAsync( - _options.Value.Database.Retries.RetryDelays, - (exception, timeSpan, retryCount, context) => - { - _logger.InferenceRequestUpdateError(timeSpan, retryCount, exception); - }) - .ExecuteAsync(async () => - { - _logger.InferenceRequestUpdateState(); - if (inferenceRequest.State == InferenceRequestState.Completed) - { - _inferenceRequestRepository.Detach(inferenceRequest); - } - await _inferenceRequestRepository.SaveChangesAsync().ConfigureAwait(false); - _logger.InferenceRequestUpdated(); - }) - .ConfigureAwait(false); - } - } -} diff --git a/src/InformaticsGateway/Repositories/StorageMetadataWrapperRepository.cs b/src/InformaticsGateway/Repositories/StorageMetadataWrapperRepository.cs deleted file mode 100644 index d82523520..000000000 --- a/src/InformaticsGateway/Repositories/StorageMetadataWrapperRepository.cs +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright 2021-2022 MONAI Consortium - * Copyright 2019-2021 NVIDIA Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Ardalis.GuardClauses; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Api.Rest; -using Monai.Deploy.InformaticsGateway.Api.Storage; -using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Database.Api; -using Monai.Deploy.InformaticsGateway.Logging; -using Polly; - -namespace Monai.Deploy.InformaticsGateway.Repositories -{ - public class StorageMetadataWrapperRepository : IStorageMetadataWrapperRepository - { - private readonly ILogger _logger; - private readonly IInformaticsGatewayRepository _repository; - private readonly IOptions _options; - - public ServiceStatus Status { get; set; } = ServiceStatus.Unknown; - - public StorageMetadataWrapperRepository( - ILogger logger, - IInformaticsGatewayRepository repository, - IOptions options) - { - _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - _repository = repository ?? throw new ArgumentNullException(nameof(repository)); - _options = options ?? throw new ArgumentNullException(nameof(options)); - } - - public async Task AddAsync(FileStorageMetadata metadata) - { - Guard.Against.Null(metadata, nameof(metadata)); - - using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "CorrelationId", metadata.CorrelationId }, { "Identity", metadata.Id } }); - await Policy - .Handle() - .WaitAndRetryAsync( - _options.Value.Database.Retries.RetryDelays, - (exception, timeSpan, retryCount, context) => - { - _logger.ErrorSavingFileStorageMetadata(timeSpan, retryCount, exception); - }) - .ExecuteAsync(async () => - { - var obj = new StorageMetadataWrapper(metadata); - await _repository.AddAsync(obj).ConfigureAwait(false); - await _repository.SaveChangesAsync().ConfigureAwait(false); - _repository.Detach(obj); - _logger.StorageMetadataSaved(); - }) - .ConfigureAwait(false); - } - - public async Task UpdateAsync(FileStorageMetadata metadata) - { - Guard.Against.Null(metadata, nameof(metadata)); - - using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "CorrelationId", metadata.CorrelationId }, { "Identity", metadata.Id } }); - await Policy - .Handle() - .WaitAndRetryAsync( - _options.Value.Database.Retries.RetryDelays, - (exception, timeSpan, retryCount, context) => - { - _logger.ErrorSavingFileStorageMetadata(timeSpan, retryCount, exception); - }) - .ExecuteAsync(async () => - { - var @object = _repository.FirstOrDefault(p => p.Identity == metadata.Id && p.CorrelationId == metadata.CorrelationId); - - if (@object is null) - { - throw new ArgumentException("Matching wrapper storage object not found"); - } - - @object.Update(metadata); - _repository.Update(@object); - await _repository.SaveChangesAsync().ConfigureAwait(false); - _repository.Detach(@object); - - _logger.StorageMetadataSaved(); - }) - .ConfigureAwait(false); - } - - public async Task AddOrUpdateAsync(FileStorageMetadata metadata) - { - Guard.Against.Null(metadata, nameof(metadata)); - - var existing = GetFileStorageMetdadata(metadata.CorrelationId, metadata.Id); - - if (existing is not null) - { - await UpdateAsync(metadata).ConfigureAwait(false); - } - else - { - await AddAsync(metadata).ConfigureAwait(false); - } - } - - public IList GetFileStorageMetdadata(string correlationId) - { - Guard.Against.NullOrWhiteSpace(correlationId, nameof(correlationId)); - - return _repository.AsQueryable().Where(p => p.CorrelationId == correlationId) - .Select(p => p.GetObject()) - .ToList(); - } - - public FileStorageMetadata GetFileStorageMetdadata(string correlationId, string identity) - { - Guard.Against.NullOrWhiteSpace(correlationId, nameof(correlationId)); - Guard.Against.NullOrWhiteSpace(identity, nameof(identity)); - - return _repository.FirstOrDefault(p => p.CorrelationId.Equals(correlationId, StringComparison.Ordinal) && p.Identity.Equals(identity, StringComparison.Ordinal))?.GetObject(); - } - - public async Task DeleteAsync(string correlationId, string identity) - { - Guard.Against.NullOrWhiteSpace(correlationId, nameof(correlationId)); - Guard.Against.NullOrWhiteSpace(identity, nameof(identity)); - - var toBeDeleted = _repository.FirstOrDefault(p => p.CorrelationId.Equals(correlationId, StringComparison.Ordinal) && p.Identity.Equals(identity, StringComparison.Ordinal)); - - if (toBeDeleted is not null) - { - _repository.Remove(toBeDeleted); - await _repository.SaveChangesAsync().ConfigureAwait(false); - return true; - } - return false; - } - - public async Task DeletePendingUploadsAsync() - { - await Policy - .Handle() - .WaitAndRetryAsync( - _options.Value.Database.Retries.RetryDelays, - (exception, timeSpan, retryCount, context) => - { - _logger.ErrorDeletingPendingUploads(timeSpan, retryCount, exception); - }) - .ExecuteAsync(async () => - { - var toBeDeleted = _repository.AsQueryable().Where(p => !p.IsUploaded); - - if (toBeDeleted.Any()) - { - _repository.RemoveRange(toBeDeleted.ToArray()); - await _repository.SaveChangesAsync().ConfigureAwait(false); - } - }).ConfigureAwait(false); - } - } -} diff --git a/src/InformaticsGateway/Services/Connectors/DataRetrievalService.cs b/src/InformaticsGateway/Services/Connectors/DataRetrievalService.cs index 6a804fbb1..88cf26757 100644 --- a/src/InformaticsGateway/Services/Connectors/DataRetrievalService.cs +++ b/src/InformaticsGateway/Services/Connectors/DataRetrievalService.cs @@ -34,11 +34,10 @@ using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.DicomWeb.Client; using Monai.Deploy.InformaticsGateway.DicomWeb.Client.API; using Monai.Deploy.InformaticsGateway.Logging; -using Monai.Deploy.InformaticsGateway.Repositories; using Monai.Deploy.InformaticsGateway.Services.Common; using Monai.Deploy.InformaticsGateway.Services.Storage; using Polly; @@ -123,12 +122,12 @@ private async Task BackgroundProcessing(CancellationToken cancellationToken) InferenceRequest request = null; try { - request = await repository.Take(cancellationToken).ConfigureAwait(false); + request = await repository.TakeAsync(cancellationToken).ConfigureAwait(false); using (_logger.BeginScope(new LoggingDataDictionary { { "TransactionId", request.TransactionId } })) { _logger.ProcessingInferenceRequest(); await ProcessRequest(request, cancellationToken).ConfigureAwait(false); - await repository.Update(request, InferenceRequestStatus.Success).ConfigureAwait(false); + await repository.UpdateAsync(request, InferenceRequestStatus.Success, cancellationToken).ConfigureAwait(false); _logger.InferenceRequestProcessed(); } } @@ -145,7 +144,7 @@ private async Task BackgroundProcessing(CancellationToken cancellationToken) _logger.ErrorProcessingInferenceRequest(request?.TransactionId, ex); if (request != null) { - await repository.Update(request, InferenceRequestStatus.Fail).ConfigureAwait(false); + await repository.UpdateAsync(request, InferenceRequestStatus.Fail, cancellationToken).ConfigureAwait(false); } } } @@ -155,10 +154,10 @@ private async Task BackgroundProcessing(CancellationToken cancellationToken) private async Task ProcessRequest(InferenceRequest inferenceRequest, CancellationToken cancellationToken) { - Guard.Against.Null(inferenceRequest, nameof(inferenceRequest)); + Guard.Against.Null(inferenceRequest); var retrievedFiles = new Dictionary(StringComparer.OrdinalIgnoreCase); - RestoreExistingInstances(inferenceRequest, retrievedFiles, cancellationToken); + await RestoreExistingInstances(inferenceRequest, retrievedFiles, cancellationToken).ConfigureAwait(false); foreach (var source in inferenceRequest.InputResources) { @@ -181,12 +180,12 @@ private async Task ProcessRequest(InferenceRequest inferenceRequest, Cancellatio } } - await NotifyNewInstance(inferenceRequest, retrievedFiles); + await NotifyNewInstance(inferenceRequest, retrievedFiles).ConfigureAwait(false); } private async Task NotifyNewInstance(InferenceRequest inferenceRequest, Dictionary retrievedFiles) { - Guard.Against.Null(inferenceRequest, nameof(inferenceRequest)); + Guard.Against.Null(inferenceRequest); if (retrievedFiles.IsNullOrEmpty()) { @@ -204,16 +203,16 @@ private async Task NotifyNewInstance(InferenceRequest inferenceRequest, Dictiona } } - private void RestoreExistingInstances(InferenceRequest inferenceRequest, Dictionary retrievedInstances, CancellationToken cancellationToken) + private async Task RestoreExistingInstances(InferenceRequest inferenceRequest, Dictionary retrievedInstances, CancellationToken cancellationToken) { - Guard.Against.Null(inferenceRequest, nameof(inferenceRequest)); - Guard.Against.Null(retrievedInstances, nameof(retrievedInstances)); + Guard.Against.Null(inferenceRequest); + Guard.Against.Null(retrievedInstances); using var scope = _serviceScopeFactory.CreateScope(); _logger.RestoringRetrievedFiles(); - var repository = _rootScope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IStorageMetadataWrapperRepository)); - var files = repository.GetFileStorageMetdadata(inferenceRequest.TransactionId); + var repository = _rootScope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IStorageMetadataRepository)); + var files = await repository.GetFileStorageMetdadataAsync(inferenceRequest.TransactionId, cancellationToken).ConfigureAwait(false); foreach (var file in files) { @@ -237,8 +236,8 @@ private void RestoreExistingInstances(InferenceRequest inferenceRequest, Diction private async Task RetrieveViaFhir(InferenceRequest inferenceRequest, RequestInputDataResource source, Dictionary retrievedResources, CancellationToken cancellationToken) { - Guard.Against.Null(inferenceRequest, nameof(inferenceRequest)); - Guard.Against.Null(retrievedResources, nameof(retrievedResources)); + Guard.Against.Null(inferenceRequest); + Guard.Against.Null(retrievedResources); foreach (var input in inferenceRequest.InputMetadata.Inputs) { @@ -256,10 +255,10 @@ private async Task RetrieveViaFhir(InferenceRequest inferenceRequest, RequestInp private async Task RetrieveFhirResources(string transactionId, InferenceRequestDetails requestDetails, RequestInputDataResource source, Dictionary retrievedResources, CancellationToken cancellationToken) { - Guard.Against.NullOrWhiteSpace(transactionId, nameof(transactionId)); - Guard.Against.Null(requestDetails, nameof(requestDetails)); - Guard.Against.Null(source, nameof(source)); - Guard.Against.Null(retrievedResources, nameof(retrievedResources)); + Guard.Against.NullOrWhiteSpace(transactionId); + Guard.Against.Null(requestDetails); + Guard.Against.Null(source); + Guard.Against.Null(retrievedResources); var pendingResources = new Queue(requestDetails.Resources.Where(p => !p.IsRetrieved)); @@ -305,12 +304,12 @@ private async Task RetrieveFhirResources(string transactionId, InferenceRequestD private async Task RetrieveFhirResource(string transactionId, HttpClient httpClient, FhirResource resource, RequestInputDataResource source, Dictionary retrievedResources, FhirStorageFormat fhirFormat, string acceptHeader, CancellationToken cancellationToken) { - Guard.Against.NullOrWhiteSpace(transactionId, nameof(transactionId)); - Guard.Against.Null(httpClient, nameof(httpClient)); - Guard.Against.Null(resource, nameof(resource)); - Guard.Against.Null(source, nameof(source)); - Guard.Against.Null(retrievedResources, nameof(retrievedResources)); - Guard.Against.NullOrWhiteSpace(acceptHeader, nameof(acceptHeader)); + Guard.Against.NullOrWhiteSpace(transactionId); + Guard.Against.Null(httpClient); + Guard.Against.Null(resource); + Guard.Against.Null(source); + Guard.Against.Null(retrievedResources); + Guard.Against.NullOrWhiteSpace(acceptHeader); var id = $"{resource.Type}/{resource.Id}"; if (retrievedResources.ContainsKey(id)) @@ -343,7 +342,7 @@ private async Task RetrieveFhirResource(string transactionId, HttpClient h } var fhirFile = new FhirFileStorageMetadata(transactionId, resource.Type, resource.Id, fhirFormat); - await fhirFile.SetDataStream(json, _options.Value.Storage.TemporaryDataStorage, _fileSystem, _options.Value.Storage.LocalTemporaryStoragePath); + await fhirFile.SetDataStream(json, _options.Value.Storage.TemporaryDataStorage, _fileSystem, _options.Value.Storage.LocalTemporaryStoragePath).ConfigureAwait(false); retrievedResources.Add(fhirFile.Id, fhirFile); return true; } @@ -356,8 +355,8 @@ private async Task RetrieveFhirResource(string transactionId, HttpClient h private async Task RetrieveViaDicomWeb(InferenceRequest inferenceRequest, RequestInputDataResource source, Dictionary retrievedInstance, CancellationToken cancellationToken) { - Guard.Against.Null(inferenceRequest, nameof(inferenceRequest)); - Guard.Against.Null(retrievedInstance, nameof(retrievedInstance)); + Guard.Against.Null(inferenceRequest); + Guard.Against.Null(retrievedInstance); var authenticationHeaderValue = AuthenticationHeaderValueExtensions.ConvertFrom(source.ConnectionDetails.AuthType, source.ConnectionDetails.AuthId); @@ -403,12 +402,12 @@ private async Task RetrieveViaDicomWeb(InferenceRequest inferenceRequest, Reques private async Task QueryStudies(string transactionId, DicomWebClient dicomWebClient, InferenceRequest inferenceRequest, Dictionary retrievedInstance, string dicomTag, string queryValue, CancellationToken cancellationToken) { - Guard.Against.NullOrWhiteSpace(transactionId, nameof(transactionId)); - Guard.Against.Null(dicomWebClient, nameof(dicomWebClient)); - Guard.Against.Null(inferenceRequest, nameof(inferenceRequest)); - Guard.Against.Null(retrievedInstance, nameof(retrievedInstance)); - Guard.Against.NullOrWhiteSpace(dicomTag, nameof(dicomTag)); - Guard.Against.NullOrWhiteSpace(queryValue, nameof(queryValue)); + Guard.Against.NullOrWhiteSpace(transactionId); + Guard.Against.Null(dicomWebClient); + Guard.Against.Null(inferenceRequest); + Guard.Against.Null(retrievedInstance); + Guard.Against.NullOrWhiteSpace(dicomTag); + Guard.Against.NullOrWhiteSpace(queryValue); _logger.PerformQido(dicomTag, queryValue); var queryParams = new Dictionary(StringComparer.OrdinalIgnoreCase) @@ -446,9 +445,9 @@ private async Task QueryStudies(string transactionId, DicomWebClient dicomWebCli private async Task RetrieveStudies(string transactionId, IDicomWebClient dicomWebClient, IList studies, Dictionary retrievedInstance, CancellationToken cancellationToken) { - Guard.Against.NullOrWhiteSpace(transactionId, nameof(transactionId)); - Guard.Against.Null(studies, nameof(studies)); - Guard.Against.Null(retrievedInstance, nameof(retrievedInstance)); + Guard.Against.NullOrWhiteSpace(transactionId); + Guard.Against.Null(studies); + Guard.Against.Null(retrievedInstance); foreach (var study in studies) { @@ -471,9 +470,9 @@ private async Task RetrieveStudies(string transactionId, IDicomWebClient dicomWe private async Task RetrieveSeries(string transactionId, IDicomWebClient dicomWebClient, RequestedStudy study, Dictionary retrievedInstance, CancellationToken cancellationToken) { - Guard.Against.NullOrWhiteSpace(transactionId, nameof(transactionId)); - Guard.Against.Null(study, nameof(study)); - Guard.Against.Null(retrievedInstance, nameof(retrievedInstance)); + Guard.Against.NullOrWhiteSpace(transactionId); + Guard.Against.Null(study); + Guard.Against.Null(retrievedInstance); foreach (var series in study.Series) { @@ -496,10 +495,10 @@ private async Task RetrieveSeries(string transactionId, IDicomWebClient dicomWeb private async Task RetrieveInstances(string transactionId, IDicomWebClient dicomWebClient, string studyInstanceUid, RequestedSeries series, Dictionary retrievedInstance, CancellationToken cancellationToken) { - Guard.Against.NullOrWhiteSpace(transactionId, nameof(transactionId)); - Guard.Against.NullOrWhiteSpace(studyInstanceUid, nameof(studyInstanceUid)); - Guard.Against.Null(series, nameof(series)); - Guard.Against.Null(retrievedInstance, nameof(retrievedInstance)); + Guard.Against.NullOrWhiteSpace(transactionId); + Guard.Against.NullOrWhiteSpace(studyInstanceUid); + Guard.Against.Null(series); + Guard.Against.Null(retrievedInstance); var count = retrievedInstance.Count; foreach (var instance in series.Instances) @@ -531,9 +530,9 @@ private async Task RetrieveInstances(string transactionId, IDicomWebClient dicom private async Task SaveFiles(string transactionId, IAsyncEnumerable files, Dictionary retrievedInstance, CancellationToken cancellationToken) { - Guard.Against.NullOrWhiteSpace(transactionId, nameof(transactionId)); - Guard.Against.Null(files, nameof(files)); - Guard.Against.Null(retrievedInstance, nameof(retrievedInstance)); + Guard.Against.NullOrWhiteSpace(transactionId); + Guard.Against.Null(files); + Guard.Against.Null(retrievedInstance); var count = retrievedInstance.Count; await foreach (var file in files) @@ -557,10 +556,10 @@ private async Task SaveFiles(string transactionId, IAsyncEnumerable f } } - private DicomFileStorageMetadata SaveFile(string transactionId, DicomFile file, StudySerieSopUids uids) + private static DicomFileStorageMetadata SaveFile(string transactionId, DicomFile file, StudySerieSopUids uids) { - Guard.Against.Null(transactionId, nameof(transactionId)); - Guard.Against.Null(file, nameof(file)); + Guard.Against.Null(transactionId); + Guard.Against.Null(file); return new DicomFileStorageMetadata(transactionId, uids.Identifier, uids.StudyInstanceUid, uids.SeriesInstanceUid, uids.SopInstanceUid) { diff --git a/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs b/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs index 27bbdf55f..2be3aad54 100644 --- a/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadAssembler.cs @@ -17,7 +17,6 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; -using System.Linq; using System.Threading; using System.Threading.Tasks; using Ardalis.GuardClauses; @@ -27,9 +26,8 @@ using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Api.Storage; -using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; namespace Monai.Deploy.InformaticsGateway.Services.Connectors @@ -46,6 +44,7 @@ internal sealed partial class PayloadAssembler : IPayloadAssembler, IDisposable private readonly IServiceScopeFactory _serviceScopeFactory; private readonly ConcurrentDictionary> _payloads; + private readonly Task _intializedTask; private readonly BlockingCollection _workItems; private readonly System.Timers.Timer _timer; @@ -61,7 +60,7 @@ public PayloadAssembler( _workItems = new BlockingCollection(); _payloads = new ConcurrentDictionary>(); - RemovePendingPayloads(); + _intializedTask = RemovePendingPayloads(); _timer = new System.Timers.Timer(1000) { @@ -71,20 +70,13 @@ public PayloadAssembler( _timer.Enabled = true; } - private void RemovePendingPayloads() + private async Task RemovePendingPayloads() { _logger.RemovingPendingPayloads(); var scope = _serviceScopeFactory.CreateScope(); - var repository = scope.ServiceProvider.GetRequiredService>(); + var repository = scope.ServiceProvider.GetRequiredService(); - var payloads = repository.AsQueryable().Where(p => p.State == Payload.PayloadState.Created); - var removed = 0; - - foreach (var payload in payloads) - { - payload.DeletePayload(_options.Value.Storage.Retries.RetryDelays, _logger, repository).Wait(); - _logger.PendingPayloadsRemoved(payload.Id); - } + var removed = await repository.RemovePendingPayloadsAsync().ConfigureAwait(false); _logger.TotalNumberOfPayloadsRemoved(removed); } @@ -104,7 +96,9 @@ private void RemovePendingPayloads() /// Number of seconds the bucket shall wait before sending the payload to be processed. Note: timeout cannot be modified once the bucket is created. public async Task Queue(string bucket, FileStorageMetadata file, uint timeout) { - Guard.Against.Null(file, nameof(file)); + Guard.Against.Null(file); + + await _intializedTask.ConfigureAwait(false); using var _ = _logger.BeginScope(new LoggingDataDictionary() { { "CorrelationId", file.CorrelationId } }); @@ -128,8 +122,9 @@ private async void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e) { try { + await _intializedTask.ConfigureAwait(false); _timer.Enabled = false; - _logger.BucketActive(_payloads.Count); + _logger.BucketsActive(_payloads.Count); foreach (var key in _payloads.Keys) { _logger.BucketElapsedTime(key); @@ -137,7 +132,7 @@ private async void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e) using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "CorrelationId", payload.CorrelationId } }); if (payload.HasTimedOut) { - if (payload.ContainerUploadFailures()) + if (payload.AnyUploadFailures()) { _payloads.TryRemove(key, out _); _logger.PayloadRemovedWithFailureUploads(key); @@ -176,8 +171,8 @@ private async Task QueueBucketForNotification(string key, Payload payload) { payload.State = Payload.PayloadState.Move; var scope = _serviceScopeFactory.CreateScope(); - var repository = scope.ServiceProvider.GetRequiredService>(); - await payload.UpdatePayload(_options.Value.Database.Retries.RetryDelays, _logger, repository).ConfigureAwait(false); + var repository = scope.ServiceProvider.GetRequiredService(); + await repository.UpdateAsync(payload).ConfigureAwait(false); _workItems.Add(payload); _logger.BucketReady(key, payload.Count); } @@ -199,9 +194,9 @@ private async Task CreateOrGetPayload(string key, string correationId, return await _payloads.GetOrAdd(key, x => new AsyncLazy(async () => { var scope = _serviceScopeFactory.CreateScope(); - var repository = scope.ServiceProvider.GetRequiredService>(); + var repository = scope.ServiceProvider.GetRequiredService(); var newPayload = new Payload(key, correationId, timeout); - await newPayload.AddPayaloadToDatabase(_options.Value.Database.Retries.RetryDelays, _logger, repository).ConfigureAwait(false); + await repository.AddAsync(newPayload).ConfigureAwait(false); _logger.BucketCreated(key, timeout); return newPayload; })); diff --git a/src/InformaticsGateway/Services/Connectors/PayloadExtensions.cs b/src/InformaticsGateway/Services/Connectors/PayloadExtensions.cs index d0a4678b4..921d0f1a8 100644 --- a/src/InformaticsGateway/Services/Connectors/PayloadExtensions.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadExtensions.cs @@ -28,7 +28,7 @@ public static bool IsUploadCompleted(this Payload payload) return payload.Files.All(p => p.IsUploaded); } - public static bool ContainerUploadFailures(this Payload payload) + public static bool AnyUploadFailures(this Payload payload) { return payload.Files.Any(p => p.IsUploadFailed); } diff --git a/src/InformaticsGateway/Services/Connectors/PayloadMoveActionHandler.cs b/src/InformaticsGateway/Services/Connectors/PayloadMoveActionHandler.cs index 71954c55e..ecda85342 100644 --- a/src/InformaticsGateway/Services/Connectors/PayloadMoveActionHandler.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadMoveActionHandler.cs @@ -27,7 +27,7 @@ using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; using Monai.Deploy.Storage.API; @@ -80,7 +80,7 @@ public async Task MoveFilesAsync(Payload payload, ActionBlock moveQueue catch (Exception ex) { payload.RetryCount++; - var action = await UpdatePayloadState(payload, ex).ConfigureAwait(false); + var action = await UpdatePayloadState(payload, ex, cancellationToken).ConfigureAwait(false); if (action == PayloadAction.Updated) { await moveQueue.Post(payload, _options.Value.Storage.Retries.RetryDelays.ElementAt(payload.RetryCount - 1)).ConfigureAwait(false); @@ -93,7 +93,7 @@ public async Task MoveFilesAsync(Payload payload, ActionBlock moveQueue } } - private async Task NotifyIfCompleted(Payload payload, ActionBlock notificationQueue) + private async Task NotifyIfCompleted(Payload payload, ActionBlock notificationQueue, CancellationToken cancellationToken = default) { Guard.Against.Null(payload, nameof(payload)); Guard.Against.Null(notificationQueue, nameof(notificationQueue)); @@ -104,8 +104,8 @@ private async Task NotifyIfCompleted(Payload payload, ActionBlock notif payload.ResetRetry(); var scope = _serviceScopeFactory.CreateScope(); - var repository = scope.ServiceProvider.GetService>() ?? throw new ServiceNotFoundException(nameof(IInformaticsGatewayRepository)); - await payload.UpdatePayload(_options.Value.Storage.Retries.RetryDelays, _logger, repository).ConfigureAwait(false); + var repository = scope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IPayloadRepository)); + await repository.UpdateAsync(payload, cancellationToken).ConfigureAwait(false); notificationQueue.Post(payload); _logger.PayloadReadyToBePublished(payload.Id); @@ -163,25 +163,25 @@ await _storageService.CopyObjectAsync( file.SetMoved(_options.Value.Storage.StorageServiceBucketName); } - private async Task UpdatePayloadState(Payload payload, Exception ex) + private async Task UpdatePayloadState(Payload payload, Exception ex, CancellationToken cancellationToken = default) { Guard.Against.Null(payload, nameof(payload)); var scope = _serviceScopeFactory.CreateScope(); - var repository = scope.ServiceProvider.GetService>() ?? throw new ServiceNotFoundException(nameof(IInformaticsGatewayRepository)); + var repository = scope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IPayloadRepository)); try { if (payload.RetryCount > _options.Value.Storage.Retries.DelaysMilliseconds.Length) { _logger.MoveFailureStopRetry(payload.Id, ex); - await payload.DeletePayload(_options.Value.Database.Retries.RetryDelays, _logger, repository).ConfigureAwait(false); + await repository.RemoveAsync(payload, cancellationToken).ConfigureAwait(false); return PayloadAction.Deleted; } else { _logger.MoveFailureRetryLater(payload.Id, payload.State, payload.RetryCount, ex); - await payload.UpdatePayload(_options.Value.Database.Retries.RetryDelays, _logger, repository).ConfigureAwait(false); + await repository.UpdateAsync(payload, cancellationToken).ConfigureAwait(false); return PayloadAction.Updated; } } diff --git a/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs b/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs index 42d21b18e..e2f5fc7b1 100644 --- a/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadNotificationActionHandler.cs @@ -26,8 +26,7 @@ using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Database.Api; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; using Monai.Deploy.Messaging.API; using Monai.Deploy.Messaging.Events; @@ -62,8 +61,8 @@ public PayloadNotificationActionHandler(IServiceScopeFactory serviceScopeFactory public async Task NotifyAsync(Payload payload, ActionBlock notificationQueue, CancellationToken cancellationToken = default) { - Guard.Against.Null(payload, nameof(payload)); - Guard.Against.Null(notificationQueue, nameof(notificationQueue)); + Guard.Against.Null(payload); + Guard.Against.Null(notificationQueue); if (payload.State != Payload.PayloadState.Notify) { @@ -73,12 +72,12 @@ public async Task NotifyAsync(Payload payload, ActionBlock notification try { await NotifyPayloadReady(payload).ConfigureAwait(false); - await DeletePayload(payload).ConfigureAwait(false); + await DeletePayload(payload, cancellationToken).ConfigureAwait(false); } catch (Exception ex) { payload.RetryCount++; - var action = await UpdatePayloadState(payload).ConfigureAwait(false); + var action = await UpdatePayloadState(payload, cancellationToken).ConfigureAwait(false); if (action == PayloadAction.Updated) { await notificationQueue.Post(payload, _options.Value.Messaging.Retries.RetryDelays.ElementAt(payload.RetryCount - 1)).ConfigureAwait(false); @@ -87,18 +86,18 @@ public async Task NotifyAsync(Payload payload, ActionBlock notification } } - private async Task DeletePayload(Payload payload) + private async Task DeletePayload(Payload payload, CancellationToken cancellationToken = default) { - Guard.Against.Null(payload, nameof(payload)); + Guard.Against.Null(payload); var scope = _serviceScopeFactory.CreateScope(); - var repository = scope.ServiceProvider.GetService>() ?? throw new ServiceNotFoundException(nameof(IInformaticsGatewayRepository)); - await payload.DeletePayload(_options.Value.Storage.Retries.RetryDelays, _logger, repository).ConfigureAwait(false); + var repository = scope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IPayloadRepository)); + await repository.RemoveAsync(payload, cancellationToken).ConfigureAwait(false); } private async Task NotifyPayloadReady(Payload payload) { - Guard.Against.Null(payload, nameof(payload)); + Guard.Against.Null(payload); _logger.GenerateWorkflowRequest(payload.Id); @@ -132,25 +131,25 @@ await messageBrokerPublisherService.Publish( _logger.WorkflowRequestPublished(_options.Value.Messaging.Topics.WorkflowRequest, message.MessageId, payload.Elapsed); } - private async Task UpdatePayloadState(Payload payload) + private async Task UpdatePayloadState(Payload payload, CancellationToken cancellationToken = default) { - Guard.Against.Null(payload, nameof(payload)); + Guard.Against.Null(payload); var scope = _serviceScopeFactory.CreateScope(); - var repository = scope.ServiceProvider.GetService>() ?? throw new ServiceNotFoundException(nameof(IInformaticsGatewayRepository)); + var repository = scope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IPayloadRepository)); try { if (payload.RetryCount > _options.Value.Storage.Retries.DelaysMilliseconds.Length) { _logger.NotificationFailureStopRetry(payload.Id); - await payload.DeletePayload(_options.Value.Storage.Retries.RetryDelays, _logger, repository).ConfigureAwait(false); + await repository.RemoveAsync(payload, cancellationToken).ConfigureAwait(false); return PayloadAction.Deleted; } else { _logger.NotificationFailureRetryLater(payload.Id, payload.State, payload.RetryCount); - await payload.UpdatePayload(_options.Value.Storage.Retries.RetryDelays, _logger, repository).ConfigureAwait(false); + await repository.UpdateAsync(payload, cancellationToken).ConfigureAwait(false); return PayloadAction.Updated; } } diff --git a/src/InformaticsGateway/Services/Connectors/PayloadNotificationService.cs b/src/InformaticsGateway/Services/Connectors/PayloadNotificationService.cs index 8aa4b77a2..8554cafa2 100644 --- a/src/InformaticsGateway/Services/Connectors/PayloadNotificationService.cs +++ b/src/InformaticsGateway/Services/Connectors/PayloadNotificationService.cs @@ -15,7 +15,6 @@ */ using System; -using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Threading.Tasks.Dataflow; @@ -29,7 +28,7 @@ using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; using Monai.Deploy.InformaticsGateway.Services.Common; @@ -89,7 +88,7 @@ public PayloadNotificationService(IServiceScopeFactory serviceScopeFactory, _cancellationTokenSource = new CancellationTokenSource(); } - public Task StartAsync(CancellationToken cancellationToken) + public async Task StartAsync(CancellationToken cancellationToken) { _moveFileQueue = new ActionBlock( MoveActionHandler, @@ -109,7 +108,7 @@ public Task StartAsync(CancellationToken cancellationToken) CancellationToken = cancellationToken }); - RestoreFromDatabase(); + await RestoreFromDatabaseAsync(cancellationToken).ConfigureAwait(false); var task = Task.Run(() => { @@ -120,13 +119,14 @@ public Task StartAsync(CancellationToken cancellationToken) _logger.ServiceStarted(ServiceName); if (task.IsCompleted) - return task; - return Task.CompletedTask; + await task.ConfigureAwait(false); + + await Task.CompletedTask.ConfigureAwait(false); } private async Task NotificationHandler(Payload payload) { - Guard.Against.Null(payload, nameof(payload)); + Guard.Against.Null(payload); using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "Payload", payload.Id }, { "CorrelationId", payload.CorrelationId } }); @@ -150,7 +150,7 @@ private async Task NotificationHandler(Payload payload) private async Task MoveActionHandler(Payload payload) { - Guard.Against.Null(payload, nameof(payload)); + Guard.Against.Null(payload); using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "Payload", payload.Id }, { "CorrelationId", payload.CorrelationId } }); @@ -202,14 +202,14 @@ private void BackgroundProcessing(CancellationToken cancellationToken) _logger.ServiceCancelled(ServiceName); } - private void RestoreFromDatabase() + private async Task RestoreFromDatabaseAsync(CancellationToken cancellationToken) { _logger.StartupRestoreFromDatabase(); var scope = _serviceScopeFactory.CreateScope(); - var repository = scope.ServiceProvider.GetService>() ?? throw new ServiceNotFoundException(nameof(IInformaticsGatewayRepository)); + var repository = scope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IPayloadRepository)); - var payloads = repository.AsQueryable().Where(p => SupportedStates.Contains(p.State)); + var payloads = await repository.GetPayloadsInStateAsync(cancellationToken, SupportedStates).ConfigureAwait(false); foreach (var payload in payloads) { if (payload.State == Payload.PayloadState.Move) @@ -221,7 +221,7 @@ private void RestoreFromDatabase() _publishQueue.Post(payload); } } - _logger.RestoredFromDatabase(payloads.Count()); + _logger.RestoredFromDatabase(payloads.Count); } public async Task StopAsync(CancellationToken cancellationToken) diff --git a/src/InformaticsGateway/Services/Export/DicomWebExportService.cs b/src/InformaticsGateway/Services/Export/DicomWebExportService.cs index 22d51bce7..8226b16a8 100644 --- a/src/InformaticsGateway/Services/Export/DicomWebExportService.cs +++ b/src/InformaticsGateway/Services/Export/DicomWebExportService.cs @@ -30,10 +30,10 @@ using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.DicomWeb.Client; using Monai.Deploy.InformaticsGateway.DicomWeb.Client.API; using Monai.Deploy.InformaticsGateway.Logging; -using Monai.Deploy.InformaticsGateway.Repositories; using Monai.Deploy.InformaticsGateway.Services.Common; using Monai.Deploy.Messaging.Events; using Polly; @@ -90,11 +90,11 @@ protected override async Task ExportDataBlockCallback( private async Task HandleTransaction(ExportRequestDataMessage exportRequestData, IInferenceRequestRepository repository, string transaction, CancellationToken cancellationToken) { - Guard.Against.Null(exportRequestData, nameof(exportRequestData)); - Guard.Against.Null(repository, nameof(repository)); - Guard.Against.NullOrWhiteSpace(transaction, nameof(transaction)); + Guard.Against.Null(exportRequestData); + Guard.Against.Null(repository); + Guard.Against.NullOrWhiteSpace(transaction); - var inferenceRequest = repository.GetInferenceRequest(transaction); + var inferenceRequest = await repository.GetInferenceRequestAsync(transaction, cancellationToken).ConfigureAwait(false); if (inferenceRequest is null) { var errorMessage = $"The specified inference request '{transaction}' cannot be found and will not be exported."; @@ -166,7 +166,7 @@ await Policy private void CheckAndLogResult(DicomWebResponse result) { - Guard.Against.Null(result, nameof(result)); + Guard.Against.Null(result); switch (result.StatusCode) { case System.Net.HttpStatusCode.OK: diff --git a/src/InformaticsGateway/Services/Export/ScuExportService.cs b/src/InformaticsGateway/Services/Export/ScuExportService.cs index 5e1b987cf..9d3ddc52b 100644 --- a/src/InformaticsGateway/Services/Export/ScuExportService.cs +++ b/src/InformaticsGateway/Services/Export/ScuExportService.cs @@ -29,7 +29,7 @@ using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; using Monai.Deploy.Messaging.Events; using Polly; @@ -83,7 +83,7 @@ private async Task HandleDesination(ExportRequestDataMessage exportRequestData, DestinationApplicationEntity destination = null; try { - destination = LookupDestination(destinationName); + destination = await LookupDestinationAsync(destinationName, cancellationToken).ConfigureAwait(false); } catch (ConfigurationException ex) { @@ -133,7 +133,7 @@ await Policy } } - private DestinationApplicationEntity LookupDestination(string destinationName) + private async Task LookupDestinationAsync(string destinationName, CancellationToken cancellationToken) { if (string.IsNullOrWhiteSpace(destinationName)) { @@ -141,8 +141,8 @@ private DestinationApplicationEntity LookupDestination(string destinationName) } using var scope = _serviceScopeFactory.CreateScope(); - var repository = scope.ServiceProvider.GetRequiredService>(); - var destination = repository.FirstOrDefault(p => p.Name.Equals(destinationName, StringComparison.InvariantCultureIgnoreCase)); + var repository = scope.ServiceProvider.GetRequiredService(); + var destination = await repository.FindByNameAsync(destinationName, cancellationToken).ConfigureAwait(false); if (destination is null) { diff --git a/src/InformaticsGateway/Services/Http/DestinationAeTitleController.cs b/src/InformaticsGateway/Services/Http/DestinationAeTitleController.cs index 468a312c7..09326de1d 100644 --- a/src/InformaticsGateway/Services/Http/DestinationAeTitleController.cs +++ b/src/InformaticsGateway/Services/Http/DestinationAeTitleController.cs @@ -25,7 +25,7 @@ using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; using Monai.Deploy.InformaticsGateway.Services.Scu; @@ -36,12 +36,12 @@ namespace Monai.Deploy.InformaticsGateway.Services.Http public class DestinationAeTitleController : ControllerBase { private readonly ILogger _logger; - private readonly IInformaticsGatewayRepository _repository; + private readonly IDestinationApplicationEntityRepository _repository; private readonly IScuQueue _scuQueue; public DestinationAeTitleController( ILogger logger, - IInformaticsGatewayRepository repository, + IDestinationApplicationEntityRepository repository, IScuQueue scuQueue) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); @@ -57,7 +57,7 @@ public async Task>> Get() { try { - return Ok(await _repository.ToListAsync().ConfigureAwait(false)); + return Ok(await _repository.ToListAsync(HttpContext.RequestAborted).ConfigureAwait(false)); } catch (Exception ex) { @@ -75,7 +75,7 @@ public async Task> GetAeTitle(string { try { - var destinationApplicationEntity = await _repository.FindAsync(name).ConfigureAwait(false); + var destinationApplicationEntity = await _repository.FindByNameAsync(name, HttpContext.RequestAborted).ConfigureAwait(false); if (destinationApplicationEntity is null) { @@ -108,7 +108,7 @@ public async Task CEcho(string name) return NotFound(); } - var destinationApplicationEntity = await _repository.FindAsync(name).ConfigureAwait(false); + var destinationApplicationEntity = await _repository.FindByNameAsync(name, HttpContext.RequestAborted).ConfigureAwait(false); if (destinationApplicationEntity is null) { @@ -153,10 +153,9 @@ public async Task> Create(DestinationApplicationEntity item { item.SetDefaultValues(); - ValidateCreate(item); + await ValidateCreateAsync(item).ConfigureAwait(false); - await _repository.AddAsync(item).ConfigureAwait(false); - await _repository.SaveChangesAsync().ConfigureAwait(false); + await _repository.AddAsync(item, HttpContext.RequestAborted).ConfigureAwait(false); _logger.DestinationApplicationEntityAdded(item.AeTitle, item.HostIp); return CreatedAtAction(nameof(GetAeTitle), new { name = item.Name }, item); } @@ -189,7 +188,7 @@ public async Task> Edit(DestinationAp return NotFound(); } - var destinationApplicationEntity = await _repository.FindAsync(item.Name).ConfigureAwait(false); + var destinationApplicationEntity = await _repository.FindByNameAsync(item.Name, HttpContext.RequestAborted).ConfigureAwait(false); if (destinationApplicationEntity is null) { return NotFound(); @@ -201,10 +200,9 @@ public async Task> Edit(DestinationAp destinationApplicationEntity.HostIp = item.HostIp; destinationApplicationEntity.Port = item.Port; - ValidateUpdate(destinationApplicationEntity); + await ValidateUpdateAsync(destinationApplicationEntity).ConfigureAwait(false); - _ = _repository.Update(destinationApplicationEntity); - await _repository.SaveChangesAsync(HttpContext.RequestAborted).ConfigureAwait(false); + _ = _repository.UpdateAsync(destinationApplicationEntity, HttpContext.RequestAborted); _logger.DestinationApplicationEntityUpdated(item.Name, item.AeTitle, item.HostIp, item.Port); return Ok(destinationApplicationEntity); } @@ -228,14 +226,13 @@ public async Task> Delete(string name { try { - var destinationApplicationEntity = await _repository.FindAsync(name).ConfigureAwait(false); + var destinationApplicationEntity = await _repository.FindByNameAsync(name, HttpContext.RequestAborted).ConfigureAwait(false); if (destinationApplicationEntity is null) { return NotFound(); } - _repository.Remove(destinationApplicationEntity); - await _repository.SaveChangesAsync().ConfigureAwait(false); + await _repository.RemoveAsync(destinationApplicationEntity, HttpContext.RequestAborted).ConfigureAwait(false); _logger.DestinationApplicationEntityDeleted(name); return Ok(destinationApplicationEntity); @@ -247,13 +244,13 @@ public async Task> Delete(string name } } - private void ValidateCreate(DestinationApplicationEntity item) + private async Task ValidateCreateAsync(DestinationApplicationEntity item) { - if (_repository.Any(p => p.Name.Equals(item.Name))) + if (await _repository.ContainsAsync(p => p.Name.Equals(item.Name), HttpContext.RequestAborted).ConfigureAwait(false)) { throw new ObjectExistsException($"A DICOM destination with the same name '{item.Name}' already exists."); } - if (_repository.Any(p => p.AeTitle.Equals(item.AeTitle) && p.HostIp.Equals(item.HostIp) && p.Port.Equals(item.Port))) + if (await _repository.ContainsAsync(p => p.AeTitle.Equals(item.AeTitle) && p.HostIp.Equals(item.HostIp) && p.Port.Equals(item.Port), HttpContext.RequestAborted).ConfigureAwait(false)) { throw new ObjectExistsException($"A DICOM destination with the same AE Title '{item.AeTitle}', host/IP Address '{item.HostIp}' and port '{item.Port}' already exists."); } @@ -263,9 +260,9 @@ private void ValidateCreate(DestinationApplicationEntity item) } } - private void ValidateUpdate(DestinationApplicationEntity item) + private async Task ValidateUpdateAsync(DestinationApplicationEntity item) { - if (_repository.Any(p => !p.Name.Equals(item.Name) && p.AeTitle.Equals(item.AeTitle) && p.HostIp.Equals(item.HostIp) && p.Port.Equals(item.Port))) + if (await _repository.ContainsAsync(p => !p.Name.Equals(item.Name) && p.AeTitle.Equals(item.AeTitle) && p.HostIp.Equals(item.HostIp) && p.Port.Equals(item.Port), HttpContext.RequestAborted).ConfigureAwait(false)) { throw new ObjectExistsException($"A DICOM destination with the same AE Title '{item.AeTitle}', host/IP Address '{item.HostIp}' and port '{item.Port}' already exists."); } diff --git a/src/InformaticsGateway/Services/Http/InferenceController.cs b/src/InformaticsGateway/Services/Http/InferenceController.cs index 69300f256..1ce974a90 100644 --- a/src/InformaticsGateway/Services/Http/InferenceController.cs +++ b/src/InformaticsGateway/Services/Http/InferenceController.cs @@ -24,8 +24,8 @@ using Microsoft.Extensions.Logging; using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Api.Rest; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; -using Monai.Deploy.InformaticsGateway.Repositories; namespace Monai.Deploy.InformaticsGateway.Services.Http { @@ -51,11 +51,11 @@ public InferenceController( [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task JobStatus(string transactionId) { - Guard.Against.NullOrWhiteSpace(transactionId, nameof(transactionId)); + Guard.Against.NullOrWhiteSpace(transactionId); try { - var status = await _inferenceRequestRepository.GetStatus(transactionId).ConfigureAwait(false); + var status = await _inferenceRequestRepository.GetStatusAsync(transactionId, HttpContext.RequestAborted).ConfigureAwait(false); if (status is null) { @@ -80,7 +80,7 @@ public async Task JobStatus(string transactionId) [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task NewInferenceRequest([FromBody] InferenceRequest request) { - Guard.Against.Null(request, nameof(request)); + Guard.Against.Null(request); if (!request.IsValid(out var details)) { @@ -88,15 +88,15 @@ public async Task NewInferenceRequest([FromBody] InferenceRequest } using var _ = _logger.BeginScope(new LoggingDataDictionary { { "TransactionId", request.TransactionId } }); - - if (_inferenceRequestRepository.Exists(request.TransactionId)) - { - return Problem(title: "Conflict", statusCode: (int)HttpStatusCode.Conflict, detail: "An existing request with same transaction ID already exists."); - } - try { - await _inferenceRequestRepository.Add(request).ConfigureAwait(false); + + if (await _inferenceRequestRepository.ExistsAsync(request.TransactionId, HttpContext.RequestAborted).ConfigureAwait(false)) + { + return Problem(title: "Conflict", statusCode: (int)HttpStatusCode.Conflict, detail: "An existing request with same transaction ID already exists."); + } + + await _inferenceRequestRepository.AddAsync(request, HttpContext.RequestAborted).ConfigureAwait(false); } catch (Exception ex) { diff --git a/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs b/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs index 2ace1759d..e3e69ac24 100644 --- a/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs +++ b/src/InformaticsGateway/Services/Http/MonaiAeTitleController.cs @@ -26,7 +26,7 @@ using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; using Monai.Deploy.InformaticsGateway.Services.Scp; @@ -37,13 +37,13 @@ namespace Monai.Deploy.InformaticsGateway.Services.Http public class MonaiAeTitleController : ControllerBase { private readonly ILogger _logger; - private readonly IInformaticsGatewayRepository _repository; + private readonly IMonaiApplicationEntityRepository _repository; private readonly IMonaiAeChangedNotificationService _monaiAeChangedNotificationService; public MonaiAeTitleController( ILogger logger, IMonaiAeChangedNotificationService monaiAeChangedNotificationService, - IInformaticsGatewayRepository repository) + IMonaiApplicationEntityRepository repository) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _repository = repository ?? throw new ArgumentNullException(nameof(repository)); @@ -58,7 +58,7 @@ public async Task>> Get() { try { - return Ok(await _repository.ToListAsync().ConfigureAwait(false)); + return Ok(await _repository.ToListAsync(HttpContext.RequestAborted).ConfigureAwait(false)); } catch (Exception ex) { @@ -77,7 +77,7 @@ public async Task> GetAeTitle(string name) { try { - var monaiApplicationEntity = await _repository.FindAsync(name).ConfigureAwait(false); + var monaiApplicationEntity = await _repository.FindByNameAsync(name, HttpContext.RequestAborted).ConfigureAwait(false); if (monaiApplicationEntity is null) { @@ -104,12 +104,11 @@ public async Task> Create(MonaiApplicationE { try { - Validate(item); + await ValidateAsync(item).ConfigureAwait(false); item.SetDefaultValues(); - await _repository.AddAsync(item).ConfigureAwait(false); - await _repository.SaveChangesAsync().ConfigureAwait(false); + await _repository.AddAsync(item, HttpContext.RequestAborted).ConfigureAwait(false); _monaiAeChangedNotificationService.Notify(new MonaiApplicationentityChangedEvent(item, ChangedEventType.Added)); _logger.MonaiApplicationEntityAdded(item.AeTitle); return CreatedAtAction(nameof(GetAeTitle), new { name = item.Name }, item); @@ -138,14 +137,13 @@ public async Task> Delete(string name) { try { - var monaiApplicationEntity = await _repository.FindAsync(name).ConfigureAwait(false); + var monaiApplicationEntity = await _repository.FindByNameAsync(name, HttpContext.RequestAborted).ConfigureAwait(false); if (monaiApplicationEntity is null) { return NotFound(); } - _repository.Remove(monaiApplicationEntity); - await _repository.SaveChangesAsync().ConfigureAwait(false); + await _repository.RemoveAsync(monaiApplicationEntity, HttpContext.RequestAborted).ConfigureAwait(false); _monaiAeChangedNotificationService.Notify(new MonaiApplicationentityChangedEvent(monaiApplicationEntity, ChangedEventType.Deleted)); _logger.MonaiApplicationEntityDeleted(name); @@ -158,15 +156,15 @@ public async Task> Delete(string name) } } - private void Validate(MonaiApplicationEntity item) + private async Task ValidateAsync(MonaiApplicationEntity item) { - Guard.Against.Null(item, nameof(item)); + Guard.Against.Null(item); - if (_repository.Any(p => p.Name.Equals(item.Name))) + if (await _repository.ContainsAsync(p => p.Name.Equals(item.Name), HttpContext.RequestAborted).ConfigureAwait(false)) { throw new ObjectExistsException($"A MONAI Application Entity with the same name '{item.Name}' already exists."); } - if (_repository.Any(p => p.AeTitle.Equals(item.AeTitle))) + if (await _repository.ContainsAsync(p => p.AeTitle.Equals(item.AeTitle), HttpContext.RequestAborted).ConfigureAwait(false)) { throw new ObjectExistsException($"A MONAI Application Entity with the same AE Title '{item.AeTitle}' already exists."); } diff --git a/src/InformaticsGateway/Services/Http/SourceAeTitleController.cs b/src/InformaticsGateway/Services/Http/SourceAeTitleController.cs index 37cd526db..cd281ccda 100644 --- a/src/InformaticsGateway/Services/Http/SourceAeTitleController.cs +++ b/src/InformaticsGateway/Services/Http/SourceAeTitleController.cs @@ -25,7 +25,7 @@ using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; namespace Monai.Deploy.InformaticsGateway.Services.Http @@ -35,11 +35,11 @@ namespace Monai.Deploy.InformaticsGateway.Services.Http public class SourceAeTitleController : ControllerBase { private readonly ILogger _logger; - private readonly IInformaticsGatewayRepository _repository; + private readonly ISourceApplicationEntityRepository _repository; public SourceAeTitleController( ILogger logger, - IInformaticsGatewayRepository repository) + ISourceApplicationEntityRepository repository) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _repository = repository ?? throw new ArgumentNullException(nameof(repository)); @@ -53,7 +53,7 @@ public async Task>> Get() { try { - return Ok(await _repository.ToListAsync().ConfigureAwait(false)); + return Ok(await _repository.ToListAsync(HttpContext.RequestAborted).ConfigureAwait(false)); } catch (Exception ex) { @@ -72,7 +72,7 @@ public async Task> GetAeTitle(string name) { try { - var sourceApplicationEntity = await _repository.FindAsync(name).ConfigureAwait(false); + var sourceApplicationEntity = await _repository.FindByNameAsync(name, HttpContext.RequestAborted).ConfigureAwait(false); if (sourceApplicationEntity is null) { @@ -100,10 +100,9 @@ public async Task> Create(SourceApplicationEntity item) try { item.SetDefaultValues(); - ValidateCreate(item); + await ValidateCreateAsync(item).ConfigureAwait(false); - await _repository.AddAsync(item).ConfigureAwait(false); - await _repository.SaveChangesAsync().ConfigureAwait(false); + await _repository.AddAsync(item, HttpContext.RequestAborted).ConfigureAwait(false); _logger.SourceApplicationEntityAdded(item.AeTitle, item.HostIp); return CreatedAtAction(nameof(GetAeTitle), new { name = item.Name }, item); } @@ -137,7 +136,7 @@ public async Task> Edit(SourceApplicationE return NotFound(); } - var sourceApplicationEntity = await _repository.FindAsync(item.Name).ConfigureAwait(false); + var sourceApplicationEntity = await _repository.FindByNameAsync(item.Name, HttpContext.RequestAborted).ConfigureAwait(false); if (sourceApplicationEntity is null) { return NotFound(); @@ -148,10 +147,9 @@ public async Task> Edit(SourceApplicationE sourceApplicationEntity.AeTitle = item.AeTitle; sourceApplicationEntity.HostIp = item.HostIp; - ValidateEdit(sourceApplicationEntity); + await ValidateEditAsync(sourceApplicationEntity).ConfigureAwait(false); - _ = _repository.Update(sourceApplicationEntity); - await _repository.SaveChangesAsync(HttpContext.RequestAborted).ConfigureAwait(false); + await _repository.UpdateAsync(sourceApplicationEntity, HttpContext.RequestAborted).ConfigureAwait(false); _logger.SourceApplicationEntityUpdated(item.Name, item.AeTitle, item.HostIp); return Ok(sourceApplicationEntity); } @@ -175,14 +173,13 @@ public async Task> Delete(string name) { try { - var sourceApplicationEntity = await _repository.FindAsync(name).ConfigureAwait(false); + var sourceApplicationEntity = await _repository.FindByNameAsync(name, HttpContext.RequestAborted).ConfigureAwait(false); if (sourceApplicationEntity is null) { return NotFound(); } - _repository.Remove(sourceApplicationEntity); - await _repository.SaveChangesAsync().ConfigureAwait(false); + await _repository.RemoveAsync(sourceApplicationEntity, HttpContext.RequestAborted).ConfigureAwait(false); _logger.SourceApplicationEntityDeleted(name); return Ok(sourceApplicationEntity); @@ -194,13 +191,13 @@ public async Task> Delete(string name) } } - private void ValidateCreate(SourceApplicationEntity item) + private async Task ValidateCreateAsync(SourceApplicationEntity item) { - if (_repository.Any(p => p.Name.Equals(item.Name))) + if (await _repository.ContainsAsync(p => p.Name.Equals(item.Name), HttpContext.RequestAborted).ConfigureAwait(false)) { throw new ObjectExistsException($"A DICOM source with the same name '{item.Name}' already exists."); } - if (_repository.Any(p => item.AeTitle.Equals(p.AeTitle) && item.HostIp.Equals(p.HostIp))) + if (await _repository.ContainsAsync(p => p.AeTitle.Equals(item.AeTitle) && p.HostIp.Equals(item.HostIp), HttpContext.RequestAborted).ConfigureAwait(false)) { throw new ObjectExistsException($"A DICOM source with the same AE Title '{item.AeTitle}' and host/IP address '{item.HostIp}' already exists."); } @@ -210,9 +207,9 @@ private void ValidateCreate(SourceApplicationEntity item) } } - private void ValidateEdit(SourceApplicationEntity item) + private async Task ValidateEditAsync(SourceApplicationEntity item) { - if (_repository.Any(p => !item.Name.Equals(p.Name) && item.AeTitle.Equals(p.AeTitle) && item.HostIp.Equals(p.HostIp))) + if (await _repository.ContainsAsync(p => !p.Name.Equals(item.Name) && p.AeTitle.Equals(item.AeTitle) && p.HostIp.Equals(item.HostIp), HttpContext.RequestAborted).ConfigureAwait(false)) { throw new ObjectExistsException($"A DICOM source with the same AE Title '{item.AeTitle}' and host/IP address '{item.HostIp}' already exists."); } diff --git a/src/InformaticsGateway/Services/Scp/ApplicationEntityManager.cs b/src/InformaticsGateway/Services/Scp/ApplicationEntityManager.cs index 402f180e8..4f7abe4ec 100644 --- a/src/InformaticsGateway/Services/Scp/ApplicationEntityManager.cs +++ b/src/InformaticsGateway/Services/Scp/ApplicationEntityManager.cs @@ -27,7 +27,7 @@ using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Logging; using Monai.Deploy.InformaticsGateway.Services.Storage; @@ -43,6 +43,7 @@ internal class ApplicationEntityManager : IApplicationEntityManager, IDisposable private readonly IStorageInfoProvider _storageInfoProvider; private readonly ConcurrentDictionary _aeTitles; private readonly IDisposable _unsubscriberForMonaiAeChangedNotificationService; + private readonly Task _initializeTask; private bool _disposedValue; public IOptions Configuration { get; } @@ -80,7 +81,7 @@ public ApplicationEntityManager(IHostApplicationLifetime applicationLifetime, _aeTitles = new ConcurrentDictionary(); applicationLifetime.ApplicationStopping.Register(OnApplicationStopping); - InitializeMonaiAeTitles(); + _initializeTask = InitializeMonaiAeTitlesAsync(); } ~ApplicationEntityManager() => Dispose(false); @@ -91,12 +92,12 @@ private void OnApplicationStopping() _unsubscriberForMonaiAeChangedNotificationService.Dispose(); } -#pragma warning disable S4457 // Parameter validation in "async"/"await" methods should be wrapped public async Task HandleCStoreRequest(DicomCStoreRequest request, string calledAeTitle, string callingAeTitle, Guid associationId) -#pragma warning restore S4457 // Parameter validation in "async"/"await" methods should be wrapped { - Guard.Against.Null(request, nameof(request)); + Guard.Against.Null(request); + + await _initializeTask.ConfigureAwait(false); if (!_aeTitles.ContainsKey(calledAeTitle)) { @@ -123,9 +124,10 @@ private async Task HandleInstance(DicomCStoreRequest request, string calledAeTit } } - public bool IsAeTitleConfigured(string calledAe) + public async Task IsAeTitleConfiguredAsync(string calledAe) { - Guard.Against.NullOrWhiteSpace(calledAe, nameof(calledAe)); + Guard.Against.NullOrWhiteSpace(calledAe); + await _initializeTask.ConfigureAwait(false); return _aeTitles.ContainsKey(calledAe); } @@ -140,13 +142,13 @@ public ILogger GetLogger(string calledAeTitle) return _loggerFactory.CreateLogger(calledAeTitle); } - private void InitializeMonaiAeTitles() + private async Task InitializeMonaiAeTitlesAsync() { _logger.LoadingMonaiAeTitles(); using var scope = _serviceScopeFactory.CreateScope(); - var repository = scope.ServiceProvider.GetRequiredService>(); - foreach (var ae in repository.AsQueryable()) + var repository = scope.ServiceProvider.GetRequiredService(); + foreach (var ae in await repository.ToListAsync().ConfigureAwait(false)) { AddNewAeTitle(ae); } @@ -154,6 +156,8 @@ private void InitializeMonaiAeTitles() private void AddNewAeTitle(MonaiApplicationEntity entity) { + Guard.Against.Null(entity); + var scope = _serviceScopeFactory.CreateScope(); var handler = scope.ServiceProvider.GetService() ?? throw new ServiceNotFoundException(nameof(IApplicationEntityHandler)); handler.Configure(entity, Configuration.Value.Dicom.WriteDicomJson, Configuration.Value.Dicom.ValidateDicomOnSerialization); @@ -180,7 +184,7 @@ public void OnError(Exception error) public void OnNext(MonaiApplicationentityChangedEvent applicationChangedEvent) { - Guard.Against.Null(applicationChangedEvent, nameof(applicationChangedEvent)); + Guard.Against.Null(applicationChangedEvent); switch (applicationChangedEvent.Event) { @@ -195,7 +199,7 @@ public void OnNext(MonaiApplicationentityChangedEvent applicationChangedEvent) } } - public bool IsValidSource(string callingAe, string host) + public async Task IsValidSourceAsync(string callingAe, string host) { if (string.IsNullOrWhiteSpace(callingAe) || string.IsNullOrWhiteSpace(host)) { @@ -203,18 +207,18 @@ public bool IsValidSource(string callingAe, string host) } using var scope = _serviceScopeFactory.CreateScope(); - var repository = scope.ServiceProvider.GetRequiredService>(); - var sourceAe = repository.FirstOrDefault(p => p.AeTitle.Equals(callingAe) && p.HostIp.Equals(host, StringComparison.OrdinalIgnoreCase)); + var repository = scope.ServiceProvider.GetRequiredService(); + var containsSource = await repository.ContainsAsync(p => p.AeTitle.Equals(callingAe) && p.HostIp.Equals(host)).ConfigureAwait(false); - if (sourceAe is null) + if (!containsSource) { - foreach (var src in repository.AsQueryable()) + foreach (var src in await repository.ToListAsync().ConfigureAwait(false)) { _logger.AvailableSource(src.AeTitle, src.HostIp); } } - return sourceAe is not null; + return containsSource; } protected virtual void Dispose(bool disposing) diff --git a/src/InformaticsGateway/Services/Scp/IApplicationEntityManager.cs b/src/InformaticsGateway/Services/Scp/IApplicationEntityManager.cs index 2838ec4dd..5681e98fc 100644 --- a/src/InformaticsGateway/Services/Scp/IApplicationEntityManager.cs +++ b/src/InformaticsGateway/Services/Scp/IApplicationEntityManager.cs @@ -43,7 +43,7 @@ public interface IApplicationEntityManager /// /// /// True if the AE Title is configured; false otherwise. - bool IsAeTitleConfigured(string calledAe); + Task IsAeTitleConfiguredAsync(string calledAe); /// /// Wrapper to get injected service. @@ -61,6 +61,6 @@ public interface IApplicationEntityManager /// /// /// - bool IsValidSource(string callingAe, string host); + Task IsValidSourceAsync(string callingAe, string host); } } diff --git a/src/InformaticsGateway/Services/Scp/ScpServiceInternal.cs b/src/InformaticsGateway/Services/Scp/ScpServiceInternal.cs index a584b89a0..841b87c94 100644 --- a/src/InformaticsGateway/Services/Scp/ScpServiceInternal.cs +++ b/src/InformaticsGateway/Services/Scp/ScpServiceInternal.cs @@ -117,7 +117,7 @@ public Task OnReceiveAssociationReleaseRequestAsync() return SendAssociationReleaseResponseAsync(); } - public Task OnReceiveAssociationRequestAsync(DicomAssociation association) + public async Task OnReceiveAssociationRequestAsync(DicomAssociation association) { Interlocked.Increment(ref ScpService.ActiveConnections); _associationReceived = DateTimeOffset.UtcNow; @@ -136,20 +136,20 @@ public Task OnReceiveAssociationRequestAsync(DicomAssociation association) _loggerScope = _logger?.BeginScope(new LoggingDataDictionary { { "Association", associationIdStr } }); _logger?.CStoreAssociationReceived(association.RemoteHost, association.RemotePort); - if (!IsValidSourceAe(association.CallingAE, association.RemoteHost)) + if (!await IsValidSourceAeAsync(association.CallingAE, association.RemoteHost).ConfigureAwait(false)) { - return SendAssociationRejectAsync( + await SendAssociationRejectAsync( DicomRejectResult.Permanent, DicomRejectSource.ServiceUser, - DicomRejectReason.CallingAENotRecognized); + DicomRejectReason.CallingAENotRecognized).ConfigureAwait(false); } - if (!IsValidCalledAe(association.CalledAE)) + if (!await IsValidCalledAeAsync(association.CalledAE).ConfigureAwait(false)) { - return SendAssociationRejectAsync( + await SendAssociationRejectAsync( DicomRejectResult.Permanent, DicomRejectSource.ServiceUser, - DicomRejectReason.CalledAENotRecognized); + DicomRejectReason.CalledAENotRecognized).ConfigureAwait(false); } foreach (var pc in association.PresentationContexts) @@ -159,11 +159,11 @@ public Task OnReceiveAssociationRequestAsync(DicomAssociation association) if (!_associationDataProvider.Configuration.Value.Dicom.Scp.EnableVerification) { _logger?.VerificationServiceDisabled(); - return SendAssociationRejectAsync( + await SendAssociationRejectAsync( DicomRejectResult.Permanent, DicomRejectSource.ServiceUser, DicomRejectReason.ApplicationContextNotSupported - ); + ).ConfigureAwait(false); } pc.AcceptTransferSyntaxes(_associationDataProvider.Configuration.Value.Dicom.Scp.VerificationServiceTransferSyntaxes.ToDicomTransferSyntaxArray()); } @@ -171,29 +171,29 @@ public Task OnReceiveAssociationRequestAsync(DicomAssociation association) { if (!_associationDataProvider.CanStore) { - return SendAssociationRejectAsync( + await SendAssociationRejectAsync( DicomRejectResult.Permanent, DicomRejectSource.ServiceUser, - DicomRejectReason.NoReasonGiven); + DicomRejectReason.NoReasonGiven).ConfigureAwait(false); } // Accept any proposed TS pc.AcceptTransferSyntaxes(pc.GetTransferSyntaxes().ToArray()); } } - return SendAssociationAcceptAsync(association); + await SendAssociationAcceptAsync(association).ConfigureAwait(false); } - private bool IsValidCalledAe(string calledAe) + private async Task IsValidCalledAeAsync(string calledAe) { - return _associationDataProvider.IsAeTitleConfigured(calledAe); + return await _associationDataProvider.IsAeTitleConfiguredAsync(calledAe).ConfigureAwait(false); } - private bool IsValidSourceAe(string callingAe, string host) + private async Task IsValidSourceAeAsync(string callingAe, string host) { if (!_associationDataProvider.Configuration.Value.Dicom.Scp.RejectUnknownSources) return true; - return _associationDataProvider.IsValidSource(callingAe, host); + return await _associationDataProvider.IsValidSourceAsync(callingAe, host); } } } diff --git a/src/InformaticsGateway/Test/Repositories/InferenceRequestRepositoryTest.cs b/src/InformaticsGateway/Test/Repositories/InferenceRequestRepositoryTest.cs deleted file mode 100644 index 5b211cfa6..000000000 --- a/src/InformaticsGateway/Test/Repositories/InferenceRequestRepositoryTest.cs +++ /dev/null @@ -1,247 +0,0 @@ -/* - * Copyright 2021-2022 MONAI Consortium - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -using System; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api.Rest; -using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Database.Api; -using Monai.Deploy.InformaticsGateway.Repositories; -using Monai.Deploy.InformaticsGateway.SharedTest; -using Moq; -using xRetry; -using Xunit; - -namespace Monai.Deploy.InformaticsGateway.Test.Repositories -{ - public class InferenceRequestRepositoryTest - { - private readonly Mock> _logger; - private readonly Mock> _inferenceRequestRepository; - private readonly IOptions _options; - - public InferenceRequestRepositoryTest() - { - _logger = new Mock>(); - _inferenceRequestRepository = new Mock>(); - _options = Options.Create(new InformaticsGatewayConfiguration()); - - _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; - - _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); - } - - [RetryFact(5, 250, DisplayName = "Constructor")] - public void ConstructorTest() - { - Assert.Throws(() => new InferenceRequestRepository(null, null, null)); - Assert.Throws(() => new InferenceRequestRepository(_logger.Object, null, null)); - Assert.Throws(() => new InferenceRequestRepository(_logger.Object, _inferenceRequestRepository.Object, null)); - - _ = new InferenceRequestRepository(_logger.Object, _inferenceRequestRepository.Object, _options); - } - - [RetryFact(5, 250, DisplayName = "Add - Shall retry on failure")] - public async Task Add_ShallRetryOnFailure() - { - _inferenceRequestRepository.Setup(p => p.AddAsync(It.IsAny(), It.IsAny())) - .Throws(new Exception("error")); - - var inferenceRequest = new InferenceRequest - { - TransactionId = Guid.NewGuid().ToString() - }; - - var store = new InferenceRequestRepository(_logger.Object, _inferenceRequestRepository.Object, _options); - - await Assert.ThrowsAsync(async () => await store.Add(inferenceRequest)); - - _logger.VerifyLoggingMessageBeginsWith($"Error saving inference request", LogLevel.Error, Times.Exactly(3)); - _inferenceRequestRepository.Verify(p => p.AddAsync(It.IsAny(), It.IsAny()), Times.AtLeast(3)); - } - - [RetryFact(5, 250, DisplayName = "Add - Shall add new job")] - public async Task Add_ShallAddJob() - { - var inferenceRequest = new InferenceRequest - { - TransactionId = Guid.NewGuid().ToString() - }; - - var store = new InferenceRequestRepository(_logger.Object, _inferenceRequestRepository.Object, _options); - await store.Add(inferenceRequest); - - _inferenceRequestRepository.Verify(p => p.AddAsync(It.IsAny(), It.IsAny()), Times.Once()); - _inferenceRequestRepository.Verify(p => p.SaveChangesAsync(It.IsAny()), Times.Once()); - _logger.VerifyLoggingMessageBeginsWith($"Inference request saved.", LogLevel.Debug, Times.Once()); - } - - [RetryFact(5, 250, DisplayName = "Update - Shall retry on failure")] - public async Task UpdateSuccess_ShallRetryOnFailure() - { - var inferenceRequest = new InferenceRequest - { - TransactionId = Guid.NewGuid().ToString() - }; - - _inferenceRequestRepository.Setup(p => p.SaveChangesAsync(It.IsAny())).Throws(new Exception("error")); - - var store = new InferenceRequestRepository(_logger.Object, _inferenceRequestRepository.Object, _options); - - await Assert.ThrowsAsync(() => store.Update(inferenceRequest, InferenceRequestStatus.Success)); - - _logger.VerifyLoggingMessageBeginsWith($"Error while updating inference request", LogLevel.Error, Times.Exactly(3)); - _inferenceRequestRepository.Verify(p => p.SaveChangesAsync(It.IsAny()), Times.AtLeast(3)); - } - - [RetryFact(5, 250, DisplayName = "Update - Shall mark job as filed and save")] - public async Task UpdateSuccess_ShallFailAndSave() - { - var inferenceRequest = new InferenceRequest - { - TransactionId = Guid.NewGuid().ToString(), - TryCount = 3 - }; - - var store = new InferenceRequestRepository(_logger.Object, _inferenceRequestRepository.Object, _options); - - await store.Update(inferenceRequest, InferenceRequestStatus.Fail); - - _logger.VerifyLogging($"Updating inference request.", LogLevel.Debug, Times.Once()); - _logger.VerifyLogging($"Inference request updated.", LogLevel.Information, Times.Once()); - _logger.VerifyLogging($"Exceeded maximum retries.", LogLevel.Warning, Times.Once()); - _inferenceRequestRepository.Verify(p => p.SaveChangesAsync(It.IsAny()), Times.Once()); - } - - [RetryFact(5, 250, DisplayName = "Update - Shall save")] - public async Task UpdateSuccess_ShallSave() - { - var inferenceRequest = new InferenceRequest - { - TransactionId = Guid.NewGuid().ToString() - }; - - var store = new InferenceRequestRepository(_logger.Object, _inferenceRequestRepository.Object, _options); - - await store.Update(inferenceRequest, InferenceRequestStatus.Fail); - - _logger.VerifyLogging($"Updating inference request.", LogLevel.Debug, Times.Once()); - _logger.VerifyLogging($"Inference request updated.", LogLevel.Information, Times.Once()); - _logger.VerifyLogging($"Will retry later.", LogLevel.Information, Times.Once()); - _inferenceRequestRepository.Verify(p => p.SaveChangesAsync(It.IsAny()), Times.Once()); - } - - [RetryFact(5, 250, DisplayName = "Take - Shall return next queued")] - public async Task Take_ShallReturnQueuedItem() - { - var inferenceRequest = new InferenceRequest - { - TransactionId = Guid.NewGuid().ToString() - }; - var cancellationSource = new CancellationTokenSource(); - - _inferenceRequestRepository.SetupSequence(p => p.FirstOrDefault(It.IsAny>())) - .Returns(inferenceRequest); - - var store = new InferenceRequestRepository(_logger.Object, _inferenceRequestRepository.Object, _options); - - _ = await store.Take(cancellationSource.Token); - - _logger.VerifyLogging($"Updating request {inferenceRequest.TransactionId} to InProgress.", LogLevel.Debug, Times.AtLeastOnce()); - } - - [RetryFact(5, 250, DisplayName = "Take - Shall throw when cancelled")] - public async Task Take_ShallThrowWhenCancelled() - { - var cancellationSource = new CancellationTokenSource(); - _inferenceRequestRepository.Setup(p => p.FirstOrDefault(It.IsAny>())) - .Returns(default(InferenceRequest)); - - var store = new InferenceRequestRepository(_logger.Object, _inferenceRequestRepository.Object, _options); - cancellationSource.CancelAfter(100); - await Assert.ThrowsAsync(async () => await store.Take(cancellationSource.Token)); - } - - [RetryFact(5, 250, DisplayName = "Exists - throws if no arguments provided")] - public void Exists_ThrowsIfNoArgumentsProvided() - { - var store = new InferenceRequestRepository(_logger.Object, _inferenceRequestRepository.Object, _options); - Assert.Throws(() => store.Exists(string.Empty)); - } - - [RetryFact(5, 250, DisplayName = "Exists - returns true")] - public void Exists_ReturnsTrue() - { - _inferenceRequestRepository.Setup(p => p.FirstOrDefault(It.IsAny>())) - .Returns(new InferenceRequest()); - var store = new InferenceRequestRepository(_logger.Object, _inferenceRequestRepository.Object, _options); - Assert.True(store.Exists("abc")); - _inferenceRequestRepository.Verify(p => p.FirstOrDefault(It.IsAny>()), Times.Once()); - } - - [RetryFact(5, 250, DisplayName = "Get transationId - throws if no arguments provided")] - public void GetTransactionId_ThrowsIfNoArgumentsProvided() - { - var store = new InferenceRequestRepository(_logger.Object, _inferenceRequestRepository.Object, _options); - Assert.Throws(() => store.GetInferenceRequest(string.Empty)); - } - - [RetryFact(5, 250, DisplayName = "Get inferenceRequestId - throws if no arguments provided")] - public async Task GetInferenceRequestId_ThrowsIfNoArgumentsProvided() - { - var store = new InferenceRequestRepository(_logger.Object, _inferenceRequestRepository.Object, _options); - await Assert.ThrowsAsync(async () => await store.GetInferenceRequest(Guid.Empty)); - } - - [RetryFact(5, 250, DisplayName = "Get - retrieves by transationId")] - public void Get_RetrievesByJobId() - { - var store = new InferenceRequestRepository(_logger.Object, _inferenceRequestRepository.Object, _options); - _ = store.GetInferenceRequest("id"); - _inferenceRequestRepository.Verify(p => p.FirstOrDefault(It.IsAny>()), Times.Once()); - } - - [RetryFact(5, 250, DisplayName = "Get - retrieves by inferenceRequestId")] - public void Get_RetrievesByPayloadId() - { - var store = new InferenceRequestRepository(_logger.Object, _inferenceRequestRepository.Object, _options); - var id = Guid.NewGuid(); - _ = store.GetInferenceRequest(id); - _inferenceRequestRepository.Verify(p => p.FindAsync(It.IsAny()), Times.Once()); - } - - [RetryFact(5, 250, DisplayName = "Status - retrieves by transaction id")] - public async Task Status_RetrievesByTransactionId() - { - _inferenceRequestRepository.Setup(p => p.FirstOrDefault(It.IsAny>())) - .Returns(new InferenceRequest - { - TransactionId = "My Transaction ID", - }); - - var store = new InferenceRequestRepository(_logger.Object, _inferenceRequestRepository.Object, _options); - var id = Guid.NewGuid().ToString(); - var status = await store.GetStatus(id); - - Assert.Equal("My Transaction ID", status.TransactionId); - - _inferenceRequestRepository.Verify(p => p.FirstOrDefault(It.IsAny>()), Times.Once()); - } - } -} diff --git a/src/InformaticsGateway/Test/Repositories/InformaticsGatewayRepositoryTest.cs b/src/InformaticsGateway/Test/Repositories/InformaticsGatewayRepositoryTest.cs deleted file mode 100644 index 51798e112..000000000 --- a/src/InformaticsGateway/Test/Repositories/InformaticsGatewayRepositoryTest.cs +++ /dev/null @@ -1,243 +0,0 @@ -/* - * Copyright 2021-2022 MONAI Consortium - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; -using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Database.EntityFramework; -using Moq; -using xRetry; -using Xunit; - -namespace Monai.Deploy.InformaticsGateway.Test.Repositories -{ - public class InformaticsGatewayRepositoryTest : IClassFixture - { - private readonly Mock _serviceScopeFactory; - public DatabaseFixture Fixture { get; } - - public InformaticsGatewayRepositoryTest(DatabaseFixture fixture) - { - Fixture = fixture; - - var serviceProvider = new Mock(); - serviceProvider - .Setup(x => x.GetService(typeof(InformaticsGatewayContext))) - .Returns(Fixture.DbContext); - - var scope = new Mock(); - scope.Setup(x => x.ServiceProvider).Returns(serviceProvider.Object); - - _serviceScopeFactory = new Mock(); - _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(scope.Object); - } - - [Fact(DisplayName = "Constructor")] - public void Constructor() - { - Assert.Throws(() => new InformaticsGatewayRepository(null)); - } - - [RetryFact(5, 250, DisplayName = "AsQueryable - returns IQueryable")] - public void AsQueryable() - { - var repo = new InformaticsGatewayRepository(_serviceScopeFactory.Object); - - var result = repo.AsQueryable(); - - Assert.True(result is IQueryable); - } - - [RetryFact(5, 250, DisplayName = "AsQueryable - returns List")] - public async Task ToListAsync() - { - var repo = new InformaticsGatewayRepository(_serviceScopeFactory.Object); - - var result = await repo.ToListAsync(); - - Assert.True(result is List); - } - - [RetryFact(5, 250, DisplayName = "FindAsync - lookup by key")] - public async Task FindAsync() - { - var repo = new InformaticsGatewayRepository(_serviceScopeFactory.Object); - - var result = await repo.FindAsync("AET5"); - - Assert.NotNull(result); - Assert.Equal("AET5", result.Name); - Assert.Equal("AET5", result.AeTitle); - Assert.Equal("5.5.5.5", result.HostIp); - } - - [RetryFact(5, 250, DisplayName = "Update")] - public async Task Update() - { - var repo = new InformaticsGatewayRepository(_serviceScopeFactory.Object); - - var key = "AET2"; - var result = await repo.FindAsync(key); - Assert.NotNull(result); - - result.HostIp = "20.20.20.20"; - repo.Update(result); - await repo.SaveChangesAsync(); - var updated = await repo.FindAsync(key); - - Assert.Equal(result, updated); - } - - [RetryFact(5, 250, DisplayName = "Remove")] - public async Task Remove() - { - var repo = new InformaticsGatewayRepository(_serviceScopeFactory.Object); - - for (int i = 8; i <= 10; i++) - { - var key = $"AET{i}"; - var result = await repo.FindAsync(key); - repo.Remove(result); - await repo.SaveChangesAsync(); - } - - for (int i = 8; i <= 10; i++) - { - var key = $"AET{i}"; - Assert.Null(await repo.FindAsync(key)); - } - } - - [RetryFact(5, 250, DisplayName = "AddAsync")] - public async Task AddAsync() - { - var repo = new InformaticsGatewayRepository(_serviceScopeFactory.Object); - - for (int i = 11; i <= 20; i++) - { - await repo.AddAsync(new SourceApplicationEntity - { - Name = $"AET{i}", - AeTitle = $"AET{i}", - HostIp = $"Server{i}", - }); - } - await repo.SaveChangesAsync(); - - for (int i = 11; i <= 20; i++) - { - var notNull = await repo.FindAsync($"AET{i}"); - Assert.NotNull(notNull); - } - } - - [RetryFact(5, 250, DisplayName = "FirstOrDefault")] - public void FirstOrDefault() - { - var repo = new InformaticsGatewayRepository(_serviceScopeFactory.Object); - - var exists = repo.FirstOrDefault(p => p.HostIp == "1.1.1.1"); - Assert.NotNull(exists); - - var doesNotexist = repo.FirstOrDefault(p => p.AeTitle == "ABC"); - Assert.Null(doesNotexist); - } - - [RetryFact(5, 250, DisplayName = "Detach")] - public async Task Detach() - { - var repo = new InformaticsGatewayRepository(_serviceScopeFactory.Object); - - var toBeModified = await repo.FindAsync("AET1"); - repo.Detach(toBeModified); - toBeModified.Name = "TEST"; - - var existing = await repo.FindAsync("AET1"); - Assert.NotEqual(existing.Name, toBeModified.Name); - } - - [RetryFact(5, 250, DisplayName = "Any")] - public void Any() - { - var repo = new InformaticsGatewayRepository(_serviceScopeFactory.Object); - - var all = repo.Any(p => p.Name.StartsWith("AET")); - Assert.True(all); - } - } - - public class DatabaseFixture : IDisposable - { - private bool _disposedValue; - - public InformaticsGatewayContext DbContext { get; } - - public DatabaseFixture() - { - DbContext = GetDatabaseContext(); - } - - public static InformaticsGatewayContext GetDatabaseContext() - { - var options = new DbContextOptionsBuilder() - .UseInMemoryDatabase(databaseName: Guid.NewGuid().ToString()) - .Options; - - var databaseContext = new InformaticsGatewayContext(options); - databaseContext.Database.EnsureDeleted(); - databaseContext.Database.EnsureCreated(); - if (!databaseContext.SourceApplicationEntities.Any()) - { - for (int i = 1; i <= 10; i++) - { - databaseContext.SourceApplicationEntities.Add( - new SourceApplicationEntity - { - Name = $"AET{i}", - AeTitle = $"AET{i}", - HostIp = $"{i}.{i}.{i}.{i}" - }); - } - } - databaseContext.SaveChanges(); - return databaseContext; - } - - protected virtual void Dispose(bool disposing) - { - if (!_disposedValue) - { - if (disposing) - { - DbContext.Dispose(); - } - - _disposedValue = true; - } - } - - public void Dispose() - { - // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method - Dispose(disposing: true); - GC.SuppressFinalize(this); - } - } -} diff --git a/src/InformaticsGateway/Test/Repositories/StorageInfoWrapperRepositoryTest.cs b/src/InformaticsGateway/Test/Repositories/StorageInfoWrapperRepositoryTest.cs deleted file mode 100644 index f1c3ebd8d..000000000 --- a/src/InformaticsGateway/Test/Repositories/StorageInfoWrapperRepositoryTest.cs +++ /dev/null @@ -1,319 +0,0 @@ -/* - * Copyright 2022 MONAI Consortium - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text.Json; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api.Storage; -using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Database.Api; -using Monai.Deploy.InformaticsGateway.Repositories; -using Moq; -using Xunit; - -namespace Monai.Deploy.InformaticsGateway.Test.Repositories -{ - public class StorageMetadataWrapperRepositoryTest - { - private readonly Mock> _logger; - private readonly Mock> _repository; - private readonly IOptions _options; - - public StorageMetadataWrapperRepositoryTest() - { - _logger = new Mock>(); - _repository = new Mock>(); - _options = Options.Create(new InformaticsGatewayConfiguration()); - - _options.Value.Database.Retries.DelaysMilliseconds = new[] { 1, 1, 1 }; - _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); - } - - [Fact] - public void GivenStorageMetadataWrapperRepositoryType_WhenInitialized_TheConstructorShallGuardAllParameters() - { - Assert.Throws(() => new StorageMetadataWrapperRepository(null, null, null)); - Assert.Throws(() => new StorageMetadataWrapperRepository(_logger.Object, _repository.Object, null)); - Assert.Throws(() => new StorageMetadataWrapperRepository(_logger.Object, null, null)); - - _ = new StorageMetadataWrapperRepository(_logger.Object, _repository.Object, _options); - } - - [Fact] - public async Task GivenADicomStorageMetadataObject_WhenSavingToDatabaseWithException_ExpectAddAsyncToAttemptRetries() - { - _repository.Setup(p => p.AddAsync(It.IsAny(), It.IsAny())) - .Throws(new Exception("error")); - - var metadata = new DicomFileStorageMetadata( - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString()); - - var store = new StorageMetadataWrapperRepository(_logger.Object, _repository.Object, _options); - - await Assert.ThrowsAsync(async () => await store.AddAsync(metadata)); - - _repository.Verify(p => p.AddAsync(It.IsAny(), It.IsAny()), Times.AtLeast(3)); - } - - [Fact] - public async Task GivenADicomStorageMetadataObject_WhenAddingToDatabase_ExpectItToBeSaved() - { - var metadata = new DicomFileStorageMetadata( - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString()); - var json = JsonSerializer.Serialize(metadata); - - var store = new StorageMetadataWrapperRepository(_logger.Object, _repository.Object, _options); - await store.AddAsync(metadata); - - _repository.Verify(p => p.AddAsync(It.IsAny(), It.IsAny()), Times.Once()); - _repository.Verify(p => p.SaveChangesAsync(It.IsAny()), Times.Once()); - } - - [Fact] - public async Task GivenADicomStorageMetadataObject_WhenSavingToDatabaseWithException_ExpectUpdateAsyncToAttemptRetries() - { - var metadata = new DicomFileStorageMetadata( - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString()); - - _repository.Setup(p => p.FirstOrDefault(It.IsAny>())) - .Returns(new StorageMetadataWrapper(metadata)); - - _repository.Setup(p => p.Update(It.IsAny())) - .Throws(new Exception("error")); - - var store = new StorageMetadataWrapperRepository(_logger.Object, _repository.Object, _options); - await store.AddAsync(metadata); - metadata.SetWorkflows("A", "B", "C"); - metadata.File.SetUploaded("bucket"); - - await Assert.ThrowsAsync(async () => await store.UpdateAsync(metadata)); - - _repository.Verify(p => p.Update(It.IsAny()), Times.AtLeast(3)); - } - - [Fact] - public async Task GivenANonExistedDicomStorageMetadataObject_WhenSavedToDatabase_ThrowsArgumentException() - { - var metadata = new DicomFileStorageMetadata( - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString()); - - _repository.Setup(p => p.FirstOrDefault(It.IsAny>())) - .Returns(default(StorageMetadataWrapper)); - - _repository.Setup(p => p.Update(It.IsAny())); - - var store = new StorageMetadataWrapperRepository(_logger.Object, _repository.Object, _options); - await store.AddOrUpdateAsync(metadata); - metadata.SetWorkflows("A", "B", "C"); - metadata.File.SetUploaded("bucket"); - - await Assert.ThrowsAsync(async () => await store.UpdateAsync(metadata)); - - _repository.Verify(p => p.FirstOrDefault(It.IsAny>()), Times.AtLeast(3)); - _repository.Verify(p => p.Update(It.IsAny()), Times.Never()); - } - - [Fact] - public async Task GivenAnExistingDicomStorageMetadataObject_WhenUpdated_ExpectItToBeSaved() - { - var metadata = new DicomFileStorageMetadata( - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString()); - - _repository.Setup(p => p.FirstOrDefault(It.IsAny>())) - .Returns(new StorageMetadataWrapper(metadata)); - - _repository.Setup(p => p.Update(It.IsAny())); - - var store = new StorageMetadataWrapperRepository(_logger.Object, _repository.Object, _options); - await store.AddAsync(metadata); - metadata.SetWorkflows("A", "B", "C"); - metadata.File.SetUploaded("bucket"); - - await store.AddOrUpdateAsync(metadata); - - _repository.Verify(p => p.Update(It.IsAny()), Times.Once()); - _repository.Verify(p => p.SaveChangesAsync(It.IsAny()), Times.Exactly(2)); - } - - [Fact] - public async Task GivenStorageMetadataObjects_WhenDeletingPendingUploadsObject_ExpectAllPendingObjectsToBeDeleted() - { - var pending = new DicomFileStorageMetadata( - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString()); - var uploaded = new DicomFileStorageMetadata( - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString()); - uploaded.File.SetUploaded("bucket"); - uploaded.JsonFile.SetUploaded("bucket"); - - var files = new List { new StorageMetadataWrapper(pending), new StorageMetadataWrapper(uploaded) }; - - _repository.Setup(p => p.AsQueryable()).Returns(files.AsQueryable()); - - _repository.Setup(p => p.Update(It.IsAny())); - - var store = new StorageMetadataWrapperRepository(_logger.Object, _repository.Object, _options); - await store.DeletePendingUploadsAsync(); - - _repository.Verify(p => p.RemoveRange(It.Is(p => p.Count() == 1)), Times.Once()); - _repository.Verify(p => p.RemoveRange(It.Is(p => p.First().Identity == pending.Id)), Times.Once()); - _repository.Verify(p => p.SaveChangesAsync(It.IsAny()), Times.Once()); - } - - [Fact] - public void GivenACorrelationId_WhenGetFileStorageMetdadataIsCalled_ExpectMatchingFileStorageMetadataToBeReturned() - { - var correlationId = Guid.NewGuid().ToString(); - var list = new List{ - new StorageMetadataWrapper( - new DicomFileStorageMetadata( - correlationId, - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString())), - new StorageMetadataWrapper( - new DicomFileStorageMetadata( - correlationId, - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString())), - new StorageMetadataWrapper( - new DicomFileStorageMetadata( - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString())), - new StorageMetadataWrapper( - new FhirFileStorageMetadata( - correlationId, - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Api.Rest.FhirStorageFormat.Json)), - new StorageMetadataWrapper( - new FhirFileStorageMetadata( - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Api.Rest.FhirStorageFormat.Json)), - }; - _repository.Setup(p => p.AsQueryable()) - .Returns(list.AsQueryable()); - - var store = new StorageMetadataWrapperRepository(_logger.Object, _repository.Object, _options); - var results = store.GetFileStorageMetdadata(correlationId); - - Assert.Equal(3, results.Count); - } - - [Fact] - public void GivenACorrelationIdAndAnIdentity_WhenGetFileStorageMetdadataIsCalled_ExpectMatchingFileStorageMetadataToBeReturned() - { - var correlationId = Guid.NewGuid().ToString(); - var identifier = Guid.NewGuid().ToString(); - var expected = new DicomFileStorageMetadata( - correlationId, - identifier, - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString()); - - _repository.Setup(p => p.FirstOrDefault(It.IsAny>())) - .Returns(new StorageMetadataWrapper(expected)); - - var store = new StorageMetadataWrapperRepository(_logger.Object, _repository.Object, _options); - var match = store.GetFileStorageMetdadata(correlationId, identifier); - - Assert.Equal(expected.Id, match.Id); - Assert.Equal(expected.CorrelationId, match.CorrelationId); - } - - [Fact] - public async Task GivenACorrelationIdAndAnIdentity_WhenDeleteAsyncIsCalled_ExpectMatchingInstanceToBeDeleted() - { - var correlationId = Guid.NewGuid().ToString(); - var identifier = Guid.NewGuid().ToString(); - var expected = new DicomFileStorageMetadata( - correlationId, - identifier, - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString(), - Guid.NewGuid().ToString()); - - _repository.Setup(p => p.FirstOrDefault(It.IsAny>())) - .Returns(new StorageMetadataWrapper(expected)); - - var store = new StorageMetadataWrapperRepository(_logger.Object, _repository.Object, _options); - var result = await store.DeleteAsync(correlationId, identifier); - - Assert.True(result); - - _repository.Verify(p => p.Remove(It.IsAny()), Times.Once()); - _repository.Verify(p => p.SaveChangesAsync(It.IsAny()), Times.Once()); - } - - [Fact] - public async Task GivenACorrelationIdAndAnIdentity_WhenDeleteAsyncIsCalledWithoutAMatch_ExpectNothingIsDeleted() - { - var correlationId = Guid.NewGuid().ToString(); - var identifier = Guid.NewGuid().ToString(); - _repository.Setup(p => p.FirstOrDefault(It.IsAny>())) - .Returns(default(StorageMetadataWrapper)); - - var store = new StorageMetadataWrapperRepository(_logger.Object, _repository.Object, _options); - var result = await store.DeleteAsync(correlationId, identifier); - - Assert.False(result); - - _repository.Verify(p => p.Remove(It.IsAny()), Times.Never()); - _repository.Verify(p => p.SaveChangesAsync(It.IsAny()), Times.Never()); - } - } -} diff --git a/src/InformaticsGateway/Test/Services/Connectors/DataRetrievalServiceTest.cs b/src/InformaticsGateway/Test/Services/Connectors/DataRetrievalServiceTest.cs index 5eeb5724e..1e6694b15 100644 --- a/src/InformaticsGateway/Test/Services/Connectors/DataRetrievalServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/Connectors/DataRetrievalServiceTest.cs @@ -32,9 +32,8 @@ using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.DicomWeb.Client; -using Monai.Deploy.InformaticsGateway.Repositories; using Monai.Deploy.InformaticsGateway.Services.Connectors; using Monai.Deploy.InformaticsGateway.Services.Storage; using Monai.Deploy.InformaticsGateway.SharedTest; @@ -52,7 +51,7 @@ public class DataRetrievalServiceTest private readonly Mock _httpClientFactory; private readonly Mock _loggerFactory; - private readonly Mock _storageMetadataWrapperRepository; + private readonly Mock _storageMetadataWrapperRepository; private readonly Mock _uploadQueue; private readonly Mock _payloadAssembler; private readonly Mock _dicomToolkit; @@ -73,7 +72,7 @@ public DataRetrievalServiceTest() _logger = new Mock>(); _inferenceRequestStore = new Mock(); _loggerDicomWebClient = new Mock>(); - _storageMetadataWrapperRepository = new Mock(); + _storageMetadataWrapperRepository = new Mock(); _payloadAssembler = new Mock(); _serviceScopeFactory = new Mock(); _uploadQueue = new Mock(); @@ -195,10 +194,10 @@ public async Task GivenAInferenceRequestWithFromTheDatabaseWithPendingDownloads_ new DicomFileStorageMetadata(Guid.NewGuid().ToString(),Guid.NewGuid().ToString(),Guid.NewGuid().ToString(),Guid.NewGuid().ToString(),Guid.NewGuid().ToString()), new FhirFileStorageMetadata(Guid.NewGuid().ToString(),Guid.NewGuid().ToString(),Guid.NewGuid().ToString(), FhirStorageFormat.Json) }; - _storageMetadataWrapperRepository.Setup(p => p.GetFileStorageMetdadata(It.IsAny())) - .Returns(restoredFile); + _storageMetadataWrapperRepository.Setup(p => p.GetFileStorageMetdadataAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(restoredFile); - _inferenceRequestStore.SetupSequence(p => p.Take(It.IsAny())) + _inferenceRequestStore.SetupSequence(p => p.TakeAsync(It.IsAny())) .Returns(Task.FromResult(request)) .Returns(() => { @@ -286,7 +285,7 @@ public async Task GivenAnInferenceRequest_WhenItCompletesRetrievalWithoutAnyFile #endregion Test Data - _inferenceRequestStore.SetupSequence(p => p.Take(It.IsAny())) + _inferenceRequestStore.SetupSequence(p => p.TakeAsync(It.IsAny())) .Returns(Task.FromResult(request)) .Returns(() => { @@ -311,8 +310,8 @@ public async Task GivenAnInferenceRequest_WhenItCompletesRetrievalWithoutAnyFile _httpClientFactory.Setup(p => p.CreateClient(It.IsAny())) .Returns(new HttpClient(_handlerMock.Object)); - _storageMetadataWrapperRepository.Setup(p => p.GetFileStorageMetdadata(It.IsAny())) - .Returns(new List()); + _storageMetadataWrapperRepository.Setup(p => p.GetFileStorageMetdadataAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(new List()); var store = new DataRetrievalService(_logger.Object, _serviceScopeFactory.Object, _options); @@ -413,7 +412,7 @@ public async Task GivenAnInferenceRequestWithDicomUids_WhenProcessing_ExpectAllI #endregion Test Data - _inferenceRequestStore.SetupSequence(p => p.Take(It.IsAny())) + _inferenceRequestStore.SetupSequence(p => p.TakeAsync(It.IsAny())) .Returns(Task.FromResult(request)) .Returns(() => { @@ -436,8 +435,8 @@ public async Task GivenAnInferenceRequestWithDicomUids_WhenProcessing_ExpectAllI _httpClientFactory.Setup(p => p.CreateClient(It.IsAny())) .Returns(new HttpClient(_handlerMock.Object)); - _storageMetadataWrapperRepository.Setup(p => p.GetFileStorageMetdadata(It.IsAny())) - .Returns(new List()); + _storageMetadataWrapperRepository.Setup(p => p.GetFileStorageMetdadataAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(new List()); _dicomToolkit.Setup(p => p.GetStudySeriesSopInstanceUids(It.IsAny())) .Returns((DicomFile dicomFile) => new StudySerieSopUids @@ -507,7 +506,7 @@ public async Task GivenAnInferenceRequestWithPatientId_WhenProcessing_ExpectAllI #endregion Test Data - _inferenceRequestStore.SetupSequence(p => p.Take(It.IsAny())) + _inferenceRequestStore.SetupSequence(p => p.TakeAsync(It.IsAny())) .Returns(Task.FromResult(request)) .Returns(() => { @@ -543,8 +542,8 @@ public async Task GivenAnInferenceRequestWithPatientId_WhenProcessing_ExpectAllI _httpClientFactory.Setup(p => p.CreateClient(It.IsAny())) .Returns(new HttpClient(_handlerMock.Object)); - _storageMetadataWrapperRepository.Setup(p => p.GetFileStorageMetdadata(It.IsAny())) - .Returns(new List()); + _storageMetadataWrapperRepository.Setup(p => p.GetFileStorageMetdadataAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(new List()); _dicomToolkit.Setup(p => p.GetStudySeriesSopInstanceUids(It.IsAny())) .Returns((DicomFile dicomFile) => new StudySerieSopUids @@ -625,7 +624,7 @@ public async Task GivenAnInferenceRequestWithAccessionNumber_WhenProcessing_Expe #endregion Test Data - _inferenceRequestStore.SetupSequence(p => p.Take(It.IsAny())) + _inferenceRequestStore.SetupSequence(p => p.TakeAsync(It.IsAny())) .Returns(Task.FromResult(request)) .Returns(() => { @@ -661,8 +660,8 @@ public async Task GivenAnInferenceRequestWithAccessionNumber_WhenProcessing_Expe _httpClientFactory.Setup(p => p.CreateClient(It.IsAny())) .Returns(new HttpClient(_handlerMock.Object)); - _storageMetadataWrapperRepository.Setup(p => p.GetFileStorageMetdadata(It.IsAny())) - .Returns(new List()); + _storageMetadataWrapperRepository.Setup(p => p.GetFileStorageMetdadataAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(new List()); _dicomToolkit.Setup(p => p.GetStudySeriesSopInstanceUids(It.IsAny())) .Returns((DicomFile dicomFile) => new StudySerieSopUids @@ -765,7 +764,7 @@ public async Task GivenAnInferenceRequestWithFhirResources_WhenProcessing_Expect #endregion Test Data - _inferenceRequestStore.SetupSequence(p => p.Take(It.IsAny())) + _inferenceRequestStore.SetupSequence(p => p.TakeAsync(It.IsAny())) .Returns(Task.FromResult(request)) .Returns(() => { @@ -784,8 +783,8 @@ public async Task GivenAnInferenceRequestWithFhirResources_WhenProcessing_Expect _httpClientFactory.Setup(p => p.CreateClient(It.IsAny())) .Returns(new HttpClient(_handlerMock.Object)); - _storageMetadataWrapperRepository.Setup(p => p.GetFileStorageMetdadata(It.IsAny())) - .Returns(new List()); + _storageMetadataWrapperRepository.Setup(p => p.GetFileStorageMetdadataAsync(It.IsAny(), It.IsAny())) + .ReturnsAsync(new List()); var store = new DataRetrievalService(_logger.Object, _serviceScopeFactory.Object, _options); diff --git a/src/InformaticsGateway/Test/Services/Connectors/PayloadAssemblerTest.cs b/src/InformaticsGateway/Test/Services/Connectors/PayloadAssemblerTest.cs index 6da08a10f..82a62c62d 100644 --- a/src/InformaticsGateway/Test/Services/Connectors/PayloadAssemblerTest.cs +++ b/src/InformaticsGateway/Test/Services/Connectors/PayloadAssemblerTest.cs @@ -15,8 +15,6 @@ */ using System; -using System.Collections.Generic; -using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -24,7 +22,7 @@ using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Services.Connectors; using Monai.Deploy.InformaticsGateway.SharedTest; using Moq; @@ -39,21 +37,21 @@ public class PayloadAssemblerTest private readonly Mock> _logger; private readonly Mock _serviceScopeFactory; - private readonly Mock> _repository; + private readonly Mock _repository; private readonly CancellationTokenSource _cancellationTokenSource; public PayloadAssemblerTest() { _serviceScopeFactory = new Mock(); - _repository = new Mock>(); + _repository = new Mock(); _options = Options.Create(new InformaticsGatewayConfiguration()); _logger = new Mock>(); _cancellationTokenSource = new CancellationTokenSource(); var serviceProvider = new Mock(); serviceProvider - .Setup(x => x.GetService(typeof(IInformaticsGatewayRepository))) + .Setup(x => x.GetService(typeof(IPayloadRepository))) .Returns(_repository.Object); var scope = new Mock(); @@ -91,23 +89,14 @@ public async Task GivenAFileStorageMetadata_WhenQueueingWihtoutSpecifyingATimeou [RetryFact(10, 200)] public async Task GivenFileStorageMetadataInTheDatabase_AtServiceStartup_ExpectPayloadsInCreatedStateToBeRemoved() { - var dataset = new List - { - new Payload("created-test1", Guid.NewGuid().ToString(), 10) { State = Payload.PayloadState.Created }, - new Payload("created-test2", Guid.NewGuid().ToString(), 10) { State = Payload.PayloadState.Created }, - new Payload("upload-test", Guid.NewGuid().ToString(), 10) { State = Payload.PayloadState.Move }, - new Payload("notify-test", Guid.NewGuid().ToString(), 10) { State = Payload.PayloadState.Notify }, - }; - - _repository.Setup(p => p.AsQueryable()).Returns(dataset.AsQueryable()); - _repository.Setup(p => p.Remove(It.IsAny())); + _repository.Setup(p => p.RemovePendingPayloadsAsync(It.IsAny())); var payloadAssembler = new PayloadAssembler(_options, _logger.Object, _serviceScopeFactory.Object); await Task.Delay(250); payloadAssembler.Dispose(); _cancellationTokenSource.Cancel(); - _repository.Verify(p => p.Remove(It.IsAny()), Times.Exactly(2)); + _repository.Verify(p => p.RemovePendingPayloadsAsync(It.IsAny()), Times.AtLeastOnce()); } [RetryFact(10, 200)] @@ -126,49 +115,19 @@ public async Task GivenAPayloadAssembler_WhenDisposed_ExpectResourceToBeCleanedU _logger.VerifyLoggingMessageBeginsWith($"Number of collections in queue", LogLevel.Trace, Times.Never()); } - [RetryFact(10, 200)] - public async Task GivenFileStorageMetadata_WhenQueueingWithDatabaseError_ExpectToRetryXTimes() - { - int callCount = 0; - _repository.Setup(p => p.SaveChangesAsync(It.IsAny())).Callback(() => - { - if (++callCount >= _options.Value.Database.Retries.DelaysMilliseconds.Length + 1) - { - _cancellationTokenSource.CancelAfter(1200); - return; - } - if (callCount != 0) - { - throw new Exception("error"); - } - }); - - var payloadAssembler = new PayloadAssembler(_options, _logger.Object, _serviceScopeFactory.Object); - - await payloadAssembler.Queue("A", new TestStorageInfo(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "file1", ".txt"), 1); - _cancellationTokenSource.Token.WaitHandle.WaitOne(); - payloadAssembler.Dispose(); - - _logger.VerifyLoggingMessageBeginsWith($"Number of incomplete payloads waiting for processing: 1.", LogLevel.Trace, Times.AtLeastOnce()); - } - [RetryFact(10, 200)] public async Task GivenAPayloadThatHasNotCompleteUploads_WhenProcessedByTimedEvent_ExpectToBeAddedToQueue() { - _repository.Setup(p => p.SaveChangesAsync(It.IsAny())).Callback(() => - { - _cancellationTokenSource.CancelAfter(1500); - }); var payloadAssembler = new PayloadAssembler(_options, _logger.Object, _serviceScopeFactory.Object); var file = new TestStorageInfo(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "file1", ".txt"); + file.File.SetUploaded("bucket"); await payloadAssembler.Queue("A", file, 1); await Task.Delay(1001); payloadAssembler.Dispose(); - _logger.VerifyLoggingMessageBeginsWith($"Number of incomplete payloads waiting for processing: 1.", LogLevel.Trace, Times.AtLeastOnce()); - _logger.VerifyLoggingMessageBeginsWith($"Bucket A sent to processing queue", LogLevel.Information, Times.Never()); + _repository.Verify(p => p.UpdateAsync(It.Is(p => p.State == Payload.PayloadState.Move), It.IsAny()), Times.Once()); } [RetryFact(10, 200)] diff --git a/src/InformaticsGateway/Test/Services/Connectors/PayloadMoveActionHandlerTest.cs b/src/InformaticsGateway/Test/Services/Connectors/PayloadMoveActionHandlerTest.cs index 8dfe7de9d..d247c6a29 100644 --- a/src/InformaticsGateway/Test/Services/Connectors/PayloadMoveActionHandlerTest.cs +++ b/src/InformaticsGateway/Test/Services/Connectors/PayloadMoveActionHandlerTest.cs @@ -24,7 +24,7 @@ using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Services.Connectors; using Monai.Deploy.Storage.API; using Moq; @@ -40,7 +40,7 @@ public class PayloadMoveActionHandlerTest private readonly IOptions _options; private readonly Mock _storageService; - private readonly Mock> _repository; + private readonly Mock _repository; private readonly Mock _serviceScope; private readonly ServiceProvider _serviceProvider; @@ -53,7 +53,7 @@ public PayloadMoveActionHandlerTest() _options = Options.Create(new InformaticsGatewayConfiguration()); _storageService = new Mock(); - _repository = new Mock>(); + _repository = new Mock(); _serviceScope = new Mock(); var services = new ServiceCollection(); @@ -172,7 +172,7 @@ public async Task GivenAPayloadThatHasReachedMaximumRetries_WhenHandlerFailedToC await handler.MoveFilesAsync(payload, moveAction, notifyAction, _cancellationTokenSource.Token); - _repository.Verify(p => p.Remove(payload), Times.Once()); + _repository.Verify(p => p.RemoveAsync(payload, _cancellationTokenSource.Token), Times.Once()); } [RetryFact(10, 200)] diff --git a/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationActionHandlerTest.cs b/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationActionHandlerTest.cs index 1f6f9d780..0066a4fd1 100644 --- a/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationActionHandlerTest.cs +++ b/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationActionHandlerTest.cs @@ -24,7 +24,7 @@ using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Services.Connectors; using Monai.Deploy.Messaging.API; using Monai.Deploy.Messaging.Messages; @@ -40,7 +40,7 @@ public class PayloadNotificationActionHandlerTest private readonly IOptions _options; private readonly Mock _messageBrokerPublisherService; - private readonly Mock> _informaticsGatewayReepository; + private readonly Mock _repository; private readonly Mock _serviceScope; private readonly ServiceProvider _serviceProvider; @@ -53,12 +53,12 @@ public PayloadNotificationActionHandlerTest() _options = Options.Create(new InformaticsGatewayConfiguration()); _messageBrokerPublisherService = new Mock(); - _informaticsGatewayReepository = new Mock>(); + _repository = new Mock(); _serviceScope = new Mock(); var services = new ServiceCollection(); services.AddScoped(p => _messageBrokerPublisherService.Object); - services.AddScoped(p => _informaticsGatewayReepository.Object); + services.AddScoped(p => _repository.Object); _serviceProvider = services.BuildServiceProvider(); _serviceScopeFactory.Setup(p => p.CreateScope()).Returns(_serviceScope.Object); @@ -165,7 +165,7 @@ public async Task GivenAPayloadThatHasReachedMaximumRetries_WhenHandlerFailedToP await handler.NotifyAsync(payload, notifyAction, _cancellationTokenSource.Token); - _informaticsGatewayReepository.Verify(p => p.Remove(payload), Times.Once()); + _repository.Verify(p => p.RemoveAsync(payload, _cancellationTokenSource.Token), Times.Once()); } [Fact] @@ -192,7 +192,7 @@ public async Task GivenAPayload_WhenMessageIsPublished_ExpectPayloadToBeDeleted( await handler.NotifyAsync(payload, notifyAction, _cancellationTokenSource.Token); _messageBrokerPublisherService.Verify(p => p.Publish(It.IsAny(), It.IsAny()), Times.AtLeastOnce()); - _informaticsGatewayReepository.Verify(p => p.Remove(It.IsAny()), Times.AtLeastOnce()); + _repository.Verify(p => p.RemoveAsync(payload, _cancellationTokenSource.Token), Times.AtLeastOnce()); } } } diff --git a/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationServiceTest.cs b/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationServiceTest.cs index 1aa87f2f3..e63697dd6 100644 --- a/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/Connectors/PayloadNotificationServiceTest.cs @@ -25,7 +25,7 @@ using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Services.Connectors; using Monai.Deploy.InformaticsGateway.SharedTest; using Monai.Deploy.Messaging.API; @@ -47,7 +47,7 @@ public class PayloadNotificationServiceTest private readonly Mock _messageBrokerPublisherService; private readonly Mock _payloadNotificationActionHandler; private readonly Mock _payloadMoveActionHandler; - private readonly Mock> _payloadRepository; + private readonly Mock _payloadRepository; private readonly CancellationTokenSource _cancellationTokenSource; private readonly Mock _serviceScope; @@ -63,7 +63,7 @@ public PayloadNotificationServiceTest() _messageBrokerPublisherService = new Mock(); _payloadNotificationActionHandler = new Mock(); _payloadMoveActionHandler = new Mock(); - _payloadRepository = new Mock>(); + _payloadRepository = new Mock(); _cancellationTokenSource = new CancellationTokenSource(); _serviceScope = new Mock(); @@ -104,6 +104,7 @@ public async Task GivenThePayloadNotificationService_WhenStopAsyncIsCalled_Expec return payload; }); + _payloadRepository.Setup(p => p.GetPayloadsInStateAsync(It.IsAny(), It.IsAny())).ReturnsAsync(new List()); var service = new PayloadNotificationService(_serviceScopeFactory.Object, _logger.Object, _options); await service.StartAsync(_cancellationTokenSource.Token); @@ -117,7 +118,7 @@ public async Task GivenThePayloadNotificationService_WhenStopAsyncIsCalled_Expec } [RetryFact(10, 200)] - public void GivenPayloadsStoredInTheDatabase_WhenServiceStarts_ExpectThePayloadsToBeRestored() + public async Task GivenPayloadsStoredInTheDatabase_WhenServiceStarts_ExpectThePayloadsToBeRestoredAsync() { var testData = new List { @@ -126,13 +127,13 @@ public void GivenPayloadsStoredInTheDatabase_WhenServiceStarts_ExpectThePayloads new Payload("notification-test", Guid.NewGuid().ToString(), 10) {State = Payload.PayloadState.Notify}, }; - _payloadRepository.Setup(p => p.AsQueryable()) - .Returns(testData.AsQueryable()) - .Callback(() => _cancellationTokenSource.CancelAfter(500)); + _payloadRepository.Setup(p => p.GetPayloadsInStateAsync(It.IsAny(), It.IsAny())) + .Callback(() => _cancellationTokenSource.CancelAfter(500)) + .ReturnsAsync(testData); var service = new PayloadNotificationService(_serviceScopeFactory.Object, _logger.Object, _options); - service.StartAsync(_cancellationTokenSource.Token); + _ = service.StartAsync(_cancellationTokenSource.Token); _cancellationTokenSource.Token.WaitHandle.WaitOne(); _payloadMoveActionHandler.Verify(p => p.MoveFilesAsync(It.IsAny(), It.IsAny>(), It.IsAny>(), It.IsAny()), Times.AtLeastOnce()); @@ -151,9 +152,10 @@ public void GivenAPayload_WhenDequedFromPayloadAssemblerAndFailedToBeProcessByTh .Callback(() => resetEvent.Set()) .Throws(new PayloadNotifyException(PayloadNotifyException.FailureReason.IncorrectState)); + _payloadRepository.Setup(p => p.GetPayloadsInStateAsync(It.IsAny(), It.IsAny())).ReturnsAsync(new List()); var service = new PayloadNotificationService(_serviceScopeFactory.Object, _logger.Object, _options); - service.StartAsync(_cancellationTokenSource.Token); + _ = service.StartAsync(_cancellationTokenSource.Token); resetEvent.Wait(); } @@ -161,13 +163,13 @@ public void GivenAPayload_WhenDequedFromPayloadAssemblerAndFailedToBeProcessByTh public void GivenAPayload_WhenDequedFromPayloadAssembler_ExpectThePayloadBeProcessedByTheMoveActionHandler() { var payload = new Payload("test", Guid.NewGuid().ToString(), 100) { State = Payload.PayloadState.Move }; - _payloadAssembler.Setup(p => p.Dequeue(It.IsAny())) - .Returns(payload); + _payloadAssembler.Setup(p => p.Dequeue(It.IsAny())).Returns(payload); + _payloadRepository.Setup(p => p.GetPayloadsInStateAsync(It.IsAny(), It.IsAny())).ReturnsAsync(new List()); var service = new PayloadNotificationService(_serviceScopeFactory.Object, _logger.Object, _options); _cancellationTokenSource.CancelAfter(100); - service.StartAsync(_cancellationTokenSource.Token); + _ = service.StartAsync(_cancellationTokenSource.Token); _cancellationTokenSource.Token.WaitHandle.WaitOne(); _payloadMoveActionHandler.Verify(p => p.MoveFilesAsync(It.IsAny(), It.IsAny>(), It.IsAny>(), It.IsAny()), Times.AtLeastOnce()); @@ -175,141 +177,6 @@ public void GivenAPayload_WhenDequedFromPayloadAssembler_ExpectThePayloadBeProce _logger.VerifyLogging($"Payload {payload.Id} added to {service.ServiceName} for processing.", LogLevel.Information, Times.AtLeastOnce()); } - //[RetryFact(DisplayName = "Payload Notification Service shall upload files & retry on failure")] - //public void PayloadNotificationService_ShalUploadFilesAndRetryOnFailure() - //{ - // _fileSystem.Setup(p => p.File.OpenRead(It.IsAny())).Throws(new Exception("error")); - // _fileSystem.Setup(p => p.Path.IsPathRooted(It.IsAny())).Callback((string path) => System.IO.Path.IsPathRooted(path)); - - // var fileInfo = new DicomFileStorageMetadata(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "study", "series", "sop") - // { - // Source = "RAET", - // CalledAeTitle = "AET" - // }; - - // var payload = new Payload("test", Guid.NewGuid().ToString(), 100) { State = Payload.PayloadState.Upload }; - // payload.Add(fileInfo); - - // var fileSent = false; - // _payloadAssembler.Setup(p => p.Dequeue(It.IsAny())) - // .Returns((CancellationToken cancellationToken) => - // { - // if (fileSent) - // { - // cancellationToken.WaitHandle.WaitOne(); - // return null; - // } - - // fileSent = true; - // _cancellationTokenSource.CancelAfter(1000); - // return payload; - // }); - - // var service = new PayloadNotificationService(_serviceScopeFactory.Object, _logger.Object, _options); - - // service.StartAsync(_cancellationTokenSource.Token); - - // _cancellationTokenSource.Token.WaitHandle.WaitOne(); - // _logger.VerifyLogging($"Uploading payload {payload.Id} to storage service at {_options.Value.Storage.StorageServiceBucketName}.", LogLevel.Information, Times.Exactly(2)); - // _logger.VerifyLogging($"Failed to upload payload {payload.Id}; added back to queue for retry.", LogLevel.Warning, Times.Once()); - // _logger.VerifyLogging($"Updating payload {payload.Id} state={payload.State}, retries=1.", LogLevel.Error, Times.Once()); - // _logger.VerifyLogging($"Reached maximum number of retries for payload {payload.Id}, giving up.", LogLevel.Error, Times.Once()); - - // _logger.VerifyLoggingMessageBeginsWith($"Uploading file ", LogLevel.Debug, Times.Exactly(2)); - // _instanceCleanupQueue.Verify(p => p.Queue(It.IsAny()), Times.Never()); - //} - - //[RetryFact(DisplayName = "Payload Notification Service shall publish workflow request & retry on failure")] - //public void PayloadNotificationService_ShallPublishAndRetryOnFailure() - //{ - // _payloadAssembler.Setup(p => p.Dequeue(It.IsAny())) - // .Callback(() => _cancellationTokenSource.Token.WaitHandle.WaitOne()); - // _messageBrokerPublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())).Throws(new Exception("error")); - - // var payload = new Payload("test", Guid.NewGuid().ToString(), 100) { State = Payload.PayloadState.Notify }; - // var metadata = new DicomFileStorageMetadata(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "study", "series", "sop") - // { - // Source = "RAET", - // CalledAeTitle = "AET" - // }; - // metadata.SetWorkflows("workflow1", "workflow2"); - // payload.Add(metadata); - - // _payloadRepository.Setup(p => p.AsQueryable()) - // .Returns((new List { payload }).AsQueryable()) - // .Callback(() => _cancellationTokenSource.CancelAfter(500)); - - // var service = new PayloadNotificationService(_serviceScopeFactory.Object, _logger.Object, _options); - - // _cancellationTokenSource.CancelAfter(1000); - // service.StartAsync(_cancellationTokenSource.Token); - - // _cancellationTokenSource.Token.WaitHandle.WaitOne(); - // _logger.VerifyLogging($"Generating workflow request message for payload {payload.Id}...", LogLevel.Debug, Times.Exactly(2)); - // _logger.VerifyLoggingMessageBeginsWith($"Publishing workflow request message ID=", LogLevel.Information, Times.Exactly(2)); - // _logger.VerifyLoggingMessageBeginsWith($"Workflow request published, ID=", LogLevel.Information, Times.Never()); - // _logger.VerifyLogging($"Failed to publish workflow request for payload {payload.Id}; added back to queue for retry.", LogLevel.Warning, Times.Once()); - // _logger.VerifyLogging($"Updating payload {payload.Id} state={payload.State}, retries=1.", LogLevel.Error, Times.Once()); - // _logger.VerifyLogging($"Reached maximum number of retries for payload {payload.Id}, giving up.", LogLevel.Error, Times.Once()); - //} - - //[RetryFact(DisplayName = "Payload Notification Service shall upload files & publish")] - //public void PayloadNotificationService_ShalUploadFilesAndPublish() - //{ - // _fileSystem.Setup(p => p.File.OpenRead(It.IsAny())).Returns(Stream.Null); - // _fileSystem.Setup(p => p.Path.IsPathRooted(It.IsAny())).Callback((string path) => Path.IsPathRooted(path)); - // _storageService.Setup(p => p.PutObjectAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>(), It.IsAny())); - - // _messageBrokerPublisherService.Setup(p => p.Publish(It.IsAny(), It.IsAny())) - // .Callback(() => _cancellationTokenSource.CancelAfter(500)); - - // var fileInfo = new DicomFileStorageInfo(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), "study", "series", "sop") - // { - // Source = "RAET", - // CalledAeTitle = "AET" - // }; - // fileInfo.SetWorkflows("workflow1", "workflow2"); - // var uploadPath = Path.Combine("study", "series", "instance.dcm"); - // var payload = new Payload("test", Guid.NewGuid().ToString(), 100) { State = Payload.PayloadState.Upload }; - // payload.Add(fileInfo); - - // var filePath = payload.Files[0].FilePath; - - // var fileSent = false; - // _payloadAssembler.Setup(p => p.Dequeue(It.IsAny())) - // .Returns((CancellationToken cancellationToken) => - // { - // if (fileSent) - // { - // cancellationToken.WaitHandle.WaitOne(); - // return null; - // } - - // fileSent = true; - // return payload; - // }); - - // var service = new PayloadNotificationService(_serviceScopeFactory.Object, _logger.Object, _options); - - // service.StartAsync(_cancellationTokenSource.Token); - - // _cancellationTokenSource.Token.WaitHandle.WaitOne(); - // _logger.VerifyLogging($"Uploading payload {payload.Id} to storage service at {_options.Value.Storage.StorageServiceBucketName}.", LogLevel.Information, Times.Once()); - // _logger.VerifyLogging($"Uploading file {filePath} from payload {payload.Id} to storage service.", LogLevel.Debug, Times.Once()); - // _logger.VerifyLogging($"Payload {payload.Id} ready to be published.", LogLevel.Information, Times.Once()); - // _logger.VerifyLoggingMessageBeginsWith($"Workflow request published to {_options.Value.Messaging.Topics.WorkflowRequest}, message ID=", LogLevel.Information, Times.Once()); - - // _storageService.Verify(p => p.PutObjectAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>(), It.IsAny()), Times.Exactly(2)); - - // _instanceCleanupQueue.Verify(p => p.Queue(It.IsAny()), Times.Once()); - - // _messageBrokerPublisherService.Verify( - // p => p.Publish( - // It.Is(p => p.Equals(_options.Value.Messaging.Topics.WorkflowRequest)), - // It.Is(p => VerifyHelper(payload, p))) - // , Times.Once()); - //} - private bool VerifyHelper(Payload payload, Message message) { var workflowRequestEvent = message.ConvertTo(); diff --git a/src/InformaticsGateway/Test/Services/Export/DicomWebExportServiceTest.cs b/src/InformaticsGateway/Test/Services/Export/DicomWebExportServiceTest.cs index 3d4e46c40..f2f649737 100644 --- a/src/InformaticsGateway/Test/Services/Export/DicomWebExportServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/Export/DicomWebExportServiceTest.cs @@ -30,8 +30,8 @@ using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.DicomWeb.Client; -using Monai.Deploy.InformaticsGateway.Repositories; using Monai.Deploy.InformaticsGateway.Services.Export; using Monai.Deploy.InformaticsGateway.Services.Storage; using Monai.Deploy.InformaticsGateway.SharedTest; @@ -139,7 +139,7 @@ public async Task ExportDataBlockCallback_ReturnsNullIfInferenceRequestCannotBeF _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); - _inferenceRequestStore.Setup(p => p.GetInferenceRequest(It.IsAny())).Returns((InferenceRequest)null); + _inferenceRequestStore.Setup(p => p.GetInferenceRequestAsync(It.IsAny(), It.IsAny())).ReturnsAsync((InferenceRequest)null); var service = new DicomWebExportService( _loggerFactory.Object, @@ -194,7 +194,7 @@ public async Task ExportDataBlockCallback_ReturnsNullIfInferenceRequestContainsN _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); - _inferenceRequestStore.Setup(p => p.GetInferenceRequest(It.IsAny())).Returns(inferenceRequest); + _inferenceRequestStore.Setup(p => p.GetInferenceRequestAsync(It.IsAny(), It.IsAny())).ReturnsAsync(inferenceRequest); var service = new DicomWebExportService( _loggerFactory.Object, @@ -260,7 +260,7 @@ public async Task ExportDataBlockCallback_RecordsStowFailuresAndReportFailure() _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); - _inferenceRequestStore.Setup(p => p.GetInferenceRequest(It.IsAny())).Returns(inferenceRequest); + _inferenceRequestStore.Setup(p => p.GetInferenceRequestAsync(It.IsAny(), It.IsAny())).ReturnsAsync(inferenceRequest); _dicomToolkit.Setup(p => p.Load(It.IsAny())).Returns(InstanceGenerator.GenerateDicomFile(sopInstanceUid: sopInstanceUid)); _handlerMock = new Mock(); @@ -343,7 +343,7 @@ public async Task CompletesDataflow(HttpStatusCode httpStatusCode) _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); - _inferenceRequestStore.Setup(p => p.GetInferenceRequest(It.IsAny())).Returns(inferenceRequest); + _inferenceRequestStore.Setup(p => p.GetInferenceRequestAsync(It.IsAny(), It.IsAny())).ReturnsAsync(inferenceRequest); _dicomToolkit.Setup(p => p.Load(It.IsAny())).Returns(InstanceGenerator.GenerateDicomFile()); var response = new HttpResponseMessage(httpStatusCode) diff --git a/src/InformaticsGateway/Test/Services/Export/ScuExportServiceTest.cs b/src/InformaticsGateway/Test/Services/Export/ScuExportServiceTest.cs index 6573eac55..efb4cdab4 100644 --- a/src/InformaticsGateway/Test/Services/Export/ScuExportServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/Export/ScuExportServiceTest.cs @@ -29,7 +29,7 @@ using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Services.Export; using Monai.Deploy.InformaticsGateway.Services.Storage; using Monai.Deploy.InformaticsGateway.SharedTest; @@ -55,7 +55,7 @@ public class ScuExportServiceTest private readonly Mock _serviceScopeFactory; private readonly IOptions _configuration; private readonly Mock _dicomToolkit; - private readonly Mock> _repository; + private readonly Mock _repository; private readonly Mock _storageInfoProvider; private readonly CancellationTokenSource _cancellationTokenSource; @@ -75,12 +75,12 @@ public ScuExportServiceTest(DicomScpFixture dicomScp) _configuration = Options.Create(new InformaticsGatewayConfiguration()); _dicomToolkit = new Mock(); _cancellationTokenSource = new CancellationTokenSource(); - _repository = new Mock>(); + _repository = new Mock(); _storageInfoProvider = new Mock(); var serviceProvider = new Mock(); serviceProvider - .Setup(x => x.GetService(typeof(IInformaticsGatewayRepository))) + .Setup(x => x.GetService(typeof(IDestinationApplicationEntityRepository))) .Returns(_repository.Object); serviceProvider .Setup(x => x.GetService(typeof(IMessageBrokerPublisherService))) @@ -177,7 +177,7 @@ public async Task ShallFailWhenDestinationIsNotConfigured() _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); - _repository.Setup(p => p.FirstOrDefault(It.IsAny>())).Returns(default(DestinationApplicationEntity)); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(default(DestinationApplicationEntity)); var service = new ScuExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object); @@ -226,7 +226,7 @@ public async Task AssociationRejected() _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); - _repository.Setup(p => p.FirstOrDefault(It.IsAny>())).Returns(destination); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); _dicomToolkit.Setup(p => p.Load(It.IsAny())).Returns(InstanceGenerator.GenerateDicomFile(sopInstanceUid: sopInstanceUid)); var service = new ScuExportService(_logger.Object, _serviceScopeFactory.Object, _configuration, _dicomToolkit.Object); @@ -279,7 +279,7 @@ public async Task SimulateAbort() _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); - _repository.Setup(p => p.FirstOrDefault(It.IsAny>())).Returns(destination); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); _dicomToolkit.Setup(p => p.Load(It.IsAny())).Returns(InstanceGenerator.GenerateDicomFile(sopInstanceUid: sopInstanceUid)); var dataflowCompleted = new ManualResetEvent(false); @@ -330,7 +330,7 @@ public async Task CStoreFailure() _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); - _repository.Setup(p => p.FirstOrDefault(It.IsAny>())).Returns(destination); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); _dicomToolkit.Setup(p => p.Load(It.IsAny())).Returns(InstanceGenerator.GenerateDicomFile(sopInstanceUid: sopInstanceUid)); var dataflowCompleted = new ManualResetEvent(false); @@ -381,7 +381,7 @@ public async Task ErrorLoadingDicomContent() _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); - _repository.Setup(p => p.FirstOrDefault(It.IsAny>())).Returns(destination); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); _dicomToolkit.Setup(p => p.Load(It.IsAny())).Throws(new Exception("error")); var dataflowCompleted = new ManualResetEvent(false); @@ -432,7 +432,7 @@ public async Task UnreachableServer() _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); - _repository.Setup(p => p.FirstOrDefault(It.IsAny>())).Returns(destination); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); _dicomToolkit.Setup(p => p.Load(It.IsAny())).Returns(InstanceGenerator.GenerateDicomFile(sopInstanceUid: sopInstanceUid)); var dataflowCompleted = new ManualResetEvent(false); @@ -482,7 +482,7 @@ public async Task ExportCompletes() _storageService.Setup(p => p.GetObjectAsync(It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(new MemoryStream(Encoding.UTF8.GetBytes("test"))); - _repository.Setup(p => p.FirstOrDefault(It.IsAny>())).Returns(destination); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(destination); _dicomToolkit.Setup(p => p.Load(It.IsAny())).Returns(InstanceGenerator.GenerateDicomFile(sopInstanceUid: sopInstanceUid)); var dataflowCompleted = new ManualResetEvent(false); diff --git a/src/InformaticsGateway/Test/Services/Http/DestinationAeTitleControllerTest.cs b/src/InformaticsGateway/Test/Services/Http/DestinationAeTitleControllerTest.cs index 0f4513309..c695b6068 100644 --- a/src/InformaticsGateway/Test/Services/Http/DestinationAeTitleControllerTest.cs +++ b/src/InformaticsGateway/Test/Services/Http/DestinationAeTitleControllerTest.cs @@ -17,6 +17,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Linq.Expressions; using System.Net; using System.Threading; using System.Threading.Tasks; @@ -25,7 +26,7 @@ using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.Extensions.Logging; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Services.Http; using Monai.Deploy.InformaticsGateway.Services.Scu; using Moq; @@ -40,7 +41,7 @@ public class DestinationAeTitleControllerTest private readonly Mock _problemDetailsFactory; private readonly Mock> _logger; private readonly Mock _scuQueue; - private readonly Mock> _repository; + private readonly Mock _repository; public DestinationAeTitleControllerTest() { @@ -68,7 +69,7 @@ public DestinationAeTitleControllerTest() }; }); - _repository = new Mock>(); + _repository = new Mock(); var controllerContext = new ControllerContext { HttpContext = new DefaultHttpContext() }; _controller = new DestinationAeTitleController( @@ -98,19 +99,19 @@ public async Task Get_ShallReturnAllDestinationAets() }); } - _repository.Setup(p => p.ToListAsync()).Returns(Task.FromResult(data)); + _repository.Setup(p => p.ToListAsync(It.IsAny())).Returns(Task.FromResult(data)); var result = await _controller.Get(); var okObjectResult = result.Result as OkObjectResult; var response = okObjectResult.Value as IEnumerable; Assert.Equal(data.Count, response.Count()); - _repository.Verify(p => p.ToListAsync(), Times.Once()); + _repository.Verify(p => p.ToListAsync(It.IsAny()), Times.Once()); } [RetryFact(5, 250, DisplayName = "Get - Shall return problem on failure")] public async Task Get_ShallReturnProblemOnFailure() { - _repository.Setup(p => p.ToListAsync()).Throws(new Exception("error")); + _repository.Setup(p => p.ToListAsync(It.IsAny())).Throws(new Exception("error")); var result = await _controller.Get(); var objectResult = result.Result as ObjectResult; @@ -130,39 +131,38 @@ public async Task Get_ShallReturnProblemOnFailure() public async Task GetAeTitle_ReturnsAMatch() { var value = "AET"; - _repository.Setup(p => p.FindAsync(It.IsAny())).Returns( - Task.FromResult( + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync( new DestinationApplicationEntity { AeTitle = value, Name = value - })); + }); var result = await _controller.GetAeTitle(value); var okObjectResult = result.Result as OkObjectResult; var response = okObjectResult.Value as DestinationApplicationEntity; Assert.NotNull(response); Assert.Equal(value, response.AeTitle); - _repository.Verify(p => p.FindAsync(value), Times.Once()); + _repository.Verify(p => p.FindByNameAsync(value, It.IsAny()), Times.Once()); } [RetryFact(5, 250, DisplayName = "GetAeTitle - Shall return 404 if not found")] public async Task GetAeTitle_Returns404IfNotFound() { var value = "AET"; - _repository.Setup(p => p.FindAsync(It.IsAny())).Returns(Task.FromResult(default(DestinationApplicationEntity))); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(default(DestinationApplicationEntity))); var result = await _controller.GetAeTitle(value); Assert.IsType(result.Result); - _repository.Verify(p => p.FindAsync(value), Times.Once()); + _repository.Verify(p => p.FindByNameAsync(value, It.IsAny()), Times.Once()); } [RetryFact(5, 250, DisplayName = "GetAeTitle - Shall return problem on failure")] public async Task GetAeTitle_ShallReturnProblemOnFailure() { var value = "AET"; - _repository.Setup(p => p.FindAsync(It.IsAny())).Throws(new Exception("error")); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Throws(new Exception("error")); var result = await _controller.GetAeTitle(value); @@ -173,7 +173,7 @@ public async Task GetAeTitle_ShallReturnProblemOnFailure() Assert.Equal("Error querying DICOM destinations.", problem.Title); Assert.Equal("error", problem.Detail); Assert.Equal((int)HttpStatusCode.InternalServerError, problem.Status); - _repository.Verify(p => p.FindAsync(value), Times.Once()); + _repository.Verify(p => p.FindByNameAsync(value, It.IsAny()), Times.Once()); } #endregion GetAeTitle @@ -192,7 +192,7 @@ public async Task GivenAnEmptyString_WhenCEchoIsCalled_Returns404() [RetryFact(5, 250)] public async Task GivenADestinationName_WhenCEchoIsCalledAndEntityCannotBeFound_Returns404() { - _repository.Setup(p => p.FindAsync(It.IsAny())).ReturnsAsync(default(DestinationApplicationEntity)); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).ReturnsAsync(default(DestinationApplicationEntity)); var result = await _controller.CEcho("AET"); var notFoundResult = result as NotFoundResult; Assert.NotNull(notFoundResult); @@ -202,7 +202,7 @@ public async Task GivenADestinationName_WhenCEchoIsCalledAndEntityCannotBeFound_ [RetryFact(5, 250)] public async Task GivenADestinationName_WhenCEchoIsCalledWithAnError_Returns502() { - _repository.Setup(p => p.FindAsync(It.IsAny())) + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(new DestinationApplicationEntity { AeTitle = "AET", @@ -230,7 +230,7 @@ public async Task GivenADestinationName_WhenCEchoIsCalledWithAnError_Returns502( [RetryFact(5, 250)] public async Task GivenADestinationName_WhenCEchoIsCalledWithUnhandledError_Returns500() { - _repository.Setup(p => p.FindAsync(It.IsAny())) + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(new DestinationApplicationEntity { AeTitle = "AET", @@ -253,7 +253,7 @@ public async Task GivenADestinationName_WhenCEchoIsCalledWithUnhandledError_Retu [RetryFact(5, 250)] public async Task GivenADestinationName_WhenCEchoIsCalledSuccessfully_Returns200() { - _repository.Setup(p => p.FindAsync(It.IsAny())) + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(new DestinationApplicationEntity { AeTitle = "AET", @@ -313,7 +313,7 @@ public async Task Create_ShallReturnConflictIfEntityAlreadyExists() Port = 1 }; - _repository.Setup(p => p.Any(It.IsAny>())).Returns(true); + _repository.Setup(p => p.ContainsAsync(It.IsAny>>(), It.IsAny())).ReturnsAsync(true); var result = await _controller.Create(aeTitles); @@ -368,14 +368,12 @@ public async Task Create_ShallReturnCreatedAtAction() }; _repository.Setup(p => p.AddAsync(It.IsAny(), It.IsAny())); - _repository.Setup(p => p.SaveChangesAsync(It.IsAny())); var result = await _controller.Create(aeTitles); Assert.IsType(result.Result); _repository.Verify(p => p.AddAsync(It.IsAny(), It.IsAny()), Times.Once()); - _repository.Verify(p => p.SaveChangesAsync(It.IsAny()), Times.Once()); } #endregion Create @@ -393,10 +391,8 @@ public async Task Update_ReturnsUpdated() Port = 123, }; - _repository.Setup(p => p.FindAsync(It.IsAny())).Returns(Task.FromResult(entity)); - _repository.Setup(p => p.Remove(It.IsAny())); - _repository.Setup(p => p.SaveChangesAsync(It.IsAny())); - _repository.Setup(p => p.Update(It.IsAny())); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(entity)); + _repository.Setup(p => p.UpdateAsync(It.IsAny(), It.IsAny())); var result = await _controller.Edit(entity); var okResult = result.Result as OkObjectResult; @@ -408,9 +404,8 @@ public async Task Update_ReturnsUpdated() Assert.Equal(entity.Name, updatedEntity.Name); Assert.Equal(entity.Port, updatedEntity.Port); - _repository.Verify(p => p.FindAsync(entity.Name), Times.Once()); - _repository.Verify(p => p.Update(entity), Times.Once()); - _repository.Verify(p => p.SaveChangesAsync(It.IsAny()), Times.Once()); + _repository.Verify(p => p.FindByNameAsync(entity.Name, It.IsAny()), Times.Once()); + _repository.Verify(p => p.UpdateAsync(entity, It.IsAny()), Times.Once()); } [RetryFact(5, 250, DisplayName = "Update - Shall return 404 if input is null")] @@ -431,12 +426,12 @@ public async Task Update_Returns404IfNotFound() Name = "AET", Port = 123, }; - _repository.Setup(p => p.FindAsync(It.IsAny())).Returns(Task.FromResult(default(DestinationApplicationEntity))); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(default(DestinationApplicationEntity))); var result = await _controller.Edit(entity); Assert.IsType(result.Result); - _repository.Verify(p => p.FindAsync(entity.Name), Times.Once()); + _repository.Verify(p => p.FindByNameAsync(entity.Name, It.IsAny()), Times.Once()); } [RetryFact(5, 250, DisplayName = "Update - Shall return problem on failure")] @@ -450,8 +445,8 @@ public async Task Update_ShallReturnProblemOnFailure() Name = value, Port = 123, }; - _repository.Setup(p => p.FindAsync(It.IsAny())).Returns(Task.FromResult(entity)); - _repository.Setup(p => p.Update(It.IsAny())).Throws(new Exception("error")); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(entity)); + _repository.Setup(p => p.UpdateAsync(It.IsAny(), It.IsAny())).Throws(new Exception("error")); var result = await _controller.Edit(entity); @@ -462,7 +457,7 @@ public async Task Update_ShallReturnProblemOnFailure() Assert.Equal("Error updating DICOM destination.", problem.Title); Assert.Equal("error", problem.Detail); Assert.Equal((int)HttpStatusCode.InternalServerError, problem.Status); - _repository.Verify(p => p.FindAsync(value), Times.Once()); + _repository.Verify(p => p.FindByNameAsync(value, It.IsAny()), Times.Once()); } [RetryFact(5, 250, DisplayName = "Update - Shall return problem on validation failure")] @@ -477,7 +472,7 @@ public async Task Update_ShallReturnBadRequestWithBadAeTitle() Port = 1 }; - _repository.Setup(p => p.FindAsync(It.IsAny())).Returns(Task.FromResult(entity)); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(entity)); var result = await _controller.Edit(entity); var objectResult = result.Result as ObjectResult; @@ -502,31 +497,29 @@ public async Task Delete_ReturnsDeleted() AeTitle = value, Name = value }; - _repository.Setup(p => p.FindAsync(It.IsAny())).Returns(Task.FromResult(entity)); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(entity)); - _repository.Setup(p => p.Remove(It.IsAny())); - _repository.Setup(p => p.SaveChangesAsync(It.IsAny())); + _repository.Setup(p => p.RemoveAsync(It.IsAny(), It.IsAny())); var result = await _controller.Delete(value); var okObjectResult = result.Result as OkObjectResult; var response = okObjectResult.Value as DestinationApplicationEntity; Assert.NotNull(response); Assert.Equal(value, response.AeTitle); - _repository.Verify(p => p.FindAsync(value), Times.Once()); - _repository.Verify(p => p.Remove(entity), Times.Once()); - _repository.Verify(p => p.SaveChangesAsync(It.IsAny()), Times.Once()); + _repository.Verify(p => p.FindByNameAsync(value, It.IsAny()), Times.Once()); + _repository.Verify(p => p.RemoveAsync(entity, It.IsAny()), Times.Once()); } [RetryFact(5, 250, DisplayName = "Delete - Shall return 404 if not found")] public async Task Delete_Returns404IfNotFound() { var value = "AET"; - _repository.Setup(p => p.FindAsync(It.IsAny())).Returns(Task.FromResult(default(DestinationApplicationEntity))); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(default(DestinationApplicationEntity))); var result = await _controller.Delete(value); Assert.IsType(result.Result); - _repository.Verify(p => p.FindAsync(value), Times.Once()); + _repository.Verify(p => p.FindByNameAsync(value, It.IsAny()), Times.Once()); } [RetryFact(5, 250, DisplayName = "Delete - Shall return problem on failure")] @@ -538,8 +531,8 @@ public async Task Delete_ShallReturnProblemOnFailure() AeTitle = value, Name = value }; - _repository.Setup(p => p.FindAsync(It.IsAny())).Returns(Task.FromResult(entity)); - _repository.Setup(p => p.Remove(It.IsAny())).Throws(new Exception("error")); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(entity)); + _repository.Setup(p => p.RemoveAsync(It.IsAny(), It.IsAny())).Throws(new Exception("error")); var result = await _controller.Delete(value); @@ -550,7 +543,7 @@ public async Task Delete_ShallReturnProblemOnFailure() Assert.Equal("Error deleting DICOM destination.", problem.Title); Assert.Equal("error", problem.Detail); Assert.Equal((int)HttpStatusCode.InternalServerError, problem.Status); - _repository.Verify(p => p.FindAsync(value), Times.Once()); + _repository.Verify(p => p.FindByNameAsync(value, It.IsAny()), Times.Once()); } #endregion Delete diff --git a/src/InformaticsGateway/Test/Services/Http/InferenceControllerTest.cs b/src/InformaticsGateway/Test/Services/Http/InferenceControllerTest.cs index 68e6d5cb6..8aadd13d8 100644 --- a/src/InformaticsGateway/Test/Services/Http/InferenceControllerTest.cs +++ b/src/InformaticsGateway/Test/Services/Http/InferenceControllerTest.cs @@ -17,6 +17,7 @@ using System; using System.Collections.Generic; using System.IO.Abstractions; +using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -24,7 +25,7 @@ using Microsoft.Extensions.Logging; using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Repositories; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Services.Http; using Moq; using xRetry; @@ -67,8 +68,11 @@ public InferenceControllerTest() Instance = instance }; }); + var controllerContext = new ControllerContext { HttpContext = new DefaultHttpContext() }; + _controller = new InferenceController(_inferenceRequestRepository.Object, _logger.Object) { + ControllerContext = controllerContext, ProblemDetailsFactory = _problemDetailsFactory.Object }; } @@ -138,7 +142,7 @@ public void NewInferenceRequest_ShallReturnProblemIfOutputIsInvalid() [RetryFact(5, 250, DisplayName = "NewInferenceRequest - shall return problem if same transactionId exits")] public void NewInferenceRequest_ShallReturnProblemIfSameTransactionIdExists() { - _inferenceRequestRepository.Setup(p => p.Exists(It.IsAny())).Returns(true); + _inferenceRequestRepository.Setup(p => p.ExistsAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true); var input = new InferenceRequest { @@ -191,7 +195,7 @@ public void NewInferenceRequest_ShallReturnProblemIfFailedToAddJob() { _fileSystem.Setup(p => p.Directory.CreateDirectory(It.IsAny())); _fileSystem.Setup(p => p.Path.Combine(It.IsAny(), It.IsAny())).Returns((string path1, string path2) => System.IO.Path.Combine(path1, path2)); - _inferenceRequestRepository.Setup(p => p.Add(It.IsAny())) + _inferenceRequestRepository.Setup(p => p.AddAsync(It.IsAny(), It.IsAny())) .Throws(new Exception("error")); var input = new InferenceRequest @@ -245,7 +249,7 @@ public void NewInferenceRequest_ShallAcceptInferenceRequest() { _fileSystem.Setup(p => p.Directory.CreateDirectory(It.IsAny())); _fileSystem.Setup(p => p.Path.Combine(It.IsAny(), It.IsAny())).Returns((string path1, string path2) => System.IO.Path.Combine(path1, path2)); - _inferenceRequestRepository.Setup(p => p.Add(It.IsAny())); + _inferenceRequestRepository.Setup(p => p.AddAsync(It.IsAny(), It.IsAny())); var input = new InferenceRequest { @@ -284,7 +288,7 @@ public void NewInferenceRequest_ShallAcceptInferenceRequest() var result = _controller.NewInferenceRequest(input); - _inferenceRequestRepository.Verify(p => p.Add(input), Times.Once()); + _inferenceRequestRepository.Verify(p => p.AddAsync(input, It.IsAny()), Times.Once()); Assert.NotNull(result); var objectResult = result.Result as OkObjectResult; @@ -297,13 +301,13 @@ public void NewInferenceRequest_ShallAcceptInferenceRequest() [RetryFact(5, 250, DisplayName = "Status - return 404 if not found")] public void Status_NotFound() { - _inferenceRequestRepository.Setup(p => p.GetStatus(It.IsAny())) + _inferenceRequestRepository.Setup(p => p.GetStatusAsync(It.IsAny(), It.IsAny())) .Returns(Task.FromResult((InferenceStatusResponse)null)); var jobId = Guid.NewGuid().ToString(); var result = _controller.JobStatus(jobId); - _inferenceRequestRepository.Verify(p => p.GetStatus(jobId), Times.Once()); + _inferenceRequestRepository.Verify(p => p.GetStatusAsync(jobId, It.IsAny()), Times.Once()); Assert.NotNull(result); var objectResult = result.Result as ObjectResult; @@ -317,13 +321,13 @@ public void Status_NotFound() [RetryFact(5, 250, DisplayName = "Status - return 500 on error")] public void Status_ShallReturnProblemException() { - _inferenceRequestRepository.Setup(p => p.GetStatus(It.IsAny())) + _inferenceRequestRepository.Setup(p => p.GetStatusAsync(It.IsAny(), It.IsAny())) .Throws(new Exception("error")); var jobId = Guid.NewGuid().ToString(); var result = _controller.JobStatus(jobId); - _inferenceRequestRepository.Verify(p => p.GetStatus(jobId), Times.Once()); + _inferenceRequestRepository.Verify(p => p.GetStatusAsync(jobId, It.IsAny()), Times.Once()); Assert.NotNull(result); var objectResult = result.Result as ObjectResult; @@ -337,7 +341,7 @@ public void Status_ShallReturnProblemException() [RetryFact(5, 250, DisplayName = "Status - returns 200")] public void Status_ReturnsStatus() { - _inferenceRequestRepository.Setup(p => p.GetStatus(It.IsAny())) + _inferenceRequestRepository.Setup(p => p.GetStatusAsync(It.IsAny(), It.IsAny())) .Returns(Task.FromResult( new InferenceStatusResponse { @@ -347,7 +351,7 @@ public void Status_ReturnsStatus() var jobId = Guid.NewGuid().ToString(); var result = _controller.JobStatus(jobId); - _inferenceRequestRepository.Verify(p => p.GetStatus(jobId), Times.Once()); + _inferenceRequestRepository.Verify(p => p.GetStatusAsync(jobId, It.IsAny()), Times.Once()); Assert.NotNull(result); var objectResult = result.Result as OkObjectResult; diff --git a/src/InformaticsGateway/Test/Services/Http/MonaiAeTitleControllerTest.cs b/src/InformaticsGateway/Test/Services/Http/MonaiAeTitleControllerTest.cs index 466e91496..db8a80d93 100644 --- a/src/InformaticsGateway/Test/Services/Http/MonaiAeTitleControllerTest.cs +++ b/src/InformaticsGateway/Test/Services/Http/MonaiAeTitleControllerTest.cs @@ -17,6 +17,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Linq.Expressions; using System.Net; using System.Threading; using System.Threading.Tasks; @@ -25,7 +26,7 @@ using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.Extensions.Logging; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Services.Http; using Monai.Deploy.InformaticsGateway.Services.Scp; using Moq; @@ -40,7 +41,7 @@ public class MonaiAeTitleControllerTest private readonly Mock _problemDetailsFactory; private readonly Mock> _logger; private readonly Mock _aeChangedNotificationService; - private readonly Mock> _repository; + private readonly Mock _repository; public MonaiAeTitleControllerTest() { @@ -68,13 +69,15 @@ public MonaiAeTitleControllerTest() }; }); - _repository = new Mock>(); + _repository = new Mock(); + var controllerContext = new ControllerContext { HttpContext = new DefaultHttpContext() }; _controller = new MonaiAeTitleController( _logger.Object, _aeChangedNotificationService.Object, _repository.Object) { + ControllerContext = controllerContext, ProblemDetailsFactory = _problemDetailsFactory.Object }; } @@ -95,19 +98,19 @@ public async Task Get_ShallReturnAllMonaiAets() }); } - _repository.Setup(p => p.ToListAsync()).Returns(Task.FromResult(data)); + _repository.Setup(p => p.ToListAsync(It.IsAny())).Returns(Task.FromResult(data)); var result = await _controller.Get(); var okObjectResult = result.Result as OkObjectResult; var response = okObjectResult.Value as IEnumerable; Assert.Equal(data.Count, response.Count()); - _repository.Verify(p => p.ToListAsync(), Times.Once()); + _repository.Verify(p => p.ToListAsync(It.IsAny()), Times.Once()); } [RetryFact(5, 250, DisplayName = "Get - Shall return problem on failure")] public async Task Get_ShallReturnProblemOnFailure() { - _repository.Setup(p => p.ToListAsync()).Throws(new Exception("error")); + _repository.Setup(p => p.ToListAsync(It.IsAny())).Throws(new Exception("error")); var result = await _controller.Get(); var objectResult = result.Result as ObjectResult; @@ -127,7 +130,7 @@ public async Task Get_ShallReturnProblemOnFailure() public async Task GetAeTitle_ReturnsAMatch() { var value = "AET"; - _repository.Setup(p => p.FindAsync(It.IsAny())).Returns( + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Returns( Task.FromResult( new MonaiApplicationEntity { @@ -141,26 +144,26 @@ public async Task GetAeTitle_ReturnsAMatch() var response = okObjectResult.Value as MonaiApplicationEntity; Assert.NotNull(response); Assert.Equal(value, response.AeTitle); - _repository.Verify(p => p.FindAsync(value), Times.Once()); + _repository.Verify(p => p.FindByNameAsync(value, It.IsAny()), Times.Once()); } [RetryFact(5, 250, DisplayName = "GetAeTitle - Shall return 404 if not found")] public async Task GetAeTitle_Returns404IfNotFound() { var value = "AET"; - _repository.Setup(p => p.FindAsync(It.IsAny())).Returns(Task.FromResult(default(MonaiApplicationEntity))); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(default(MonaiApplicationEntity))); var result = await _controller.GetAeTitle(value); Assert.IsType(result.Result); - _repository.Verify(p => p.FindAsync(value), Times.Once()); + _repository.Verify(p => p.FindByNameAsync(value, It.IsAny()), Times.Once()); } [RetryFact(5, 250, DisplayName = "GetAeTitle - Shall return problem on failure")] public async Task GetAeTitle_ShallReturnProblemOnFailure() { var value = "AET"; - _repository.Setup(p => p.FindAsync(It.IsAny())).Throws(new Exception("error")); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Throws(new Exception("error")); var result = await _controller.GetAeTitle(value); @@ -171,7 +174,7 @@ public async Task GetAeTitle_ShallReturnProblemOnFailure() Assert.Equal("Error querying MONAI Application Entity.", problem.Title); Assert.Equal("error", problem.Detail); Assert.Equal((int)HttpStatusCode.InternalServerError, problem.Status); - _repository.Verify(p => p.FindAsync(value), Times.Once()); + _repository.Verify(p => p.FindByNameAsync(value, It.IsAny()), Times.Once()); } #endregion GetAeTitle @@ -181,7 +184,7 @@ public async Task GetAeTitle_ShallReturnProblemOnFailure() [Fact(DisplayName = "Create - Shall return Conflict if entity already exists")] public async Task Create_ShallReturnConflictIfIEntityAlreadyExists() { - _repository.Setup(p => p.Any(It.IsAny>())).Returns(true); + _repository.Setup(p => p.ContainsAsync(It.IsAny>>(), It.IsAny())).ReturnsAsync(true); var monaiAeTitle = new MonaiApplicationEntity { @@ -227,7 +230,7 @@ public async Task Create_ShallReturnBadRequestOnValidationFailure() [RetryFact(DisplayName = "Create - Shall return BadRequest when both allowed & ignored SOP classes are defined")] public async Task Create_ShallReturnBadRequestWhenBothAllowedAndIgnoredSopsAreDefined() { - _repository.Setup(p => p.Any(It.IsAny>())).Returns(false); + _repository.Setup(p => p.ContainsAsync(It.IsAny>>(), It.IsAny())).ReturnsAsync(false); var monaiAeTitle = new MonaiApplicationEntity { @@ -289,7 +292,6 @@ public async Task Create_ShallReturnCreatedAtAction() _aeChangedNotificationService.Setup(p => p.Notify(It.IsAny())); _repository.Setup(p => p.AddAsync(It.IsAny(), It.IsAny())); - _repository.Setup(p => p.SaveChangesAsync(It.IsAny())); var result = await _controller.Create(monaiAeTitle); @@ -297,7 +299,6 @@ public async Task Create_ShallReturnCreatedAtAction() _aeChangedNotificationService.Verify(p => p.Notify(It.Is(x => x.ApplicationEntity == monaiAeTitle)), Times.Once()); _repository.Verify(p => p.AddAsync(It.IsAny(), It.IsAny()), Times.Once()); - _repository.Verify(p => p.SaveChangesAsync(It.IsAny()), Times.Once()); } #endregion Create @@ -313,31 +314,29 @@ public async Task Delete_ReturnsDeleted() AeTitle = value, Name = value }; - _repository.Setup(p => p.FindAsync(It.IsAny())).Returns(Task.FromResult(entity)); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(entity)); - _repository.Setup(p => p.Remove(It.IsAny())); - _repository.Setup(p => p.SaveChangesAsync(It.IsAny())); + _repository.Setup(p => p.RemoveAsync(It.IsAny(), It.IsAny())); var result = await _controller.Delete(value); var okObjectResult = result.Result as OkObjectResult; var response = okObjectResult.Value as MonaiApplicationEntity; Assert.NotNull(response); Assert.Equal(value, response.AeTitle); - _repository.Verify(p => p.FindAsync(value), Times.Once()); - _repository.Verify(p => p.Remove(entity), Times.Once()); - _repository.Verify(p => p.SaveChangesAsync(It.IsAny()), Times.Once()); + _repository.Verify(p => p.FindByNameAsync(value, It.IsAny()), Times.Once()); + _repository.Verify(p => p.RemoveAsync(entity, It.IsAny()), Times.Once()); } [RetryFact(5, 250, DisplayName = "Delete - Shall return 404 if not found")] public async Task Delete_Returns404IfNotFound() { var value = "AET"; - _repository.Setup(p => p.FindAsync(It.IsAny())).Returns(Task.FromResult(default(MonaiApplicationEntity))); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(default(MonaiApplicationEntity))); var result = await _controller.Delete(value); Assert.IsType(result.Result); - _repository.Verify(p => p.FindAsync(value), Times.Once()); + _repository.Verify(p => p.FindByNameAsync(value, It.IsAny()), Times.Once()); } [RetryFact(5, 250, DisplayName = "Delete - Shall return problem on failure")] @@ -349,8 +348,8 @@ public async Task Delete_ShallReturnProblemOnFailure() AeTitle = value, Name = value }; - _repository.Setup(p => p.FindAsync(It.IsAny())).Returns(Task.FromResult(entity)); - _repository.Setup(p => p.Remove(It.IsAny())).Throws(new Exception("error")); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(entity)); + _repository.Setup(p => p.RemoveAsync(It.IsAny(), It.IsAny())).Throws(new Exception("error")); var result = await _controller.Delete(value); @@ -361,7 +360,7 @@ public async Task Delete_ShallReturnProblemOnFailure() Assert.Equal("Error deleting MONAI Application Entity.", problem.Title); Assert.Equal("error", problem.Detail); Assert.Equal((int)HttpStatusCode.InternalServerError, problem.Status); - _repository.Verify(p => p.FindAsync(value), Times.Once()); + _repository.Verify(p => p.FindByNameAsync(value, It.IsAny()), Times.Once()); } #endregion Delete diff --git a/src/InformaticsGateway/Test/Services/Http/SourceAeTitleControllerTest.cs b/src/InformaticsGateway/Test/Services/Http/SourceAeTitleControllerTest.cs index e4113d6d4..468a90eba 100644 --- a/src/InformaticsGateway/Test/Services/Http/SourceAeTitleControllerTest.cs +++ b/src/InformaticsGateway/Test/Services/Http/SourceAeTitleControllerTest.cs @@ -17,6 +17,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Linq.Expressions; using System.Net; using System.Threading; using System.Threading.Tasks; @@ -25,7 +26,7 @@ using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.Extensions.Logging; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Services.Http; using Moq; using xRetry; @@ -38,7 +39,7 @@ public class SourceAeTitleControllerTest private readonly SourceAeTitleController _controller; private readonly Mock _problemDetailsFactory; private readonly Mock> _logger; - private readonly Mock> _repository; + private readonly Mock _repository; public SourceAeTitleControllerTest() { @@ -66,7 +67,7 @@ public SourceAeTitleControllerTest() }); var controllerContext = new ControllerContext { HttpContext = new DefaultHttpContext() }; - _repository = new Mock>(); + _repository = new Mock(); _controller = new SourceAeTitleController( _logger.Object, @@ -93,19 +94,19 @@ public async Task Get_ShallReturnAllSourceAets() }); } - _repository.Setup(p => p.ToListAsync()).Returns(Task.FromResult(data)); + _repository.Setup(p => p.ToListAsync(It.IsAny())).Returns(Task.FromResult(data)); var result = await _controller.Get(); var okObjectResult = result.Result as OkObjectResult; var response = okObjectResult.Value as IEnumerable; Assert.Equal(data.Count, response.Count()); - _repository.Verify(p => p.ToListAsync(), Times.Once()); + _repository.Verify(p => p.ToListAsync(It.IsAny()), Times.Once()); } [RetryFact(5, 250, DisplayName = "Get - Shall return problem on failure")] public async Task Get_ShallReturnProblemOnFailure() { - _repository.Setup(p => p.ToListAsync()).Throws(new Exception("error")); + _repository.Setup(p => p.ToListAsync(It.IsAny())).Throws(new Exception("error")); var result = await _controller.Get(); var objectResult = result.Result as ObjectResult; @@ -125,7 +126,7 @@ public async Task Get_ShallReturnProblemOnFailure() public async Task GetAeTitle_ReturnsAMatch() { var value = "AET"; - _repository.Setup(p => p.FindAsync(It.IsAny())).Returns( + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Returns( Task.FromResult( new SourceApplicationEntity { @@ -138,26 +139,26 @@ public async Task GetAeTitle_ReturnsAMatch() var okObjectResult = result.Result as OkObjectResult; var response = okObjectResult.Value as SourceApplicationEntity; Assert.Equal(value, response.AeTitle); - _repository.Verify(p => p.FindAsync(value), Times.Once()); + _repository.Verify(p => p.FindByNameAsync(value, It.IsAny()), Times.Once()); } [RetryFact(5, 250, DisplayName = "GetAeTitle - Shall return 404 if not found")] public async Task GetAeTitle_Returns404IfNotFound() { var value = "AET"; - _repository.Setup(p => p.FindAsync(It.IsAny())).Returns(Task.FromResult(default(SourceApplicationEntity))); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(default(SourceApplicationEntity))); var result = await _controller.GetAeTitle(value); Assert.IsType(result.Result); - _repository.Verify(p => p.FindAsync(value), Times.Once()); + _repository.Verify(p => p.FindByNameAsync(value, It.IsAny()), Times.Once()); } [RetryFact(5, 250, DisplayName = "GetAeTitle - Shall return problem on failure")] public async Task GetAeTitle_ShallReturnProblemOnFailure() { var value = "AET"; - _repository.Setup(p => p.FindAsync(It.IsAny())).Throws(new Exception("error")); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Throws(new Exception("error")); var result = await _controller.GetAeTitle(value); @@ -168,7 +169,7 @@ public async Task GetAeTitle_ShallReturnProblemOnFailure() Assert.Equal("Error querying DICOM sources.", problem.Title); Assert.Equal("error", problem.Detail); Assert.Equal((int)HttpStatusCode.InternalServerError, problem.Status); - _repository.Verify(p => p.FindAsync(value), Times.Once()); + _repository.Verify(p => p.FindByNameAsync(value, It.IsAny()), Times.Once()); } #endregion GetAeTitle @@ -208,7 +209,7 @@ public async Task Create_ShallReturnConflictIfEntityAlreadyExists() Name = aeTitle, }; - _repository.Setup(p => p.Any(It.IsAny>())).Returns(true); + _repository.Setup(p => p.ContainsAsync(It.IsAny>>(), It.IsAny())).ReturnsAsync(true); var result = await _controller.Create(aeTitles); @@ -261,14 +262,12 @@ public async Task Create_ShallReturnCreatedAtAction() }; _repository.Setup(p => p.AddAsync(It.IsAny(), It.IsAny())); - _repository.Setup(p => p.SaveChangesAsync(It.IsAny())); var result = await _controller.Create(aeTitles); Assert.IsType(result.Result); _repository.Verify(p => p.AddAsync(It.IsAny(), It.IsAny()), Times.Once()); - _repository.Verify(p => p.SaveChangesAsync(It.IsAny()), Times.Once()); } #endregion Create @@ -285,10 +284,8 @@ public async Task Update_ReturnsUpdated() Name = "AET", }; - _repository.Setup(p => p.FindAsync(It.IsAny())).Returns(Task.FromResult(entity)); - _repository.Setup(p => p.Remove(It.IsAny())); - _repository.Setup(p => p.SaveChangesAsync(It.IsAny())); - _repository.Setup(p => p.Update(It.IsAny())); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(entity)); + _repository.Setup(p => p.UpdateAsync(It.IsAny(), It.IsAny())); var result = await _controller.Edit(entity); var okResult = result.Result as OkObjectResult; @@ -299,9 +296,8 @@ public async Task Update_ReturnsUpdated() Assert.Equal(entity.HostIp, updatedEntity.HostIp); Assert.Equal(entity.Name, updatedEntity.Name); - _repository.Verify(p => p.FindAsync(entity.Name), Times.Once()); - _repository.Verify(p => p.Update(entity), Times.Once()); - _repository.Verify(p => p.SaveChangesAsync(It.IsAny()), Times.Once()); + _repository.Verify(p => p.FindByNameAsync(entity.Name, It.IsAny()), Times.Once()); + _repository.Verify(p => p.UpdateAsync(entity, It.IsAny()), Times.Once()); } [RetryFact(5, 250, DisplayName = "Update - Shall return 404 if input is null")] @@ -321,12 +317,12 @@ public async Task Update_Returns404IfNotFound() HostIp = "host", Name = "AET", }; - _repository.Setup(p => p.FindAsync(It.IsAny())).Returns(Task.FromResult(default(SourceApplicationEntity))); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(default(SourceApplicationEntity))); var result = await _controller.Edit(entity); Assert.IsType(result.Result); - _repository.Verify(p => p.FindAsync(entity.Name), Times.Once()); + _repository.Verify(p => p.FindByNameAsync(entity.Name, It.IsAny()), Times.Once()); } [RetryFact(5, 250, DisplayName = "Update - Shall return problem on failure")] @@ -339,8 +335,8 @@ public async Task Update_ShallReturnProblemOnFailure() HostIp = "host", Name = value, }; - _repository.Setup(p => p.FindAsync(It.IsAny())).Returns(Task.FromResult(entity)); - _repository.Setup(p => p.Update(It.IsAny())).Throws(new Exception("error")); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(entity)); + _repository.Setup(p => p.UpdateAsync(It.IsAny(), It.IsAny())).Throws(new Exception("error")); var result = await _controller.Edit(entity); @@ -351,7 +347,7 @@ public async Task Update_ShallReturnProblemOnFailure() Assert.Equal("Error updating DICOM source.", problem.Title); Assert.Equal("error", problem.Detail); Assert.Equal((int)HttpStatusCode.InternalServerError, problem.Status); - _repository.Verify(p => p.FindAsync(value), Times.Once()); + _repository.Verify(p => p.FindByNameAsync(value, It.IsAny()), Times.Once()); } [RetryFact(5, 250, DisplayName = "Update - Shall return problem on validation failure")] @@ -365,7 +361,7 @@ public async Task Update_ShallReturnBadRequestWithBadAeTitle() HostIp = "host", }; - _repository.Setup(p => p.FindAsync(It.IsAny())).Returns(Task.FromResult(entity)); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(entity)); var result = await _controller.Edit(entity); var objectResult = result.Result as ObjectResult; @@ -391,30 +387,28 @@ public async Task Delete_ReturnsDeleted() HostIp = "host", Name = value, }; - _repository.Setup(p => p.FindAsync(It.IsAny())).Returns(Task.FromResult(entity)); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(entity)); - _repository.Setup(p => p.Remove(It.IsAny())); - _repository.Setup(p => p.SaveChangesAsync(It.IsAny())); + _repository.Setup(p => p.RemoveAsync(It.IsAny(), It.IsAny())); var result = await _controller.Delete(value); var okObjectResult = result.Result as OkObjectResult; var response = okObjectResult.Value as SourceApplicationEntity; Assert.Equal(value, response.AeTitle); - _repository.Verify(p => p.FindAsync(value), Times.Once()); - _repository.Verify(p => p.Remove(entity), Times.Once()); - _repository.Verify(p => p.SaveChangesAsync(It.IsAny()), Times.Once()); + _repository.Verify(p => p.FindByNameAsync(value, It.IsAny()), Times.Once()); + _repository.Verify(p => p.RemoveAsync(entity, It.IsAny()), Times.Once()); } [RetryFact(5, 250, DisplayName = "Delete - Shall return 404 if not found")] public async Task Delete_Returns404IfNotFound() { var value = "AET"; - _repository.Setup(p => p.FindAsync(It.IsAny())).Returns(Task.FromResult(default(SourceApplicationEntity))); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(default(SourceApplicationEntity))); var result = await _controller.Delete(value); Assert.IsType(result.Result); - _repository.Verify(p => p.FindAsync(value), Times.Once()); + _repository.Verify(p => p.FindByNameAsync(value, It.IsAny()), Times.Once()); } [RetryFact(5, 250, DisplayName = "Delete - Shall return problem on failure")] @@ -427,8 +421,8 @@ public async Task Delete_ShallReturnProblemOnFailure() HostIp = "host", Name = value, }; - _repository.Setup(p => p.FindAsync(It.IsAny())).Returns(Task.FromResult(entity)); - _repository.Setup(p => p.Remove(It.IsAny())).Throws(new Exception("error")); + _repository.Setup(p => p.FindByNameAsync(It.IsAny(), It.IsAny())).Returns(Task.FromResult(entity)); + _repository.Setup(p => p.RemoveAsync(It.IsAny(), It.IsAny())).Throws(new Exception("error")); var result = await _controller.Delete(value); @@ -439,7 +433,7 @@ public async Task Delete_ShallReturnProblemOnFailure() Assert.Equal("Error deleting DICOM source.", problem.Title); Assert.Equal("error", problem.Detail); Assert.Equal((int)HttpStatusCode.InternalServerError, problem.Status); - _repository.Verify(p => p.FindAsync(value), Times.Once()); + _repository.Verify(p => p.FindByNameAsync(value, It.IsAny()), Times.Once()); } #endregion Delete diff --git a/src/InformaticsGateway/Test/Services/Scp/ApplicationEntityManagerTest.cs b/src/InformaticsGateway/Test/Services/Scp/ApplicationEntityManagerTest.cs index cb2e023ab..c9e010a0a 100644 --- a/src/InformaticsGateway/Test/Services/Scp/ApplicationEntityManagerTest.cs +++ b/src/InformaticsGateway/Test/Services/Scp/ApplicationEntityManagerTest.cs @@ -16,7 +16,8 @@ using System; using System.Collections.Generic; -using System.Linq; +using System.Linq.Expressions; +using System.Threading; using System.Threading.Tasks; using FellowOakDicom; using FellowOakDicom.Network; @@ -27,7 +28,7 @@ using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Common; using Monai.Deploy.InformaticsGateway.Configuration; -using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Services.Scp; using Monai.Deploy.InformaticsGateway.Services.Storage; using Monai.Deploy.InformaticsGateway.SharedTest; @@ -52,8 +53,8 @@ public class ApplicationEntityManagerTest private readonly Mock> _loggerNotificationService; private readonly Mock _storageInfoProvider; - private readonly Mock> _sourceEntityRepository; - private readonly Mock> _applicationEntityRepository; + private readonly Mock _sourceEntityRepository; + private readonly Mock _applicationEntityRepository; private readonly IServiceProvider _serviceProvider; @@ -70,8 +71,8 @@ public ApplicationEntityManagerTest() _loggerNotificationService = new Mock>(); _monaiAeChangedNotificationService = new MonaiAeChangedNotificationService(_loggerNotificationService.Object); _storageInfoProvider = new Mock(); - _sourceEntityRepository = new Mock>(); - _applicationEntityRepository = new Mock>(); + _sourceEntityRepository = new Mock(); + _applicationEntityRepository = new Mock(); _connfiguration = Options.Create(new InformaticsGatewayConfiguration()); var services = new ServiceCollection(); @@ -98,6 +99,7 @@ public ApplicationEntityManagerTest() [RetryFact(5, 250, DisplayName = "HandleCStoreRequest - Shall throw if AE Title not configured")] public async Task HandleCStoreRequest_ShallThrowIfAENotConfigured() { + _applicationEntityRepository.Setup(p => p.ToListAsync(It.IsAny())).ReturnsAsync(new List()); var manager = new ApplicationEntityManager(_hostApplicationLifetime.Object, _serviceScopeFactory.Object, _monaiAeChangedNotificationService, @@ -127,7 +129,7 @@ public async Task HandleCStoreRequest_ThrowWhenOnLowStorageSpace() Name =aet } }; - _applicationEntityRepository.Setup(p => p.AsQueryable()).Returns(data.AsQueryable()); + _applicationEntityRepository.Setup(p => p.ToListAsync(It.IsAny())).ReturnsAsync(data); var manager = new ApplicationEntityManager(_hostApplicationLifetime.Object, _serviceScopeFactory.Object, _monaiAeChangedNotificationService, @@ -144,7 +146,7 @@ await Assert.ThrowsAsync(async () => _logger.VerifyLoggingMessageBeginsWith($"Instanced saved", LogLevel.Information, Times.Never()); _logger.VerifyLoggingMessageBeginsWith($"Instance queued for upload", LogLevel.Information, Times.Never()); - _applicationEntityRepository.Verify(p => p.AsQueryable(), Times.Once()); + _applicationEntityRepository.Verify(p => p.ToListAsync(It.IsAny()), Times.Once()); _storageInfoProvider.Verify(p => p.HasSpaceAvailableToStore, Times.AtLeastOnce()); _storageInfoProvider.Verify(p => p.AvailableFreeSpace, Times.AtLeastOnce()); } @@ -161,58 +163,44 @@ public void GetService_ShallReturnRequestedServicec() } [RetryFact(5, 250, DisplayName = "IsValidSource - False when AE is empty or white space")] - public void IsValidSource_FalseWhenAEIsEmpty() + public async Task IsValidSource_FalseWhenAEIsEmptyAsync() { var manager = new ApplicationEntityManager(_hostApplicationLifetime.Object, _serviceScopeFactory.Object, _monaiAeChangedNotificationService, _connfiguration); - Assert.False(manager.IsValidSource(" ", "123")); - Assert.False(manager.IsValidSource("AAA", "")); + Assert.False(await manager.IsValidSourceAsync(" ", "123").ConfigureAwait(false)); + Assert.False(await manager.IsValidSourceAsync("AAA", "").ConfigureAwait(false)); } [RetryFact(5, 250, DisplayName = "IsValidSource - False when no matching source found")] - public void IsValidSource_FalseWhenNoMatchingSource() + public async Task IsValidSource_FalseWhenNoMatchingSourceAsync() { var manager = new ApplicationEntityManager(_hostApplicationLifetime.Object, _serviceScopeFactory.Object, _monaiAeChangedNotificationService, _connfiguration); - _sourceEntityRepository.Setup(p => p.FirstOrDefault(It.IsAny>())) - .Returns(default(SourceApplicationEntity)); - _sourceEntityRepository.Setup(p => p.AsQueryable()).Returns( - (new List - { new SourceApplicationEntity { AeTitle = "SAE", HostIp = "1.2.3.4", Name = "SAE" } } - ).AsQueryable()); + _sourceEntityRepository.Setup(p => p.ContainsAsync(It.IsAny>>(), It.IsAny())) + .ReturnsAsync(false); + _sourceEntityRepository.Setup(p => p.ToListAsync(It.IsAny())).ReturnsAsync( + ( + new List + { + new SourceApplicationEntity { AeTitle = "SAE", HostIp = "1.2.3.4", Name = "SAE" } + } + )); var sourceAeTitle = "ValidSource"; - Assert.False(manager.IsValidSource(sourceAeTitle, "1.2.3.4")); + Assert.False(await manager.IsValidSourceAsync(sourceAeTitle, "1.2.3.4").ConfigureAwait(false)); - _sourceEntityRepository.Verify(p => p.FirstOrDefault(It.IsAny>()), Times.Once()); + _sourceEntityRepository.Verify(p => p.ContainsAsync(It.IsAny>>(), It.IsAny()), Times.Once()); _logger.VerifyLoggingMessageBeginsWith($"Available source AET: SAE @ 1.2.3.4.", LogLevel.Information, Times.Once()); } - [RetryFact(5, 250, DisplayName = "IsValidSource - False when IP does not match")] - public void IsValidSource_FalseWithMismatchIp() - { - var manager = new ApplicationEntityManager(_hostApplicationLifetime.Object, - _serviceScopeFactory.Object, - _monaiAeChangedNotificationService, - _connfiguration); - - var aet = "SAE"; - _sourceEntityRepository.Setup(p => p.FirstOrDefault(It.IsAny>())) - .Returns(default(SourceApplicationEntity)); - - Assert.False(manager.IsValidSource(aet, "1.1.1.1")); - - _sourceEntityRepository.Verify(p => p.FirstOrDefault(It.IsAny>()), Times.Once()); - } - [RetryFact(5, 250, DisplayName = "IsValidSource - True")] - public void IsValidSource_True() + public async Task IsValidSource_TrueAsync() { var manager = new ApplicationEntityManager(_hostApplicationLifetime.Object, _serviceScopeFactory.Object, @@ -220,17 +208,18 @@ public void IsValidSource_True() _connfiguration); var aet = "SAE"; - _sourceEntityRepository.Setup(p => p.FirstOrDefault(It.IsAny>())) - .Returns(new SourceApplicationEntity { AeTitle = aet, HostIp = "1.2.3.4", Name = "SAE" }); + _sourceEntityRepository.Setup(p => p.ContainsAsync(It.IsAny>>(), It.IsAny())) + .ReturnsAsync(true); - Assert.True(manager.IsValidSource(aet, "1.2.3.4")); + Assert.True(await manager.IsValidSourceAsync(aet, "1.2.3.4").ConfigureAwait(false)); - _sourceEntityRepository.Verify(p => p.FirstOrDefault(It.IsAny>()), Times.Once()); + _sourceEntityRepository.Verify(p => p.ContainsAsync(It.IsAny>>(), It.IsAny()), Times.Once()); } [RetryFact(5, 250, DisplayName = "Shall handle AE change events")] - public void ShallHandleAEChangeEvents() + public async Task ShallHandleAEChangeEventsAsync() { + _applicationEntityRepository.Setup(p => p.ToListAsync(It.IsAny())).ReturnsAsync(new List()); var manager = new ApplicationEntityManager(_hostApplicationLifetime.Object, _serviceScopeFactory.Object, _monaiAeChangedNotificationService, @@ -242,7 +231,7 @@ public void ShallHandleAEChangeEvents() AeTitle = "AE1", Name = "AE1" }, ChangedEventType.Added)); - Assert.True(manager.IsAeTitleConfigured("AE1")); + Assert.True(await manager.IsAeTitleConfiguredAsync("AE1").ConfigureAwait(false)); _monaiAeChangedNotificationService.Notify(new MonaiApplicationentityChangedEvent( new MonaiApplicationEntity @@ -250,13 +239,14 @@ public void ShallHandleAEChangeEvents() AeTitle = "AE1", Name = "AE1" }, ChangedEventType.Deleted)); - Assert.False(manager.IsAeTitleConfigured("AE1")); + Assert.False(await manager.IsAeTitleConfiguredAsync("AE1").ConfigureAwait(false)); } [RetryFact(5, 250, DisplayName = "Shall handle CS Store Request")] public async Task ShallHandleCStoreRequest() { var associationId = Guid.NewGuid(); + _applicationEntityRepository.Setup(p => p.ToListAsync(It.IsAny())).ReturnsAsync(new List()); var manager = new ApplicationEntityManager(_hostApplicationLifetime.Object, _serviceScopeFactory.Object, _monaiAeChangedNotificationService, @@ -268,7 +258,7 @@ public async Task ShallHandleCStoreRequest() AeTitle = "AE1", Name = "AE1" }, ChangedEventType.Added)); - Assert.True(manager.IsAeTitleConfigured("AE1")); + Assert.True(await manager.IsAeTitleConfiguredAsync("AE1").ConfigureAwait(false)); var request = GenerateRequest(); await manager.HandleCStoreRequest(request, "AE1", "AE", associationId); diff --git a/src/InformaticsGateway/Test/Services/Scp/ScpServiceTest.cs b/src/InformaticsGateway/Test/Services/Scp/ScpServiceTest.cs index b626280b7..1c3dcde04 100644 --- a/src/InformaticsGateway/Test/Services/Scp/ScpServiceTest.cs +++ b/src/InformaticsGateway/Test/Services/Scp/ScpServiceTest.cs @@ -103,8 +103,8 @@ public async Task CEcho_ShallRejectCEchoRequests() _configuration.Value.Dicom.Scp.EnableVerification = false; _configuration.Value.Dicom.Scp.RejectUnknownSources = true; - _associationDataProvider.Setup(p => p.IsValidSource(It.IsAny(), It.IsAny())).Returns(true); - _associationDataProvider.Setup(p => p.IsAeTitleConfigured(It.IsAny())).Returns(true); + _associationDataProvider.Setup(p => p.IsValidSourceAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true); + _associationDataProvider.Setup(p => p.IsAeTitleConfiguredAsync(It.IsAny())).ReturnsAsync(true); var countdownEvent = new CountdownEvent(1); var service = CreateService(); @@ -133,8 +133,8 @@ public async Task CEcho_ShallRejecUnknownCallingAET() _configuration.Value.Dicom.Scp.EnableVerification = true; _configuration.Value.Dicom.Scp.RejectUnknownSources = true; - _associationDataProvider.Setup(p => p.IsValidSource(It.IsAny(), It.IsAny())).Returns(false); - _associationDataProvider.Setup(p => p.IsAeTitleConfigured(It.IsAny())).Returns(true); + _associationDataProvider.Setup(p => p.IsValidSourceAsync(It.IsAny(), It.IsAny())).ReturnsAsync(false); + _associationDataProvider.Setup(p => p.IsAeTitleConfiguredAsync(It.IsAny())).ReturnsAsync(true); var countdownEvent = new CountdownEvent(1); var service = CreateService(); @@ -161,8 +161,8 @@ public async Task CEcho_ShallRejecUnknownCalledAET() _configuration.Value.Dicom.Scp.EnableVerification = true; _configuration.Value.Dicom.Scp.RejectUnknownSources = true; - _associationDataProvider.Setup(p => p.IsValidSource(It.IsAny(), It.IsAny())).Returns(true); - _associationDataProvider.Setup(p => p.IsAeTitleConfigured(It.IsAny())).Returns(false); + _associationDataProvider.Setup(p => p.IsValidSourceAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true); + _associationDataProvider.Setup(p => p.IsAeTitleConfiguredAsync(It.IsAny())).ReturnsAsync(false); var countdownEvent = new CountdownEvent(1); var service = CreateService(); @@ -189,8 +189,8 @@ public async Task CEcho_ShallAccept() _configuration.Value.Dicom.Scp.EnableVerification = true; _configuration.Value.Dicom.Scp.RejectUnknownSources = true; - _associationDataProvider.Setup(p => p.IsValidSource(It.IsAny(), It.IsAny())).Returns(true); - _associationDataProvider.Setup(p => p.IsAeTitleConfigured(It.IsAny())).Returns(true); + _associationDataProvider.Setup(p => p.IsValidSourceAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true); + _associationDataProvider.Setup(p => p.IsAeTitleConfiguredAsync(It.IsAny())).ReturnsAsync(true); var countdownEvent = new CountdownEvent(1); var service = CreateService(); @@ -209,8 +209,8 @@ public async Task CEcho_ShallAccept() [RetryFact(5, 250, DisplayName = "C-STORE - Shall reject when storage is low")] public async Task CStore_ShallRejecOnLowStorageSpace() { - _associationDataProvider.Setup(p => p.IsValidSource(It.IsAny(), It.IsAny())).Returns(true); - _associationDataProvider.Setup(p => p.IsAeTitleConfigured(It.IsAny())).Returns(true); + _associationDataProvider.Setup(p => p.IsValidSourceAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true); + _associationDataProvider.Setup(p => p.IsAeTitleConfiguredAsync(It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.CanStore).Returns(false); var countdownEvent = new CountdownEvent(1); @@ -235,8 +235,8 @@ public async Task CStore_ShallRejecOnLowStorageSpace() [RetryFact(5, 250, DisplayName = "C-STORE - OnCStoreRequest - InsufficientStorageAvailableException")] public async Task CStore_OnCStoreRequest_InsufficientStorageAvailableException() { - _associationDataProvider.Setup(p => p.IsValidSource(It.IsAny(), It.IsAny())).Returns(true); - _associationDataProvider.Setup(p => p.IsAeTitleConfigured(It.IsAny())).Returns(true); + _associationDataProvider.Setup(p => p.IsValidSourceAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true); + _associationDataProvider.Setup(p => p.IsAeTitleConfiguredAsync(It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.CanStore).Returns(true); _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Throws(new InsufficientStorageAvailableException()); @@ -267,8 +267,8 @@ public async Task CStore_OnCStoreRequest_InsufficientStorageAvailableException() [RetryFact(5, 250, DisplayName = "C-STORE - OnCStoreRequest - IOException")] public async Task CStore_OnCStoreRequest_IoException() { - _associationDataProvider.Setup(p => p.IsValidSource(It.IsAny(), It.IsAny())).Returns(true); - _associationDataProvider.Setup(p => p.IsAeTitleConfigured(It.IsAny())).Returns(true); + _associationDataProvider.Setup(p => p.IsValidSourceAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true); + _associationDataProvider.Setup(p => p.IsAeTitleConfiguredAsync(It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.CanStore).Returns(true); _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Throws(new IOException { HResult = Constants.ERROR_HANDLE_DISK_FULL }); var countdownEvent = new CountdownEvent(3); @@ -298,8 +298,8 @@ public async Task CStore_OnCStoreRequest_IoException() [RetryFact(5, 250, DisplayName = "C-STORE - OnCStoreRequest - Exception")] public async Task CStore_OnCStoreRequest_Exception() { - _associationDataProvider.Setup(p => p.IsValidSource(It.IsAny(), It.IsAny())).Returns(true); - _associationDataProvider.Setup(p => p.IsAeTitleConfigured(It.IsAny())).Returns(true); + _associationDataProvider.Setup(p => p.IsValidSourceAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true); + _associationDataProvider.Setup(p => p.IsAeTitleConfiguredAsync(It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.CanStore).Returns(true); _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Throws(new Exception()); @@ -330,8 +330,8 @@ public async Task CStore_OnCStoreRequest_Exception() [RetryFact(5, 250, DisplayName = "C-STORE - OnCStoreRequest - Success")] public async Task CStore_OnCStoreRequest_Success() { - _associationDataProvider.Setup(p => p.IsValidSource(It.IsAny(), It.IsAny())).Returns(true); - _associationDataProvider.Setup(p => p.IsAeTitleConfigured(It.IsAny())).Returns(true); + _associationDataProvider.Setup(p => p.IsValidSourceAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true); + _associationDataProvider.Setup(p => p.IsAeTitleConfiguredAsync(It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.CanStore).Returns(true); _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())); @@ -362,8 +362,8 @@ public async Task CStore_OnCStoreRequest_Success() [RetryFact(5, 250, DisplayName = "C-STORE - Simulate client abort")] public async Task CStore_OnClientAbort() { - _associationDataProvider.Setup(p => p.IsValidSource(It.IsAny(), It.IsAny())).Returns(true); - _associationDataProvider.Setup(p => p.IsAeTitleConfigured(It.IsAny())).Returns(true); + _associationDataProvider.Setup(p => p.IsValidSourceAsync(It.IsAny(), It.IsAny())).ReturnsAsync(true); + _associationDataProvider.Setup(p => p.IsAeTitleConfiguredAsync(It.IsAny())).ReturnsAsync(true); _associationDataProvider.Setup(p => p.CanStore).Returns(true); _associationDataProvider.Setup(p => p.HandleCStoreRequest(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())); diff --git a/src/Monai.Deploy.InformaticsGateway.sln b/src/Monai.Deploy.InformaticsGateway.sln index 91eee03f2..f555fad68 100644 --- a/src/Monai.Deploy.InformaticsGateway.sln +++ b/src/Monai.Deploy.InformaticsGateway.sln @@ -48,6 +48,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Monai.Deploy.InformaticsGat EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Monai.Deploy.InformaticsGateway.Database.Api.Test", "Database\Api\Test\Monai.Deploy.InformaticsGateway.Database.Api.Test.csproj", "{7F56994D-5310-467F-96FC-87C26F151737}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Database", "Database", "{290E4C9B-841D-4E2C-91A0-5A69BAB122F3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test", "Database\EntityFramework\Test\Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj", "{EA930DE2-33C4-447C-9E26-31387652D408}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -322,11 +326,24 @@ Global {7F56994D-5310-467F-96FC-87C26F151737}.Release|x64.Build.0 = Release|Any CPU {7F56994D-5310-467F-96FC-87C26F151737}.Release|x86.ActiveCfg = Release|Any CPU {7F56994D-5310-467F-96FC-87C26F151737}.Release|x86.Build.0 = Release|Any CPU + {EA930DE2-33C4-447C-9E26-31387652D408}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EA930DE2-33C4-447C-9E26-31387652D408}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EA930DE2-33C4-447C-9E26-31387652D408}.Debug|x64.ActiveCfg = Debug|Any CPU + {EA930DE2-33C4-447C-9E26-31387652D408}.Debug|x64.Build.0 = Debug|Any CPU + {EA930DE2-33C4-447C-9E26-31387652D408}.Debug|x86.ActiveCfg = Debug|Any CPU + {EA930DE2-33C4-447C-9E26-31387652D408}.Debug|x86.Build.0 = Debug|Any CPU + {EA930DE2-33C4-447C-9E26-31387652D408}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EA930DE2-33C4-447C-9E26-31387652D408}.Release|Any CPU.Build.0 = Release|Any CPU + {EA930DE2-33C4-447C-9E26-31387652D408}.Release|x64.ActiveCfg = Release|Any CPU + {EA930DE2-33C4-447C-9E26-31387652D408}.Release|x64.Build.0 = Release|Any CPU + {EA930DE2-33C4-447C-9E26-31387652D408}.Release|x86.ActiveCfg = Release|Any CPU + {EA930DE2-33C4-447C-9E26-31387652D408}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution + {6073FCD3-5E2E-4182-B6B3-DE5E5BCBE203} = {290E4C9B-841D-4E2C-91A0-5A69BAB122F3} {90BC467C-39C9-4EBB-98CF-3289BC8E8A72} = {B8E99EF7-84EA-4D11-B722-9EE81B89CD86} {78668564-B90C-4661-A0EF-373E040F2270} = {B8E99EF7-84EA-4D11-B722-9EE81B89CD86} {C7CBB953-DCBB-4B15-A562-C0C4CCF93B19} = {B8E99EF7-84EA-4D11-B722-9EE81B89CD86} @@ -336,7 +353,10 @@ Global {E1583FDB-9DC1-46E7-BB14-AFC2A7608600} = {B8E99EF7-84EA-4D11-B722-9EE81B89CD86} {28099DFC-8937-4508-848C-35C99E56C121} = {B8E99EF7-84EA-4D11-B722-9EE81B89CD86} {0BB99F0E-669F-4884-9DB1-AFA16CC9C67B} = {B8E99EF7-84EA-4D11-B722-9EE81B89CD86} + {313B68CE-A0DB-4DE2-8359-AC777F5997FE} = {290E4C9B-841D-4E2C-91A0-5A69BAB122F3} + {366CA24C-B546-46AD-8607-AABE4F0F4864} = {290E4C9B-841D-4E2C-91A0-5A69BAB122F3} {7F56994D-5310-467F-96FC-87C26F151737} = {B8E99EF7-84EA-4D11-B722-9EE81B89CD86} + {EA930DE2-33C4-447C-9E26-31387652D408} = {B8E99EF7-84EA-4D11-B722-9EE81B89CD86} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {E23DC856-D033-49F6-9BC6-9F1D0ECD05CB} diff --git a/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj b/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj index 278934b90..8d7925dbb 100644 --- a/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj +++ b/tests/Integration.Test/Monai.Deploy.InformaticsGateway.Integration.Test.csproj @@ -71,6 +71,15 @@ + + + Always + + + Always + + + @@ -85,8 +94,6 @@ - - diff --git a/tests/Integration.Test/StepDefinitions/ExportServicesStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/ExportServicesStepDefinitions.cs index df320ff20..0e8536516 100644 --- a/tests/Integration.Test/StepDefinitions/ExportServicesStepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/ExportServicesStepDefinitions.cs @@ -37,7 +37,6 @@ namespace Monai.Deploy.InformaticsGateway.Integration.Test.StepDefinitions public class DicomDimseScuServicesStepDefinitions { internal static readonly TimeSpan DicomScpWaitTimeSpan = TimeSpan.FromMinutes(7); - internal static readonly TimeSpan DicomWebWaitTimeSpan = TimeSpan.FromMinutes(2); private readonly InformaticsGatewayConfiguration _informaticsGatewayConfiguration; private readonly Configurations _configuration; private readonly DicomScp _dicomServer; @@ -179,7 +178,7 @@ public async Task ThenExportTheInstancesToOrthanc() }, (Dictionary expected) => { return expected.Count == _dataProvider.DicomSpecs.FileHashes.Count; - }, DicomWebWaitTimeSpan, 1000); + }, DicomScpWaitTimeSpan, 1000); result.Should().NotBeNull().And.HaveCount(_dataProvider.DicomSpecs.FileHashes.Count); } diff --git a/tests/Integration.Test/StepDefinitions/HealthLevel7Definitions.cs b/tests/Integration.Test/StepDefinitions/HealthLevel7Definitions.cs index c6fa0de60..5d750499b 100644 --- a/tests/Integration.Test/StepDefinitions/HealthLevel7Definitions.cs +++ b/tests/Integration.Test/StepDefinitions/HealthLevel7Definitions.cs @@ -25,7 +25,7 @@ namespace Monai.Deploy.InformaticsGateway.Integration.Test.StepDefinitions [CollectionDefinition("SpecFlowNonParallelizableFeatures", DisableParallelization = true)] public class HealthLevel7Definitions { - internal static readonly TimeSpan WaitTimeSpan = TimeSpan.FromMinutes(2); + internal static readonly TimeSpan WaitTimeSpan = TimeSpan.FromMinutes(3); private readonly DataProvider _dataProvider; private readonly RabbitMqConsumer _receivedMessages; private readonly IDataClient _dataSink; diff --git a/tests/Integration.Test/appsettings.json b/tests/Integration.Test/appsettings.json index 365be1aa9..1ecdca8cb 100644 --- a/tests/Integration.Test/appsettings.json +++ b/tests/Integration.Test/appsettings.json @@ -19,7 +19,7 @@ "messaging": { "publisherServiceAssemblyName": "Monai.Deploy.Messaging.RabbitMQ.RabbitMQMessagePublisherService, Monai.Deploy.Messaging.RabbitMQ", "publisherSettings": { - "endpoint": "localhost", + "endpoint": "127.0.0.1", "username": "rabbitmq", "password": "rabbitmq", "virtualHost": "monaideploy", @@ -27,7 +27,7 @@ }, "subscriberServiceAssemblyName": "Monai.Deploy.Messaging.RabbitMQ.RabbitMQMessageSubscriberService, Monai.Deploy.Messaging.RabbitMQ", "subscriberSettings": { - "endpoint": "localhost", + "endpoint": "127.0.0.1", "username": "rabbitmq", "password": "rabbitmq", "virtualHost": "monaideploy", @@ -47,7 +47,7 @@ "watermarkPercent": 99, "reserveSpaceGB": 1, "settings": { - "endpoint": "localhost:9000", + "endpoint": "127.0.0.1:9000", "accessKey": "minioadmin", "accessToken": "minioadmin", "securedConnection": false, @@ -76,7 +76,7 @@ "HostPlugInsStorageMount": "~/.mig/plug-ins", "HostDatabaseStorageMount": "~/.mig/database", "HostLogsStorageMount": "~/.mig/logs", - "InformaticsGatewayServerEndpoint": "http://localhost:5000", + "InformaticsGatewayServerEndpoint": "http://127.0.0.1:5000", "DockerImagePrefix": "ghcr.io/project-monai/monai-deploy-informatics-gateway" } } \ No newline at end of file diff --git a/tests/Integration.Test/nlog.config b/tests/Integration.Test/nlog.config index 446bba029..54b80034f 100644 --- a/tests/Integration.Test/nlog.config +++ b/tests/Integration.Test/nlog.config @@ -33,15 +33,7 @@ limitations under the License. - - - - - - - - - + @@ -67,7 +59,7 @@ limitations under the License. - + From f576fa627c4f36f351fffcc12bc5ae8588023af4 Mon Sep 17 00:00:00 2001 From: Victor Chang Date: Tue, 15 Nov 2022 16:16:58 -0800 Subject: [PATCH 02/14] Add MongoDB support Signed-off-by: Victor Chang --- .github/workflows/ci.yml | 2 + docker-compose/docker-compose.yml | 2 +- src/Api/BaseApplicationEntity.cs | 2 +- src/Api/MonaiApplicationEntity.cs | 18 +- src/Api/MongoDBEntityBase.cs | 39 +++ src/Api/Storage/Payload.cs | 11 +- src/Client.Common/ProblemException.cs | 2 +- src/Common/ExtensionMethods.cs | 2 +- src/Common/Test/ExtensionMethodsTest.cs | 2 +- src/Database/Api/DatabaseException.cs | 40 +++ src/Database/Api/Log.9000.cs | 32 --- .../Log.9100.cs => Api/Logging/Log.9000.cs} | 31 ++- .../IStorageMetadataRepository.cs | 2 +- .../InferenceRequestRepositoryBase.cs | 101 ++++++++ .../StorageMetadataRepositoryBase.cs | 104 ++++++++ .../StorageMetadataWrapper.cs | 26 +- src/Database/DatabaseManager.cs | 27 +- src/Database/DatabaseMigrationManager.cs | 2 +- ...stinationApplicationEntityConfiguration.cs | 2 + .../InferenceRequestConfiguration.cs | 7 +- .../MonaiApplicationEntityConfiguration.cs | 2 + .../Configuration/PayloadConfiguration.cs | 7 +- .../SourceApplicationEntityConfiguration.cs | 2 + ...orageMetadataWrapperEntityConfiguration.cs | 4 +- .../InformaticsGatewayContext.cs | 6 + .../20221115163047_R3_0.3.4.Designer.cs | 238 ++++++++++++++++++ .../Migrations/20221115163047_R3_0.3.4.cs | 189 ++++++++++++++ .../InformaticsGatewayContextModelSnapshot.cs | 33 ++- .../DestinationApplicationEntityRepository.cs | 10 +- .../InferenceRequestRepository.cs | 78 +----- .../MonaiApplicationEntityRepository.cs | 10 +- .../Repositories/PayloadRepository.cs | 8 +- .../SourceApplicationEntityRepository.cs | 10 +- .../StorageMetadataWrapperRepository.cs | 88 +++---- ...tinationApplicationEntityRepositoryTest.cs | 2 +- .../Test/InMemoryDatabaseFixture.cs | 2 - .../Test/InferenceRequestRepositoryTest.cs | 28 ++- .../MonaiApplicationEntityRepositoryTest.cs | 2 +- .../SourceApplicationEntityRepositoryTest.cs | 2 +- .../StorageMetadataWrapperRepositoryTest.cs | 11 +- .../Test/StorageMetadataWrapperTest.cs | 2 +- .../{ => EntityFramework}/appsettings.json | 0 ....Deploy.InformaticsGateway.Database.csproj | 8 +- ...stinationApplicationEntityConfiguration.cs | 34 +++ .../InferenceRequestConfiguration.cs | 42 ++++ .../MonaiApplicationEntityConfiguration.cs | 37 +++ .../MongoDBEntityBaseConfiguration.cs | 39 +++ .../MongoDB/Configurations/MongoDBOptions.cs | 26 ++ .../Configurations/PayloadConfiguration.cs | 50 ++++ .../SourceApplicationEntityConfiguration.cs | 33 +++ ...orageMetadataWrapperEntityConfiguration.cs | 34 +++ ...InformaticsGateway.Database.MongoDB.csproj | 46 ++++ .../MongoDB/MongoDatabaseMigrationManager.cs | 37 +++ .../DestinationApplicationEntityRepository.cs | 171 +++++++++++++ .../InferenceRequestRepository.cs | 180 +++++++++++++ .../MonaiApplicationEntityRepository.cs | 164 ++++++++++++ .../MongoDB/Repositories/PayloadRepository.cs | 176 +++++++++++++ .../SourceApplicationEntityRepository.cs | 170 +++++++++++++ .../StorageMetadataWrapperRepository.cs | 177 +++++++++++++ .../Common/FileMoveException.cs | 46 ++++ .../Common/FileUploadException.cs | 42 ++++ .../Logging/Log.4000.ObjectUploadService.cs | 8 +- .../Logging/Log.700.PayloadService.cs | 22 +- .../Logging/Log.800.Hl7Service.cs | 3 + .../Monai.Deploy.InformaticsGateway.csproj | 2 +- src/InformaticsGateway/Program.cs | 2 - .../Services/Connectors/PayloadAssembler.cs | 3 +- .../Connectors/PayloadMoveActionHandler.cs | 135 +++++++--- .../Connectors/PayloadMoveException.cs | 3 +- .../PayloadNotificationActionHandler.cs | 14 +- .../Connectors/PayloadNotificationService.cs | 8 +- .../Services/Fhir/Resources.cs | 2 +- .../Services/HealthLevel7/MllpClient.cs | 2 +- .../Services/HealthLevel7/MllpService.cs | 5 +- .../Services/Storage/ObjectUploadService.cs | 49 +++- .../PayloadMoveActionHandlerTest.cs | 5 +- .../PayloadNotificationServiceTest.cs | 6 +- .../Storage/ObjectUploadServiceTest.cs | 13 +- src/Monai.Deploy.InformaticsGateway.sln | 17 +- tests/Integration.Test/Common/Assertions.cs | 72 +++--- .../Integration.Test/Common/MinioDataSink.cs | 50 ++-- .../Drivers/EfDataProvider.cs | 25 +- .../Drivers/IDatabaseDataProvider.cs | 1 + .../Drivers/MongoDBDataProvider.cs | 112 +++++++++ .../Drivers/RabbitMqConsumer.cs | 3 +- tests/Integration.Test/Hooks/TestHooks.cs | 28 ++- ...InformaticsGateway.Integration.Test.csproj | 9 +- tests/Integration.Test/appsettings.ef.json | 6 + tests/Integration.Test/appsettings.json | 5 +- .../Integration.Test/appsettings.mongodb.json | 7 + tests/Integration.Test/nlog.config | 3 +- tests/Integration.Test/run.sh | 2 +- 92 files changed, 2925 insertions(+), 397 deletions(-) create mode 100644 src/Api/MongoDBEntityBase.cs create mode 100644 src/Database/Api/DatabaseException.cs delete mode 100644 src/Database/Api/Log.9000.cs rename src/Database/{EntityFramework/Logging/Log.9100.cs => Api/Logging/Log.9000.cs} (61%) create mode 100644 src/Database/Api/Repositories/InferenceRequestRepositoryBase.cs create mode 100644 src/Database/Api/Repositories/StorageMetadataRepositoryBase.cs rename src/Database/{EntityFramework/Repositories => Api}/StorageMetadataWrapper.cs (69%) create mode 100644 src/Database/EntityFramework/Migrations/20221115163047_R3_0.3.4.Designer.cs create mode 100644 src/Database/EntityFramework/Migrations/20221115163047_R3_0.3.4.cs rename src/Database/{ => EntityFramework}/appsettings.json (100%) create mode 100644 src/Database/MongoDB/Configurations/DestinationApplicationEntityConfiguration.cs create mode 100644 src/Database/MongoDB/Configurations/InferenceRequestConfiguration.cs create mode 100644 src/Database/MongoDB/Configurations/MonaiApplicationEntityConfiguration.cs create mode 100644 src/Database/MongoDB/Configurations/MongoDBEntityBaseConfiguration.cs create mode 100644 src/Database/MongoDB/Configurations/MongoDBOptions.cs create mode 100644 src/Database/MongoDB/Configurations/PayloadConfiguration.cs create mode 100644 src/Database/MongoDB/Configurations/SourceApplicationEntityConfiguration.cs create mode 100644 src/Database/MongoDB/Configurations/StorageMetadataWrapperEntityConfiguration.cs create mode 100644 src/Database/MongoDB/Monai.Deploy.InformaticsGateway.Database.MongoDB.csproj create mode 100644 src/Database/MongoDB/MongoDatabaseMigrationManager.cs create mode 100644 src/Database/MongoDB/Repositories/DestinationApplicationEntityRepository.cs create mode 100644 src/Database/MongoDB/Repositories/InferenceRequestRepository.cs create mode 100644 src/Database/MongoDB/Repositories/MonaiApplicationEntityRepository.cs create mode 100644 src/Database/MongoDB/Repositories/PayloadRepository.cs create mode 100644 src/Database/MongoDB/Repositories/SourceApplicationEntityRepository.cs create mode 100644 src/Database/MongoDB/Repositories/StorageMetadataWrapperRepository.cs create mode 100644 src/InformaticsGateway/Common/FileMoveException.cs create mode 100644 src/InformaticsGateway/Common/FileUploadException.cs create mode 100644 tests/Integration.Test/Drivers/MongoDBDataProvider.cs create mode 100644 tests/Integration.Test/appsettings.ef.json create mode 100644 tests/Integration.Test/appsettings.mongodb.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 61e14f6ae..d1a876728 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -235,9 +235,11 @@ jobs: strategy: matrix: feature: [AcrApi, DicomDimseScp, DicomDimseScu, DicomWebExport, DicomWebStow, HealthLevel7, Fhir] + database: [ef, mongodb] fail-fast: false env: TAG: ${{ needs.build.outputs.TAG }} + DOTNET_TEST: ${{ matrix.database }} steps: - name: Checkout repository uses: actions/checkout@v3 diff --git a/docker-compose/docker-compose.yml b/docker-compose/docker-compose.yml index eba0d0c9f..b20931435 100644 --- a/docker-compose/docker-compose.yml +++ b/docker-compose/docker-compose.yml @@ -68,7 +68,7 @@ services: networks: - monaideploy healthcheck: - test: echo 'db.runCommand("ping").ok' | mongo localhost:27017/productiondb --quiet + test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/productiondb --quiet interval: 10s timeout: 10s retries: 5 diff --git a/src/Api/BaseApplicationEntity.cs b/src/Api/BaseApplicationEntity.cs index bd74246b4..9054edfb1 100644 --- a/src/Api/BaseApplicationEntity.cs +++ b/src/Api/BaseApplicationEntity.cs @@ -23,7 +23,7 @@ namespace Monai.Deploy.InformaticsGateway.Api /// /// * [Application Entity](http://www.otpedia.com/entryDetails.cfm?id=137) /// - public class BaseApplicationEntity + public class BaseApplicationEntity : MongoDBEntityBase { /// /// Gets or sets the unique name used to identify a DICOM application entity. diff --git a/src/Api/MonaiApplicationEntity.cs b/src/Api/MonaiApplicationEntity.cs index 621c23579..0ef7705b9 100644 --- a/src/Api/MonaiApplicationEntity.cs +++ b/src/Api/MonaiApplicationEntity.cs @@ -15,6 +15,7 @@ * limitations under the License. */ +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; @@ -44,7 +45,7 @@ namespace Monai.Deploy.InformaticsGateway.Api /// } /// /// - public class MonaiApplicationEntity + public class MonaiApplicationEntity : MongoDBEntityBase { /// /// Gets or sets the name of a MONAI DICOM application entity. @@ -106,20 +107,11 @@ public void SetDefaultValues() Grouping = "0020,000D"; } - if (Workflows is null) - { - Workflows = new List(); - } + Workflows ??= new List(); - if (IgnoredSopClasses is null) - { - IgnoredSopClasses = new List(); - } + IgnoredSopClasses ??= new List(); - if (AllowedSopClasses is null) - { - AllowedSopClasses = new List(); - } + AllowedSopClasses ??= new List(); } } } diff --git a/src/Api/MongoDBEntityBase.cs b/src/Api/MongoDBEntityBase.cs new file mode 100644 index 000000000..41b206a6e --- /dev/null +++ b/src/Api/MongoDBEntityBase.cs @@ -0,0 +1,39 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; + +namespace Monai.Deploy.InformaticsGateway.Api +{ + public abstract class MongoDBEntityBase + { + /// + /// Gets or set the MongoDB associated identifier. + /// + public Guid Id { get; set; } + + /// + /// Gets or set the date and time the objects first created. + /// + public DateTime DateTimeCreated { get; set; } + + protected MongoDBEntityBase() + { + Id = Guid.NewGuid(); + DateTimeCreated = DateTime.UtcNow; + } + } +} diff --git a/src/Api/Storage/Payload.cs b/src/Api/Storage/Payload.cs index af584bb20..9fb4a072d 100644 --- a/src/Api/Storage/Payload.cs +++ b/src/Api/Storage/Payload.cs @@ -46,7 +46,7 @@ public enum PayloadState private readonly Stopwatch _lastReceived; private bool _disposedValue; - public Guid Id { get; } + public Guid PayloadId { get; } public uint Timeout { get; init; } @@ -66,7 +66,8 @@ public enum PayloadState public bool HasTimedOut { get => ElapsedTime().TotalSeconds >= Timeout; } - public TimeSpan Elapsed { get { return DateTime.UtcNow.Subtract(DateTimeCreated); } } + public TimeSpan Elapsed + { get { return DateTime.UtcNow.Subtract(DateTimeCreated); } } public string CallingAeTitle { get => Files.OfType().Select(p => p.CallingAeTitle).FirstOrDefault(); } @@ -74,14 +75,14 @@ public enum PayloadState public Payload(string key, string correlationId, uint timeout) { - Guard.Against.NullOrWhiteSpace(key, nameof(key)); + Guard.Against.NullOrWhiteSpace(key); Files = new List(); _lastReceived = new Stopwatch(); CorrelationId = correlationId; DateTimeCreated = DateTime.UtcNow; - Id = Guid.NewGuid(); + PayloadId = Guid.NewGuid(); Key = key; State = PayloadState.Created; RetryCount = 0; @@ -90,7 +91,7 @@ public Payload(string key, string correlationId, uint timeout) public void Add(FileStorageMetadata value) { - Guard.Against.Null(value, nameof(value)); + Guard.Against.Null(value); Files.Add(value); _lastReceived.Reset(); diff --git a/src/Client.Common/ProblemException.cs b/src/Client.Common/ProblemException.cs index 3565c1161..c3f1e0b08 100644 --- a/src/Client.Common/ProblemException.cs +++ b/src/Client.Common/ProblemException.cs @@ -42,7 +42,7 @@ public override void GetObjectData(SerializationInfo info, StreamingContext cont { if (info == null) { - throw new ArgumentNullException("info"); + throw new ArgumentNullException(nameof(info)); } info.AddValue(nameof(ProblemDetails), ProblemDetails, typeof(ProblemDetails)); diff --git a/src/Common/ExtensionMethods.cs b/src/Common/ExtensionMethods.cs index 126b2ebae..997311217 100644 --- a/src/Common/ExtensionMethods.cs +++ b/src/Common/ExtensionMethods.cs @@ -73,7 +73,7 @@ public static string RemoveInvalidPathChars(this string input) /// public static async Task Post(this ActionBlock actionBlock, TInput input, TimeSpan delay) { - await Task.Delay(delay); + await Task.Delay(delay).ConfigureAwait(false); return actionBlock.Post(input); } } diff --git a/src/Common/Test/ExtensionMethodsTest.cs b/src/Common/Test/ExtensionMethodsTest.cs index 4915e8930..9158fb2d5 100644 --- a/src/Common/Test/ExtensionMethodsTest.cs +++ b/src/Common/Test/ExtensionMethodsTest.cs @@ -90,7 +90,7 @@ public async Task GivenAnActionBlock_WhenPostWIithDelayIsCalled_ExpectADelayBefo }); stopwatch.Start(); - await actionBlock.Post(input, delay); + await actionBlock.Post(input, delay).ConfigureAwait(false); } } } diff --git a/src/Database/Api/DatabaseException.cs b/src/Database/Api/DatabaseException.cs new file mode 100644 index 000000000..9191a0768 --- /dev/null +++ b/src/Database/Api/DatabaseException.cs @@ -0,0 +1,40 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Runtime.Serialization; + +namespace Monai.Deploy.InformaticsGateway.Database.Api +{ + [Serializable] + public class DatabaseException : Exception + { + public DatabaseException() + { + } + + public DatabaseException(string? message) : base(message) + { + } + + public DatabaseException(string? message, Exception? innerException) : base(message, innerException) + { + } + + protected DatabaseException(SerializationInfo info, StreamingContext context) : base(info, context) + { + } + } +} diff --git a/src/Database/Api/Log.9000.cs b/src/Database/Api/Log.9000.cs deleted file mode 100644 index 2f6905e6f..000000000 --- a/src/Database/Api/Log.9000.cs +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2022 MONAI Consortium - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -using Microsoft.Extensions.Logging; - -namespace Monai.Deploy.InformaticsGateway.Database.Api -{ - public static partial class Log - { - [LoggerMessage(EventId = 9000, Level = LogLevel.Error, Message = "Error adding item {type} to the database.")] - public static partial void ErrorAddItem(this ILogger logger, string @type, Exception ex); - - [LoggerMessage(EventId = 9001, Level = LogLevel.Error, Message = "Error updating item {type} in the database.")] - public static partial void ErrorUpdateItem(this ILogger logger, string @type, Exception ex); - - [LoggerMessage(EventId = 9002, Level = LogLevel.Error, Message = "Error deleting item {type} from the database.")] - public static partial void ErrorDeleteItem(this ILogger logger, string @type, Exception ex); - } -} diff --git a/src/Database/EntityFramework/Logging/Log.9100.cs b/src/Database/Api/Logging/Log.9000.cs similarity index 61% rename from src/Database/EntityFramework/Logging/Log.9100.cs rename to src/Database/Api/Logging/Log.9000.cs index 2fd25943a..a2ac11fed 100644 --- a/src/Database/EntityFramework/Logging/Log.9100.cs +++ b/src/Database/Api/Logging/Log.9000.cs @@ -1,4 +1,4 @@ -/* +/* * Copyright 2022 MONAI Consortium * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,35 +16,44 @@ using Microsoft.Extensions.Logging; -namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Logging +namespace Monai.Deploy.InformaticsGateway.Database.Api.Logging { public static partial class Log { - [LoggerMessage(EventId = 9100, Level = LogLevel.Error, Message = "Error performing database action. Waiting {timespan} before next retry. Retry attempt {retryCount}...")] + [LoggerMessage(EventId = 9000, Level = LogLevel.Error, Message = "Error adding item {type} to the database.")] + public static partial void ErrorAddItem(this ILogger logger, string @type, Exception ex); + + [LoggerMessage(EventId = 9001, Level = LogLevel.Error, Message = "Error updating item {type} in the database.")] + public static partial void ErrorUpdateItem(this ILogger logger, string @type, Exception ex); + + [LoggerMessage(EventId = 9002, Level = LogLevel.Error, Message = "Error deleting item {type} from the database.")] + public static partial void ErrorDeleteItem(this ILogger logger, string @type, Exception ex); + + [LoggerMessage(EventId = 9003, Level = LogLevel.Error, Message = "Error performing database action. Waiting {timespan} before next retry. Retry attempt {retryCount}...")] public static partial void DatabaseErrorRetry(this ILogger logger, TimeSpan timespan, int retryCount, Exception ex); - [LoggerMessage(EventId = 9101, Level = LogLevel.Debug, Message = "Storage metadata saved to the database.")] + [LoggerMessage(EventId = 9004, Level = LogLevel.Debug, Message = "Storage metadata saved to the database.")] public static partial void StorageMetadataSaved(this ILogger logger); - [LoggerMessage(EventId = 9102, Level = LogLevel.Error, Message = "Error querying pending inference request.")] + [LoggerMessage(EventId = 9005, Level = LogLevel.Error, Message = "Error querying pending inference request.")] public static partial void ErrorQueryingForPendingInferenceRequest(this ILogger logger, Exception ex); - [LoggerMessage(EventId = 9103, Level = LogLevel.Debug, Message = "Inference request saved.")] + [LoggerMessage(EventId = 9006, Level = LogLevel.Debug, Message = "Inference request saved.")] public static partial void InferenceRequestSaved(this ILogger logger); - [LoggerMessage(EventId = 9104, Level = LogLevel.Warning, Message = "Exceeded maximum retries.")] + [LoggerMessage(EventId = 9007, Level = LogLevel.Warning, Message = "Exceeded maximum retries.")] public static partial void InferenceRequestUpdateExceededMaximumRetries(this ILogger logger); - [LoggerMessage(EventId = 9105, Level = LogLevel.Information, Message = "Failed to process inference request, will retry later.")] + [LoggerMessage(EventId = 9008, Level = LogLevel.Information, Message = "Failed to process inference request, will retry later.")] public static partial void InferenceRequestUpdateRetryLater(this ILogger logger); - [LoggerMessage(EventId = 9106, Level = LogLevel.Debug, Message = "Updating request {transactionId} to InProgress.")] + [LoggerMessage(EventId = 9009, Level = LogLevel.Debug, Message = "Updating request {transactionId} to InProgress.")] public static partial void InferenceRequestSetToInProgress(this ILogger logger, string transactionId); - [LoggerMessage(EventId = 9107, Level = LogLevel.Debug, Message = "Updating inference request.")] + [LoggerMessage(EventId = 9010, Level = LogLevel.Debug, Message = "Updating inference request.")] public static partial void InferenceRequestUpdateState(this ILogger logger); - [LoggerMessage(EventId = 9108, Level = LogLevel.Information, Message = "Inference request updated.")] + [LoggerMessage(EventId = 9011, Level = LogLevel.Information, Message = "Inference request updated.")] public static partial void InferenceRequestUpdated(this ILogger logger); } } diff --git a/src/Database/Api/Repositories/IStorageMetadataRepository.cs b/src/Database/Api/Repositories/IStorageMetadataRepository.cs index 04870ac1a..e89bd459a 100644 --- a/src/Database/Api/Repositories/IStorageMetadataRepository.cs +++ b/src/Database/Api/Repositories/IStorageMetadataRepository.cs @@ -46,7 +46,7 @@ public interface IStorageMetadataRepository /// Gets all storage metadata objects associated with the correlation ID. /// /// Correlation ID - Task> GetFileStorageMetdadataAsync(string correlationId, CancellationToken cancellationToken = default); + Task> GetFileStorageMetdadataAsync(string correlationId, CancellationToken cancellationToken = default); /// /// Gets the specified storage metadata object. diff --git a/src/Database/Api/Repositories/InferenceRequestRepositoryBase.cs b/src/Database/Api/Repositories/InferenceRequestRepositoryBase.cs new file mode 100644 index 000000000..cd0c8e6d1 --- /dev/null +++ b/src/Database/Api/Repositories/InferenceRequestRepositoryBase.cs @@ -0,0 +1,101 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Ardalis.GuardClauses; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Rest; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; + +namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories +{ + public abstract class InferenceRequestRepositoryBase : IInferenceRequestRepository + { + private readonly ILogger _logger; + private readonly IOptions _options; + + protected InferenceRequestRepositoryBase( + ILogger logger, + IOptions options) + { + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _options = options ?? throw new ArgumentNullException(nameof(options)); + } + + public virtual async Task ExistsAsync(string transactionId, CancellationToken cancellationToken = default) + { + Guard.Against.NullOrWhiteSpace(transactionId); + return await GetInferenceRequestAsync(transactionId, cancellationToken).ConfigureAwait(false) is not null; + } + + public virtual async Task GetStatusAsync(string transactionId, CancellationToken cancellationToken = default) + { + Guard.Against.NullOrWhiteSpace(transactionId); + + var response = new InferenceStatusResponse(); + var item = await GetInferenceRequestAsync(transactionId, cancellationToken).ConfigureAwait(false); + if (item is null) + { + return null; + } + + response.TransactionId = item.TransactionId; + + return await Task.FromResult(response).ConfigureAwait(false); + } + + public async Task UpdateAsync(InferenceRequest inferenceRequest, InferenceRequestStatus status, CancellationToken cancellationToken = default) + { + Guard.Against.Null(inferenceRequest); + + using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "TransactionId", inferenceRequest.TransactionId } }); + + if (status == InferenceRequestStatus.Success) + { + inferenceRequest.State = InferenceRequestState.Completed; + inferenceRequest.Status = InferenceRequestStatus.Success; + } + else + { + if (++inferenceRequest.TryCount > _options.Value.Database.Retries.DelaysMilliseconds.Length) + { + _logger.InferenceRequestUpdateExceededMaximumRetries(); + inferenceRequest.State = InferenceRequestState.Completed; + inferenceRequest.Status = InferenceRequestStatus.Fail; + } + else + { + _logger.InferenceRequestUpdateRetryLater(); + inferenceRequest.State = InferenceRequestState.Queued; + } + } + + await SaveAsync(inferenceRequest, cancellationToken).ConfigureAwait(false); + } + + public abstract Task AddAsync(InferenceRequest inferenceRequest, CancellationToken cancellationToken = default); + + public abstract Task TakeAsync(CancellationToken cancellationToken = default); + + public abstract Task GetInferenceRequestAsync(string transactionId, CancellationToken cancellationToken = default); + + public abstract Task GetInferenceRequestAsync(Guid inferenceRequestId, CancellationToken cancellationToken = default); + + protected abstract Task SaveAsync(InferenceRequest inferenceRequest, CancellationToken cancellationToken = default); + } +} diff --git a/src/Database/Api/Repositories/StorageMetadataRepositoryBase.cs b/src/Database/Api/Repositories/StorageMetadataRepositoryBase.cs new file mode 100644 index 000000000..5f9f06f4e --- /dev/null +++ b/src/Database/Api/Repositories/StorageMetadataRepositoryBase.cs @@ -0,0 +1,104 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Ardalis.GuardClauses; +using Microsoft.Extensions.Logging; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Storage; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; + +namespace Monai.Deploy.InformaticsGateway.Database.Api.Repositories +{ + public abstract class StorageMetadataRepositoryBase : IStorageMetadataRepository + { + private readonly ILogger _logger; + + protected StorageMetadataRepositoryBase(ILogger logger) + { + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + } + + public async Task AddAsync(FileStorageMetadata metadata, CancellationToken cancellationToken = default) + { + Guard.Against.Null(metadata); + + using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "CorrelationId", metadata.CorrelationId }, { "Identity", metadata.Id } }); + var obj = new StorageMetadataWrapper(metadata); + await AddAsyncInternal(obj, cancellationToken).ConfigureAwait(false); + _logger.StorageMetadataSaved(); + } + + public async Task AddOrUpdateAsync(FileStorageMetadata metadata, CancellationToken cancellationToken = default) + { + Guard.Against.Null(metadata); + + var existing = await GetFileStorageMetdadataAsync(metadata.CorrelationId, metadata.Id, cancellationToken).ConfigureAwait(false); + + if (existing is not null) + { + await UpdateAsync(metadata, cancellationToken).ConfigureAwait(false); + } + else + { + await AddAsync(metadata, cancellationToken).ConfigureAwait(false); + } + } + + public virtual async Task DeleteAsync(string correlationId, string identity, CancellationToken cancellationToken = default) + { + Guard.Against.NullOrWhiteSpace(correlationId); + Guard.Against.NullOrWhiteSpace(identity); + + using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "CorrelationId", correlationId }, { "Identity", identity } }); + + var toBeDeleted = await FindByIds(identity, correlationId, cancellationToken).ConfigureAwait(false); + + if (toBeDeleted is not null) + { + return await DeleteInternalAsync(toBeDeleted, cancellationToken).ConfigureAwait(false); + } + return false; + } + + protected abstract Task DeleteInternalAsync(StorageMetadataWrapper toBeDeleted, CancellationToken cancellationToken); + public abstract Task DeletePendingUploadsAsync(CancellationToken cancellationToken = default); + + public abstract Task> GetFileStorageMetdadataAsync(string correlationId, CancellationToken cancellationToken = default); + + public abstract Task GetFileStorageMetdadataAsync(string correlationId, string identity, CancellationToken cancellationToken = default); + + public virtual async Task UpdateAsync(FileStorageMetadata metadata, CancellationToken cancellationToken = default) + { + Guard.Against.Null(metadata); + + using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "CorrelationId", metadata.CorrelationId }, { "Identity", metadata.Id } }); + var obj = await FindByIds(metadata.Id, metadata.CorrelationId).ConfigureAwait(false); + + if (obj is null) + { + throw new ArgumentException("Matching wrapper storage object not found"); + } + + obj.Update(metadata); + await UpdateInternal(obj, cancellationToken).ConfigureAwait(false); + _logger.StorageMetadataSaved(); + } + + protected abstract Task UpdateInternal(StorageMetadataWrapper obj, CancellationToken cancellationToken = default); + protected abstract Task FindByIds(string id, string correlationId, CancellationToken cancellationToken = default); + protected abstract Task AddAsyncInternal(StorageMetadataWrapper metadata, CancellationToken cancellationToken = default); + } +} diff --git a/src/Database/EntityFramework/Repositories/StorageMetadataWrapper.cs b/src/Database/Api/StorageMetadataWrapper.cs similarity index 69% rename from src/Database/EntityFramework/Repositories/StorageMetadataWrapper.cs rename to src/Database/Api/StorageMetadataWrapper.cs index 45e92f601..d89c34220 100644 --- a/src/Database/EntityFramework/Repositories/StorageMetadataWrapper.cs +++ b/src/Database/Api/StorageMetadataWrapper.cs @@ -17,23 +17,27 @@ using System.Text.Json; using System.Text.Json.Serialization; using Ardalis.GuardClauses; +using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Api.Storage; -namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories +namespace Monai.Deploy.InformaticsGateway.Database.Api { - public class StorageMetadataWrapper + /// + /// A wrapper class to support polymorphic types of + /// + public class StorageMetadataWrapper : MongoDBEntityBase { [JsonPropertyName("correlationId")] - public string CorrelationId { get; set; } + public string CorrelationId { get; set; } = string.Empty; [JsonPropertyName("identity")] - public string Identity { get; set; } + public string Identity { get; set; } = string.Empty; [JsonPropertyName("value")] - public string Value { get; set; } + public string Value { get; set; } = string.Empty; [JsonPropertyName("typeName")] - public string TypeName { get; set; } + public string TypeName { get; set; } = string.Empty; [JsonPropertyName("isUploaded")] public bool IsUploaded { get; set; } @@ -64,10 +68,18 @@ public void Update(FileStorageMetadata metadata) TypeName = metadata.GetType().AssemblyQualifiedName!; } - public FileStorageMetadata? GetObject() + public FileStorageMetadata GetObject() { var type = Type.GetType(TypeName, true); + + if (type is null) + { + throw new NotSupportedException($"Unable to locate type {TypeName} in the current application."); + } + +#pragma warning disable CS8603 // Possible null reference return. return JsonSerializer.Deserialize(Value, type) as FileStorageMetadata; +#pragma warning restore CS8603 // Possible null reference return. } } } diff --git a/src/Database/DatabaseManager.cs b/src/Database/DatabaseManager.cs index fea2d8694..1aafa7666 100644 --- a/src/Database/DatabaseManager.cs +++ b/src/Database/DatabaseManager.cs @@ -22,11 +22,16 @@ using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; using Monai.Deploy.InformaticsGateway.Database.EntityFramework; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration; +using Monai.Deploy.InformaticsGateway.Database.MongoDB; +using Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations; +using MongoDB.Driver; namespace Monai.Deploy.InformaticsGateway.Database { public static class DatabaseManager { + public const string DbType_Sqlite = "sqlite"; + public const string DbType_MongoDb = "mongodb"; public static IServiceCollection ConfigureDatabase(this IServiceCollection services, IConfigurationSection? connectionStringConfigurationSection) { if (connectionStringConfigurationSection is null) @@ -35,10 +40,13 @@ public static IServiceCollection ConfigureDatabase(this IServiceCollection servi } - var databaseType = connectionStringConfigurationSection["Type"]; + var databaseType = connectionStringConfigurationSection["Type"].ToLowerInvariant(); switch (databaseType) { - case "Sqlite": + case DbType_Sqlite: + services.AddDbContext( + options => options.UseSqlite(connectionStringConfigurationSection[SR.DatabaseConnectionStringKey]), + ServiceLifetime.Transient); services.AddScoped(); services.AddScoped(typeof(IDestinationApplicationEntityRepository), typeof(EntityFramework.Repositories.DestinationApplicationEntityRepository)); services.AddScoped(typeof(IInferenceRequestRepository), typeof(EntityFramework.Repositories.InferenceRequestRepository)); @@ -46,9 +54,18 @@ public static IServiceCollection ConfigureDatabase(this IServiceCollection servi services.AddScoped(typeof(ISourceApplicationEntityRepository), typeof(EntityFramework.Repositories.SourceApplicationEntityRepository)); services.AddScoped(typeof(IStorageMetadataRepository), typeof(EntityFramework.Repositories.StorageMetadataWrapperRepository)); services.AddScoped(typeof(IPayloadRepository), typeof(EntityFramework.Repositories.PayloadRepository)); - services.AddDbContext( - options => options.UseSqlite(connectionStringConfigurationSection[SR.DatabaseConnectionStringKey]), - ServiceLifetime.Transient); + return services; + case DbType_MongoDb: + services.AddSingleton(s => new MongoClient(connectionStringConfigurationSection[SR.DatabaseConnectionStringKey])); + services.Configure(connectionStringConfigurationSection); + services.AddScoped(); + services.AddScoped(typeof(IDestinationApplicationEntityRepository), typeof(MongoDB.Repositories.DestinationApplicationEntityRepository)); + services.AddScoped(typeof(IInferenceRequestRepository), typeof(MongoDB.Repositories.InferenceRequestRepository)); + services.AddScoped(typeof(IMonaiApplicationEntityRepository), typeof(MongoDB.Repositories.MonaiApplicationEntityRepository)); + services.AddScoped(typeof(ISourceApplicationEntityRepository), typeof(MongoDB.Repositories.SourceApplicationEntityRepository)); + services.AddScoped(typeof(IStorageMetadataRepository), typeof(MongoDB.Repositories.StorageMetadataWrapperRepository)); + services.AddScoped(typeof(IPayloadRepository), typeof(MongoDB.Repositories.PayloadRepository)); + return services; default: throw new ConfigurationException($"Unsupported database type defined: '{databaseType}'"); diff --git a/src/Database/DatabaseMigrationManager.cs b/src/Database/DatabaseMigrationManager.cs index 21a823d94..2d27d194c 100644 --- a/src/Database/DatabaseMigrationManager.cs +++ b/src/Database/DatabaseMigrationManager.cs @@ -26,7 +26,7 @@ public static IHost MigrateDatabase(this IHost host) { using (var scope = host.Services.CreateScope()) { - scope.ServiceProvider.GetRequiredService()?.Migrate(host); + scope.ServiceProvider.GetService()?.Migrate(host); } return host; } diff --git a/src/Database/EntityFramework/Configuration/DestinationApplicationEntityConfiguration.cs b/src/Database/EntityFramework/Configuration/DestinationApplicationEntityConfiguration.cs index 296095528..98b990120 100644 --- a/src/Database/EntityFramework/Configuration/DestinationApplicationEntityConfiguration.cs +++ b/src/Database/EntityFramework/Configuration/DestinationApplicationEntityConfiguration.cs @@ -32,6 +32,8 @@ public void Configure(EntityTypeBuilder builder) builder.HasIndex(p => p.Name, "idx_destination_name").IsUnique(); builder.HasIndex(p => new { p.Name, p.AeTitle, p.HostIp, p.Port }, "idx_source_all").IsUnique(); + + builder.Ignore(p => p.Id); } } } diff --git a/src/Database/EntityFramework/Configuration/InferenceRequestConfiguration.cs b/src/Database/EntityFramework/Configuration/InferenceRequestConfiguration.cs index 8a876e8a3..cbaf3385d 100644 --- a/src/Database/EntityFramework/Configuration/InferenceRequestConfiguration.cs +++ b/src/Database/EntityFramework/Configuration/InferenceRequestConfiguration.cs @@ -15,9 +15,6 @@ * limitations under the License. */ -using System; -using System.Collections.Generic; -using System.Linq; using System.Text.Json; using System.Text.Json.Serialization; using Microsoft.EntityFrameworkCore; @@ -27,6 +24,8 @@ namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration { +#pragma warning disable CS8603 // Possible null reference return. +#pragma warning disable CS8604 // Possible null reference argument. internal class InferenceRequestConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) @@ -76,4 +75,6 @@ public void Configure(EntityTypeBuilder builder) builder.HasIndex(p => p.TransactionId, "idx_inferencerequest_transactionid").IsUnique(); } } +#pragma warning restore CS8604 // Possible null reference argument. +#pragma warning restore CS8603 // Possible null reference return. } diff --git a/src/Database/EntityFramework/Configuration/MonaiApplicationEntityConfiguration.cs b/src/Database/EntityFramework/Configuration/MonaiApplicationEntityConfiguration.cs index 17d807911..7de1f3681 100644 --- a/src/Database/EntityFramework/Configuration/MonaiApplicationEntityConfiguration.cs +++ b/src/Database/EntityFramework/Configuration/MonaiApplicationEntityConfiguration.cs @@ -63,6 +63,8 @@ public void Configure(EntityTypeBuilder builder) .Metadata.SetValueComparer(valueComparer); builder.HasIndex(p => p.Name, "idx_monaiae_name").IsUnique(); + + builder.Ignore(p => p.Id); } } } diff --git a/src/Database/EntityFramework/Configuration/PayloadConfiguration.cs b/src/Database/EntityFramework/Configuration/PayloadConfiguration.cs index 129f1ad9d..67449c619 100644 --- a/src/Database/EntityFramework/Configuration/PayloadConfiguration.cs +++ b/src/Database/EntityFramework/Configuration/PayloadConfiguration.cs @@ -14,9 +14,6 @@ * limitations under the License. */ -using System; -using System.Collections.Generic; -using System.Linq; using System.Text.Json; using System.Text.Json.Serialization; using Microsoft.EntityFrameworkCore; @@ -40,7 +37,7 @@ public void Configure(EntityTypeBuilder builder) DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull }; - builder.HasKey(j => j.Id); + builder.HasKey(j => j.PayloadId); builder.Property(j => j.Timeout).IsRequired(); builder.Property(j => j.Key).IsRequired(); @@ -61,7 +58,7 @@ public void Configure(EntityTypeBuilder builder) builder.Ignore(j => j.Count); builder.HasIndex(p => p.State, "idx_payload_state"); - builder.HasIndex(p => new { p.CorrelationId, p.Id }, "idx_payload_ids").IsUnique(); + builder.HasIndex(p => new { p.CorrelationId, p.PayloadId }, "idx_payload_ids").IsUnique(); } } } diff --git a/src/Database/EntityFramework/Configuration/SourceApplicationEntityConfiguration.cs b/src/Database/EntityFramework/Configuration/SourceApplicationEntityConfiguration.cs index 73d9d81e3..863798216 100644 --- a/src/Database/EntityFramework/Configuration/SourceApplicationEntityConfiguration.cs +++ b/src/Database/EntityFramework/Configuration/SourceApplicationEntityConfiguration.cs @@ -30,6 +30,8 @@ public void Configure(Microsoft.EntityFrameworkCore.Metadata.Builders.EntityType builder.HasIndex(p => p.Name, "idx_source_name").IsUnique(); builder.HasIndex(p => new { p.Name, p.AeTitle, p.HostIp }, "idx_source_all").IsUnique(); + + builder.Ignore(p => p.Id); } } } diff --git a/src/Database/EntityFramework/Configuration/StorageMetadataWrapperEntityConfiguration.cs b/src/Database/EntityFramework/Configuration/StorageMetadataWrapperEntityConfiguration.cs index 1e6dbcf07..800248fc0 100644 --- a/src/Database/EntityFramework/Configuration/StorageMetadataWrapperEntityConfiguration.cs +++ b/src/Database/EntityFramework/Configuration/StorageMetadataWrapperEntityConfiguration.cs @@ -17,7 +17,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; -using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; +using Monai.Deploy.InformaticsGateway.Database.Api; namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration { @@ -37,6 +37,8 @@ public void Configure(EntityTypeBuilder builder) builder.HasIndex(p => new { p.CorrelationId, p.Identity }, "idx_storagemetadata_ids"); builder.HasIndex(p => p.CorrelationId, "idx_storagemetadata_correlation"); builder.HasIndex(p => p.IsUploaded, "idx_storagemetadata_uploaded"); + + builder.Ignore(p => p.Id); } } } diff --git a/src/Database/EntityFramework/InformaticsGatewayContext.cs b/src/Database/EntityFramework/InformaticsGatewayContext.cs index 34051d623..1174dfbec 100644 --- a/src/Database/EntityFramework/InformaticsGatewayContext.cs +++ b/src/Database/EntityFramework/InformaticsGatewayContext.cs @@ -18,6 +18,9 @@ using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.Extensions.Logging; using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Rest; +using Monai.Deploy.InformaticsGateway.Api.Storage; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Configuration; namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework @@ -31,6 +34,9 @@ public InformaticsGatewayContext(DbContextOptions opt public virtual DbSet MonaiApplicationEntities { get; set; } public virtual DbSet SourceApplicationEntities { get; set; } public virtual DbSet DestinationApplicationEntities { get; set; } + public virtual DbSet InferenceRequests { get; set; } + public virtual DbSet Payloads { get; set; } + public virtual DbSet StorageMetadataWrapperEntities { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { diff --git a/src/Database/EntityFramework/Migrations/20221115163047_R3_0.3.4.Designer.cs b/src/Database/EntityFramework/Migrations/20221115163047_R3_0.3.4.Designer.cs new file mode 100644 index 000000000..53d9a0c29 --- /dev/null +++ b/src/Database/EntityFramework/Migrations/20221115163047_R3_0.3.4.Designer.cs @@ -0,0 +1,238 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Monai.Deploy.InformaticsGateway.Database.EntityFramework; + +#nullable disable + +namespace Monai.Deploy.InformaticsGateway.Database.Migrations +{ + [DbContext(typeof(InformaticsGatewayContext))] + [Migration("20221115163047_R3_0.3.4")] + partial class R3_034 + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "6.0.10"); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.DestinationApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Port") + .HasColumnType("INTEGER"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_destination_name") + .IsUnique(); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp", "Port" }, "idx_source_all") + .IsUnique(); + + b.ToTable("DestinationApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.MonaiApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT") + .HasColumnOrder(0); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("AllowedSopClasses") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("Grouping") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IgnoredSopClasses") + .HasColumnType("TEXT"); + + b.Property("Timeout") + .HasColumnType("INTEGER"); + + b.Property("Workflows") + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name" }, "idx_monaiae_name") + .IsUnique(); + + b.ToTable("MonaiApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Rest.InferenceRequest", b => + { + b.Property("InferenceRequestId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("InputMetadata") + .HasColumnType("TEXT"); + + b.Property("InputResources") + .HasColumnType("TEXT"); + + b.Property("OutputResources") + .HasColumnType("TEXT"); + + b.Property("Priority") + .HasColumnType("INTEGER"); + + b.Property("State") + .HasColumnType("INTEGER"); + + b.Property("Status") + .HasColumnType("INTEGER"); + + b.Property("TransactionId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TryCount") + .HasColumnType("INTEGER"); + + b.HasKey("InferenceRequestId"); + + b.HasIndex(new[] { "InferenceRequestId" }, "idx_inferencerequest_inferencerequestid") + .IsUnique(); + + b.HasIndex(new[] { "State" }, "idx_inferencerequest_state"); + + b.HasIndex(new[] { "TransactionId" }, "idx_inferencerequest_transactionid") + .IsUnique(); + + b.ToTable("InferenceRequests"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.SourceApplicationEntity", b => + { + b.Property("Name") + .HasColumnType("TEXT"); + + b.Property("AeTitle") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("HostIp") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Name"); + + b.HasIndex(new[] { "Name", "AeTitle", "HostIp" }, "idx_source_all") + .IsUnique() + .HasDatabaseName("idx_source_all1"); + + b.HasIndex(new[] { "Name" }, "idx_source_name") + .IsUnique(); + + b.ToTable("SourceApplicationEntities"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Storage.Payload", b => + { + b.Property("PayloadId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("CorrelationId") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("Files") + .HasColumnType("TEXT"); + + b.Property("Key") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("RetryCount") + .HasColumnType("INTEGER"); + + b.Property("State") + .HasColumnType("INTEGER"); + + b.Property("Timeout") + .HasColumnType("INTEGER"); + + b.HasKey("PayloadId"); + + b.HasIndex(new[] { "CorrelationId", "PayloadId" }, "idx_payload_ids") + .IsUnique(); + + b.HasIndex(new[] { "State" }, "idx_payload_state"); + + b.ToTable("Payloads"); + }); + + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Database.Api.StorageMetadataWrapper", b => + { + b.Property("CorrelationId") + .HasColumnType("TEXT"); + + b.Property("Identity") + .HasColumnType("TEXT"); + + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + + b.Property("IsUploaded") + .HasColumnType("INTEGER"); + + b.Property("TypeName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Value") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("CorrelationId", "Identity"); + + b.HasIndex(new[] { "CorrelationId" }, "idx_storagemetadata_correlation"); + + b.HasIndex(new[] { "CorrelationId", "Identity" }, "idx_storagemetadata_ids"); + + b.HasIndex(new[] { "IsUploaded" }, "idx_storagemetadata_uploaded"); + + b.ToTable("StorageMetadataWrapperEntities"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Database/EntityFramework/Migrations/20221115163047_R3_0.3.4.cs b/src/Database/EntityFramework/Migrations/20221115163047_R3_0.3.4.cs new file mode 100644 index 000000000..0e144b651 --- /dev/null +++ b/src/Database/EntityFramework/Migrations/20221115163047_R3_0.3.4.cs @@ -0,0 +1,189 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Monai.Deploy.InformaticsGateway.Database.Migrations +{ + public partial class R3_034 : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "StorageMetadataWrapper"); + + migrationBuilder.DropPrimaryKey( + name: "PK_Payload", + table: "Payload"); + + migrationBuilder.DropPrimaryKey( + name: "PK_InferenceRequest", + table: "InferenceRequest"); + + migrationBuilder.RenameTable( + name: "Payload", + newName: "Payloads"); + + migrationBuilder.RenameTable( + name: "InferenceRequest", + newName: "InferenceRequests"); + + migrationBuilder.RenameColumn( + name: "Id", + table: "Payloads", + newName: "PayloadId"); + + migrationBuilder.AddColumn( + name: "DateTimeCreated", + table: "SourceApplicationEntities", + type: "TEXT", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + + migrationBuilder.AddColumn( + name: "DateTimeCreated", + table: "MonaiApplicationEntities", + type: "TEXT", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + + migrationBuilder.AddColumn( + name: "DateTimeCreated", + table: "DestinationApplicationEntities", + type: "TEXT", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + + migrationBuilder.AddColumn( + name: "DateTimeCreated", + table: "InferenceRequests", + type: "TEXT", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + + migrationBuilder.AddPrimaryKey( + name: "PK_Payloads", + table: "Payloads", + column: "PayloadId"); + + migrationBuilder.AddPrimaryKey( + name: "PK_InferenceRequests", + table: "InferenceRequests", + column: "InferenceRequestId"); + + migrationBuilder.CreateTable( + name: "StorageMetadataWrapperEntities", + columns: table => new + { + CorrelationId = table.Column(type: "TEXT", nullable: false), + Identity = table.Column(type: "TEXT", nullable: false), + Value = table.Column(type: "TEXT", nullable: false), + TypeName = table.Column(type: "TEXT", nullable: false), + IsUploaded = table.Column(type: "INTEGER", nullable: false), + DateTimeCreated = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_StorageMetadataWrapperEntities", x => new { x.CorrelationId, x.Identity }); + }); + + migrationBuilder.CreateIndex( + name: "idx_storagemetadata_correlation", + table: "StorageMetadataWrapperEntities", + column: "CorrelationId"); + + migrationBuilder.CreateIndex( + name: "idx_storagemetadata_ids", + table: "StorageMetadataWrapperEntities", + columns: new[] { "CorrelationId", "Identity" }); + + migrationBuilder.CreateIndex( + name: "idx_storagemetadata_uploaded", + table: "StorageMetadataWrapperEntities", + column: "IsUploaded"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "StorageMetadataWrapperEntities"); + + migrationBuilder.DropPrimaryKey( + name: "PK_Payloads", + table: "Payloads"); + + migrationBuilder.DropPrimaryKey( + name: "PK_InferenceRequests", + table: "InferenceRequests"); + + migrationBuilder.DropColumn( + name: "DateTimeCreated", + table: "SourceApplicationEntities"); + + migrationBuilder.DropColumn( + name: "DateTimeCreated", + table: "MonaiApplicationEntities"); + + migrationBuilder.DropColumn( + name: "DateTimeCreated", + table: "DestinationApplicationEntities"); + + migrationBuilder.DropColumn( + name: "DateTimeCreated", + table: "InferenceRequests"); + + migrationBuilder.RenameTable( + name: "Payloads", + newName: "Payload"); + + migrationBuilder.RenameTable( + name: "InferenceRequests", + newName: "InferenceRequest"); + + migrationBuilder.RenameColumn( + name: "PayloadId", + table: "Payload", + newName: "Id"); + + migrationBuilder.AddPrimaryKey( + name: "PK_Payload", + table: "Payload", + column: "Id"); + + migrationBuilder.AddPrimaryKey( + name: "PK_InferenceRequest", + table: "InferenceRequest", + column: "InferenceRequestId"); + + migrationBuilder.CreateTable( + name: "StorageMetadataWrapper", + columns: table => new + { + CorrelationId = table.Column(type: "TEXT", nullable: false), + Identity = table.Column(type: "TEXT", nullable: false), + IsUploaded = table.Column(type: "INTEGER", nullable: false), + TypeName = table.Column(type: "TEXT", nullable: true), + Value = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_StorageMetadataWrapper", x => new { x.CorrelationId, x.Identity }); + }); + + migrationBuilder.CreateIndex( + name: "idx_storagemetadata_correlation", + table: "StorageMetadataWrapper", + column: "CorrelationId"); + + migrationBuilder.CreateIndex( + name: "idx_storagemetadata_ids", + table: "StorageMetadataWrapper", + columns: new[] { "CorrelationId", "Identity" }); + + migrationBuilder.CreateIndex( + name: "idx_storagemetadata_uploaded", + table: "StorageMetadataWrapper", + column: "IsUploaded"); + } + } +} diff --git a/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs b/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs index 2940a6ae8..cf147b305 100644 --- a/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs +++ b/src/Database/EntityFramework/Migrations/InformaticsGatewayContextModelSnapshot.cs @@ -15,7 +15,7 @@ partial class InformaticsGatewayContextModelSnapshot : ModelSnapshot protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "6.0.9"); + modelBuilder.HasAnnotation("ProductVersion", "6.0.10"); modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.DestinationApplicationEntity", b => { @@ -26,6 +26,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) .IsRequired() .HasColumnType("TEXT"); + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + b.Property("HostIp") .IsRequired() .HasColumnType("TEXT"); @@ -57,6 +60,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("AllowedSopClasses") .HasColumnType("TEXT"); + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + b.Property("Grouping") .IsRequired() .HasColumnType("TEXT"); @@ -84,6 +90,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) .ValueGeneratedOnAdd() .HasColumnType("TEXT"); + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + b.Property("InputMetadata") .HasColumnType("TEXT"); @@ -119,7 +128,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex(new[] { "TransactionId" }, "idx_inferencerequest_transactionid") .IsUnique(); - b.ToTable("InferenceRequest"); + b.ToTable("InferenceRequests"); }); modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.SourceApplicationEntity", b => @@ -131,6 +140,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) .IsRequired() .HasColumnType("TEXT"); + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + b.Property("HostIp") .IsRequired() .HasColumnType("TEXT"); @@ -149,7 +161,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Api.Storage.Payload", b => { - b.Property("Id") + b.Property("PayloadId") .ValueGeneratedOnAdd() .HasColumnType("TEXT"); @@ -176,17 +188,17 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("Timeout") .HasColumnType("INTEGER"); - b.HasKey("Id"); + b.HasKey("PayloadId"); - b.HasIndex(new[] { "CorrelationId", "Id" }, "idx_payload_ids") + b.HasIndex(new[] { "CorrelationId", "PayloadId" }, "idx_payload_ids") .IsUnique(); b.HasIndex(new[] { "State" }, "idx_payload_state"); - b.ToTable("Payload"); + b.ToTable("Payloads"); }); - modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Database.StorageMetadataWrapper", b => + modelBuilder.Entity("Monai.Deploy.InformaticsGateway.Database.Api.StorageMetadataWrapper", b => { b.Property("CorrelationId") .HasColumnType("TEXT"); @@ -194,13 +206,18 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("Identity") .HasColumnType("TEXT"); + b.Property("DateTimeCreated") + .HasColumnType("TEXT"); + b.Property("IsUploaded") .HasColumnType("INTEGER"); b.Property("TypeName") + .IsRequired() .HasColumnType("TEXT"); b.Property("Value") + .IsRequired() .HasColumnType("TEXT"); b.HasKey("CorrelationId", "Identity"); @@ -211,7 +228,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex(new[] { "IsUploaded" }, "idx_storagemetadata_uploaded"); - b.ToTable("StorageMetadataWrapper"); + b.ToTable("StorageMetadataWrapperEntities"); }); #pragma warning restore 612, 618 } diff --git a/src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs b/src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs index 78ee166b1..182ccee0e 100644 --- a/src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs +++ b/src/Database/EntityFramework/Repositories/DestinationApplicationEntityRepository.cs @@ -22,8 +22,8 @@ using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; -using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Logging; using Polly; using Polly.Retry; @@ -58,6 +58,8 @@ public DestinationApplicationEntityRepository( public async Task AddAsync(DestinationApplicationEntity item, CancellationToken cancellationToken = default) { + Guard.Against.Null(item); + return await _retryPolicy.ExecuteAsync(async () => { var result = await _dataset.AddAsync(item, cancellationToken).ConfigureAwait(false); @@ -77,6 +79,8 @@ public async Task ContainsAsync(Expression FindByNameAsync(string name, CancellationToken cancellationToken = default) { + Guard.Against.NullOrWhiteSpace(name); + return await _retryPolicy.ExecuteAsync(async () => { return await _dataset.FirstOrDefaultAsync(p => p.Name.Equals(name), cancellationToken).ConfigureAwait(false); @@ -85,6 +89,8 @@ public async Task ContainsAsync(Expression RemoveAsync(DestinationApplicationEntity entity, CancellationToken cancellationToken = default) { + Guard.Against.Null(entity); + return await _retryPolicy.ExecuteAsync(async () => { var result = _dataset.Remove(entity); @@ -103,6 +109,8 @@ public async Task> ToListAsync(CancellationTo public async Task UpdateAsync(DestinationApplicationEntity entity, CancellationToken cancellationToken = default) { + Guard.Against.Null(entity); + return await _retryPolicy.ExecuteAsync(async () => { var result = _dataset.Update(entity); diff --git a/src/Database/EntityFramework/Repositories/InferenceRequestRepository.cs b/src/Database/EntityFramework/Repositories/InferenceRequestRepository.cs index 890a8ee97..d3780c8aa 100644 --- a/src/Database/EntityFramework/Repositories/InferenceRequestRepository.cs +++ b/src/Database/EntityFramework/Repositories/InferenceRequestRepository.cs @@ -23,14 +23,14 @@ using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; -using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Logging; using Polly; using Polly.Retry; namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories { - public class InferenceRequestRepository : IInferenceRequestRepository, IDisposable + public class InferenceRequestRepository : InferenceRequestRepositoryBase, IDisposable { private readonly ILogger _logger; private readonly IOptions _options; @@ -45,7 +45,7 @@ public class InferenceRequestRepository : IInferenceRequestRepository, IDisposab public InferenceRequestRepository( IServiceScopeFactory serviceScopeFactory, ILogger logger, - IOptions options) + IOptions options) : base(logger, options) { Guard.Against.Null(serviceScopeFactory); @@ -59,7 +59,7 @@ public InferenceRequestRepository( _dataset = _informaticsGatewayContext.Set(); } - public async Task AddAsync(InferenceRequest inferenceRequest, CancellationToken cancellationToken = default) + public override async Task AddAsync(InferenceRequest inferenceRequest, CancellationToken cancellationToken = default) { Guard.Against.Null(inferenceRequest); @@ -74,36 +74,7 @@ await _retryPolicy.ExecuteAsync(async () => .ConfigureAwait(false); } - public async Task UpdateAsync(InferenceRequest inferenceRequest, InferenceRequestStatus status, CancellationToken cancellationToken = default) - { - Guard.Against.Null(inferenceRequest); - - using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "TransactionId", inferenceRequest.TransactionId } }); - - if (status == InferenceRequestStatus.Success) - { - inferenceRequest.State = InferenceRequestState.Completed; - inferenceRequest.Status = InferenceRequestStatus.Success; - } - else - { - if (++inferenceRequest.TryCount > _options.Value.Database.Retries.DelaysMilliseconds.Length) - { - _logger.InferenceRequestUpdateExceededMaximumRetries(); - inferenceRequest.State = InferenceRequestState.Completed; - inferenceRequest.Status = InferenceRequestStatus.Fail; - } - else - { - _logger.InferenceRequestUpdateRetryLater(); - inferenceRequest.State = InferenceRequestState.Queued; - } - } - - await Save(inferenceRequest).ConfigureAwait(false); - } - - public async Task TakeAsync(CancellationToken cancellationToken = default) + public override async Task TakeAsync(CancellationToken cancellationToken = default) { while (!cancellationToken.IsCancellationRequested) { @@ -116,7 +87,7 @@ public async Task TakeAsync(CancellationToken cancellationToke using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "TransactionId", inferenceRequest.TransactionId } }); inferenceRequest.State = InferenceRequestState.InProcess; _logger.InferenceRequestSetToInProgress(inferenceRequest.TransactionId); - await Save(inferenceRequest).ConfigureAwait(false); + await SaveAsync(inferenceRequest).ConfigureAwait(false); return inferenceRequest; } await Task.Delay(250, cancellationToken).ConfigureAwait(false); @@ -130,7 +101,7 @@ public async Task TakeAsync(CancellationToken cancellationToke throw new OperationCanceledException("cancellation requested."); } - public async Task GetInferenceRequestAsync(string transactionId, CancellationToken cancellationToken = default) + public override async Task GetInferenceRequestAsync(string transactionId, CancellationToken cancellationToken = default) { Guard.Against.NullOrWhiteSpace(transactionId); @@ -140,7 +111,7 @@ public async Task TakeAsync(CancellationToken cancellationToke }).ConfigureAwait(false); } - public async Task GetInferenceRequestAsync(Guid inferenceRequestId, CancellationToken cancellationToken = default) + public override async Task GetInferenceRequestAsync(Guid inferenceRequestId, CancellationToken cancellationToken = default) { Guard.Against.NullOrEmpty(inferenceRequestId); @@ -150,36 +121,7 @@ public async Task TakeAsync(CancellationToken cancellationToke }).ConfigureAwait(false); } - public async Task ExistsAsync(string transactionId, CancellationToken cancellationToken = default) - { - Guard.Against.NullOrWhiteSpace(transactionId); - - return await _retryPolicy.ExecuteAsync(async () => - { - return await GetInferenceRequestAsync(transactionId, cancellationToken).ConfigureAwait(false) is not null; - }).ConfigureAwait(false); - } - - public async Task GetStatusAsync(string transactionId, CancellationToken cancellationToken = default) - { - Guard.Against.NullOrWhiteSpace(transactionId); - - return await _retryPolicy.ExecuteAsync(async () => - { - var response = new InferenceStatusResponse(); - var item = await GetInferenceRequestAsync(transactionId, cancellationToken).ConfigureAwait(false); - if (item is null) - { - return null; - } - - response.TransactionId = item.TransactionId; - - return await Task.FromResult(response).ConfigureAwait(false); - }).ConfigureAwait(false); - } - - private async Task Save(InferenceRequest inferenceRequest) + protected override async Task SaveAsync(InferenceRequest inferenceRequest, CancellationToken cancellationToken = default) { Guard.Against.Null(inferenceRequest); @@ -191,7 +133,7 @@ await _retryPolicy.ExecuteAsync(async () => _informaticsGatewayContext.Entry(inferenceRequest).State = EntityState.Detached; } _dataset.Update(inferenceRequest); - await _informaticsGatewayContext.SaveChangesAsync().ConfigureAwait(false); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); _logger.InferenceRequestUpdated(); }).ConfigureAwait(false); } diff --git a/src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs b/src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs index 8ff711ed0..41148acbc 100644 --- a/src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs +++ b/src/Database/EntityFramework/Repositories/MonaiApplicationEntityRepository.cs @@ -22,8 +22,8 @@ using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; -using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Logging; using Polly; using Polly.Retry; @@ -58,6 +58,8 @@ public MonaiApplicationEntityRepository( public async Task AddAsync(MonaiApplicationEntity item, CancellationToken cancellationToken = default) { + Guard.Against.Null(item); + return await _retryPolicy.ExecuteAsync(async () => { var result = await _dataset.AddAsync(item, cancellationToken).ConfigureAwait(false); @@ -77,6 +79,8 @@ public async Task ContainsAsync(Expression FindByNameAsync(string name, CancellationToken cancellationToken = default) { + Guard.Against.NullOrWhiteSpace(name); + return await _retryPolicy.ExecuteAsync(async () => { return await _dataset.FirstOrDefaultAsync(p => p.Name.Equals(name), cancellationToken).ConfigureAwait(false); @@ -85,6 +89,8 @@ public async Task ContainsAsync(Expression RemoveAsync(MonaiApplicationEntity entity, CancellationToken cancellationToken = default) { + Guard.Against.Null(entity); + return await _retryPolicy.ExecuteAsync(async () => { var result = _dataset.Remove(entity); @@ -103,6 +109,8 @@ public async Task> ToListAsync(CancellationToken ca public async Task UpdateAsync(MonaiApplicationEntity entity, CancellationToken cancellationToken = default) { + Guard.Against.Null(entity); + return await _retryPolicy.ExecuteAsync(async () => { var result = _dataset.Update(entity); diff --git a/src/Database/EntityFramework/Repositories/PayloadRepository.cs b/src/Database/EntityFramework/Repositories/PayloadRepository.cs index ce07d92ea..8f849f7f0 100644 --- a/src/Database/EntityFramework/Repositories/PayloadRepository.cs +++ b/src/Database/EntityFramework/Repositories/PayloadRepository.cs @@ -22,8 +22,8 @@ using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; -using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Logging; using Polly; using Polly.Retry; @@ -58,6 +58,8 @@ public PayloadRepository( public async Task AddAsync(Payload item, CancellationToken cancellationToken = default) { + Guard.Against.Null(item); + return await _retryPolicy.ExecuteAsync(async () => { var result = await _dataset.AddAsync(item, cancellationToken).ConfigureAwait(false); @@ -76,6 +78,8 @@ public async Task ContainsAsync(Expression> predicate, public async Task RemoveAsync(Payload entity, CancellationToken cancellationToken = default) { + Guard.Against.Null(entity); + return await _retryPolicy.ExecuteAsync(async () => { var result = _dataset.Remove(entity); @@ -94,6 +98,8 @@ public async Task> ToListAsync(CancellationToken cancellationToken public async Task UpdateAsync(Payload entity, CancellationToken cancellationToken = default) { + Guard.Against.Null(entity); + return await _retryPolicy.ExecuteAsync(async () => { var result = _dataset.Update(entity); diff --git a/src/Database/EntityFramework/Repositories/SourceApplicationEntityRepository.cs b/src/Database/EntityFramework/Repositories/SourceApplicationEntityRepository.cs index 96f7b357b..0402eca99 100644 --- a/src/Database/EntityFramework/Repositories/SourceApplicationEntityRepository.cs +++ b/src/Database/EntityFramework/Repositories/SourceApplicationEntityRepository.cs @@ -22,8 +22,8 @@ using Microsoft.Extensions.Options; using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; -using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Logging; using Polly; using Polly.Retry; @@ -58,6 +58,8 @@ public SourceApplicationEntityRepository( public async Task AddAsync(SourceApplicationEntity item, CancellationToken cancellationToken = default) { + Guard.Against.Null(item); + return await _retryPolicy.ExecuteAsync(async () => { var result = await _dataset.AddAsync(item, cancellationToken).ConfigureAwait(false); @@ -77,6 +79,8 @@ public async Task ContainsAsync(Expression FindByNameAsync(string name, CancellationToken cancellationToken = default) { + Guard.Against.NullOrWhiteSpace(name); + return await _retryPolicy.ExecuteAsync(async () => { return await _dataset.FirstOrDefaultAsync(p => p.Name.Equals(name), cancellationToken).ConfigureAwait(false); @@ -85,6 +89,8 @@ public async Task ContainsAsync(Expression RemoveAsync(SourceApplicationEntity entity, CancellationToken cancellationToken = default) { + Guard.Against.Null(entity); + return await _retryPolicy.ExecuteAsync(async () => { var result = _dataset.Remove(entity); @@ -103,6 +109,8 @@ public async Task> ToListAsync(CancellationToken c public async Task UpdateAsync(SourceApplicationEntity entity, CancellationToken cancellationToken = default) { + Guard.Against.Null(entity); + return await _retryPolicy.ExecuteAsync(async () => { var result = _dataset.Update(entity); diff --git a/src/Database/EntityFramework/Repositories/StorageMetadataWrapperRepository.cs b/src/Database/EntityFramework/Repositories/StorageMetadataWrapperRepository.cs index b31b4aa05..adb69a347 100644 --- a/src/Database/EntityFramework/Repositories/StorageMetadataWrapperRepository.cs +++ b/src/Database/EntityFramework/Repositories/StorageMetadataWrapperRepository.cs @@ -21,18 +21,17 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; -using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Logging; using Polly; using Polly.Retry; namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories { - public class StorageMetadataWrapperRepository : IStorageMetadataRepository, IDisposable + public class StorageMetadataWrapperRepository : StorageMetadataRepositoryBase, IDisposable { private readonly ILogger _logger; private readonly IServiceScope _scope; @@ -41,12 +40,10 @@ public class StorageMetadataWrapperRepository : IStorageMetadataRepository, IDis private readonly DbSet _dataset; private bool _disposedValue; - public ServiceStatus Status { get; set; } = ServiceStatus.Unknown; - public StorageMetadataWrapperRepository( IServiceScopeFactory serviceScopeFactory, ILogger logger, - IOptions options) + IOptions options) : base(logger) { Guard.Against.Null(serviceScopeFactory); Guard.Against.Null(options); @@ -61,65 +58,42 @@ public StorageMetadataWrapperRepository( _dataset = _informaticsGatewayContext.Set(); } - - public async Task AddAsync(FileStorageMetadata metadata, CancellationToken cancellationToken = default) + protected override async Task AddAsyncInternal(StorageMetadataWrapper metadata, CancellationToken cancellationToken = default) { Guard.Against.Null(metadata); - using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "CorrelationId", metadata.CorrelationId }, { "Identity", metadata.Id } }); await _retryPolicy.ExecuteAsync(async () => { - var obj = new StorageMetadataWrapper(metadata); - await _dataset.AddAsync(obj, cancellationToken).ConfigureAwait(false); + await _dataset.AddAsync(metadata, cancellationToken).ConfigureAwait(false); await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); - _informaticsGatewayContext.Entry(obj).State = Microsoft.EntityFrameworkCore.EntityState.Detached; - _logger.StorageMetadataSaved(); + _informaticsGatewayContext.Entry(metadata).State = Microsoft.EntityFrameworkCore.EntityState.Detached; }) .ConfigureAwait(false); } - public async Task UpdateAsync(FileStorageMetadata metadata, CancellationToken cancellationToken = default) + protected override async Task UpdateInternal(StorageMetadataWrapper metadata, CancellationToken cancellationToken = default) { - Guard.Against.Null(metadata); - using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "CorrelationId", metadata.CorrelationId }, { "Identity", metadata.Id } }); await _retryPolicy.ExecuteAsync(async () => { - var obj = await _dataset.FirstOrDefaultAsync(p => p.Identity == metadata.Id && p.CorrelationId == metadata.CorrelationId, cancellationToken).ConfigureAwait(false); - - if (obj is null) - { - throw new ArgumentException("Matching wrapper storage object not found"); - } - - obj.Update(metadata); - _dataset.Update(obj); + _dataset.Update(metadata); await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); - _informaticsGatewayContext.Entry(obj).State = Microsoft.EntityFrameworkCore.EntityState.Detached; + _informaticsGatewayContext.Entry(metadata).State = Microsoft.EntityFrameworkCore.EntityState.Detached; _logger.StorageMetadataSaved(); }) .ConfigureAwait(false); } - public async Task AddOrUpdateAsync(FileStorageMetadata metadata, CancellationToken cancellationToken = default) + protected override async Task FindByIds(string id, string correlationId, CancellationToken cancellationToken = default) { - - Guard.Against.Null(metadata); - - var existing = await GetFileStorageMetdadataAsync(metadata.CorrelationId, metadata.Id, cancellationToken).ConfigureAwait(false); - - if (existing is not null) - { - await UpdateAsync(metadata, cancellationToken).ConfigureAwait(false); - } - else + return await _retryPolicy.ExecuteAsync(async () => { - await AddAsync(metadata, cancellationToken).ConfigureAwait(false); - } + return await _dataset.FirstOrDefaultAsync(p => p.Identity == id && p.CorrelationId == correlationId, cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); } - public async Task> GetFileStorageMetdadataAsync(string correlationId, CancellationToken cancellationToken = default) + public override async Task> GetFileStorageMetdadataAsync(string correlationId, CancellationToken cancellationToken = default) { Guard.Against.NullOrWhiteSpace(correlationId); @@ -132,37 +106,33 @@ public async Task AddOrUpdateAsync(FileStorageMetadata metadata, CancellationTok }).ConfigureAwait(false); } - public async Task GetFileStorageMetdadataAsync(string correlationId, string identity, CancellationToken cancellationToken = default) + public override async Task GetFileStorageMetdadataAsync(string correlationId, string identity, CancellationToken cancellationToken = default) { Guard.Against.NullOrWhiteSpace(correlationId); Guard.Against.NullOrWhiteSpace(identity); return await _retryPolicy.ExecuteAsync(async () => { - var result = await _dataset.FirstOrDefaultAsync(p => p.CorrelationId.Equals(correlationId) && p.Identity.Equals(identity), cancellationToken).ConfigureAwait(false); + var result = await _dataset + .FirstOrDefaultAsync(p => p.CorrelationId.Equals(correlationId) && p.Identity.Equals(identity), cancellationToken) + .ConfigureAwait(false); return result?.GetObject(); }).ConfigureAwait(false); } - public async Task DeleteAsync(string correlationId, string identity, CancellationToken cancellationToken = default) + protected override async Task DeleteInternalAsync(StorageMetadataWrapper metadata, CancellationToken cancellationToken = default) { - Guard.Against.NullOrWhiteSpace(correlationId); - Guard.Against.NullOrWhiteSpace(identity); - - var toBeDeleted = await _dataset.FirstOrDefaultAsync(p => p.CorrelationId.Equals(correlationId) && p.Identity.Equals(identity), cancellationToken).ConfigureAwait(false); + Guard.Against.Null(metadata); - if (toBeDeleted is not null) + return await _retryPolicy.ExecuteAsync(async () => { - return await _retryPolicy.ExecuteAsync(async () => - { - _dataset.Remove(toBeDeleted); - await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); - return true; - }).ConfigureAwait(false); - } - return false; + _dataset.Remove(metadata); + await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); + return true; + }).ConfigureAwait(false); } - public async Task DeletePendingUploadsAsync(CancellationToken cancellationToken = default) + + public override async Task DeletePendingUploadsAsync(CancellationToken cancellationToken = default) { await _retryPolicy.ExecuteAsync(async () => { @@ -174,8 +144,8 @@ await _retryPolicy.ExecuteAsync(async () => await _informaticsGatewayContext.SaveChangesAsync(cancellationToken).ConfigureAwait(false); } }).ConfigureAwait(false); - } + protected virtual void Dispose(bool disposing) { if (!_disposedValue) diff --git a/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs index 92db35397..483ca3b73 100644 --- a/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/DestinationApplicationEntityRepositoryTest.cs @@ -26,7 +26,7 @@ namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test { [Collection("SqliteDatabase")] - public class DestinationApplicationEntityRepositoryTest //: IClassFixture + public class DestinationApplicationEntityRepositoryTest { private readonly SqliteDatabaseFixture _databaseFixture; diff --git a/src/Database/EntityFramework/Test/InMemoryDatabaseFixture.cs b/src/Database/EntityFramework/Test/InMemoryDatabaseFixture.cs index c42d41938..2aea0684a 100644 --- a/src/Database/EntityFramework/Test/InMemoryDatabaseFixture.cs +++ b/src/Database/EntityFramework/Test/InMemoryDatabaseFixture.cs @@ -16,7 +16,6 @@ using Microsoft.EntityFrameworkCore; using Monai.Deploy.InformaticsGateway.Api; -using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test { @@ -98,7 +97,6 @@ public void InitDatabaseWithSourceApplicationEntities() DatabaseContext.SaveChanges(); } - public void Dispose() { DatabaseContext.Dispose(); diff --git a/src/Database/EntityFramework/Test/InferenceRequestRepositoryTest.cs b/src/Database/EntityFramework/Test/InferenceRequestRepositoryTest.cs index 5e48d7192..a90ff02d1 100644 --- a/src/Database/EntityFramework/Test/InferenceRequestRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/InferenceRequestRepositoryTest.cs @@ -39,7 +39,7 @@ public class InferenceRequestRepositoryTest public InferenceRequestRepositoryTest(SqliteDatabaseFixture databaseFixture) { - _databaseFixture = databaseFixture;// new SqliteDatabaseFixture(); + _databaseFixture = databaseFixture; _serviceScopeFactory = new Mock(); _logger = new Mock>(); @@ -86,7 +86,7 @@ public async Task GivenAFailedInferenceRequstThatExceededRetries_WhenUpdateIsCal var store = new InferenceRequestRepository(_serviceScopeFactory.Object, _logger.Object, _options); await store.AddAsync(inferenceRequest).ConfigureAwait(false); - await store.UpdateAsync(inferenceRequest, InferenceRequestStatus.Fail); + await store.UpdateAsync(inferenceRequest, InferenceRequestStatus.Fail).ConfigureAwait(false); var result = await _databaseFixture.DatabaseContext.Set().FirstOrDefaultAsync(p => p.TransactionId == inferenceRequest.TransactionId).ConfigureAwait(false); Assert.NotNull(result); @@ -171,7 +171,7 @@ public async Task GivenNoQueuedInferenceRequests_WhenTakeIsCalled_ShallReturnNot await store.AddAsync(inferenceRequestCompleted).ConfigureAwait(false); cancellationTokenSource.CancelAfter(500); - await Assert.ThrowsAsync(async () => await store.TakeAsync(cancellationTokenSource.Token).ConfigureAwait(false)); + await Assert.ThrowsAsync(async () => await store.TakeAsync(cancellationTokenSource.Token).ConfigureAwait(false)).ConfigureAwait(false); } [Fact] @@ -187,18 +187,24 @@ public async Task GivenInferenceRequests_WhenGetInferenceRequestIsCalled_ShallRe await store.AddAsync(inferenceRequest3).ConfigureAwait(false); var result = await store.GetInferenceRequestAsync(inferenceRequest1.TransactionId).ConfigureAwait(false); - Assert.Equal(inferenceRequest1.TransactionId, result.TransactionId); + Assert.NotNull(result); + Assert.Equal(inferenceRequest1.TransactionId, result!.TransactionId); result = await store.GetInferenceRequestAsync(inferenceRequest2.TransactionId).ConfigureAwait(false); - Assert.Equal(inferenceRequest2.TransactionId, result.TransactionId); + Assert.NotNull(result); + Assert.Equal(inferenceRequest2.TransactionId, result!.TransactionId); result = await store.GetInferenceRequestAsync(inferenceRequest3.TransactionId).ConfigureAwait(false); - Assert.Equal(inferenceRequest3.TransactionId, result.TransactionId); + Assert.NotNull(result); + Assert.Equal(inferenceRequest3.TransactionId, result!.TransactionId); result = await store.GetInferenceRequestAsync(inferenceRequest1.InferenceRequestId).ConfigureAwait(false); - Assert.Equal(inferenceRequest1.TransactionId, result.TransactionId); + Assert.NotNull(result); + Assert.Equal(inferenceRequest1.TransactionId, result!.TransactionId); result = await store.GetInferenceRequestAsync(inferenceRequest2.InferenceRequestId).ConfigureAwait(false); - Assert.Equal(inferenceRequest2.TransactionId, result.TransactionId); + Assert.NotNull(result); + Assert.Equal(inferenceRequest2.TransactionId, result!.TransactionId); result = await store.GetInferenceRequestAsync(inferenceRequest3.InferenceRequestId).ConfigureAwait(false); - Assert.Equal(inferenceRequest3.TransactionId, result.TransactionId); + Assert.NotNull(result); + Assert.Equal(inferenceRequest3.TransactionId, result!.TransactionId); } [Fact] @@ -227,7 +233,7 @@ public async Task GivenAMatchingInferenceRequest_WhenGetStatusCalled_ShallReturn var result = await store.GetStatusAsync(inferenceRequest.TransactionId).ConfigureAwait(false); Assert.NotNull(result); - Assert.Equal(inferenceRequest.TransactionId, result.TransactionId); + Assert.Equal(inferenceRequest.TransactionId, result!.TransactionId); } [Fact] @@ -243,7 +249,7 @@ public async Task GivenNoMatchingInferenceRequest_WhenGetStatusCalled_ShallRetur Assert.Null(result); } - private InferenceRequest CreateInferenceRequest(InferenceRequestState state = InferenceRequestState.Queued) => new InferenceRequest + private static InferenceRequest CreateInferenceRequest(InferenceRequestState state = InferenceRequestState.Queued) => new() { InferenceRequestId = Guid.NewGuid(), State = state, diff --git a/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs index b306af659..372484845 100644 --- a/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/MonaiApplicationEntityRepositoryTest.cs @@ -26,7 +26,7 @@ namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test { [Collection("SqliteDatabase")] - public class MonaiApplicationEntityRepositoryTest //: IClassFixture + public class MonaiApplicationEntityRepositoryTest { private readonly SqliteDatabaseFixture _databaseFixture; diff --git a/src/Database/EntityFramework/Test/SourceApplicationEntityRepositoryTest.cs b/src/Database/EntityFramework/Test/SourceApplicationEntityRepositoryTest.cs index 6f3b993ea..8df19376f 100644 --- a/src/Database/EntityFramework/Test/SourceApplicationEntityRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/SourceApplicationEntityRepositoryTest.cs @@ -26,7 +26,7 @@ namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test { [Collection("SqliteDatabase")] - public class SourceApplicationEntityRepositoryTest //: IClassFixture + public class SourceApplicationEntityRepositoryTest { private readonly SqliteDatabaseFixture _databaseFixture; diff --git a/src/Database/EntityFramework/Test/StorageMetadataWrapperRepositoryTest.cs b/src/Database/EntityFramework/Test/StorageMetadataWrapperRepositoryTest.cs index 232e3d3b3..61241f224 100644 --- a/src/Database/EntityFramework/Test/StorageMetadataWrapperRepositoryTest.cs +++ b/src/Database/EntityFramework/Test/StorageMetadataWrapperRepositoryTest.cs @@ -22,13 +22,14 @@ using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Api.Storage; using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; using Moq; namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test { [Collection("SqliteDatabase")] - public class StorageMetadataWrapperRepositoryTest //: IClassFixture + public class StorageMetadataWrapperRepositoryTest { private readonly SqliteDatabaseFixture _databaseFixture; @@ -63,8 +64,8 @@ public StorageMetadataWrapperRepositoryTest(SqliteDatabaseFixture databaseFixtur [Fact] public void GivenStorageMetadataWrapperRepositoryType_WhenInitialized_TheConstructorShallGuardAllParameters() { - Assert.Throws(() => new StorageMetadataWrapperRepository(null, null, null)); - Assert.Throws(() => new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, null)); + Assert.Throws(() => new StorageMetadataWrapperRepository(null!, null!, null!)); + Assert.Throws(() => new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, null!)); _ = new StorageMetadataWrapperRepository(_serviceScopeFactory.Object, _logger.Object, _options); } @@ -120,8 +121,8 @@ public async Task GivenAnExistingDicomStorageMetadataObject_WhenUpdated_ExpectIt var unwrapped = actual.GetObject(); Assert.NotNull(unwrapped); - Assert.Equal(metadata.Workflows, unwrapped.Workflows); - Assert.Equal(metadata.File.TemporaryBucketName, unwrapped.File.TemporaryBucketName); + Assert.Equal(metadata.Workflows, unwrapped!.Workflows); + Assert.Equal(metadata.File.TemporaryBucketName, unwrapped!.File.TemporaryBucketName); } [Fact] diff --git a/src/Database/EntityFramework/Test/StorageMetadataWrapperTest.cs b/src/Database/EntityFramework/Test/StorageMetadataWrapperTest.cs index c57da9734..9a27a8ae7 100644 --- a/src/Database/EntityFramework/Test/StorageMetadataWrapperTest.cs +++ b/src/Database/EntityFramework/Test/StorageMetadataWrapperTest.cs @@ -16,7 +16,7 @@ using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Api.Storage; -using Monai.Deploy.InformaticsGateway.Database.EntityFramework.Repositories; +using Monai.Deploy.InformaticsGateway.Database.Api; namespace Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test { diff --git a/src/Database/appsettings.json b/src/Database/EntityFramework/appsettings.json similarity index 100% rename from src/Database/appsettings.json rename to src/Database/EntityFramework/appsettings.json diff --git a/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj b/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj index 2ba6321ea..b92cac60a 100644 --- a/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj +++ b/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj @@ -28,6 +28,7 @@ + @@ -37,9 +38,9 @@ - - - + + + @@ -66,5 +67,6 @@ + diff --git a/src/Database/MongoDB/Configurations/DestinationApplicationEntityConfiguration.cs b/src/Database/MongoDB/Configurations/DestinationApplicationEntityConfiguration.cs new file mode 100644 index 000000000..25ceefb39 --- /dev/null +++ b/src/Database/MongoDB/Configurations/DestinationApplicationEntityConfiguration.cs @@ -0,0 +1,34 @@ +/* + * Copyright 2021-2022 MONAI Consortium + * Copyright 2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Monai.Deploy.InformaticsGateway.Api; +using MongoDB.Bson.Serialization; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations +{ + internal static class DestinationApplicationEntityConfiguration + { + public static void Configure() + { + BsonClassMap.RegisterClassMap(j => + { + j.AutoMap(); + j.SetIgnoreExtraElements(true); + }); + } + } +} diff --git a/src/Database/MongoDB/Configurations/InferenceRequestConfiguration.cs b/src/Database/MongoDB/Configurations/InferenceRequestConfiguration.cs new file mode 100644 index 000000000..caa7721f5 --- /dev/null +++ b/src/Database/MongoDB/Configurations/InferenceRequestConfiguration.cs @@ -0,0 +1,42 @@ +/* + * Copyright 2021-2022 MONAI Consortium + * Copyright 2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Monai.Deploy.InformaticsGateway.Api.Rest; +using MongoDB.Bson; +using MongoDB.Bson.Serialization; +using MongoDB.Bson.Serialization.IdGenerators; +using MongoDB.Bson.Serialization.Serializers; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations +{ + internal static class InferenceRequestConfiguration + { + public static void Configure() + { + BsonClassMap.RegisterClassMap(j => + { + j.AutoMap(); + j.MapIdMember(c => c.InferenceRequestId) + .SetIdGenerator(GuidGenerator.Instance) + .SetSerializer(new GuidSerializer(BsonType.String)); + j.SetIgnoreExtraElements(true); + + j.UnmapProperty(p => p.Application); + }); + } + } +} diff --git a/src/Database/MongoDB/Configurations/MonaiApplicationEntityConfiguration.cs b/src/Database/MongoDB/Configurations/MonaiApplicationEntityConfiguration.cs new file mode 100644 index 000000000..4a8e2a65d --- /dev/null +++ b/src/Database/MongoDB/Configurations/MonaiApplicationEntityConfiguration.cs @@ -0,0 +1,37 @@ +/* + * Copyright 2021-2022 MONAI Consortium + * Copyright 2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Monai.Deploy.InformaticsGateway.Api; +using MongoDB.Bson; +using MongoDB.Bson.Serialization; +using MongoDB.Bson.Serialization.IdGenerators; +using MongoDB.Bson.Serialization.Serializers; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations +{ + internal static class MonaiApplicationEntityConfiguration + { + public static void Configure() + { + BsonClassMap.RegisterClassMap(j => + { + j.AutoMap(); + j.SetIgnoreExtraElements(true); + }); + } + } +} diff --git a/src/Database/MongoDB/Configurations/MongoDBEntityBaseConfiguration.cs b/src/Database/MongoDB/Configurations/MongoDBEntityBaseConfiguration.cs new file mode 100644 index 000000000..3713e7430 --- /dev/null +++ b/src/Database/MongoDB/Configurations/MongoDBEntityBaseConfiguration.cs @@ -0,0 +1,39 @@ +/* + * Copyright 2021-2022 MONAI Consortium + * Copyright 2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Monai.Deploy.InformaticsGateway.Api; +using MongoDB.Bson; +using MongoDB.Bson.Serialization; +using MongoDB.Bson.Serialization.IdGenerators; +using MongoDB.Bson.Serialization.Serializers; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations +{ + internal static class MongoDBEntityBaseConfiguration + { + public static void Configure() + { + BsonClassMap.RegisterClassMap(j => + { + j.SetIsRootClass(true); + j.MapIdMember(c => c.Id) + .SetIdGenerator(GuidGenerator.Instance) + .SetSerializer(new GuidSerializer(BsonType.String)); + }); + } + } +} diff --git a/src/Database/MongoDB/Configurations/MongoDBOptions.cs b/src/Database/MongoDB/Configurations/MongoDBOptions.cs new file mode 100644 index 000000000..f95013a7f --- /dev/null +++ b/src/Database/MongoDB/Configurations/MongoDBOptions.cs @@ -0,0 +1,26 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License", CancellationToken cancellationToken = default); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Microsoft.Extensions.Configuration; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations +{ + public class MongoDBOptions + { + [ConfigurationKeyName("DatabaseName")] + public string DaatabaseName { get; set; } = string.Empty; + } +} diff --git a/src/Database/MongoDB/Configurations/PayloadConfiguration.cs b/src/Database/MongoDB/Configurations/PayloadConfiguration.cs new file mode 100644 index 000000000..447c9fec5 --- /dev/null +++ b/src/Database/MongoDB/Configurations/PayloadConfiguration.cs @@ -0,0 +1,50 @@ +/* + * Copyright 2021-2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Monai.Deploy.InformaticsGateway.Api.Storage; +using MongoDB.Bson; +using MongoDB.Bson.Serialization; +using MongoDB.Bson.Serialization.IdGenerators; +using MongoDB.Bson.Serialization.Serializers; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations +{ + internal static class PayloadConfiguration + { + public static void Configure() + { + BsonClassMap.RegisterClassMap(j => + { + j.AutoMap(); + j.MapIdMember(c => c.PayloadId) + .SetIdGenerator(GuidGenerator.Instance) + .SetSerializer(new GuidSerializer(BsonType.String)); + j.SetIgnoreExtraElements(true); + + j.UnmapProperty(p => p.CalledAeTitle); + j.UnmapProperty(p => p.CallingAeTitle); + j.UnmapProperty(p => p.HasTimedOut); + j.UnmapProperty(p => p.Elapsed); + j.UnmapProperty(p => p.Count); + }); + + BsonClassMap.RegisterClassMap(); + BsonClassMap.RegisterClassMap(); + BsonClassMap.RegisterClassMap(); + + } + } +} diff --git a/src/Database/MongoDB/Configurations/SourceApplicationEntityConfiguration.cs b/src/Database/MongoDB/Configurations/SourceApplicationEntityConfiguration.cs new file mode 100644 index 000000000..d82b562ef --- /dev/null +++ b/src/Database/MongoDB/Configurations/SourceApplicationEntityConfiguration.cs @@ -0,0 +1,33 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Monai.Deploy.InformaticsGateway.Api; +using MongoDB.Bson.Serialization; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations +{ + internal static class SourceApplicationEntityConfiguration + { + public static void Configure() + { + BsonClassMap.RegisterClassMap(j => + { + j.AutoMap(); + j.SetIgnoreExtraElements(true); + }); + } + } +} diff --git a/src/Database/MongoDB/Configurations/StorageMetadataWrapperEntityConfiguration.cs b/src/Database/MongoDB/Configurations/StorageMetadataWrapperEntityConfiguration.cs new file mode 100644 index 000000000..23d60f7ca --- /dev/null +++ b/src/Database/MongoDB/Configurations/StorageMetadataWrapperEntityConfiguration.cs @@ -0,0 +1,34 @@ +/* + * Copyright 2021-2022 MONAI Consortium + * Copyright 2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Monai.Deploy.InformaticsGateway.Database.Api; +using MongoDB.Bson.Serialization; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations +{ + internal static class StorageMetadataWrapperEntityConfiguration + { + public static void Configure() + { + BsonClassMap.RegisterClassMap(j => + { + j.AutoMap(); + j.SetIgnoreExtraElements(true); + }); + } + } +} diff --git a/src/Database/MongoDB/Monai.Deploy.InformaticsGateway.Database.MongoDB.csproj b/src/Database/MongoDB/Monai.Deploy.InformaticsGateway.Database.MongoDB.csproj new file mode 100644 index 000000000..4bf5ebfab --- /dev/null +++ b/src/Database/MongoDB/Monai.Deploy.InformaticsGateway.Database.MongoDB.csproj @@ -0,0 +1,46 @@ + + + + + + Monai.Deploy.InformaticsGateway.Database.MongoDB + net6.0 + Apache-2.0 + enable + ..\..\.sonarlint\project-monai_monai-deploy-informatics-gatewaycsharp.ruleset + enable + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Database/MongoDB/MongoDatabaseMigrationManager.cs b/src/Database/MongoDB/MongoDatabaseMigrationManager.cs new file mode 100644 index 000000000..f373d3e80 --- /dev/null +++ b/src/Database/MongoDB/MongoDatabaseMigrationManager.cs @@ -0,0 +1,37 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Microsoft.Extensions.Hosting; +using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB +{ + public class MongoDatabaseMigrationManager : IDatabaseMigrationManager + { + public IHost Migrate(IHost host) + { + MonaiApplicationEntityConfiguration.Configure(); + MongoDBEntityBaseConfiguration.Configure(); + DestinationApplicationEntityConfiguration.Configure(); + SourceApplicationEntityConfiguration.Configure(); + InferenceRequestConfiguration.Configure(); + PayloadConfiguration.Configure(); + StorageMetadataWrapperEntityConfiguration.Configure(); + return host; + } + } +} diff --git a/src/Database/MongoDB/Repositories/DestinationApplicationEntityRepository.cs b/src/Database/MongoDB/Repositories/DestinationApplicationEntityRepository.cs new file mode 100644 index 000000000..0807986b6 --- /dev/null +++ b/src/Database/MongoDB/Repositories/DestinationApplicationEntityRepository.cs @@ -0,0 +1,171 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Linq.Expressions; +using Ardalis.GuardClauses; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations; +using MongoDB.Driver; +using Polly; +using Polly.Retry; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories +{ + public class DestinationApplicationEntityRepository : IDestinationApplicationEntityRepository, IDisposable + { + private readonly ILogger _logger; + private readonly IServiceScope _scope; + private readonly AsyncRetryPolicy _retryPolicy; + private readonly IMongoCollection _collection; + private bool _disposedValue; + + public DestinationApplicationEntityRepository( + IServiceScopeFactory serviceScopeFactory, + ILogger logger, + IOptions options, + IOptions mongoDbOptions) + { + Guard.Against.Null(serviceScopeFactory); + Guard.Against.Null(options); + Guard.Against.Null(mongoDbOptions); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + _scope = serviceScopeFactory.CreateScope(); + _retryPolicy = Policy.Handle().WaitAndRetryAsync( + options.Value.Database.Retries.RetryDelays, + (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + + var mongoDbClient = _scope.ServiceProvider.GetRequiredService(); + var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DaatabaseName); + _collection = mongoDatabase.GetCollection(nameof(DestinationApplicationEntity)); + CreateIndexes(); + } + + private void CreateIndexes() + { + var options = new CreateIndexOptions { Unique = true }; + + var indexDefinition = Builders.IndexKeys + .Ascending(_ => _.Name); + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinition, options)); + + var indexDefinitionAll = Builders.IndexKeys.Combine( + Builders.IndexKeys.Ascending(_ => _.Name), + Builders.IndexKeys.Ascending(_ => _.AeTitle), + Builders.IndexKeys.Ascending(_ => _.HostIp), + Builders.IndexKeys.Ascending(_ => _.Port)); + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinitionAll, options)); + } + + public async Task> ToListAsync(CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return await _collection.Find(Builders.Filter.Empty).ToListAsync(cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task FindByNameAsync(string name, CancellationToken cancellationToken = default) + { + Guard.Against.NullOrWhiteSpace(name); + + return await _retryPolicy.ExecuteAsync(async () => + { + return await _collection + .Find(x => x.Name == name) + .FirstOrDefaultAsync().ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task AddAsync(DestinationApplicationEntity item, CancellationToken cancellationToken = default) + { + Guard.Against.Null(item); + + return await _retryPolicy.ExecuteAsync(async () => + { + await _collection.InsertOneAsync(item, cancellationToken: cancellationToken).ConfigureAwait(false); + return item; + }).ConfigureAwait(false); + } + + public async Task UpdateAsync(DestinationApplicationEntity entity, CancellationToken cancellationToken = default) + { + Guard.Against.Null(entity); + + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _collection.ReplaceOneAsync(p => p.Id == entity.Id, entity, cancellationToken: cancellationToken).ConfigureAwait(false); + if (result.ModifiedCount == 0) + { + throw new DatabaseException("Failed to update entity"); + } + return entity; + }).ConfigureAwait(false); + } + + public async Task RemoveAsync(DestinationApplicationEntity entity, CancellationToken cancellationToken = default) + { + Guard.Against.Null(entity); + + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _collection.DeleteOneAsync(Builders.Filter.Where(p => p.Name == entity.Name), cancellationToken: cancellationToken).ConfigureAwait(false); + if (result.DeletedCount == 0) + { + throw new DatabaseException("Failed to delete entity"); + } + return entity; + }).ConfigureAwait(false); + } + + public async Task ContainsAsync(Expression> predicate, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _collection.FindAsync(predicate, cancellationToken: cancellationToken).ConfigureAwait(false); + return await result.AnyAsync(cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _scope.Dispose(); + } + + _disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} diff --git a/src/Database/MongoDB/Repositories/InferenceRequestRepository.cs b/src/Database/MongoDB/Repositories/InferenceRequestRepository.cs new file mode 100644 index 000000000..d064eb93b --- /dev/null +++ b/src/Database/MongoDB/Repositories/InferenceRequestRepository.cs @@ -0,0 +1,180 @@ +/* + * Copyright 2021-2022 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Ardalis.GuardClauses; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Api.Rest; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations; +using MongoDB.Driver; +using Polly; +using Polly.Retry; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories +{ + public class InferenceRequestRepository : InferenceRequestRepositoryBase, IDisposable + { + private readonly ILogger _logger; + private readonly IOptions _options; + private readonly IServiceScope _scope; + private readonly IMongoCollection _collection; + private readonly AsyncRetryPolicy _retryPolicy; + private bool _disposedValue; + + public ServiceStatus Status { get; set; } = ServiceStatus.Unknown; + + public InferenceRequestRepository( + IServiceScopeFactory serviceScopeFactory, + ILogger logger, + IOptions options, + IOptions mongoDbOptions) : base(logger, options) + { + Guard.Against.Null(serviceScopeFactory); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _options = options ?? throw new ArgumentNullException(nameof(options)); + _scope = serviceScopeFactory.CreateScope(); + _retryPolicy = Policy.Handle().WaitAndRetryAsync( + options.Value.Database.Retries.RetryDelays, + (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + + var mongoDbClient = _scope.ServiceProvider.GetRequiredService(); + var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DaatabaseName); + _collection = mongoDatabase.GetCollection(nameof(InferenceRequest)); + CreateIndexes(); + } + + private void CreateIndexes() + { + var options = new CreateIndexOptions { Unique = true }; + + var indexDefinitionState = Builders.IndexKeys + .Ascending(_ => _.State); + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinitionState)); + + var indexDefinitionTransactionId = Builders.IndexKeys + .Ascending(_ => _.TransactionId); + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinitionTransactionId, options)); + } + + public override async Task AddAsync(InferenceRequest inferenceRequest, CancellationToken cancellationToken = default) + { + Guard.Against.Null(inferenceRequest); + + using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "TransactionId", inferenceRequest.TransactionId } }); + await _retryPolicy.ExecuteAsync(async () => + { + await _collection.InsertOneAsync(inferenceRequest, cancellationToken: cancellationToken).ConfigureAwait(false); + _logger.InferenceRequestSaved(); + }) + .ConfigureAwait(false); + } + + public override async Task TakeAsync(CancellationToken cancellationToken = default) + { + while (!cancellationToken.IsCancellationRequested) + { + try + { + var inferenceRequest = await _collection + .FindOneAndUpdateAsync( + Builders.Filter.Where(p => p.State == InferenceRequestState.Queued), + Builders.Update.Set(p => p.State, InferenceRequestState.InProcess), + new FindOneAndUpdateOptions { ReturnDocument = ReturnDocument.After }, + cancellationToken: cancellationToken) + .ConfigureAwait(false); + + if (inferenceRequest is not null) + { + using var loggerScope = _logger.BeginScope(new LoggingDataDictionary { { "TransactionId", inferenceRequest.TransactionId } }); + _logger.InferenceRequestSetToInProgress(inferenceRequest.TransactionId); + return inferenceRequest; + } + await Task.Delay(250, cancellationToken).ConfigureAwait(false); + } + catch (Exception ex) + { + _logger.ErrorQueryingForPendingInferenceRequest(ex); + } + } + + throw new OperationCanceledException("cancellation requested."); + } + + public override async Task GetInferenceRequestAsync(string transactionId, CancellationToken cancellationToken = default) + { + Guard.Against.NullOrWhiteSpace(transactionId); + + return await _retryPolicy.ExecuteAsync(async () => + { + return await _collection.Find(Builders.Filter.Where(p => p.TransactionId == transactionId)) + .FirstOrDefaultAsync(cancellationToken) + .ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public override async Task GetInferenceRequestAsync(Guid inferenceRequestId, CancellationToken cancellationToken = default) + { + Guard.Against.NullOrEmpty(inferenceRequestId); + + return await _retryPolicy.ExecuteAsync(async () => + { + return await _collection.Find(Builders.Filter.Where(p => p.InferenceRequestId == inferenceRequestId)) + .FirstOrDefaultAsync(cancellationToken) + .ConfigureAwait(false); + }).ConfigureAwait(false); + } + + protected override async Task SaveAsync(InferenceRequest inferenceRequest, CancellationToken cancellationToken = default) + { + Guard.Against.Null(inferenceRequest); + + await _retryPolicy.ExecuteAsync(async () => + { + _logger.InferenceRequestUpdateState(); + await _collection.ReplaceOneAsync(p => p.InferenceRequestId == inferenceRequest.InferenceRequestId, inferenceRequest, cancellationToken: cancellationToken).ConfigureAwait(false); + _logger.InferenceRequestUpdated(); + }).ConfigureAwait(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _scope.Dispose(); + } + + _disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} diff --git a/src/Database/MongoDB/Repositories/MonaiApplicationEntityRepository.cs b/src/Database/MongoDB/Repositories/MonaiApplicationEntityRepository.cs new file mode 100644 index 000000000..f160457a1 --- /dev/null +++ b/src/Database/MongoDB/Repositories/MonaiApplicationEntityRepository.cs @@ -0,0 +1,164 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Linq.Expressions; +using Ardalis.GuardClauses; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations; +using MongoDB.Driver; +using Polly; +using Polly.Retry; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories +{ + public class MonaiApplicationEntityRepository : IMonaiApplicationEntityRepository, IDisposable + { + private readonly ILogger _logger; + private readonly IServiceScope _scope; + private readonly AsyncRetryPolicy _retryPolicy; + private readonly IMongoCollection _collection; + private bool _disposedValue; + + public MonaiApplicationEntityRepository( + IServiceScopeFactory serviceScopeFactory, + ILogger logger, + IOptions options, + IOptions mongoDbOptions) + { + Guard.Against.Null(serviceScopeFactory); + Guard.Against.Null(options); + Guard.Against.Null(mongoDbOptions); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + _scope = serviceScopeFactory.CreateScope(); + _retryPolicy = Policy.Handle().WaitAndRetryAsync( + options.Value.Database.Retries.RetryDelays, + (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + + var mongoDbClient = _scope.ServiceProvider.GetRequiredService(); + var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DaatabaseName); + _collection = mongoDatabase.GetCollection(nameof(MonaiApplicationEntity)); + CreateIndexes(); + } + + private void CreateIndexes() + { + var options = new CreateIndexOptions { Unique = true }; + + var indexDefinition = Builders.IndexKeys + .Ascending(_ => _.Name); + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinition, options)); + } + + public async Task> ToListAsync(CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return await _collection.Find(Builders.Filter.Empty).ToListAsync(cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task FindByNameAsync(string name, CancellationToken cancellationToken = default) + { + Guard.Against.NullOrWhiteSpace(name); + + return await _retryPolicy.ExecuteAsync(async () => + { + return await _collection + .Find(x => x.Name == name) + .FirstOrDefaultAsync().ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task AddAsync(MonaiApplicationEntity item, CancellationToken cancellationToken = default) + { + Guard.Against.Null(item); + + return await _retryPolicy.ExecuteAsync(async () => + { + await _collection.InsertOneAsync(item, cancellationToken: cancellationToken).ConfigureAwait(false); + return item; + }).ConfigureAwait(false); + } + + public async Task UpdateAsync(MonaiApplicationEntity entity, CancellationToken cancellationToken = default) + { + Guard.Against.Null(entity); + + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _collection.ReplaceOneAsync(p => p.Id == entity.Id, entity, cancellationToken: cancellationToken).ConfigureAwait(false); + if (result.ModifiedCount == 0) + { + throw new DatabaseException("Failed to update entity"); + } + return entity; + }).ConfigureAwait(false); + } + + public async Task RemoveAsync(MonaiApplicationEntity entity, CancellationToken cancellationToken = default) + { + Guard.Against.Null(entity); + + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _collection.DeleteOneAsync(Builders.Filter.Where(p => p.Name == entity.Name), cancellationToken: cancellationToken).ConfigureAwait(false); + if (result.DeletedCount == 0) + { + throw new DatabaseException("Failed to delete entity"); + } + return entity; + }).ConfigureAwait(false); + } + + public async Task ContainsAsync(Expression> predicate, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _collection.FindAsync(predicate, cancellationToken: cancellationToken).ConfigureAwait(false); + return await result.AnyAsync(cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _scope.Dispose(); + } + + _disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} diff --git a/src/Database/MongoDB/Repositories/PayloadRepository.cs b/src/Database/MongoDB/Repositories/PayloadRepository.cs new file mode 100644 index 000000000..6f84784f2 --- /dev/null +++ b/src/Database/MongoDB/Repositories/PayloadRepository.cs @@ -0,0 +1,176 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Linq.Expressions; +using Ardalis.GuardClauses; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Storage; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations; +using MongoDB.Driver; +using Polly; +using Polly.Retry; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories +{ + public class PayloadRepository : IPayloadRepository, IDisposable + { + private readonly ILogger _logger; + private readonly IServiceScope _scope; + private readonly AsyncRetryPolicy _retryPolicy; + private readonly IMongoCollection _collection; + private bool _disposedValue; + + public PayloadRepository( + IServiceScopeFactory serviceScopeFactory, + ILogger logger, + IOptions options, + IOptions mongoDbOptions) + { + Guard.Against.Null(serviceScopeFactory); + Guard.Against.Null(options); + Guard.Against.Null(mongoDbOptions); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + _scope = serviceScopeFactory.CreateScope(); + _retryPolicy = Policy.Handle().WaitAndRetryAsync( + options.Value.Database.Retries.RetryDelays, + (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + + var mongoDbClient = _scope.ServiceProvider.GetRequiredService(); + var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DaatabaseName); + _collection = mongoDatabase.GetCollection(nameof(Payload)); + CreateIndexes(); + } + + private void CreateIndexes() + { + var options = new CreateIndexOptions { Unique = true }; + + var indexDefinitionState = Builders.IndexKeys + .Ascending(_ => _.State); + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinitionState)); + + var indexDefinition = Builders.IndexKeys.Combine( + Builders.IndexKeys.Ascending(_ => _.CorrelationId), + Builders.IndexKeys.Ascending(_ => _.PayloadId)); + + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinition, options)); + } + + public async Task AddAsync(Payload item, CancellationToken cancellationToken = default) + { + Guard.Against.Null(item); + + return await _retryPolicy.ExecuteAsync(async () => + { + await _collection.InsertOneAsync(item, cancellationToken: cancellationToken).ConfigureAwait(false); + return item; + }).ConfigureAwait(false); + } + + public async Task ContainsAsync(Expression> predicate, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _collection.FindAsync(predicate, cancellationToken: cancellationToken).ConfigureAwait(false); + return await result.AnyAsync(cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task RemoveAsync(Payload entity, CancellationToken cancellationToken = default) + { + Guard.Against.Null(entity); + + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _collection.DeleteOneAsync(Builders.Filter.Where(p => p.PayloadId == entity.PayloadId), cancellationToken: cancellationToken).ConfigureAwait(false); + if (result.DeletedCount == 0) + { + throw new DatabaseException("Failed to delete entity"); + } + return entity; + }).ConfigureAwait(false); + } + + public async Task> ToListAsync(CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return await _collection.Find(Builders.Filter.Empty).ToListAsync(cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task UpdateAsync(Payload entity, CancellationToken cancellationToken = default) + { + Guard.Against.Null(entity); + + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _collection.ReplaceOneAsync(p => p.PayloadId == entity.PayloadId, entity, cancellationToken: cancellationToken).ConfigureAwait(false); + if (result.ModifiedCount == 0) + { + throw new DatabaseException("Failed to update entity"); + } + return entity; + }).ConfigureAwait(false); + } + + public async Task RemovePendingPayloadsAsync(CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var results = await _collection.DeleteManyAsync(Builders.Filter.Where(p => p.State == Payload.PayloadState.Created), cancellationToken).ConfigureAwait(false); + return Convert.ToInt32(results.DeletedCount); + }).ConfigureAwait(false); + } + + public async Task> GetPayloadsInStateAsync(CancellationToken cancellationToken = default, params Payload.PayloadState[] states) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return await _collection.Find(Builders.Filter.Where(p => states.Contains(p.State))).ToListAsync(cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _scope.Dispose(); + } + + _disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} diff --git a/src/Database/MongoDB/Repositories/SourceApplicationEntityRepository.cs b/src/Database/MongoDB/Repositories/SourceApplicationEntityRepository.cs new file mode 100644 index 000000000..4d179a554 --- /dev/null +++ b/src/Database/MongoDB/Repositories/SourceApplicationEntityRepository.cs @@ -0,0 +1,170 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Linq.Expressions; +using Ardalis.GuardClauses; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations; +using MongoDB.Driver; +using Polly; +using Polly.Retry; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories +{ + public class SourceApplicationEntityRepository : ISourceApplicationEntityRepository, IDisposable + { + private readonly ILogger _logger; + private readonly IServiceScope _scope; + private readonly AsyncRetryPolicy _retryPolicy; + private readonly IMongoCollection _collection; + private bool _disposedValue; + + public SourceApplicationEntityRepository( + IServiceScopeFactory serviceScopeFactory, + ILogger logger, + IOptions options, + IOptions mongoDbOptions) + { + Guard.Against.Null(serviceScopeFactory); + Guard.Against.Null(options); + Guard.Against.Null(mongoDbOptions); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + _scope = serviceScopeFactory.CreateScope(); + _retryPolicy = Policy.Handle().WaitAndRetryAsync( + options.Value.Database.Retries.RetryDelays, + (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + + var mongoDbClient = _scope.ServiceProvider.GetRequiredService(); + var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DaatabaseName); + _collection = mongoDatabase.GetCollection(nameof(SourceApplicationEntity)); + CreateIndexes(); + } + + private void CreateIndexes() + { + var options = new CreateIndexOptions { Unique = true }; + + var indexDefinition = Builders.IndexKeys + .Ascending(_ => _.Name); + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinition, options)); + + var indexDefinitionAll = Builders.IndexKeys.Combine( + Builders.IndexKeys.Ascending(_ => _.Name), + Builders.IndexKeys.Ascending(_ => _.AeTitle), + Builders.IndexKeys.Ascending(_ => _.HostIp)); + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinitionAll, options)); + } + + public async Task> ToListAsync(CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return await _collection.Find(Builders.Filter.Empty).ToListAsync(cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task FindByNameAsync(string name, CancellationToken cancellationToken = default) + { + Guard.Against.NullOrWhiteSpace(name); + + return await _retryPolicy.ExecuteAsync(async () => + { + return await _collection + .Find(x => x.Name == name) + .FirstOrDefaultAsync().ConfigureAwait(false); + }).ConfigureAwait(false); + } + + public async Task AddAsync(SourceApplicationEntity item, CancellationToken cancellationToken = default) + { + Guard.Against.Null(item); + + return await _retryPolicy.ExecuteAsync(async () => + { + await _collection.InsertOneAsync(item, cancellationToken: cancellationToken).ConfigureAwait(false); + return item; + }).ConfigureAwait(false); + } + + public async Task UpdateAsync(SourceApplicationEntity entity, CancellationToken cancellationToken = default) + { + Guard.Against.Null(entity); + + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _collection.ReplaceOneAsync(p => p.Id == entity.Id, entity, cancellationToken: cancellationToken).ConfigureAwait(false); + if (result.ModifiedCount == 0) + { + throw new DatabaseException("Failed to update entity"); + } + return entity; + }).ConfigureAwait(false); + } + + public async Task RemoveAsync(SourceApplicationEntity entity, CancellationToken cancellationToken = default) + { + Guard.Against.Null(entity); + + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _collection.DeleteOneAsync(Builders.Filter.Where(p => p.Name == entity.Name), cancellationToken: cancellationToken).ConfigureAwait(false); + if (result.DeletedCount == 0) + { + throw new DatabaseException("Failed to delete entity"); + } + return entity; + }).ConfigureAwait(false); + } + + public async Task ContainsAsync(Expression> predicate, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _collection.FindAsync(predicate, cancellationToken: cancellationToken).ConfigureAwait(false); + return await result.AnyAsync(cancellationToken).ConfigureAwait(false); + }).ConfigureAwait(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _scope.Dispose(); + } + + _disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} diff --git a/src/Database/MongoDB/Repositories/StorageMetadataWrapperRepository.cs b/src/Database/MongoDB/Repositories/StorageMetadataWrapperRepository.cs new file mode 100644 index 000000000..25d51a47f --- /dev/null +++ b/src/Database/MongoDB/Repositories/StorageMetadataWrapperRepository.cs @@ -0,0 +1,177 @@ +/* + * Copyright 2021-2022 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Data; +using Ardalis.GuardClauses; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.InformaticsGateway.Api.Storage; +using Monai.Deploy.InformaticsGateway.Configuration; +using Monai.Deploy.InformaticsGateway.Database.Api; +using Monai.Deploy.InformaticsGateway.Database.Api.Logging; +using Monai.Deploy.InformaticsGateway.Database.Api.Repositories; +using Monai.Deploy.InformaticsGateway.Database.MongoDB.Configurations; +using MongoDB.Driver; +using Polly; +using Polly.Retry; + +namespace Monai.Deploy.InformaticsGateway.Database.MongoDB.Repositories +{ + public class StorageMetadataWrapperRepository : StorageMetadataRepositoryBase, IDisposable + { + private readonly ILogger _logger; + private readonly IServiceScope _scope; + private readonly IMongoCollection _collection; + private readonly AsyncRetryPolicy _retryPolicy; + private bool _disposedValue; + + public StorageMetadataWrapperRepository( + IServiceScopeFactory serviceScopeFactory, + ILogger logger, + IOptions options, + IOptions mongoDbOptions) : base(logger) + { + Guard.Against.Null(serviceScopeFactory); + Guard.Against.Null(options); + Guard.Against.Null(mongoDbOptions); + + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + _scope = serviceScopeFactory.CreateScope(); + _retryPolicy = Policy.Handle(p => p is not ArgumentException).WaitAndRetryAsync( + options.Value.Database.Retries.RetryDelays, + (exception, timespan, count, context) => _logger.DatabaseErrorRetry(timespan, count, exception)); + + var mongoDbClient = _scope.ServiceProvider.GetRequiredService(); + var mongoDatabase = mongoDbClient.GetDatabase(mongoDbOptions.Value.DaatabaseName); + _collection = mongoDatabase.GetCollection(nameof(StorageMetadataWrapper)); + CreateIndexes(); + } + + private void CreateIndexes() + { + var indexDefinition = Builders.IndexKeys.Combine( + Builders.IndexKeys.Ascending(_ => _.CorrelationId), + Builders.IndexKeys.Ascending(_ => _.Identity)); + + _collection.Indexes.CreateOne(new CreateIndexModel(indexDefinition)); + } + + protected override async Task DeleteInternalAsync(StorageMetadataWrapper toBeDeleted, CancellationToken cancellationToken) + { + Guard.Against.Null(toBeDeleted); + + return await _retryPolicy.ExecuteAsync(async () => + { + var results = await _collection.DeleteOneAsync(Builders.Filter.Where(p => p.Identity == toBeDeleted.Identity), cancellationToken: cancellationToken).ConfigureAwait(false); + return results.DeletedCount == 1; + }).ConfigureAwait(false); + } + + public override async Task DeletePendingUploadsAsync(CancellationToken cancellationToken = default) + { + await _retryPolicy.ExecuteAsync(async () => + { + await _collection.DeleteManyAsync(Builders.Filter.Where(p => !p.IsUploaded), cancellationToken); + }).ConfigureAwait(false); + } + + public override async Task> GetFileStorageMetdadataAsync(string correlationId, CancellationToken cancellationToken = default) + { + Guard.Against.NullOrWhiteSpace(correlationId); + + return await _retryPolicy.ExecuteAsync(async () => + { + var results = await _collection.Find(Builders.Filter.Where(p => p.CorrelationId == correlationId)) + .ToListAsync(cancellationToken) + .ConfigureAwait(false); + return results.Select(p => p.GetObject()).ToList(); + }).ConfigureAwait(false); + } + + public override async Task GetFileStorageMetdadataAsync(string correlationId, string identity, CancellationToken cancellationToken = default) + { + Guard.Against.NullOrWhiteSpace(correlationId); + + return await _retryPolicy.ExecuteAsync(async () => + { + var result = await _collection.Find(Builders.Filter.Where(p => p.CorrelationId == correlationId && p.Identity == identity)) + .FirstOrDefaultAsync(cancellationToken) + .ConfigureAwait(false); + return result?.GetObject(); + }).ConfigureAwait(false); + } + + protected override async Task UpdateInternal(StorageMetadataWrapper metadata, CancellationToken cancellationToken = default) + { + Guard.Against.Null(metadata); + + await _retryPolicy.ExecuteAsync(async () => + { + await _collection.ReplaceOneAsync( + Builders.Filter.Where(p => p.Identity == metadata.Identity), + metadata, + cancellationToken: cancellationToken) + .ConfigureAwait(false); + }) + .ConfigureAwait(false); + } + + protected override async Task FindByIds(string id, string correlationId, CancellationToken cancellationToken = default) + { + return await _retryPolicy.ExecuteAsync(async () => + { + return await _collection.Find(Builders.Filter.Where(p => p.CorrelationId == correlationId && p.Identity == id)) + .FirstOrDefaultAsync(cancellationToken) + .ConfigureAwait(false); + }).ConfigureAwait(false); + } + + protected override async Task AddAsyncInternal(StorageMetadataWrapper metadata, CancellationToken cancellationToken = default) + { + Guard.Against.Null(metadata); + + await _retryPolicy.ExecuteAsync(async () => + { + await _collection.InsertOneAsync(metadata, cancellationToken: cancellationToken).ConfigureAwait(false); + }) + .ConfigureAwait(false); + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _scope.Dispose(); + } + + _disposedValue = true; + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} diff --git a/src/InformaticsGateway/Common/FileMoveException.cs b/src/InformaticsGateway/Common/FileMoveException.cs new file mode 100644 index 000000000..cb8664c35 --- /dev/null +++ b/src/InformaticsGateway/Common/FileMoveException.cs @@ -0,0 +1,46 @@ +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Runtime.Serialization; + +namespace Monai.Deploy.InformaticsGateway.Common +{ + [Serializable] + internal class FileMoveException : Exception + { + public FileMoveException() + { + } + + public FileMoveException(string message) : base(message) + { + } + + public FileMoveException(string message, Exception innerException) : base(message, innerException) + { + } + + public FileMoveException(string source, string destination, Exception ex) + : this($"Exception moving file from {source} to {destination}.", ex) + { + } + + protected FileMoveException(SerializationInfo info, StreamingContext context) : base(info, context) + { + } + } +} diff --git a/src/InformaticsGateway/Common/FileUploadException.cs b/src/InformaticsGateway/Common/FileUploadException.cs new file mode 100644 index 000000000..071ae5171 --- /dev/null +++ b/src/InformaticsGateway/Common/FileUploadException.cs @@ -0,0 +1,42 @@ +/* + * Copyright 2021-2022 MONAI Consortium + * Copyright 2019-2021 NVIDIA Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Runtime.Serialization; + +namespace Monai.Deploy.InformaticsGateway.Common +{ + [Serializable] + public class FileUploadException : Exception + { + public FileUploadException() + { + } + + public FileUploadException(string message) : base(message) + { + } + + public FileUploadException(string message, Exception innerException) : base(message, innerException) + { + } + + protected FileUploadException(SerializationInfo info, StreamingContext context) : base(info, context) + { + } + } +} diff --git a/src/InformaticsGateway/Logging/Log.4000.ObjectUploadService.cs b/src/InformaticsGateway/Logging/Log.4000.ObjectUploadService.cs index 4e04f8743..316e941bd 100644 --- a/src/InformaticsGateway/Logging/Log.4000.ObjectUploadService.cs +++ b/src/InformaticsGateway/Logging/Log.4000.ObjectUploadService.cs @@ -27,7 +27,7 @@ public static partial class Log [LoggerMessage(EventId = 4001, Level = LogLevel.Debug, Message = "Upload statistics: {threads} threads, {seconds} seconds.")] public static partial void UploadStats(this ILogger logger, int threads, double seconds); - [LoggerMessage(EventId = 4002, Level = LogLevel.Information, Message = "Uploading file to temporary store at {filePath}.")] + [LoggerMessage(EventId = 4002, Level = LogLevel.Debug, Message = "Uploading file to temporary store at {filePath}.")] public static partial void UploadingFileToTemporaryStore(this ILogger logger, string filePath); [LoggerMessage(EventId = 4003, Level = LogLevel.Information, Message = "Instance queued for upload {identifier}. Items in queue {count} using memory {memoryUsageKb}KB.")] @@ -47,5 +47,11 @@ public static partial class Log [LoggerMessage(EventId = 4008, Level = LogLevel.Error, Message = "Unknown error occurred while uploading.")] public static partial void ErrorUploading(this ILogger logger, Exception ex); + + [LoggerMessage(EventId = 4009, Level = LogLevel.Error, Message = "Failed to verify file existence {path}.")] + public static partial void FailedToVerifyFileExistence(this ILogger logger, string path, Exception ex); + + [LoggerMessage(EventId = 4010, Level = LogLevel.Debug, Message = "File {path} exists={exists}.")] + public static partial void VerifyFileExists(this ILogger logger, string path, bool exists); } } diff --git a/src/InformaticsGateway/Logging/Log.700.PayloadService.cs b/src/InformaticsGateway/Logging/Log.700.PayloadService.cs index 5cb9aaa3f..b37c56fa7 100644 --- a/src/InformaticsGateway/Logging/Log.700.PayloadService.cs +++ b/src/InformaticsGateway/Logging/Log.700.PayloadService.cs @@ -83,8 +83,8 @@ public static partial class Log [LoggerMessage(EventId = 722, Level = LogLevel.Debug, Message = "Copy files statistics: {threads} threads, {seconds} seconds.")] public static partial void CopyStats(this ILogger logger, int threads, double seconds); - [LoggerMessage(EventId = 724, Level = LogLevel.Debug, Message = "Moving temporary file {identifier} to payload {payloadId} directory on storage service.")] - public static partial void MovingFileToPayloadDirectory(this ILogger logger, Guid payloadId, string identifier); + [LoggerMessage(EventId = 724, Level = LogLevel.Debug, Message = "Moving temporary file to payload {payloadId} directory {destination} on storage service.")] + public static partial void MovingFileToPayloadDirectory(this ILogger logger, Guid payloadId, string destination); [LoggerMessage(EventId = 727, Level = LogLevel.Debug, Message = "Deleting temporary file {identifier} from temporary bucket {bucket} at {remotePath}.")] public static partial void DeletingFileFromTemporaryBbucket(this ILogger logger, string bucket, string identifier, string remotePath); @@ -106,5 +106,23 @@ public static partial class Log [LoggerMessage(EventId = 733, Level = LogLevel.Debug, Message = "Storage metadata object {identifier} deleted.")] public static partial void StorageMetadataObjectDeleted(this ILogger logger, string identifier); + + [LoggerMessage(EventId = 734, Level = LogLevel.Error, Message = "File {destinationPath} in payload {payloadId} moved but cannot be found on the storage service.")] + public static partial void FileMovedVerificationFailure(this ILogger logger, Guid payloadId, string destinationPath); + + [LoggerMessage(EventId = 735, Level = LogLevel.Trace, Message = "File already moved to {destinationPath} in payload {payloadId}.")] + public static partial void AlreadyMoved(this ILogger logger, Guid payloadId, string destinationPath); + + [LoggerMessage(EventId = 736, Level = LogLevel.Debug, Message = "Failed to delete temporary file {identifier} from temporary bucket {bucket} at {remotePath}.")] + public static partial void ErrorDeletingFileAfterMoveComplete(this ILogger logger, string bucket, string identifier, string remotePath); + + [LoggerMessage(EventId = 737, Level = LogLevel.Trace, Message = "File found on storage service {bucket}: {filePath}.")] + public static partial void FileFounddOnStorageService(this ILogger logger, string bucket, string filePath); + + [LoggerMessage(EventId = 738, Level = LogLevel.Error, Message = "Error listing files on storage service.")] + public static partial void ErrorListingFilesOnStorageService(this ILogger logger, Exception ex); + + [LoggerMessage(EventId = 739, Level = LogLevel.Trace, Message = "Total number of files found on storage service {bucket}: {count}.")] + public static partial void FilesFounddOnStorageService(this ILogger logger, string bucket, int count); } } diff --git a/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs b/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs index af25238cc..419060787 100644 --- a/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs +++ b/src/InformaticsGateway/Logging/Log.800.Hl7Service.cs @@ -65,5 +65,8 @@ public static partial class Log [LoggerMessage(EventId = 814, Level = LogLevel.Warning, Message = "HL7 service paused due to insufficient storage space. Available storage space: {availableFreeSpace:D}.")] public static partial void Hl7DisconnectedDueToLowStorageSpace(this ILogger logger, long availableFreeSpace); + + [LoggerMessage(EventId = 815, Level = LogLevel.Information, Message = "HL7 client {clientId} disconnected.")] + public static partial void Hl7ClientRemoved(this ILogger logger, Guid clientId); } } diff --git a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj index fc47c883b..40cbf3cdd 100644 --- a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj +++ b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj @@ -1,4 +1,4 @@ - - + + diff --git a/tests/Integration.Test/run.sh b/tests/Integration.Test/run.sh index 0e05b5f93..f904eed01 100755 --- a/tests/Integration.Test/run.sh +++ b/tests/Integration.Test/run.sh @@ -105,7 +105,7 @@ function start_services() { info "Starting dependencies docker compose up -d --force-recreate..." pushd $DOCKER_COMPOSE_DIR ./init.sh - docker compose -p igtest up -d --force-recreate + docker compose -p igtest up -d --force-recreate --wait popd info "=============================================" From a6f42b5b4f7f1697fcded9d3d16f1877e7a2022a Mon Sep 17 00:00:00 2001 From: Victor Chang Date: Wed, 16 Nov 2022 17:00:00 +0000 Subject: [PATCH 03/14] Fix to run on GHA Signed-off-by: Victor Chang --- tests/Integration.Test/Drivers/MongoDBDataProvider.cs | 2 ++ tests/Integration.Test/run.sh | 8 -------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/tests/Integration.Test/Drivers/MongoDBDataProvider.cs b/tests/Integration.Test/Drivers/MongoDBDataProvider.cs index 4cdd2ccd9..d1df1bb34 100644 --- a/tests/Integration.Test/Drivers/MongoDBDataProvider.cs +++ b/tests/Integration.Test/Drivers/MongoDBDataProvider.cs @@ -53,6 +53,8 @@ public MongoDBDataProvider(ISpecFlowOutputHelper outputHelper, Configurations co _outputHelper = outputHelper ?? throw new ArgumentNullException(nameof(outputHelper)); _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); _databaseName = databaseName; + + _outputHelper.WriteLine($"Connecting to MongoDB at {connectionString}"); _client = new MongoClient(connectionString); _database = _client.GetDatabase(databaseName); _infereRequestCollection = _database.GetCollection(nameof(InferenceRequest)); diff --git a/tests/Integration.Test/run.sh b/tests/Integration.Test/run.sh index f904eed01..c177e5dea 100755 --- a/tests/Integration.Test/run.sh +++ b/tests/Integration.Test/run.sh @@ -19,7 +19,6 @@ export VSTEST_HOST_DEBUG=0 export SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" DOCKER_COMPOSE_DIR="$SCRIPT_DIR/../../docker-compose" -RUN_DIR="$DOCKER_COMPOSE_DIR/.run" TEST_DIR="$SCRIPT_DIR/" LOG_DIR="${GITHUB_WORKSPACE:-$SCRIPT_DIR}" BIN_DIR="$TEST_DIR/bin/Release/net6.0" @@ -48,9 +47,6 @@ function check_status_code() { function env_setup() { [ -f $LOG_DIR/run.log ] && info "Deletig existing $LOG_DIR/run.log" && sudo rm $LOG_DIR/run.log - [ -d $RUN_DIR ] && info "Removing $RUN_DIR..." && sudo rm -r $RUN_DIR - mkdir -p $RUN_DIR - [ -d $BIN_DIR ] && info "Removing $BIN_DIR..." && sudo rm -r $BIN_DIR SHORT=f:,d @@ -111,9 +107,6 @@ function start_services() { info "=============================================" docker container ls --format 'table {{.Names}}\t{{.ID}}' | grep igtest- info "=============================================" - - sleep 1 - sudo chown -R $USER:$USER $RUN_DIR } function run_test() { @@ -143,7 +136,6 @@ function generate_reports() { } function save_logs() { - [ -d $RUN_DIR ] && info "Clearning $RUN_DIR..." && sudo rm -r $RUN_DIR pushd $DOCKER_COMPOSE_DIR info "Saving service log..." docker compose -p igtest logs --no-color -t > "$LOG_DIR/services.log" From 29c87cb3fe7199c42a483ab98f7902b5f7f2284b Mon Sep 17 00:00:00 2001 From: Victor Chang Date: Wed, 16 Nov 2022 17:13:01 +0000 Subject: [PATCH 04/14] Enable packages.lock.json Signed-off-by: Victor Chang --- ...Monai.Deploy.InformaticsGateway.Api.csproj | 1 + ....Deploy.InformaticsGateway.Api.Test.csproj | 1 + src/Api/Test/packages.lock.json | 1288 +++++++++++ src/Api/packages.lock.json | 290 +++ ...Monai.Deploy.InformaticsGateway.CLI.csproj | 1 + ....Deploy.InformaticsGateway.CLI.Test.csproj | 1 + src/CLI/Test/packages.lock.json | 1607 +++++++++++++ src/CLI/packages.lock.json | 1458 ++++++++++++ ...oy.InformaticsGateway.Client.Common.csproj | 1 + ...formaticsGateway.Client.Common.Test.csproj | 1 + src/Client.Common/Test/packages.lock.json | 1095 +++++++++ src/Client.Common/packages.lock.json | 50 + ...ai.Deploy.InformaticsGateway.Client.csproj | 1 + ...ploy.InformaticsGateway.Client.Test.csproj | 1 + src/Client/Test/packages.lock.json | 1738 ++++++++++++++ src/Client/packages.lock.json | 1210 ++++++++++ ...ai.Deploy.InformaticsGateway.Common.csproj | 1 + ...ploy.InformaticsGateway.Common.Test.csproj | 1 + src/Common/Test/packages.lock.json | 1173 ++++++++++ src/Common/packages.lock.json | 146 ++ ...oy.InformaticsGateway.Configuration.csproj | 1 + ...formaticsGateway.Configuration.Test.csproj | 1 + src/Configuration/Test/packages.lock.json | 1313 +++++++++++ src/Configuration/packages.lock.json | 301 +++ ...loy.InformaticsGateway.Database.Api.csproj | 1 + ...nformaticsGateway.Database.Api.Test.csproj | 2 +- src/Database/Api/Test/packages.lock.json | 1343 +++++++++++ src/Database/Api/packages.lock.json | 356 +++ ...icsGateway.Database.EntityFramework.csproj | 1 + ...teway.Database.EntityFramework.Test.csproj | 2 +- .../EntityFramework/Test/packages.lock.json | 1517 +++++++++++++ .../EntityFramework/packages.lock.json | 513 +++++ ....Deploy.InformaticsGateway.Database.csproj | 3 +- ...InformaticsGateway.Database.MongoDB.csproj | 1 + src/Database/MongoDB/packages.lock.json | 450 ++++ src/Database/packages.lock.json | 630 +++++ ...ormaticsGateway.DicomWeb.Client.CLI.csproj | 18 +- src/DicomWebClient/CLI/packages.lock.json | 1495 ++++++++++++ ....InformaticsGateway.DicomWeb.Client.csproj | 1 + ...rmaticsGateway.DicomWeb.Client.Test.csproj | 1 + src/DicomWebClient/Test/packages.lock.json | 1229 ++++++++++ src/DicomWebClient/packages.lock.json | 1263 +++++++++++ .../Monai.Deploy.InformaticsGateway.csproj | 3 +- ...onai.Deploy.InformaticsGateway.Test.csproj | 1 + .../Test/packages.lock.json | 2018 +++++++++++++++++ src/InformaticsGateway/packages.lock.json | 1596 +++++++++++++ ...InformaticsGateway.Integration.Test.csproj | 1 + tests/Integration.Test/packages.lock.json | 1861 +++++++++++++++ 48 files changed, 25974 insertions(+), 13 deletions(-) create mode 100644 src/Api/Test/packages.lock.json create mode 100644 src/Api/packages.lock.json create mode 100644 src/CLI/Test/packages.lock.json create mode 100644 src/CLI/packages.lock.json create mode 100644 src/Client.Common/Test/packages.lock.json create mode 100644 src/Client.Common/packages.lock.json create mode 100644 src/Client/Test/packages.lock.json create mode 100644 src/Client/packages.lock.json create mode 100644 src/Common/Test/packages.lock.json create mode 100644 src/Common/packages.lock.json create mode 100644 src/Configuration/Test/packages.lock.json create mode 100644 src/Configuration/packages.lock.json create mode 100644 src/Database/Api/Test/packages.lock.json create mode 100644 src/Database/Api/packages.lock.json create mode 100644 src/Database/EntityFramework/Test/packages.lock.json create mode 100644 src/Database/EntityFramework/packages.lock.json create mode 100644 src/Database/MongoDB/packages.lock.json create mode 100644 src/Database/packages.lock.json create mode 100644 src/DicomWebClient/CLI/packages.lock.json create mode 100644 src/DicomWebClient/Test/packages.lock.json create mode 100644 src/DicomWebClient/packages.lock.json create mode 100644 src/InformaticsGateway/Test/packages.lock.json create mode 100644 src/InformaticsGateway/packages.lock.json create mode 100644 tests/Integration.Test/packages.lock.json diff --git a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj index cb68750ae..bb5e4a648 100644 --- a/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj +++ b/src/Api/Monai.Deploy.InformaticsGateway.Api.csproj @@ -22,6 +22,7 @@ Apache-2.0 true ..\.sonarlint\project-monai_monai-deploy-informatics-gatewaycsharp.ruleset + true diff --git a/src/Api/Test/Monai.Deploy.InformaticsGateway.Api.Test.csproj b/src/Api/Test/Monai.Deploy.InformaticsGateway.Api.Test.csproj index e9a2fc0f8..4a04855a4 100644 --- a/src/Api/Test/Monai.Deploy.InformaticsGateway.Api.Test.csproj +++ b/src/Api/Test/Monai.Deploy.InformaticsGateway.Api.Test.csproj @@ -21,6 +21,7 @@ Monai.Deploy.InformaticsGateway.Api.Test Apache-2.0 false + true diff --git a/src/Api/Test/packages.lock.json b/src/Api/Test/packages.lock.json new file mode 100644 index 000000000..1306b8d60 --- /dev/null +++ b/src/Api/Test/packages.lock.json @@ -0,0 +1,1288 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "coverlet.collector": { + "type": "Direct", + "requested": "[3.2.0, )", + "resolved": "3.2.0", + "contentHash": "xjY8xBigSeWIYs4I7DgUHqSNoGqnHi7Fv7/7RZD02rvZyG3hlsjnQKiVKVWKgr9kRKgmV+dEfu8KScvysiC0Wg==" + }, + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "[17.4.0, )", + "resolved": "17.4.0", + "contentHash": "VtNZQ83ntG2aEUjy1gq6B4HNdn96se6FmdY/03At8WiqDReGrApm6OB2fNiSHz9D6IIEtWtNZ2FSH0RJDVXl/w==", + "dependencies": { + "Microsoft.CodeCoverage": "17.4.0", + "Microsoft.TestPlatform.TestHost": "17.4.0" + } + }, + "System.IO.Abstractions.TestingHelpers": { + "type": "Direct", + "requested": "[17.2.3, )", + "resolved": "17.2.3", + "contentHash": "tkXvQbsfOIfeoGso+WptCuouFLiWt3EU8s0D8poqIVz1BJOOszkPuFbFgP2HUTJ9bp5n1HH89eFHILo6Oz5XUw==", + "dependencies": { + "System.IO.Abstractions": "17.2.3" + } + }, + "xRetry": { + "type": "Direct", + "requested": "[1.8.0, )", + "resolved": "1.8.0", + "contentHash": "H8KXWHBjQASwD4y/7L2j7j4KLmg8z4+mCV4atrhZvJVnCkVSKLkWe1lfKGmaCYkKt2dJnC4yH+tJXGqthSkGGg==", + "dependencies": { + "xunit.core": "[2.4.0, 3.0.0)" + } + }, + "xunit": { + "type": "Direct", + "requested": "[2.4.2, )", + "resolved": "2.4.2", + "contentHash": "6Mj73Ont3zj2CJuoykVJfE0ZmRwn7C+pTuRP8c4bnaaTFjwNG6tGe0prJ1yIbMe9AHrpDys63ctWacSsFJWK/w==", + "dependencies": { + "xunit.analyzers": "1.0.0", + "xunit.assert": "2.4.2", + "xunit.core": "[2.4.2]" + } + }, + "xunit.runner.visualstudio": { + "type": "Direct", + "requested": "[2.4.5, )", + "resolved": "2.4.5", + "contentHash": "OwHamvBdUKgqsXfBzWiCW/O98BTx81UKzx2bieIOQI7CZFE5NEQZGi8PBQGIKawDW96xeRffiNf20SjfC0x9hw==" + }, + "Ardalis.GuardClauses": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "RemnImQf/BWR8oYqFpdw+hn+b4Q1w+pGujkRiSfjQhMPuiERwGn4UMmQv+6UDE4qbPlnIN+e3e40JkvBhzgfzg==", + "dependencies": { + "JetBrains.Annotations": "2021.3.0" + } + }, + "AWSSDK.Core": { + "type": "Transitive", + "resolved": "3.7.100.6", + "contentHash": "TABd2IP9MUPtoLJ3EouOsZ1RfNqFPz0w7pblWcaXMw8BgaLSH4xWD7uX+0oIhRVs0GalIl3RHZEjOibEGezDUA==" + }, + "AWSSDK.SecurityToken": { + "type": "Transitive", + "resolved": "3.7.100.6", + "contentHash": "8aTiY7DxAkq6kqdipWBJ7O7XDMABPMevJSFYtOxhjjllW8hkwOY3f5R1ff2ZFSRA5H96xsBLLj/66gc+hmVweQ==", + "dependencies": { + "AWSSDK.Core": "[3.7.100.6, 4.0.0)" + } + }, + "fo-dicom": { + "type": "Transitive", + "resolved": "5.0.3", + "contentHash": "OPkCQ9+X/fvGRokAAgjR8bOpai04qlnNHmq+LsgI+Kyug3yar2zk6IMOSSvPOLgWe0EG9ScdqH44AGKnviH5Rw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "Microsoft.Extensions.DependencyInjection": "2.2.0", + "Microsoft.Extensions.Options": "2.2.0", + "Microsoft.Toolkit.HighPerformance": "7.1.2", + "System.Buffers": "4.5.1", + "System.Text.Encoding.CodePages": "4.6.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2", + "System.Threading.Channels": "6.0.0" + } + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "2021.3.0", + "contentHash": "Ddxjs5RRjf+c8m9m++WvhW1lz1bqNhsTjWvCLbQN9bvKbkJeR9MhtfNwKgBRRdG2yLHcXFr5Lf7fsvvkiPaDRg==" + }, + "Macross.Json.Extensions": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "AkNshs6dopj8FXsmkkJxvLivN2SyDJQDbjcds5lo9+Y6L4zpcoXdmzXQ3VVN+AIWQr0CTD5A7vkuHGAr2aypZg==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "yuvf07qFWFqtK3P/MRkEKLhn5r2UbSpVueRziSqj0yJQIKFwG1pq9mOayK3zE5qZCTs0CbrwL9M6R8VwqyGy2w==" + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.4.0", + "contentHash": "2oZbSVTC2nAvQ2DnbXLlXS+c25ZyZdWeNd+znWwAxwGaPh9dwQ5NBsYyqQB7sKmJKIUdkKGmN3rzFzjVC81Dtg==" + }, + "Microsoft.EntityFrameworkCore.Abstractions": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "3BMwnBB6Bgwd6bjUqx2pOYuHpGBHCJxY3vorRJYX3U2wzrz5q4jNxDZZGsMViFZeJ7PXFIwbgy6rR73J5aalsg==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "k6PWQMuoBDGGHOQTtyois2u4AwyVcIwL2LaSLlTZQm2CYcJ1pxbt6jfAnpWmzENA/wfrYRI/X9DTLoUkE4AsLw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + }, + "Microsoft.Extensions.Diagnostics.HealthChecks": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "YmTyFOc7xx2/9FKuAlCmcWYKYLr0bYgNrRlcNPy/vc8qXnxnRV+kua6z96RUXSJVSQadCbJcEjmnTUMTEVfXOQ==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.10", + "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.2", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "U1PO967am1BIWbxBiLcYzVx8KOTYa9NvhBNgTn8Oii3LcsjvIwHzM+GTYy6bTiHnAFAlK5HAjxusAnAHSHJRoA==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.DiagnosticSource": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "6.0.2", + "contentHash": "pwXCZKaA7m5wgmCj49dW+H1RPSY7U62SKLTQYCcavf/k3Nyt/WnBgAjG4jMGnwy9rElfAZ2KvxvM5CJzJWG0hg==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "TsETIgVJb/AKoYfSP+iCxkuly5d3inZjTdx/ItZLk2CxY85v8083OBS3uai84kK3/baLnS5/b5XGs6zR7SuuHQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "17.4.0", + "contentHash": "oWe7A0wrZhxagTOcaxJ9r0NXTbgkiBQQuCpCXxnP06NsGV/qOoaY2oaangAJbOUrwEx0eka1do400NwNCjfytw==", + "dependencies": { + "NuGet.Frameworks": "5.11.0", + "System.Reflection.Metadata": "1.6.0" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "17.4.0", + "contentHash": "sUx48fu9wgQF1JxzXeSVtzb7KoKpJrdtIzsFamxET3ZYOKXj+Ej13HWZ0U2nuMVZtZVHBmE+KS3Vv5cIdTlycQ==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.4.0", + "Newtonsoft.Json": "13.0.1" + } + }, + "Microsoft.Toolkit.HighPerformance": { + "type": "Transitive", + "resolved": "7.1.2", + "contentHash": "cezzRky0BUJyYmSrcQUcX8qAv90JfUwCqWEbqfWZLHyeANo9/LWgW6y50pqbyc8r8SPXVsu2GNH98fB3VxrnvA==" + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Monai.Deploy.Messaging": { + "type": "Transitive", + "resolved": "0.1.17-rc0020", + "contentHash": "ihL4GnfL/W+4uY+6GF7wtSr2vtA1WLPFYTscITCy1HP1uXDK2aSe76MHJn6m0SA3kA+njUxSpcoO7sFNnNdGGQ==", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Logging": "6.0.0", + "Newtonsoft.Json": "13.0.1", + "System.ComponentModel.Annotations": "5.0.0", + "System.IO.Abstractions": "17.2.3" + } + }, + "Monai.Deploy.Storage": { + "type": "Transitive", + "resolved": "0.2.10", + "contentHash": "qTk/hYUIA1XCohRxG2XcFqoI3gzZTgPyB/DbRyeY4nVZ7lmuzni+KrbHuewTqsmBKt00+2d9YI6gms5oMcTxsQ==", + "dependencies": { + "AWSSDK.SecurityToken": "3.7.100.6", + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Logging": "6.0.0", + "Monai.Deploy.Storage.S3Policy": "0.2.10", + "System.IO.Abstractions": "17.2.3" + } + }, + "Monai.Deploy.Storage.S3Policy": { + "type": "Transitive", + "resolved": "0.2.10", + "contentHash": "uCv90cT8z0qxlLo2Y/biem6vY9+nrD0EJBHTYETYooXp1tnAAt77pvvLx4ygFFzoabUTjdMr9ptYSJOXQ4dAFQ==", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Newtonsoft.Json": "13.0.1" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "NuGet.Frameworks": { + "type": "Transitive", + "resolved": "5.11.0", + "contentHash": "eaiXkUjC4NPcquGWzAGMXjuxvLwc6XGKMptSyOGQeT0X70BUZObuybJFZLA0OfTdueLd3US23NBPTBb6iF3V1Q==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Abstractions": { + "type": "Transitive", + "resolved": "17.2.3", + "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "1.6.0", + "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "OCUK9C/U97+UheVwo+JE+IUcKySUE3Oe+BcHhVtQrvmKSUFLrUDO8B5zEPRL6mBGbczxZp4w1boSck6/fw4dog==", + "dependencies": { + "Microsoft.NETCore.Platforms": "3.0.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "4.7.2", + "contentHash": "iTUgB/WtrZ1sWZs84F2hwyQhiRH6QNjQv2DkwrH+WP6RoFga2Q1m3f9/Q7FG8cck8AdHitQkmkXSY8qylcDmuA==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "4.7.2", + "contentHash": "TcMd95wcrubm9nHvJEQs70rC0H/8omiSGGpU4FQ/ZA1URIqD4pjmFJh2Mfv1yH1eHgJDWTi2hMDXwTET+zOOyg==" + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Channels": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Dataflow": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA==" + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "xunit.abstractions": { + "type": "Transitive", + "resolved": "2.0.3", + "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" + }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "BeO8hEgs/c8Ls2647fPfieMngncvf0D0xYNDfIO59MolxtCtVjFRd6SRc+7tj8VMqkVOuJcnc9eh4ngI2cAmLQ==" + }, + "xunit.assert": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "pxJISOFjn2XTTi1mcDCkRZrTFb9OtRRCtx2kZFNF51GdReLr1ls2rnyxvAS4JO247K3aNtflvh5Q0346K5BROA==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "xunit.core": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "KB4yGCxNqIVyekhJLXtKSEq6BaXVp/JO3mbGVE1hxypZTLEe7h+sTbAhpA+yZW2dPtXTuiW+C1B2oxxHEkrmOw==", + "dependencies": { + "xunit.extensibility.core": "[2.4.2]", + "xunit.extensibility.execution": "[2.4.2]" + } + }, + "xunit.extensibility.core": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "W1BoXTIN1C6kpVSMw25huSet25ky6IAQUNovu3zGOGN/jWnbgSoTyCrlIhmXSg0tH5nEf8q7h3OjNHOjyu5PfA==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "xunit.abstractions": "2.0.3" + } + }, + "xunit.extensibility.execution": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "CZmgcKkwpyo8FlupZdWpJCryrAOWLh1FBPG6gmVZuPQkGQsim/oL4PcP4nfrC2hHgXUFtluvaJ0Sp9PQKUMNpg==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "xunit.extensibility.core": "[2.4.2]" + } + }, + "monai.deploy.informaticsgateway.api": { + "type": "Project", + "dependencies": { + "Macross.Json.Extensions": "3.0.0", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.10", + "Monai.Deploy.InformaticsGateway.Common": "1.0.0", + "Monai.Deploy.Messaging": "0.1.17-rc0020", + "Monai.Deploy.Storage": "0.2.10" + } + }, + "monai.deploy.informaticsgateway.common": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "System.IO.Abstractions": "17.2.3", + "System.Threading.Tasks.Dataflow": "6.0.0", + "fo-dicom": "5.0.3" + } + } + } + } +} \ No newline at end of file diff --git a/src/Api/packages.lock.json b/src/Api/packages.lock.json new file mode 100644 index 000000000..15ee3ba2c --- /dev/null +++ b/src/Api/packages.lock.json @@ -0,0 +1,290 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "GitVersion.MsBuild": { + "type": "Direct", + "requested": "[5.10.3, )", + "resolved": "5.10.3", + "contentHash": "UE5+vWL5xG8S/lJSh6w6bYTQxxgFuSSQLql7Czh6gM3Q0Y1XTpjufL9jtv8+xzqsAJIzvrPRyMwdGf3nf/z95Q==" + }, + "Macross.Json.Extensions": { + "type": "Direct", + "requested": "[3.0.0, )", + "resolved": "3.0.0", + "contentHash": "AkNshs6dopj8FXsmkkJxvLivN2SyDJQDbjcds5lo9+Y6L4zpcoXdmzXQ3VVN+AIWQr0CTD5A7vkuHGAr2aypZg==" + }, + "Microsoft.EntityFrameworkCore.Abstractions": { + "type": "Direct", + "requested": "[6.0.10, )", + "resolved": "6.0.10", + "contentHash": "3BMwnBB6Bgwd6bjUqx2pOYuHpGBHCJxY3vorRJYX3U2wzrz5q4jNxDZZGsMViFZeJ7PXFIwbgy6rR73J5aalsg==" + }, + "Monai.Deploy.Messaging": { + "type": "Direct", + "requested": "[0.1.17-rc0020, )", + "resolved": "0.1.17-rc0020", + "contentHash": "ihL4GnfL/W+4uY+6GF7wtSr2vtA1WLPFYTscITCy1HP1uXDK2aSe76MHJn6m0SA3kA+njUxSpcoO7sFNnNdGGQ==", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Logging": "6.0.0", + "Newtonsoft.Json": "13.0.1", + "System.ComponentModel.Annotations": "5.0.0", + "System.IO.Abstractions": "17.2.3" + } + }, + "Monai.Deploy.Storage": { + "type": "Direct", + "requested": "[0.2.10, )", + "resolved": "0.2.10", + "contentHash": "qTk/hYUIA1XCohRxG2XcFqoI3gzZTgPyB/DbRyeY4nVZ7lmuzni+KrbHuewTqsmBKt00+2d9YI6gms5oMcTxsQ==", + "dependencies": { + "AWSSDK.SecurityToken": "3.7.100.6", + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Logging": "6.0.0", + "Monai.Deploy.Storage.S3Policy": "0.2.10", + "System.IO.Abstractions": "17.2.3" + } + }, + "Ardalis.GuardClauses": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "RemnImQf/BWR8oYqFpdw+hn+b4Q1w+pGujkRiSfjQhMPuiERwGn4UMmQv+6UDE4qbPlnIN+e3e40JkvBhzgfzg==", + "dependencies": { + "JetBrains.Annotations": "2021.3.0" + } + }, + "AWSSDK.Core": { + "type": "Transitive", + "resolved": "3.7.100.6", + "contentHash": "TABd2IP9MUPtoLJ3EouOsZ1RfNqFPz0w7pblWcaXMw8BgaLSH4xWD7uX+0oIhRVs0GalIl3RHZEjOibEGezDUA==" + }, + "AWSSDK.SecurityToken": { + "type": "Transitive", + "resolved": "3.7.100.6", + "contentHash": "8aTiY7DxAkq6kqdipWBJ7O7XDMABPMevJSFYtOxhjjllW8hkwOY3f5R1ff2ZFSRA5H96xsBLLj/66gc+hmVweQ==", + "dependencies": { + "AWSSDK.Core": "[3.7.100.6, 4.0.0)" + } + }, + "fo-dicom": { + "type": "Transitive", + "resolved": "5.0.3", + "contentHash": "OPkCQ9+X/fvGRokAAgjR8bOpai04qlnNHmq+LsgI+Kyug3yar2zk6IMOSSvPOLgWe0EG9ScdqH44AGKnviH5Rw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "Microsoft.Extensions.DependencyInjection": "2.2.0", + "Microsoft.Extensions.Options": "2.2.0", + "Microsoft.Toolkit.HighPerformance": "7.1.2", + "System.Buffers": "4.5.1", + "System.Text.Encoding.CodePages": "4.6.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2", + "System.Threading.Channels": "6.0.0" + } + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "2021.3.0", + "contentHash": "Ddxjs5RRjf+c8m9m++WvhW1lz1bqNhsTjWvCLbQN9bvKbkJeR9MhtfNwKgBRRdG2yLHcXFr5Lf7fsvvkiPaDRg==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "yuvf07qFWFqtK3P/MRkEKLhn5r2UbSpVueRziSqj0yJQIKFwG1pq9mOayK3zE5qZCTs0CbrwL9M6R8VwqyGy2w==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "k6PWQMuoBDGGHOQTtyois2u4AwyVcIwL2LaSLlTZQm2CYcJ1pxbt6jfAnpWmzENA/wfrYRI/X9DTLoUkE4AsLw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + }, + "Microsoft.Extensions.Diagnostics.HealthChecks": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "YmTyFOc7xx2/9FKuAlCmcWYKYLr0bYgNrRlcNPy/vc8qXnxnRV+kua6z96RUXSJVSQadCbJcEjmnTUMTEVfXOQ==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.10", + "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.2", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "U1PO967am1BIWbxBiLcYzVx8KOTYa9NvhBNgTn8Oii3LcsjvIwHzM+GTYy6bTiHnAFAlK5HAjxusAnAHSHJRoA==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.DiagnosticSource": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "6.0.2", + "contentHash": "pwXCZKaA7m5wgmCj49dW+H1RPSY7U62SKLTQYCcavf/k3Nyt/WnBgAjG4jMGnwy9rElfAZ2KvxvM5CJzJWG0hg==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "TsETIgVJb/AKoYfSP+iCxkuly5d3inZjTdx/ItZLk2CxY85v8083OBS3uai84kK3/baLnS5/b5XGs6zR7SuuHQ==" + }, + "Microsoft.Toolkit.HighPerformance": { + "type": "Transitive", + "resolved": "7.1.2", + "contentHash": "cezzRky0BUJyYmSrcQUcX8qAv90JfUwCqWEbqfWZLHyeANo9/LWgW6y50pqbyc8r8SPXVsu2GNH98fB3VxrnvA==" + }, + "Monai.Deploy.Storage.S3Policy": { + "type": "Transitive", + "resolved": "0.2.10", + "contentHash": "uCv90cT8z0qxlLo2Y/biem6vY9+nrD0EJBHTYETYooXp1tnAAt77pvvLx4ygFFzoabUTjdMr9ptYSJOXQ4dAFQ==", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Newtonsoft.Json": "13.0.1" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.IO.Abstractions": { + "type": "Transitive", + "resolved": "17.2.3", + "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "OCUK9C/U97+UheVwo+JE+IUcKySUE3Oe+BcHhVtQrvmKSUFLrUDO8B5zEPRL6mBGbczxZp4w1boSck6/fw4dog==", + "dependencies": { + "Microsoft.NETCore.Platforms": "3.0.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "4.7.2", + "contentHash": "iTUgB/WtrZ1sWZs84F2hwyQhiRH6QNjQv2DkwrH+WP6RoFga2Q1m3f9/Q7FG8cck8AdHitQkmkXSY8qylcDmuA==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "4.7.2", + "contentHash": "TcMd95wcrubm9nHvJEQs70rC0H/8omiSGGpU4FQ/ZA1URIqD4pjmFJh2Mfv1yH1eHgJDWTi2hMDXwTET+zOOyg==" + }, + "System.Threading.Channels": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + }, + "System.Threading.Tasks.Dataflow": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA==" + }, + "monai.deploy.informaticsgateway.common": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "System.IO.Abstractions": "17.2.3", + "System.Threading.Tasks.Dataflow": "6.0.0", + "fo-dicom": "5.0.3" + } + } + } + } +} \ No newline at end of file diff --git a/src/CLI/Monai.Deploy.InformaticsGateway.CLI.csproj b/src/CLI/Monai.Deploy.InformaticsGateway.CLI.csproj index 5579931ca..bfc80a1f4 100644 --- a/src/CLI/Monai.Deploy.InformaticsGateway.CLI.csproj +++ b/src/CLI/Monai.Deploy.InformaticsGateway.CLI.csproj @@ -25,6 +25,7 @@ mig-cli Apache-2.0 ..\.sonarlint\project-monai_monai-deploy-informatics-gatewaycsharp.ruleset + true diff --git a/src/CLI/Test/Monai.Deploy.InformaticsGateway.CLI.Test.csproj b/src/CLI/Test/Monai.Deploy.InformaticsGateway.CLI.Test.csproj index 87792e683..53f43febb 100644 --- a/src/CLI/Test/Monai.Deploy.InformaticsGateway.CLI.Test.csproj +++ b/src/CLI/Test/Monai.Deploy.InformaticsGateway.CLI.Test.csproj @@ -21,6 +21,7 @@ Monai.Deploy.InformaticsGateway.CLI.Test Apache-2.0 false + true diff --git a/src/CLI/Test/packages.lock.json b/src/CLI/Test/packages.lock.json new file mode 100644 index 000000000..8e4823e9d --- /dev/null +++ b/src/CLI/Test/packages.lock.json @@ -0,0 +1,1607 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "coverlet.collector": { + "type": "Direct", + "requested": "[3.2.0, )", + "resolved": "3.2.0", + "contentHash": "xjY8xBigSeWIYs4I7DgUHqSNoGqnHi7Fv7/7RZD02rvZyG3hlsjnQKiVKVWKgr9kRKgmV+dEfu8KScvysiC0Wg==" + }, + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "[17.4.0, )", + "resolved": "17.4.0", + "contentHash": "VtNZQ83ntG2aEUjy1gq6B4HNdn96se6FmdY/03At8WiqDReGrApm6OB2fNiSHz9D6IIEtWtNZ2FSH0RJDVXl/w==", + "dependencies": { + "Microsoft.CodeCoverage": "17.4.0", + "Microsoft.TestPlatform.TestHost": "17.4.0" + } + }, + "Moq": { + "type": "Direct", + "requested": "[4.18.2, )", + "resolved": "4.18.2", + "contentHash": "SjxKYS5nX6prcaT8ZjbkONh3vnh0Rxru09+gQ1a07v4TM530Oe/jq3Q4dOZPfo1wq0LYmTgLOZKrqRfEx4auPw==", + "dependencies": { + "Castle.Core": "5.1.0" + } + }, + "System.CommandLine.Hosting": { + "type": "Direct", + "requested": "[0.4.0-alpha.22272.1, )", + "resolved": "0.4.0-alpha.22272.1", + "contentHash": "x9JhHxBLxlKyCIZADFYC8q16L9yGHdTakrLFjHabwR7Tk0761aTexiGgMTIS744HGuhc8pk9MoLUzsr/TlRfMQ==", + "dependencies": { + "Microsoft.Extensions.Hosting": "6.0.0", + "System.CommandLine": "2.0.0-beta4.22272.1", + "System.CommandLine.NamingConventionBinder": "2.0.0-beta4.22272.1" + } + }, + "System.IO.Abstractions.TestingHelpers": { + "type": "Direct", + "requested": "[17.2.3, )", + "resolved": "17.2.3", + "contentHash": "tkXvQbsfOIfeoGso+WptCuouFLiWt3EU8s0D8poqIVz1BJOOszkPuFbFgP2HUTJ9bp5n1HH89eFHILo6Oz5XUw==", + "dependencies": { + "System.IO.Abstractions": "17.2.3" + } + }, + "xRetry": { + "type": "Direct", + "requested": "[1.8.0, )", + "resolved": "1.8.0", + "contentHash": "H8KXWHBjQASwD4y/7L2j7j4KLmg8z4+mCV4atrhZvJVnCkVSKLkWe1lfKGmaCYkKt2dJnC4yH+tJXGqthSkGGg==", + "dependencies": { + "xunit.core": "[2.4.0, 3.0.0)" + } + }, + "xunit": { + "type": "Direct", + "requested": "[2.4.2, )", + "resolved": "2.4.2", + "contentHash": "6Mj73Ont3zj2CJuoykVJfE0ZmRwn7C+pTuRP8c4bnaaTFjwNG6tGe0prJ1yIbMe9AHrpDys63ctWacSsFJWK/w==", + "dependencies": { + "xunit.analyzers": "1.0.0", + "xunit.assert": "2.4.2", + "xunit.core": "[2.4.2]" + } + }, + "xunit.runner.visualstudio": { + "type": "Direct", + "requested": "[2.4.5, )", + "resolved": "2.4.5", + "contentHash": "OwHamvBdUKgqsXfBzWiCW/O98BTx81UKzx2bieIOQI7CZFE5NEQZGi8PBQGIKawDW96xeRffiNf20SjfC0x9hw==" + }, + "Ardalis.GuardClauses": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "RemnImQf/BWR8oYqFpdw+hn+b4Q1w+pGujkRiSfjQhMPuiERwGn4UMmQv+6UDE4qbPlnIN+e3e40JkvBhzgfzg==", + "dependencies": { + "JetBrains.Annotations": "2021.3.0" + } + }, + "AWSSDK.Core": { + "type": "Transitive", + "resolved": "3.7.100.6", + "contentHash": "TABd2IP9MUPtoLJ3EouOsZ1RfNqFPz0w7pblWcaXMw8BgaLSH4xWD7uX+0oIhRVs0GalIl3RHZEjOibEGezDUA==" + }, + "AWSSDK.SecurityToken": { + "type": "Transitive", + "resolved": "3.7.100.6", + "contentHash": "8aTiY7DxAkq6kqdipWBJ7O7XDMABPMevJSFYtOxhjjllW8hkwOY3f5R1ff2ZFSRA5H96xsBLLj/66gc+hmVweQ==", + "dependencies": { + "AWSSDK.Core": "[3.7.100.6, 4.0.0)" + } + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.0", + "contentHash": "31UJpTHOiWq95CDOHazE3Ub/hE/PydNWsJMwnEVTqFFP4WhAugwpaVGxzOxKgNeSUUeqS2W6lxV+q7u1pAOfXg==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "Crayon": { + "type": "Transitive", + "resolved": "2.0.69", + "contentHash": "eJHxoMTfhZs1782YUIMafXIDTPcTwAV5I3MNsl2d4Mn61/h3ABPMSzHwzigL/NO7BrCKRoP4gHJuERpLHdSCvg==" + }, + "Docker.DotNet": { + "type": "Transitive", + "resolved": "3.125.12", + "contentHash": "lkDh6PUV8SIM1swPCkd3f+8zGB7Z9Am3C2XBLqAjyIIp5jQBCsDFrtbtA1QiVdFMWdYcJscrX/gzzG50kRj0jQ==", + "dependencies": { + "Newtonsoft.Json": "13.0.1", + "System.Buffers": "4.5.1", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "fo-dicom": { + "type": "Transitive", + "resolved": "5.0.3", + "contentHash": "OPkCQ9+X/fvGRokAAgjR8bOpai04qlnNHmq+LsgI+Kyug3yar2zk6IMOSSvPOLgWe0EG9ScdqH44AGKnviH5Rw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "Microsoft.Extensions.DependencyInjection": "2.2.0", + "Microsoft.Extensions.Options": "2.2.0", + "Microsoft.Toolkit.HighPerformance": "7.1.2", + "System.Buffers": "4.5.1", + "System.Text.Encoding.CodePages": "4.6.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2", + "System.Threading.Channels": "6.0.0" + } + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "2021.3.0", + "contentHash": "Ddxjs5RRjf+c8m9m++WvhW1lz1bqNhsTjWvCLbQN9bvKbkJeR9MhtfNwKgBRRdG2yLHcXFr5Lf7fsvvkiPaDRg==" + }, + "Macross.Json.Extensions": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "AkNshs6dopj8FXsmkkJxvLivN2SyDJQDbjcds5lo9+Y6L4zpcoXdmzXQ3VVN+AIWQr0CTD5A7vkuHGAr2aypZg==" + }, + "Microsoft.AspNet.WebApi.Client": { + "type": "Transitive", + "resolved": "5.2.9", + "contentHash": "cuVhPjjNMSEFpKXweMNBbsG4RUFuuZpFBm8tSyw309U9JEjcnbB6n3EPb4xwgcy9bJ38ctIbv5G8zXUBhlrPWw==", + "dependencies": { + "Newtonsoft.Json": "10.0.1", + "Newtonsoft.Json.Bson": "1.0.1" + } + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "yuvf07qFWFqtK3P/MRkEKLhn5r2UbSpVueRziSqj0yJQIKFwG1pq9mOayK3zE5qZCTs0CbrwL9M6R8VwqyGy2w==" + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.4.0", + "contentHash": "2oZbSVTC2nAvQ2DnbXLlXS+c25ZyZdWeNd+znWwAxwGaPh9dwQ5NBsYyqQB7sKmJKIUdkKGmN3rzFzjVC81Dtg==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.EntityFrameworkCore.Abstractions": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "3BMwnBB6Bgwd6bjUqx2pOYuHpGBHCJxY3vorRJYX3U2wzrz5q4jNxDZZGsMViFZeJ7PXFIwbgy6rR73J5aalsg==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.CommandLine": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "3nL1qCkZ1Oxx14ZTzgo4MmlO7tso7F+TtMZAY2jUAtTLyAcDp+EDjk3RqafoKiNaePyPvvlleEcBxh3b2Hzl1g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.EnvironmentVariables": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "pnyXV1LFOsYjGveuC07xp0YHIyGq7jRq5Ncb5zrrIieMLWVwgMyYxcOH0jTnBedDT4Gh1QinSqsjqzcieHk1og==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "V4Dth2cYMZpw3HhGw9XUDIijpI6gN+22LDt0AhufIgOppCUfpWX4483OmN+dFXRJkJLc8Tv0Q8QK+1ingT2+KQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "GJGery6QytCzS/BxJ96klgG9in3uH26KcUBbiVG/coNDXCRq6LGVVlUT4vXq34KPuM+R2av+LeYdX9h4IZOCUg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.UserSecrets": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "Fy8yr4V6obi7ZxvKYI1i85jqtwMq8tqyxQVZpRSkgeA8enqy/KvBIMdcuNdznlxQMZa72mvbHqb7vbg4Pyx95w==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "k6PWQMuoBDGGHOQTtyois2u4AwyVcIwL2LaSLlTZQm2CYcJ1pxbt6jfAnpWmzENA/wfrYRI/X9DTLoUkE4AsLw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + }, + "Microsoft.Extensions.Diagnostics.HealthChecks": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "YmTyFOc7xx2/9FKuAlCmcWYKYLr0bYgNrRlcNPy/vc8qXnxnRV+kua6z96RUXSJVSQadCbJcEjmnTUMTEVfXOQ==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.10", + "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.2", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "U1PO967am1BIWbxBiLcYzVx8KOTYa9NvhBNgTn8Oii3LcsjvIwHzM+GTYy6bTiHnAFAlK5HAjxusAnAHSHJRoA==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "QvkL7l0nM8udt3gfyu0Vw8bbCXblxaKOl7c2oBfgGy4LCURRaL9XWZX1FWJrQc43oMokVneVxH38iz+bY1sbhg==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" + }, + "Microsoft.Extensions.Hosting": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "hbmizc9KPWOacLU8Z8YMaBG6KWdZFppczYV/KwnPGU/8xebWxQxdDeJmLOgg968prb7g2oQgnp6JVLX6lgby8g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.Configuration.CommandLine": "6.0.0", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1", + "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1", + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Logging.Console": "6.0.0", + "Microsoft.Extensions.Logging.Debug": "6.0.0", + "Microsoft.Extensions.Logging.EventLog": "6.0.0", + "Microsoft.Extensions.Logging.EventSource": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Http": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "15+pa2G0bAMHbHewaQIdr/y6ag2H3yh4rd9hTXavtWDzQBkvpe2RMqFg8BxDpcQWssmjmBApGPcw93QRz6YcMg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.DiagnosticSource": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "6.0.2", + "contentHash": "pwXCZKaA7m5wgmCj49dW+H1RPSY7U62SKLTQYCcavf/k3Nyt/WnBgAjG4jMGnwy9rElfAZ2KvxvM5CJzJWG0hg==" + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "ZDskjagmBAbv+K8rYW9VhjPplhbOE63xUD0DiuydZJwt15dRyoqicYklLd86zzeintUc7AptDkHn+YhhYkYo8A==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "gsqKzOEdsvq28QiXFxagmn1oRB9GeI5GgYCkoybZtQA0IUb7QPwf1WmN3AwJeNIsadTvIFQCiVK0OVIgKfOBGg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Debug": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "M9g/JixseSZATJE9tcMn9uzoD4+DbSglivFqVx8YkRJ7VVPmnvCEbOZ0AAaxsL1EKyI4cz07DXOOJExxNsUOHw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "rlo0RxlMd0WtLG3CHI0qOTp6fFn7MvQjlrCjucA31RqmiMFCZkF8CHNbe8O7tbBIyyoLGWB1he9CbaA5iyHthg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.EventSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "BeDyyqt7nkm/nr+Gdk+L8n1tUT/u33VkbXAOesgYSNsxDM9hJ1NOBGoZfj9rCbeD2+9myElI6JOVVFmnzgeWQA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "TsETIgVJb/AKoYfSP+iCxkuly5d3inZjTdx/ItZLk2CxY85v8083OBS3uai84kK3/baLnS5/b5XGs6zR7SuuHQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "17.4.0", + "contentHash": "oWe7A0wrZhxagTOcaxJ9r0NXTbgkiBQQuCpCXxnP06NsGV/qOoaY2oaangAJbOUrwEx0eka1do400NwNCjfytw==", + "dependencies": { + "NuGet.Frameworks": "5.11.0", + "System.Reflection.Metadata": "1.6.0" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "17.4.0", + "contentHash": "sUx48fu9wgQF1JxzXeSVtzb7KoKpJrdtIzsFamxET3ZYOKXj+Ej13HWZ0U2nuMVZtZVHBmE+KS3Vv5cIdTlycQ==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.4.0", + "Newtonsoft.Json": "13.0.1" + } + }, + "Microsoft.Toolkit.HighPerformance": { + "type": "Transitive", + "resolved": "7.1.2", + "contentHash": "cezzRky0BUJyYmSrcQUcX8qAv90JfUwCqWEbqfWZLHyeANo9/LWgW6y50pqbyc8r8SPXVsu2GNH98fB3VxrnvA==" + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Monai.Deploy.Messaging": { + "type": "Transitive", + "resolved": "0.1.17-rc0020", + "contentHash": "ihL4GnfL/W+4uY+6GF7wtSr2vtA1WLPFYTscITCy1HP1uXDK2aSe76MHJn6m0SA3kA+njUxSpcoO7sFNnNdGGQ==", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Logging": "6.0.0", + "Newtonsoft.Json": "13.0.1", + "System.ComponentModel.Annotations": "5.0.0", + "System.IO.Abstractions": "17.2.3" + } + }, + "Monai.Deploy.Storage": { + "type": "Transitive", + "resolved": "0.2.10", + "contentHash": "qTk/hYUIA1XCohRxG2XcFqoI3gzZTgPyB/DbRyeY4nVZ7lmuzni+KrbHuewTqsmBKt00+2d9YI6gms5oMcTxsQ==", + "dependencies": { + "AWSSDK.SecurityToken": "3.7.100.6", + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Logging": "6.0.0", + "Monai.Deploy.Storage.S3Policy": "0.2.10", + "System.IO.Abstractions": "17.2.3" + } + }, + "Monai.Deploy.Storage.S3Policy": { + "type": "Transitive", + "resolved": "0.2.10", + "contentHash": "uCv90cT8z0qxlLo2Y/biem6vY9+nrD0EJBHTYETYooXp1tnAAt77pvvLx4ygFFzoabUTjdMr9ptYSJOXQ4dAFQ==", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Newtonsoft.Json": "13.0.1" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "Newtonsoft.Json.Bson": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "5PYT/IqQ+UK31AmZiSS102R6EsTo+LGTSI8bp7WAUqDKaF4wHXD8U9u4WxTI1vc64tYi++8p3dk3WWNqPFgldw==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "Newtonsoft.Json": "10.0.1" + } + }, + "NuGet.Frameworks": { + "type": "Transitive", + "resolved": "5.11.0", + "contentHash": "eaiXkUjC4NPcquGWzAGMXjuxvLwc6XGKMptSyOGQeT0X70BUZObuybJFZLA0OfTdueLd3US23NBPTBb6iF3V1Q==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.CommandLine": { + "type": "Transitive", + "resolved": "2.0.0-beta4.22272.1", + "contentHash": "1uqED/q2H0kKoLJ4+hI2iPSBSEdTuhfCYADeJrAqERmiGQ2NNacYKRNEQ+gFbU4glgVyK8rxI+ZOe1onEtr/Pg==" + }, + "System.CommandLine.NamingConventionBinder": { + "type": "Transitive", + "resolved": "2.0.0-beta4.22272.1", + "contentHash": "ux2eUA/syF+JtlpMDc/Lsd6PBIBuwjH3AvHnestoh5uD0WKT5b+wkQxDWVCqp9qgVjMBTLNhX19ZYFtenunt9A==", + "dependencies": { + "System.CommandLine": "2.0.0-beta4.22272.1" + } + }, + "System.CommandLine.Rendering": { + "type": "Transitive", + "resolved": "0.4.0-alpha.22272.1", + "contentHash": "PQd7HStYn6RYjc5zuerR41sALm3qFDutzDHISB5DYbExSgll6s8zghfyYFdLioLPWpFxVyMj3L9Ki69jqqum/g==", + "dependencies": { + "Microsoft.CSharp": "4.7.0", + "System.CommandLine": "2.0.0-beta4.22272.1" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Abstractions": { + "type": "Transitive", + "resolved": "17.2.3", + "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "1.6.0", + "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "OCUK9C/U97+UheVwo+JE+IUcKySUE3Oe+BcHhVtQrvmKSUFLrUDO8B5zEPRL6mBGbczxZp4w1boSck6/fw4dog==", + "dependencies": { + "Microsoft.NETCore.Platforms": "3.0.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "6.0.6", + "contentHash": "GZ+62pLOr544jwSvyXv5ezSfzlFBTjLuPhgOS2dnKuknAA8dPNUGXLKTHf9XdsudU9JpbtweXnE4oEiKEB2T1Q==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Channels": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Dataflow": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA==" + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "xunit.abstractions": { + "type": "Transitive", + "resolved": "2.0.3", + "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" + }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "BeO8hEgs/c8Ls2647fPfieMngncvf0D0xYNDfIO59MolxtCtVjFRd6SRc+7tj8VMqkVOuJcnc9eh4ngI2cAmLQ==" + }, + "xunit.assert": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "pxJISOFjn2XTTi1mcDCkRZrTFb9OtRRCtx2kZFNF51GdReLr1ls2rnyxvAS4JO247K3aNtflvh5Q0346K5BROA==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "xunit.core": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "KB4yGCxNqIVyekhJLXtKSEq6BaXVp/JO3mbGVE1hxypZTLEe7h+sTbAhpA+yZW2dPtXTuiW+C1B2oxxHEkrmOw==", + "dependencies": { + "xunit.extensibility.core": "[2.4.2]", + "xunit.extensibility.execution": "[2.4.2]" + } + }, + "xunit.extensibility.core": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "W1BoXTIN1C6kpVSMw25huSet25ky6IAQUNovu3zGOGN/jWnbgSoTyCrlIhmXSg0tH5nEf8q7h3OjNHOjyu5PfA==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "xunit.abstractions": "2.0.3" + } + }, + "xunit.extensibility.execution": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "CZmgcKkwpyo8FlupZdWpJCryrAOWLh1FBPG6gmVZuPQkGQsim/oL4PcP4nfrC2hHgXUFtluvaJ0Sp9PQKUMNpg==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "xunit.extensibility.core": "[2.4.2]" + } + }, + "mig-cli": { + "type": "Project", + "dependencies": { + "Crayon": "2.0.69", + "Docker.DotNet": "3.125.12", + "Microsoft.Extensions.Hosting": "6.0.1", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Console": "6.0.0", + "Monai.Deploy.InformaticsGateway.Api": "1.0.0", + "Monai.Deploy.InformaticsGateway.Client": "1.0.0", + "Monai.Deploy.InformaticsGateway.Common": "1.0.0", + "System.CommandLine": "2.0.0-beta4.22272.1", + "System.CommandLine.Hosting": "0.4.0-alpha.22272.1", + "System.CommandLine.Rendering": "0.4.0-alpha.22272.1", + "System.IO.Abstractions": "17.2.3" + } + }, + "monai.deploy.informaticsgateway.api": { + "type": "Project", + "dependencies": { + "Macross.Json.Extensions": "3.0.0", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.10", + "Monai.Deploy.InformaticsGateway.Common": "1.0.0", + "Monai.Deploy.Messaging": "0.1.17-rc0020", + "Monai.Deploy.Storage": "0.2.10" + } + }, + "monai.deploy.informaticsgateway.client": { + "type": "Project", + "dependencies": { + "Microsoft.AspNet.WebApi.Client": "5.2.9", + "Microsoft.Extensions.Http": "6.0.0", + "Monai.Deploy.InformaticsGateway.Api": "1.0.0", + "Monai.Deploy.InformaticsGateway.Client.Common": "1.0.0" + } + }, + "monai.deploy.informaticsgateway.client.common": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "System.Text.Json": "6.0.6" + } + }, + "monai.deploy.informaticsgateway.common": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "System.IO.Abstractions": "17.2.3", + "System.Threading.Tasks.Dataflow": "6.0.0", + "fo-dicom": "5.0.3" + } + } + } + } +} \ No newline at end of file diff --git a/src/CLI/packages.lock.json b/src/CLI/packages.lock.json new file mode 100644 index 000000000..58a8805fb --- /dev/null +++ b/src/CLI/packages.lock.json @@ -0,0 +1,1458 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Crayon": { + "type": "Direct", + "requested": "[2.0.69, )", + "resolved": "2.0.69", + "contentHash": "eJHxoMTfhZs1782YUIMafXIDTPcTwAV5I3MNsl2d4Mn61/h3ABPMSzHwzigL/NO7BrCKRoP4gHJuERpLHdSCvg==" + }, + "Docker.DotNet": { + "type": "Direct", + "requested": "[3.125.12, )", + "resolved": "3.125.12", + "contentHash": "lkDh6PUV8SIM1swPCkd3f+8zGB7Z9Am3C2XBLqAjyIIp5jQBCsDFrtbtA1QiVdFMWdYcJscrX/gzzG50kRj0jQ==", + "dependencies": { + "Newtonsoft.Json": "13.0.1", + "System.Buffers": "4.5.1", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "GitVersion.MsBuild": { + "type": "Direct", + "requested": "[5.10.3, )", + "resolved": "5.10.3", + "contentHash": "UE5+vWL5xG8S/lJSh6w6bYTQxxgFuSSQLql7Czh6gM3Q0Y1XTpjufL9jtv8+xzqsAJIzvrPRyMwdGf3nf/z95Q==" + }, + "Microsoft.Extensions.Hosting": { + "type": "Direct", + "requested": "[6.0.1, )", + "resolved": "6.0.1", + "contentHash": "hbmizc9KPWOacLU8Z8YMaBG6KWdZFppczYV/KwnPGU/8xebWxQxdDeJmLOgg968prb7g2oQgnp6JVLX6lgby8g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.Configuration.CommandLine": "6.0.0", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1", + "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1", + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Logging.Console": "6.0.0", + "Microsoft.Extensions.Logging.Debug": "6.0.0", + "Microsoft.Extensions.Logging.EventLog": "6.0.0", + "Microsoft.Extensions.Logging.EventSource": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Direct", + "requested": "[6.0.0, )", + "resolved": "6.0.0", + "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.DiagnosticSource": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Console": { + "type": "Direct", + "requested": "[6.0.0, )", + "resolved": "6.0.0", + "contentHash": "gsqKzOEdsvq28QiXFxagmn1oRB9GeI5GgYCkoybZtQA0IUb7QPwf1WmN3AwJeNIsadTvIFQCiVK0OVIgKfOBGg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "System.CommandLine": { + "type": "Direct", + "requested": "[2.0.0-beta4.22272.1, )", + "resolved": "2.0.0-beta4.22272.1", + "contentHash": "1uqED/q2H0kKoLJ4+hI2iPSBSEdTuhfCYADeJrAqERmiGQ2NNacYKRNEQ+gFbU4glgVyK8rxI+ZOe1onEtr/Pg==" + }, + "System.CommandLine.Hosting": { + "type": "Direct", + "requested": "[0.4.0-alpha.22272.1, )", + "resolved": "0.4.0-alpha.22272.1", + "contentHash": "x9JhHxBLxlKyCIZADFYC8q16L9yGHdTakrLFjHabwR7Tk0761aTexiGgMTIS744HGuhc8pk9MoLUzsr/TlRfMQ==", + "dependencies": { + "Microsoft.Extensions.Hosting": "6.0.0", + "System.CommandLine": "2.0.0-beta4.22272.1", + "System.CommandLine.NamingConventionBinder": "2.0.0-beta4.22272.1" + } + }, + "System.CommandLine.Rendering": { + "type": "Direct", + "requested": "[0.4.0-alpha.22272.1, )", + "resolved": "0.4.0-alpha.22272.1", + "contentHash": "PQd7HStYn6RYjc5zuerR41sALm3qFDutzDHISB5DYbExSgll6s8zghfyYFdLioLPWpFxVyMj3L9Ki69jqqum/g==", + "dependencies": { + "Microsoft.CSharp": "4.7.0", + "System.CommandLine": "2.0.0-beta4.22272.1" + } + }, + "System.IO.Abstractions": { + "type": "Direct", + "requested": "[17.2.3, )", + "resolved": "17.2.3", + "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + }, + "Ardalis.GuardClauses": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "RemnImQf/BWR8oYqFpdw+hn+b4Q1w+pGujkRiSfjQhMPuiERwGn4UMmQv+6UDE4qbPlnIN+e3e40JkvBhzgfzg==", + "dependencies": { + "JetBrains.Annotations": "2021.3.0" + } + }, + "AWSSDK.Core": { + "type": "Transitive", + "resolved": "3.7.100.6", + "contentHash": "TABd2IP9MUPtoLJ3EouOsZ1RfNqFPz0w7pblWcaXMw8BgaLSH4xWD7uX+0oIhRVs0GalIl3RHZEjOibEGezDUA==" + }, + "AWSSDK.SecurityToken": { + "type": "Transitive", + "resolved": "3.7.100.6", + "contentHash": "8aTiY7DxAkq6kqdipWBJ7O7XDMABPMevJSFYtOxhjjllW8hkwOY3f5R1ff2ZFSRA5H96xsBLLj/66gc+hmVweQ==", + "dependencies": { + "AWSSDK.Core": "[3.7.100.6, 4.0.0)" + } + }, + "fo-dicom": { + "type": "Transitive", + "resolved": "5.0.3", + "contentHash": "OPkCQ9+X/fvGRokAAgjR8bOpai04qlnNHmq+LsgI+Kyug3yar2zk6IMOSSvPOLgWe0EG9ScdqH44AGKnviH5Rw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "Microsoft.Extensions.DependencyInjection": "2.2.0", + "Microsoft.Extensions.Options": "2.2.0", + "Microsoft.Toolkit.HighPerformance": "7.1.2", + "System.Buffers": "4.5.1", + "System.Text.Encoding.CodePages": "4.6.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2", + "System.Threading.Channels": "6.0.0" + } + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "2021.3.0", + "contentHash": "Ddxjs5RRjf+c8m9m++WvhW1lz1bqNhsTjWvCLbQN9bvKbkJeR9MhtfNwKgBRRdG2yLHcXFr5Lf7fsvvkiPaDRg==" + }, + "Macross.Json.Extensions": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "AkNshs6dopj8FXsmkkJxvLivN2SyDJQDbjcds5lo9+Y6L4zpcoXdmzXQ3VVN+AIWQr0CTD5A7vkuHGAr2aypZg==" + }, + "Microsoft.AspNet.WebApi.Client": { + "type": "Transitive", + "resolved": "5.2.9", + "contentHash": "cuVhPjjNMSEFpKXweMNBbsG4RUFuuZpFBm8tSyw309U9JEjcnbB6n3EPb4xwgcy9bJ38ctIbv5G8zXUBhlrPWw==", + "dependencies": { + "Newtonsoft.Json": "10.0.1", + "Newtonsoft.Json.Bson": "1.0.1" + } + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "yuvf07qFWFqtK3P/MRkEKLhn5r2UbSpVueRziSqj0yJQIKFwG1pq9mOayK3zE5qZCTs0CbrwL9M6R8VwqyGy2w==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.EntityFrameworkCore.Abstractions": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "3BMwnBB6Bgwd6bjUqx2pOYuHpGBHCJxY3vorRJYX3U2wzrz5q4jNxDZZGsMViFZeJ7PXFIwbgy6rR73J5aalsg==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.CommandLine": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "3nL1qCkZ1Oxx14ZTzgo4MmlO7tso7F+TtMZAY2jUAtTLyAcDp+EDjk3RqafoKiNaePyPvvlleEcBxh3b2Hzl1g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.EnvironmentVariables": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "pnyXV1LFOsYjGveuC07xp0YHIyGq7jRq5Ncb5zrrIieMLWVwgMyYxcOH0jTnBedDT4Gh1QinSqsjqzcieHk1og==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "V4Dth2cYMZpw3HhGw9XUDIijpI6gN+22LDt0AhufIgOppCUfpWX4483OmN+dFXRJkJLc8Tv0Q8QK+1ingT2+KQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "GJGery6QytCzS/BxJ96klgG9in3uH26KcUBbiVG/coNDXCRq6LGVVlUT4vXq34KPuM+R2av+LeYdX9h4IZOCUg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.UserSecrets": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "Fy8yr4V6obi7ZxvKYI1i85jqtwMq8tqyxQVZpRSkgeA8enqy/KvBIMdcuNdznlxQMZa72mvbHqb7vbg4Pyx95w==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "k6PWQMuoBDGGHOQTtyois2u4AwyVcIwL2LaSLlTZQm2CYcJ1pxbt6jfAnpWmzENA/wfrYRI/X9DTLoUkE4AsLw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + }, + "Microsoft.Extensions.Diagnostics.HealthChecks": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "YmTyFOc7xx2/9FKuAlCmcWYKYLr0bYgNrRlcNPy/vc8qXnxnRV+kua6z96RUXSJVSQadCbJcEjmnTUMTEVfXOQ==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.10", + "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.2", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "U1PO967am1BIWbxBiLcYzVx8KOTYa9NvhBNgTn8Oii3LcsjvIwHzM+GTYy6bTiHnAFAlK5HAjxusAnAHSHJRoA==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "QvkL7l0nM8udt3gfyu0Vw8bbCXblxaKOl7c2oBfgGy4LCURRaL9XWZX1FWJrQc43oMokVneVxH38iz+bY1sbhg==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Http": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "15+pa2G0bAMHbHewaQIdr/y6ag2H3yh4rd9hTXavtWDzQBkvpe2RMqFg8BxDpcQWssmjmBApGPcw93QRz6YcMg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "6.0.2", + "contentHash": "pwXCZKaA7m5wgmCj49dW+H1RPSY7U62SKLTQYCcavf/k3Nyt/WnBgAjG4jMGnwy9rElfAZ2KvxvM5CJzJWG0hg==" + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "ZDskjagmBAbv+K8rYW9VhjPplhbOE63xUD0DiuydZJwt15dRyoqicYklLd86zzeintUc7AptDkHn+YhhYkYo8A==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Debug": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "M9g/JixseSZATJE9tcMn9uzoD4+DbSglivFqVx8YkRJ7VVPmnvCEbOZ0AAaxsL1EKyI4cz07DXOOJExxNsUOHw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "rlo0RxlMd0WtLG3CHI0qOTp6fFn7MvQjlrCjucA31RqmiMFCZkF8CHNbe8O7tbBIyyoLGWB1he9CbaA5iyHthg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.EventSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "BeDyyqt7nkm/nr+Gdk+L8n1tUT/u33VkbXAOesgYSNsxDM9hJ1NOBGoZfj9rCbeD2+9myElI6JOVVFmnzgeWQA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "TsETIgVJb/AKoYfSP+iCxkuly5d3inZjTdx/ItZLk2CxY85v8083OBS3uai84kK3/baLnS5/b5XGs6zR7SuuHQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.Toolkit.HighPerformance": { + "type": "Transitive", + "resolved": "7.1.2", + "contentHash": "cezzRky0BUJyYmSrcQUcX8qAv90JfUwCqWEbqfWZLHyeANo9/LWgW6y50pqbyc8r8SPXVsu2GNH98fB3VxrnvA==" + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Monai.Deploy.Messaging": { + "type": "Transitive", + "resolved": "0.1.17-rc0020", + "contentHash": "ihL4GnfL/W+4uY+6GF7wtSr2vtA1WLPFYTscITCy1HP1uXDK2aSe76MHJn6m0SA3kA+njUxSpcoO7sFNnNdGGQ==", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Logging": "6.0.0", + "Newtonsoft.Json": "13.0.1", + "System.ComponentModel.Annotations": "5.0.0", + "System.IO.Abstractions": "17.2.3" + } + }, + "Monai.Deploy.Storage": { + "type": "Transitive", + "resolved": "0.2.10", + "contentHash": "qTk/hYUIA1XCohRxG2XcFqoI3gzZTgPyB/DbRyeY4nVZ7lmuzni+KrbHuewTqsmBKt00+2d9YI6gms5oMcTxsQ==", + "dependencies": { + "AWSSDK.SecurityToken": "3.7.100.6", + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Logging": "6.0.0", + "Monai.Deploy.Storage.S3Policy": "0.2.10", + "System.IO.Abstractions": "17.2.3" + } + }, + "Monai.Deploy.Storage.S3Policy": { + "type": "Transitive", + "resolved": "0.2.10", + "contentHash": "uCv90cT8z0qxlLo2Y/biem6vY9+nrD0EJBHTYETYooXp1tnAAt77pvvLx4ygFFzoabUTjdMr9ptYSJOXQ4dAFQ==", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Newtonsoft.Json": "13.0.1" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "Newtonsoft.Json.Bson": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "5PYT/IqQ+UK31AmZiSS102R6EsTo+LGTSI8bp7WAUqDKaF4wHXD8U9u4WxTI1vc64tYi++8p3dk3WWNqPFgldw==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "Newtonsoft.Json": "10.0.1" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.CommandLine.NamingConventionBinder": { + "type": "Transitive", + "resolved": "2.0.0-beta4.22272.1", + "contentHash": "ux2eUA/syF+JtlpMDc/Lsd6PBIBuwjH3AvHnestoh5uD0WKT5b+wkQxDWVCqp9qgVjMBTLNhX19ZYFtenunt9A==", + "dependencies": { + "System.CommandLine": "2.0.0-beta4.22272.1" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "OCUK9C/U97+UheVwo+JE+IUcKySUE3Oe+BcHhVtQrvmKSUFLrUDO8B5zEPRL6mBGbczxZp4w1boSck6/fw4dog==", + "dependencies": { + "Microsoft.NETCore.Platforms": "3.0.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "6.0.6", + "contentHash": "GZ+62pLOr544jwSvyXv5ezSfzlFBTjLuPhgOS2dnKuknAA8dPNUGXLKTHf9XdsudU9JpbtweXnE4oEiKEB2T1Q==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Channels": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Dataflow": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA==" + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "monai.deploy.informaticsgateway.api": { + "type": "Project", + "dependencies": { + "Macross.Json.Extensions": "3.0.0", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.10", + "Monai.Deploy.InformaticsGateway.Common": "1.0.0", + "Monai.Deploy.Messaging": "0.1.17-rc0020", + "Monai.Deploy.Storage": "0.2.10" + } + }, + "monai.deploy.informaticsgateway.client": { + "type": "Project", + "dependencies": { + "Microsoft.AspNet.WebApi.Client": "5.2.9", + "Microsoft.Extensions.Http": "6.0.0", + "Monai.Deploy.InformaticsGateway.Api": "1.0.0", + "Monai.Deploy.InformaticsGateway.Client.Common": "1.0.0" + } + }, + "monai.deploy.informaticsgateway.client.common": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "System.Text.Json": "6.0.6" + } + }, + "monai.deploy.informaticsgateway.common": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "System.IO.Abstractions": "17.2.3", + "System.Threading.Tasks.Dataflow": "6.0.0", + "fo-dicom": "5.0.3" + } + } + } + } +} \ No newline at end of file diff --git a/src/Client.Common/Monai.Deploy.InformaticsGateway.Client.Common.csproj b/src/Client.Common/Monai.Deploy.InformaticsGateway.Client.Common.csproj index f0ccd7f79..35b8baceb 100644 --- a/src/Client.Common/Monai.Deploy.InformaticsGateway.Client.Common.csproj +++ b/src/Client.Common/Monai.Deploy.InformaticsGateway.Client.Common.csproj @@ -23,6 +23,7 @@ true True ..\.sonarlint\project-monai_monai-deploy-informatics-gatewaycsharp.ruleset + true diff --git a/src/Client.Common/Test/Monai.Deploy.InformaticsGateway.Client.Common.Test.csproj b/src/Client.Common/Test/Monai.Deploy.InformaticsGateway.Client.Common.Test.csproj index e31db45ae..a587df6c5 100644 --- a/src/Client.Common/Test/Monai.Deploy.InformaticsGateway.Client.Common.Test.csproj +++ b/src/Client.Common/Test/Monai.Deploy.InformaticsGateway.Client.Common.Test.csproj @@ -22,6 +22,7 @@ Monai.Deploy.InformaticsGateway.DicomWeb.Client.Test Apache-2.0 false + true diff --git a/src/Client.Common/Test/packages.lock.json b/src/Client.Common/Test/packages.lock.json new file mode 100644 index 000000000..e669771f9 --- /dev/null +++ b/src/Client.Common/Test/packages.lock.json @@ -0,0 +1,1095 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Ardalis.GuardClauses": { + "type": "Direct", + "requested": "[4.0.1, )", + "resolved": "4.0.1", + "contentHash": "RemnImQf/BWR8oYqFpdw+hn+b4Q1w+pGujkRiSfjQhMPuiERwGn4UMmQv+6UDE4qbPlnIN+e3e40JkvBhzgfzg==", + "dependencies": { + "JetBrains.Annotations": "2021.3.0" + } + }, + "coverlet.collector": { + "type": "Direct", + "requested": "[3.2.0, )", + "resolved": "3.2.0", + "contentHash": "xjY8xBigSeWIYs4I7DgUHqSNoGqnHi7Fv7/7RZD02rvZyG3hlsjnQKiVKVWKgr9kRKgmV+dEfu8KScvysiC0Wg==" + }, + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "[17.4.0, )", + "resolved": "17.4.0", + "contentHash": "VtNZQ83ntG2aEUjy1gq6B4HNdn96se6FmdY/03At8WiqDReGrApm6OB2fNiSHz9D6IIEtWtNZ2FSH0RJDVXl/w==", + "dependencies": { + "Microsoft.CodeCoverage": "17.4.0", + "Microsoft.TestPlatform.TestHost": "17.4.0" + } + }, + "Moq": { + "type": "Direct", + "requested": "[4.18.2, )", + "resolved": "4.18.2", + "contentHash": "SjxKYS5nX6prcaT8ZjbkONh3vnh0Rxru09+gQ1a07v4TM530Oe/jq3Q4dOZPfo1wq0LYmTgLOZKrqRfEx4auPw==", + "dependencies": { + "Castle.Core": "5.1.0" + } + }, + "xRetry": { + "type": "Direct", + "requested": "[1.8.0, )", + "resolved": "1.8.0", + "contentHash": "H8KXWHBjQASwD4y/7L2j7j4KLmg8z4+mCV4atrhZvJVnCkVSKLkWe1lfKGmaCYkKt2dJnC4yH+tJXGqthSkGGg==", + "dependencies": { + "xunit.core": "[2.4.0, 3.0.0)" + } + }, + "xunit": { + "type": "Direct", + "requested": "[2.4.2, )", + "resolved": "2.4.2", + "contentHash": "6Mj73Ont3zj2CJuoykVJfE0ZmRwn7C+pTuRP8c4bnaaTFjwNG6tGe0prJ1yIbMe9AHrpDys63ctWacSsFJWK/w==", + "dependencies": { + "xunit.analyzers": "1.0.0", + "xunit.assert": "2.4.2", + "xunit.core": "[2.4.2]" + } + }, + "xunit.runner.visualstudio": { + "type": "Direct", + "requested": "[2.4.5, )", + "resolved": "2.4.5", + "contentHash": "OwHamvBdUKgqsXfBzWiCW/O98BTx81UKzx2bieIOQI7CZFE5NEQZGi8PBQGIKawDW96xeRffiNf20SjfC0x9hw==" + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.0", + "contentHash": "31UJpTHOiWq95CDOHazE3Ub/hE/PydNWsJMwnEVTqFFP4WhAugwpaVGxzOxKgNeSUUeqS2W6lxV+q7u1pAOfXg==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "2021.3.0", + "contentHash": "Ddxjs5RRjf+c8m9m++WvhW1lz1bqNhsTjWvCLbQN9bvKbkJeR9MhtfNwKgBRRdG2yLHcXFr5Lf7fsvvkiPaDRg==" + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.4.0", + "contentHash": "2oZbSVTC2nAvQ2DnbXLlXS+c25ZyZdWeNd+znWwAxwGaPh9dwQ5NBsYyqQB7sKmJKIUdkKGmN3rzFzjVC81Dtg==" + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "17.4.0", + "contentHash": "oWe7A0wrZhxagTOcaxJ9r0NXTbgkiBQQuCpCXxnP06NsGV/qOoaY2oaangAJbOUrwEx0eka1do400NwNCjfytw==", + "dependencies": { + "NuGet.Frameworks": "5.11.0", + "System.Reflection.Metadata": "1.6.0" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "17.4.0", + "contentHash": "sUx48fu9wgQF1JxzXeSVtzb7KoKpJrdtIzsFamxET3ZYOKXj+Ej13HWZ0U2nuMVZtZVHBmE+KS3Vv5cIdTlycQ==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.4.0", + "Newtonsoft.Json": "13.0.1" + } + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "NuGet.Frameworks": { + "type": "Transitive", + "resolved": "5.11.0", + "contentHash": "eaiXkUjC4NPcquGWzAGMXjuxvLwc6XGKMptSyOGQeT0X70BUZObuybJFZLA0OfTdueLd3US23NBPTBb6iF3V1Q==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "1.6.0", + "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "6.0.6", + "contentHash": "GZ+62pLOr544jwSvyXv5ezSfzlFBTjLuPhgOS2dnKuknAA8dPNUGXLKTHf9XdsudU9JpbtweXnE4oEiKEB2T1Q==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "xunit.abstractions": { + "type": "Transitive", + "resolved": "2.0.3", + "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" + }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "BeO8hEgs/c8Ls2647fPfieMngncvf0D0xYNDfIO59MolxtCtVjFRd6SRc+7tj8VMqkVOuJcnc9eh4ngI2cAmLQ==" + }, + "xunit.assert": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "pxJISOFjn2XTTi1mcDCkRZrTFb9OtRRCtx2kZFNF51GdReLr1ls2rnyxvAS4JO247K3aNtflvh5Q0346K5BROA==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "xunit.core": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "KB4yGCxNqIVyekhJLXtKSEq6BaXVp/JO3mbGVE1hxypZTLEe7h+sTbAhpA+yZW2dPtXTuiW+C1B2oxxHEkrmOw==", + "dependencies": { + "xunit.extensibility.core": "[2.4.2]", + "xunit.extensibility.execution": "[2.4.2]" + } + }, + "xunit.extensibility.core": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "W1BoXTIN1C6kpVSMw25huSet25ky6IAQUNovu3zGOGN/jWnbgSoTyCrlIhmXSg0tH5nEf8q7h3OjNHOjyu5PfA==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "xunit.abstractions": "2.0.3" + } + }, + "xunit.extensibility.execution": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "CZmgcKkwpyo8FlupZdWpJCryrAOWLh1FBPG6gmVZuPQkGQsim/oL4PcP4nfrC2hHgXUFtluvaJ0Sp9PQKUMNpg==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "xunit.extensibility.core": "[2.4.2]" + } + }, + "monai.deploy.informaticsgateway.client.common": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "System.Text.Json": "6.0.6" + } + } + } + } +} \ No newline at end of file diff --git a/src/Client.Common/packages.lock.json b/src/Client.Common/packages.lock.json new file mode 100644 index 000000000..13bc27b92 --- /dev/null +++ b/src/Client.Common/packages.lock.json @@ -0,0 +1,50 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Ardalis.GuardClauses": { + "type": "Direct", + "requested": "[4.0.1, )", + "resolved": "4.0.1", + "contentHash": "RemnImQf/BWR8oYqFpdw+hn+b4Q1w+pGujkRiSfjQhMPuiERwGn4UMmQv+6UDE4qbPlnIN+e3e40JkvBhzgfzg==", + "dependencies": { + "JetBrains.Annotations": "2021.3.0" + } + }, + "GitVersion.MsBuild": { + "type": "Direct", + "requested": "[5.10.3, )", + "resolved": "5.10.3", + "contentHash": "UE5+vWL5xG8S/lJSh6w6bYTQxxgFuSSQLql7Czh6gM3Q0Y1XTpjufL9jtv8+xzqsAJIzvrPRyMwdGf3nf/z95Q==" + }, + "System.Text.Json": { + "type": "Direct", + "requested": "[6.0.6, )", + "resolved": "6.0.6", + "contentHash": "GZ+62pLOr544jwSvyXv5ezSfzlFBTjLuPhgOS2dnKuknAA8dPNUGXLKTHf9XdsudU9JpbtweXnE4oEiKEB2T1Q==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0" + } + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "2021.3.0", + "contentHash": "Ddxjs5RRjf+c8m9m++WvhW1lz1bqNhsTjWvCLbQN9bvKbkJeR9MhtfNwKgBRRdG2yLHcXFr5Lf7fsvvkiPaDRg==" + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + } + } + } +} \ No newline at end of file diff --git a/src/Client/Monai.Deploy.InformaticsGateway.Client.csproj b/src/Client/Monai.Deploy.InformaticsGateway.Client.csproj index cef8c094b..6e2961cf0 100644 --- a/src/Client/Monai.Deploy.InformaticsGateway.Client.csproj +++ b/src/Client/Monai.Deploy.InformaticsGateway.Client.csproj @@ -21,6 +21,7 @@ Monai.Deploy.InformaticsGateway.Client Apache-2.0 ..\.sonarlint\project-monai_monai-deploy-informatics-gatewaycsharp.ruleset + true diff --git a/src/Client/Test/Monai.Deploy.InformaticsGateway.Client.Test.csproj b/src/Client/Test/Monai.Deploy.InformaticsGateway.Client.Test.csproj index a6bcc9060..91c4bb66a 100644 --- a/src/Client/Test/Monai.Deploy.InformaticsGateway.Client.Test.csproj +++ b/src/Client/Test/Monai.Deploy.InformaticsGateway.Client.Test.csproj @@ -21,6 +21,7 @@ Monai.Deploy.InformaticsGateway.Client.Test Apache-2.0 false + true diff --git a/src/Client/Test/packages.lock.json b/src/Client/Test/packages.lock.json new file mode 100644 index 000000000..60b1db92d --- /dev/null +++ b/src/Client/Test/packages.lock.json @@ -0,0 +1,1738 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "coverlet.collector": { + "type": "Direct", + "requested": "[3.2.0, )", + "resolved": "3.2.0", + "contentHash": "xjY8xBigSeWIYs4I7DgUHqSNoGqnHi7Fv7/7RZD02rvZyG3hlsjnQKiVKVWKgr9kRKgmV+dEfu8KScvysiC0Wg==" + }, + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "[17.4.0, )", + "resolved": "17.4.0", + "contentHash": "VtNZQ83ntG2aEUjy1gq6B4HNdn96se6FmdY/03At8WiqDReGrApm6OB2fNiSHz9D6IIEtWtNZ2FSH0RJDVXl/w==", + "dependencies": { + "Microsoft.CodeCoverage": "17.4.0", + "Microsoft.TestPlatform.TestHost": "17.4.0" + } + }, + "Moq": { + "type": "Direct", + "requested": "[4.18.2, )", + "resolved": "4.18.2", + "contentHash": "SjxKYS5nX6prcaT8ZjbkONh3vnh0Rxru09+gQ1a07v4TM530Oe/jq3Q4dOZPfo1wq0LYmTgLOZKrqRfEx4auPw==", + "dependencies": { + "Castle.Core": "5.1.0" + } + }, + "xunit": { + "type": "Direct", + "requested": "[2.4.2, )", + "resolved": "2.4.2", + "contentHash": "6Mj73Ont3zj2CJuoykVJfE0ZmRwn7C+pTuRP8c4bnaaTFjwNG6tGe0prJ1yIbMe9AHrpDys63ctWacSsFJWK/w==", + "dependencies": { + "xunit.analyzers": "1.0.0", + "xunit.assert": "2.4.2", + "xunit.core": "[2.4.2]" + } + }, + "xunit.runner.visualstudio": { + "type": "Direct", + "requested": "[2.4.5, )", + "resolved": "2.4.5", + "contentHash": "OwHamvBdUKgqsXfBzWiCW/O98BTx81UKzx2bieIOQI7CZFE5NEQZGi8PBQGIKawDW96xeRffiNf20SjfC0x9hw==" + }, + "Ardalis.GuardClauses": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "RemnImQf/BWR8oYqFpdw+hn+b4Q1w+pGujkRiSfjQhMPuiERwGn4UMmQv+6UDE4qbPlnIN+e3e40JkvBhzgfzg==", + "dependencies": { + "JetBrains.Annotations": "2021.3.0" + } + }, + "AWSSDK.Core": { + "type": "Transitive", + "resolved": "3.7.100.6", + "contentHash": "TABd2IP9MUPtoLJ3EouOsZ1RfNqFPz0w7pblWcaXMw8BgaLSH4xWD7uX+0oIhRVs0GalIl3RHZEjOibEGezDUA==" + }, + "AWSSDK.SecurityToken": { + "type": "Transitive", + "resolved": "3.7.100.6", + "contentHash": "8aTiY7DxAkq6kqdipWBJ7O7XDMABPMevJSFYtOxhjjllW8hkwOY3f5R1ff2ZFSRA5H96xsBLLj/66gc+hmVweQ==", + "dependencies": { + "AWSSDK.Core": "[3.7.100.6, 4.0.0)" + } + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.0", + "contentHash": "31UJpTHOiWq95CDOHazE3Ub/hE/PydNWsJMwnEVTqFFP4WhAugwpaVGxzOxKgNeSUUeqS2W6lxV+q7u1pAOfXg==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "Crc32.NET": { + "type": "Transitive", + "resolved": "1.2.0", + "contentHash": "wNW/huzolu8MNKUnwCVKxjfAlCFpeI8AZVfF46iAWJ1+P6bTU1AZct7VAkDDEjgeeTJCVTkGZaD6jSd/fOiUkA==", + "dependencies": { + "NETStandard.Library": "2.0.0" + } + }, + "DnsClient": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "4H/f2uYJOZ+YObZjpY9ABrKZI+JNw3uizp6oMzTXwDw6F+2qIPhpRl/1t68O/6e98+vqNiYGu+lswmwdYUy3gg==", + "dependencies": { + "Microsoft.Win32.Registry": "5.0.0" + } + }, + "DotNext": { + "type": "Transitive", + "resolved": "4.7.4", + "contentHash": "5Xp6G9U0MhSmfgxKklUUsOFfSg2VqF+/rkd7WyoUs7HqbnVd32bRw2rWW5o+rieHLzUlW/sagctPiaZqmeTA+g==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "DotNext.Threading": { + "type": "Transitive", + "resolved": "4.7.4", + "contentHash": "G/AogSunqiZZ/0H4y3Qy/YNveIB+6azddStmFxbxLWkruXZ27gXyoRQ9kQ2gpDbq/+YfMINz9nmTY5ZtuCzuyw==", + "dependencies": { + "DotNext": "4.7.4", + "System.Threading.Channels": "6.0.0" + } + }, + "fo-dicom": { + "type": "Transitive", + "resolved": "5.0.3", + "contentHash": "OPkCQ9+X/fvGRokAAgjR8bOpai04qlnNHmq+LsgI+Kyug3yar2zk6IMOSSvPOLgWe0EG9ScdqH44AGKnviH5Rw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "Microsoft.Extensions.DependencyInjection": "2.2.0", + "Microsoft.Extensions.Options": "2.2.0", + "Microsoft.Toolkit.HighPerformance": "7.1.2", + "System.Buffers": "4.5.1", + "System.Text.Encoding.CodePages": "4.6.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2", + "System.Threading.Channels": "6.0.0" + } + }, + "fo-dicom.NLog": { + "type": "Transitive", + "resolved": "5.0.3", + "contentHash": "k35FD+C9IcpTLjCF5tvCkBGUxJ+YvzoBsgb2VAtGQv+aVTu+HyoCnNVqccc4lVE53fbVCwpR3gPiTAnm5fm+KQ==", + "dependencies": { + "NLog": "4.7.11", + "fo-dicom": "5.0.3" + } + }, + "HL7-dotnetcore": { + "type": "Transitive", + "resolved": "2.29.0", + "contentHash": "E0N/W72HsvIJj6XGyiUv9BHmyhvkNedpa23QN/Xwk47S965NYC9JSA1VVYWAAs4J6yOIhpM3lBOEWvhQBO31Lw==" + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "2021.3.0", + "contentHash": "Ddxjs5RRjf+c8m9m++WvhW1lz1bqNhsTjWvCLbQN9bvKbkJeR9MhtfNwKgBRRdG2yLHcXFr5Lf7fsvvkiPaDRg==" + }, + "Karambolo.Extensions.Logging.File": { + "type": "Transitive", + "resolved": "3.3.1", + "contentHash": "wkPTc/UEuSAwbO3/Ee+oCdotxncmc/DKwjM533Z0BKvJm94NLOvU2i7pifgMd6uAUJ8jy69OcFZRu7hXKbMW6g==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Physical": "3.0.0", + "Microsoft.Extensions.Logging.Configuration": "3.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "3.0.0", + "System.Threading.Channels": "4.7.1" + } + }, + "Macross.Json.Extensions": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "AkNshs6dopj8FXsmkkJxvLivN2SyDJQDbjcds5lo9+Y6L4zpcoXdmzXQ3VVN+AIWQr0CTD5A7vkuHGAr2aypZg==" + }, + "Microsoft.AspNet.WebApi.Client": { + "type": "Transitive", + "resolved": "5.2.9", + "contentHash": "cuVhPjjNMSEFpKXweMNBbsG4RUFuuZpFBm8tSyw309U9JEjcnbB6n3EPb4xwgcy9bJ38ctIbv5G8zXUBhlrPWw==", + "dependencies": { + "Newtonsoft.Json": "10.0.1", + "Newtonsoft.Json.Bson": "1.0.1" + } + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.4.0", + "contentHash": "2oZbSVTC2nAvQ2DnbXLlXS+c25ZyZdWeNd+znWwAxwGaPh9dwQ5NBsYyqQB7sKmJKIUdkKGmN3rzFzjVC81Dtg==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "pTj+D3uJWyN3My70i2Hqo+OXixq3Os2D1nJ2x92FFo6sk8fYS1m1WLNTs0Dc1uPaViH0YvEEwvzddQ7y4rhXmA==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "TWUjLTzSeENkEChqWrcaAzIrD9i5M2l2qrWDI00lC38xBPUuK1Qf57ZywO+dwmr2S3yS0VUPvpdpqCrq60QaRw==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.EntityFrameworkCore": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "aMk8c7XKynkDJM8vnRuVz3VHSLiWy4tWpkvSdrQ4No1DNLdtTI6P3iT2wAPvVkuJsS22Ifs62/Jr6AyveX5b4A==", + "dependencies": { + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.10", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.10", + "Microsoft.Extensions.Caching.Memory": "6.0.1", + "Microsoft.Extensions.DependencyInjection": "6.0.1", + "Microsoft.Extensions.Logging": "6.0.0", + "System.Collections.Immutable": "6.0.0", + "System.Diagnostics.DiagnosticSource": "6.0.0" + } + }, + "Microsoft.EntityFrameworkCore.Abstractions": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "3BMwnBB6Bgwd6bjUqx2pOYuHpGBHCJxY3vorRJYX3U2wzrz5q4jNxDZZGsMViFZeJ7PXFIwbgy6rR73J5aalsg==" + }, + "Microsoft.EntityFrameworkCore.Analyzers": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "b4jKcjo6BLuBRjLTkZPjJCvZ7oa3a798Q1AXSMAknitpBEOEIDryyRd7XZ0cnEIVCvfSND+Trgb00Z4TiTqOvg==" + }, + "Microsoft.EntityFrameworkCore.Relational": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "8rjVzKtGSTojSefghXqh3Y2wq8A7P7iWuUQQyQieXNYrYA7nw2aHZI2rjU+7ta4jHgKITddUHFaPQJ69H18dQA==", + "dependencies": { + "Microsoft.EntityFrameworkCore": "6.0.10", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, + "Microsoft.EntityFrameworkCore.Sqlite": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "JWoqE8TMKg+SwMmig3UPsC1Fg00JQ3dyPpr64VuYlnaags+1eJ5gAYJ38CHdxSGIQQouUv7fK3rfuoKfFc5kiA==", + "dependencies": { + "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.10", + "SQLitePCLRaw.bundle_e_sqlite3": "2.0.6" + } + }, + "Microsoft.EntityFrameworkCore.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "5aynyix0/bvGlmlX3ude/ctTJ0t/styV3Cmd9BR9ujb0vlU8WuFxJqriVhuRnCLS9I7+vBgSh7FWdxWz8cHi3A==", + "dependencies": { + "Microsoft.Data.Sqlite.Core": "6.0.10", + "Microsoft.EntityFrameworkCore.Relational": "6.0.10", + "Microsoft.Extensions.DependencyModel": "6.0.0" + } + }, + "Microsoft.Extensions.ApiDescription.Server": { + "type": "Transitive", + "resolved": "6.0.5", + "contentHash": "Ckb5EDBUNJdFWyajfXzUIMRkhf52fHZOQuuZg/oiu8y7zDCVwD0iHhew6MnThjHmevanpxL3f5ci2TtHQEN6bw==" + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "bcz5sSFJbganH0+YrfvIjJDIcKNW7TL07C4d1eTmXy/wOt52iz4LVogJb6pazs7W0+74j0YpXFErvp++Aq5Bsw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "B4y+Cev05eMcjf1na0v9gza6GUtahXbtY1JCypIgx3B4Ea/KAgsWyXEmW4q6zMbmTMtKzmPVk09rvFJirvMwTg==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.CommandLine": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "3nL1qCkZ1Oxx14ZTzgo4MmlO7tso7F+TtMZAY2jUAtTLyAcDp+EDjk3RqafoKiNaePyPvvlleEcBxh3b2Hzl1g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.EnvironmentVariables": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "pnyXV1LFOsYjGveuC07xp0YHIyGq7jRq5Ncb5zrrIieMLWVwgMyYxcOH0jTnBedDT4Gh1QinSqsjqzcieHk1og==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "V4Dth2cYMZpw3HhGw9XUDIijpI6gN+22LDt0AhufIgOppCUfpWX4483OmN+dFXRJkJLc8Tv0Q8QK+1ingT2+KQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "GJGery6QytCzS/BxJ96klgG9in3uH26KcUBbiVG/coNDXCRq6LGVVlUT4vXq34KPuM+R2av+LeYdX9h4IZOCUg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.UserSecrets": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "Fy8yr4V6obi7ZxvKYI1i85jqtwMq8tqyxQVZpRSkgeA8enqy/KvBIMdcuNdznlxQMZa72mvbHqb7vbg4Pyx95w==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "vWXPg3HJQIpZkENn1KWq8SfbqVujVD7S7vIAyFXXqK5xkf1Vho+vG0bLBCHxU36lD1cLLtmGpfYf0B3MYFi9tQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Memory": "4.5.4", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "YmTyFOc7xx2/9FKuAlCmcWYKYLr0bYgNrRlcNPy/vc8qXnxnRV+kua6z96RUXSJVSQadCbJcEjmnTUMTEVfXOQ==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.10", + "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.2", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "U1PO967am1BIWbxBiLcYzVx8KOTYa9NvhBNgTn8Oii3LcsjvIwHzM+GTYy6bTiHnAFAlK5HAjxusAnAHSHJRoA==" + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "infVv0xUzQSCkm+GGEJu51mu/mz3Q+D7K/XkgYRjPyUgJ89Ve67yv37F8ePcL+RKCajt7F08GDQ3auiuoKiNUw==", + "dependencies": { + "Microsoft.EntityFrameworkCore.Relational": "6.0.10", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.10" + } + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "QvkL7l0nM8udt3gfyu0Vw8bbCXblxaKOl7c2oBfgGy4LCURRaL9XWZX1FWJrQc43oMokVneVxH38iz+bY1sbhg==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" + }, + "Microsoft.Extensions.Hosting": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "hbmizc9KPWOacLU8Z8YMaBG6KWdZFppczYV/KwnPGU/8xebWxQxdDeJmLOgg968prb7g2oQgnp6JVLX6lgby8g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.Configuration.CommandLine": "6.0.0", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.1", + "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.Configuration.UserSecrets": "6.0.1", + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Logging.Console": "6.0.0", + "Microsoft.Extensions.Logging.Debug": "6.0.0", + "Microsoft.Extensions.Logging.EventLog": "6.0.0", + "Microsoft.Extensions.Logging.EventSource": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Http": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "15+pa2G0bAMHbHewaQIdr/y6ag2H3yh4rd9hTXavtWDzQBkvpe2RMqFg8BxDpcQWssmjmBApGPcw93QRz6YcMg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.DiagnosticSource": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "6.0.2", + "contentHash": "pwXCZKaA7m5wgmCj49dW+H1RPSY7U62SKLTQYCcavf/k3Nyt/WnBgAjG4jMGnwy9rElfAZ2KvxvM5CJzJWG0hg==" + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "ZDskjagmBAbv+K8rYW9VhjPplhbOE63xUD0DiuydZJwt15dRyoqicYklLd86zzeintUc7AptDkHn+YhhYkYo8A==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "gsqKzOEdsvq28QiXFxagmn1oRB9GeI5GgYCkoybZtQA0IUb7QPwf1WmN3AwJeNIsadTvIFQCiVK0OVIgKfOBGg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Debug": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "M9g/JixseSZATJE9tcMn9uzoD4+DbSglivFqVx8YkRJ7VVPmnvCEbOZ0AAaxsL1EKyI4cz07DXOOJExxNsUOHw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "rlo0RxlMd0WtLG3CHI0qOTp6fFn7MvQjlrCjucA31RqmiMFCZkF8CHNbe8O7tbBIyyoLGWB1he9CbaA5iyHthg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.EventSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "BeDyyqt7nkm/nr+Gdk+L8n1tUT/u33VkbXAOesgYSNsxDM9hJ1NOBGoZfj9rCbeD2+9myElI6JOVVFmnzgeWQA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Net.Http.Headers": { + "type": "Transitive", + "resolved": "2.2.8", + "contentHash": "wHdwMv0QDDG2NWDSwax9cjkeQceGC1Qq53a31+31XpvTXVljKXRjWISlMoS/wZYKiqdqzuEvKFKwGHl+mt2jCA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "2.2.0", + "System.Buffers": "4.5.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.3", + "contentHash": "3Wrmi0kJDzClwAC+iBdUBpEKmEle8FQNsCs77fkiOIw/9oYA07bL1EZNX0kQ2OMN3xpwvl0vAtOCYY3ndDNlhQ==" + }, + "Microsoft.OpenApi": { + "type": "Transitive", + "resolved": "1.2.3", + "contentHash": "Nug3rO+7Kl5/SBAadzSMAVgqDlfGjJZ0GenQrLywJ84XGKO0uRqkunz5Wyl0SDwcR71bAATXvSdbdzPrYRYKGw==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "17.4.0", + "contentHash": "oWe7A0wrZhxagTOcaxJ9r0NXTbgkiBQQuCpCXxnP06NsGV/qOoaY2oaangAJbOUrwEx0eka1do400NwNCjfytw==", + "dependencies": { + "NuGet.Frameworks": "5.11.0", + "System.Reflection.Metadata": "1.6.0" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "17.4.0", + "contentHash": "sUx48fu9wgQF1JxzXeSVtzb7KoKpJrdtIzsFamxET3ZYOKXj+Ej13HWZ0U2nuMVZtZVHBmE+KS3Vv5cIdTlycQ==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.4.0", + "Newtonsoft.Json": "13.0.1" + } + }, + "Microsoft.Toolkit.HighPerformance": { + "type": "Transitive", + "resolved": "7.1.2", + "contentHash": "cezzRky0BUJyYmSrcQUcX8qAv90JfUwCqWEbqfWZLHyeANo9/LWgW6y50pqbyc8r8SPXVsu2GNH98fB3VxrnvA==" + }, + "Microsoft.Win32.Registry": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==", + "dependencies": { + "System.Security.AccessControl": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "Minio": { + "type": "Transitive", + "resolved": "4.0.6", + "contentHash": "c/7hO1I0/PB1hJr7HXuNxsTT59xi4ADPxHhGtv7zzTNZqDqq+Vgv+C8xSJ6rlIy4px7ibhMt6Kunq20ZBlLj4Q==", + "dependencies": { + "Crc32.NET": "1.2.0", + "Microsoft.CSharp": "4.7.0", + "Newtonsoft.Json": "13.0.1", + "System.Net.Http": "4.3.4", + "System.Net.Primitives": "4.3.1", + "System.Reactive.Linq": "5.0.0", + "System.ValueTuple": "4.4.0" + } + }, + "Monai.Deploy.Messaging": { + "type": "Transitive", + "resolved": "0.1.17-rc0020", + "contentHash": "ihL4GnfL/W+4uY+6GF7wtSr2vtA1WLPFYTscITCy1HP1uXDK2aSe76MHJn6m0SA3kA+njUxSpcoO7sFNnNdGGQ==", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Logging": "6.0.0", + "Newtonsoft.Json": "13.0.1", + "System.ComponentModel.Annotations": "5.0.0", + "System.IO.Abstractions": "17.2.3" + } + }, + "Monai.Deploy.Messaging.RabbitMQ": { + "type": "Transitive", + "resolved": "0.1.17-rc0020", + "contentHash": "PR3+EXMkq6C/swJEM3rzCbnLz0PqgK+VxZQnwtbO7F6pJIhkfHgx7lANpBS+HOstbulIpb4aIQgGINudCSAdBw==", + "dependencies": { + "Monai.Deploy.Messaging": "0.1.17-rc0020", + "Polly": "7.2.3", + "RabbitMQ.Client": "6.4.0", + "System.Collections.Concurrent": "4.3.0" + } + }, + "Monai.Deploy.Storage": { + "type": "Transitive", + "resolved": "0.2.10", + "contentHash": "qTk/hYUIA1XCohRxG2XcFqoI3gzZTgPyB/DbRyeY4nVZ7lmuzni+KrbHuewTqsmBKt00+2d9YI6gms5oMcTxsQ==", + "dependencies": { + "AWSSDK.SecurityToken": "3.7.100.6", + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Logging": "6.0.0", + "Monai.Deploy.Storage.S3Policy": "0.2.10", + "System.IO.Abstractions": "17.2.3" + } + }, + "Monai.Deploy.Storage.MinIO": { + "type": "Transitive", + "resolved": "0.2.10", + "contentHash": "k6j9u4x0gcMml2b5wUufItGvA8YqDnw7utxjsG1wSF7lGsqs5R5ajr9m6Z9//fSzFQ7bn1iMexnDLDhLLmo+eQ==", + "dependencies": { + "AWSSDK.SecurityToken": "3.7.100.6", + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Minio": "4.0.6", + "Monai.Deploy.Storage": "0.2.10", + "Monai.Deploy.Storage.S3Policy": "0.2.10" + } + }, + "Monai.Deploy.Storage.S3Policy": { + "type": "Transitive", + "resolved": "0.2.10", + "contentHash": "uCv90cT8z0qxlLo2Y/biem6vY9+nrD0EJBHTYETYooXp1tnAAt77pvvLx4ygFFzoabUTjdMr9ptYSJOXQ4dAFQ==", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Newtonsoft.Json": "13.0.1" + } + }, + "MongoDB.Bson": { + "type": "Transitive", + "resolved": "2.18.0", + "contentHash": "iyiVjkCAZIUiyYDZXXUqISeW7n3O/qcM90PUeJybryg7g4rXhSMRY0oLpAg+NdoXD/Qm9LlmVIePAluHQB91tQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "5.0.0" + } + }, + "MongoDB.Driver": { + "type": "Transitive", + "resolved": "2.18.0", + "contentHash": "nq7wRMeNoqUe+bndHFMDGX8IY3iSmzLoyLzzf8DRos137O+5R4NCsd9qtw/n+DoGFas0gzzyD546Cpz+5AkmLg==", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "2.0.0", + "MongoDB.Bson": "2.18.0", + "MongoDB.Driver.Core": "2.18.0", + "MongoDB.Libmongocrypt": "1.6.0" + } + }, + "MongoDB.Driver.Core": { + "type": "Transitive", + "resolved": "2.18.0", + "contentHash": "/X5Ty32gyDyzs/fWFwKGS0QUhfQT3V9Sc/F8yhILBu8bjCjBscOFKQsKieAha8xxBnYS7dZvTvhvEJWT7HgJ1g==", + "dependencies": { + "DnsClient": "1.6.1", + "Microsoft.Extensions.Logging.Abstractions": "2.0.0", + "MongoDB.Bson": "2.18.0", + "MongoDB.Libmongocrypt": "1.6.0", + "SharpCompress": "0.30.1", + "Snappier": "1.0.0", + "System.Buffers": "4.5.1", + "ZstdSharp.Port": "0.6.2" + } + }, + "MongoDB.Libmongocrypt": { + "type": "Transitive", + "resolved": "1.6.0", + "contentHash": "kh+MMf+ECIf5sQDIqOdKBd75ktD5aD1EuzCX3R4HOUGPlAbeAm8harf4zwlbvFe2BLfCXZO7HajSABLf4P0GNg==" + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "2.0.0", + "contentHash": "7jnbRU+L08FXKMxqUflxEXtVymWvNOrS8yHgu9s6EM8Anr6T/wIX4nZ08j/u3Asz+tCufp3YVwFSEvFTPYmBPA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "Newtonsoft.Json.Bson": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "5PYT/IqQ+UK31AmZiSS102R6EsTo+LGTSI8bp7WAUqDKaF4wHXD8U9u4WxTI1vc64tYi++8p3dk3WWNqPFgldw==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "Newtonsoft.Json": "10.0.1" + } + }, + "NLog": { + "type": "Transitive", + "resolved": "5.0.5", + "contentHash": "NOTWSyUEljmjMq7OqZ1X9iu4bJ+rW/o6pt79Jq8j2Q7s8DyoMMCJwe0HoCKcNjhYRJ++b+E8erH6E6WwaCTshQ==" + }, + "NLog.Extensions.Logging": { + "type": "Transitive", + "resolved": "5.1.0", + "contentHash": "cQCKF2/iYjZUkn0d2o6VD1xkTUhIFHPYmZEm29KlTthLEzMht5aY80SwWlHZCKy0w19kaSq1jgLJSGrKsapUfg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "NLog": "5.0.5" + } + }, + "NLog.Web.AspNetCore": { + "type": "Transitive", + "resolved": "5.1.5", + "contentHash": "a7Pe6KdwIxPxcFYy6M7wLseU++tx1bBf/ROVNlcZPLfp40DPLA0KGOk1K9kvbcwPYKKLMikdSwiOyTRZZFlaXg==", + "dependencies": { + "NLog.Extensions.Logging": "5.1.0" + } + }, + "NuGet.Frameworks": { + "type": "Transitive", + "resolved": "5.11.0", + "contentHash": "eaiXkUjC4NPcquGWzAGMXjuxvLwc6XGKMptSyOGQeT0X70BUZObuybJFZLA0OfTdueLd3US23NBPTBb6iF3V1Q==" + }, + "Polly": { + "type": "Transitive", + "resolved": "7.2.3", + "contentHash": "DeCY0OFbNdNxsjntr1gTXHJ5pKUwYzp04Er2LLeN3g6pWhffsGuKVfMBLe1lw7x76HrPkLxKEFxBlpRxS2nDEQ==" + }, + "RabbitMQ.Client": { + "type": "Transitive", + "resolved": "6.4.0", + "contentHash": "1znR1gGU+xYVSpO5z8nQolcUKA/yydnxQn7Ug9+RUXxTSLMm/eE58VKGwahPBjELXvDnX0k/kBrAitFLRjx9LA==", + "dependencies": { + "System.Memory": "4.5.4", + "System.Threading.Channels": "4.7.1" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "7VSGO0URRKoMEAq0Sc9cRz8mb6zbyx/BZDEWhgPdzzpmFhkam3fJ1DAGWFXBI4nGlma+uPKpfuMQP5LXRnOH5g==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "0oAaTAm6e2oVH+/Zttt0cuhGaePQYKII1dY8iaqP7CvOpVKgLybKRFvQjXR2LtxXOXTVPNv14j0ot8uV+HrUmw==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "G24ibsCNi5Kbz0oXWynBoRgtGvsw5ZSVEWjv13/KiCAM8C6wz9zzcCniMeQFIkJ2tasjo2kXlvlBZhplL51kGg==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "QR1OwtwehHxSeQvZKXe+iSd+d3XZNkEcuWMFYa2i0aG1l+lR739HPicKMlTbJst3spmeekDVBUS7SeS26s4U/g==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "I+GNKGg2xCHueRd1m9PzeEW7WLbNNLznmTuEi8/vZX71HudUbx1UTwlGkiwMri7JLl8hGaIAWnA/GONhu+LOyQ==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "1Z3TAq1ytS1IBRtPXJvEUZdVsfWfeNEhBkbiOCGEl9wwAfsjP2lz3ZFDx5tq8p60/EqbS0HItG5piHuB71RjoA==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "6mU/cVmmHtQiDXhnzUImxIcDL48GbTk+TsptXyJA+MIOG9LRjPoAQC/qBFB7X+UNyK86bmvGwC8t+M66wsYC8w==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "vjwG0GGcTW/PPg6KVud8F9GLWYuAV1rrw1BKAqY0oh4jcUqg15oYF1+qkGR2x2ZHM4DQnWKQ7cJgYbfncz/lYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "7KMFpTkHC/zoExs+PwP8jDCWcrK9H6L7soowT80CUx3e+nxP/AFnq0AQAW5W76z2WYbLAYCRyPfwYFG6zkvQRw==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "xrlmRCnKZJLHxyyLIqkZjNXqgxnKdZxfItrPkjI+6pkRo5lHX8YvSZlWrSI5AVwLMi4HbNWP7064hcAWeZKp5w==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.2", + "contentHash": "leXiwfiIkW7Gmn7cgnNcdtNAU70SjmKW3jxGj1iKHOvdn0zRWsgv/l2OJUO5zdGdiv2VRFnAsxxhDgMzofPdWg==" + }, + "SharpCompress": { + "type": "Transitive", + "resolved": "0.30.1", + "contentHash": "XqD4TpfyYGa7QTPzaGlMVbcecKnXy4YmYLDWrU+JIj7IuRNl7DH2END+Ll7ekWIY8o3dAMWLFDE1xdhfIWD1nw==" + }, + "Snappier": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "rFtK2KEI9hIe8gtx3a0YDXdHOpedIf9wYCEYtBEmtlyiWVX3XlCNV03JrmmAi/Cdfn7dxK+k0sjjcLv4fpHnqA==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Swashbuckle.AspNetCore": { + "type": "Transitive", + "resolved": "6.4.0", + "contentHash": "eUBr4TW0up6oKDA5Xwkul289uqSMgY0xGN4pnbOIBqCcN9VKGGaPvHX3vWaG/hvocfGDP+MGzMA0bBBKz2fkmQ==", + "dependencies": { + "Microsoft.Extensions.ApiDescription.Server": "6.0.5", + "Swashbuckle.AspNetCore.Swagger": "6.4.0", + "Swashbuckle.AspNetCore.SwaggerGen": "6.4.0", + "Swashbuckle.AspNetCore.SwaggerUI": "6.4.0" + } + }, + "Swashbuckle.AspNetCore.Swagger": { + "type": "Transitive", + "resolved": "6.4.0", + "contentHash": "nl4SBgGM+cmthUcpwO/w1lUjevdDHAqRvfUoe4Xp/Uvuzt9mzGUwyFCqa3ODBAcZYBiFoKvrYwz0rabslJvSmQ==", + "dependencies": { + "Microsoft.OpenApi": "1.2.3" + } + }, + "Swashbuckle.AspNetCore.SwaggerGen": { + "type": "Transitive", + "resolved": "6.4.0", + "contentHash": "lXhcUBVqKrPFAQF7e/ZeDfb5PMgE8n5t6L5B6/BQSpiwxgHzmBcx8Msu42zLYFTvR5PIqE9Q9lZvSQAcwCxJjw==", + "dependencies": { + "Swashbuckle.AspNetCore.Swagger": "6.4.0" + } + }, + "Swashbuckle.AspNetCore.SwaggerUI": { + "type": "Transitive", + "resolved": "6.4.0", + "contentHash": "1Hh3atb3pi8c+v7n4/3N80Jj8RvLOXgWxzix6w3OZhB7zBGRwsy7FWr4e3hwgPweSBpwfElqj4V4nkjYabH9nQ==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "l4zZJ1WU2hqpQQHXz1rvC3etVZN+2DLmQMO79FhOTZHMn8tDRr+WU287sbomD0BETlmKDn0ygUgVy9k5xkkJdA==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Abstractions": { + "type": "Transitive", + "resolved": "17.2.3", + "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Async": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "0YhHcaroWpQ9UCot3Pizah7ryAzQhNvobLMSxeDIGmnXfkQn8u5owvpOH0K6EVB+z9L7u6Cc4W17Br/+jyttEQ==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.4", + "contentHash": "aOa2d51SEbmM+H+Csw7yJOuNZoHkrP2XnAurye5HWYgGVVU54YZDvsLUYRv6h18X3sPnjNCANmN7ZhIPiqMcjA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.1", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.2" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.1", + "contentHash": "OHzPhSme78BbmLe9UBxHM69ZYjClS5URuhce6Ta4ikiLgaUGiG/X84fZpI6zy7CsUH5R9cYzI2tv9dWPqdTkUg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.1", + "Microsoft.NETCore.Targets": "1.1.3", + "System.Runtime": "4.3.1", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Reactive": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "erBZjkQHWL9jpasCE/0qKAryzVBJFxGHVBAvgRN1bzM0q2s1S4oYREEEL0Vb+1kA/6BKb5FjUZMp5VXmy+gzkQ==" + }, + "System.Reactive.Linq": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "IB4/qlV4T1WhZvM11RVoFUSZXPow9VWVeQ1uDkSKgz6bAO+gCf65H/vjrYlwyXmojSSxvfHndF9qdH43P/IuAw==", + "dependencies": { + "System.Reactive": "5.0.0", + "System.Threading.Tasks.Extensions": "4.5.4" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "1.6.0", + "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.1", + "contentHash": "abhfv1dTK6NXOmu4bgHIONxHyEqFjW8HwXPmpY9gmll+ix9UNo4XDcmzJn6oLooftxNssVHdJC1pGT9jkSynQg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.1", + "Microsoft.NETCore.Targets": "1.1.3" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Security.AccessControl": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Principal.Windows": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "OCUK9C/U97+UheVwo+JE+IUcKySUE3Oe+BcHhVtQrvmKSUFLrUDO8B5zEPRL6mBGbczxZp4w1boSck6/fw4dog==", + "dependencies": { + "Microsoft.NETCore.Platforms": "3.0.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "6.0.6", + "contentHash": "GZ+62pLOr544jwSvyXv5ezSfzlFBTjLuPhgOS2dnKuknAA8dPNUGXLKTHf9XdsudU9JpbtweXnE4oEiKEB2T1Q==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Channels": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Dataflow": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA==" + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==" + }, + "System.ValueTuple": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "BahUww/+mdP4ARCAh2RQhQTg13wYLVrBb9SYVgW8ZlrwjraGCXHGjo0oIiUfZ34LUZkMMR+RAzR7dEY4S1HeQQ==" + }, + "xunit.abstractions": { + "type": "Transitive", + "resolved": "2.0.3", + "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" + }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "BeO8hEgs/c8Ls2647fPfieMngncvf0D0xYNDfIO59MolxtCtVjFRd6SRc+7tj8VMqkVOuJcnc9eh4ngI2cAmLQ==" + }, + "xunit.assert": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "pxJISOFjn2XTTi1mcDCkRZrTFb9OtRRCtx2kZFNF51GdReLr1ls2rnyxvAS4JO247K3aNtflvh5Q0346K5BROA==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "xunit.core": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "KB4yGCxNqIVyekhJLXtKSEq6BaXVp/JO3mbGVE1hxypZTLEe7h+sTbAhpA+yZW2dPtXTuiW+C1B2oxxHEkrmOw==", + "dependencies": { + "xunit.extensibility.core": "[2.4.2]", + "xunit.extensibility.execution": "[2.4.2]" + } + }, + "xunit.extensibility.core": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "W1BoXTIN1C6kpVSMw25huSet25ky6IAQUNovu3zGOGN/jWnbgSoTyCrlIhmXSg0tH5nEf8q7h3OjNHOjyu5PfA==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "xunit.abstractions": "2.0.3" + } + }, + "xunit.extensibility.execution": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "CZmgcKkwpyo8FlupZdWpJCryrAOWLh1FBPG6gmVZuPQkGQsim/oL4PcP4nfrC2hHgXUFtluvaJ0Sp9PQKUMNpg==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "xunit.extensibility.core": "[2.4.2]" + } + }, + "ZstdSharp.Port": { + "type": "Transitive", + "resolved": "0.6.2", + "contentHash": "jPao/LdUNLUz8rn3H1D8W7wQbZsRZM0iayvWI4xGejJg3XJHT56gcmYdgmCGPdJF1UEBqUjucCRrFB+4HbJsbw==" + }, + "monai.deploy.informaticsgateway": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "DotNext.Threading": "4.7.4", + "HL7-dotnetcore": "2.29.0", + "Karambolo.Extensions.Logging.File": "3.3.1", + "Microsoft.EntityFrameworkCore": "6.0.10", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "6.0.10", + "Microsoft.Extensions.Hosting": "6.0.1", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Console": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Monai.Deploy.InformaticsGateway.Api": "1.0.0", + "Monai.Deploy.InformaticsGateway.Common": "1.0.0", + "Monai.Deploy.InformaticsGateway.Configuration": "1.0.0", + "Monai.Deploy.InformaticsGateway.Database": "1.0.0", + "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "1.0.0", + "Monai.Deploy.InformaticsGateway.DicomWeb.Client": "1.0.0", + "Monai.Deploy.Messaging.RabbitMQ": "0.1.17-rc0020", + "Monai.Deploy.Storage": "0.2.10", + "Monai.Deploy.Storage.MinIO": "0.2.10", + "NLog": "5.0.5", + "NLog.Web.AspNetCore": "5.1.5", + "Polly": "7.2.3", + "Swashbuckle.AspNetCore": "6.4.0", + "fo-dicom": "5.0.3", + "fo-dicom.NLog": "5.0.3" + } + }, + "monai.deploy.informaticsgateway.api": { + "type": "Project", + "dependencies": { + "Macross.Json.Extensions": "3.0.0", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.10", + "Monai.Deploy.InformaticsGateway.Common": "1.0.0", + "Monai.Deploy.Messaging": "0.1.17-rc0020", + "Monai.Deploy.Storage": "0.2.10" + } + }, + "monai.deploy.informaticsgateway.client": { + "type": "Project", + "dependencies": { + "Microsoft.AspNet.WebApi.Client": "5.2.9", + "Microsoft.Extensions.Http": "6.0.0", + "Monai.Deploy.InformaticsGateway.Api": "1.0.0", + "Monai.Deploy.InformaticsGateway.Client.Common": "1.0.0" + } + }, + "monai.deploy.informaticsgateway.client.common": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "System.Text.Json": "6.0.6" + } + }, + "monai.deploy.informaticsgateway.common": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "System.IO.Abstractions": "17.2.3", + "System.Threading.Tasks.Dataflow": "6.0.0", + "fo-dicom": "5.0.3" + } + }, + "monai.deploy.informaticsgateway.configuration": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.2", + "Microsoft.Extensions.Options": "6.0.0", + "Monai.Deploy.InformaticsGateway.Api": "1.0.0", + "Monai.Deploy.InformaticsGateway.Common": "1.0.0", + "Monai.Deploy.Messaging": "0.1.17-rc0020", + "Monai.Deploy.Storage": "0.2.10", + "System.IO.Abstractions": "17.2.3" + } + }, + "monai.deploy.informaticsgateway.database": { + "type": "Project", + "dependencies": { + "Microsoft.EntityFrameworkCore": "6.0.10", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0", + "Monai.Deploy.InformaticsGateway.Api": "1.0.0", + "Monai.Deploy.InformaticsGateway.Configuration": "1.0.0", + "Monai.Deploy.InformaticsGateway.Database.Api": "1.0.0", + "Monai.Deploy.InformaticsGateway.Database.EntityFramework": "1.0.0", + "Monai.Deploy.InformaticsGateway.Database.MongoDB": "1.0.0" + } + }, + "monai.deploy.informaticsgateway.database.api": { + "type": "Project", + "dependencies": { + "Microsoft.EntityFrameworkCore": "6.0.10", + "Monai.Deploy.InformaticsGateway.Api": "1.0.0", + "Monai.Deploy.InformaticsGateway.Configuration": "1.0.0", + "Polly": "7.2.3" + } + }, + "monai.deploy.informaticsgateway.database.entityframework": { + "type": "Project", + "dependencies": { + "Microsoft.EntityFrameworkCore": "6.0.10", + "Microsoft.EntityFrameworkCore.Sqlite": "6.0.10", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Monai.Deploy.InformaticsGateway.Api": "1.0.0", + "Monai.Deploy.InformaticsGateway.Configuration": "1.0.0", + "Monai.Deploy.InformaticsGateway.Database.Api": "1.0.0" + } + }, + "monai.deploy.informaticsgateway.database.mongodb": { + "type": "Project", + "dependencies": { + "Monai.Deploy.InformaticsGateway.Database.Api": "1.0.0", + "MongoDB.Driver": "2.18.0", + "MongoDB.Driver.Core": "2.18.0" + } + }, + "monai.deploy.informaticsgateway.dicomweb.client": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.AspNet.WebApi.Client": "5.2.9", + "Microsoft.Extensions.Http": "6.0.0", + "Microsoft.Net.Http.Headers": "2.2.8", + "Monai.Deploy.InformaticsGateway.Client.Common": "1.0.0", + "System.Linq.Async": "6.0.1", + "fo-dicom": "5.0.3" + } + } + } + } +} \ No newline at end of file diff --git a/src/Client/packages.lock.json b/src/Client/packages.lock.json new file mode 100644 index 000000000..566fc4dc9 --- /dev/null +++ b/src/Client/packages.lock.json @@ -0,0 +1,1210 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "GitVersion.MsBuild": { + "type": "Direct", + "requested": "[5.10.3, )", + "resolved": "5.10.3", + "contentHash": "UE5+vWL5xG8S/lJSh6w6bYTQxxgFuSSQLql7Czh6gM3Q0Y1XTpjufL9jtv8+xzqsAJIzvrPRyMwdGf3nf/z95Q==" + }, + "Microsoft.AspNet.WebApi.Client": { + "type": "Direct", + "requested": "[5.2.9, )", + "resolved": "5.2.9", + "contentHash": "cuVhPjjNMSEFpKXweMNBbsG4RUFuuZpFBm8tSyw309U9JEjcnbB6n3EPb4xwgcy9bJ38ctIbv5G8zXUBhlrPWw==", + "dependencies": { + "Newtonsoft.Json": "10.0.1", + "Newtonsoft.Json.Bson": "1.0.1" + } + }, + "Microsoft.Extensions.Http": { + "type": "Direct", + "requested": "[6.0.0, )", + "resolved": "6.0.0", + "contentHash": "15+pa2G0bAMHbHewaQIdr/y6ag2H3yh4rd9hTXavtWDzQBkvpe2RMqFg8BxDpcQWssmjmBApGPcw93QRz6YcMg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Ardalis.GuardClauses": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "RemnImQf/BWR8oYqFpdw+hn+b4Q1w+pGujkRiSfjQhMPuiERwGn4UMmQv+6UDE4qbPlnIN+e3e40JkvBhzgfzg==", + "dependencies": { + "JetBrains.Annotations": "2021.3.0" + } + }, + "AWSSDK.Core": { + "type": "Transitive", + "resolved": "3.7.100.6", + "contentHash": "TABd2IP9MUPtoLJ3EouOsZ1RfNqFPz0w7pblWcaXMw8BgaLSH4xWD7uX+0oIhRVs0GalIl3RHZEjOibEGezDUA==" + }, + "AWSSDK.SecurityToken": { + "type": "Transitive", + "resolved": "3.7.100.6", + "contentHash": "8aTiY7DxAkq6kqdipWBJ7O7XDMABPMevJSFYtOxhjjllW8hkwOY3f5R1ff2ZFSRA5H96xsBLLj/66gc+hmVweQ==", + "dependencies": { + "AWSSDK.Core": "[3.7.100.6, 4.0.0)" + } + }, + "fo-dicom": { + "type": "Transitive", + "resolved": "5.0.3", + "contentHash": "OPkCQ9+X/fvGRokAAgjR8bOpai04qlnNHmq+LsgI+Kyug3yar2zk6IMOSSvPOLgWe0EG9ScdqH44AGKnviH5Rw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "Microsoft.Extensions.DependencyInjection": "2.2.0", + "Microsoft.Extensions.Options": "2.2.0", + "Microsoft.Toolkit.HighPerformance": "7.1.2", + "System.Buffers": "4.5.1", + "System.Text.Encoding.CodePages": "4.6.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2", + "System.Threading.Channels": "6.0.0" + } + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "2021.3.0", + "contentHash": "Ddxjs5RRjf+c8m9m++WvhW1lz1bqNhsTjWvCLbQN9bvKbkJeR9MhtfNwKgBRRdG2yLHcXFr5Lf7fsvvkiPaDRg==" + }, + "Macross.Json.Extensions": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "AkNshs6dopj8FXsmkkJxvLivN2SyDJQDbjcds5lo9+Y6L4zpcoXdmzXQ3VVN+AIWQr0CTD5A7vkuHGAr2aypZg==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "yuvf07qFWFqtK3P/MRkEKLhn5r2UbSpVueRziSqj0yJQIKFwG1pq9mOayK3zE5qZCTs0CbrwL9M6R8VwqyGy2w==" + }, + "Microsoft.EntityFrameworkCore.Abstractions": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "3BMwnBB6Bgwd6bjUqx2pOYuHpGBHCJxY3vorRJYX3U2wzrz5q4jNxDZZGsMViFZeJ7PXFIwbgy6rR73J5aalsg==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "k6PWQMuoBDGGHOQTtyois2u4AwyVcIwL2LaSLlTZQm2CYcJ1pxbt6jfAnpWmzENA/wfrYRI/X9DTLoUkE4AsLw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + }, + "Microsoft.Extensions.Diagnostics.HealthChecks": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "YmTyFOc7xx2/9FKuAlCmcWYKYLr0bYgNrRlcNPy/vc8qXnxnRV+kua6z96RUXSJVSQadCbJcEjmnTUMTEVfXOQ==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.10", + "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.2", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "U1PO967am1BIWbxBiLcYzVx8KOTYa9NvhBNgTn8Oii3LcsjvIwHzM+GTYy6bTiHnAFAlK5HAjxusAnAHSHJRoA==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.DiagnosticSource": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "6.0.2", + "contentHash": "pwXCZKaA7m5wgmCj49dW+H1RPSY7U62SKLTQYCcavf/k3Nyt/WnBgAjG4jMGnwy9rElfAZ2KvxvM5CJzJWG0hg==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "TsETIgVJb/AKoYfSP+iCxkuly5d3inZjTdx/ItZLk2CxY85v8083OBS3uai84kK3/baLnS5/b5XGs6zR7SuuHQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.Toolkit.HighPerformance": { + "type": "Transitive", + "resolved": "7.1.2", + "contentHash": "cezzRky0BUJyYmSrcQUcX8qAv90JfUwCqWEbqfWZLHyeANo9/LWgW6y50pqbyc8r8SPXVsu2GNH98fB3VxrnvA==" + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Monai.Deploy.Messaging": { + "type": "Transitive", + "resolved": "0.1.17-rc0020", + "contentHash": "ihL4GnfL/W+4uY+6GF7wtSr2vtA1WLPFYTscITCy1HP1uXDK2aSe76MHJn6m0SA3kA+njUxSpcoO7sFNnNdGGQ==", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Logging": "6.0.0", + "Newtonsoft.Json": "13.0.1", + "System.ComponentModel.Annotations": "5.0.0", + "System.IO.Abstractions": "17.2.3" + } + }, + "Monai.Deploy.Storage": { + "type": "Transitive", + "resolved": "0.2.10", + "contentHash": "qTk/hYUIA1XCohRxG2XcFqoI3gzZTgPyB/DbRyeY4nVZ7lmuzni+KrbHuewTqsmBKt00+2d9YI6gms5oMcTxsQ==", + "dependencies": { + "AWSSDK.SecurityToken": "3.7.100.6", + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Logging": "6.0.0", + "Monai.Deploy.Storage.S3Policy": "0.2.10", + "System.IO.Abstractions": "17.2.3" + } + }, + "Monai.Deploy.Storage.S3Policy": { + "type": "Transitive", + "resolved": "0.2.10", + "contentHash": "uCv90cT8z0qxlLo2Y/biem6vY9+nrD0EJBHTYETYooXp1tnAAt77pvvLx4ygFFzoabUTjdMr9ptYSJOXQ4dAFQ==", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Newtonsoft.Json": "13.0.1" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "Newtonsoft.Json.Bson": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "5PYT/IqQ+UK31AmZiSS102R6EsTo+LGTSI8bp7WAUqDKaF4wHXD8U9u4WxTI1vc64tYi++8p3dk3WWNqPFgldw==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "Newtonsoft.Json": "10.0.1" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Abstractions": { + "type": "Transitive", + "resolved": "17.2.3", + "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "OCUK9C/U97+UheVwo+JE+IUcKySUE3Oe+BcHhVtQrvmKSUFLrUDO8B5zEPRL6mBGbczxZp4w1boSck6/fw4dog==", + "dependencies": { + "Microsoft.NETCore.Platforms": "3.0.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "6.0.6", + "contentHash": "GZ+62pLOr544jwSvyXv5ezSfzlFBTjLuPhgOS2dnKuknAA8dPNUGXLKTHf9XdsudU9JpbtweXnE4oEiKEB2T1Q==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Channels": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Dataflow": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA==" + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "monai.deploy.informaticsgateway.api": { + "type": "Project", + "dependencies": { + "Macross.Json.Extensions": "3.0.0", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.10", + "Monai.Deploy.InformaticsGateway.Common": "1.0.0", + "Monai.Deploy.Messaging": "0.1.17-rc0020", + "Monai.Deploy.Storage": "0.2.10" + } + }, + "monai.deploy.informaticsgateway.client.common": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "System.Text.Json": "6.0.6" + } + }, + "monai.deploy.informaticsgateway.common": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "System.IO.Abstractions": "17.2.3", + "System.Threading.Tasks.Dataflow": "6.0.0", + "fo-dicom": "5.0.3" + } + } + } + } +} \ No newline at end of file diff --git a/src/Common/Monai.Deploy.InformaticsGateway.Common.csproj b/src/Common/Monai.Deploy.InformaticsGateway.Common.csproj index bc35dbd9d..c6ac90a35 100644 --- a/src/Common/Monai.Deploy.InformaticsGateway.Common.csproj +++ b/src/Common/Monai.Deploy.InformaticsGateway.Common.csproj @@ -24,6 +24,7 @@ true True ..\.sonarlint\project-monai_monai-deploy-informatics-gatewaycsharp.ruleset + true diff --git a/src/Common/Test/Monai.Deploy.InformaticsGateway.Common.Test.csproj b/src/Common/Test/Monai.Deploy.InformaticsGateway.Common.Test.csproj index 1ff6a1596..9ee1c5396 100644 --- a/src/Common/Test/Monai.Deploy.InformaticsGateway.Common.Test.csproj +++ b/src/Common/Test/Monai.Deploy.InformaticsGateway.Common.Test.csproj @@ -21,6 +21,7 @@ Monai.Deploy.InformaticsGateway.Common.Test Apache-2.0 false + true diff --git a/src/Common/Test/packages.lock.json b/src/Common/Test/packages.lock.json new file mode 100644 index 000000000..b58ecbb75 --- /dev/null +++ b/src/Common/Test/packages.lock.json @@ -0,0 +1,1173 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "coverlet.collector": { + "type": "Direct", + "requested": "[3.2.0, )", + "resolved": "3.2.0", + "contentHash": "xjY8xBigSeWIYs4I7DgUHqSNoGqnHi7Fv7/7RZD02rvZyG3hlsjnQKiVKVWKgr9kRKgmV+dEfu8KScvysiC0Wg==" + }, + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "[17.4.0, )", + "resolved": "17.4.0", + "contentHash": "VtNZQ83ntG2aEUjy1gq6B4HNdn96se6FmdY/03At8WiqDReGrApm6OB2fNiSHz9D6IIEtWtNZ2FSH0RJDVXl/w==", + "dependencies": { + "Microsoft.CodeCoverage": "17.4.0", + "Microsoft.TestPlatform.TestHost": "17.4.0" + } + }, + "Moq": { + "type": "Direct", + "requested": "[4.18.2, )", + "resolved": "4.18.2", + "contentHash": "SjxKYS5nX6prcaT8ZjbkONh3vnh0Rxru09+gQ1a07v4TM530Oe/jq3Q4dOZPfo1wq0LYmTgLOZKrqRfEx4auPw==", + "dependencies": { + "Castle.Core": "5.1.0" + } + }, + "System.IO.Abstractions.TestingHelpers": { + "type": "Direct", + "requested": "[17.2.3, )", + "resolved": "17.2.3", + "contentHash": "tkXvQbsfOIfeoGso+WptCuouFLiWt3EU8s0D8poqIVz1BJOOszkPuFbFgP2HUTJ9bp5n1HH89eFHILo6Oz5XUw==", + "dependencies": { + "System.IO.Abstractions": "17.2.3" + } + }, + "xunit": { + "type": "Direct", + "requested": "[2.4.2, )", + "resolved": "2.4.2", + "contentHash": "6Mj73Ont3zj2CJuoykVJfE0ZmRwn7C+pTuRP8c4bnaaTFjwNG6tGe0prJ1yIbMe9AHrpDys63ctWacSsFJWK/w==", + "dependencies": { + "xunit.analyzers": "1.0.0", + "xunit.assert": "2.4.2", + "xunit.core": "[2.4.2]" + } + }, + "xunit.runner.visualstudio": { + "type": "Direct", + "requested": "[2.4.5, )", + "resolved": "2.4.5", + "contentHash": "OwHamvBdUKgqsXfBzWiCW/O98BTx81UKzx2bieIOQI7CZFE5NEQZGi8PBQGIKawDW96xeRffiNf20SjfC0x9hw==" + }, + "Ardalis.GuardClauses": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "RemnImQf/BWR8oYqFpdw+hn+b4Q1w+pGujkRiSfjQhMPuiERwGn4UMmQv+6UDE4qbPlnIN+e3e40JkvBhzgfzg==", + "dependencies": { + "JetBrains.Annotations": "2021.3.0" + } + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.0", + "contentHash": "31UJpTHOiWq95CDOHazE3Ub/hE/PydNWsJMwnEVTqFFP4WhAugwpaVGxzOxKgNeSUUeqS2W6lxV+q7u1pAOfXg==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "fo-dicom": { + "type": "Transitive", + "resolved": "5.0.3", + "contentHash": "OPkCQ9+X/fvGRokAAgjR8bOpai04qlnNHmq+LsgI+Kyug3yar2zk6IMOSSvPOLgWe0EG9ScdqH44AGKnviH5Rw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "Microsoft.Extensions.DependencyInjection": "2.2.0", + "Microsoft.Extensions.Options": "2.2.0", + "Microsoft.Toolkit.HighPerformance": "7.1.2", + "System.Buffers": "4.5.1", + "System.Text.Encoding.CodePages": "4.6.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2", + "System.Threading.Channels": "6.0.0" + } + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "2021.3.0", + "contentHash": "Ddxjs5RRjf+c8m9m++WvhW1lz1bqNhsTjWvCLbQN9bvKbkJeR9MhtfNwKgBRRdG2yLHcXFr5Lf7fsvvkiPaDRg==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "yuvf07qFWFqtK3P/MRkEKLhn5r2UbSpVueRziSqj0yJQIKFwG1pq9mOayK3zE5qZCTs0CbrwL9M6R8VwqyGy2w==" + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.4.0", + "contentHash": "2oZbSVTC2nAvQ2DnbXLlXS+c25ZyZdWeNd+znWwAxwGaPh9dwQ5NBsYyqQB7sKmJKIUdkKGmN3rzFzjVC81Dtg==" + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", + "Microsoft.Extensions.Primitives": "2.2.0", + "System.ComponentModel.Annotations": "4.5.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==", + "dependencies": { + "System.Memory": "4.5.1", + "System.Runtime.CompilerServices.Unsafe": "4.5.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "TsETIgVJb/AKoYfSP+iCxkuly5d3inZjTdx/ItZLk2CxY85v8083OBS3uai84kK3/baLnS5/b5XGs6zR7SuuHQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "17.4.0", + "contentHash": "oWe7A0wrZhxagTOcaxJ9r0NXTbgkiBQQuCpCXxnP06NsGV/qOoaY2oaangAJbOUrwEx0eka1do400NwNCjfytw==", + "dependencies": { + "NuGet.Frameworks": "5.11.0", + "System.Reflection.Metadata": "1.6.0" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "17.4.0", + "contentHash": "sUx48fu9wgQF1JxzXeSVtzb7KoKpJrdtIzsFamxET3ZYOKXj+Ej13HWZ0U2nuMVZtZVHBmE+KS3Vv5cIdTlycQ==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.4.0", + "Newtonsoft.Json": "13.0.1" + } + }, + "Microsoft.Toolkit.HighPerformance": { + "type": "Transitive", + "resolved": "7.1.2", + "contentHash": "cezzRky0BUJyYmSrcQUcX8qAv90JfUwCqWEbqfWZLHyeANo9/LWgW6y50pqbyc8r8SPXVsu2GNH98fB3VxrnvA==" + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "NuGet.Frameworks": { + "type": "Transitive", + "resolved": "5.11.0", + "contentHash": "eaiXkUjC4NPcquGWzAGMXjuxvLwc6XGKMptSyOGQeT0X70BUZObuybJFZLA0OfTdueLd3US23NBPTBb6iF3V1Q==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==" + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Abstractions": { + "type": "Transitive", + "resolved": "17.2.3", + "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "sDJYJpGtTgx+23Ayu5euxG5mAXWdkDb4+b0rD0Cab0M1oQS9H0HXGPriKcqpXuiJDTV7fTp/d+fMDJmnr6sNvA==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "1.6.0", + "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Zh8t8oqolRaFa9vmOZfdQm/qKejdqz0J9kr7o2Fu0vPeoH3BL1EOXipKWwkWtLT1JPzjByrF19fGuFlNbmPpiw==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "OCUK9C/U97+UheVwo+JE+IUcKySUE3Oe+BcHhVtQrvmKSUFLrUDO8B5zEPRL6mBGbczxZp4w1boSck6/fw4dog==", + "dependencies": { + "Microsoft.NETCore.Platforms": "3.0.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "4.7.2", + "contentHash": "iTUgB/WtrZ1sWZs84F2hwyQhiRH6QNjQv2DkwrH+WP6RoFga2Q1m3f9/Q7FG8cck8AdHitQkmkXSY8qylcDmuA==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "4.7.2", + "contentHash": "TcMd95wcrubm9nHvJEQs70rC0H/8omiSGGpU4FQ/ZA1URIqD4pjmFJh2Mfv1yH1eHgJDWTi2hMDXwTET+zOOyg==" + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Channels": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Dataflow": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA==" + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "xunit.abstractions": { + "type": "Transitive", + "resolved": "2.0.3", + "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" + }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "BeO8hEgs/c8Ls2647fPfieMngncvf0D0xYNDfIO59MolxtCtVjFRd6SRc+7tj8VMqkVOuJcnc9eh4ngI2cAmLQ==" + }, + "xunit.assert": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "pxJISOFjn2XTTi1mcDCkRZrTFb9OtRRCtx2kZFNF51GdReLr1ls2rnyxvAS4JO247K3aNtflvh5Q0346K5BROA==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "xunit.core": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "KB4yGCxNqIVyekhJLXtKSEq6BaXVp/JO3mbGVE1hxypZTLEe7h+sTbAhpA+yZW2dPtXTuiW+C1B2oxxHEkrmOw==", + "dependencies": { + "xunit.extensibility.core": "[2.4.2]", + "xunit.extensibility.execution": "[2.4.2]" + } + }, + "xunit.extensibility.core": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "W1BoXTIN1C6kpVSMw25huSet25ky6IAQUNovu3zGOGN/jWnbgSoTyCrlIhmXSg0tH5nEf8q7h3OjNHOjyu5PfA==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "xunit.abstractions": "2.0.3" + } + }, + "xunit.extensibility.execution": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "CZmgcKkwpyo8FlupZdWpJCryrAOWLh1FBPG6gmVZuPQkGQsim/oL4PcP4nfrC2hHgXUFtluvaJ0Sp9PQKUMNpg==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "xunit.extensibility.core": "[2.4.2]" + } + }, + "monai.deploy.informaticsgateway.common": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "System.IO.Abstractions": "17.2.3", + "System.Threading.Tasks.Dataflow": "6.0.0", + "fo-dicom": "5.0.3" + } + } + } + } +} \ No newline at end of file diff --git a/src/Common/packages.lock.json b/src/Common/packages.lock.json new file mode 100644 index 000000000..248ba5ef9 --- /dev/null +++ b/src/Common/packages.lock.json @@ -0,0 +1,146 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Ardalis.GuardClauses": { + "type": "Direct", + "requested": "[4.0.1, )", + "resolved": "4.0.1", + "contentHash": "RemnImQf/BWR8oYqFpdw+hn+b4Q1w+pGujkRiSfjQhMPuiERwGn4UMmQv+6UDE4qbPlnIN+e3e40JkvBhzgfzg==", + "dependencies": { + "JetBrains.Annotations": "2021.3.0" + } + }, + "fo-dicom": { + "type": "Direct", + "requested": "[5.0.3, )", + "resolved": "5.0.3", + "contentHash": "OPkCQ9+X/fvGRokAAgjR8bOpai04qlnNHmq+LsgI+Kyug3yar2zk6IMOSSvPOLgWe0EG9ScdqH44AGKnviH5Rw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "Microsoft.Extensions.DependencyInjection": "2.2.0", + "Microsoft.Extensions.Options": "2.2.0", + "Microsoft.Toolkit.HighPerformance": "7.1.2", + "System.Buffers": "4.5.1", + "System.Text.Encoding.CodePages": "4.6.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2", + "System.Threading.Channels": "6.0.0" + } + }, + "GitVersion.MsBuild": { + "type": "Direct", + "requested": "[5.10.3, )", + "resolved": "5.10.3", + "contentHash": "UE5+vWL5xG8S/lJSh6w6bYTQxxgFuSSQLql7Czh6gM3Q0Y1XTpjufL9jtv8+xzqsAJIzvrPRyMwdGf3nf/z95Q==" + }, + "System.IO.Abstractions": { + "type": "Direct", + "requested": "[17.2.3, )", + "resolved": "17.2.3", + "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + }, + "System.Threading.Tasks.Dataflow": { + "type": "Direct", + "requested": "[6.0.0, )", + "resolved": "6.0.0", + "contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA==" + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "2021.3.0", + "contentHash": "Ddxjs5RRjf+c8m9m++WvhW1lz1bqNhsTjWvCLbQN9bvKbkJeR9MhtfNwKgBRRdG2yLHcXFr5Lf7fsvvkiPaDRg==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "yuvf07qFWFqtK3P/MRkEKLhn5r2UbSpVueRziSqj0yJQIKFwG1pq9mOayK3zE5qZCTs0CbrwL9M6R8VwqyGy2w==" + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", + "Microsoft.Extensions.Primitives": "2.2.0", + "System.ComponentModel.Annotations": "4.5.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "2.2.0", + "contentHash": "azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==", + "dependencies": { + "System.Memory": "4.5.1", + "System.Runtime.CompilerServices.Unsafe": "4.5.1" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "TsETIgVJb/AKoYfSP+iCxkuly5d3inZjTdx/ItZLk2CxY85v8083OBS3uai84kK3/baLnS5/b5XGs6zR7SuuHQ==" + }, + "Microsoft.Toolkit.HighPerformance": { + "type": "Transitive", + "resolved": "7.1.2", + "contentHash": "cezzRky0BUJyYmSrcQUcX8qAv90JfUwCqWEbqfWZLHyeANo9/LWgW6y50pqbyc8r8SPXVsu2GNH98fB3VxrnvA==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==" + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "sDJYJpGtTgx+23Ayu5euxG5mAXWdkDb4+b0rD0Cab0M1oQS9H0HXGPriKcqpXuiJDTV7fTp/d+fMDJmnr6sNvA==" + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Zh8t8oqolRaFa9vmOZfdQm/qKejdqz0J9kr7o2Fu0vPeoH3BL1EOXipKWwkWtLT1JPzjByrF19fGuFlNbmPpiw==" + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "OCUK9C/U97+UheVwo+JE+IUcKySUE3Oe+BcHhVtQrvmKSUFLrUDO8B5zEPRL6mBGbczxZp4w1boSck6/fw4dog==", + "dependencies": { + "Microsoft.NETCore.Platforms": "3.0.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "4.7.2", + "contentHash": "iTUgB/WtrZ1sWZs84F2hwyQhiRH6QNjQv2DkwrH+WP6RoFga2Q1m3f9/Q7FG8cck8AdHitQkmkXSY8qylcDmuA==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "4.7.2", + "contentHash": "TcMd95wcrubm9nHvJEQs70rC0H/8omiSGGpU4FQ/ZA1URIqD4pjmFJh2Mfv1yH1eHgJDWTi2hMDXwTET+zOOyg==" + }, + "System.Threading.Channels": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + } + } + } +} \ No newline at end of file diff --git a/src/Configuration/Monai.Deploy.InformaticsGateway.Configuration.csproj b/src/Configuration/Monai.Deploy.InformaticsGateway.Configuration.csproj index b1d455ba4..ab08807c5 100644 --- a/src/Configuration/Monai.Deploy.InformaticsGateway.Configuration.csproj +++ b/src/Configuration/Monai.Deploy.InformaticsGateway.Configuration.csproj @@ -22,6 +22,7 @@ Apache-2.0 true ..\.sonarlint\project-monai_monai-deploy-informatics-gatewaycsharp.ruleset + true diff --git a/src/Configuration/Test/Monai.Deploy.InformaticsGateway.Configuration.Test.csproj b/src/Configuration/Test/Monai.Deploy.InformaticsGateway.Configuration.Test.csproj index 0a50325ed..7b5aecc82 100644 --- a/src/Configuration/Test/Monai.Deploy.InformaticsGateway.Configuration.Test.csproj +++ b/src/Configuration/Test/Monai.Deploy.InformaticsGateway.Configuration.Test.csproj @@ -22,6 +22,7 @@ Monai.Deploy.InformaticsGateway.Configuration.Test Apache-2.0 false + true diff --git a/src/Configuration/Test/packages.lock.json b/src/Configuration/Test/packages.lock.json new file mode 100644 index 000000000..a05e3bfd3 --- /dev/null +++ b/src/Configuration/Test/packages.lock.json @@ -0,0 +1,1313 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "coverlet.collector": { + "type": "Direct", + "requested": "[3.2.0, )", + "resolved": "3.2.0", + "contentHash": "xjY8xBigSeWIYs4I7DgUHqSNoGqnHi7Fv7/7RZD02rvZyG3hlsjnQKiVKVWKgr9kRKgmV+dEfu8KScvysiC0Wg==" + }, + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "[17.4.0, )", + "resolved": "17.4.0", + "contentHash": "VtNZQ83ntG2aEUjy1gq6B4HNdn96se6FmdY/03At8WiqDReGrApm6OB2fNiSHz9D6IIEtWtNZ2FSH0RJDVXl/w==", + "dependencies": { + "Microsoft.CodeCoverage": "17.4.0", + "Microsoft.TestPlatform.TestHost": "17.4.0" + } + }, + "Moq": { + "type": "Direct", + "requested": "[4.18.2, )", + "resolved": "4.18.2", + "contentHash": "SjxKYS5nX6prcaT8ZjbkONh3vnh0Rxru09+gQ1a07v4TM530Oe/jq3Q4dOZPfo1wq0LYmTgLOZKrqRfEx4auPw==", + "dependencies": { + "Castle.Core": "5.1.0" + } + }, + "System.IO.Abstractions.TestingHelpers": { + "type": "Direct", + "requested": "[17.2.3, )", + "resolved": "17.2.3", + "contentHash": "tkXvQbsfOIfeoGso+WptCuouFLiWt3EU8s0D8poqIVz1BJOOszkPuFbFgP2HUTJ9bp5n1HH89eFHILo6Oz5XUw==", + "dependencies": { + "System.IO.Abstractions": "17.2.3" + } + }, + "xunit": { + "type": "Direct", + "requested": "[2.4.2, )", + "resolved": "2.4.2", + "contentHash": "6Mj73Ont3zj2CJuoykVJfE0ZmRwn7C+pTuRP8c4bnaaTFjwNG6tGe0prJ1yIbMe9AHrpDys63ctWacSsFJWK/w==", + "dependencies": { + "xunit.analyzers": "1.0.0", + "xunit.assert": "2.4.2", + "xunit.core": "[2.4.2]" + } + }, + "xunit.runner.visualstudio": { + "type": "Direct", + "requested": "[2.4.5, )", + "resolved": "2.4.5", + "contentHash": "OwHamvBdUKgqsXfBzWiCW/O98BTx81UKzx2bieIOQI7CZFE5NEQZGi8PBQGIKawDW96xeRffiNf20SjfC0x9hw==" + }, + "Ardalis.GuardClauses": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "RemnImQf/BWR8oYqFpdw+hn+b4Q1w+pGujkRiSfjQhMPuiERwGn4UMmQv+6UDE4qbPlnIN+e3e40JkvBhzgfzg==", + "dependencies": { + "JetBrains.Annotations": "2021.3.0" + } + }, + "AWSSDK.Core": { + "type": "Transitive", + "resolved": "3.7.100.6", + "contentHash": "TABd2IP9MUPtoLJ3EouOsZ1RfNqFPz0w7pblWcaXMw8BgaLSH4xWD7uX+0oIhRVs0GalIl3RHZEjOibEGezDUA==" + }, + "AWSSDK.SecurityToken": { + "type": "Transitive", + "resolved": "3.7.100.6", + "contentHash": "8aTiY7DxAkq6kqdipWBJ7O7XDMABPMevJSFYtOxhjjllW8hkwOY3f5R1ff2ZFSRA5H96xsBLLj/66gc+hmVweQ==", + "dependencies": { + "AWSSDK.Core": "[3.7.100.6, 4.0.0)" + } + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.0", + "contentHash": "31UJpTHOiWq95CDOHazE3Ub/hE/PydNWsJMwnEVTqFFP4WhAugwpaVGxzOxKgNeSUUeqS2W6lxV+q7u1pAOfXg==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "fo-dicom": { + "type": "Transitive", + "resolved": "5.0.3", + "contentHash": "OPkCQ9+X/fvGRokAAgjR8bOpai04qlnNHmq+LsgI+Kyug3yar2zk6IMOSSvPOLgWe0EG9ScdqH44AGKnviH5Rw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "Microsoft.Extensions.DependencyInjection": "2.2.0", + "Microsoft.Extensions.Options": "2.2.0", + "Microsoft.Toolkit.HighPerformance": "7.1.2", + "System.Buffers": "4.5.1", + "System.Text.Encoding.CodePages": "4.6.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2", + "System.Threading.Channels": "6.0.0" + } + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "2021.3.0", + "contentHash": "Ddxjs5RRjf+c8m9m++WvhW1lz1bqNhsTjWvCLbQN9bvKbkJeR9MhtfNwKgBRRdG2yLHcXFr5Lf7fsvvkiPaDRg==" + }, + "Macross.Json.Extensions": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "AkNshs6dopj8FXsmkkJxvLivN2SyDJQDbjcds5lo9+Y6L4zpcoXdmzXQ3VVN+AIWQr0CTD5A7vkuHGAr2aypZg==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "yuvf07qFWFqtK3P/MRkEKLhn5r2UbSpVueRziSqj0yJQIKFwG1pq9mOayK3zE5qZCTs0CbrwL9M6R8VwqyGy2w==" + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.4.0", + "contentHash": "2oZbSVTC2nAvQ2DnbXLlXS+c25ZyZdWeNd+znWwAxwGaPh9dwQ5NBsYyqQB7sKmJKIUdkKGmN3rzFzjVC81Dtg==" + }, + "Microsoft.EntityFrameworkCore.Abstractions": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "3BMwnBB6Bgwd6bjUqx2pOYuHpGBHCJxY3vorRJYX3U2wzrz5q4jNxDZZGsMViFZeJ7PXFIwbgy6rR73J5aalsg==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "k6PWQMuoBDGGHOQTtyois2u4AwyVcIwL2LaSLlTZQm2CYcJ1pxbt6jfAnpWmzENA/wfrYRI/X9DTLoUkE4AsLw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + }, + "Microsoft.Extensions.Diagnostics.HealthChecks": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "YmTyFOc7xx2/9FKuAlCmcWYKYLr0bYgNrRlcNPy/vc8qXnxnRV+kua6z96RUXSJVSQadCbJcEjmnTUMTEVfXOQ==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.10", + "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.2", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "U1PO967am1BIWbxBiLcYzVx8KOTYa9NvhBNgTn8Oii3LcsjvIwHzM+GTYy6bTiHnAFAlK5HAjxusAnAHSHJRoA==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.DiagnosticSource": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "6.0.2", + "contentHash": "pwXCZKaA7m5wgmCj49dW+H1RPSY7U62SKLTQYCcavf/k3Nyt/WnBgAjG4jMGnwy9rElfAZ2KvxvM5CJzJWG0hg==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "TsETIgVJb/AKoYfSP+iCxkuly5d3inZjTdx/ItZLk2CxY85v8083OBS3uai84kK3/baLnS5/b5XGs6zR7SuuHQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "17.4.0", + "contentHash": "oWe7A0wrZhxagTOcaxJ9r0NXTbgkiBQQuCpCXxnP06NsGV/qOoaY2oaangAJbOUrwEx0eka1do400NwNCjfytw==", + "dependencies": { + "NuGet.Frameworks": "5.11.0", + "System.Reflection.Metadata": "1.6.0" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "17.4.0", + "contentHash": "sUx48fu9wgQF1JxzXeSVtzb7KoKpJrdtIzsFamxET3ZYOKXj+Ej13HWZ0U2nuMVZtZVHBmE+KS3Vv5cIdTlycQ==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.4.0", + "Newtonsoft.Json": "13.0.1" + } + }, + "Microsoft.Toolkit.HighPerformance": { + "type": "Transitive", + "resolved": "7.1.2", + "contentHash": "cezzRky0BUJyYmSrcQUcX8qAv90JfUwCqWEbqfWZLHyeANo9/LWgW6y50pqbyc8r8SPXVsu2GNH98fB3VxrnvA==" + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Monai.Deploy.Messaging": { + "type": "Transitive", + "resolved": "0.1.17-rc0020", + "contentHash": "ihL4GnfL/W+4uY+6GF7wtSr2vtA1WLPFYTscITCy1HP1uXDK2aSe76MHJn6m0SA3kA+njUxSpcoO7sFNnNdGGQ==", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Logging": "6.0.0", + "Newtonsoft.Json": "13.0.1", + "System.ComponentModel.Annotations": "5.0.0", + "System.IO.Abstractions": "17.2.3" + } + }, + "Monai.Deploy.Storage": { + "type": "Transitive", + "resolved": "0.2.10", + "contentHash": "qTk/hYUIA1XCohRxG2XcFqoI3gzZTgPyB/DbRyeY4nVZ7lmuzni+KrbHuewTqsmBKt00+2d9YI6gms5oMcTxsQ==", + "dependencies": { + "AWSSDK.SecurityToken": "3.7.100.6", + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Logging": "6.0.0", + "Monai.Deploy.Storage.S3Policy": "0.2.10", + "System.IO.Abstractions": "17.2.3" + } + }, + "Monai.Deploy.Storage.S3Policy": { + "type": "Transitive", + "resolved": "0.2.10", + "contentHash": "uCv90cT8z0qxlLo2Y/biem6vY9+nrD0EJBHTYETYooXp1tnAAt77pvvLx4ygFFzoabUTjdMr9ptYSJOXQ4dAFQ==", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Newtonsoft.Json": "13.0.1" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "NuGet.Frameworks": { + "type": "Transitive", + "resolved": "5.11.0", + "contentHash": "eaiXkUjC4NPcquGWzAGMXjuxvLwc6XGKMptSyOGQeT0X70BUZObuybJFZLA0OfTdueLd3US23NBPTBb6iF3V1Q==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Abstractions": { + "type": "Transitive", + "resolved": "17.2.3", + "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "1.6.0", + "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "OCUK9C/U97+UheVwo+JE+IUcKySUE3Oe+BcHhVtQrvmKSUFLrUDO8B5zEPRL6mBGbczxZp4w1boSck6/fw4dog==", + "dependencies": { + "Microsoft.NETCore.Platforms": "3.0.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "4.7.2", + "contentHash": "iTUgB/WtrZ1sWZs84F2hwyQhiRH6QNjQv2DkwrH+WP6RoFga2Q1m3f9/Q7FG8cck8AdHitQkmkXSY8qylcDmuA==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "4.7.2", + "contentHash": "TcMd95wcrubm9nHvJEQs70rC0H/8omiSGGpU4FQ/ZA1URIqD4pjmFJh2Mfv1yH1eHgJDWTi2hMDXwTET+zOOyg==" + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Channels": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Dataflow": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA==" + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "xunit.abstractions": { + "type": "Transitive", + "resolved": "2.0.3", + "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" + }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "BeO8hEgs/c8Ls2647fPfieMngncvf0D0xYNDfIO59MolxtCtVjFRd6SRc+7tj8VMqkVOuJcnc9eh4ngI2cAmLQ==" + }, + "xunit.assert": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "pxJISOFjn2XTTi1mcDCkRZrTFb9OtRRCtx2kZFNF51GdReLr1ls2rnyxvAS4JO247K3aNtflvh5Q0346K5BROA==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "xunit.core": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "KB4yGCxNqIVyekhJLXtKSEq6BaXVp/JO3mbGVE1hxypZTLEe7h+sTbAhpA+yZW2dPtXTuiW+C1B2oxxHEkrmOw==", + "dependencies": { + "xunit.extensibility.core": "[2.4.2]", + "xunit.extensibility.execution": "[2.4.2]" + } + }, + "xunit.extensibility.core": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "W1BoXTIN1C6kpVSMw25huSet25ky6IAQUNovu3zGOGN/jWnbgSoTyCrlIhmXSg0tH5nEf8q7h3OjNHOjyu5PfA==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "xunit.abstractions": "2.0.3" + } + }, + "xunit.extensibility.execution": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "CZmgcKkwpyo8FlupZdWpJCryrAOWLh1FBPG6gmVZuPQkGQsim/oL4PcP4nfrC2hHgXUFtluvaJ0Sp9PQKUMNpg==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "xunit.extensibility.core": "[2.4.2]" + } + }, + "monai.deploy.informaticsgateway.api": { + "type": "Project", + "dependencies": { + "Macross.Json.Extensions": "3.0.0", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.10", + "Monai.Deploy.InformaticsGateway.Common": "1.0.0", + "Monai.Deploy.Messaging": "0.1.17-rc0020", + "Monai.Deploy.Storage": "0.2.10" + } + }, + "monai.deploy.informaticsgateway.common": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "System.IO.Abstractions": "17.2.3", + "System.Threading.Tasks.Dataflow": "6.0.0", + "fo-dicom": "5.0.3" + } + }, + "monai.deploy.informaticsgateway.configuration": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.2", + "Microsoft.Extensions.Options": "6.0.0", + "Monai.Deploy.InformaticsGateway.Api": "1.0.0", + "Monai.Deploy.InformaticsGateway.Common": "1.0.0", + "Monai.Deploy.Messaging": "0.1.17-rc0020", + "Monai.Deploy.Storage": "0.2.10", + "System.IO.Abstractions": "17.2.3" + } + } + } + } +} \ No newline at end of file diff --git a/src/Configuration/packages.lock.json b/src/Configuration/packages.lock.json new file mode 100644 index 000000000..a82986ab4 --- /dev/null +++ b/src/Configuration/packages.lock.json @@ -0,0 +1,301 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "GitVersion.MsBuild": { + "type": "Direct", + "requested": "[5.10.3, )", + "resolved": "5.10.3", + "contentHash": "UE5+vWL5xG8S/lJSh6w6bYTQxxgFuSSQLql7Czh6gM3Q0Y1XTpjufL9jtv8+xzqsAJIzvrPRyMwdGf3nf/z95Q==" + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Direct", + "requested": "[6.0.2, )", + "resolved": "6.0.2", + "contentHash": "pwXCZKaA7m5wgmCj49dW+H1RPSY7U62SKLTQYCcavf/k3Nyt/WnBgAjG4jMGnwy9rElfAZ2KvxvM5CJzJWG0hg==" + }, + "Microsoft.Extensions.Options": { + "type": "Direct", + "requested": "[6.0.0, )", + "resolved": "6.0.0", + "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Monai.Deploy.Messaging": { + "type": "Direct", + "requested": "[0.1.17-rc0020, )", + "resolved": "0.1.17-rc0020", + "contentHash": "ihL4GnfL/W+4uY+6GF7wtSr2vtA1WLPFYTscITCy1HP1uXDK2aSe76MHJn6m0SA3kA+njUxSpcoO7sFNnNdGGQ==", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Logging": "6.0.0", + "Newtonsoft.Json": "13.0.1", + "System.ComponentModel.Annotations": "5.0.0", + "System.IO.Abstractions": "17.2.3" + } + }, + "Monai.Deploy.Storage": { + "type": "Direct", + "requested": "[0.2.10, )", + "resolved": "0.2.10", + "contentHash": "qTk/hYUIA1XCohRxG2XcFqoI3gzZTgPyB/DbRyeY4nVZ7lmuzni+KrbHuewTqsmBKt00+2d9YI6gms5oMcTxsQ==", + "dependencies": { + "AWSSDK.SecurityToken": "3.7.100.6", + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Logging": "6.0.0", + "Monai.Deploy.Storage.S3Policy": "0.2.10", + "System.IO.Abstractions": "17.2.3" + } + }, + "System.IO.Abstractions": { + "type": "Direct", + "requested": "[17.2.3, )", + "resolved": "17.2.3", + "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + }, + "Ardalis.GuardClauses": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "RemnImQf/BWR8oYqFpdw+hn+b4Q1w+pGujkRiSfjQhMPuiERwGn4UMmQv+6UDE4qbPlnIN+e3e40JkvBhzgfzg==", + "dependencies": { + "JetBrains.Annotations": "2021.3.0" + } + }, + "AWSSDK.Core": { + "type": "Transitive", + "resolved": "3.7.100.6", + "contentHash": "TABd2IP9MUPtoLJ3EouOsZ1RfNqFPz0w7pblWcaXMw8BgaLSH4xWD7uX+0oIhRVs0GalIl3RHZEjOibEGezDUA==" + }, + "AWSSDK.SecurityToken": { + "type": "Transitive", + "resolved": "3.7.100.6", + "contentHash": "8aTiY7DxAkq6kqdipWBJ7O7XDMABPMevJSFYtOxhjjllW8hkwOY3f5R1ff2ZFSRA5H96xsBLLj/66gc+hmVweQ==", + "dependencies": { + "AWSSDK.Core": "[3.7.100.6, 4.0.0)" + } + }, + "fo-dicom": { + "type": "Transitive", + "resolved": "5.0.3", + "contentHash": "OPkCQ9+X/fvGRokAAgjR8bOpai04qlnNHmq+LsgI+Kyug3yar2zk6IMOSSvPOLgWe0EG9ScdqH44AGKnviH5Rw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "Microsoft.Extensions.DependencyInjection": "2.2.0", + "Microsoft.Extensions.Options": "2.2.0", + "Microsoft.Toolkit.HighPerformance": "7.1.2", + "System.Buffers": "4.5.1", + "System.Text.Encoding.CodePages": "4.6.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2", + "System.Threading.Channels": "6.0.0" + } + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "2021.3.0", + "contentHash": "Ddxjs5RRjf+c8m9m++WvhW1lz1bqNhsTjWvCLbQN9bvKbkJeR9MhtfNwKgBRRdG2yLHcXFr5Lf7fsvvkiPaDRg==" + }, + "Macross.Json.Extensions": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "AkNshs6dopj8FXsmkkJxvLivN2SyDJQDbjcds5lo9+Y6L4zpcoXdmzXQ3VVN+AIWQr0CTD5A7vkuHGAr2aypZg==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "yuvf07qFWFqtK3P/MRkEKLhn5r2UbSpVueRziSqj0yJQIKFwG1pq9mOayK3zE5qZCTs0CbrwL9M6R8VwqyGy2w==" + }, + "Microsoft.EntityFrameworkCore.Abstractions": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "3BMwnBB6Bgwd6bjUqx2pOYuHpGBHCJxY3vorRJYX3U2wzrz5q4jNxDZZGsMViFZeJ7PXFIwbgy6rR73J5aalsg==" + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "k6PWQMuoBDGGHOQTtyois2u4AwyVcIwL2LaSLlTZQm2CYcJ1pxbt6jfAnpWmzENA/wfrYRI/X9DTLoUkE4AsLw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + }, + "Microsoft.Extensions.Diagnostics.HealthChecks": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "YmTyFOc7xx2/9FKuAlCmcWYKYLr0bYgNrRlcNPy/vc8qXnxnRV+kua6z96RUXSJVSQadCbJcEjmnTUMTEVfXOQ==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.10", + "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.2", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "U1PO967am1BIWbxBiLcYzVx8KOTYa9NvhBNgTn8Oii3LcsjvIwHzM+GTYy6bTiHnAFAlK5HAjxusAnAHSHJRoA==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.DiagnosticSource": "6.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "TsETIgVJb/AKoYfSP+iCxkuly5d3inZjTdx/ItZLk2CxY85v8083OBS3uai84kK3/baLnS5/b5XGs6zR7SuuHQ==" + }, + "Microsoft.Toolkit.HighPerformance": { + "type": "Transitive", + "resolved": "7.1.2", + "contentHash": "cezzRky0BUJyYmSrcQUcX8qAv90JfUwCqWEbqfWZLHyeANo9/LWgW6y50pqbyc8r8SPXVsu2GNH98fB3VxrnvA==" + }, + "Monai.Deploy.Storage.S3Policy": { + "type": "Transitive", + "resolved": "0.2.10", + "contentHash": "uCv90cT8z0qxlLo2Y/biem6vY9+nrD0EJBHTYETYooXp1tnAAt77pvvLx4ygFFzoabUTjdMr9ptYSJOXQ4dAFQ==", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Newtonsoft.Json": "13.0.1" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "OCUK9C/U97+UheVwo+JE+IUcKySUE3Oe+BcHhVtQrvmKSUFLrUDO8B5zEPRL6mBGbczxZp4w1boSck6/fw4dog==", + "dependencies": { + "Microsoft.NETCore.Platforms": "3.0.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "4.7.2", + "contentHash": "iTUgB/WtrZ1sWZs84F2hwyQhiRH6QNjQv2DkwrH+WP6RoFga2Q1m3f9/Q7FG8cck8AdHitQkmkXSY8qylcDmuA==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "4.7.2", + "contentHash": "TcMd95wcrubm9nHvJEQs70rC0H/8omiSGGpU4FQ/ZA1URIqD4pjmFJh2Mfv1yH1eHgJDWTi2hMDXwTET+zOOyg==" + }, + "System.Threading.Channels": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + }, + "System.Threading.Tasks.Dataflow": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA==" + }, + "monai.deploy.informaticsgateway.api": { + "type": "Project", + "dependencies": { + "Macross.Json.Extensions": "3.0.0", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.10", + "Monai.Deploy.InformaticsGateway.Common": "1.0.0", + "Monai.Deploy.Messaging": "0.1.17-rc0020", + "Monai.Deploy.Storage": "0.2.10" + } + }, + "monai.deploy.informaticsgateway.common": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "System.IO.Abstractions": "17.2.3", + "System.Threading.Tasks.Dataflow": "6.0.0", + "fo-dicom": "5.0.3" + } + } + } + } +} \ No newline at end of file diff --git a/src/Database/Api/Monai.Deploy.InformaticsGateway.Database.Api.csproj b/src/Database/Api/Monai.Deploy.InformaticsGateway.Database.Api.csproj index 9fb905da1..58bee8851 100644 --- a/src/Database/Api/Monai.Deploy.InformaticsGateway.Database.Api.csproj +++ b/src/Database/Api/Monai.Deploy.InformaticsGateway.Database.Api.csproj @@ -21,6 +21,7 @@ net6.0 enable enable + true diff --git a/src/Database/Api/Test/Monai.Deploy.InformaticsGateway.Database.Api.Test.csproj b/src/Database/Api/Test/Monai.Deploy.InformaticsGateway.Database.Api.Test.csproj index d73ad311b..7ae3ec3e5 100644 --- a/src/Database/Api/Test/Monai.Deploy.InformaticsGateway.Database.Api.Test.csproj +++ b/src/Database/Api/Test/Monai.Deploy.InformaticsGateway.Database.Api.Test.csproj @@ -20,8 +20,8 @@ net6.0 enable enable - false + true diff --git a/src/Database/Api/Test/packages.lock.json b/src/Database/Api/Test/packages.lock.json new file mode 100644 index 000000000..7a7c2f185 --- /dev/null +++ b/src/Database/Api/Test/packages.lock.json @@ -0,0 +1,1343 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "coverlet.collector": { + "type": "Direct", + "requested": "[3.2.0, )", + "resolved": "3.2.0", + "contentHash": "xjY8xBigSeWIYs4I7DgUHqSNoGqnHi7Fv7/7RZD02rvZyG3hlsjnQKiVKVWKgr9kRKgmV+dEfu8KScvysiC0Wg==" + }, + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "[17.4.0, )", + "resolved": "17.4.0", + "contentHash": "VtNZQ83ntG2aEUjy1gq6B4HNdn96se6FmdY/03At8WiqDReGrApm6OB2fNiSHz9D6IIEtWtNZ2FSH0RJDVXl/w==", + "dependencies": { + "Microsoft.CodeCoverage": "17.4.0", + "Microsoft.TestPlatform.TestHost": "17.4.0" + } + }, + "xunit": { + "type": "Direct", + "requested": "[2.4.2, )", + "resolved": "2.4.2", + "contentHash": "6Mj73Ont3zj2CJuoykVJfE0ZmRwn7C+pTuRP8c4bnaaTFjwNG6tGe0prJ1yIbMe9AHrpDys63ctWacSsFJWK/w==", + "dependencies": { + "xunit.analyzers": "1.0.0", + "xunit.assert": "2.4.2", + "xunit.core": "[2.4.2]" + } + }, + "xunit.runner.visualstudio": { + "type": "Direct", + "requested": "[2.4.5, )", + "resolved": "2.4.5", + "contentHash": "OwHamvBdUKgqsXfBzWiCW/O98BTx81UKzx2bieIOQI7CZFE5NEQZGi8PBQGIKawDW96xeRffiNf20SjfC0x9hw==" + }, + "Ardalis.GuardClauses": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "RemnImQf/BWR8oYqFpdw+hn+b4Q1w+pGujkRiSfjQhMPuiERwGn4UMmQv+6UDE4qbPlnIN+e3e40JkvBhzgfzg==", + "dependencies": { + "JetBrains.Annotations": "2021.3.0" + } + }, + "AWSSDK.Core": { + "type": "Transitive", + "resolved": "3.7.100.6", + "contentHash": "TABd2IP9MUPtoLJ3EouOsZ1RfNqFPz0w7pblWcaXMw8BgaLSH4xWD7uX+0oIhRVs0GalIl3RHZEjOibEGezDUA==" + }, + "AWSSDK.SecurityToken": { + "type": "Transitive", + "resolved": "3.7.100.6", + "contentHash": "8aTiY7DxAkq6kqdipWBJ7O7XDMABPMevJSFYtOxhjjllW8hkwOY3f5R1ff2ZFSRA5H96xsBLLj/66gc+hmVweQ==", + "dependencies": { + "AWSSDK.Core": "[3.7.100.6, 4.0.0)" + } + }, + "fo-dicom": { + "type": "Transitive", + "resolved": "5.0.3", + "contentHash": "OPkCQ9+X/fvGRokAAgjR8bOpai04qlnNHmq+LsgI+Kyug3yar2zk6IMOSSvPOLgWe0EG9ScdqH44AGKnviH5Rw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "Microsoft.Extensions.DependencyInjection": "2.2.0", + "Microsoft.Extensions.Options": "2.2.0", + "Microsoft.Toolkit.HighPerformance": "7.1.2", + "System.Buffers": "4.5.1", + "System.Text.Encoding.CodePages": "4.6.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2", + "System.Threading.Channels": "6.0.0" + } + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "2021.3.0", + "contentHash": "Ddxjs5RRjf+c8m9m++WvhW1lz1bqNhsTjWvCLbQN9bvKbkJeR9MhtfNwKgBRRdG2yLHcXFr5Lf7fsvvkiPaDRg==" + }, + "Macross.Json.Extensions": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "AkNshs6dopj8FXsmkkJxvLivN2SyDJQDbjcds5lo9+Y6L4zpcoXdmzXQ3VVN+AIWQr0CTD5A7vkuHGAr2aypZg==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "yuvf07qFWFqtK3P/MRkEKLhn5r2UbSpVueRziSqj0yJQIKFwG1pq9mOayK3zE5qZCTs0CbrwL9M6R8VwqyGy2w==" + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.4.0", + "contentHash": "2oZbSVTC2nAvQ2DnbXLlXS+c25ZyZdWeNd+znWwAxwGaPh9dwQ5NBsYyqQB7sKmJKIUdkKGmN3rzFzjVC81Dtg==" + }, + "Microsoft.EntityFrameworkCore": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "aMk8c7XKynkDJM8vnRuVz3VHSLiWy4tWpkvSdrQ4No1DNLdtTI6P3iT2wAPvVkuJsS22Ifs62/Jr6AyveX5b4A==", + "dependencies": { + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.10", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.10", + "Microsoft.Extensions.Caching.Memory": "6.0.1", + "Microsoft.Extensions.DependencyInjection": "6.0.1", + "Microsoft.Extensions.Logging": "6.0.0", + "System.Collections.Immutable": "6.0.0", + "System.Diagnostics.DiagnosticSource": "6.0.0" + } + }, + "Microsoft.EntityFrameworkCore.Abstractions": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "3BMwnBB6Bgwd6bjUqx2pOYuHpGBHCJxY3vorRJYX3U2wzrz5q4jNxDZZGsMViFZeJ7PXFIwbgy6rR73J5aalsg==" + }, + "Microsoft.EntityFrameworkCore.Analyzers": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "b4jKcjo6BLuBRjLTkZPjJCvZ7oa3a798Q1AXSMAknitpBEOEIDryyRd7XZ0cnEIVCvfSND+Trgb00Z4TiTqOvg==" + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "bcz5sSFJbganH0+YrfvIjJDIcKNW7TL07C4d1eTmXy/wOt52iz4LVogJb6pazs7W0+74j0YpXFErvp++Aq5Bsw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "B4y+Cev05eMcjf1na0v9gza6GUtahXbtY1JCypIgx3B4Ea/KAgsWyXEmW4q6zMbmTMtKzmPVk09rvFJirvMwTg==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "vWXPg3HJQIpZkENn1KWq8SfbqVujVD7S7vIAyFXXqK5xkf1Vho+vG0bLBCHxU36lD1cLLtmGpfYf0B3MYFi9tQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + }, + "Microsoft.Extensions.Diagnostics.HealthChecks": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "YmTyFOc7xx2/9FKuAlCmcWYKYLr0bYgNrRlcNPy/vc8qXnxnRV+kua6z96RUXSJVSQadCbJcEjmnTUMTEVfXOQ==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.10", + "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.2", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "U1PO967am1BIWbxBiLcYzVx8KOTYa9NvhBNgTn8Oii3LcsjvIwHzM+GTYy6bTiHnAFAlK5HAjxusAnAHSHJRoA==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.DiagnosticSource": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "6.0.2", + "contentHash": "pwXCZKaA7m5wgmCj49dW+H1RPSY7U62SKLTQYCcavf/k3Nyt/WnBgAjG4jMGnwy9rElfAZ2KvxvM5CJzJWG0hg==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "TsETIgVJb/AKoYfSP+iCxkuly5d3inZjTdx/ItZLk2CxY85v8083OBS3uai84kK3/baLnS5/b5XGs6zR7SuuHQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "17.4.0", + "contentHash": "oWe7A0wrZhxagTOcaxJ9r0NXTbgkiBQQuCpCXxnP06NsGV/qOoaY2oaangAJbOUrwEx0eka1do400NwNCjfytw==", + "dependencies": { + "NuGet.Frameworks": "5.11.0", + "System.Reflection.Metadata": "1.6.0" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "17.4.0", + "contentHash": "sUx48fu9wgQF1JxzXeSVtzb7KoKpJrdtIzsFamxET3ZYOKXj+Ej13HWZ0U2nuMVZtZVHBmE+KS3Vv5cIdTlycQ==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.4.0", + "Newtonsoft.Json": "13.0.1" + } + }, + "Microsoft.Toolkit.HighPerformance": { + "type": "Transitive", + "resolved": "7.1.2", + "contentHash": "cezzRky0BUJyYmSrcQUcX8qAv90JfUwCqWEbqfWZLHyeANo9/LWgW6y50pqbyc8r8SPXVsu2GNH98fB3VxrnvA==" + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Monai.Deploy.Messaging": { + "type": "Transitive", + "resolved": "0.1.17-rc0020", + "contentHash": "ihL4GnfL/W+4uY+6GF7wtSr2vtA1WLPFYTscITCy1HP1uXDK2aSe76MHJn6m0SA3kA+njUxSpcoO7sFNnNdGGQ==", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Logging": "6.0.0", + "Newtonsoft.Json": "13.0.1", + "System.ComponentModel.Annotations": "5.0.0", + "System.IO.Abstractions": "17.2.3" + } + }, + "Monai.Deploy.Storage": { + "type": "Transitive", + "resolved": "0.2.10", + "contentHash": "qTk/hYUIA1XCohRxG2XcFqoI3gzZTgPyB/DbRyeY4nVZ7lmuzni+KrbHuewTqsmBKt00+2d9YI6gms5oMcTxsQ==", + "dependencies": { + "AWSSDK.SecurityToken": "3.7.100.6", + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Logging": "6.0.0", + "Monai.Deploy.Storage.S3Policy": "0.2.10", + "System.IO.Abstractions": "17.2.3" + } + }, + "Monai.Deploy.Storage.S3Policy": { + "type": "Transitive", + "resolved": "0.2.10", + "contentHash": "uCv90cT8z0qxlLo2Y/biem6vY9+nrD0EJBHTYETYooXp1tnAAt77pvvLx4ygFFzoabUTjdMr9ptYSJOXQ4dAFQ==", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Newtonsoft.Json": "13.0.1" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "NuGet.Frameworks": { + "type": "Transitive", + "resolved": "5.11.0", + "contentHash": "eaiXkUjC4NPcquGWzAGMXjuxvLwc6XGKMptSyOGQeT0X70BUZObuybJFZLA0OfTdueLd3US23NBPTBb6iF3V1Q==" + }, + "Polly": { + "type": "Transitive", + "resolved": "7.2.3", + "contentHash": "DeCY0OFbNdNxsjntr1gTXHJ5pKUwYzp04Er2LLeN3g6pWhffsGuKVfMBLe1lw7x76HrPkLxKEFxBlpRxS2nDEQ==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "l4zZJ1WU2hqpQQHXz1rvC3etVZN+2DLmQMO79FhOTZHMn8tDRr+WU287sbomD0BETlmKDn0ygUgVy9k5xkkJdA==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Abstractions": { + "type": "Transitive", + "resolved": "17.2.3", + "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "1.6.0", + "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "OCUK9C/U97+UheVwo+JE+IUcKySUE3Oe+BcHhVtQrvmKSUFLrUDO8B5zEPRL6mBGbczxZp4w1boSck6/fw4dog==", + "dependencies": { + "Microsoft.NETCore.Platforms": "3.0.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "4.7.2", + "contentHash": "iTUgB/WtrZ1sWZs84F2hwyQhiRH6QNjQv2DkwrH+WP6RoFga2Q1m3f9/Q7FG8cck8AdHitQkmkXSY8qylcDmuA==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "4.7.2", + "contentHash": "TcMd95wcrubm9nHvJEQs70rC0H/8omiSGGpU4FQ/ZA1URIqD4pjmFJh2Mfv1yH1eHgJDWTi2hMDXwTET+zOOyg==" + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Channels": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Dataflow": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA==" + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "xunit.abstractions": { + "type": "Transitive", + "resolved": "2.0.3", + "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" + }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "BeO8hEgs/c8Ls2647fPfieMngncvf0D0xYNDfIO59MolxtCtVjFRd6SRc+7tj8VMqkVOuJcnc9eh4ngI2cAmLQ==" + }, + "xunit.assert": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "pxJISOFjn2XTTi1mcDCkRZrTFb9OtRRCtx2kZFNF51GdReLr1ls2rnyxvAS4JO247K3aNtflvh5Q0346K5BROA==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "xunit.core": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "KB4yGCxNqIVyekhJLXtKSEq6BaXVp/JO3mbGVE1hxypZTLEe7h+sTbAhpA+yZW2dPtXTuiW+C1B2oxxHEkrmOw==", + "dependencies": { + "xunit.extensibility.core": "[2.4.2]", + "xunit.extensibility.execution": "[2.4.2]" + } + }, + "xunit.extensibility.core": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "W1BoXTIN1C6kpVSMw25huSet25ky6IAQUNovu3zGOGN/jWnbgSoTyCrlIhmXSg0tH5nEf8q7h3OjNHOjyu5PfA==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "xunit.abstractions": "2.0.3" + } + }, + "xunit.extensibility.execution": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "CZmgcKkwpyo8FlupZdWpJCryrAOWLh1FBPG6gmVZuPQkGQsim/oL4PcP4nfrC2hHgXUFtluvaJ0Sp9PQKUMNpg==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "xunit.extensibility.core": "[2.4.2]" + } + }, + "monai.deploy.informaticsgateway.api": { + "type": "Project", + "dependencies": { + "Macross.Json.Extensions": "3.0.0", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.10", + "Monai.Deploy.InformaticsGateway.Common": "1.0.0", + "Monai.Deploy.Messaging": "0.1.17-rc0020", + "Monai.Deploy.Storage": "0.2.10" + } + }, + "monai.deploy.informaticsgateway.common": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "System.IO.Abstractions": "17.2.3", + "System.Threading.Tasks.Dataflow": "6.0.0", + "fo-dicom": "5.0.3" + } + }, + "monai.deploy.informaticsgateway.configuration": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.2", + "Microsoft.Extensions.Options": "6.0.0", + "Monai.Deploy.InformaticsGateway.Api": "1.0.0", + "Monai.Deploy.InformaticsGateway.Common": "1.0.0", + "Monai.Deploy.Messaging": "0.1.17-rc0020", + "Monai.Deploy.Storage": "0.2.10", + "System.IO.Abstractions": "17.2.3" + } + }, + "monai.deploy.informaticsgateway.database.api": { + "type": "Project", + "dependencies": { + "Microsoft.EntityFrameworkCore": "6.0.10", + "Monai.Deploy.InformaticsGateway.Api": "1.0.0", + "Monai.Deploy.InformaticsGateway.Configuration": "1.0.0", + "Polly": "7.2.3" + } + } + } + } +} \ No newline at end of file diff --git a/src/Database/Api/packages.lock.json b/src/Database/Api/packages.lock.json new file mode 100644 index 000000000..61fe7ea5f --- /dev/null +++ b/src/Database/Api/packages.lock.json @@ -0,0 +1,356 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.EntityFrameworkCore": { + "type": "Direct", + "requested": "[6.0.10, )", + "resolved": "6.0.10", + "contentHash": "aMk8c7XKynkDJM8vnRuVz3VHSLiWy4tWpkvSdrQ4No1DNLdtTI6P3iT2wAPvVkuJsS22Ifs62/Jr6AyveX5b4A==", + "dependencies": { + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.10", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.10", + "Microsoft.Extensions.Caching.Memory": "6.0.1", + "Microsoft.Extensions.DependencyInjection": "6.0.1", + "Microsoft.Extensions.Logging": "6.0.0", + "System.Collections.Immutable": "6.0.0", + "System.Diagnostics.DiagnosticSource": "6.0.0" + } + }, + "Polly": { + "type": "Direct", + "requested": "[7.2.3, )", + "resolved": "7.2.3", + "contentHash": "DeCY0OFbNdNxsjntr1gTXHJ5pKUwYzp04Er2LLeN3g6pWhffsGuKVfMBLe1lw7x76HrPkLxKEFxBlpRxS2nDEQ==" + }, + "Ardalis.GuardClauses": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "RemnImQf/BWR8oYqFpdw+hn+b4Q1w+pGujkRiSfjQhMPuiERwGn4UMmQv+6UDE4qbPlnIN+e3e40JkvBhzgfzg==", + "dependencies": { + "JetBrains.Annotations": "2021.3.0" + } + }, + "AWSSDK.Core": { + "type": "Transitive", + "resolved": "3.7.100.6", + "contentHash": "TABd2IP9MUPtoLJ3EouOsZ1RfNqFPz0w7pblWcaXMw8BgaLSH4xWD7uX+0oIhRVs0GalIl3RHZEjOibEGezDUA==" + }, + "AWSSDK.SecurityToken": { + "type": "Transitive", + "resolved": "3.7.100.6", + "contentHash": "8aTiY7DxAkq6kqdipWBJ7O7XDMABPMevJSFYtOxhjjllW8hkwOY3f5R1ff2ZFSRA5H96xsBLLj/66gc+hmVweQ==", + "dependencies": { + "AWSSDK.Core": "[3.7.100.6, 4.0.0)" + } + }, + "fo-dicom": { + "type": "Transitive", + "resolved": "5.0.3", + "contentHash": "OPkCQ9+X/fvGRokAAgjR8bOpai04qlnNHmq+LsgI+Kyug3yar2zk6IMOSSvPOLgWe0EG9ScdqH44AGKnviH5Rw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "Microsoft.Extensions.DependencyInjection": "2.2.0", + "Microsoft.Extensions.Options": "2.2.0", + "Microsoft.Toolkit.HighPerformance": "7.1.2", + "System.Buffers": "4.5.1", + "System.Text.Encoding.CodePages": "4.6.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2", + "System.Threading.Channels": "6.0.0" + } + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "2021.3.0", + "contentHash": "Ddxjs5RRjf+c8m9m++WvhW1lz1bqNhsTjWvCLbQN9bvKbkJeR9MhtfNwKgBRRdG2yLHcXFr5Lf7fsvvkiPaDRg==" + }, + "Macross.Json.Extensions": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "AkNshs6dopj8FXsmkkJxvLivN2SyDJQDbjcds5lo9+Y6L4zpcoXdmzXQ3VVN+AIWQr0CTD5A7vkuHGAr2aypZg==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "yuvf07qFWFqtK3P/MRkEKLhn5r2UbSpVueRziSqj0yJQIKFwG1pq9mOayK3zE5qZCTs0CbrwL9M6R8VwqyGy2w==" + }, + "Microsoft.EntityFrameworkCore.Abstractions": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "3BMwnBB6Bgwd6bjUqx2pOYuHpGBHCJxY3vorRJYX3U2wzrz5q4jNxDZZGsMViFZeJ7PXFIwbgy6rR73J5aalsg==" + }, + "Microsoft.EntityFrameworkCore.Analyzers": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "b4jKcjo6BLuBRjLTkZPjJCvZ7oa3a798Q1AXSMAknitpBEOEIDryyRd7XZ0cnEIVCvfSND+Trgb00Z4TiTqOvg==" + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "bcz5sSFJbganH0+YrfvIjJDIcKNW7TL07C4d1eTmXy/wOt52iz4LVogJb6pazs7W0+74j0YpXFErvp++Aq5Bsw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "B4y+Cev05eMcjf1na0v9gza6GUtahXbtY1JCypIgx3B4Ea/KAgsWyXEmW4q6zMbmTMtKzmPVk09rvFJirvMwTg==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "vWXPg3HJQIpZkENn1KWq8SfbqVujVD7S7vIAyFXXqK5xkf1Vho+vG0bLBCHxU36lD1cLLtmGpfYf0B3MYFi9tQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + }, + "Microsoft.Extensions.Diagnostics.HealthChecks": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "YmTyFOc7xx2/9FKuAlCmcWYKYLr0bYgNrRlcNPy/vc8qXnxnRV+kua6z96RUXSJVSQadCbJcEjmnTUMTEVfXOQ==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.10", + "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.2", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "U1PO967am1BIWbxBiLcYzVx8KOTYa9NvhBNgTn8Oii3LcsjvIwHzM+GTYy6bTiHnAFAlK5HAjxusAnAHSHJRoA==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.DiagnosticSource": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "6.0.2", + "contentHash": "pwXCZKaA7m5wgmCj49dW+H1RPSY7U62SKLTQYCcavf/k3Nyt/WnBgAjG4jMGnwy9rElfAZ2KvxvM5CJzJWG0hg==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "TsETIgVJb/AKoYfSP+iCxkuly5d3inZjTdx/ItZLk2CxY85v8083OBS3uai84kK3/baLnS5/b5XGs6zR7SuuHQ==" + }, + "Microsoft.Toolkit.HighPerformance": { + "type": "Transitive", + "resolved": "7.1.2", + "contentHash": "cezzRky0BUJyYmSrcQUcX8qAv90JfUwCqWEbqfWZLHyeANo9/LWgW6y50pqbyc8r8SPXVsu2GNH98fB3VxrnvA==" + }, + "Monai.Deploy.Messaging": { + "type": "Transitive", + "resolved": "0.1.17-rc0020", + "contentHash": "ihL4GnfL/W+4uY+6GF7wtSr2vtA1WLPFYTscITCy1HP1uXDK2aSe76MHJn6m0SA3kA+njUxSpcoO7sFNnNdGGQ==", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Logging": "6.0.0", + "Newtonsoft.Json": "13.0.1", + "System.ComponentModel.Annotations": "5.0.0", + "System.IO.Abstractions": "17.2.3" + } + }, + "Monai.Deploy.Storage": { + "type": "Transitive", + "resolved": "0.2.10", + "contentHash": "qTk/hYUIA1XCohRxG2XcFqoI3gzZTgPyB/DbRyeY4nVZ7lmuzni+KrbHuewTqsmBKt00+2d9YI6gms5oMcTxsQ==", + "dependencies": { + "AWSSDK.SecurityToken": "3.7.100.6", + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Logging": "6.0.0", + "Monai.Deploy.Storage.S3Policy": "0.2.10", + "System.IO.Abstractions": "17.2.3" + } + }, + "Monai.Deploy.Storage.S3Policy": { + "type": "Transitive", + "resolved": "0.2.10", + "contentHash": "uCv90cT8z0qxlLo2Y/biem6vY9+nrD0EJBHTYETYooXp1tnAAt77pvvLx4ygFFzoabUTjdMr9ptYSJOXQ4dAFQ==", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Newtonsoft.Json": "13.0.1" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "l4zZJ1WU2hqpQQHXz1rvC3etVZN+2DLmQMO79FhOTZHMn8tDRr+WU287sbomD0BETlmKDn0ygUgVy9k5xkkJdA==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.IO.Abstractions": { + "type": "Transitive", + "resolved": "17.2.3", + "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "OCUK9C/U97+UheVwo+JE+IUcKySUE3Oe+BcHhVtQrvmKSUFLrUDO8B5zEPRL6mBGbczxZp4w1boSck6/fw4dog==", + "dependencies": { + "Microsoft.NETCore.Platforms": "3.0.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "4.7.2", + "contentHash": "iTUgB/WtrZ1sWZs84F2hwyQhiRH6QNjQv2DkwrH+WP6RoFga2Q1m3f9/Q7FG8cck8AdHitQkmkXSY8qylcDmuA==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "4.7.2", + "contentHash": "TcMd95wcrubm9nHvJEQs70rC0H/8omiSGGpU4FQ/ZA1URIqD4pjmFJh2Mfv1yH1eHgJDWTi2hMDXwTET+zOOyg==" + }, + "System.Threading.Channels": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + }, + "System.Threading.Tasks.Dataflow": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA==" + }, + "monai.deploy.informaticsgateway.api": { + "type": "Project", + "dependencies": { + "Macross.Json.Extensions": "3.0.0", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.10", + "Monai.Deploy.InformaticsGateway.Common": "1.0.0", + "Monai.Deploy.Messaging": "0.1.17-rc0020", + "Monai.Deploy.Storage": "0.2.10" + } + }, + "monai.deploy.informaticsgateway.common": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "System.IO.Abstractions": "17.2.3", + "System.Threading.Tasks.Dataflow": "6.0.0", + "fo-dicom": "5.0.3" + } + }, + "monai.deploy.informaticsgateway.configuration": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.2", + "Microsoft.Extensions.Options": "6.0.0", + "Monai.Deploy.InformaticsGateway.Api": "1.0.0", + "Monai.Deploy.InformaticsGateway.Common": "1.0.0", + "Monai.Deploy.Messaging": "0.1.17-rc0020", + "Monai.Deploy.Storage": "0.2.10", + "System.IO.Abstractions": "17.2.3" + } + } + } + } +} \ No newline at end of file diff --git a/src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj b/src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj index 50cf4f1aa..71df0680e 100644 --- a/src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj +++ b/src/Database/EntityFramework/Monai.Deploy.InformaticsGateway.Database.EntityFramework.csproj @@ -23,6 +23,7 @@ enable ..\..\.sonarlint\project-monai_monai-deploy-informatics-gatewaycsharp.ruleset enable + true diff --git a/src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj b/src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj index 532b72237..aadbecde6 100644 --- a/src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj +++ b/src/Database/EntityFramework/Test/Monai.Deploy.InformaticsGateway.Database.EntityFramework.Test.csproj @@ -4,8 +4,8 @@ net6.0 enable enable - false + true diff --git a/src/Database/EntityFramework/Test/packages.lock.json b/src/Database/EntityFramework/Test/packages.lock.json new file mode 100644 index 000000000..9ce1ba443 --- /dev/null +++ b/src/Database/EntityFramework/Test/packages.lock.json @@ -0,0 +1,1517 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "coverlet.collector": { + "type": "Direct", + "requested": "[3.1.2, )", + "resolved": "3.1.2", + "contentHash": "wuLDIDKD5XMt0A7lE31JPenT7QQwZPFkP5rRpdJeblyXZ9MGLI8rYjvm5fvAKln+2/X+4IxxQDxBtwdrqKNLZw==" + }, + "Microsoft.EntityFrameworkCore.InMemory": { + "type": "Direct", + "requested": "[6.0.11, )", + "resolved": "6.0.11", + "contentHash": "2h5Pyy5e5EJhvMVl1UGPTLst1Q/+8rwEIvjsFwQDrsOmbsgzlbkvCJM2K89wvjA3UKAn5nTyRxCzKu9MMaJYkg==", + "dependencies": { + "Microsoft.EntityFrameworkCore": "6.0.11" + } + }, + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "[17.1.0, )", + "resolved": "17.1.0", + "contentHash": "MVKvOsHIfrZrvg+8aqOF5dknO/qWrR1sWZjMPQ1N42MKMlL/zQL30FQFZxPeWfmVKWUWAOmAHYsqB5OerTKziw==", + "dependencies": { + "Microsoft.CodeCoverage": "17.1.0", + "Microsoft.TestPlatform.TestHost": "17.1.0" + } + }, + "Moq": { + "type": "Direct", + "requested": "[4.18.2, )", + "resolved": "4.18.2", + "contentHash": "SjxKYS5nX6prcaT8ZjbkONh3vnh0Rxru09+gQ1a07v4TM530Oe/jq3Q4dOZPfo1wq0LYmTgLOZKrqRfEx4auPw==", + "dependencies": { + "Castle.Core": "5.1.0" + } + }, + "xunit": { + "type": "Direct", + "requested": "[2.4.1, )", + "resolved": "2.4.1", + "contentHash": "XNR3Yz9QTtec16O0aKcO6+baVNpXmOnPUxDkCY97J+8krUYxPvXT1szYYEUdKk4sB8GOI2YbAjRIOm8ZnXRfzQ==", + "dependencies": { + "xunit.analyzers": "0.10.0", + "xunit.assert": "[2.4.1]", + "xunit.core": "[2.4.1]" + } + }, + "xunit.runner.visualstudio": { + "type": "Direct", + "requested": "[2.4.3, )", + "resolved": "2.4.3", + "contentHash": "kZZSmOmKA8OBlAJaquPXnJJLM9RwQ27H7BMVqfMLUcTi9xHinWGJiWksa3D4NEtz0wZ/nxd2mogObvBgJKCRhQ==" + }, + "Ardalis.GuardClauses": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "RemnImQf/BWR8oYqFpdw+hn+b4Q1w+pGujkRiSfjQhMPuiERwGn4UMmQv+6UDE4qbPlnIN+e3e40JkvBhzgfzg==", + "dependencies": { + "JetBrains.Annotations": "2021.3.0" + } + }, + "AWSSDK.Core": { + "type": "Transitive", + "resolved": "3.7.100.6", + "contentHash": "TABd2IP9MUPtoLJ3EouOsZ1RfNqFPz0w7pblWcaXMw8BgaLSH4xWD7uX+0oIhRVs0GalIl3RHZEjOibEGezDUA==" + }, + "AWSSDK.SecurityToken": { + "type": "Transitive", + "resolved": "3.7.100.6", + "contentHash": "8aTiY7DxAkq6kqdipWBJ7O7XDMABPMevJSFYtOxhjjllW8hkwOY3f5R1ff2ZFSRA5H96xsBLLj/66gc+hmVweQ==", + "dependencies": { + "AWSSDK.Core": "[3.7.100.6, 4.0.0)" + } + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.0", + "contentHash": "31UJpTHOiWq95CDOHazE3Ub/hE/PydNWsJMwnEVTqFFP4WhAugwpaVGxzOxKgNeSUUeqS2W6lxV+q7u1pAOfXg==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "fo-dicom": { + "type": "Transitive", + "resolved": "5.0.3", + "contentHash": "OPkCQ9+X/fvGRokAAgjR8bOpai04qlnNHmq+LsgI+Kyug3yar2zk6IMOSSvPOLgWe0EG9ScdqH44AGKnviH5Rw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "Microsoft.Extensions.DependencyInjection": "2.2.0", + "Microsoft.Extensions.Options": "2.2.0", + "Microsoft.Toolkit.HighPerformance": "7.1.2", + "System.Buffers": "4.5.1", + "System.Text.Encoding.CodePages": "4.6.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2", + "System.Threading.Channels": "6.0.0" + } + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "2021.3.0", + "contentHash": "Ddxjs5RRjf+c8m9m++WvhW1lz1bqNhsTjWvCLbQN9bvKbkJeR9MhtfNwKgBRRdG2yLHcXFr5Lf7fsvvkiPaDRg==" + }, + "Macross.Json.Extensions": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "AkNshs6dopj8FXsmkkJxvLivN2SyDJQDbjcds5lo9+Y6L4zpcoXdmzXQ3VVN+AIWQr0CTD5A7vkuHGAr2aypZg==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "yuvf07qFWFqtK3P/MRkEKLhn5r2UbSpVueRziSqj0yJQIKFwG1pq9mOayK3zE5qZCTs0CbrwL9M6R8VwqyGy2w==" + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.1.0", + "contentHash": "0N/ZJ71ncCxQWhgtkEYKOgu2oMHa8h1tsOUbhmIKXF8UwtSUCe4vHAsJ3DVcNWRwNfQzSTy263ZE+QF6MdIhhQ==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "TWUjLTzSeENkEChqWrcaAzIrD9i5M2l2qrWDI00lC38xBPUuK1Qf57ZywO+dwmr2S3yS0VUPvpdpqCrq60QaRw==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.EntityFrameworkCore": { + "type": "Transitive", + "resolved": "6.0.11", + "contentHash": "eUsIZ52uBJFCr/OUL1EHp0BAwdkfHFVGMyXYrkGUjkSWtPd751wgFzgWBstxOQYzUEyKtz1/wC72S8Db0vPvsg==", + "dependencies": { + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.11", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.11", + "Microsoft.Extensions.Caching.Memory": "6.0.1", + "Microsoft.Extensions.DependencyInjection": "6.0.1", + "Microsoft.Extensions.Logging": "6.0.0", + "System.Collections.Immutable": "6.0.0", + "System.Diagnostics.DiagnosticSource": "6.0.0" + } + }, + "Microsoft.EntityFrameworkCore.Abstractions": { + "type": "Transitive", + "resolved": "6.0.11", + "contentHash": "KJCJjFMZFGYy0G8a8ZUwAe9n/l6P+dP3i4fQJmR4jR0/EFnlfeNeWh8n6nRhP+9YmNz290twaIZSbRoiGU6S2A==" + }, + "Microsoft.EntityFrameworkCore.Analyzers": { + "type": "Transitive", + "resolved": "6.0.11", + "contentHash": "xke0hphu+BSBwt6Kfv/XERe3s1G7BZjNUByyNj0oIZVD1KPaIhMQJBKHtblkCI04cMnO1Ac2NMEgO67rM+cP/w==" + }, + "Microsoft.EntityFrameworkCore.Relational": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "8rjVzKtGSTojSefghXqh3Y2wq8A7P7iWuUQQyQieXNYrYA7nw2aHZI2rjU+7ta4jHgKITddUHFaPQJ69H18dQA==", + "dependencies": { + "Microsoft.EntityFrameworkCore": "6.0.10", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, + "Microsoft.EntityFrameworkCore.Sqlite": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "JWoqE8TMKg+SwMmig3UPsC1Fg00JQ3dyPpr64VuYlnaags+1eJ5gAYJ38CHdxSGIQQouUv7fK3rfuoKfFc5kiA==", + "dependencies": { + "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.10", + "SQLitePCLRaw.bundle_e_sqlite3": "2.0.6" + } + }, + "Microsoft.EntityFrameworkCore.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "5aynyix0/bvGlmlX3ude/ctTJ0t/styV3Cmd9BR9ujb0vlU8WuFxJqriVhuRnCLS9I7+vBgSh7FWdxWz8cHi3A==", + "dependencies": { + "Microsoft.Data.Sqlite.Core": "6.0.10", + "Microsoft.EntityFrameworkCore.Relational": "6.0.10", + "Microsoft.Extensions.DependencyModel": "6.0.0" + } + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "bcz5sSFJbganH0+YrfvIjJDIcKNW7TL07C4d1eTmXy/wOt52iz4LVogJb6pazs7W0+74j0YpXFErvp++Aq5Bsw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "B4y+Cev05eMcjf1na0v9gza6GUtahXbtY1JCypIgx3B4Ea/KAgsWyXEmW4q6zMbmTMtKzmPVk09rvFJirvMwTg==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "V4Dth2cYMZpw3HhGw9XUDIijpI6gN+22LDt0AhufIgOppCUfpWX4483OmN+dFXRJkJLc8Tv0Q8QK+1ingT2+KQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "GJGery6QytCzS/BxJ96klgG9in3uH26KcUBbiVG/coNDXCRq6LGVVlUT4vXq34KPuM+R2av+LeYdX9h4IZOCUg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "vWXPg3HJQIpZkENn1KWq8SfbqVujVD7S7vIAyFXXqK5xkf1Vho+vG0bLBCHxU36lD1cLLtmGpfYf0B3MYFi9tQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Memory": "4.5.4", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "YmTyFOc7xx2/9FKuAlCmcWYKYLr0bYgNrRlcNPy/vc8qXnxnRV+kua6z96RUXSJVSQadCbJcEjmnTUMTEVfXOQ==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.10", + "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.2", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "U1PO967am1BIWbxBiLcYzVx8KOTYa9NvhBNgTn8Oii3LcsjvIwHzM+GTYy6bTiHnAFAlK5HAjxusAnAHSHJRoA==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "QvkL7l0nM8udt3gfyu0Vw8bbCXblxaKOl7c2oBfgGy4LCURRaL9XWZX1FWJrQc43oMokVneVxH38iz+bY1sbhg==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.DiagnosticSource": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "6.0.2", + "contentHash": "pwXCZKaA7m5wgmCj49dW+H1RPSY7U62SKLTQYCcavf/k3Nyt/WnBgAjG4jMGnwy9rElfAZ2KvxvM5CJzJWG0hg==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "TsETIgVJb/AKoYfSP+iCxkuly5d3inZjTdx/ItZLk2CxY85v8083OBS3uai84kK3/baLnS5/b5XGs6zR7SuuHQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "17.1.0", + "contentHash": "OMo/FYnKGy3lZEK0gfitskRM3ga/YBt6MyCyFPq0xNLeybGOQ6HnYNAAvzyePo5WPuMiw3LX+HiuRWNjnas1fA==", + "dependencies": { + "NuGet.Frameworks": "5.11.0", + "System.Reflection.Metadata": "1.6.0" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "17.1.0", + "contentHash": "JS0JDLniDhIzkSPLHz7N/x1CG8ywJOtwInFDYA3KQvbz+ojGoT5MT2YDVReL1b86zmNRV8339vsTSm/zh0RcMg==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.1.0", + "Newtonsoft.Json": "9.0.1" + } + }, + "Microsoft.Toolkit.HighPerformance": { + "type": "Transitive", + "resolved": "7.1.2", + "contentHash": "cezzRky0BUJyYmSrcQUcX8qAv90JfUwCqWEbqfWZLHyeANo9/LWgW6y50pqbyc8r8SPXVsu2GNH98fB3VxrnvA==" + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "Monai.Deploy.Messaging": { + "type": "Transitive", + "resolved": "0.1.17-rc0020", + "contentHash": "ihL4GnfL/W+4uY+6GF7wtSr2vtA1WLPFYTscITCy1HP1uXDK2aSe76MHJn6m0SA3kA+njUxSpcoO7sFNnNdGGQ==", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Logging": "6.0.0", + "Newtonsoft.Json": "13.0.1", + "System.ComponentModel.Annotations": "5.0.0", + "System.IO.Abstractions": "17.2.3" + } + }, + "Monai.Deploy.Storage": { + "type": "Transitive", + "resolved": "0.2.10", + "contentHash": "qTk/hYUIA1XCohRxG2XcFqoI3gzZTgPyB/DbRyeY4nVZ7lmuzni+KrbHuewTqsmBKt00+2d9YI6gms5oMcTxsQ==", + "dependencies": { + "AWSSDK.SecurityToken": "3.7.100.6", + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Logging": "6.0.0", + "Monai.Deploy.Storage.S3Policy": "0.2.10", + "System.IO.Abstractions": "17.2.3" + } + }, + "Monai.Deploy.Storage.S3Policy": { + "type": "Transitive", + "resolved": "0.2.10", + "contentHash": "uCv90cT8z0qxlLo2Y/biem6vY9+nrD0EJBHTYETYooXp1tnAAt77pvvLx4ygFFzoabUTjdMr9ptYSJOXQ4dAFQ==", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Newtonsoft.Json": "13.0.1" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "NuGet.Frameworks": { + "type": "Transitive", + "resolved": "5.11.0", + "contentHash": "eaiXkUjC4NPcquGWzAGMXjuxvLwc6XGKMptSyOGQeT0X70BUZObuybJFZLA0OfTdueLd3US23NBPTBb6iF3V1Q==" + }, + "Polly": { + "type": "Transitive", + "resolved": "7.2.3", + "contentHash": "DeCY0OFbNdNxsjntr1gTXHJ5pKUwYzp04Er2LLeN3g6pWhffsGuKVfMBLe1lw7x76HrPkLxKEFxBlpRxS2nDEQ==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "l4zZJ1WU2hqpQQHXz1rvC3etVZN+2DLmQMO79FhOTZHMn8tDRr+WU287sbomD0BETlmKDn0ygUgVy9k5xkkJdA==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Abstractions": { + "type": "Transitive", + "resolved": "17.2.3", + "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "1.6.0", + "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "OCUK9C/U97+UheVwo+JE+IUcKySUE3Oe+BcHhVtQrvmKSUFLrUDO8B5zEPRL6mBGbczxZp4w1boSck6/fw4dog==", + "dependencies": { + "Microsoft.NETCore.Platforms": "3.0.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "zaJsHfESQvJ11vbXnNlkrR46IaMULk/gHxYsJphzSF+07kTjPHv+Oc14w6QEOfo3Q4hqLJgStUaYB9DBl0TmWg==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Channels": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Dataflow": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA==" + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "xunit.abstractions": { + "type": "Transitive", + "resolved": "2.0.3", + "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" + }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "0.10.0", + "contentHash": "4/IDFCJfIeg6bix9apmUtIMwvOsiwqdEexeO/R2D4GReIGPLIRODTpId/l4LRSrAJk9lEO3Zx1H0Zx6uohJDNg==" + }, + "xunit.assert": { + "type": "Transitive", + "resolved": "2.4.1", + "contentHash": "O/Oe0BS5RmSsM+LQOb041TzuPo5MdH2Rov+qXGS37X+KFG1Hxz7kopYklM5+1Y+tRGeXrOx5+Xne1RuqLFQoyQ==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "xunit.core": { + "type": "Transitive", + "resolved": "2.4.1", + "contentHash": "Zsj5OMU6JasNGERXZy8s72+pcheG6Q15atS5XpZXqAtULuyQiQ6XNnUsp1gyfC6WgqScqMvySiEHmHcOG6Eg0Q==", + "dependencies": { + "xunit.extensibility.core": "[2.4.1]", + "xunit.extensibility.execution": "[2.4.1]" + } + }, + "xunit.extensibility.core": { + "type": "Transitive", + "resolved": "2.4.1", + "contentHash": "yKZKm/8QNZnBnGZFD9SewkllHBiK0DThybQD/G4PiAmQjKtEZyHi6ET70QPU9KtSMJGRYS6Syk7EyR2EVDU4Kg==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "xunit.abstractions": "2.0.3" + } + }, + "xunit.extensibility.execution": { + "type": "Transitive", + "resolved": "2.4.1", + "contentHash": "7e/1jqBpcb7frLkB6XDrHCGXAbKN4Rtdb88epYxCSRQuZDRW8UtTfdTEVpdTl8s4T56e07hOBVd4G0OdCxIY2A==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "xunit.extensibility.core": "[2.4.1]" + } + }, + "monai.deploy.informaticsgateway.api": { + "type": "Project", + "dependencies": { + "Macross.Json.Extensions": "3.0.0", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.10", + "Monai.Deploy.InformaticsGateway.Common": "1.0.0", + "Monai.Deploy.Messaging": "0.1.17-rc0020", + "Monai.Deploy.Storage": "0.2.10" + } + }, + "monai.deploy.informaticsgateway.common": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "System.IO.Abstractions": "17.2.3", + "System.Threading.Tasks.Dataflow": "6.0.0", + "fo-dicom": "5.0.3" + } + }, + "monai.deploy.informaticsgateway.configuration": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.2", + "Microsoft.Extensions.Options": "6.0.0", + "Monai.Deploy.InformaticsGateway.Api": "1.0.0", + "Monai.Deploy.InformaticsGateway.Common": "1.0.0", + "Monai.Deploy.Messaging": "0.1.17-rc0020", + "Monai.Deploy.Storage": "0.2.10", + "System.IO.Abstractions": "17.2.3" + } + }, + "monai.deploy.informaticsgateway.database.api": { + "type": "Project", + "dependencies": { + "Microsoft.EntityFrameworkCore": "6.0.10", + "Monai.Deploy.InformaticsGateway.Api": "1.0.0", + "Monai.Deploy.InformaticsGateway.Configuration": "1.0.0", + "Polly": "7.2.3" + } + }, + "monai.deploy.informaticsgateway.database.entityframework": { + "type": "Project", + "dependencies": { + "Microsoft.EntityFrameworkCore": "6.0.10", + "Microsoft.EntityFrameworkCore.Sqlite": "6.0.10", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Monai.Deploy.InformaticsGateway.Api": "1.0.0", + "Monai.Deploy.InformaticsGateway.Configuration": "1.0.0", + "Monai.Deploy.InformaticsGateway.Database.Api": "1.0.0" + } + } + } + } +} \ No newline at end of file diff --git a/src/Database/EntityFramework/packages.lock.json b/src/Database/EntityFramework/packages.lock.json new file mode 100644 index 000000000..823bdfbaa --- /dev/null +++ b/src/Database/EntityFramework/packages.lock.json @@ -0,0 +1,513 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Microsoft.EntityFrameworkCore": { + "type": "Direct", + "requested": "[6.0.10, )", + "resolved": "6.0.10", + "contentHash": "aMk8c7XKynkDJM8vnRuVz3VHSLiWy4tWpkvSdrQ4No1DNLdtTI6P3iT2wAPvVkuJsS22Ifs62/Jr6AyveX5b4A==", + "dependencies": { + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.10", + "Microsoft.EntityFrameworkCore.Analyzers": "6.0.10", + "Microsoft.Extensions.Caching.Memory": "6.0.1", + "Microsoft.Extensions.DependencyInjection": "6.0.1", + "Microsoft.Extensions.Logging": "6.0.0", + "System.Collections.Immutable": "6.0.0", + "System.Diagnostics.DiagnosticSource": "6.0.0" + } + }, + "Microsoft.EntityFrameworkCore.Design": { + "type": "Direct", + "requested": "[6.0.10, )", + "resolved": "6.0.10", + "contentHash": "SVqDfUftgBoKCMPfTaWXiKBZPHMjbiBJLE5WE7MeD28nTk7CkmUNX8eXyNIeWxpDuk4r0zZ6XG9zyG7Ef3KS4A==", + "dependencies": { + "Humanizer.Core": "2.8.26", + "Microsoft.EntityFrameworkCore.Relational": "6.0.10" + } + }, + "Microsoft.EntityFrameworkCore.Sqlite": { + "type": "Direct", + "requested": "[6.0.10, )", + "resolved": "6.0.10", + "contentHash": "JWoqE8TMKg+SwMmig3UPsC1Fg00JQ3dyPpr64VuYlnaags+1eJ5gAYJ38CHdxSGIQQouUv7fK3rfuoKfFc5kiA==", + "dependencies": { + "Microsoft.EntityFrameworkCore.Sqlite.Core": "6.0.10", + "SQLitePCLRaw.bundle_e_sqlite3": "2.0.6" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Direct", + "requested": "[6.0.1, )", + "resolved": "6.0.1", + "contentHash": "BUyFU9t+HzlSE7ri4B+AQN2BgTgHv/uM82s5ZkgU1BApyzWzIl48nDsG5wR1t0pniNuuyTBzG3qCW8152/NtSw==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Direct", + "requested": "[6.0.0, )", + "resolved": "6.0.0", + "contentHash": "V4Dth2cYMZpw3HhGw9XUDIijpI6gN+22LDt0AhufIgOppCUfpWX4483OmN+dFXRJkJLc8Tv0Q8QK+1ingT2+KQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Direct", + "requested": "[6.0.0, )", + "resolved": "6.0.0", + "contentHash": "GJGery6QytCzS/BxJ96klgG9in3uH26KcUBbiVG/coNDXCRq6LGVVlUT4vXq34KPuM+R2av+LeYdX9h4IZOCUg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Ardalis.GuardClauses": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "RemnImQf/BWR8oYqFpdw+hn+b4Q1w+pGujkRiSfjQhMPuiERwGn4UMmQv+6UDE4qbPlnIN+e3e40JkvBhzgfzg==", + "dependencies": { + "JetBrains.Annotations": "2021.3.0" + } + }, + "AWSSDK.Core": { + "type": "Transitive", + "resolved": "3.7.100.6", + "contentHash": "TABd2IP9MUPtoLJ3EouOsZ1RfNqFPz0w7pblWcaXMw8BgaLSH4xWD7uX+0oIhRVs0GalIl3RHZEjOibEGezDUA==" + }, + "AWSSDK.SecurityToken": { + "type": "Transitive", + "resolved": "3.7.100.6", + "contentHash": "8aTiY7DxAkq6kqdipWBJ7O7XDMABPMevJSFYtOxhjjllW8hkwOY3f5R1ff2ZFSRA5H96xsBLLj/66gc+hmVweQ==", + "dependencies": { + "AWSSDK.Core": "[3.7.100.6, 4.0.0)" + } + }, + "fo-dicom": { + "type": "Transitive", + "resolved": "5.0.3", + "contentHash": "OPkCQ9+X/fvGRokAAgjR8bOpai04qlnNHmq+LsgI+Kyug3yar2zk6IMOSSvPOLgWe0EG9ScdqH44AGKnviH5Rw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "Microsoft.Extensions.DependencyInjection": "2.2.0", + "Microsoft.Extensions.Options": "2.2.0", + "Microsoft.Toolkit.HighPerformance": "7.1.2", + "System.Buffers": "4.5.1", + "System.Text.Encoding.CodePages": "4.6.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2", + "System.Threading.Channels": "6.0.0" + } + }, + "Humanizer.Core": { + "type": "Transitive", + "resolved": "2.8.26", + "contentHash": "OiKusGL20vby4uDEswj2IgkdchC1yQ6rwbIkZDVBPIR6al2b7n3pC91elBul9q33KaBgRKhbZH3+2Ur4fnWx2A==" + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "2021.3.0", + "contentHash": "Ddxjs5RRjf+c8m9m++WvhW1lz1bqNhsTjWvCLbQN9bvKbkJeR9MhtfNwKgBRRdG2yLHcXFr5Lf7fsvvkiPaDRg==" + }, + "Macross.Json.Extensions": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "AkNshs6dopj8FXsmkkJxvLivN2SyDJQDbjcds5lo9+Y6L4zpcoXdmzXQ3VVN+AIWQr0CTD5A7vkuHGAr2aypZg==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "1.1.1", + "contentHash": "yuvf07qFWFqtK3P/MRkEKLhn5r2UbSpVueRziSqj0yJQIKFwG1pq9mOayK3zE5qZCTs0CbrwL9M6R8VwqyGy2w==" + }, + "Microsoft.Data.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "TWUjLTzSeENkEChqWrcaAzIrD9i5M2l2qrWDI00lC38xBPUuK1Qf57ZywO+dwmr2S3yS0VUPvpdpqCrq60QaRw==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "Microsoft.EntityFrameworkCore.Abstractions": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "3BMwnBB6Bgwd6bjUqx2pOYuHpGBHCJxY3vorRJYX3U2wzrz5q4jNxDZZGsMViFZeJ7PXFIwbgy6rR73J5aalsg==" + }, + "Microsoft.EntityFrameworkCore.Analyzers": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "b4jKcjo6BLuBRjLTkZPjJCvZ7oa3a798Q1AXSMAknitpBEOEIDryyRd7XZ0cnEIVCvfSND+Trgb00Z4TiTqOvg==" + }, + "Microsoft.EntityFrameworkCore.Relational": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "8rjVzKtGSTojSefghXqh3Y2wq8A7P7iWuUQQyQieXNYrYA7nw2aHZI2rjU+7ta4jHgKITddUHFaPQJ69H18dQA==", + "dependencies": { + "Microsoft.EntityFrameworkCore": "6.0.10", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, + "Microsoft.EntityFrameworkCore.Sqlite.Core": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "5aynyix0/bvGlmlX3ude/ctTJ0t/styV3Cmd9BR9ujb0vlU8WuFxJqriVhuRnCLS9I7+vBgSh7FWdxWz8cHi3A==", + "dependencies": { + "Microsoft.Data.Sqlite.Core": "6.0.10", + "Microsoft.EntityFrameworkCore.Relational": "6.0.10", + "Microsoft.Extensions.DependencyModel": "6.0.0" + } + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "bcz5sSFJbganH0+YrfvIjJDIcKNW7TL07C4d1eTmXy/wOt52iz4LVogJb6pazs7W0+74j0YpXFErvp++Aq5Bsw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "B4y+Cev05eMcjf1na0v9gza6GUtahXbtY1JCypIgx3B4Ea/KAgsWyXEmW4q6zMbmTMtKzmPVk09rvFJirvMwTg==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "vWXPg3HJQIpZkENn1KWq8SfbqVujVD7S7vIAyFXXqK5xkf1Vho+vG0bLBCHxU36lD1cLLtmGpfYf0B3MYFi9tQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg==", + "dependencies": { + "System.Buffers": "4.5.1", + "System.Memory": "4.5.4", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "YmTyFOc7xx2/9FKuAlCmcWYKYLr0bYgNrRlcNPy/vc8qXnxnRV+kua6z96RUXSJVSQadCbJcEjmnTUMTEVfXOQ==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "6.0.10", + "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.2", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { + "type": "Transitive", + "resolved": "6.0.10", + "contentHash": "U1PO967am1BIWbxBiLcYzVx8KOTYa9NvhBNgTn8Oii3LcsjvIwHzM+GTYy6bTiHnAFAlK5HAjxusAnAHSHJRoA==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "QvkL7l0nM8udt3gfyu0Vw8bbCXblxaKOl7c2oBfgGy4LCURRaL9XWZX1FWJrQc43oMokVneVxH38iz+bY1sbhg==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.DiagnosticSource": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "6.0.2", + "contentHash": "pwXCZKaA7m5wgmCj49dW+H1RPSY7U62SKLTQYCcavf/k3Nyt/WnBgAjG4jMGnwy9rElfAZ2KvxvM5CJzJWG0hg==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "TsETIgVJb/AKoYfSP+iCxkuly5d3inZjTdx/ItZLk2CxY85v8083OBS3uai84kK3/baLnS5/b5XGs6zR7SuuHQ==" + }, + "Microsoft.Toolkit.HighPerformance": { + "type": "Transitive", + "resolved": "7.1.2", + "contentHash": "cezzRky0BUJyYmSrcQUcX8qAv90JfUwCqWEbqfWZLHyeANo9/LWgW6y50pqbyc8r8SPXVsu2GNH98fB3VxrnvA==" + }, + "Monai.Deploy.Messaging": { + "type": "Transitive", + "resolved": "0.1.17-rc0020", + "contentHash": "ihL4GnfL/W+4uY+6GF7wtSr2vtA1WLPFYTscITCy1HP1uXDK2aSe76MHJn6m0SA3kA+njUxSpcoO7sFNnNdGGQ==", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Logging": "6.0.0", + "Newtonsoft.Json": "13.0.1", + "System.ComponentModel.Annotations": "5.0.0", + "System.IO.Abstractions": "17.2.3" + } + }, + "Monai.Deploy.Storage": { + "type": "Transitive", + "resolved": "0.2.10", + "contentHash": "qTk/hYUIA1XCohRxG2XcFqoI3gzZTgPyB/DbRyeY4nVZ7lmuzni+KrbHuewTqsmBKt00+2d9YI6gms5oMcTxsQ==", + "dependencies": { + "AWSSDK.SecurityToken": "3.7.100.6", + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.Extensions.Configuration": "6.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks": "6.0.10", + "Microsoft.Extensions.Logging": "6.0.0", + "Monai.Deploy.Storage.S3Policy": "0.2.10", + "System.IO.Abstractions": "17.2.3" + } + }, + "Monai.Deploy.Storage.S3Policy": { + "type": "Transitive", + "resolved": "0.2.10", + "contentHash": "uCv90cT8z0qxlLo2Y/biem6vY9+nrD0EJBHTYETYooXp1tnAAt77pvvLx4ygFFzoabUTjdMr9ptYSJOXQ4dAFQ==", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Newtonsoft.Json": "13.0.1" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "Polly": { + "type": "Transitive", + "resolved": "7.2.3", + "contentHash": "DeCY0OFbNdNxsjntr1gTXHJ5pKUwYzp04Er2LLeN3g6pWhffsGuKVfMBLe1lw7x76HrPkLxKEFxBlpRxS2nDEQ==" + }, + "SQLitePCLRaw.bundle_e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6", + "SQLitePCLRaw.lib.e_sqlite3": "2.0.6", + "SQLitePCLRaw.provider.e_sqlite3": "2.0.6" + } + }, + "SQLitePCLRaw.core": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA==", + "dependencies": { + "System.Memory": "4.5.3" + } + }, + "SQLitePCLRaw.lib.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg==" + }, + "SQLitePCLRaw.provider.e_sqlite3": { + "type": "Transitive", + "resolved": "2.0.6", + "contentHash": "peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg==", + "dependencies": { + "SQLitePCLRaw.core": "2.0.6" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "l4zZJ1WU2hqpQQHXz1rvC3etVZN+2DLmQMO79FhOTZHMn8tDRr+WU287sbomD0BETlmKDn0ygUgVy9k5xkkJdA==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.IO.Abstractions": { + "type": "Transitive", + "resolved": "17.2.3", + "contentHash": "VcozGeE4SxIo0cnXrDHhbrh/Gb8KQnZ3BvMelvh+iw0PrIKtuuA46U2Xm4e4pgnaWFgT4RdZfTpWl/WPRdw0WQ==" + }, + "System.Memory": { + "type": "Transitive", + "resolved": "4.5.4", + "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==" + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "OCUK9C/U97+UheVwo+JE+IUcKySUE3Oe+BcHhVtQrvmKSUFLrUDO8B5zEPRL6mBGbczxZp4w1boSck6/fw4dog==", + "dependencies": { + "Microsoft.NETCore.Platforms": "3.0.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "zaJsHfESQvJ11vbXnNlkrR46IaMULk/gHxYsJphzSF+07kTjPHv+Oc14w6QEOfo3Q4hqLJgStUaYB9DBl0TmWg==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0" + } + }, + "System.Threading.Channels": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + }, + "System.Threading.Tasks.Dataflow": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "+tyDCU3/B1lDdOOAJywHQoFwyXIUghIaP2BxG79uvhfTnO+D9qIgjVlL/JV2NTliYbMHpd6eKDmHp2VHpij7MA==" + }, + "monai.deploy.informaticsgateway.api": { + "type": "Project", + "dependencies": { + "Macross.Json.Extensions": "3.0.0", + "Microsoft.EntityFrameworkCore.Abstractions": "6.0.10", + "Monai.Deploy.InformaticsGateway.Common": "1.0.0", + "Monai.Deploy.Messaging": "0.1.17-rc0020", + "Monai.Deploy.Storage": "0.2.10" + } + }, + "monai.deploy.informaticsgateway.common": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "System.IO.Abstractions": "17.2.3", + "System.Threading.Tasks.Dataflow": "6.0.0", + "fo-dicom": "5.0.3" + } + }, + "monai.deploy.informaticsgateway.configuration": { + "type": "Project", + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "6.0.2", + "Microsoft.Extensions.Options": "6.0.0", + "Monai.Deploy.InformaticsGateway.Api": "1.0.0", + "Monai.Deploy.InformaticsGateway.Common": "1.0.0", + "Monai.Deploy.Messaging": "0.1.17-rc0020", + "Monai.Deploy.Storage": "0.2.10", + "System.IO.Abstractions": "17.2.3" + } + }, + "monai.deploy.informaticsgateway.database.api": { + "type": "Project", + "dependencies": { + "Microsoft.EntityFrameworkCore": "6.0.10", + "Monai.Deploy.InformaticsGateway.Api": "1.0.0", + "Monai.Deploy.InformaticsGateway.Configuration": "1.0.0", + "Polly": "7.2.3" + } + } + } + } +} \ No newline at end of file diff --git a/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj b/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj index b92cac60a..5c1b07be3 100644 --- a/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj +++ b/src/Database/Monai.Deploy.InformaticsGateway.Database.csproj @@ -1,4 +1,4 @@ - + + Exe + net6.0 + dicomweb-cli + true + true + ..\..\.sonarlint\project-monai_monai-deploy-informatics-gatewaycsharp.ruleset + true + @@ -20,15 +29,6 @@ - - Exe - net6.0 - dicomweb-cli - true - true - ..\..\.sonarlint\project-monai_monai-deploy-informatics-gatewaycsharp.ruleset - - true diff --git a/src/DicomWebClient/CLI/packages.lock.json b/src/DicomWebClient/CLI/packages.lock.json new file mode 100644 index 000000000..04010f89e --- /dev/null +++ b/src/DicomWebClient/CLI/packages.lock.json @@ -0,0 +1,1495 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "ConsoleAppFramework": { + "type": "Direct", + "requested": "[4.2.4, )", + "resolved": "4.2.4", + "contentHash": "8qR4Gz3GBuNw9IAIrCJTpMCP7WbbBEJrNYj5SHPgsA+kSOmgepXvtREQ8sML5U9NyN2XHZ7l64bFS4u2uIK3HA==", + "dependencies": { + "Microsoft.Extensions.Hosting": "6.0.0", + "System.Text.Json": "6.0.1" + } + }, + "fo-dicom": { + "type": "Direct", + "requested": "[5.0.3, )", + "resolved": "5.0.3", + "contentHash": "OPkCQ9+X/fvGRokAAgjR8bOpai04qlnNHmq+LsgI+Kyug3yar2zk6IMOSSvPOLgWe0EG9ScdqH44AGKnviH5Rw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "Microsoft.Extensions.DependencyInjection": "2.2.0", + "Microsoft.Extensions.Options": "2.2.0", + "Microsoft.Toolkit.HighPerformance": "7.1.2", + "System.Buffers": "4.5.1", + "System.Text.Encoding.CodePages": "4.6.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2", + "System.Threading.Channels": "6.0.0" + } + }, + "Microsoft.Extensions.Http": { + "type": "Direct", + "requested": "[6.0.0, )", + "resolved": "6.0.0", + "contentHash": "15+pa2G0bAMHbHewaQIdr/y6ag2H3yh4rd9hTXavtWDzQBkvpe2RMqFg8BxDpcQWssmjmBApGPcw93QRz6YcMg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Ardalis.GuardClauses": { + "type": "Transitive", + "resolved": "4.0.1", + "contentHash": "RemnImQf/BWR8oYqFpdw+hn+b4Q1w+pGujkRiSfjQhMPuiERwGn4UMmQv+6UDE4qbPlnIN+e3e40JkvBhzgfzg==", + "dependencies": { + "JetBrains.Annotations": "2021.3.0" + } + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "2021.3.0", + "contentHash": "Ddxjs5RRjf+c8m9m++WvhW1lz1bqNhsTjWvCLbQN9bvKbkJeR9MhtfNwKgBRRdG2yLHcXFr5Lf7fsvvkiPaDRg==" + }, + "Microsoft.AspNet.WebApi.Client": { + "type": "Transitive", + "resolved": "5.2.9", + "contentHash": "cuVhPjjNMSEFpKXweMNBbsG4RUFuuZpFBm8tSyw309U9JEjcnbB6n3EPb4xwgcy9bJ38ctIbv5G8zXUBhlrPWw==", + "dependencies": { + "Newtonsoft.Json": "10.0.1", + "Newtonsoft.Json.Bson": "1.0.1" + } + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "P+MBhIM0YX+JqROuf7i306ZLJEjQYA9uUyRDE+OqwUI5sh41e2ZbPQV3LfAPh+29cmceE1pUffXsGfR4eMY3KA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Dynamic.Runtime": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "Microsoft.Extensions.Configuration": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "tq2wXyh3fL17EMF2bXgRhU7JrbO3on93MRKYxzz4JzzvuGSA1l0W3GI9/tl8EO89TH+KWEymP7bcFway6z9fXg==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Binder": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "b3ErKzND8LIC7o08QAVlKfaEIYEvLJbtmVbFZVBRXeu9YkKfSSzLZfR1SUfQPBIy9mKLhEtJgGYImkcMNaKE0A==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.CommandLine": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "3nL1qCkZ1Oxx14ZTzgo4MmlO7tso7F+TtMZAY2jUAtTLyAcDp+EDjk3RqafoKiNaePyPvvlleEcBxh3b2Hzl1g==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.EnvironmentVariables": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "DjYkzqvhiHCq38LW71PcIxXk6nhtV6VySP9yDcSO0goPl7YCU1VG1f2Wbgy58lkA10pWkjHCblZPUyboCB93ZA==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.FileExtensions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "V4Dth2cYMZpw3HhGw9XUDIijpI6gN+22LDt0AhufIgOppCUfpWX4483OmN+dFXRJkJLc8Tv0Q8QK+1ingT2+KQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.Json": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "GJGery6QytCzS/BxJ96klgG9in3uH26KcUBbiVG/coNDXCRq6LGVVlUT4vXq34KPuM+R2av+LeYdX9h4IZOCUg==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Configuration.UserSecrets": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lB0Hb2V4+RUHy+LjEcqEr4EcV4RWc9EnjAV2GdtWQEdljQX+R4hGREftI7sInU9okP93pDrJiaj6QUJ6ZsslOA==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "k6PWQMuoBDGGHOQTtyois2u4AwyVcIwL2LaSLlTZQm2CYcJ1pxbt6jfAnpWmzENA/wfrYRI/X9DTLoUkE4AsLw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "0pd4/fho0gC12rQswaGQxbU34jOS1TPS8lZPpkFCH68ppQjHNHYle9iRuHeev1LhrJ94YPvzcRd8UmIuFk23Qw==", + "dependencies": { + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.FileProviders.Physical": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "QvkL7l0nM8udt3gfyu0Vw8bbCXblxaKOl7c2oBfgGy4LCURRaL9XWZX1FWJrQc43oMokVneVxH38iz+bY1sbhg==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileSystemGlobbing": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.FileSystemGlobbing": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "ip8jnL1aPiaPeKINCqaTEbvBFDmVx9dXQEBZ2HOBRXPD1eabGNqP/bKlsIcp7U2lGxiXd5xIhoFcmY8nM4Hdiw==" + }, + "Microsoft.Extensions.Hosting": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "M8VzD0ni5VarIRT8njnwK4K2WSAo0kZH4Zc3mKcSGkP4CjDZ91T9ZEFmmwhmo4z7x8AFq+tW0WFi9wX+K2cxkQ==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.Configuration.CommandLine": "6.0.0", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "6.0.0", + "Microsoft.Extensions.Configuration.FileExtensions": "6.0.0", + "Microsoft.Extensions.Configuration.Json": "6.0.0", + "Microsoft.Extensions.Configuration.UserSecrets": "6.0.0", + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Physical": "6.0.0", + "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Logging.Console": "6.0.0", + "Microsoft.Extensions.Logging.Debug": "6.0.0", + "Microsoft.Extensions.Logging.EventLog": "6.0.0", + "Microsoft.Extensions.Logging.EventSource": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.Extensions.Hosting.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "GcT5l2CYXL6Sa27KCSh0TixsRfADUgth+ojQSD5EkzisZxmGFh7CwzkcYuGwvmXLjr27uWRNrJ2vuuEjMhU05Q==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.DiagnosticSource": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/HggWBbTwy8TgebGSX5DBZ24ndhzi93sHUBDvP1IxbZD7FDokYzdAr6+vbWGjw2XAfR2EJ1sfKUotpjHnFWPxA==" + }, + "Microsoft.Extensions.Logging.Configuration": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "ZDskjagmBAbv+K8rYW9VhjPplhbOE63xUD0DiuydZJwt15dRyoqicYklLd86zzeintUc7AptDkHn+YhhYkYo8A==", + "dependencies": { + "Microsoft.Extensions.Configuration": "6.0.0", + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Console": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "gsqKzOEdsvq28QiXFxagmn1oRB9GeI5GgYCkoybZtQA0IUb7QPwf1WmN3AwJeNIsadTvIFQCiVK0OVIgKfOBGg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Configuration": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Debug": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "M9g/JixseSZATJE9tcMn9uzoD4+DbSglivFqVx8YkRJ7VVPmnvCEbOZ0AAaxsL1EKyI4cz07DXOOJExxNsUOHw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "rlo0RxlMd0WtLG3CHI0qOTp6fFn7MvQjlrCjucA31RqmiMFCZkF8CHNbe8O7tbBIyyoLGWB1he9CbaA5iyHthg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.EventSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "BeDyyqt7nkm/nr+Gdk+L8n1tUT/u33VkbXAOesgYSNsxDM9hJ1NOBGoZfj9rCbeD2+9myElI6JOVVFmnzgeWQA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Json": "6.0.0" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Options.ConfigurationExtensions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "bXWINbTn0vC0FYc9GaQTISbxhQLAMrvtbuvD9N6JelEaIS/Pr62wUCinrq5bf1WRBGczt1v4wDhxFtVFNcMdUQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "6.0.0", + "Microsoft.Extensions.Configuration.Binder": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Net.Http.Headers": { + "type": "Transitive", + "resolved": "2.2.8", + "contentHash": "wHdwMv0QDDG2NWDSwax9cjkeQceGC1Qq53a31+31XpvTXVljKXRjWISlMoS/wZYKiqdqzuEvKFKwGHl+mt2jCA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "2.2.0", + "System.Buffers": "4.5.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "TsETIgVJb/AKoYfSP+iCxkuly5d3inZjTdx/ItZLk2CxY85v8083OBS3uai84kK3/baLnS5/b5XGs6zR7SuuHQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.Toolkit.HighPerformance": { + "type": "Transitive", + "resolved": "7.1.2", + "contentHash": "cezzRky0BUJyYmSrcQUcX8qAv90JfUwCqWEbqfWZLHyeANo9/LWgW6y50pqbyc8r8SPXVsu2GNH98fB3VxrnvA==" + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "10.0.1", + "contentHash": "ebWzW9j2nwxQeBo59As2TYn7nYr9BHicqqCwHOD1Vdo+50HBtLPuqdiCYJcLdTRknpYis/DSEOQz5KmZxwrIAg==", + "dependencies": { + "Microsoft.CSharp": "4.3.0", + "System.Collections": "4.3.0", + "System.ComponentModel.TypeConverter": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Dynamic.Runtime": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Runtime.Serialization.Formatters": "4.3.0", + "System.Runtime.Serialization.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0", + "System.Xml.XmlDocument": "4.3.0" + } + }, + "Newtonsoft.Json.Bson": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "5PYT/IqQ+UK31AmZiSS102R6EsTo+LGTSI8bp7WAUqDKaF4wHXD8U9u4WxTI1vc64tYi++8p3dk3WWNqPFgldw==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "Newtonsoft.Json": "10.0.1" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "prtjIEMhGUnQq6RnPEYLpFt8AtLbp9yq2zxOSrY7KJJZrw25Fi97IzBqY7iqssbM61Ek5b8f3MG/sG1N2sN5KA==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Epx8PoVZR0iuOnJJDzp7pWvdfMMOAvpUo95pC4ScH2mJuXkKA2Y4aR3cG9qt2klHgSons1WFh4kcGW7cSXvrxg==", + "dependencies": { + "System.Collections.NonGeneric": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VyGn1jGRZVfxnh8EdvDCi71v3bMXrsu8aYJOwoV7SNDLVhiEqwP86pPMyRGsDsxhXAm2b3o9OIqeETfN5qfezw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "j8GUkCpM8V4d4vhLIIoBLGey2Z5bCkMVNjEZseyAlm4n5arcsJOeI3zkUP+zvZgzsbLTYh4lYeP/ZD/gdIAPrw==", + "dependencies": { + "System.ComponentModel": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "16pQ6P+EdhcXzPiEK4kbA953Fu0MNG2ovxTZU81/qsCd1zPRsKc3uif5NgvllCY598k6bI0KUyKW8fanlfaDQg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Collections.NonGeneric": "4.3.0", + "System.Collections.Specialized": "4.3.0", + "System.ComponentModel": "4.3.0", + "System.ComponentModel.Primitives": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SNVi1E/vfWUAs/WYKhE9+qlS6KqK0YVhnlT0HQtr8pMIA8YX3lwy3uPMownDwdYISBdmAF/2holEIldVp85Wag==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Async": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "0YhHcaroWpQ9UCot3Pizah7ryAzQhNvobLMSxeDIGmnXfkQn8u5owvpOH0K6EVB+z9L7u6Cc4W17Br/+jyttEQ==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Formatters": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KT591AkTNFOTbhZlaeMVvfax3RqhH1EJlcwF50Wm7sfnBLuHiOeZRRKrr1ns3NESkM20KPZ5Ol/ueMq5vg4QoQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Serialization.Primitives": "4.3.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Wz+0KOukJGAlXjtKr+5Xpuxf8+c8739RI1C+A2BoQZT+wMCCoMDDdO8/4IRHfaVINqL78GO8dW8G2lW/e45Mcw==", + "dependencies": { + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "OCUK9C/U97+UheVwo+JE+IUcKySUE3Oe+BcHhVtQrvmKSUFLrUDO8B5zEPRL6mBGbczxZp4w1boSck6/fw4dog==", + "dependencies": { + "Microsoft.NETCore.Platforms": "3.0.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "6.0.6", + "contentHash": "GZ+62pLOr544jwSvyXv5ezSfzlFBTjLuPhgOS2dnKuknAA8dPNUGXLKTHf9XdsudU9JpbtweXnE4oEiKEB2T1Q==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Channels": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lJ8AxvkX7GQxpC6GFCeBj8ThYVyQczx2+f/cWHJU8tjS7YfI6Cv6bon70jVEgs2CiFbmmM8b9j1oZVx0dSI2Ww==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "monai.deploy.informaticsgateway.client.common": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "System.Text.Json": "6.0.6" + } + }, + "monai.deploy.informaticsgateway.dicomweb.client": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.AspNet.WebApi.Client": "5.2.9", + "Microsoft.Extensions.Http": "6.0.0", + "Microsoft.Net.Http.Headers": "2.2.8", + "Monai.Deploy.InformaticsGateway.Client.Common": "1.0.0", + "System.Linq.Async": "6.0.1", + "fo-dicom": "5.0.3" + } + } + } + } +} \ No newline at end of file diff --git a/src/DicomWebClient/Monai.Deploy.InformaticsGateway.DicomWeb.Client.csproj b/src/DicomWebClient/Monai.Deploy.InformaticsGateway.DicomWeb.Client.csproj index c4e1e1a85..248783577 100644 --- a/src/DicomWebClient/Monai.Deploy.InformaticsGateway.DicomWeb.Client.csproj +++ b/src/DicomWebClient/Monai.Deploy.InformaticsGateway.DicomWeb.Client.csproj @@ -23,6 +23,7 @@ Apache-2.0 true ..\.sonarlint\project-monai_monai-deploy-informatics-gatewaycsharp.ruleset + true diff --git a/src/DicomWebClient/Test/Monai.Deploy.InformaticsGateway.DicomWeb.Client.Test.csproj b/src/DicomWebClient/Test/Monai.Deploy.InformaticsGateway.DicomWeb.Client.Test.csproj index 1dd7b9b8d..8dc7fdd46 100644 --- a/src/DicomWebClient/Test/Monai.Deploy.InformaticsGateway.DicomWeb.Client.Test.csproj +++ b/src/DicomWebClient/Test/Monai.Deploy.InformaticsGateway.DicomWeb.Client.Test.csproj @@ -22,6 +22,7 @@ Monai.Deploy.InformaticsGateway.DicomWeb.Client.Test Apache-2.0 false + true diff --git a/src/DicomWebClient/Test/packages.lock.json b/src/DicomWebClient/Test/packages.lock.json new file mode 100644 index 000000000..6ac926ae7 --- /dev/null +++ b/src/DicomWebClient/Test/packages.lock.json @@ -0,0 +1,1229 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Ardalis.GuardClauses": { + "type": "Direct", + "requested": "[4.0.1, )", + "resolved": "4.0.1", + "contentHash": "RemnImQf/BWR8oYqFpdw+hn+b4Q1w+pGujkRiSfjQhMPuiERwGn4UMmQv+6UDE4qbPlnIN+e3e40JkvBhzgfzg==", + "dependencies": { + "JetBrains.Annotations": "2021.3.0" + } + }, + "coverlet.collector": { + "type": "Direct", + "requested": "[3.2.0, )", + "resolved": "3.2.0", + "contentHash": "xjY8xBigSeWIYs4I7DgUHqSNoGqnHi7Fv7/7RZD02rvZyG3hlsjnQKiVKVWKgr9kRKgmV+dEfu8KScvysiC0Wg==" + }, + "Microsoft.NET.Test.Sdk": { + "type": "Direct", + "requested": "[17.4.0, )", + "resolved": "17.4.0", + "contentHash": "VtNZQ83ntG2aEUjy1gq6B4HNdn96se6FmdY/03At8WiqDReGrApm6OB2fNiSHz9D6IIEtWtNZ2FSH0RJDVXl/w==", + "dependencies": { + "Microsoft.CodeCoverage": "17.4.0", + "Microsoft.TestPlatform.TestHost": "17.4.0" + } + }, + "Moq": { + "type": "Direct", + "requested": "[4.18.2, )", + "resolved": "4.18.2", + "contentHash": "SjxKYS5nX6prcaT8ZjbkONh3vnh0Rxru09+gQ1a07v4TM530Oe/jq3Q4dOZPfo1wq0LYmTgLOZKrqRfEx4auPw==", + "dependencies": { + "Castle.Core": "5.1.0" + } + }, + "xRetry": { + "type": "Direct", + "requested": "[1.8.0, )", + "resolved": "1.8.0", + "contentHash": "H8KXWHBjQASwD4y/7L2j7j4KLmg8z4+mCV4atrhZvJVnCkVSKLkWe1lfKGmaCYkKt2dJnC4yH+tJXGqthSkGGg==", + "dependencies": { + "xunit.core": "[2.4.0, 3.0.0)" + } + }, + "xunit": { + "type": "Direct", + "requested": "[2.4.2, )", + "resolved": "2.4.2", + "contentHash": "6Mj73Ont3zj2CJuoykVJfE0ZmRwn7C+pTuRP8c4bnaaTFjwNG6tGe0prJ1yIbMe9AHrpDys63ctWacSsFJWK/w==", + "dependencies": { + "xunit.analyzers": "1.0.0", + "xunit.assert": "2.4.2", + "xunit.core": "[2.4.2]" + } + }, + "xunit.runner.visualstudio": { + "type": "Direct", + "requested": "[2.4.5, )", + "resolved": "2.4.5", + "contentHash": "OwHamvBdUKgqsXfBzWiCW/O98BTx81UKzx2bieIOQI7CZFE5NEQZGi8PBQGIKawDW96xeRffiNf20SjfC0x9hw==" + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.0", + "contentHash": "31UJpTHOiWq95CDOHazE3Ub/hE/PydNWsJMwnEVTqFFP4WhAugwpaVGxzOxKgNeSUUeqS2W6lxV+q7u1pAOfXg==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "fo-dicom": { + "type": "Transitive", + "resolved": "5.0.3", + "contentHash": "OPkCQ9+X/fvGRokAAgjR8bOpai04qlnNHmq+LsgI+Kyug3yar2zk6IMOSSvPOLgWe0EG9ScdqH44AGKnviH5Rw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "Microsoft.Extensions.DependencyInjection": "2.2.0", + "Microsoft.Extensions.Options": "2.2.0", + "Microsoft.Toolkit.HighPerformance": "7.1.2", + "System.Buffers": "4.5.1", + "System.Text.Encoding.CodePages": "4.6.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2", + "System.Threading.Channels": "6.0.0" + } + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "2021.3.0", + "contentHash": "Ddxjs5RRjf+c8m9m++WvhW1lz1bqNhsTjWvCLbQN9bvKbkJeR9MhtfNwKgBRRdG2yLHcXFr5Lf7fsvvkiPaDRg==" + }, + "Microsoft.AspNet.WebApi.Client": { + "type": "Transitive", + "resolved": "5.2.9", + "contentHash": "cuVhPjjNMSEFpKXweMNBbsG4RUFuuZpFBm8tSyw309U9JEjcnbB6n3EPb4xwgcy9bJ38ctIbv5G8zXUBhlrPWw==", + "dependencies": { + "Newtonsoft.Json": "10.0.1", + "Newtonsoft.Json.Bson": "1.0.1" + } + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, + "Microsoft.CodeCoverage": { + "type": "Transitive", + "resolved": "17.4.0", + "contentHash": "2oZbSVTC2nAvQ2DnbXLlXS+c25ZyZdWeNd+znWwAxwGaPh9dwQ5NBsYyqQB7sKmJKIUdkKGmN3rzFzjVC81Dtg==" + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "k6PWQMuoBDGGHOQTtyois2u4AwyVcIwL2LaSLlTZQm2CYcJ1pxbt6jfAnpWmzENA/wfrYRI/X9DTLoUkE4AsLw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + }, + "Microsoft.Extensions.Http": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "15+pa2G0bAMHbHewaQIdr/y6ag2H3yh4rd9hTXavtWDzQBkvpe2RMqFg8BxDpcQWssmjmBApGPcw93QRz6YcMg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.DiagnosticSource": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/HggWBbTwy8TgebGSX5DBZ24ndhzi93sHUBDvP1IxbZD7FDokYzdAr6+vbWGjw2XAfR2EJ1sfKUotpjHnFWPxA==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Net.Http.Headers": { + "type": "Transitive", + "resolved": "2.2.8", + "contentHash": "wHdwMv0QDDG2NWDSwax9cjkeQceGC1Qq53a31+31XpvTXVljKXRjWISlMoS/wZYKiqdqzuEvKFKwGHl+mt2jCA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "2.2.0", + "System.Buffers": "4.5.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "TsETIgVJb/AKoYfSP+iCxkuly5d3inZjTdx/ItZLk2CxY85v8083OBS3uai84kK3/baLnS5/b5XGs6zR7SuuHQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.TestPlatform.ObjectModel": { + "type": "Transitive", + "resolved": "17.4.0", + "contentHash": "oWe7A0wrZhxagTOcaxJ9r0NXTbgkiBQQuCpCXxnP06NsGV/qOoaY2oaangAJbOUrwEx0eka1do400NwNCjfytw==", + "dependencies": { + "NuGet.Frameworks": "5.11.0", + "System.Reflection.Metadata": "1.6.0" + } + }, + "Microsoft.TestPlatform.TestHost": { + "type": "Transitive", + "resolved": "17.4.0", + "contentHash": "sUx48fu9wgQF1JxzXeSVtzb7KoKpJrdtIzsFamxET3ZYOKXj+Ej13HWZ0U2nuMVZtZVHBmE+KS3Vv5cIdTlycQ==", + "dependencies": { + "Microsoft.TestPlatform.ObjectModel": "17.4.0", + "Newtonsoft.Json": "13.0.1" + } + }, + "Microsoft.Toolkit.HighPerformance": { + "type": "Transitive", + "resolved": "7.1.2", + "contentHash": "cezzRky0BUJyYmSrcQUcX8qAv90JfUwCqWEbqfWZLHyeANo9/LWgW6y50pqbyc8r8SPXVsu2GNH98fB3VxrnvA==" + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "13.0.1", + "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + }, + "Newtonsoft.Json.Bson": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "5PYT/IqQ+UK31AmZiSS102R6EsTo+LGTSI8bp7WAUqDKaF4wHXD8U9u4WxTI1vc64tYi++8p3dk3WWNqPFgldw==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "Newtonsoft.Json": "10.0.1" + } + }, + "NuGet.Frameworks": { + "type": "Transitive", + "resolved": "5.11.0", + "contentHash": "eaiXkUjC4NPcquGWzAGMXjuxvLwc6XGKMptSyOGQeT0X70BUZObuybJFZLA0OfTdueLd3US23NBPTBb6iF3V1Q==" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Async": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "0YhHcaroWpQ9UCot3Pizah7ryAzQhNvobLMSxeDIGmnXfkQn8u5owvpOH0K6EVB+z9L7u6Cc4W17Br/+jyttEQ==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata": { + "type": "Transitive", + "resolved": "1.6.0", + "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "OCUK9C/U97+UheVwo+JE+IUcKySUE3Oe+BcHhVtQrvmKSUFLrUDO8B5zEPRL6mBGbczxZp4w1boSck6/fw4dog==", + "dependencies": { + "Microsoft.NETCore.Platforms": "3.0.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "6.0.6", + "contentHash": "GZ+62pLOr544jwSvyXv5ezSfzlFBTjLuPhgOS2dnKuknAA8dPNUGXLKTHf9XdsudU9JpbtweXnE4oEiKEB2T1Q==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Channels": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "xunit.abstractions": { + "type": "Transitive", + "resolved": "2.0.3", + "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" + }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "BeO8hEgs/c8Ls2647fPfieMngncvf0D0xYNDfIO59MolxtCtVjFRd6SRc+7tj8VMqkVOuJcnc9eh4ngI2cAmLQ==" + }, + "xunit.assert": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "pxJISOFjn2XTTi1mcDCkRZrTFb9OtRRCtx2kZFNF51GdReLr1ls2rnyxvAS4JO247K3aNtflvh5Q0346K5BROA==", + "dependencies": { + "NETStandard.Library": "1.6.1" + } + }, + "xunit.core": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "KB4yGCxNqIVyekhJLXtKSEq6BaXVp/JO3mbGVE1hxypZTLEe7h+sTbAhpA+yZW2dPtXTuiW+C1B2oxxHEkrmOw==", + "dependencies": { + "xunit.extensibility.core": "[2.4.2]", + "xunit.extensibility.execution": "[2.4.2]" + } + }, + "xunit.extensibility.core": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "W1BoXTIN1C6kpVSMw25huSet25ky6IAQUNovu3zGOGN/jWnbgSoTyCrlIhmXSg0tH5nEf8q7h3OjNHOjyu5PfA==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "xunit.abstractions": "2.0.3" + } + }, + "xunit.extensibility.execution": { + "type": "Transitive", + "resolved": "2.4.2", + "contentHash": "CZmgcKkwpyo8FlupZdWpJCryrAOWLh1FBPG6gmVZuPQkGQsim/oL4PcP4nfrC2hHgXUFtluvaJ0Sp9PQKUMNpg==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "xunit.extensibility.core": "[2.4.2]" + } + }, + "monai.deploy.informaticsgateway.client.common": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "System.Text.Json": "6.0.6" + } + }, + "monai.deploy.informaticsgateway.dicomweb.client": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "Microsoft.AspNet.WebApi.Client": "5.2.9", + "Microsoft.Extensions.Http": "6.0.0", + "Microsoft.Net.Http.Headers": "2.2.8", + "Monai.Deploy.InformaticsGateway.Client.Common": "1.0.0", + "System.Linq.Async": "6.0.1", + "fo-dicom": "5.0.3" + } + } + } + } +} \ No newline at end of file diff --git a/src/DicomWebClient/packages.lock.json b/src/DicomWebClient/packages.lock.json new file mode 100644 index 000000000..724145fe1 --- /dev/null +++ b/src/DicomWebClient/packages.lock.json @@ -0,0 +1,1263 @@ +{ + "version": 1, + "dependencies": { + "net6.0": { + "Ardalis.GuardClauses": { + "type": "Direct", + "requested": "[4.0.1, )", + "resolved": "4.0.1", + "contentHash": "RemnImQf/BWR8oYqFpdw+hn+b4Q1w+pGujkRiSfjQhMPuiERwGn4UMmQv+6UDE4qbPlnIN+e3e40JkvBhzgfzg==", + "dependencies": { + "JetBrains.Annotations": "2021.3.0" + } + }, + "fo-dicom": { + "type": "Direct", + "requested": "[5.0.3, )", + "resolved": "5.0.3", + "contentHash": "OPkCQ9+X/fvGRokAAgjR8bOpai04qlnNHmq+LsgI+Kyug3yar2zk6IMOSSvPOLgWe0EG9ScdqH44AGKnviH5Rw==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "Microsoft.Extensions.DependencyInjection": "2.2.0", + "Microsoft.Extensions.Options": "2.2.0", + "Microsoft.Toolkit.HighPerformance": "7.1.2", + "System.Buffers": "4.5.1", + "System.Text.Encoding.CodePages": "4.6.0", + "System.Text.Encodings.Web": "4.7.2", + "System.Text.Json": "4.7.2", + "System.Threading.Channels": "6.0.0" + } + }, + "GitVersion.MsBuild": { + "type": "Direct", + "requested": "[5.10.3, )", + "resolved": "5.10.3", + "contentHash": "UE5+vWL5xG8S/lJSh6w6bYTQxxgFuSSQLql7Czh6gM3Q0Y1XTpjufL9jtv8+xzqsAJIzvrPRyMwdGf3nf/z95Q==" + }, + "Microsoft.AspNet.WebApi.Client": { + "type": "Direct", + "requested": "[5.2.9, )", + "resolved": "5.2.9", + "contentHash": "cuVhPjjNMSEFpKXweMNBbsG4RUFuuZpFBm8tSyw309U9JEjcnbB6n3EPb4xwgcy9bJ38ctIbv5G8zXUBhlrPWw==", + "dependencies": { + "Newtonsoft.Json": "10.0.1", + "Newtonsoft.Json.Bson": "1.0.1" + } + }, + "Microsoft.Extensions.Http": { + "type": "Direct", + "requested": "[6.0.0, )", + "resolved": "6.0.0", + "contentHash": "15+pa2G0bAMHbHewaQIdr/y6ag2H3yh4rd9hTXavtWDzQBkvpe2RMqFg8BxDpcQWssmjmBApGPcw93QRz6YcMg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0" + } + }, + "Microsoft.Net.Http.Headers": { + "type": "Direct", + "requested": "[2.2.8, )", + "resolved": "2.2.8", + "contentHash": "wHdwMv0QDDG2NWDSwax9cjkeQceGC1Qq53a31+31XpvTXVljKXRjWISlMoS/wZYKiqdqzuEvKFKwGHl+mt2jCA==", + "dependencies": { + "Microsoft.Extensions.Primitives": "2.2.0", + "System.Buffers": "4.5.0" + } + }, + "System.Linq.Async": { + "type": "Direct", + "requested": "[6.0.1, )", + "resolved": "6.0.1", + "contentHash": "0YhHcaroWpQ9UCot3Pizah7ryAzQhNvobLMSxeDIGmnXfkQn8u5owvpOH0K6EVB+z9L7u6Cc4W17Br/+jyttEQ==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, + "JetBrains.Annotations": { + "type": "Transitive", + "resolved": "2021.3.0", + "contentHash": "Ddxjs5RRjf+c8m9m++WvhW1lz1bqNhsTjWvCLbQN9bvKbkJeR9MhtfNwKgBRRdG2yLHcXFr5Lf7fsvvkiPaDRg==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + }, + "Microsoft.CSharp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "P+MBhIM0YX+JqROuf7i306ZLJEjQYA9uUyRDE+OqwUI5sh41e2ZbPQV3LfAPh+29cmceE1pUffXsGfR4eMY3KA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Dynamic.Runtime": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "k6PWQMuoBDGGHOQTtyois2u4AwyVcIwL2LaSLlTZQm2CYcJ1pxbt6jfAnpWmzENA/wfrYRI/X9DTLoUkE4AsLw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" + }, + "Microsoft.Extensions.Logging": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "6.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0", + "System.Diagnostics.DiagnosticSource": "6.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/HggWBbTwy8TgebGSX5DBZ24ndhzi93sHUBDvP1IxbZD7FDokYzdAr6+vbWGjw2XAfR2EJ1sfKUotpjHnFWPxA==" + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Primitives": "6.0.0" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "Microsoft.NETCore.Platforms": { + "type": "Transitive", + "resolved": "3.0.0", + "contentHash": "TsETIgVJb/AKoYfSP+iCxkuly5d3inZjTdx/ItZLk2CxY85v8083OBS3uai84kK3/baLnS5/b5XGs6zR7SuuHQ==" + }, + "Microsoft.NETCore.Targets": { + "type": "Transitive", + "resolved": "1.1.0", + "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + }, + "Microsoft.Toolkit.HighPerformance": { + "type": "Transitive", + "resolved": "7.1.2", + "contentHash": "cezzRky0BUJyYmSrcQUcX8qAv90JfUwCqWEbqfWZLHyeANo9/LWgW6y50pqbyc8r8SPXVsu2GNH98fB3VxrnvA==" + }, + "Microsoft.Win32.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "NETStandard.Library": { + "type": "Transitive", + "resolved": "1.6.1", + "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.Win32.Primitives": "4.3.0", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.Compression.ZipFile": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Net.Http": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Net.Sockets": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.InteropServices.RuntimeInformation": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Timer": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0" + } + }, + "Newtonsoft.Json": { + "type": "Transitive", + "resolved": "10.0.1", + "contentHash": "ebWzW9j2nwxQeBo59As2TYn7nYr9BHicqqCwHOD1Vdo+50HBtLPuqdiCYJcLdTRknpYis/DSEOQz5KmZxwrIAg==", + "dependencies": { + "Microsoft.CSharp": "4.3.0", + "System.Collections": "4.3.0", + "System.ComponentModel.TypeConverter": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Dynamic.Runtime": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Runtime.Serialization.Formatters": "4.3.0", + "System.Runtime.Serialization.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0", + "System.Xml.XmlDocument": "4.3.0" + } + }, + "Newtonsoft.Json.Bson": { + "type": "Transitive", + "resolved": "1.0.1", + "contentHash": "5PYT/IqQ+UK31AmZiSS102R6EsTo+LGTSI8bp7WAUqDKaF4wHXD8U9u4WxTI1vc64tYi++8p3dk3WWNqPFgldw==", + "dependencies": { + "NETStandard.Library": "1.6.1", + "Newtonsoft.Json": "10.0.1" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==" + }, + "runtime.native.System": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A==" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g==" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg==" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ==" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A==" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg==" + }, + "System.AppContext": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.5.1", + "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" + }, + "System.Collections": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.NonGeneric": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "prtjIEMhGUnQq6RnPEYLpFt8AtLbp9yq2zxOSrY7KJJZrw25Fi97IzBqY7iqssbM61Ek5b8f3MG/sG1N2sN5KA==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections.Specialized": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Epx8PoVZR0iuOnJJDzp7pWvdfMMOAvpUo95pC4ScH2mJuXkKA2Y4aR3cG9qt2klHgSons1WFh4kcGW7cSXvrxg==", + "dependencies": { + "System.Collections.NonGeneric": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.ComponentModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VyGn1jGRZVfxnh8EdvDCi71v3bMXrsu8aYJOwoV7SNDLVhiEqwP86pPMyRGsDsxhXAm2b3o9OIqeETfN5qfezw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "j8GUkCpM8V4d4vhLIIoBLGey2Z5bCkMVNjEZseyAlm4n5arcsJOeI3zkUP+zvZgzsbLTYh4lYeP/ZD/gdIAPrw==", + "dependencies": { + "System.ComponentModel": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.ComponentModel.TypeConverter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "16pQ6P+EdhcXzPiEK4kbA953Fu0MNG2ovxTZU81/qsCd1zPRsKc3uif5NgvllCY598k6bI0KUyKW8fanlfaDQg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Collections.NonGeneric": "4.3.0", + "System.Collections.Specialized": "4.3.0", + "System.ComponentModel": "4.3.0", + "System.ComponentModel.Primitives": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Console": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Diagnostics.Debug": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.DiagnosticSource": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Diagnostics.Tools": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tracing": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "SNVi1E/vfWUAs/WYKhE9+qlS6KqK0YVhnlT0HQtr8pMIA8YX3lwy3uPMownDwdYISBdmAF/2holEIldVp85Wag==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Globalization": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.Compression.ZipFile": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==", + "dependencies": { + "System.Buffers": "4.3.0", + "System.IO": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.IO.FileSystem": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Net.Http": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.DiagnosticSource": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Net.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Net.Sockets": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Net.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.ObjectModel": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Reflection": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.CompilerServices.Unsafe": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" + }, + "System.Runtime.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.InteropServices.RuntimeInformation": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==", + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0" + } + }, + "System.Runtime.Numerics": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Runtime.Serialization.Formatters": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "KT591AkTNFOTbhZlaeMVvfax3RqhH1EJlcwF50Wm7sfnBLuHiOeZRRKrr1ns3NESkM20KPZ5Ol/ueMq5vg4QoQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Serialization.Primitives": "4.3.0" + } + }, + "System.Runtime.Serialization.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Wz+0KOukJGAlXjtKr+5Xpuxf8+c8739RI1C+A2BoQZT+wMCCoMDDdO8/4IRHfaVINqL78GO8dW8G2lW/e45Mcw==", + "dependencies": { + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Security.Cryptography.Algorithms": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==", + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Text.Encoding": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.CodePages": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "OCUK9C/U97+UheVwo+JE+IUcKySUE3Oe+BcHhVtQrvmKSUFLrUDO8B5zEPRL6mBGbczxZp4w1boSck6/fw4dog==", + "dependencies": { + "Microsoft.NETCore.Platforms": "3.0.0" + } + }, + "System.Text.Encoding.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0" + } + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "6.0.6", + "contentHash": "GZ+62pLOr544jwSvyXv5ezSfzlFBTjLuPhgOS2dnKuknAA8dPNUGXLKTHf9XdsudU9JpbtweXnE4oEiKEB2T1Q==", + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "6.0.0", + "System.Text.Encodings.Web": "6.0.0" + } + }, + "System.Text.RegularExpressions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Channels": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==" + }, + "System.Threading.Tasks": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Timer": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument": { + "type": "Transitive", + "resolved": "4.3.0", + "contentHash": "lJ8AxvkX7GQxpC6GFCeBj8ThYVyQczx2+f/cWHJU8tjS7YfI6Cv6bon70jVEgs2CiFbmmM8b9j1oZVx0dSI2Ww==", + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "monai.deploy.informaticsgateway.client.common": { + "type": "Project", + "dependencies": { + "Ardalis.GuardClauses": "4.0.1", + "System.Text.Json": "6.0.6" + } + } + } + } +} \ No newline at end of file diff --git a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj index 40cbf3cdd..72c1a793e 100644 --- a/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj +++ b/src/InformaticsGateway/Monai.Deploy.InformaticsGateway.csproj @@ -1,4 +1,4 @@ - + diff --git a/src/Database/EntityFramework/Test/Usings.cs b/src/Database/EntityFramework/Test/Usings.cs index 8c927eb74..1a1f3f8a0 100644 --- a/src/Database/EntityFramework/Test/Usings.cs +++ b/src/Database/EntityFramework/Test/Usings.cs @@ -1 +1,17 @@ -global using Xunit; \ No newline at end of file +/* + * Copyright 2022 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +global using Xunit; diff --git a/src/Database/MongoDB/Configurations/MongoDBOptions.cs b/src/Database/MongoDB/Configurations/MongoDBOptions.cs index f95013a7f..34a49ef7e 100644 --- a/src/Database/MongoDB/Configurations/MongoDBOptions.cs +++ b/src/Database/MongoDB/Configurations/MongoDBOptions.cs @@ -1,7 +1,7 @@ /* * Copyright 2022 MONAI Consortium * - * Licensed under the Apache License, Version 2.0 (the "License", CancellationToken cancellationToken = default); + * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * From c0031162a04a1daea02640855ac61caeb7400933 Mon Sep 17 00:00:00 2001 From: Victor Chang Date: Wed, 16 Nov 2022 17:33:15 -0800 Subject: [PATCH 13/14] Use full path to sqldb file Signed-off-by: Victor Chang --- tests/Integration.Test/Drivers/EfDataProvider.cs | 10 ++++++++++ tests/Integration.Test/Hooks/TestHooks.cs | 3 --- tests/Integration.Test/appsettings.json | 5 ++--- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/tests/Integration.Test/Drivers/EfDataProvider.cs b/tests/Integration.Test/Drivers/EfDataProvider.cs index a5777146b..2e0dd3d24 100644 --- a/tests/Integration.Test/Drivers/EfDataProvider.cs +++ b/tests/Integration.Test/Drivers/EfDataProvider.cs @@ -14,6 +14,7 @@ * limitations under the License. */ +using Ardalis.GuardClauses; using Microsoft.EntityFrameworkCore; using Monai.Deploy.InformaticsGateway.Api.Rest; using Monai.Deploy.InformaticsGateway.Database.EntityFramework; @@ -38,12 +39,21 @@ public EfDataProvider(ISpecFlowOutputHelper outputHelper, Configurations configu _outputHelper = outputHelper ?? throw new ArgumentNullException(nameof(outputHelper)); _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); + connectionString = ConvertToFullPath(connectionString); _outputHelper.WriteLine($"Connecting to EF based database using {connectionString}"); var builder = new DbContextOptionsBuilder(); builder.UseSqlite(connectionString); _dbContext = new InformaticsGatewayContext(builder.Options); } + private string ConvertToFullPath(string connectionString) + { + Guard.Against.NullOrWhiteSpace(connectionString); + + string absolute = Path.GetFullPath("./"); + return connectionString.Replace("=./", $"={absolute}"); + } + public void ClearAllData() { _dbContext.Database.EnsureCreated(); diff --git a/tests/Integration.Test/Hooks/TestHooks.cs b/tests/Integration.Test/Hooks/TestHooks.cs index 9b47d7545..313ab7719 100644 --- a/tests/Integration.Test/Hooks/TestHooks.cs +++ b/tests/Integration.Test/Hooks/TestHooks.cs @@ -60,9 +60,6 @@ public TestHooks(IObjectContainer objectContainer) _objectContainer = objectContainer; } - /// - /// Runs before all tests to create static implementions of Rabbit and Mongo clients as well as starting the WorkflowManager using WebApplicationFactory. - /// [BeforeTestRun(Order = 0)] public static void Init(ISpecFlowOutputHelper outputHelper) { diff --git a/tests/Integration.Test/appsettings.json b/tests/Integration.Test/appsettings.json index ad6e43660..5f192237c 100644 --- a/tests/Integration.Test/appsettings.json +++ b/tests/Integration.Test/appsettings.json @@ -1,8 +1,7 @@ { "ConnectionStrings": { - "Type": "mongodb", - "InformaticsGatewayDatabase": "mongodb://root:rootpassword@localhost:27017", - "DatabaseName": "InformaticsGateway" + "Type": "sqlite", + "InformaticsGatewayDatabase": "Data Source=./mig.db" }, "InformaticsGateway": { "dicom": { From a6796cd33743d47d7af96344b059084975595506 Mon Sep 17 00:00:00 2001 From: Victor Chang Date: Wed, 16 Nov 2022 20:30:05 -0800 Subject: [PATCH 14/14] Add debug logs Signed-off-by: Victor Chang --- src/Api/BaseApplicationEntity.cs | 5 ++++ src/Api/MonaiApplicationEntity.cs | 5 ++++ src/Api/Rest/InferenceRequest.cs | 6 +++++ src/Api/Storage/Payload.cs | 7 ++++++ src/Database/Api/StorageMetadataWrapper.cs | 6 +++++ src/InformaticsGateway/Program.cs | 1 + .../Drivers/EfDataProvider.cs | 25 ++++++++++++++----- .../Drivers/MongoDBDataProvider.cs | 24 ++++++++++++------ tests/Integration.Test/Hooks/TestHooks.cs | 1 + .../ExportServicesStepDefinitions.cs | 2 +- tests/Integration.Test/appsettings.json | 5 ++-- 11 files changed, 71 insertions(+), 16 deletions(-) diff --git a/src/Api/BaseApplicationEntity.cs b/src/Api/BaseApplicationEntity.cs index 9054edfb1..0ead8f071 100644 --- a/src/Api/BaseApplicationEntity.cs +++ b/src/Api/BaseApplicationEntity.cs @@ -51,5 +51,10 @@ public void SetDefaultValues() if (string.IsNullOrWhiteSpace(Name)) Name = AeTitle; } + + public override string ToString() + { + return $"Name: {Name}/AET: {AeTitle}/Host: {HostIp}"; + } } } diff --git a/src/Api/MonaiApplicationEntity.cs b/src/Api/MonaiApplicationEntity.cs index 0ef7705b9..b98adf9d4 100644 --- a/src/Api/MonaiApplicationEntity.cs +++ b/src/Api/MonaiApplicationEntity.cs @@ -113,5 +113,10 @@ public void SetDefaultValues() AllowedSopClasses ??= new List(); } + + public override string ToString() + { + return $"Name: {Name}/AET: {AeTitle}"; + } } } diff --git a/src/Api/Rest/InferenceRequest.cs b/src/Api/Rest/InferenceRequest.cs index 3a04f19b1..5af67be63 100644 --- a/src/Api/Rest/InferenceRequest.cs +++ b/src/Api/Rest/InferenceRequest.cs @@ -19,6 +19,7 @@ using System.Collections.Generic; using System.Linq; using System.Text.Json.Serialization; +using System.Xml.Linq; using Ardalis.GuardClauses; using Monai.Deploy.InformaticsGateway.Common; @@ -384,5 +385,10 @@ private static void CheckDicomWebConnectionDetails(string source, List e errors.Add($"The provided URI '{connection.Uri}' is not well formed."); } } + + public override string ToString() + { + return $"InferenceRequestId: {InferenceRequestId}/TransactionId: {TransactionId}"; + } } } diff --git a/src/Api/Storage/Payload.cs b/src/Api/Storage/Payload.cs index 9fb4a072d..80a2ccbb1 100644 --- a/src/Api/Storage/Payload.cs +++ b/src/Api/Storage/Payload.cs @@ -18,7 +18,9 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; +using System.Transactions; using Ardalis.GuardClauses; +using Monai.Deploy.InformaticsGateway.Api.Rest; namespace Monai.Deploy.InformaticsGateway.Api.Storage { @@ -122,6 +124,11 @@ protected virtual void Dispose(bool disposing) } } + public override string ToString() + { + return $"PayloadId: {PayloadId}/Key: {Key}"; + } + public void Dispose() { // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method diff --git a/src/Database/Api/StorageMetadataWrapper.cs b/src/Database/Api/StorageMetadataWrapper.cs index d89c34220..f572a2606 100644 --- a/src/Database/Api/StorageMetadataWrapper.cs +++ b/src/Database/Api/StorageMetadataWrapper.cs @@ -17,6 +17,7 @@ using System.Text.Json; using System.Text.Json.Serialization; using Ardalis.GuardClauses; +using Microsoft.EntityFrameworkCore.Metadata.Internal; using Monai.Deploy.InformaticsGateway.Api; using Monai.Deploy.InformaticsGateway.Api.Storage; @@ -81,5 +82,10 @@ public FileStorageMetadata GetObject() return JsonSerializer.Deserialize(Value, type) as FileStorageMetadata; #pragma warning restore CS8603 // Possible null reference return. } + + public override string ToString() + { + return $"Identity: {Identity}"; + } } } diff --git a/src/InformaticsGateway/Program.cs b/src/InformaticsGateway/Program.cs index 920a425c7..3f5095a56 100644 --- a/src/InformaticsGateway/Program.cs +++ b/src/InformaticsGateway/Program.cs @@ -85,6 +85,7 @@ internal static IHostBuilder CreateHostBuilder(string[] args) => config .AddJsonFile("appsettings.json", optional: false, reloadOnChange: false) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: false) + .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("DOTNET_TEST")}.json", optional: true, reloadOnChange: false) .AddEnvironmentVariables(); }) .ConfigureLogging((builderContext, builder) => diff --git a/tests/Integration.Test/Drivers/EfDataProvider.cs b/tests/Integration.Test/Drivers/EfDataProvider.cs index 2e0dd3d24..2a8be5757 100644 --- a/tests/Integration.Test/Drivers/EfDataProvider.cs +++ b/tests/Integration.Test/Drivers/EfDataProvider.cs @@ -56,14 +56,26 @@ private string ConvertToFullPath(string connectionString) public void ClearAllData() { + _outputHelper.WriteLine("Removing data from the database."); _dbContext.Database.EnsureCreated(); - _dbContext.RemoveRange(_dbContext.DestinationApplicationEntities); - _dbContext.RemoveRange(_dbContext.SourceApplicationEntities); - _dbContext.RemoveRange(_dbContext.MonaiApplicationEntities); - _dbContext.RemoveRange(_dbContext.Payloads); - _dbContext.RemoveRange(_dbContext.InferenceRequests); - _dbContext.RemoveRange(_dbContext.StorageMetadataWrapperEntities); + DumpAndClear("DestinationApplicationEntities", _dbContext.DestinationApplicationEntities.ToList()); + DumpAndClear("SourceApplicationEntities", _dbContext.SourceApplicationEntities.ToList()); + DumpAndClear("MonaiApplicationEntities", _dbContext.MonaiApplicationEntities.ToList()); + DumpAndClear("Payloads", _dbContext.Payloads.ToList()); + DumpAndClear("InferenceRequests", _dbContext.InferenceRequests.ToList()); + DumpAndClear("StorageMetadataWrapperEntities", _dbContext.StorageMetadataWrapperEntities.ToList()); _dbContext.SaveChanges(); + _outputHelper.WriteLine("All data removed from the database."); + } + + private void DumpAndClear(string name, List items) where T : class + { + _outputHelper.WriteLine($"==={name}==="); + foreach (var item in items) + { + _outputHelper.WriteLine(item.ToString()); + } + _dbContext.Set().RemoveRange(items); } public async Task InjectAcrRequest() @@ -89,6 +101,7 @@ public async Task InjectAcrRequest() _dbContext.Add(request); await _dbContext.SaveChangesAsync(); _outputHelper.WriteLine($"Injected ACR request {request.TransactionId}"); + Console.WriteLine($"Injected ACR request {request.TransactionId}"); return request.TransactionId; } } diff --git a/tests/Integration.Test/Drivers/MongoDBDataProvider.cs b/tests/Integration.Test/Drivers/MongoDBDataProvider.cs index d1df1bb34..9ef02d425 100644 --- a/tests/Integration.Test/Drivers/MongoDBDataProvider.cs +++ b/tests/Integration.Test/Drivers/MongoDBDataProvider.cs @@ -67,22 +67,31 @@ public MongoDBDataProvider(ISpecFlowOutputHelper outputHelper, Configurations co public void ClearAllData() { - Clear(_infereRequestCollection); - Clear(_payloadCollection); - Clear(_storageMetadataWrapperCollection); - Clear(_sourceApplicationEntityCollection); - Clear(_destinationApplicationEntityCollection); - Clear(_monaiApplicationEntityCollection); + _outputHelper.WriteLine("Removing data from the database."); + DumpClear(_infereRequestCollection); + DumpClear(_payloadCollection); + DumpClear(_storageMetadataWrapperCollection); + DumpClear(_sourceApplicationEntityCollection); + DumpClear(_destinationApplicationEntityCollection); + DumpClear(_monaiApplicationEntityCollection); + _outputHelper.WriteLine("All data removed from the database."); } - private void Clear(IMongoCollection collection) + private void DumpClear(IMongoCollection collection) { + _outputHelper.WriteLine($"==={collection.CollectionNamespace.FullName}==="); + foreach (var item in collection.AsQueryable()) + { + _outputHelper.WriteLine(item.ToString()); + } + collection.DeleteMany("{ }"); if (collection.Find("{ }").CountDocuments() > 0) { throw new Exception("Failed to delete documents"); } + _outputHelper.WriteLine($"Data removed from the collection {collection.CollectionNamespace.FullName}."); } public async Task InjectAcrRequest() @@ -108,6 +117,7 @@ public async Task InjectAcrRequest() await _infereRequestCollection.InsertOneAsync(request).ConfigureAwait(false); _outputHelper.WriteLine($"Injected ACR request {request.TransactionId}"); + Console.WriteLine($"Injected ACR request {request.TransactionId}"); return request.TransactionId; } } diff --git a/tests/Integration.Test/Hooks/TestHooks.cs b/tests/Integration.Test/Hooks/TestHooks.cs index 313ab7719..050424914 100644 --- a/tests/Integration.Test/Hooks/TestHooks.cs +++ b/tests/Integration.Test/Hooks/TestHooks.cs @@ -185,6 +185,7 @@ public static void Shtudown() s_rabbitMqConnectionFactory.Dispose(); } + [AfterTestRun(Order = 0)] [AfterScenario] public static void ClearTestData(ISpecFlowOutputHelper outputHelper) diff --git a/tests/Integration.Test/StepDefinitions/ExportServicesStepDefinitions.cs b/tests/Integration.Test/StepDefinitions/ExportServicesStepDefinitions.cs index 8851bf883..b78d655e9 100644 --- a/tests/Integration.Test/StepDefinitions/ExportServicesStepDefinitions.cs +++ b/tests/Integration.Test/StepDefinitions/ExportServicesStepDefinitions.cs @@ -36,7 +36,7 @@ namespace Monai.Deploy.InformaticsGateway.Integration.Test.StepDefinitions [CollectionDefinition("SpecFlowNonParallelizableFeatures", DisableParallelization = true)] public class DicomDimseScuServicesStepDefinitions { - internal static readonly TimeSpan DicomScpWaitTimeSpan = TimeSpan.FromMinutes(7); + internal static readonly TimeSpan DicomScpWaitTimeSpan = TimeSpan.FromMinutes(3); private readonly InformaticsGatewayConfiguration _informaticsGatewayConfiguration; private readonly Configurations _configuration; private readonly DicomScp _dicomServer; diff --git a/tests/Integration.Test/appsettings.json b/tests/Integration.Test/appsettings.json index 5f192237c..ad6e43660 100644 --- a/tests/Integration.Test/appsettings.json +++ b/tests/Integration.Test/appsettings.json @@ -1,7 +1,8 @@ { "ConnectionStrings": { - "Type": "sqlite", - "InformaticsGatewayDatabase": "Data Source=./mig.db" + "Type": "mongodb", + "InformaticsGatewayDatabase": "mongodb://root:rootpassword@localhost:27017", + "DatabaseName": "InformaticsGateway" }, "InformaticsGateway": { "dicom": {