diff --git a/NVDSuppressions.xml b/NVDSuppressions.xml index a3ee45bd..3bc7f28b 100644 --- a/NVDSuppressions.xml +++ b/NVDSuppressions.xml @@ -796,4 +796,67 @@ ^pkg:nuget/System\.Security\.Cryptography\.Xml@.*$ CVE-2022-34716 + + + ^pkg:nuget/System\.Security\.Cryptography\.Xml@.*$ + CVE-2022-34716 + + + + + + ^pkg:generic/Azure\.Core@.*$ + CVE-2024-43591 + + + + + + ^pkg:nuget/Azure\.Core@.*$ + CVE-2024-43591 + + + + + + ^pkg:nuget/Azure\.Identity@.*$ + CVE-2024-43591 + + + + + + + ^pkg:nuget/Microsoft\.Extensions\.Azure@.*$ + CVE-2024-43591 + + + + + + ^pkg:generic/System\.ClientModel@.*$ + CVE-2024-43591 + + + + + + ^pkg:generic/Microsoft\.Extensions\.Azure@.*$ + CVE-2024-43591 + + diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 68381954..36179514 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -632,7 +632,9 @@ stages: - name: "AzureADConfiguration.ClientSecretNoRole" value: $(AzureADConfigurationClientSecretNoRole) - name: "EnterpriseEventServiceConfiguration.ClientId" - value: $(EnterpriseEventServiceConfigurationClientId) + value: $(EnterpriseEventServiceConfigurationClientId) + - name: "PermitConfiguration.PermitDecryptionHardwareId" + value: $(PermitDecryptionHardwareId) - name: mockWebAppName value: $[ stageDependencies.DevDeploy.DevDeployTerraform.outputs['DevDeployTerraform.TerraformDeploy.mockWebApp'] ] - name: mockWebAppResourceGroup @@ -866,6 +868,7 @@ stages: AzureSubscription: "ERP-Facade-Dev-A.011.05.12" - stage: Livedeploy + dependsOn: PreProdDeploy displayName: "Livedeploy (inc terraform, webapp deploy)" variables: - group: "ERP-Facade-Live" @@ -874,8 +877,26 @@ stages: value: $(AzureADConfigurationTenantId) - name: "AzureADConfiguration.ClientId" value: $(AzureADConfigurationClientId) + - name: "AzureADConfiguration.AutoTestClientId" + value: $(AzureADConfigurationAutoTestClientId) + - name: "AzureADConfiguration.ClientSecret" + value: $(AzureADConfigurationClientSecret) + - name: "AzureADConfiguration.AutoTestClientIdNoRole" + value: $(AzureADConfigurationAutoTestClientIdNoRole) + - name: "AzureADConfiguration.ClientSecretNoRole" + value: $(AzureADConfigurationClientSecretNoRole) - name: "EnterpriseEventServiceConfiguration.ClientId" - value: $(EnterpriseEventServiceConfigurationClientId) + value: $(EnterpriseEventServiceConfigurationClientId) + - name: "AzureADConfiguration.AutoTestClientId" + value: $(AzureADConfigurationAutoTestClientId) + - name: "AzureADConfiguration.ClientSecret" + value: $(AzureADConfigurationClientSecret) + - name: "AzureADConfiguration.AutoTestClientIdNoRole" + value: $(AzureADConfigurationAutoTestClientIdNoRole) + - name: "AzureADConfiguration.ClientSecretNoRole" + value: $(AzureADConfigurationClientSecretNoRole) + - name: "PermitConfiguration.PermitDecryptionHardwareId" + value: $(PermitDecryptionHardwareId) condition: and(succeeded(), or(eq(variables['Build.SourceBranch'], 'refs/heads/main'),startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'))) jobs: - deployment: LiveDeployTerraform diff --git a/src/UKHO.ERPFacade.API/Controllers/WebhookController.cs b/src/UKHO.ERPFacade.API/Controllers/WebhookController.cs index 1dd21e67..ea50cf89 100644 --- a/src/UKHO.ERPFacade.API/Controllers/WebhookController.cs +++ b/src/UKHO.ERPFacade.API/Controllers/WebhookController.cs @@ -4,6 +4,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using UKHO.ERPFacade.API.Helpers; +using UKHO.ERPFacade.API.Services; using UKHO.ERPFacade.Common.Configuration; using UKHO.ERPFacade.Common.Constants; using UKHO.ERPFacade.Common.Exceptions; @@ -27,7 +28,7 @@ public class WebhookController : BaseController private readonly IAzureBlobEventWriter _azureBlobEventWriter; private readonly IAzureQueueHelper _azureQueueHelper; private readonly ISapClient _sapClient; - private readonly IEncContentSapMessageBuilder _encContentSapMessageBuilder; + private readonly IS57Service _s57Service; private readonly IOptions _sapConfig; private readonly ILicenceUpdatedSapMessageBuilder _licenceUpdatedSapMessageBuilder; @@ -37,7 +38,7 @@ public WebhookController(IHttpContextAccessor contextAccessor, IAzureBlobEventWriter azureBlobEventWriter, IAzureQueueHelper azureQueueHelper, ISapClient sapClient, - IEncContentSapMessageBuilder encContentSapMessageBuilder, + IS57Service s57Service, IOptions sapConfig, ILicenceUpdatedSapMessageBuilder licenceUpdatedSapMessageBuilder) : base(contextAccessor) @@ -47,7 +48,7 @@ public WebhookController(IHttpContextAccessor contextAccessor, _azureBlobEventWriter = azureBlobEventWriter; _azureQueueHelper = azureQueueHelper; _sapClient = sapClient; - _encContentSapMessageBuilder = encContentSapMessageBuilder; + _s57Service = s57Service; _licenceUpdatedSapMessageBuilder = licenceUpdatedSapMessageBuilder; _sapConfig = sapConfig ?? throw new ArgumentNullException(nameof(sapConfig)); } @@ -84,37 +85,7 @@ public virtual async Task NewEncContentPublishedEventReceived([Fr return new BadRequestObjectResult(StatusCodes.Status400BadRequest); } - EncEventEntity encEventEntity = new() - { - RowKey = Guid.NewGuid().ToString(), - PartitionKey = Guid.NewGuid().ToString(), - Timestamp = DateTime.UtcNow, - CorrelationId = correlationId, - RequestDateTime = null - }; - - _logger.LogInformation(EventIds.AddingEntryForEncContentPublishedEventInAzureTable.ToEventId(), "Adding/Updating entry for enccontentpublished event in azure table."); - await _azureTableReaderWriter.UpsertEntity(correlationId, Constants.S57EventTableName, encEventEntity); - - _logger.LogInformation(EventIds.UploadEncContentPublishedEventInAzureBlobStarted.ToEventId(), "Uploading enccontentpublished event payload in blob storage."); - await _azureBlobEventWriter.UploadEvent(encEventJson.ToString(), Constants.S57EventContainerName, correlationId + '/' + Constants.S57EncEventFileName); - _logger.LogInformation(EventIds.UploadEncContentPublishedEventInAzureBlobCompleted.ToEventId(), "The enccontentpublished event payload is uploaded in blob storage successfully."); - - var sapPayload = _encContentSapMessageBuilder.BuildSapMessageXml(JsonConvert.DeserializeObject(encEventJson.ToString())); - - _logger.LogInformation(EventIds.UploadSapXmlPayloadInAzureBlobStarted.ToEventId(), "Uploading the SAP XML payload in blob storage."); - await _azureBlobEventWriter.UploadEvent(sapPayload.ToIndentedString(), Constants.S57EventContainerName, correlationId + '/' + Constants.SapXmlPayloadFileName); - _logger.LogInformation(EventIds.UploadSapXmlPayloadInAzureBlobCompleted.ToEventId(), "SAP XML payload is uploaded in blob storage successfully."); - - var response = await _sapClient.PostEventData(sapPayload, _sapConfig.Value.SapEndpointForEncEvent, _sapConfig.Value.SapServiceOperationForEncEvent, _sapConfig.Value.SapUsernameForEncEvent, _sapConfig.Value.SapPasswordForEncEvent); - - if (!response.IsSuccessStatusCode) - { - throw new ERPFacadeException(EventIds.RequestToSapFailed.ToEventId(), $"An error occurred while sending a request to SAP. | {response.StatusCode}"); - } - _logger.LogInformation(EventIds.EncUpdateSentToSap.ToEventId(), "ENC update has been sent to SAP successfully. | {StatusCode}", response.StatusCode); - - await _azureTableReaderWriter.UpdateEntity(correlationId, Constants.S57EventTableName, new[] { new KeyValuePair("RequestDateTime", DateTime.UtcNow) }); + await _s57Service.ProcessS57Event(encEventJson); return new OkObjectResult(StatusCodes.Status200OK); } diff --git a/src/UKHO.ERPFacade.API/Helpers/EncContentSapMessageBuilder.cs b/src/UKHO.ERPFacade.API/Helpers/EncContentSapMessageBuilder.cs index e6893565..968ec282 100644 --- a/src/UKHO.ERPFacade.API/Helpers/EncContentSapMessageBuilder.cs +++ b/src/UKHO.ERPFacade.API/Helpers/EncContentSapMessageBuilder.cs @@ -61,9 +61,16 @@ public XmlDocument BuildSapMessageXml(EncEventPayload eventData) // Build SAP actions for Units BuildUnitActions(eventData, soapXml, actionItemNode); + + var xmlNode = SortXmlPayload(actionItemNode); + + soapXml.SelectSingleNode(Constants.XpathCorrId).InnerText = eventData.Data.CorrelationId; + soapXml.SelectSingleNode(Constants.XpathNoOfActions).InnerText = xmlNode.ChildNodes.Count.ToString(); + soapXml.SelectSingleNode(Constants.XpathRecDate).InnerText = DateTime.UtcNow.ToString(Constants.RecDateFormat); + soapXml.SelectSingleNode(Constants.XpathRecTime).InnerText = DateTime.UtcNow.ToString(Constants.RecTimeFormat); - // Finalize SAP XML message - FinalizeSapXmlMessage(soapXml, eventData.Data.CorrelationId, actionItemNode); + var IM_MATINFONode = soapXml.SelectSingleNode(Constants.XpathImMatInfo); + IM_MATINFONode.AppendChild(xmlNode); _logger.LogInformation(EventIds.GenerationOfSapXmlPayloadCompleted.ToEventId(), "Generation of SAP XML payload completed."); @@ -156,20 +163,7 @@ private void BuildUnitActions(EncEventPayload eventData, XmlDocument soapXml, Xm } } } - - private void FinalizeSapXmlMessage(XmlDocument soapXml, string correlationId, XmlNode actionItemNode) - { - var xmlNode = SortXmlPayload(actionItemNode); - - SetXmlNodeValue(soapXml, Constants.XpathCorrId, correlationId); - SetXmlNodeValue(soapXml, Constants.XpathNoOfActions, xmlNode.ChildNodes.Count.ToString()); - SetXmlNodeValue(soapXml, Constants.XpathRecDate, DateTime.UtcNow.ToString(Constants.RecDateFormat)); - SetXmlNodeValue(soapXml, Constants.XpathRecTime, DateTime.UtcNow.ToString(Constants.RecTimeFormat)); - - var IM_MATINFONode = soapXml.SelectSingleNode(Constants.XpathImMatInfo); - IM_MATINFONode.AppendChild(xmlNode); - } - + /// /// Returns primary unit of sale for given product to get ProductName for ENC cell SAP actions. /// @@ -287,7 +281,7 @@ private XmlElement BuildAction(XmlDocument soapXml, Product product, UnitOfSale private void AppendChildNode(XmlElement parentNode, XmlDocument doc, string nodeName, string value) { var childNode = doc.CreateElement(nodeName); - childNode.InnerText = value ?? string.Empty; + childNode.InnerText = value; parentNode.AppendChild(childNode); } @@ -358,7 +352,7 @@ private void ProcessUkhoWeekNumberAttributes(string action, IEnumerable Convert.ToInt32(node.SelectSingleNode(Constants.ActionNumber)?.InnerText ?? "0")) + .OrderBy(node => Convert.ToInt32(node.SelectSingleNode(Constants.ActionNumber)?.InnerText)) .ToList(); // Update the sequence number in the sorted list foreach (XmlNode actionItem in sortedActionItems) { - var actionNumberNode = actionItem.SelectSingleNode(Constants.ActionNumber); - if (actionNumberNode != null) - { - actionNumberNode.InnerText = sequenceNumber.ToString(); - sequenceNumber++; - } + actionItem.SelectSingleNode(Constants.ActionNumber).InnerText = sequenceNumber.ToString(); + sequenceNumber++; } - // Clear existing children and append sorted action items - actionItemNode.RemoveAll(); + //Append sorted action items foreach (XmlNode actionItem in sortedActionItems) { actionItemNode.AppendChild(actionItem); diff --git a/src/UKHO.ERPFacade.API/Program.cs b/src/UKHO.ERPFacade.API/Program.cs index d25da19c..e482cf72 100644 --- a/src/UKHO.ERPFacade.API/Program.cs +++ b/src/UKHO.ERPFacade.API/Program.cs @@ -25,6 +25,7 @@ using UKHO.ERPFacade.Common.Providers; using UKHO.ERPFacade.Common.PermitDecryption; using UKHO.Logging.EventHubLogProvider; +using UKHO.ERPFacade.API.Services; namespace UKHO.ERPFacade { @@ -164,6 +165,7 @@ void ConfigAdditionalValuesProvider(IDictionary additionalValues sapActionConfiguration = configuration.GetSection("SapActionConfiguration").Get()!; builder.Services.Configure(configuration.GetSection("EESHealthCheckEnvironmentConfiguration")); builder.Services.Configure(configuration.GetSection("PermitConfiguration")); + builder.Services.Configure(configuration.GetSection("AioConfiguration")); builder.Services.AddSingleton(); @@ -178,7 +180,7 @@ void ConfigAdditionalValuesProvider(IDictionary additionalValues builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); - builder.Services.AddScoped(); + builder.Services.AddScoped(); ConfigureHealthChecks(builder); diff --git a/src/UKHO.ERPFacade.API/Services/IS57Service.cs b/src/UKHO.ERPFacade.API/Services/IS57Service.cs new file mode 100644 index 00000000..bafd564a --- /dev/null +++ b/src/UKHO.ERPFacade.API/Services/IS57Service.cs @@ -0,0 +1,9 @@ +using Newtonsoft.Json.Linq; + +namespace UKHO.ERPFacade.API.Services +{ + public interface IS57Service + { + Task ProcessS57Event(JObject encEventJson); + } +} diff --git a/src/UKHO.ERPFacade.API/Services/S57Service.cs b/src/UKHO.ERPFacade.API/Services/S57Service.cs new file mode 100644 index 00000000..c92c3110 --- /dev/null +++ b/src/UKHO.ERPFacade.API/Services/S57Service.cs @@ -0,0 +1,99 @@ +using Microsoft.Extensions.Options; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using UKHO.ERPFacade.API.Helpers; +using UKHO.ERPFacade.Common.Configuration; +using UKHO.ERPFacade.Common.Constants; +using UKHO.ERPFacade.Common.Exceptions; +using UKHO.ERPFacade.Common.HttpClients; +using UKHO.ERPFacade.Common.IO; +using UKHO.ERPFacade.Common.IO.Azure; +using UKHO.ERPFacade.Common.Logging; +using UKHO.ERPFacade.Common.Models; +using UKHO.ERPFacade.Common.Models.TableEntities; + +namespace UKHO.ERPFacade.API.Services +{ + public class S57Service : IS57Service + { + private readonly ILogger _logger; + private readonly IAzureTableReaderWriter _azureTableReaderWriter; + private readonly IAzureBlobEventWriter _azureBlobEventWriter; + private readonly IAzureQueueHelper _azureQueueHelper; + private readonly ISapClient _sapClient; + private readonly IEncContentSapMessageBuilder _encContentSapMessageBuilder; + private readonly IOptions _sapConfig; + private readonly IOptions _aioConfig; + private List _aioCells = []; + + public S57Service(ILogger logger, + IAzureTableReaderWriter azureTableReaderWriter, + IAzureBlobEventWriter azureBlobEventWriter, + IAzureQueueHelper azureQueueHelper, + ISapClient sapClient, + IEncContentSapMessageBuilder encContentSapMessageBuilder, + IOptions sapConfig, + IOptions aioConfig) + { + _logger = logger; + _azureTableReaderWriter = azureTableReaderWriter; + _azureBlobEventWriter = azureBlobEventWriter; + _azureQueueHelper = azureQueueHelper; + _sapClient = sapClient; + _encContentSapMessageBuilder = encContentSapMessageBuilder; + _sapConfig = sapConfig ?? throw new ArgumentNullException(nameof(sapConfig)); + _aioConfig = aioConfig; + + _aioCells = !string.IsNullOrEmpty(_aioConfig.Value.AioCells) ? new(_aioConfig.Value.AioCells.Split(',').Select(s => s.Trim())) : + throw new ERPFacadeException(EventIds.AioConfigurationNotFoundException.ToEventId(), "Aio cell configuration not found."); + } + + public async Task ProcessS57Event(JObject encEventJson) + { + var eventData = JsonConvert.DeserializeObject(encEventJson.ToString()); + + if (IsAioCell(eventData.Data.Products.Select(x => x.ProductName).ToList())) + { + _logger.LogInformation(EventIds.NoProcessingOfNewEncContentPublishedEventForAioCells.ToEventId(), "The enccontentpublished event will not be processed for Aio cells."); + return; + } + + EncEventEntity encEventEntity = new() + { + RowKey = Guid.NewGuid().ToString(), + PartitionKey = Guid.NewGuid().ToString(), + Timestamp = DateTime.UtcNow, + CorrelationId = eventData.Data.CorrelationId, + RequestDateTime = null + }; + + _logger.LogInformation(EventIds.AddingEntryForEncContentPublishedEventInAzureTable.ToEventId(), "Adding/Updating entry for enccontentpublished event in azure table."); + await _azureTableReaderWriter.UpsertEntity(eventData.Data.CorrelationId, Constants.S57EventTableName, encEventEntity); + + _logger.LogInformation(EventIds.UploadEncContentPublishedEventInAzureBlobStarted.ToEventId(), "Uploading enccontentpublished event payload in blob storage."); + await _azureBlobEventWriter.UploadEvent(encEventJson.ToString(), Constants.S57EventContainerName, eventData.Data.CorrelationId + '/' + Constants.S57EncEventFileName); + _logger.LogInformation(EventIds.UploadEncContentPublishedEventInAzureBlobCompleted.ToEventId(), "The enccontentpublished event payload is uploaded in blob storage successfully."); + + var sapPayload = _encContentSapMessageBuilder.BuildSapMessageXml(JsonConvert.DeserializeObject(encEventJson.ToString())); + + _logger.LogInformation(EventIds.UploadSapXmlPayloadInAzureBlobStarted.ToEventId(), "Uploading the SAP XML payload in blob storage."); + await _azureBlobEventWriter.UploadEvent(sapPayload.ToIndentedString(), Constants.S57EventContainerName, eventData.Data.CorrelationId + '/' + Constants.SapXmlPayloadFileName); + _logger.LogInformation(EventIds.UploadSapXmlPayloadInAzureBlobCompleted.ToEventId(), "SAP XML payload is uploaded in blob storage successfully."); + + var response = await _sapClient.PostEventData(sapPayload, _sapConfig.Value.SapEndpointForEncEvent, _sapConfig.Value.SapServiceOperationForEncEvent, _sapConfig.Value.SapUsernameForEncEvent, _sapConfig.Value.SapPasswordForEncEvent); + + if (!response.IsSuccessStatusCode) + { + throw new ERPFacadeException(EventIds.RequestToSapFailed.ToEventId(), $"An error occurred while sending a request to SAP. | {response.StatusCode}"); + } + _logger.LogInformation(EventIds.EncUpdateSentToSap.ToEventId(), "ENC update has been sent to SAP successfully"); + + await _azureTableReaderWriter.UpdateEntity(eventData.Data.CorrelationId, Constants.S57EventTableName, new[] { new KeyValuePair("RequestDateTime", DateTime.UtcNow) }); + } + + private bool IsAioCell(IEnumerable products) + { + return products.Any(_aioCells.Contains); + } + } +} diff --git a/src/UKHO.ERPFacade.API/UKHO.ERPFacade.API.csproj b/src/UKHO.ERPFacade.API/UKHO.ERPFacade.API.csproj index 9afae35f..37f6256c 100644 --- a/src/UKHO.ERPFacade.API/UKHO.ERPFacade.API.csproj +++ b/src/UKHO.ERPFacade.API/UKHO.ERPFacade.API.csproj @@ -15,12 +15,6 @@ 8600;8602;8604;8618;8625 - - - - - - diff --git a/src/UKHO.ERPFacade.API/appsettings.json b/src/UKHO.ERPFacade.API/appsettings.json index a308ce60..c624b00a 100644 --- a/src/UKHO.ERPFacade.API/appsettings.json +++ b/src/UKHO.ERPFacade.API/appsettings.json @@ -61,5 +61,8 @@ }, "PermitConfiguration": { "PermitDecryptionHardwareId": "" + }, + "AioConfiguration": { + "AioCells": "" } } diff --git a/src/UKHO.ERPFacade.Common/Configuration/AioConfiguration.cs b/src/UKHO.ERPFacade.Common/Configuration/AioConfiguration.cs new file mode 100644 index 00000000..1d0f8c7f --- /dev/null +++ b/src/UKHO.ERPFacade.Common/Configuration/AioConfiguration.cs @@ -0,0 +1,10 @@ +using System.Diagnostics.CodeAnalysis; + +namespace UKHO.ERPFacade.Common.Configuration +{ + [ExcludeFromCodeCoverage] + public class AioConfiguration + { + public string AioCells { get; set; } + } +} diff --git a/src/UKHO.ERPFacade.Common/Constants/Constants.cs b/src/UKHO.ERPFacade.Common/Constants/Constants.cs index 74978679..24963e27 100644 --- a/src/UKHO.ERPFacade.Common/Constants/Constants.cs +++ b/src/UKHO.ERPFacade.Common/Constants/Constants.cs @@ -86,7 +86,8 @@ public static class Constants public const int MaxXmlNodeLength = 250; public const int MaxAgencyXmlNodeLength = 2; - + public const string UkhoWeekNoFormat = "D2"; + public const string UkhoWeekNoFormatSeparator = ""; //RecordOfSale xml payload builder public const string RecordOfSaleSapXmlTemplatePath = "SapXmlTemplates\\SAPRoSRequest.xml"; @@ -138,6 +139,7 @@ public static class Constants public const string ChangeEncCellAction = "CHANGE ENC CELL"; public const string PermitWithSameKey = "PermitWithSameKey"; public const string PermitWithDifferentKey = "PermitWithDifferentKey"; + public const string AioKey = "AIO"; //LicenseUpdate xml payload nodes public const string LicTransaction = "CHANGELICENCE"; diff --git a/src/UKHO.ERPFacade.Common/Logging/EventIds.cs b/src/UKHO.ERPFacade.Common/Logging/EventIds.cs index f8d82346..93c87a27 100644 --- a/src/UKHO.ERPFacade.Common/Logging/EventIds.cs +++ b/src/UKHO.ERPFacade.Common/Logging/EventIds.cs @@ -446,7 +446,17 @@ public enum EventIds /// /// 940088 - Permit string provided empty in json payload. /// - EmptyPermitStringException = 940088 + EmptyPermitStringException = 940088, + + /// + /// 940087 - Aio configuration is not found. + /// + AioConfigurationNotFoundException = 940089, + + /// + /// 940088 - The enccontentpublished event will not be processed for Aio cells. + /// + NoProcessingOfNewEncContentPublishedEventForAioCells = 940090 } /// diff --git a/tests/UKHO.ERPFacade.API.FunctionalTests/ERPFacadePayloadTestData/AIONewCell.JSON b/tests/UKHO.ERPFacade.API.FunctionalTests/ERPFacadePayloadTestData/AIONewCell.JSON new file mode 100644 index 00000000..729b19dd --- /dev/null +++ b/tests/UKHO.ERPFacade.API.FunctionalTests/ERPFacadePayloadTestData/AIONewCell.JSON @@ -0,0 +1,2897 @@ +{ + "specversion": "1.0", + "type": "uk.gov.ukho.encpublishing.enccontentpublished.v2.2", + "source": "https://encpublishing.ukho.gov.uk", + "id": "47c82948-f389-41bb-a77c-bdd3f8c306d7", + "time": "2024-10-11T12:54:30.6083284+00:00", + "subject": "GB800001", + "datacontenttype": "application/json", + "data": { + "correlationId": "19cc417e-c2a1-438d-2837-08dce9f35151", + "ukhoWeekNumber": { + "year": 2024, + "week": 28, + "currentWeekAlphaCorrection": false + }, + "products": [ + { + "dataSetName": "GB800001.000", + "productName": "GB800001", + "title": "Admiralty Information Overlay", + "scale": 1, + "usageBand": 8, + "editionNumber": 32, + "updateNumber": 0, + "mayAffectHoldings": true, + "contentChange": true, + "permit": "ThisWillBeReplacedWithActualPermitFromKeyvault", + "providerCode": "11", + "providerName": "VAR Unique", + "size": "large", + "bundle": [ + { + "bundleType": "DVD", + "location": "M1;B3" + } + ], + "status": { + "statusName": "New Edition", + "statusDate": "2024-01-11", + "isNewCell": true + }, + "replaces": [], + "replacedBy": [], + "additionalCoverage": [], + "geographicLimit": { + "boundingBox": { + "northLimit": 90, + "southLimit": -90, + "eastLimit": -180, + "westLimit": 180 + } + }, + "inUnitsOfSale": [], + "s63": { + "name": "GB800001.000", + "hash": "3F1F37386541599066AFDA9967A8555730661B7DE9E0B269DBEEDAD240111DBE", + "fileSize": 1998768, + "compression": true, + "s57Crc": "DB4A0A77" + }, + "signature": { + "name": "GBP00001.000", + "hash": "9FB68AA72D3D6138E1DF2DB2FC8946783655942B9D6E7143C11F46A58848BC50", + "fileSize": 874 + }, + "ancillaryFiles": [ + { + "name": "GBNOOVER.TXT", + "hash": "44460F8B9586E7D5FD838F758BD7247B568706B4704E6BFC48217EB454049378", + "fileSize": 317 + }, + { + "name": "GB196063.TXT", + "hash": "36142A45A992CC023C64D444F161639C89CF37009582AED2C74D1C08C4B2F85A", + "fileSize": 719 + }, + { + "name": "GB224295.TXT", + "hash": "36528855E0E1484F8DCC211F2BCA369D93F4433C7380C9F91C616E283E43F73C", + "fileSize": 629 + }, + { + "name": "GB238002.TIF", + "hash": "1C7B04F6D39CA1AD0E7B9CDAF4BAC0F16C4BC5B7014C7262F9D4A2BC64666A84", + "fileSize": 46260 + }, + { + "name": "GB247A0T.TIF", + "hash": "235410C7928C9B459BB570FD131DF98162AF11DA0E1C125CCF9469A40E27BA82", + "fileSize": 315938 + }, + { + "name": "GB195627.TXT", + "hash": "6F508529D437A93E4141F87A2577339212EF4E7DD2667B67B718AD0D0123401C", + "fileSize": 1827 + }, + { + "name": "GB224297.TXT", + "hash": "88A93130131692572C9C36F3175E9B12B59FACB6E2D724943287C2403546C7A0", + "fileSize": 738 + }, + { + "name": "GB196384.TXT", + "hash": "CF4E54645EE318CC385C8A6B739CB9A257CF1856CCDB20D212D87A2C96094DEE", + "fileSize": 2775 + }, + { + "name": "GB03180X.TIF", + "hash": "BACA4A9F9326CC88FD2DE5BFEABF41704E73D95B75C7175A1EDF5757900A89E4", + "fileSize": 22988 + }, + { + "name": "GB419516.TXT", + "hash": "DAA23DADF320280FD370200DA12353765ACE02C6075618BB7AB366DF68B61C72", + "fileSize": 6616 + }, + { + "name": "GB419516.TIF", + "hash": "3C30D2A28AECEEF3133DCDFD1C08E30136249A40EF883B525B2987A3388F01C2", + "fileSize": 143924 + }, + { + "name": "GB224182.TXT", + "hash": "13EC9D5C61D491354B3EC46239E2FF49E238852F9E074920A364991DAD8155C1", + "fileSize": 2178 + }, + { + "name": "GB224224.TXT", + "hash": "4D95F4F810AC227F01F6377C5E79521E10B24AF2472FF05B9C99BBB2FE2A7331", + "fileSize": 561 + }, + { + "name": "GB282F01.TIF", + "hash": "9FF65FA25F010BF766BF35B5D818CA86FFC8BE7B9A326F71953B159EEB3B6251", + "fileSize": 176454 + }, + { + "name": "GB224213.TXT", + "hash": "610F452C5826F55E36013E065C16F661CE3CCD3B4E7BC9753ACEF903BEF7B91B", + "fileSize": 756 + }, + { + "name": "GB1A480A.TIF", + "hash": "A6329F77CA136C47359D87A516EB5D48ECD993BC69246BF582904BF1BB20855D", + "fileSize": 21654 + }, + { + "name": "GB0C2009.TIF", + "hash": "A46CAD0AAF79E798992841B89F61FEF48046E6C781760D1D23E352A91E0F90B1", + "fileSize": 57800 + }, + { + "name": "GB224283.TXT", + "hash": "713C797415D37114455823DF19A8E9CEDA2814F06DB24001EE8FDC29E071A7FE", + "fileSize": 1023 + }, + { + "name": "GB0EF00Q.TIF", + "hash": "AAEE690A8B2C55926FACB6A9FEC00599E582D02C02AD0653C2119E4C3B60102D", + "fileSize": 31056 + }, + { + "name": "GB0C7518.TIF", + "hash": "E1B4155B5AF42731982522D22697DF05E4599E27F6672C073C86CE4B42646E44", + "fileSize": 56544 + }, + { + "name": "GB02882C.TIF", + "hash": "1978E340A5AB486DEC29755BF31C3E13FC1F51DF02176CC30E2C28EA5FF1CF41", + "fileSize": 39312 + }, + { + "name": "GB211504.TIF", + "hash": "8015E3E3A4CEA81B770739CB78C65295055CDD223614D6CC3DB082B49FDC4653", + "fileSize": 34472 + }, + { + "name": "GB220598.TXT", + "hash": "40779EB122BC7CC06457D9042C6F62D29242546FF01076EE2E7DE03183A216D9", + "fileSize": 476 + }, + { + "name": "GB238001.TIF", + "hash": "DED60C443295F7F786E8185BC703BA19BB30DBFAEE24FDA5DB344A743DB488EC", + "fileSize": 46510 + }, + { + "name": "GB195385.TXT", + "hash": "1FB3853E000361AF1E56EC46B5A4D7B2EB754B3A721CAA2D59B1EB9C4027EB22", + "fileSize": 537 + }, + { + "name": "GB224530.TXT", + "hash": "037E36B2346A010407916C94C0A69508AC5E22C221CCA69F5827C6311716F0FB", + "fileSize": 1005 + }, + { + "name": "GB185983.TXT", + "hash": "677C028B08AF6A716ADB93BF27D2CAE1AAD75CD8D6AE0F28194743104261D4D7", + "fileSize": 506 + }, + { + "name": "GB172152.TXT", + "hash": "E446EF42E4D0EC4FEB3D45D3976FABB386895EEBCA8A29EC3EBF666F95266723", + "fileSize": 524 + }, + { + "name": "GB224798.TXT", + "hash": "BFD051AB7C02D919A5D2EFF1C3C24CA57363A396AED68FF16652A5B2B1BC2FC1", + "fileSize": 1339 + }, + { + "name": "GB195223.TXT", + "hash": "FCFA80FB3799FC26FA6374322C3CEA906EC055EDF31A7AF23E302B9935770C5A", + "fileSize": 511 + }, + { + "name": "GB466616.TXT", + "hash": "2C2A18D3C73E858E323046B5A31CB57A4652F6E23192BB64ACC554C03FB35BF0", + "fileSize": 817 + }, + { + "name": "GB221105.TXT", + "hash": "2B65853F6746B8F367DAF9D8D75601BA4616B8B6D8E946F8662E05024180F1F3", + "fileSize": 3533 + }, + { + "name": "GB0C200G.TIF", + "hash": "25F781876C12771115809973F21D01EDF8E08DDD496E39901086F6E550660B28", + "fileSize": 63400 + }, + { + "name": "GB211375.TXT", + "hash": "B0A454DCF5151B86F9A4B00CBDCF1C37E25BE43AF61862BA8FCF6356EBE4451C", + "fileSize": 1004 + }, + { + "name": "GB194737.TXT", + "hash": "570A9E7E232F6C9CD6A0EBFE5334715C7D4342D1B1CE2E43C70AA7FFAD5D7B5C", + "fileSize": 640 + }, + { + "name": "GB449216.TXT", + "hash": "9161023B78D21DD67238DD8DA708454475DD317E2D37715F7EAA71EA4DBA329B", + "fileSize": 5495 + }, + { + "name": "GB224923.TXT", + "hash": "C39DFB7EBC96C48D0EC9B610D5FF7935ADC0EE3D0E74A3A7A09AD7B8A27E4C6B", + "fileSize": 559 + }, + { + "name": "GB284401.TIF", + "hash": "F7CE3DDADA4684066F53C9C516436C2DFDA2FEED763935B048F65819196973E5", + "fileSize": 121474 + }, + { + "name": "GB211320.TXT", + "hash": "8E77FD533F8A6443B08FC2C06DB598B8F1EBC53DCCDF15CA2E7C8A42B82BBF27", + "fileSize": 507 + }, + { + "name": "GB212825.TXT", + "hash": "097CA5387245CDA596B854D9612F6DCCBC1293A5C90003F41DA9A9169F1C51B3", + "fileSize": 804 + }, + { + "name": "GB260301.TIF", + "hash": "8190B904C4C4557AA03F5E14DDA22251A50EFF5C95C4DFF13005C40B55BB508A", + "fileSize": 609688 + }, + { + "name": "GB0C7515.TIF", + "hash": "2686F25B26581BCC39001C55C3C71A9F26D4907B5B964361D09B76E2D523FC53", + "fileSize": 56684 + }, + { + "name": "GB211276.TXT", + "hash": "7DF73D5728A3D705868B58966D20DA94A7531703BC96E85BC754097B4DDCB4FD", + "fileSize": 674 + }, + { + "name": "GB194697.TXT", + "hash": "D9416704907480019275260B776D60642B4390137BF0F8C2DE8BD5515F1C40B6", + "fileSize": 698 + }, + { + "name": "GB210874.TXT", + "hash": "C2545B1C9A23099A341CCE6E6F4DEF2A5CE3D5BE2BCDD57A77CF2B25A379FACC", + "fileSize": 2960 + }, + { + "name": "GB210874.TIF", + "hash": "5BBA9B49BAD708D8942E2B8B6AB0D2B4E3543A7248F3765734D06DF7102BD41C", + "fileSize": 120764 + }, + { + "name": "GB194326.TXT", + "hash": "C94CD837183F862E62DA902AD691C8A439F7317C0DDE5017A6BB51EC3E8A4FA3", + "fileSize": 858 + }, + { + "name": "GB136C02.TIF", + "hash": "0B770A5E3E0C2559DEDAE0CF144F6B6533E9E9AF5DF7D17EF4AA02A8C8CA758E", + "fileSize": 70144 + }, + { + "name": "GB194290.TXT", + "hash": "C7B140D956B5586AC2C76BAA262C92ED97BDC100E2FE1A81EE187A1005BC20D7", + "fileSize": 539 + }, + { + "name": "GB26011D.TIF", + "hash": "D2B5BE5D00C440B2EC3A6F983FC99F7F1024BA35DEB3D02BD41849B60DE2F2A2", + "fileSize": 91616 + }, + { + "name": "GB175395.TXT", + "hash": "31920C9365CEC76855DDFB5AA998F9BF7A8702DF1AC3E26695AF65F0F081121D", + "fileSize": 543 + }, + { + "name": "GB193987.TXT", + "hash": "B35F72E24ED24C6611F7B6081823B44F6F1D503D44BE6BD938714A6EF6807485", + "fileSize": 850 + }, + { + "name": "GB0DA703.TIF", + "hash": "3F4BE464968CF197B6E9D810A4AF8536F88312ACAA1162BF09DC95F4C932213A", + "fileSize": 35624 + }, + { + "name": "GB0C2001.TIF", + "hash": "22AFF6CDB47B176E8B7205A12B00BF8D38730B2B31A7E051AE58562BC89FA0F4", + "fileSize": 59384 + }, + { + "name": "GB210706.TXT", + "hash": "24DB9B341BD9E26C3DB5ABC0E19964597DCCE3898A7E2C4B081A3A472EDBB44E", + "fileSize": 739 + }, + { + "name": "GB193109.TXT", + "hash": "2E2B8DC2BE69CCE785795C79D16E3AF95CD1A2C94801D2FE5D4BD37A7BB23D62", + "fileSize": 469 + }, + { + "name": "GB156C12.TIF", + "hash": "3D6956259025C78C3DE970B9BF99FF9451F8E0992EFB7A0E78D9DBD3DFBE486D", + "fileSize": 52876 + }, + { + "name": "GB0BE706.TIF", + "hash": "290643934D74CDF153807A85DA38D204520BDD68AFAC9055BB22DE3CCC0092DB", + "fileSize": 30732 + }, + { + "name": "GB193392.TXT", + "hash": "15911D77984536BB7A2F27F834C480532D71FD17E13DBD33EDE3140B0048B700", + "fileSize": 552 + }, + { + "name": "GB193088.TXT", + "hash": "E4069AB3970151FEAD09B3C7B0BA1DD7BAD7EAF1D806BD6482100B29DB23CD83", + "fileSize": 487 + }, + { + "name": "GB210165.TXT", + "hash": "AE54AAF8E47E149E8111E6659B9813029E0B0D3C0B593503DDD2FAEE36CBF83D", + "fileSize": 508 + }, + { + "name": "GB192871.TXT", + "hash": "DFA5FE168A3A0D71E6D939C62BF08363E3F9D086DB9DAE872176A15FC96AABFA", + "fileSize": 728 + }, + { + "name": "GB210219.TXT", + "hash": "30070A3336FCA532DFC29A6EBB7FB51EA98A89EBE1E73B9D34CE7478BC55B7F3", + "fileSize": 504 + }, + { + "name": "GB192745.TXT", + "hash": "A50D6AE1E0E5419BFEA93785B5C4A1377B648018BAE0E903B91F571628AD7033", + "fileSize": 1398 + }, + { + "name": "GB0B390F.TIF", + "hash": "903F585B1FA1432F15C048804FB622CD57ED43F9B9DB776170050C59706E0E13", + "fileSize": 29648 + }, + { + "name": "GB0C1F09.TIF", + "hash": "EFEC2012A3F5C8094FB67661D2DE804CA7E26B0F80E56836CA22AE262DF43B18", + "fileSize": 22580 + }, + { + "name": "GB206251.TXT", + "hash": "EE8840E31FC4EA3CA42A952273000C1B22652DA0FF88F810CA9524AB178DDD22", + "fileSize": 563 + }, + { + "name": "GB192630.TXT", + "hash": "2F8ADBD1D96AE48391F4574DA0D6B1A2CB5880030862F3398E804FC5D40586D0", + "fileSize": 513 + }, + { + "name": "GB194195.TXT", + "hash": "B284259BD220CD9D46270F7B63582B58626088C597A34A766D96039B53CEA492", + "fileSize": 899 + }, + { + "name": "GB192345.TXT", + "hash": "37C51FE3D285708156DD8D0D4B42931574D4575B112001568700D1F2DE4C91F2", + "fileSize": 679 + }, + { + "name": "GB123C0Z.TIF", + "hash": "8B3EFEC86E343A5FB2237074D71DA893EE380A001365CA3FF50E1BB5FF5BD9BE", + "fileSize": 162428 + }, + { + "name": "GB182839.TXT", + "hash": "A8618BEB0EFB865F2AB0AE0FF68D7C7C42C595B50FF9A322D219AB492E66C05D", + "fileSize": 2034 + }, + { + "name": "GB192203.TXT", + "hash": "29527C2EFEBAD27FDED12FCCCBFDDE307D02058888F893AF83F4C6AAB34CAA07", + "fileSize": 827 + }, + { + "name": "GB215164.TXT", + "hash": "19C81AD8935EA11D6E3A480D5F52F67FE04A8617F288EEF2581F7D5908F6A4CB", + "fileSize": 742 + }, + { + "name": "GB192106.TXT", + "hash": "86A8F37E723802C5062DC8CA59BCC8F43810E365727B40480855DB4F9F75CD5B", + "fileSize": 1036 + }, + { + "name": "GB211502.TIF", + "hash": "2828B4E83A8E1BECBCB5CABF7E9AEE4E89D9E2F7B9099D4DAF53EC0AB0E04E7B", + "fileSize": 12558 + }, + { + "name": "GB10080K.TIF", + "hash": "EB528642D46885128B3BF04E3BED4B591573C4CEEC2ABFCD9B287B83E18F990B", + "fileSize": 22272 + }, + { + "name": "GB204813.TXT", + "hash": "07F3043BB545425A1DE969D1ED44AFC08318E1B5D50BCAAEB54853360FCB6FAF", + "fileSize": 663 + }, + { + "name": "GB192078.TXT", + "hash": "44E88764DD59BD88C3492C2676A502929DCDD6871F51DFB58D4344AF6AD8E521", + "fileSize": 853 + }, + { + "name": "GB0C830Q.TIF", + "hash": "CA412735FFD9FFE075D946B194D1DFE408F2BF18A1A541F5822A655CAB981D3E", + "fileSize": 31580 + }, + { + "name": "GB204424.TXT", + "hash": "FAB05FDE6FCDFE7CB5BF686DB370AE440D6965B1A86931122F21E0EBDCD5937B", + "fileSize": 524 + }, + { + "name": "GB191646.TXT", + "hash": "A24B577E3194D66B9545C2D75ACB7A26A7C1E44DA83A07DBF6B3538CB3514D54", + "fileSize": 616 + }, + { + "name": "GB0BAB1V.TIF", + "hash": "DB2612405195B6989F633772C654BF95EED308375501F7641332280676A747F2", + "fileSize": 64948 + }, + { + "name": "GB123C0Y.TIF", + "hash": "21FEF325E6B75F3716EF9D02F1322FE561AAA25C3612D5DBD5511AD3724934A1", + "fileSize": 146568 + }, + { + "name": "GB204110.TXT", + "hash": "C2A6453D184364ECC502687DB8E10A8777844DCC14AB5C8D828737922A50CD4B", + "fileSize": 696 + }, + { + "name": "GB185625.TXT", + "hash": "975D38198A8F16A5559A46CEEAD93596EE7EEFD664D7BD596E302D52A5AC2140", + "fileSize": 692 + }, + { + "name": "GB0BAB1W.TIF", + "hash": "A51578EBF8FC2C24A9BA46743F0E40CEFF1FCB1173FDCD5D82317C8BDC43CF3F", + "fileSize": 49408 + }, + { + "name": "GB0C1F08.TIF", + "hash": "FAD0BB2AB894B8438804B4B45477D7F448431F96FF22E83BBFC71D517F65CCF2", + "fileSize": 29292 + }, + { + "name": "GB118606.TIF", + "hash": "AA7573263924DDC6C9691E8A88A9C8FDAAAEE0B202B26202D882673A754F544B", + "fileSize": 31328 + }, + { + "name": "GB118607.TIF", + "hash": "99A95DF3D953926FFFB6CFF25580E0F46F283B340F8F34D8FD624A70600BC018", + "fileSize": 37040 + }, + { + "name": "GB0C030D.TIF", + "hash": "B33BF36767DC0FE7536B0F6AA4A206F63255D5F8389105A48060F96F0A817FE2", + "fileSize": 65200 + }, + { + "name": "GB26233Q.TIF", + "hash": "72BED8CC6FAA9F56D56C0246D1401EC8A75ED48045AC4E5EB9B1E7FCB6FF6846", + "fileSize": 258114 + }, + { + "name": "GB034E1K.TIF", + "hash": "928549E90A8F90553BC8F29591FAB6286AF5F3693FA73F6063D0968A8B50A6FB", + "fileSize": 115204 + }, + { + "name": "GB287D03.TIF", + "hash": "E2D910D43C00716C6E37169061BB5899509FA3D512B87D250A33A7B9E5C6FF85", + "fileSize": 76526 + }, + { + "name": "GB1DF41D.TIF", + "hash": "78DD5673729076FF5D6C016A43C7F0C6F8D3C92CC0953933A1876E4C214A89A8", + "fileSize": 58556 + }, + { + "name": "GB0C1F0B.TIF", + "hash": "5558A36FD9883BB951F74E22A9B6B6A7B0E7B274195DDE9EE591F7865FD44FA3", + "fileSize": 31812 + }, + { + "name": "GB26233R.TIF", + "hash": "AF73778BA424E1804DB16BF6FF245D05A63BA79F14C39034F8458214B365890F", + "fileSize": 181972 + }, + { + "name": "GB287D04.TIF", + "hash": "42E428F8FC6EF338A374857C308A0DAC25B4D91093F73DA50426D5ABE75EAB08", + "fileSize": 50678 + }, + { + "name": "GB26233S.TIF", + "hash": "4E7A7A27C11A171B91BA087048FF78455621A74B68BC5B678315652E0C659D7B", + "fileSize": 184214 + }, + { + "name": "GB0BF109.TIF", + "hash": "AB0B0C24058DA318DB701C76664A97783061E9C5ABE948AD069A83762701951A", + "fileSize": 14820 + }, + { + "name": "GB25F508.TIF", + "hash": "07C3214EB5493CB36C97F0EDC8A33BB7E68B8B2CBC57A7AE999AEA2A841B1AE6", + "fileSize": 108652 + }, + { + "name": "GB26233T.TIF", + "hash": "19CB6DECFD0F309947007CEC662B5B04124E4C01A214C242586956EEBA397D5C", + "fileSize": 269436 + }, + { + "name": "GB26233V.TIF", + "hash": "C74F2A8185F890DDDB3085687B8E9A40A5B3C27287DBD6D7004D938A3E012567", + "fileSize": 140768 + }, + { + "name": "GB10081E.TIF", + "hash": "DA74CD93F0D4385311F3CB88B9F8DDC689428511DF96BAF6616A560D8807794F", + "fileSize": 18244 + }, + { + "name": "GB0C1F0A.TIF", + "hash": "5A6320AC9EC52A8F34109BAC8BECA21B68E5240672379097997567D884F91E8D", + "fileSize": 37512 + }, + { + "name": "GB25F509.TIF", + "hash": "BEDC09DCBF901EE64437EBB8FB0983F39F160A1CFDB4F8417AB481C2B10110BC", + "fileSize": 168574 + }, + { + "name": "GB26233W.TIF", + "hash": "2F6A271C8223FC6262C728D7D86C99497A3F471B2849D8F7E2574F41EFCF21A6", + "fileSize": 372566 + }, + { + "name": "GB0C3119.TIF", + "hash": "833A7E459206C24273A50201E460CB3C1E42AF68BC6D017521DD51A8CD95F85B", + "fileSize": 27012 + }, + { + "name": "GB1DF41C.TIF", + "hash": "008108C458AC1C7A66B9B58F7C279D8A969A992884897363CC73845BA5AC0547", + "fileSize": 53996 + }, + { + "name": "GB1DF507.TIF", + "hash": "9D8F3870A08B4C877D5310A2ED225503B373D2DEC86153621D7D97601BC916EC", + "fileSize": 133104 + }, + { + "name": "GB100712.TIF", + "hash": "E6F851E87DEFBE0B0B964860C4218B08C84DE46D6A7BD0FA8C3F15D59277DE10", + "fileSize": 19288 + }, + { + "name": "GB25F206.TIF", + "hash": "EA39403C93A338584898763A85BDB3D6227EA1094A40312A1D2CD96F57B4A284", + "fileSize": 345908 + }, + { + "name": "GB123C0X.TIF", + "hash": "621BA29B6B38535A8A2B305F6E144B5D9D628F1F7B464E506908BF7A0F62D101", + "fileSize": 57512 + }, + { + "name": "GB0D930F.TIF", + "hash": "ED3F3F324D2962582862B7991B772C7B1EF99B8BB4732754D42A554EDA1B0C08", + "fileSize": 67104 + }, + { + "name": "GB25F207.TIF", + "hash": "BC45DE4B5437265B8F46D5963CB946443DC545E7FC6BA1F05F3346BAB77D959A", + "fileSize": 172170 + }, + { + "name": "GB262333.TIF", + "hash": "3A06A8C628445335BE5368235B9C23CFDE69DAA7F8E3279D597BF6B7E6632065", + "fileSize": 293788 + }, + { + "name": "GB25F208.TIF", + "hash": "9D8CFA6F4D1D0C72C5CB3EF2E3C1B197840596B6EA9855500305470224F3FE2F", + "fileSize": 149664 + }, + { + "name": "GB262334.TIF", + "hash": "805E66AB503A461017D44D3145424236F47A2E1AA3F2773A76F9A5E7107DCD01", + "fileSize": 88406 + }, + { + "name": "GB156C1T.TIF", + "hash": "FCF8AE6FA272378DD11439E4A56FF1CC3068C587B384AFE37DC5E10DE3B6EE5A", + "fileSize": 58416 + }, + { + "name": "GB196402.TXT", + "hash": "1B6F7E04BC69DECA08D22AA01BD23C199AE87797FDCD87CD1FC5BCEF3AC6D236", + "fileSize": 2056 + }, + { + "name": "GB218813.TXT", + "hash": "CCA408E3451D8DD13426C0CA6CBEC8B601FB0C27EA66AF6B9FB364C9EB499214", + "fileSize": 596 + }, + { + "name": "GB262336.TIF", + "hash": "CE79B9DBF7B46DAA8B9E3959AF8A01740D685C54447A68D7811FFF46F185D180", + "fileSize": 353252 + }, + { + "name": "GB1B6B03.TIF", + "hash": "3C949AE1E5005EB7102622412899AD3DA22F67CB48FDA6661784F6BE850B0F18", + "fileSize": 94968 + }, + { + "name": "GB087716.TXT", + "hash": "C25A3CD9D2F9D031908F179E06AF2CC255F9D7B6BE58A5F1E0E9B7DB7868F820", + "fileSize": 1020 + }, + { + "name": "GB645315.TXT", + "hash": "62DDA869B9E7D4C118203A3271ECF889558CCDD50B4E1E9F3C1489AD454C3BC4", + "fileSize": 606 + }, + { + "name": "GB1DF40B.TIF", + "hash": "918BD72EF79C803E416C1956245E122A631F08E2E2774AAD98BC13585DCA82B0", + "fileSize": 33752 + }, + { + "name": "GB092C05.TIF", + "hash": "4DF9B4327AE4546B7EC3F614B519F99BE3F123CEFD4A5AC917B69910650A2595", + "fileSize": 32464 + }, + { + "name": "GB028A0Y.TIF", + "hash": "65F2D4B59E6C9922A9CFEF96A3C158DB6B8BE9BF3EF771DD4E8E98333E9BEEF7", + "fileSize": 125712 + }, + { + "name": "GB214622.TXT", + "hash": "DE32D4E28DC898712ADA2230175EE8BEA11D36A60C9E86B3CF5A8BEFA81FA178", + "fileSize": 1188 + }, + { + "name": "GB214555.TXT", + "hash": "B9B8EFF9601721FA51163C4E4BE2897B47772C00B80B1118F73774607836F391", + "fileSize": 816 + }, + { + "name": "GB1B6B01.TIF", + "hash": "A84DE55EA587C267E0DC08C5B469AAB69C7B200BD9850A9771F54137FED20E45", + "fileSize": 67132 + }, + { + "name": "GB214529.TXT", + "hash": "38C06E4EC01684ABFEEFA4B331AC1B2675CD31FFBE119E5AAC8639C16D71452D", + "fileSize": 935 + }, + { + "name": "GB1DF402.TIF", + "hash": "56CCA4FA125B3DA869720C986EC2EEADE596B5E1A449266CD1AF3540E48CA99A", + "fileSize": 30084 + }, + { + "name": "GB18E107.TIF", + "hash": "A603DB4ADF1A95F0C6C89F5735398F1253627A590D7B22F2E4DC09F3F036F9AC", + "fileSize": 111264 + }, + { + "name": "GB0C830T.TIF", + "hash": "1A374846920DD6BD825870CB0FD0F6A1CE557C71BF6714D6825ED31513C1CFA8", + "fileSize": 40760 + }, + { + "name": "GB156C18.TIF", + "hash": "78C61A302A5E9C98D7077BB10AE560D8E1CFBB94B825B96BD317FE56CC8B2F43", + "fileSize": 50332 + }, + { + "name": "GB11BA0O.TIF", + "hash": "833F0EA80D4C52A036380BF88C0C5DB1FD853E03617EACBB205C98C2ABCEFFA8", + "fileSize": 16148 + }, + { + "name": "GB232504.TXT", + "hash": "AE3DE737DA5A1AF2FF84D3A0F7E252995B610A35E65D76212D784CC0E6506B7D", + "fileSize": 4687 + }, + { + "name": "GB1B9007.TIF", + "hash": "FCDE7361EA5114439994F45E5304AAAC876CC03A62EB49875BDCFC59C6DD0A2F", + "fileSize": 63076 + }, + { + "name": "GB10FE0W.TIF", + "hash": "7234515D4339F233796DA1D7CC09CEB33D6169D7E051A25827C642B4A4D5B9C8", + "fileSize": 35520 + }, + { + "name": "GB214125.TXT", + "hash": "86EB1FC4C5E93E05D456FDA7E9562CD4F7E29C4803875BD39194D62AD0F37930", + "fileSize": 850 + }, + { + "name": "GB034E2C.TIF", + "hash": "F7D2117667216DF65EC0BC982750409DCFDE9733522140D5A19BE22948C74582", + "fileSize": 191596 + }, + { + "name": "GB213931.TXT", + "hash": "E2096145E03622632CCCF733DA1DD1D38F61057D446A1A66E9EAAB512A1034D3", + "fileSize": 947 + }, + { + "name": "GB034E2D.TIF", + "hash": "547BCC5DDD0BB00A82530E3862577134BFE31A52F8C16E60529E7726466D47D8", + "fileSize": 19756 + }, + { + "name": "GB213859.TXT", + "hash": "189F28C86EB302CA11974C027239BA186752A939E727EF3B6C207C4C58A2B8AE", + "fileSize": 540 + }, + { + "name": "GB034E2E.TIF", + "hash": "12043D51FA21D8486435EEE07BD2C9650FA7945AD571EE60DFD7AD236AE44EA7", + "fileSize": 46722 + }, + { + "name": "GB213518.TXT", + "hash": "012D7D213DC8AB5084F72C60D91CC2BFD7C523402DE2DE70E30130A6C2B9519F", + "fileSize": 736 + }, + { + "name": "GB034E2F.TIF", + "hash": "42B9C4C0EADC195A778D28EE2A00C46DD7EC0B27F0CC2A0C4D05E01D9FF6F21F", + "fileSize": 23056 + }, + { + "name": "GB0CAD0G.TIF", + "hash": "E8696425B3D7F8F6029C5E5FE318F0596EC9D1FCA7175D3A6369054A272D1D63", + "fileSize": 19032 + }, + { + "name": "GB213513.TXT", + "hash": "AC24DE92FBEAF48A0A8971390D0A0A60BB2578B809764027533BB7C3D59251AA", + "fileSize": 789 + }, + { + "name": "GB0BE707.TIF", + "hash": "CDB3AFAFC12EEB4FBB8975C8D8FC77597E78FF483AB273E8659949184B6D08D6", + "fileSize": 19060 + }, + { + "name": "GB212409.TXT", + "hash": "2FC451CD5DC100DC7C55AC934BBF35E3E5333A17B97B68A6B89EF64EC2468FA3", + "fileSize": 1124 + }, + { + "name": "GB1B600C.TIF", + "hash": "6907714C27EAA9B2EFCF8EADCBE33861AF0978FB4FC16E7B67FF10526F0143B2", + "fileSize": 64696 + }, + { + "name": "GB0B392J.TIF", + "hash": "C0B71DF4CFFEAD269D457B1A8A34A8F1D9A96183DE3C4DB0FDCA8B0EB58D964D", + "fileSize": 18672 + }, + { + "name": "GB18330E.TIF", + "hash": "31AC9DB77282896D13C4726878822E6198CA1611BC95E26342F66B08F43992B1", + "fileSize": 164548 + }, + { + "name": "GB282E02.TIF", + "hash": "B71400AD1161C39DACF085A734FD5DF4782F44A668D312DA628CA56FB6004779", + "fileSize": 219584 + }, + { + "name": "GB232805.TXT", + "hash": "DB141D3BE92FCDEB7903188B997BF745E407BED55525DA6F7090A3EF70402EF3", + "fileSize": 566 + }, + { + "name": "GB1E2E09.TIF", + "hash": "7ED4FC70B2505D54CD624A634DE4BCEF0ABD60E35C89E48824A546B338510D28", + "fileSize": 18320 + }, + { + "name": "GB19060Q.TIF", + "hash": "9DF02435D552A957365544EFC29CA69C61926978BFD3ECF9EB1B2D6523A5F415", + "fileSize": 106236 + }, + { + "name": "GB050D05.TIF", + "hash": "B8757E86119BACCADDFE9EB5362A358EEFB631C028310A6B4A3AE6D8952A3593", + "fileSize": 23116 + }, + { + "name": "GB220474.TXT", + "hash": "808EB94C639D7A599BF012894CCCF68AD739B1BD982C2BB47684F699FE0D52D9", + "fileSize": 4016 + }, + { + "name": "GB232806.TXT", + "hash": "D3362AF3DF17B7D7768503D8FBFF31E7713C416BC89FD4B8FCCDC2E5489E6F5B", + "fileSize": 565 + }, + { + "name": "GB224962.TXT", + "hash": "202FAFD4259BC15ACA0DEAF68ACAEC7E4EE04EECAD56D58A802656137423EDDA", + "fileSize": 525 + }, + { + "name": "GB232837.TXT", + "hash": "478A85026143CB09B2AC6F1D47047D2BE6B22860E74D8E4B1CD243F773DE682F", + "fileSize": 1005 + }, + { + "name": "GB224993.TXT", + "hash": "95FFA76930DF189DEDFA4BBCE3CEC72C1E7190EE362A7FD5142F00805AD0C250", + "fileSize": 522 + }, + { + "name": "GB232821.TXT", + "hash": "3D1796A28BBC4AA813E4F598B1B9B96287B114D554549E48F5AFB912A83239A6", + "fileSize": 556 + }, + { + "name": "GB225134.TXT", + "hash": "99C73C33BAA20F42ACDFD4EC45A37BC9DFAFB37BA422297F899C49D8D4436220", + "fileSize": 527 + }, + { + "name": "GB232978.TXT", + "hash": "A225DD2244A2A91DFEC1177F311406816920FB87E234CD4E77B9CCE8D1F69168", + "fileSize": 957 + }, + { + "name": "GB230098.TXT", + "hash": "4461FE1279E2EF2C425F05C027F6F28AF01F52B0AA86D5253FFBFE3962DEED6B", + "fileSize": 586 + }, + { + "name": "GB231114.TXT", + "hash": "48EB724CEEF0FBB7167BFAADB6BD55F391EAD947FF42117EEF2889DEDF18720E", + "fileSize": 518 + }, + { + "name": "GB11B004.TIF", + "hash": "B60411963A7F87252A6B9A0EFCFB1274B25280B6C092FA135CF4EACB9A84EF5F", + "fileSize": 20664 + }, + { + "name": "GB230223.TXT", + "hash": "0B8AEA7ACE52402D36963C78A99D221ABE235E2D8FC143C69DD288826A9C88F9", + "fileSize": 705 + }, + { + "name": "GB232987.TXT", + "hash": "7F7E91188936EB524471A6038220CB625193104F2A80FB611383026D95CD1312", + "fileSize": 692 + }, + { + "name": "GB170D0B.TIF", + "hash": "5B878008405CF2D7C1D29C65AB5256279C02D3311B232B00F20A907A510DF840", + "fileSize": 51616 + }, + { + "name": "GB230244.TXT", + "hash": "64F85FC6513EF1F39397CD553B5446A3752665027F37074F22F2E9203245A6E6", + "fileSize": 1240 + }, + { + "name": "GB230397.TXT", + "hash": "E47F947D14C6E7F01100E08EDBA89E0B8AEE6DA87F184ECF3F7335E7CE03A231", + "fileSize": 2073 + }, + { + "name": "GB050D08.TIF", + "hash": "925C79780B5394C8DFB3F91C414FC4C1EFBD3D354E7E8C679F530907CA94E83D", + "fileSize": 24676 + }, + { + "name": "GB230607.TXT", + "hash": "7E2CEEBA36576C85843DC483B32F78451A5CD51D0DA71769C062EF6F697C46F7", + "fileSize": 492 + }, + { + "name": "GB178D06.TIF", + "hash": "FF1C7A1173DB91169E73B6C38E6F8207BBB05CA0037B3AD33E92FB7575206223", + "fileSize": 53584 + }, + { + "name": "GB230638.TXT", + "hash": "7E8831A334761CC45BFAC5CA3D6ECADA358EAAE089109CD361C955D589D9044A", + "fileSize": 1759 + }, + { + "name": "GB230686.TXT", + "hash": "789E7B3D0355D7657FD0CDE54F448FF1C145B48614F64DC22636A700A9D26043", + "fileSize": 572 + }, + { + "name": "GB230755.TXT", + "hash": "4E513F3F724CC72BA45F123FB834901DB284E090FEEA037E0B7F4CC255B46CC6", + "fileSize": 646 + }, + { + "name": "GB034E0Y.TIF", + "hash": "C30A020EF8B7FB16ECE954FB388071C280BCB1E948A08B0B02EE87F2146C8D3A", + "fileSize": 19452 + }, + { + "name": "GB230812.TXT", + "hash": "870E1FF1DB2D28CD2EA2F708D255648767FB9B51269B8DA2C956D7FC08455756", + "fileSize": 972 + }, + { + "name": "GB230810.TXT", + "hash": "334E7AAB63F81DC00B89B72059F54F4342405D285DC3978AC60975BB251BB844", + "fileSize": 2483 + }, + { + "name": "GB230810.TIF", + "hash": "8AD1D33C3C17640394FCE871191A63CF4A05EC2F38040ABBE07CEC67CD3C1FAE", + "fileSize": 150740 + }, + { + "name": "GB1DF40D.TIF", + "hash": "0857878352302A6E8B0DFDDB746989F5A6B9BBEF933245CF328A96EC09A6D8EF", + "fileSize": 47980 + }, + { + "name": "GB123E15.TIF", + "hash": "C524119F5EBC95EF82A22318BB7D18E251C396596685F311ACDC7443147374C2", + "fileSize": 327966 + }, + { + "name": "GB04710C.TIF", + "hash": "242290E7D0C66882B81CA8ECC0A05B24F78EC9938647B916F95CBD1E6559C61D", + "fileSize": 41164 + }, + { + "name": "GB230840.TXT", + "hash": "28D2B517F1F210DC0C868FF0F191DD542C704471DC20E49EEA3AB161E40CB56A", + "fileSize": 489 + }, + { + "name": "GB18EC16.TIF", + "hash": "D2A54A3DD4077752FD3BF40A4FF46C5109605FADF1C9954273968EFECB8A6208", + "fileSize": 133884 + }, + { + "name": "GB171397.TXT", + "hash": "7B73B683E95276516DAC6D13BAD39E173AD431FA5FD55103D45F6299C48671E2", + "fileSize": 931 + }, + { + "name": "GB203883.TXT", + "hash": "CE062D6D13B57FBD65E322487D9610801CA4FDA1D47CB197B4A06FF56092EDC6", + "fileSize": 1031 + }, + { + "name": "GB184673.TXT", + "hash": "11E5A414DB28B41004CC4AA094B5440652537A69C735E8E08FE78806B6215B87", + "fileSize": 3381 + }, + { + "name": "GB18ED0H.TIF", + "hash": "0DFE97CF57F366D7F85CCD02A08C03B303E7931B7092C8048236D8D1E36BDBA7", + "fileSize": 141140 + }, + { + "name": "GB203766.TXT", + "hash": "85EBC473821CB3854D9895ECA216B107E4FEB4686DAC3F65E04D9068D742EA9D", + "fileSize": 714 + }, + { + "name": "GB230906.TXT", + "hash": "76C82C6497EA9A413A43B1780796C5E85668D247E9F1601945DF42A458792957", + "fileSize": 631 + }, + { + "name": "GB181180.TXT", + "hash": "544C1E24B638EBFC0FB3A08D6B682A5F6A21CC038BCA50BE3EA399520CF3F7FB", + "fileSize": 519 + }, + { + "name": "GB230990.TXT", + "hash": "0F33A73E56B9466D2A83C2BF7F46D153C0BD1FBA89888A82E83B75EDCB02011F", + "fileSize": 692 + }, + { + "name": "GB1E2E04.TIF", + "hash": "D9472CA5F5AABE1E2AC95E24D6EEE4A14E330BD2D817149F0C6E7C44C620BB1E", + "fileSize": 94828 + }, + { + "name": "GB203503.TXT", + "hash": "26D5BDD2831E145B7B2C13280052B974F7365240023AE5377EA464F740AB32FC", + "fileSize": 762 + }, + { + "name": "GB231055.TXT", + "hash": "FD436F8950BFBC289F662B4221B8A382437AFF24F0ACAB67EFAB87C810A96A19", + "fileSize": 668 + }, + { + "name": "GB221111.TXT", + "hash": "9C92FB9B570819E4B4E2C592AB01C9E93BF021B2EC3DBFE66BA4E48D7068F8D6", + "fileSize": 936 + }, + { + "name": "GB203265.TXT", + "hash": "C0D3CC55B2EAFF6528405B0DC738536099B9B53B5F0C25D8449082E659B1743F", + "fileSize": 710 + }, + { + "name": "GB231056.TXT", + "hash": "339082D73B873A9634D88BCFAC6CA3D234EFD250FF22B4EFBEF668C36E7ED655", + "fileSize": 477 + }, + { + "name": "GB221090.TXT", + "hash": "42E873E15D11C59BB08AE4E1E119E6BA8F099DFF9D7BEAEEBEDC1CD08645B32B", + "fileSize": 854 + }, + { + "name": "GB202741.TXT", + "hash": "BA9823A58D600FC6AF1E4AA775B9879D64917C10148C663C1872F22D85778247", + "fileSize": 557 + }, + { + "name": "GB231118.TXT", + "hash": "E1DFFE95B5887764E7E5E0790082F7D1B9E99EC37D663A30C80BACF392B00C02", + "fileSize": 1455 + }, + { + "name": "GB202676.TXT", + "hash": "156E7C94DE07494B8F22430F9C00845055D5B37A835112A087350B90505920B4", + "fileSize": 789 + }, + { + "name": "GB231178.TXT", + "hash": "CBE597BADA534EA86B611BF1BF044466A7964CDF27A6B57911923A7B0AED5DF4", + "fileSize": 769 + }, + { + "name": "GB0EF80G.TIF", + "hash": "C8CF52BB9DAD5E87A19EC182E890719544235449235BE39DEF164166BFA187AD", + "fileSize": 28760 + }, + { + "name": "GB212269.TXT", + "hash": "8E265B74B8E4C1FD975B5D1BCC1748B9E8337BF80C77BABC2832C4CB2BC2E1B3", + "fileSize": 511 + }, + { + "name": "GB202620.TXT", + "hash": "0FCD3161E9FB00A86F65AA7B205DD46D54C3E54BED08EEECFD4F994717B28B47", + "fileSize": 620 + }, + { + "name": "GB231239.TXT", + "hash": "07EB5287FA0E0F03B36F8EFC4395654DC6AF7E444EBD5790512E709CCA16016B", + "fileSize": 523 + }, + { + "name": "GB0F830E.TIF", + "hash": "3DC5BCD29ED3002B41D5454EB7242D913870C0D5FC99371F9249AB41C7057DAD", + "fileSize": 41440 + }, + { + "name": "GB196397.TXT", + "hash": "646896392F0EB49A39107186D12E9726D00FD835A0F63440DFAE9E27E3E912F6", + "fileSize": 1028 + }, + { + "name": "GB202529.TXT", + "hash": "3D3906B4AD245B9C3261C70F87E96AC83A9896133B420963B942B296EDD3BAD0", + "fileSize": 515 + }, + { + "name": "GB231233.TXT", + "hash": "1BFFA3AF73B49865554FF8CED51DDA92DE0E976B1A622D8950C3BE8380F3B2F4", + "fileSize": 822 + }, + { + "name": "GB13D903.TIF", + "hash": "F3AF909751E71E07781349C71B428F888CD1056A8C4900F99BD5D3C78C18860E", + "fileSize": 27748 + }, + { + "name": "GB171417.TXT", + "hash": "F41F93214D395DD3F5054E96F0DC3F8976172A9F48646AB49A3CE801A5BA2C51", + "fileSize": 773 + }, + { + "name": "GB202248.TXT", + "hash": "2628F63F12CB09989ACB3276862BD31F6BD09D81A1B3E91513A8BDE21A5DACE8", + "fileSize": 1184 + }, + { + "name": "GB231439.TXT", + "hash": "C190A7EDF8E185A7E076D45D9A0245F89B2290AF118535ED4DF451AC7FEBA54C", + "fileSize": 543 + }, + { + "name": "GB220597.TXT", + "hash": "5A7EBEDCAB27A142AA3EDCBA5CF5B7B031C1E766A610484E368E997BECD7328A", + "fileSize": 1146 + }, + { + "name": "GB202225.TXT", + "hash": "BD308BA898B9B6BAFA90AB57EC2F60678A5E37661F015DBA4C9B0E940322C9D2", + "fileSize": 459 + }, + { + "name": "GB231482.TXT", + "hash": "038FE2A2B41C3890FC39D1AA792190AFEAD0E8DA9F14F225ECE588D2F3FE5DAC", + "fileSize": 1155 + }, + { + "name": "GB220519.TXT", + "hash": "0B3B3F5A204190450951423CFFCF8EBB0CA3603F581E22461F3A09C021FBC7AC", + "fileSize": 805 + }, + { + "name": "GB214897.TXT", + "hash": "3128D522CCD5A8F3E53A9708F2A0915EDE9A7E61D16265DC8EAD7B06A813A8A8", + "fileSize": 563 + }, + { + "name": "GB220430.TXT", + "hash": "E53E647839C650955DD23BB70F1415C16210F5462B3664D9F01E444F5D5A7D9A", + "fileSize": 512 + }, + { + "name": "GB224882.TXT", + "hash": "9F65108A0A5543DDE08A75006E5D8A0F5960EA0235AFC1BA98F1A7248FBA4D60", + "fileSize": 837 + }, + { + "name": "GB0F8308.TIF", + "hash": "B047C7B16A88CE68B97C8028B470C8BB60EBF75E5B7B391E2C042562EFF9C9CA", + "fileSize": 26456 + }, + { + "name": "GB220389.TXT", + "hash": "4DBDB584924B98F7A1A3E4FBD24FC7DE0F4072524A1589DDF7309333B8DE893C", + "fileSize": 540 + }, + { + "name": "GB231822.TXT", + "hash": "8B2669CB86892AA10D977BD6C07F415012F1F21B54815268F4239EE9187D1925", + "fileSize": 4023 + }, + { + "name": "GB231822.TIF", + "hash": "CB7CB5B26189584AA114B95C95917D608F7CFE444F1D7EE6527903691F9B21F2", + "fileSize": 135660 + }, + { + "name": "GB0B391Z.TIF", + "hash": "0FD08BFCB3510DA7B1672AB7A59673DB4B86798EEC8B98082D498EDD86480370", + "fileSize": 29432 + }, + { + "name": "GB220237.TXT", + "hash": "791E76C9137E3CD827E1A16AE9DF2B653155EE50E993C270682A784DE1D0077E", + "fileSize": 481 + }, + { + "name": "GB231965.TXT", + "hash": "23E8F7242E0B2D3F04C6A92949949EAEE7722F5A54E5DC8C69E57FE604E11397", + "fileSize": 620 + }, + { + "name": "GB215350.TXT", + "hash": "ED341C18979129CBA8C07712A810F58EAB65D3C52B3F142EE0FDB7E99B78634E", + "fileSize": 892 + }, + { + "name": "GB231992.TXT", + "hash": "4A4FD3E812C329FCAB4F825186A54751C719FAC0C0B0DC87B41F728E5171E4DB", + "fileSize": 1889 + }, + { + "name": "GB215210.TXT", + "hash": "C9B37E424A001987D3958C5CAFA33C401554ED97AB5D32346382CD8CDC433899", + "fileSize": 944 + }, + { + "name": "GB232191.TXT", + "hash": "9623D9EC1E5EB84C7455BD23DC29E652F88FAAE0597437AA6A90AA22BFE751DB", + "fileSize": 761 + }, + { + "name": "GB1B6703.TIF", + "hash": "88CBADA28B2FAA30193BA532A302502FB5972099B18292050D91EFFE9CB02738", + "fileSize": 61504 + }, + { + "name": "GB195444.TXT", + "hash": "03A801D1D6900A3F519ED585FB6E1D9FDAFAA3A423BCA72088928B97677E7F1B", + "fileSize": 779 + }, + { + "name": "GB193604.TXT", + "hash": "3C7690C225AA0741A9E5F5B52F9762DB53E427AEC6F382B5D7C50AB2E32851AE", + "fileSize": 1034 + }, + { + "name": "GB0B392F.TIF", + "hash": "C98535DA92030E3598BFA8B0EBD4439C23CBBE1F0195C2412557D73E1B46B480", + "fileSize": 21732 + }, + { + "name": "GB214899.TXT", + "hash": "29F8984D4BBF8E57F6EE6F15D33090FEF1062BA1582083C8212EB5D3BFB0B0CE", + "fileSize": 632 + }, + { + "name": "GB268116.TXT", + "hash": "43260BB1EAB58F020E3216376802442A71454055B2A4C58B5E787A1182DED90A", + "fileSize": 1550 + }, + { + "name": "GB268116.TIF", + "hash": "D28A93F2DF72D24CB0F5F3BCF30C50BF318FFC7874EACE70FFB26DCAA64380D8", + "fileSize": 147992 + }, + { + "name": "GB204958.TXT", + "hash": "C96190D3295A9DCE5FF75AD7CC2C7FA135C20DA54927E8F7415F7BDAFE77BAC6", + "fileSize": 553 + }, + { + "name": "GB232501.TXT", + "hash": "0EC511CADB8E22F59D69F5A27674BF9786226802940C66FF4BE9327EEC064362", + "fileSize": 1165 + }, + { + "name": "GB0DEE0E.TIF", + "hash": "1696F8477E8694CEB92DA2A3378CAF05E8EFC373CFB2DEE9A1EE79ADF7784473", + "fileSize": 25620 + }, + { + "name": "GB214845.TXT", + "hash": "9A336F0380588A007F4BCA16394B9ED60A50E9CAC2136A96029B1C3B97A29B3A", + "fileSize": 693 + }, + { + "name": "GB232502.TXT", + "hash": "0A44C04AC1F99DBA586D1F9437FCA962DE15B03DBC229C393033BB7629CA7B61", + "fileSize": 786 + }, + { + "name": "GB232503.TXT", + "hash": "D98F2B36AFE20CECA63B2B1CDB5E11F1B8C223F1C35B75C77E5AF2C8130206FE", + "fileSize": 2727 + }, + { + "name": "GB02EE0R.TIF", + "hash": "129C4BDBBC20435483A96C73698F4377C1CEE392C29D3BE78C5A66278752D739", + "fileSize": 41992 + }, + { + "name": "GB0C0306.TIF", + "hash": "972D1530C3944282F5DCD5D1941B8242E19885BA5D435313FA424CBD712B54A7", + "fileSize": 60372 + }, + { + "name": "GB401716.TXT", + "hash": "6DF741D205EAA58A94B1B64A19764F32647501472BEAE627E9DE73E2BB8FA57F", + "fileSize": 626 + }, + { + "name": "GB232519.TXT", + "hash": "1F253718A8BAFCE3D549833FF1283AC709F3F7FA44B6BBDB7E33E1D8405DAEF8", + "fileSize": 524 + }, + { + "name": "GB214313.TXT", + "hash": "F92A8FC78A69B89AB5FCE5E3DBF2D1F189ABDE3ACD0F6EF1E3C98433D5196885", + "fileSize": 931 + }, + { + "name": "GB214253.TXT", + "hash": "BC9ABFA21938042A4A637BB6FC2747F8A0DD347240EC23D716607A7B0FA9AC59", + "fileSize": 541 + }, + { + "name": "GB15E80X.TIF", + "hash": "512AE76E396B6614B6D7A4D6E2E62835A2CF6B7A91625AC97B376DFE46718D29", + "fileSize": 62824 + }, + { + "name": "GB214222.TXT", + "hash": "B9561A1DFA166BD0F84486A641E9E2A91507AE451A1DCE0EB1DE46623EDF56C5", + "fileSize": 713 + }, + { + "name": "GB15E80Y.TIF", + "hash": "DABBE17EEF13E1DC39E94E85D5C16DA2C1B31846A8FC890C43720A40A9D62889", + "fileSize": 61844 + }, + { + "name": "GB211471.TXT", + "hash": "D5B8E08370BBE97C76A5EA336FFDF9D04432137CD37B5D4FCEE86C75F0172B8B", + "fileSize": 746 + }, + { + "name": "GB15E40M.TIF", + "hash": "808ED3F40C6FF85C3891FD5C14ABC5577A729C8BB0DF9A4F91ECAAFD556E75F6", + "fileSize": 50144 + }, + { + "name": "GB240183.TXT", + "hash": "913F573009B6BC366F971DD26C0585348B576F01BCFC738F8AC6C4524ACA133E", + "fileSize": 1860 + }, + { + "name": "GB178E03.TIF", + "hash": "54147A35E087945722FAA051B275C733DB41A5982A7B2E4EC7CB26B74AAC1503", + "fileSize": 16980 + }, + { + "name": "GB211470.TXT", + "hash": "2A8FA2C9E17882E75A64A91EEF07EA8CD496E321146C0BDF8E416FFFFD35A242", + "fileSize": 660 + }, + { + "name": "GB10120S.TIF", + "hash": "0B1F46928420622C1333FCA537AE509991720078ADC24BD645FC18D4961B4C0A", + "fileSize": 63936 + }, + { + "name": "GB234715.TXT", + "hash": "780DB0A5E8EF8F07923607771060D3AF917A64CC831101660B232B4E70399FD5", + "fileSize": 530 + }, + { + "name": "GB0BF10F.TIF", + "hash": "6A24DCC10BDF5458ECF80F3DA6CD3905A62998B222F3516A21B58CA6AB4F98D3", + "fileSize": 21908 + }, + { + "name": "GB234810.TXT", + "hash": "41630CD5492D2B2FEDBFD49D29C95BF2458036EE4D5FD99458489465F0A0A722", + "fileSize": 2294 + }, + { + "name": "GB0B520V.TIF", + "hash": "D8DBCB049111B1801A558CF85443A31D472202BF5953BA6022B21193998F7DFB", + "fileSize": 59412 + }, + { + "name": "GB16931A.TIF", + "hash": "A720780A2139107615A66786F81C322534B3F9CF4B1D07C4F61501831D544974", + "fileSize": 28124 + }, + { + "name": "GB234881.TXT", + "hash": "0DD92F5326567BDD1D09D158EC20BAA3A191097EC07967F7059ABDC8212686DB", + "fileSize": 1083 + }, + { + "name": "GB211F0X.TIF", + "hash": "07B63ACDB2F30226AD2E373DACEABFE6AF7CAE0C6547981F152A21A9AE8F25AE", + "fileSize": 145152 + }, + { + "name": "GB234978.TXT", + "hash": "A7C5BC895A5A4F9F6F24314F079A6F78B22F89E9616B142EBF91CA58B66E1A67", + "fileSize": 574 + }, + { + "name": "GB0CDE0N.TIF", + "hash": "11BF3C63B79808A1C8B8A797E94FF34122D0F394B1CAAD6FA4D42C5AF9A57948", + "fileSize": 30320 + }, + { + "name": "GB1E2C0G.TIF", + "hash": "8E29CD2C29A771614B1861B6C10F061F0DABED03B4592376D56BA8C3CD4C2443", + "fileSize": 39620 + }, + { + "name": "GB183306.TIF", + "hash": "84BDBD37C9F02367ECE0FD6CCE90A896E54FFD60D34CC754012783140F757FE3", + "fileSize": 94862 + }, + { + "name": "GB1B1A02.TIF", + "hash": "857AFEB7319A605A7F70F49918B517A6139AD5E517028F4AAF83A0F2A263D21F", + "fileSize": 23528 + }, + { + "name": "GB13A802.TIF", + "hash": "B85CA38B2428914E95528802658BAA6ED689E59E803B9A9FC5CD0F48EAA96E64", + "fileSize": 50612 + }, + { + "name": "GB235044.TXT", + "hash": "1BBD21E935B5823738EDD9B91F15AE5278D4ACD91F8D59A3DE9A6D58E698D08A", + "fileSize": 543 + }, + { + "name": "GB0F8203.TIF", + "hash": "E6B9D2A4DA20DF869E42286ABF45D034AE964ADD3918AAB9B0CCC3B7775F6F6E", + "fileSize": 28188 + }, + { + "name": "GB0EA902.TIF", + "hash": "33CD0D4CA6621B8134EB563C8C31BA6368B530A498EE4476FDA91B2D93A80DE6", + "fileSize": 13876 + }, + { + "name": "GB235060.TXT", + "hash": "2F36337CF181FF475CE9302245702539ED0A7A9B1F87B67254AB36E723D873BF", + "fileSize": 522 + }, + { + "name": "GB13460H.TIF", + "hash": "410C997EC7B7CB080158FEF5C51542EDF79A18A2C56E14304FB7BFC6C53DBC79", + "fileSize": 83840 + }, + { + "name": "GB235054.TXT", + "hash": "822C197396AC58264AA711CFE8A9142C1ACA7CF769C6566BDD00CB26362817EF", + "fileSize": 671 + }, + { + "name": "GB0B520U.TIF", + "hash": "1F037F50F220BB7052D0A9378B332C5DED152131D409B34C6ED36E759CA0F73C", + "fileSize": 104072 + }, + { + "name": "GB200444.TXT", + "hash": "A0167B8E824714EF819D9AE710A6D6C1990A4EABFEEAF9354A8FA2106C299859", + "fileSize": 1051 + }, + { + "name": "GB240109.TXT", + "hash": "54934B2953B083C64B38593B2FB759A77D7F26C024E6A185913D75AB916CE452", + "fileSize": 586 + }, + { + "name": "GB071E04.TIF", + "hash": "5C6A811FBB9DFB569BE59A26E7CB406E73CB89F652E0C6785CAC988F1F4797DD", + "fileSize": 90198 + }, + { + "name": "GB13B202.TIF", + "hash": "AA6FF6FC10CAC7623C462F61288A5783E1DA0423898CCC806C11FD218A683FDF", + "fileSize": 33384 + }, + { + "name": "GB212042.TXT", + "hash": "B67D39ABBD8B84460138E21623CB005DC1803E8EBA7EE20514E830C8A924D7B3", + "fileSize": 679 + }, + { + "name": "GB034E11.TIF", + "hash": "8A6243EF7C08F16938EDC5492A317B11D4DAEDBA81403BB06F10380FB83C3A62", + "fileSize": 32984 + }, + { + "name": "GB0B520B.TIF", + "hash": "AE4E61577D3961E39B7EBDA5F025EDF6CF1949006C95B4DF962BB50A07C8BB8F", + "fileSize": 27496 + }, + { + "name": "GB0D0B18.TIF", + "hash": "AD6C469A67414AB3FFC8DB0485B099B326E69A4C79A0F234CFA352CD12507343", + "fileSize": 30904 + }, + { + "name": "GB240136.TXT", + "hash": "2DF0323C38D29FDAABF65847B7D6B16E50583790E1005AC069AC6A08EBEDBBA6", + "fileSize": 2076 + }, + { + "name": "GB211823.TXT", + "hash": "17F27C08D87D25C97AFC0ACCEB7FCA268712251E2E9DCC100C1F804EA1D2B570", + "fileSize": 567 + }, + { + "name": "GB268216.TXT", + "hash": "4FFF242DEEC5EF6E5DB40D928C3B8FD008402565F774E87796A04E8650F777B5", + "fileSize": 1528 + }, + { + "name": "GB268216.TIF", + "hash": "C750D2AC9D6AE496C1EFEA3CB098C5889ABFE197372F51DC1FFA3D3FED6A77AA", + "fileSize": 120972 + }, + { + "name": "GB0D0E1J.TIF", + "hash": "3AECEE2FFB545048D4C2790DD50B645459829FAD62BA7458C445FB706356A757", + "fileSize": 59180 + }, + { + "name": "GB0C0407.TIF", + "hash": "757AFE77CEAC4E3D77FE57A76EF69DAD38306C9BDECD3D7980EAD5787A67B3E3", + "fileSize": 87852 + }, + { + "name": "GB211435.TXT", + "hash": "F83C2276E9FD161FBA5516B190A04AF7C4BBD8A31BE014F77F5B31A6E976CA7A", + "fileSize": 2015 + }, + { + "name": "GB0DA902.TIF", + "hash": "EE213F8AEA7A8A833CF5055A916656951EF255F8C46767588A8DCCF6169ACAEE", + "fileSize": 14772 + }, + { + "name": "GB23490I.TIF", + "hash": "213473E8BDEB94AF09DBEA287C1EE6DFFCE3B8DE42EF8480E5012F01414D6304", + "fileSize": 323470 + }, + { + "name": "GB1B620T.TIF", + "hash": "18C3263006573E9671ADA4E7A4A94226BB57F924257D39C6397356C6DAAAEF35", + "fileSize": 459504 + }, + { + "name": "GB1D6C01.TIF", + "hash": "DC2579F801293E52E5F45C967EE1D0BB1B4B7D8E48EF0DD3D40ED89467EB5532", + "fileSize": 25548 + }, + { + "name": "GB0BE40E.TIF", + "hash": "BE80A9474BC0AB4838FBD26DB0AE65883143EF54C43A5FC01018DB24B1B04919", + "fileSize": 54222 + }, + { + "name": "GB02DF04.TIF", + "hash": "ED0E688187A55F6E1C29B5C13B9622DA7E2AE00B1963572AB9C7A6F54909ED1F", + "fileSize": 67660 + }, + { + "name": "GB13AA01.TIF", + "hash": "1D5ED922093949DD98593E425E2A56D9EFCA8CAFD94EC97498DA3E0A73FB22D3", + "fileSize": 31688 + }, + { + "name": "GB21F601.TIF", + "hash": "AE9587BFF83C10DC8D2EDEDFFE064B2BEE8C8CFB0E1984D2662871E5E757A9DC", + "fileSize": 62528 + }, + { + "name": "GB0ED902.TIF", + "hash": "7E49D4BCE909B4896FE1BE62351B15263D292AB06265604BCCCB63FD73B99CC7", + "fileSize": 49928 + }, + { + "name": "GB0BAA1M.TIF", + "hash": "378A2E681B17B337B2011CA57E671044F46D38DE5F00B76F6FD9CACD22C68B8D", + "fileSize": 27244 + }, + { + "name": "GB0BFD0A.TIF", + "hash": "31D4C3568671BD200579C973C5FBC73B7ED7A467B7F57090BF13CAB033C3D8E3", + "fileSize": 41472 + }, + { + "name": "GB21EC01.TIF", + "hash": "E2A775B7B42C0F90668DCCAAFBB3806730CD786A8F608BE9CB61468C7EB1A17D", + "fileSize": 92478 + }, + { + "name": "GB25C902.TIF", + "hash": "50F1D7D112A8D655E75482FFF0A486B946E2A9448A2032FDCBE77CBC6C90728A", + "fileSize": 203304 + }, + { + "name": "GB13450D.TIF", + "hash": "944F368C60896B9E6710EA080A4BF8B5F1CB2E0D4CCB2F453F0D802A418BF13C", + "fileSize": 18076 + }, + { + "name": "GB0DA01G.TIF", + "hash": "777585D8AE3C37ED6C945467D8B59658B0E45559EF53B522D0A5AC3E81BA25B4", + "fileSize": 35464 + }, + { + "name": "GB08CF0F.TIF", + "hash": "09D63C0540E17121B293D10B499BE8F7A8A29EC10A417FDD5FCA03751EDA38D5", + "fileSize": 55032 + }, + { + "name": "GB140C1G.TIF", + "hash": "1958AB3D9A50575EA745BEA6D57DAE6EFF9615F33A18C84CAED5E3F29C568D88", + "fileSize": 92202 + }, + { + "name": "GB102702.TIF", + "hash": "48A7E3B976395843753B2194C96CF3347E25AC5E59C87E3F8D3889FFF63289F0", + "fileSize": 47712 + }, + { + "name": "GB140C1H.TIF", + "hash": "221082A4080F2375AC8973F91E6F975B3D97D53488C21D341A62DEEF51FF1640", + "fileSize": 76462 + }, + { + "name": "GB0DB81J.TIF", + "hash": "DDB292BE26848A6D25652CF10F9ACA5E58D76EB0364810F97BE304E85E96DFA0", + "fileSize": 37864 + }, + { + "name": "GB11AA02.TIF", + "hash": "7DDEC059A2AA070450C2E8A6C00C67CA6B05713CF902688C629CC1A95EFF462B", + "fileSize": 73252 + }, + { + "name": "GB170D0F.TIF", + "hash": "BFA12E6E064A376FA7C9D0C9F3D2F9508D62BE66F3C5510EADA39D442C2DF75D", + "fileSize": 25456 + }, + { + "name": "GB136F36.TIF", + "hash": "1958AB3D9A50575EA745BEA6D57DAE6EFF9615F33A18C84CAED5E3F29C568D88", + "fileSize": 92202 + }, + { + "name": "GB1E2C0E.TIF", + "hash": "ECD8D96C2640460FC900B3ACF944B1E690D3D8EE85389D05EFF857BB3AF78C25", + "fileSize": 13630 + }, + { + "name": "GB136F37.TIF", + "hash": "221082A4080F2375AC8973F91E6F975B3D97D53488C21D341A62DEEF51FF1640", + "fileSize": 76462 + }, + { + "name": "GB0F9C0B.TIF", + "hash": "9D945F19A53F62936C19F040D8B030C414D05B54DC5D43227CCCA9D461F0158C", + "fileSize": 16732 + }, + { + "name": "GB568616.TXT", + "hash": "04D4E1068B8BFA74CD670E975E932833702DDD60FCA8DDBCB2AB89FD41851D9E", + "fileSize": 1755 + }, + { + "name": "GB170720.TXT", + "hash": "5BF87C9602588E6074E9DC32CF845E5A88B150F1C513A929F4233167799C0AB9", + "fileSize": 789 + }, + { + "name": "GB056A01.TIF", + "hash": "2E450271370F63A3DE1ECC4C9FDC50F6E2B61ABE54E54B93E53986C7247BD5F0", + "fileSize": 29340 + }, + { + "name": "GB0B8F1B.TIF", + "hash": "D5716698FB75F36C93FCAF2070284C644464E638A3CC012586B58FE965F09175", + "fileSize": 27096 + }, + { + "name": "GB233046.TXT", + "hash": "FA6497D98F20020FCBEABB10069FE67C07302D25BCBA494100D6A2AC35C6C4BF", + "fileSize": 2093 + }, + { + "name": "GB0D0E1I.TIF", + "hash": "BACE77B8218475AB2A49CCACCDFA9BFE68DB890E0F8B3A2852CBFBE9DA536527", + "fileSize": 88372 + }, + { + "name": "GB0C2B01.TIF", + "hash": "0C7052ACCF49AB84AB2D15CF593C87EA8D149F478B9C3EC7505135A526C68823", + "fileSize": 14504 + }, + { + "name": "GB0BF10G.TIF", + "hash": "4A2B80157692C3E1070BA9DB0ECF95F9DD8A9F19E2DF605F1F175313C5C75C23", + "fileSize": 25376 + }, + { + "name": "GB182263.TXT", + "hash": "E149592E93967B57A2C8421CEAA28BB6501411D9E743B53D6C8F3744E95474AE", + "fileSize": 562 + }, + { + "name": "GB233211.TXT", + "hash": "572045C55DE195B1A9232630B583782450E4842BCEE080EC9D3B3EDB161A4D85", + "fileSize": 527 + }, + { + "name": "GB19BB0K.TIF", + "hash": "938DCAD5505F1B0DEFE6D75C1E4A981F04DAB84A76663FC0F5AE53688331F6D1", + "fileSize": 84166 + }, + { + "name": "GB092C09.TIF", + "hash": "6FC8A7FC382680FD6608263DEEE201850F1398E365AB6EB21707BE34AB28779D", + "fileSize": 48120 + }, + { + "name": "GB056A05.TIF", + "hash": "9AA120B6E6B5036BCF0971048A1BC1422B163E2A880261A3D98F2D89AFAE498B", + "fileSize": 24264 + }, + { + "name": "GB181401.TXT", + "hash": "4F1D8B739D69A2548A6C94851D719A57B1FFE3BF0C2673A42AF27DA7CEC0FA11", + "fileSize": 5119 + }, + { + "name": "GB233241.TXT", + "hash": "07D79909D87B919F905618196004EB2B6DAF401D5E9DD01EB1493B7407D2EAFE", + "fileSize": 752 + }, + { + "name": "GB0BEC0D.TIF", + "hash": "8C2A742BFC3DF967AF04BFBEA1662FD11195F26415D76F0E6E3D76D7EE910E7C", + "fileSize": 23008 + }, + { + "name": "GB0F6C1S.TIF", + "hash": "B036E3984BE0F371AC96E065F0884A4634735A2FADBD9C583EA9885B8711A215", + "fileSize": 126716 + }, + { + "name": "GB183341.TXT", + "hash": "32899D729F32E0D9E12FD32DF0E85031BAE4DF924C9153FA11862E381EA2F87A", + "fileSize": 748 + }, + { + "name": "GB233267.TXT", + "hash": "38F553230B336EC97A91E7D6629CB7ED6A624EF878E24190057CA608956690DD", + "fileSize": 904 + }, + { + "name": "GB0CDE03.TIF", + "hash": "01B7D27DF86A71B66619D0FEC5EFE0F183F335FB2AF6EBB03F25A9763EFD9CE9", + "fileSize": 30820 + }, + { + "name": "GB216F02.TIF", + "hash": "23170C1A8A77F4EFFB912D808ACB9C1DD62DDF41D4EDDED0CB1520E0E93EEB80", + "fileSize": 26810 + }, + { + "name": "GB0F1A0Z.TIF", + "hash": "DCD6FF686BD132D929DA19DE675E2CFE4BC0D5B29CA9C2C113E2057045BA382B", + "fileSize": 33404 + }, + { + "name": "GB184195.TXT", + "hash": "579B1C8996D9B1A65F1C4CF9A78ACCD992F895FC2C1CBA2AA6659497830FCE5C", + "fileSize": 475 + }, + { + "name": "GB233299.TXT", + "hash": "0F61362FE48958E1879CBAA048039924FDBF6307AFCC8EA6C153289FF94325CD", + "fileSize": 505 + }, + { + "name": "GB0F8201.TIF", + "hash": "8CA0D79236BC4424D501FAF3A267318B8F9C3493F93AD2751BB589ED5F1173FD", + "fileSize": 39708 + }, + { + "name": "GB156C0Z.TIF", + "hash": "5DBA4531EAD7C6562BC2B995021995B65E889F21F47A43C31A03737E751AFCD7", + "fileSize": 37496 + }, + { + "name": "GB221260.TXT", + "hash": "CF1EB207A8009CCD04C24261D624A3A4563DAF90C9AE0487CF2286FFDFA0D095", + "fileSize": 691 + }, + { + "name": "GB233307.TXT", + "hash": "A9BC08F50E5FDFF70CAE0C8FF1B4490298CDDEDD1EC8922A9477A2A72D4B4CD4", + "fileSize": 563 + }, + { + "name": "GB1B600B.TIF", + "hash": "2C6736840FBEA4576B381E5EDE17E664D2BB2B11C08395869606EB7D4390E1E3", + "fileSize": 34456 + }, + { + "name": "GB22BB03.TIF", + "hash": "9B1B26A498B523BDE57A35E5460ED9FF189E92F65FA821933702CF64D678F5EE", + "fileSize": 53488 + }, + { + "name": "GB02BC04.TIF", + "hash": "F631EF164E2D8EC685F3136B88FF7D5A895C6C7FF5C4A0CD5BF8EC9114E0AFB7", + "fileSize": 27496 + }, + { + "name": "GB221484.TXT", + "hash": "7BB50EC705FA357B78A3A31A2CE86BC34E33A28A5AE16E53E56D1F5E40D03C78", + "fileSize": 2234 + }, + { + "name": "GB0EE917.TIF", + "hash": "9A51078E22CF2DF1DEEEC481F2D7CB529EA85AA0A6186D730690B260436B1A8D", + "fileSize": 45164 + }, + { + "name": "GB0DA01F.TIF", + "hash": "4416EFE648CAA965C76D56033514CFCEB20093F4F01EB568404D042DB1521472", + "fileSize": 49624 + }, + { + "name": "GB233342.TXT", + "hash": "0B38AC11B1388DFACBD634B17CF42FA2D67412101FCE25BCFC28A2E0ADA63BEC", + "fileSize": 772 + }, + { + "name": "GB02EE2Y.TIF", + "hash": "B29F8BDA0B117C90D9DDEBDBDED47D0F3C1EDCABCFDE5E2971E9E3512C70D20C", + "fileSize": 337378 + }, + { + "name": "GB221531.TXT", + "hash": "35EAEBA5CD4F43BA0ACF0E26ADD97A9D7A4591DF33982CAEEEBC1EBC22B8E4D1", + "fileSize": 443 + }, + { + "name": "GB233360.TXT", + "hash": "D41676F3879668A25E091B9C373BAF014FDC3A3F6BFF61A610D446359586F42B", + "fileSize": 937 + }, + { + "name": "GB02DF03.TIF", + "hash": "D6BFE7028C92A7E95802E6CA255F8F26768DB1B3E5BC3422714637BC3E9074E6", + "fileSize": 58200 + }, + { + "name": "GB221534.TXT", + "hash": "A873A9AD72A5817EA2F0ADE56FF7896EB67AFB03DD656CB3CC7F3BDE48B4AC52", + "fileSize": 587 + }, + { + "name": "GB101206.TIF", + "hash": "0906FFA44C0E287514E2BDA26C3D8AC4AF5AA60360E0BF0AA68BA1AC22DCB20A", + "fileSize": 33296 + }, + { + "name": "GB233389.TXT", + "hash": "9C6943A987A486572BE5BF634A5C95772E12621B4B34B8112AC2A736A5A119C2", + "fileSize": 824 + }, + { + "name": "GB216F01.TIF", + "hash": "F050D730034051B4DA133DA2675511C66411439071E31A6B1BEBF01B68A76659", + "fileSize": 18184 + }, + { + "name": "GB221530.TXT", + "hash": "0EC67945BA5035A2E4411A75983C0FE4C03BFCA71DEC729C8B4EDE7F999026A1", + "fileSize": 652 + }, + { + "name": "GB233417.TXT", + "hash": "66631D0B312D3206FC477A48AB82D7A307D5D4E0BCCBF7E4818AB56248A6BE00", + "fileSize": 525 + }, + { + "name": "GB11B802.TIF", + "hash": "4DCD51F5FCB660AE91538ED56930D85E3096297972C7F0F9AC148B5000C139F3", + "fileSize": 24736 + }, + { + "name": "GB0C030E.TIF", + "hash": "3D3E48A7A6F96A93A9CC4913A9EACEB60A36263183E21D39EB9016239FA8E0A7", + "fileSize": 38736 + }, + { + "name": "GB221539.TXT", + "hash": "00EEFEE584C14E6D3EA04F848974AA843A8A1FDFDA82EA88E8D1CD786E210539", + "fileSize": 1118 + }, + { + "name": "GB233358.TXT", + "hash": "CBA206FA85D10C295E8C8845BF951FAF9A4AAC8CBD7BFC175478FE045F22EF21", + "fileSize": 1110 + }, + { + "name": "GB221591.TXT", + "hash": "57C16A59FBF847C8D96BE62FC12396D53DF9EB1547FAC47345B66959A87E4442", + "fileSize": 7368 + }, + { + "name": "GB221591.TIF", + "hash": "787BB702B9BA55EA25C64F65277937EFD159E88B2E9129097E52C6425976620B", + "fileSize": 577322 + }, + { + "name": "GB11BD06.TIF", + "hash": "BB00CC8BB89C030E7A8466E20ED0CFE784190B35B6D00B3BE532A243475FBA53", + "fileSize": 39148 + }, + { + "name": "GB131602.TIF", + "hash": "F58B671ADB28DA5D9D48BE481A8C5AA4D3DBDEC6CB49E1F1B54BC467617511B4", + "fileSize": 25376 + }, + { + "name": "GB221873.TXT", + "hash": "A6E2C767AE3D3C8E5E82A84AFA93E4E69431B989991B44BE21937E5135581FB1", + "fileSize": 679 + }, + { + "name": "GB233447.TXT", + "hash": "31A9D65108F9BE765DB4F2471BC6D03D2FB6E438DE93850295BDAA985FD7656E", + "fileSize": 1981 + }, + { + "name": "GB178E0G.TIF", + "hash": "0E6F61FC9D72C7AED7120E846B3A0AD6BC735176E209136D8BF23AF22D4D914C", + "fileSize": 26184 + }, + { + "name": "GB221911.TXT", + "hash": "52F6441DCDD05E1C5F0F7D3FFA0BDE99D12E0E838321B6D1938BB8DE33B9E73F", + "fileSize": 5292 + }, + { + "name": "GB221911.TIF", + "hash": "ED4301CA1A0F8E4979A5D5C2E0880E3DD992F5758BDB3252BDF0AA0D33085CE6", + "fileSize": 304806 + }, + { + "name": "GB0BE60H.TIF", + "hash": "F061D71C93237A32FF26CE490353475101346F8E76E30C595ED887550BBA7EC5", + "fileSize": 21616 + }, + { + "name": "GB249C0B.TIF", + "hash": "DFC03975951FA30AA335FAF6BA1532B1415407840381D0B86A482A9567398A21", + "fileSize": 20828 + }, + { + "name": "GB0B381I.TIF", + "hash": "E9BC5DC0771BC01E099BCBF29857778B68DFFDC3E067325E9EB516E48D49A30C", + "fileSize": 22600 + }, + { + "name": "GB0D0B19.TIF", + "hash": "740BABE2C3433AD85A63636F5A363C0EDC20AE5BE4DB1FEE6D3D43F2EF3373C5", + "fileSize": 35628 + }, + { + "name": "GB249C0C.TIF", + "hash": "3C446CE14B5BCA57ECABD9EE67D613A8A96CD7300285E8D4C2232C0921D3DA88", + "fileSize": 67458 + }, + { + "name": "GB1A5406.TIF", + "hash": "F82C3735B099E26993DFC8BE4005A26A72A3544050A938E7F9C58378BBBD1C2C", + "fileSize": 73208 + }, + { + "name": "GB02DF0D.TIF", + "hash": "A1E2DE6112AB349042B2BBC7A6D3E51924336169BE8D1A073E11EC9573BFCF8B", + "fileSize": 29516 + }, + { + "name": "GB233494.TXT", + "hash": "492993AA57F5ABD0D791B17D7F3169E7F0263764D38BD3435E35EBAC1077EACF", + "fileSize": 687 + }, + { + "name": "GB178E07.TIF", + "hash": "FF18E7E3899E5754C78B3507EB768341036D4ED5947B2657991773350E0C0BB0", + "fileSize": 45024 + }, + { + "name": "GB0BF802.TIF", + "hash": "C88E823DE3BE4BB89713C454A1E50DD357CD3DCEF867888A3F7AC27FF40FD3BD", + "fileSize": 14476 + }, + { + "name": "GB233527.TXT", + "hash": "4B74E249762ACAA9B907AE75FD4ADEC9D47CF59D8F6A21927EF93109868BD28B", + "fileSize": 808 + }, + { + "name": "GB183056.TXT", + "hash": "3CE4C3D895E3565D78669F38B4EF62032CA4B70F97BF83ACE29BE57DB3D060F9", + "fileSize": 507 + }, + { + "name": "GB233610.TXT", + "hash": "D1B626928B274351D2F753281678242C5DCD0C8639A0042A64185A5FD768CE17", + "fileSize": 510 + }, + { + "name": "GB1B6009.TIF", + "hash": "2CBFB5F3D429BB469EC999C6BF212DBA9408E695EC62FEE2930C0F2ABAC601CB", + "fileSize": 38788 + }, + { + "name": "GB233822.TXT", + "hash": "712A9B72028EE26906FDA650BC533705F2392BE5D1FA5F9961BC10D2A61262A3", + "fileSize": 536 + }, + { + "name": "GB071E05.TIF", + "hash": "0D51099DE437B4710F8AF9427CB30274AF9A8110C0B6D348C2EB1F762E306799", + "fileSize": 20716 + }, + { + "name": "GB249C05.TIF", + "hash": "47A581371CD03B6323DD1D2B5F55593F103EE4709DA2DE06F668EBB08D017B58", + "fileSize": 202158 + }, + { + "name": "GB0EA903.TIF", + "hash": "6630EF42DA239FB83C2C4664F1946FBE07AEFA1F5EEF5517D1B28C267F04F3EE", + "fileSize": 16788 + }, + { + "name": "GB174859.TXT", + "hash": "346CFD6BECC364F5E0976A1B98738AB2581C71548ABCA8A1ECE26E1E2362E39C", + "fileSize": 513 + }, + { + "name": "GB222172.TXT", + "hash": "717354B4DD54B9DA1D6A6594ECB1C92371C86F027BA8FAB591E6F321E7391384", + "fileSize": 686 + }, + { + "name": "GB233917.TXT", + "hash": "A4A8C3A59963E54CE5F4DB6671D8C522D376556C03249C8A57CC5B3A4951B6E7", + "fileSize": 824 + }, + { + "name": "GB056A09.TIF", + "hash": "F49CA4D141DF76489B520470E0DAA7E89EEAC2BFBD5C830BE54E1EB3DD90F915", + "fileSize": 32136 + }, + { + "name": "GB174085.TXT", + "hash": "1B3D057478BD4C6ABCD89F63E4745D6CC38F616FEA7DEBF96460B334F7B4DACB", + "fileSize": 502 + }, + { + "name": "GB222199.TXT", + "hash": "917FB7106893782BDD867B3A98076CF47FD20C17A185BFEF893CF7362568FE6F", + "fileSize": 631 + }, + { + "name": "GB233935.TXT", + "hash": "B97613AD29222A3483592928CA7409A722AE7BB40CBBA0417D01BE773EA15E9C", + "fileSize": 664 + }, + { + "name": "GB16931B.TIF", + "hash": "C4D419D1C2C5B2FBCCF86297AD5D0C8CAD5484EE06AD51796855ACB5E6121183", + "fileSize": 39640 + }, + { + "name": "GB173651.TXT", + "hash": "C5E1FFD0C74D3C0A9FCE3E749F2DDE8B328471933A8B1E920FAD37AEC3A18290", + "fileSize": 3734 + }, + { + "name": "GB0CC909.TIF", + "hash": "3C484BB25B31ED8CBC3211A86902FCFA1D63524CEE20C4D3D3C7A71022CB6E62", + "fileSize": 54472 + }, + { + "name": "GB222153.TXT", + "hash": "1D17B67550FCFF9F5E10A99B6315094CEE5D1726B0EB2988FECDFCB7C14BD54D", + "fileSize": 532 + }, + { + "name": "GB1B6801.TIF", + "hash": "32343F752688DA987D4B3995F5CA2684F7D843035FFA8A0E95F604494F6E9142", + "fileSize": 51876 + }, + { + "name": "GB233963.TXT", + "hash": "A4FA81708E372EDD226657094F9342B946B0300774F98949BEFB692E64669B26", + "fileSize": 1098 + }, + { + "name": "GB17480Z.TIF", + "hash": "B15EA33824F51CDF50A644C9F1016A44A50697049E03C57EAD3AEDD6AF557BA7", + "fileSize": 53252 + }, + { + "name": "GB202024.TXT", + "hash": "FC9C9275BF346D510E7BD120119F6363A673C81F5A9CF9EBD79E75E6EA806CAD", + "fileSize": 1297 + }, + { + "name": "GB233994.TXT", + "hash": "DC0F08D00CA847968F8D0A02392856FBC4FF2021D74627C872A3CB34433983D9", + "fileSize": 2405 + }, + { + "name": "GB205801.TIF", + "hash": "AC9CB1D849DB99926C27EAB00C1187CC00153AFC11BC26BF93383ABFA694FB19", + "fileSize": 99512 + }, + { + "name": "GB0C0505.TIF", + "hash": "C39D280F9E5DB606C215D9E034B75BFDD9F5874C2B64B32E708DD85E0544430A", + "fileSize": 19748 + }, + { + "name": "GB201818.TXT", + "hash": "E46627B7D2CDFB3CB336D8AE66CFAAC9292F997943E54CBC8EDD2D1C62B80785", + "fileSize": 543 + }, + { + "name": "GB123E0N.TIF", + "hash": "D7EA61076575644786B4E24DA17A82EC9C78AD37BFB21DE7A9711E54AB7F50D5", + "fileSize": 52304 + }, + { + "name": "GB222220.TXT", + "hash": "3DE6077D6CCE9FB6FCAF2E7651FEE5961D79B29EA61539EA174E15B567A5E0E3", + "fileSize": 465 + }, + { + "name": "GB234000.TXT", + "hash": "DB408C380BC5348161213541336E4FBD768A571C6356F3CB5BD817F945227202", + "fileSize": 1076 + }, + { + "name": "GB170D0J.TIF", + "hash": "9812B480996382A45230914372590246784E35FEC45318671D087B562FC516BA", + "fileSize": 20860 + }, + { + "name": "GB18DC11.TIF", + "hash": "52AD7C89899465EE901C39022ED20C20EC96CD8745C82FE028721EA5475793EF", + "fileSize": 536774 + }, + { + "name": "GB10370G.TIF", + "hash": "2D1962532A922D8E5FE7EB75806828572F042577174130B1DE6AD7E8732D4C99", + "fileSize": 29296 + }, + { + "name": "GB201543.TXT", + "hash": "FAECBFF0BF8BCB417909595A6D83C17A63D2AEFE6875E655B05762D18935178E", + "fileSize": 583 + }, + { + "name": "GB178D0C.TIF", + "hash": "328C7BE948AFE1E0C342ACBBFF2DDB8C3B925195B2BFE098059E1AD7DF4557E9", + "fileSize": 62528 + }, + { + "name": "GB185548.TXT", + "hash": "2AD2EA2FBAE525FE6922B9955343FE76BA627DF9900B505940FCFE7B567632AE", + "fileSize": 671 + }, + { + "name": "GB222728.TXT", + "hash": "F95245ACE80035008F985A8D55DF591F8E7E2766BCE6CBD3A63A3699FFA10D4E", + "fileSize": 508 + }, + { + "name": "GB11F31L.TIF", + "hash": "FBD6A4D5C783E1DEE20EC1ABBDE6DA5DAE939E63428861174E2C3923DA480438", + "fileSize": 25272 + }, + { + "name": "GB0C050A.TIF", + "hash": "DB9BD6503B4AAD1350EAECCF59EA882D486C5864107E60AB9585B7822E83E452", + "fileSize": 52560 + }, + { + "name": "GB224288.TXT", + "hash": "A80F65086D7D6DBBF5B84A93503890612C39264F41730D026C499189FEACE4C8", + "fileSize": 523 + }, + { + "name": "GB201526.TXT", + "hash": "961C35CEA0D81268CF67853E367F3A633EDA90A4EFB5E467E12C12E4AE91E57C", + "fileSize": 917 + }, + { + "name": "GB192869.TXT", + "hash": "7C8607F21B04032427EE3509DB5C171B1F6BF9C7B26A3CA913CAA0BB780D9918", + "fileSize": 739 + }, + { + "name": "GB192660.TXT", + "hash": "BD1F4EA8337D6AED5DE30F55C515828995DE1F75951D13928111181BE45E313A", + "fileSize": 489 + }, + { + "name": "GB102905.TIF", + "hash": "DD25A11207E18D092881F3D794EAE7C48635F1FA2443657A90983CA321B1B8B2", + "fileSize": 45732 + }, + { + "name": "GB234091.TXT", + "hash": "7D1BD390B8B97312FA900791026D73117B0E9C3DE5D38E14B1143CA0FE2F743C", + "fileSize": 6317 + }, + { + "name": "GB169318.TIF", + "hash": "E9BEFDFED7F101584C8D5A6B14C4D297A192BB82A7D907A6581DE3546A025F5A", + "fileSize": 39964 + }, + { + "name": "GB0F511C.TIF", + "hash": "5CB96273067874DE573B1C9924CFBEF3F3ACD62F0807E1D06F83868F4856312A", + "fileSize": 37480 + }, + { + "name": "GB0DE20W.TIF", + "hash": "425F302A35CAFE9C296AC1AE8EDFDEEBE34E11B46C99F0A7E2C979EF2528DD23", + "fileSize": 54484 + }, + { + "name": "GB201352.TXT", + "hash": "424105597FA033695A77ACAAC603E2C942DA5E68AB3F6A6ECFDDA6FB7543E70A", + "fileSize": 598 + }, + { + "name": "GB169308.TIF", + "hash": "AABAD59B6E6ECF73594DE770E3A0E65838F39B2DC529135410D5ADC5A9078E8D", + "fileSize": 61524 + }, + { + "name": "GB234029.TXT", + "hash": "429E33BDEB96A23C2D6C79C35857882CEAE7E706ABF98826FC5754F772C9B77D", + "fileSize": 572 + }, + { + "name": "GB08A90D.TIF", + "hash": "4C895C89A21B879E7E399906CD7E99A9F7022AC75C799AC6A9F5DE57D835B119", + "fileSize": 33268 + }, + { + "name": "GB11B603.TIF", + "hash": "4F1178B58C5342F5A994E6962164F6270766438201488A3A7F61B4D2CEFF4F15", + "fileSize": 35104 + }, + { + "name": "GB0B8F19.TIF", + "hash": "7B9CD546559A469C8D7F1FEDDB69D728D7FD3BD96A6B28CE3DEB6DE353175685", + "fileSize": 23936 + }, + { + "name": "GB0EF601.TIF", + "hash": "30533D610705C35FE4E1C505FF4EE0A2576A187FE4E854CE47C8380E58A9BA2A", + "fileSize": 20396 + }, + { + "name": "GB0D6B0N.TIF", + "hash": "4CC0B0228DD457B68BE0969C3939D84C002F88DDF0C6DE2743AEF4481B836080", + "fileSize": 15356 + }, + { + "name": "GB234103.TXT", + "hash": "9A9F05FAF2139C59C55CE13B8D9BD7457CFFF86E4722A5A4A504895C5A4F08D2", + "fileSize": 8854 + }, + { + "name": "GB0F241G.TIF", + "hash": "137EC6F07230A16D190C81D3D4A3F2263EE3464D90BD7A8A1B544556F8E0091D", + "fileSize": 62228 + }, + { + "name": "GB13A701.TIF", + "hash": "1CCD0B235CDFD022301AF85FD3860897C3271176741FAC2E7640971259A059C4", + "fileSize": 33072 + }, + { + "name": "GB234153.TXT", + "hash": "5D1D897AF62C9D241F6BEC53BBE141F185717A5BDFA5F5B7B42641DF7EB5103C", + "fileSize": 598 + }, + { + "name": "GB1E2C0D.TIF", + "hash": "1662EB241F4B83ACB799DC04B9D4E98DD9417C3CA96FF4338E2B3BCFE6DC7A93", + "fileSize": 12700 + }, + { + "name": "GB27F702.TIF", + "hash": "369E7E7684E4C44C2AD4744B5382E0D6C9CCE34AF4A901E5730088CBB2263933", + "fileSize": 41288 + }, + { + "name": "GB211304.TIF", + "hash": "C7332E9A9B9E55AD0A5360D24EAF5ED328B1717D28C6DA07BD04F12235FCA9AC", + "fileSize": 13956 + }, + { + "name": "GB234176.TXT", + "hash": "AFCACD6F056C2DAC13D75E589525745863A71F2B6AA43F3A5FEFDCD01B4CD95A", + "fileSize": 2326 + }, + { + "name": "GB07E41F.TIF", + "hash": "4DFA3C840CCC442982C1DA4B1ADBA038E78D0FA2F787244AE897DCF6277BC01A", + "fileSize": 179414 + }, + { + "name": "GB22BB04.TIF", + "hash": "58287B8E8D8137B029CCDA2704C6BDB717410DA86AD9694C787C338D942BEC18", + "fileSize": 32736 + }, + { + "name": "GB234185.TXT", + "hash": "205D28B800A6F59D6E35D0D7B82806A19EC6361B85E18FE825EC5BB83ACB2358", + "fileSize": 1558 + }, + { + "name": "GB0DE20R.TIF", + "hash": "726CE7296C6D48C239A29B0CF32841F0FF8806F2F0BFC907A441B5F245F5CF62", + "fileSize": 53552 + }, + { + "name": "GB1B6D06.TIF", + "hash": "60720957999022763F0B91801AAC22B623EB50513445CBF617112338E9FF7F68", + "fileSize": 50232 + }, + { + "name": "GB234226.TXT", + "hash": "C63C7FA1155A060637A18F35A9442DA378FD906757DC94748E8E8E220FA94E15", + "fileSize": 659 + }, + { + "name": "GB214767.TXT", + "hash": "6B2F8AFE63C6BF387C8306E7BCE406D1C5EBE48013D1B7F84E630013F32CED78", + "fileSize": 725 + }, + { + "name": "GB0DB81I.TIF", + "hash": "6D1357D82737FF54E50D0F2969A9563013BBDA0ACDA239B25B3414F04C1725EB", + "fileSize": 53960 + }, + { + "name": "GB15BB0P.TIF", + "hash": "8C6C46D8BBA04871257BB49C0CC22486DC8E80A52DBF651FAA55D8C5CF17504C", + "fileSize": 27896 + }, + { + "name": "GB0D6A08.TIF", + "hash": "E0553E783E9792CF846E057DF1B0929A2C48F97BE7630E0DAC2D031C4BA5376D", + "fileSize": 22344 + }, + { + "name": "GB0BF70W.TIF", + "hash": "C3C98F71C75EF26B33C50D3EA31CD6E8DFDC85D53683F6184FF4713128B0C91A", + "fileSize": 23264 + }, + { + "name": "GB214687.TXT", + "hash": "0E8726C6DED0B38EEB32F6EC129C84C3E93C5969EA6A148842AF4773601F2F33", + "fileSize": 559 + }, + { + "name": "GB234239.TXT", + "hash": "217E901FA957377446E171359B49F42D07C71A1AAECDDDD24756867F43036C79", + "fileSize": 525 + }, + { + "name": "GB08CE0K.TIF", + "hash": "9F63D189544C8E72CFEB8344E2D2076FD44734142BDA8EC987407189CAA3D009", + "fileSize": 29504 + }, + { + "name": "GB02882T.TIF", + "hash": "9E102B737F6A383CFD0A64DF6F9C100A3A3104C1480D48F2FDBA8EB6E8702865", + "fileSize": 153846 + }, + { + "name": "GB02BC02.TIF", + "hash": "7904779787F8569A12654B3907778010D6D638D36483400067CA27FF4C9DDB93", + "fileSize": 39752 + }, + { + "name": "GB234268.TXT", + "hash": "5E09198E9A0EE964F3D8B3D0892C51C7E731E2DBD4DAA7FF63D4D174EEF81084", + "fileSize": 593 + }, + { + "name": "GB170D0K.TIF", + "hash": "B7A16D00BC5301B6031DFC17CF783F6D31C4782C5BF7FF8A04830321720B0DB7", + "fileSize": 36524 + }, + { + "name": "GB20D50K.TIF", + "hash": "A4FEB10D9FDA56B9DDD35EF61988B2A7D0029F3A800615AF60EB3A8812C001E4", + "fileSize": 136096 + }, + { + "name": "GB02882U.TIF", + "hash": "735F59969E7D4AE581FB405525804A604C3E61162BC7A3192236F2110CD4F38B", + "fileSize": 211832 + }, + { + "name": "GB02DF02.TIF", + "hash": "664E0EDEB6771C75F5792BA51797FD4D394924B827999D08FCDFDA4CE3D0B66A", + "fileSize": 75444 + }, + { + "name": "GB234355.TXT", + "hash": "1CA524D72BADDDF8249A33BCD3839CF237C7117464EC116BD3ACFB2BBB10B900", + "fileSize": 790 + }, + { + "name": "GB13890M.TIF", + "hash": "1B242B32E1302F45ABB5CBC069A38F2E1FB0B591E24F0CEADC5B8EF41057790A", + "fileSize": 97676 + }, + { + "name": "GB0F9C0E.TIF", + "hash": "CA84127FF7980A13F3930C0A8C599897055B4D4C5C15E7B9446F43A3BA3E03FB", + "fileSize": 23324 + }, + { + "name": "GB234341.TXT", + "hash": "47B048F1D3CC4EBAA4EF6416AF278594EE669EDE8E3BE7CD70C4AB8CA0D180DD", + "fileSize": 844 + }, + { + "name": "GB0CDE0I.TIF", + "hash": "298A73931C6E11C55F4A30248345164B451B0D31C44DC124FE635BD6FB89E805", + "fileSize": 28260 + }, + { + "name": "GB0EE915.TIF", + "hash": "361451073F7CB387483BF28EB5693BC670D3A6034075A0FF9D578EA43EE73228", + "fileSize": 42320 + }, + { + "name": "GB234393.TXT", + "hash": "4BC76C27056DEFDA0DA023D8DCDF32A9116BEEA37580C846D3EEA9D6EDC498A6", + "fileSize": 534 + }, + { + "name": "GB17110M.TIF", + "hash": "6EA25BE44EF59E14710FF26145CBAF5E326A1962FA73C40DA90887C6ECD667F0", + "fileSize": 50780 + }, + { + "name": "GB0F8E58.TIF", + "hash": "2480644E8220DC3B3191122AD7827F6E411967D25C6B176103E688580335BC24", + "fileSize": 161462 + }, + { + "name": "GB0C0501.TIF", + "hash": "AD74E96FE04FA9C6F770B36FD4A6DCC0DC7348035A37A337146EDE5DBDF8CF73", + "fileSize": 30976 + }, + { + "name": "GB0F8306.TIF", + "hash": "D13E2EC366CF3EC96C47AB8D5C4500D3E82A4BA3DA5C64BCE4A7C1ABD7DCE867", + "fileSize": 62196 + }, + { + "name": "GB234556.TXT", + "hash": "188F5FD6AF4161BB84BDBBA0CCEE4C7111F79C5F326FE5A368D22B1E6A9CB7AC", + "fileSize": 767 + }, + { + "name": "GB11F317.TIF", + "hash": "339A8E5A3D632E8436E7981ACDA1FFE7987109A2487C341E146EE9E2DFED7B1B", + "fileSize": 20152 + }, + { + "name": "GB0F8E59.TIF", + "hash": "4F27614EE2B66925EDE68DDD5399447695C89FC4D4F399B47CA85FD1A8C78B3D", + "fileSize": 132658 + }, + { + "name": "GB23490O.TIF", + "hash": "ADD60220C4B1EC1326C7FDB7B65849F65001EAF3DAF91F5509371D08141B7057", + "fileSize": 162960 + }, + { + "name": "GB02BC03.TIF", + "hash": "18A95320E95355CA4243773BEB1CFAD02F7CDFD5440719474FB674C7DF58697E", + "fileSize": 38296 + }, + { + "name": "GB14520Q.TIF", + "hash": "9551B412354B9C18C3F682F89460B8DB6C401AEC97AC89CC571FC516F059D767", + "fileSize": 37140 + }, + { + "name": "GB234665.TXT", + "hash": "C55BD153DD9B0D57AB9A3283BBED642495C0021D44E6539269D6C6195A878798", + "fileSize": 465 + }, + { + "name": "GB0F8E5A.TIF", + "hash": "53B968724EE885234620625BBE0AB18BBC7EDF2660DB128074387D1D6B4411DB", + "fileSize": 156434 + }, + { + "name": "GB234695.TXT", + "hash": "A4B4CA54523496D07EFBB53586770CF5E7770FC51DA7EDBE5B2BB267A949C02D", + "fileSize": 4117 + }, + { + "name": "GB0F8E5B.TIF", + "hash": "EE956352226B11019DA97378E41C2DC06170EDF7679A6A0756293390919742EA", + "fileSize": 100168 + }, + { + "name": "GB234714.TXT", + "hash": "0248DF342986B2BD03334A8230B3EE9796829A34EBA67E78E1F58590AFFED973", + "fileSize": 738 + }, + { + "name": "GB0BE70B.TIF", + "hash": "43E01D66DAD6B2D819D0A2F4B655F5A69E78F4FDD60BEAD819DD314AF03F7570", + "fileSize": 93582 + }, + { + "name": "GB0F8E5C.TIF", + "hash": "75EE7F182AE0BF2F32BFDFEFA2272BAF04548EEC1FF84297FB8AB3354BECD9A3", + "fileSize": 129236 + }, + { + "name": "GB13A801.TIF", + "hash": "43CCA2FF2C6A53BF42731BCD3FEA7DDB40A368440A85406D3BEC33FC18244B79", + "fileSize": 48788 + }, + { + "name": "GB1BB803.TIF", + "hash": "8E80A21017F194856A63FCE937B55778DA69D25A1C8D5EFFBE0850C288B3BC30", + "fileSize": 25332 + }, + { + "name": "GB224054.TXT", + "hash": "F703D10214D1A1546DD39BC59DDB4FDA6C8CFA9BE1F00DA8EAB6726115650970", + "fileSize": 482 + }, + { + "name": "GB272E0B.TIF", + "hash": "117A15F58EFD548A9B0BB6EE8393F7F1ED474D78BC0F6E59D9B6835CBB394C56", + "fileSize": 42662 + }, + { + "name": "GB050D03.TIF", + "hash": "CE832C58C794A2AB7523675E89E8F05222827FA7B5D884D7996480B2CDBFE0A3", + "fileSize": 32140 + }, + { + "name": "GB0DA90F.TIF", + "hash": "1A00275A8B9876F0121F045ACC452DD66DE22194737038A5F2930022FACE05B9", + "fileSize": 35532 + }, + { + "name": "GB26233L.TIF", + "hash": "923C5DBA55F010D388A22FC1D61E81C47906A84FBBEB4EABD355A6E1981E3425", + "fileSize": 221822 + }, + { + "name": "GB16930I.TIF", + "hash": "7D7AAE6B4EA0400A03F398D41BC9B53E0B9DBEF3D117B62482C75F243A3B0A77", + "fileSize": 50380 + }, + { + "name": "GB26233M.TIF", + "hash": "269BC8BB26C3A0D6302568694AE0981C99F83A6D5335CBDABD7228384C84B81E", + "fileSize": 362052 + }, + { + "name": "GB0BAB24.TIF", + "hash": "55E8CEEFADF053A2AAB5D4641D80809CBCC22A664B961F05FA2283FF6420AE51", + "fileSize": 25824 + }, + { + "name": "GB178D09.TIF", + "hash": "FE212E5869964D88076A0A8D1283713CF1ABE42FD4BCB726978DEF478A483074", + "fileSize": 48864 + }, + { + "name": "GB26233N.TIF", + "hash": "CF1EDDAE4818AD1C758C45CCCA6516B44BB90456E291253561D7240B2B370EF2", + "fileSize": 360964 + }, + { + "name": "GB26233O.TIF", + "hash": "9461484ACE670AEC056FCB3BAF78C177E1111C3C53D513188D26DD8301FE9941", + "fileSize": 262616 + }, + { + "name": "GB15E44Q.TIF", + "hash": "5CBA582CD3A2E11B7A0A444938C645F5501403EA5637B41280946CC9A66C29A3", + "fileSize": 114920 + }, + { + "name": "GB267A01.TIF", + "hash": "A6D467D77C8956B52A252955F8993115707974C282AABDBD8F57EEA4C2CE41FF", + "fileSize": 143494 + }, + { + "name": "GB248B06.TIF", + "hash": "6FB45E4757328CC590650CD9EC93AA33CF53163AACB6E5DAC6493777B2D24E91", + "fileSize": 97246 + }, + { + "name": "GB248C0G.TIF", + "hash": "4B9B43C02BB99B094EE73E7D492075411DE927D7DEB5B46511BA759E9E8FF56F", + "fileSize": 92040 + }, + { + "name": "GB0C0603.TIF", + "hash": "F994F6820AB60598B849E31A4FCF0D16E7F533C5B18CB3E91BE16E079B45C34D", + "fileSize": 22052 + }, + { + "name": "GB262342.TIF", + "hash": "6B3B9561E54EEE965AC3F715E378F01142437293F2326B58E0BF14BCABE69233", + "fileSize": 462846 + }, + { + "name": "GB0C0601.TIF", + "hash": "80454EB9B988F9C7225076303B6A7225DD72DE2AF339E9E2F96AF53B4FAA695E", + "fileSize": 22784 + }, + { + "name": "GB04850K.TIF", + "hash": "703E0A6F8795FF91B89BBC2823808AFE1E1B1FDB07749BB18ED5AAB813D11850", + "fileSize": 15288 + }, + { + "name": "GB25F30C.TIF", + "hash": "77C1A6F8B973FFE2909BC84ED300F83A2DCB97A3A5BA96E3FB9AFDFD75492476", + "fileSize": 211028 + }, + { + "name": "GB25F30D.TIF", + "hash": "2BB981E0A18FFDD0F61BEF628FE1BAC611B88335CBBB1EED1CD59069B559D11D", + "fileSize": 237204 + }, + { + "name": "GB0BF208.TIF", + "hash": "57C81D9A930B6D85C4C8A7ACA8EDBA59740E07B196D33C019E4AE1F53F6A7BBB", + "fileSize": 25700 + }, + { + "name": "GB1050PH.TIF", + "hash": "66E90EC21DBDD2D73D7AEE7C8C1690FF58075B3E091EB86E5DD413F575949C06", + "fileSize": 461104 + }, + { + "name": "GB16930S.TIF", + "hash": "5B933C33B151ABCC1FFE11FE905AE3AFC793F837D26862A0669DF4DF5FA22968", + "fileSize": 46964 + }, + { + "name": "GB219008.TIF", + "hash": "D7A91D97949C53AE2B9413A5FF60A013282D559EF83C240D30E382796FFF6182", + "fileSize": 146242 + }, + { + "name": "GB219009.TIF", + "hash": "BF3D577798B9555ED24A875E9C31006557B9B35D5EF3A9758537752327E1CD08", + "fileSize": 249318 + }, + { + "name": "GB0F970J.TIF", + "hash": "403CE05FDA2419D4BB9155810D179624FB5FC162080B6A8CE8C3C0F577C34F09", + "fileSize": 56796 + }, + { + "name": "GB223384.TXT", + "hash": "E4AE8D5D32DF1DE96EAF59C1D349A61F83544AA3FA2C3CDEC90E208896A56635", + "fileSize": 973 + }, + { + "name": "GB201096.TXT", + "hash": "EC93458B15A3C1655C53EC73088B68A7ACD64854F4C007EEC727CC1892D01157", + "fileSize": 882 + }, + { + "name": "GB223380.TXT", + "hash": "50ADD8EFC5BC1F15AB31C3B6D89AF6B1C79B3BB0821FF3A430F9445F40C8BD23", + "fileSize": 569 + }, + { + "name": "GB621116.TXT", + "hash": "501BB9A9834B3C445C361762B6608B65B0DD4250DD047C3049B938AF47FB781B", + "fileSize": 930 + }, + { + "name": "GB223462.TXT", + "hash": "DA4272B151C4AD2DE63138138F533D181270347C678F4D3AEB32F6AC3D2D94BE", + "fileSize": 873 + }, + { + "name": "GB196488.TXT", + "hash": "BD8DB9898B13F0BFA602D52912A87EC14462A7E411462A0CD97DC291F2D26B3C", + "fileSize": 1543 + }, + { + "name": "GB223656.TXT", + "hash": "7AC4308D5D22116CA74EDCB2CC18B9945B0A0F3C7250EDEE2AAD0305F37072D6", + "fileSize": 472 + }, + { + "name": "GB223632.TXT", + "hash": "9F8C35F541085AB7073B34249D1FF4710397A4ED85E57F72BC6A1909F77AED5D", + "fileSize": 558 + }, + { + "name": "GB223807.TXT", + "hash": "60384524D301327D9A970E7BB60ACF61B1A9804A18462545BA1B7E60A1FC000C", + "fileSize": 6238 + }, + { + "name": "GB262337.TIF", + "hash": "E627772D515DA209DBBD287D01536ECC34F0CFF36F60099B5A296E0CB4CCF0A2", + "fileSize": 304578 + }, + { + "name": "GB262338.TIF", + "hash": "C946E03B38D0101FFCDEF5CDA332733D6C8365C200D7C5FBB9DE607D6E26E57A", + "fileSize": 283278 + }, + { + "name": "GB262339.TIF", + "hash": "5F1E92029A381C12A235274FA980365F359724CBB302A24EF3B1A4C91517378D", + "fileSize": 117672 + }, + { + "name": "GB26233A.TIF", + "hash": "C5DEE3FFCB6041ADD754C0A7DB71CA87FA7CF16FAF278B61D9D944FD4B714A7F", + "fileSize": 230666 + }, + { + "name": "GB0F8307.TIF", + "hash": "3A0119F33718DAE1FE980B026C26D964693FB387818AC7F6B5E9988088301265", + "fileSize": 158070 + }, + { + "name": "GB26233C.TIF", + "hash": "A6E2C1C3BD2A812F66144AFEE1FC1F144A5B336CC57D1013A4DFDD19C9C34E28", + "fileSize": 113742 + }, + { + "name": "GB26233D.TIF", + "hash": "2DEDB1835A5D2E0F1957F1B6217D67FE7D93D184D8478F127B88D435FEB65075", + "fileSize": 516230 + }, + { + "name": "GB101119.TIF", + "hash": "71CAF0ED33CC19C5933297ADE730B747F9E4F7591444AF439D2FC59B0A0C641A", + "fileSize": 51936 + }, + { + "name": "GB26233E.TIF", + "hash": "F7E9F1CF16958D26103038D608687F74C78B1CCF401AF097C28B447E9EE09943", + "fileSize": 379502 + }, + { + "name": "GB11BA0N.TIF", + "hash": "F9096EEBA03A1CDAD1DDC5912A1CDA89CDDAE2A2DA604E03C2A15F781154750A", + "fileSize": 14588 + }, + { + "name": "GB223852.TXT", + "hash": "9CC369EF7288EB1B47A14C66067E6C3CFCA1F54A393F484561E7440216804B45", + "fileSize": 550 + }, + { + "name": "GB26233F.TIF", + "hash": "8DC7CCCC6E8DE439D0A50CE0F15F62A76BC10231BE4DC53C9DEA8118415713B8", + "fileSize": 387036 + }, + { + "name": "GB12B603.TIF", + "hash": "83A70E72FC32B6CB045EC71BEB835A587A31CB8B6563B9B758C06E4906490C15", + "fileSize": 44232 + }, + { + "name": "GB223924.TXT", + "hash": "EE8E0133956108AE19A9E3A935AFDC7241FD1CA7E1F3BB2D8130D8C42EB8C9B0", + "fileSize": 759 + }, + { + "name": "GB26233G.TIF", + "hash": "A1BD3CA56B3421C72C173D718748123653777FEA36E7E930C02C8B0153F0AB59", + "fileSize": 383114 + }, + { + "name": "GB0BAA5I.TIF", + "hash": "AA9811A57B39323FE393DECB94877E838AE7D89455E96648AB0E65A40272788B", + "fileSize": 77602 + }, + { + "name": "GB02B60H.TIF", + "hash": "C3B4C90E2D62D9021094D15F33DB078CED337BC61AB045B7C5960A1F1A2822C5", + "fileSize": 29004 + }, + { + "name": "GB223907.TXT", + "hash": "39E89072A7DCA2110781A3F61F72BAF18E67D77C11D1565144C35F3D48DD5312", + "fileSize": 1023 + }, + { + "name": "GB0BF203.TIF", + "hash": "620954E25DEA9B1814AFFA4BC9868DB50EFF737513C97499AE232D5D93CB7F18", + "fileSize": 30704 + }, + { + "name": "GB223935.TXT", + "hash": "63266A91708CEB2EC66B1FDD5752C70E77FFF45AD9125A0FA74DDB04C6B3DE04", + "fileSize": 9117 + }, + { + "name": "GB223935.TIF", + "hash": "F1F085AC531E1DC00F9DA2D3BEF7A139333F33E69E2E829C9AF551607B7110D0", + "fileSize": 100424 + } + ] + } + ], + "unitsOfSale": [] + } +} diff --git a/tests/UKHO.ERPFacade.API.FunctionalTests/ERPFacadePayloadTestData/AIOUpdateCell.JSON b/tests/UKHO.ERPFacade.API.FunctionalTests/ERPFacadePayloadTestData/AIOUpdateCell.JSON new file mode 100644 index 00000000..8ff8ebd3 --- /dev/null +++ b/tests/UKHO.ERPFacade.API.FunctionalTests/ERPFacadePayloadTestData/AIOUpdateCell.JSON @@ -0,0 +1,87 @@ +{ + "specversion": "1.0", + "type": "uk.gov.ukho.encpublishing.enccontentpublished.v2.2", + "source": "https://encpublishing.ukho.gov.uk", + "id": "be05a29f-d7af-49d4-87b3-fea74e43fafb", + "time": "2024-10-11T14:01:07.2158718+00:00", + "subject": "GB800001", + "datacontenttype": "application/json", + "data": { + "correlationId": "52323b16-ed68-4adb-2838-08dce9f35151", + "ukhoWeekNumber": { + "year": 2024, + "week": 28, + "currentWeekAlphaCorrection": false + }, + "products": [ + { + "dataSetName": "GB800001.001", + "productName": "GB800001", + "title": "Admiralty Information Overlay", + "scale": 1, + "usageBand": 8, + "editionNumber": 32, + "updateNumber": 1, + "mayAffectHoldings": false, + "contentChange": true, + "permit": "ThisWillBeReplacedWithActualPermitFromKeyvault", + "providerCode": "11", + "providerName": "VAR Unique", + "size": "large", + "bundle": [ + { + "bundleType": "DVD", + "location": "M1;B3" + } + ], + "status": { + "statusName": "Update", + "statusDate": "2024-01-18", + "isNewCell": false + }, + "replaces": [], + "replacedBy": [], + "additionalCoverage": [], + "geographicLimit": { + "boundingBox": { + "northLimit": 90, + "southLimit": -90, + "eastLimit": -180, + "westLimit": 180 + } + }, + "inUnitsOfSale": [], + "s63": { + "name": "GB800001.001", + "hash": "E99CD7B0B0C60709D9A70BF0CCDC2712403824B50111E6242E7D91753365D6AA", + "fileSize": 12048, + "compression": true, + "s57Crc": "E4BADE1C" + }, + "signature": { + "name": "GBP00001.001", + "hash": "2BD7095738E9455F523B99D35AD28588974BFF3EE3B4B04C65B9915E56C8CA7A", + "fileSize": 874 + }, + "ancillaryFiles": [ + { + "name": "GBNOOVER.TXT", + "hash": "44460F8B9586E7D5FD838F758BD7247B568706B4704E6BFC48217EB454049378", + "fileSize": 317 + }, + { + "name": "GB240266.TXT", + "hash": "D94CF73BCD9F2EB3107C5A9B3B165A5B8970CFEE1EE547122A8D9DFD08BB0369", + "fileSize": 1328 + }, + { + "name": "GB240260.TXT", + "hash": "2F8675A364DB96C660CDC3E0230496B56491459B17D69FD8F04940A9FF704ABD", + "fileSize": 499 + } + ] + } + ], + "unitsOfSale": [] + } +} diff --git a/tests/UKHO.ERPFacade.API.FunctionalTests/FunctionalTests/WebhookScenarios.cs b/tests/UKHO.ERPFacade.API.FunctionalTests/FunctionalTests/WebhookScenarios.cs index ed6aaa79..d5986d37 100644 --- a/tests/UKHO.ERPFacade.API.FunctionalTests/FunctionalTests/WebhookScenarios.cs +++ b/tests/UKHO.ERPFacade.API.FunctionalTests/FunctionalTests/WebhookScenarios.cs @@ -101,6 +101,10 @@ public async Task WhenValidEventInNewEncContentPublishedEventReceivedWithTokenHa //Re-issue scenario [TestCase("Re-issue.JSON", "PermitWithSameKey", TestName = "WhenICallTheWebhookWithReIssueScenario_ThenWebhookReturns200Response")] + //AIO-cell scenarios + [TestCase("AIOUpdateCell.JSON", "PermitWithSameKey", TestName = "WhenICallTheWebhookWithAIOUpdateCellScenario_ThenWebhookReturns200Response")] + [TestCase("AIONewCell.JSON", "PermitWithSameKey", TestName = "WhenICallTheWebhookWithAIONewCellScenario_ThenWebhookReturns200Response")] + public async Task WhenValidEventInNewEncContentPublishedEventReceivedWithValidToken_ThenWebhookReturns200OkResponse(string payloadJsonFileName, string permitState) { Console.WriteLine("Scenario:" + payloadJsonFileName + "\n"); diff --git a/tests/UKHO.ERPFacade.API.FunctionalTests/Service/S57WebhookEndpoint.cs b/tests/UKHO.ERPFacade.API.FunctionalTests/Service/S57WebhookEndpoint.cs index fbc14e5d..8d468892 100644 --- a/tests/UKHO.ERPFacade.API.FunctionalTests/Service/S57WebhookEndpoint.cs +++ b/tests/UKHO.ERPFacade.API.FunctionalTests/Service/S57WebhookEndpoint.cs @@ -75,6 +75,11 @@ public async Task PostWebhookResponseAsyncForXml(string filePath, //Logic to download XML from container using TraceID from JSON string generatedXmlFilePath = _azureBlobStorageHelper.DownloadGeneratedXmlFile(generatedXmlFolder, correlationId, Constants.S57EventContainerName); + if (filePath.Contains(Constants.AioKey) && generatedXmlFilePath.Length == 0) + { + return response; + } + //Expected XML string xmlFilePath = filePath.Replace(Config.TestConfig.PayloadFolder, Constants.ErpFacadeExpectedXmlFiles).Replace(".JSON", ".xml"); diff --git a/tests/UKHO.ERPFacade.API.FunctionalTests/UKHO.ERPFacade.API.FunctionalTests.csproj b/tests/UKHO.ERPFacade.API.FunctionalTests/UKHO.ERPFacade.API.FunctionalTests.csproj index 791e5621..279ee9a5 100644 --- a/tests/UKHO.ERPFacade.API.FunctionalTests/UKHO.ERPFacade.API.FunctionalTests.csproj +++ b/tests/UKHO.ERPFacade.API.FunctionalTests/UKHO.ERPFacade.API.FunctionalTests.csproj @@ -156,6 +156,12 @@ Always + + Always + + + Always + Always diff --git a/tests/UKHO.ERPFacade.API.UnitTests/Controllers/WebhookControllerTests.cs b/tests/UKHO.ERPFacade.API.UnitTests/Controllers/WebhookControllerTests.cs index b87af107..4e3d41e2 100644 --- a/tests/UKHO.ERPFacade.API.UnitTests/Controllers/WebhookControllerTests.cs +++ b/tests/UKHO.ERPFacade.API.UnitTests/Controllers/WebhookControllerTests.cs @@ -16,6 +16,7 @@ using NUnit.Framework; using UKHO.ERPFacade.API.Controllers; using UKHO.ERPFacade.API.Helpers; +using UKHO.ERPFacade.API.Services; using UKHO.ERPFacade.Common.Configuration; using UKHO.ERPFacade.Common.Exceptions; using UKHO.ERPFacade.Common.HttpClients; @@ -36,7 +37,7 @@ public class WebhookControllerTests private IAzureQueueHelper _fakeAzureQueueHelper; private ISapClient _fakeSapClient; private IXmlHelper _fakeXmlHelper; - private IEncContentSapMessageBuilder _fakeEncContentSapMessageBuilder; + private IS57Service _fakeS57Service; private IOptions _fakeSapConfig; private WebhookController _fakeWebHookController; private ILicenceUpdatedSapMessageBuilder _fakeLicenceUpdatedSapMessageBuilder; @@ -51,7 +52,7 @@ public void Setup() _fakeAzureQueueHelper = A.Fake(); _fakeSapClient = A.Fake(); _fakeXmlHelper = A.Fake(); - _fakeEncContentSapMessageBuilder = A.Fake(); + _fakeS57Service = A.Fake(); _fakeLicenceUpdatedSapMessageBuilder = A.Fake(); _fakeSapConfig = Options.Create(new SapConfiguration() { @@ -64,7 +65,7 @@ public void Setup() _fakeAzureBlobEventWriter, _fakeAzureQueueHelper, _fakeSapClient, - _fakeEncContentSapMessageBuilder, + _fakeS57Service, _fakeSapConfig, _fakeLicenceUpdatedSapMessageBuilder); } @@ -115,10 +116,7 @@ public async Task WhenValidEventInNewEncContentPublishedEventReceived_ThenWebhoo var result = (OkObjectResult)await _fakeWebHookController.NewEncContentPublishedEventReceived(fakeEncEventJson); - A.CallTo(() => _fakeAzureTableReaderWriter.UpsertEntity(A.Ignored, A.Ignored, A.Ignored)).MustHaveHappened(); - A.CallTo(() => _fakeAzureTableReaderWriter.UpdateEntity(A.Ignored, A.Ignored, A[]>.Ignored)).MustHaveHappened(); - A.CallTo(() => _fakeAzureBlobEventWriter.UploadEvent(A.Ignored, A.Ignored, A.Ignored)).MustHaveHappened(2, Times.Exactly); - A.CallTo(() => _fakeSapClient.PostEventData(A.Ignored, A.Ignored, A.Ignored, A.Ignored, A.Ignored)).MustHaveHappened(); + A.CallTo(() => _fakeS57Service.ProcessS57Event(A.Ignored)).MustHaveHappened(); result.StatusCode.Should().Be(200); @@ -126,36 +124,6 @@ public async Task WhenValidEventInNewEncContentPublishedEventReceived_ThenWebhoo && call.GetArgument(0) == LogLevel.Information && call.GetArgument(1) == EventIds.NewEncContentPublishedEventReceived.ToEventId() && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "ERP Facade webhook has received new enccontentpublished event from EES.").MustHaveHappenedOnceExactly(); - - A.CallTo(_fakeLogger).Where(call => call.Method.Name == "Log" - && call.GetArgument(0) == LogLevel.Information - && call.GetArgument(1) == EventIds.AddingEntryForEncContentPublishedEventInAzureTable.ToEventId() - && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "Adding/Updating entry for enccontentpublished event in azure table.").MustHaveHappenedOnceExactly(); - - A.CallTo(_fakeLogger).Where(call => call.Method.Name == "Log" - && call.GetArgument(0) == LogLevel.Information - && call.GetArgument(1) == EventIds.UploadEncContentPublishedEventInAzureBlobStarted.ToEventId() - && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "Uploading enccontentpublished event payload in blob storage.").MustHaveHappenedOnceExactly(); - - A.CallTo(_fakeLogger).Where(call => call.Method.Name == "Log" - && call.GetArgument(0) == LogLevel.Information - && call.GetArgument(1) == EventIds.UploadEncContentPublishedEventInAzureBlobCompleted.ToEventId() - && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "The enccontentpublished event payload is uploaded in blob storage successfully.").MustHaveHappenedOnceExactly(); - - A.CallTo(_fakeLogger).Where(call => call.Method.Name == "Log" - && call.GetArgument(0) == LogLevel.Information - && call.GetArgument(1) == EventIds.UploadSapXmlPayloadInAzureBlobStarted.ToEventId() - && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "Uploading the SAP XML payload in blob storage.").MustHaveHappenedOnceExactly(); - - A.CallTo(_fakeLogger).Where(call => call.Method.Name == "Log" - && call.GetArgument(0) == LogLevel.Information - && call.GetArgument(1) == EventIds.UploadSapXmlPayloadInAzureBlobCompleted.ToEventId() - && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "SAP XML payload is uploaded in blob storage successfully.").MustHaveHappenedOnceExactly(); - - A.CallTo(_fakeLogger).Where(call => call.Method.Name == "Log" - && call.GetArgument(0) == LogLevel.Information - && call.GetArgument(1) == EventIds.EncUpdateSentToSap.ToEventId() - && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "ENC update has been sent to SAP successfully. | {StatusCode}").MustHaveHappenedOnceExactly(); } [Test] @@ -182,57 +150,6 @@ public async Task WhenCorrelationIdIsMissingInNewEncContentPublishedEvent_ThenWe && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "CorrelationId is missing in enccontentpublished event.").MustHaveHappenedOnceExactly(); } - [Test] - public void WhenSapDoesNotRespond200Ok_ThenWebhookReturns500InternalServerResponse() - { - XmlDocument xmlDocument = new(); - - var fakeEncEventJson = JObject.Parse(@"{""data"":{""correlationId"":""123""}}"); - - A.CallTo(() => _fakeXmlHelper.CreateXmlDocument(A.Ignored)).Returns(xmlDocument); - A.CallTo(() => _fakeSapClient.PostEventData(A.Ignored, A.Ignored, A.Ignored, A.Ignored, A.Ignored)) - .Returns(new HttpResponseMessage() - { - StatusCode = HttpStatusCode.Unauthorized - }); - - Assert.ThrowsAsync(() => _fakeWebHookController.NewEncContentPublishedEventReceived(fakeEncEventJson)); - - A.CallTo(() => _fakeAzureTableReaderWriter.UpsertEntity(A.Ignored, A.Ignored, A.Ignored)).MustNotHaveHappened(); - A.CallTo(() => _fakeAzureTableReaderWriter.UpdateEntity(A.Ignored, A.Ignored, A[]>.Ignored)).MustNotHaveHappened(); - A.CallTo(() => _fakeAzureBlobEventWriter.UploadEvent(A.Ignored, A.Ignored, A.Ignored)).MustHaveHappened(); - - A.CallTo(_fakeLogger).Where(call => call.Method.Name == "Log" - && call.GetArgument(0) == LogLevel.Information - && call.GetArgument(1) == EventIds.NewEncContentPublishedEventReceived.ToEventId() - && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "ERP Facade webhook has received new enccontentpublished event from EES.").MustHaveHappenedOnceExactly(); - - A.CallTo(_fakeLogger).Where(call => call.Method.Name == "Log" - && call.GetArgument(0) == LogLevel.Information - && call.GetArgument(1) == EventIds.AddingEntryForEncContentPublishedEventInAzureTable.ToEventId() - && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "Adding/Updating entry for enccontentpublished event in azure table.").MustHaveHappenedOnceExactly(); - - A.CallTo(_fakeLogger).Where(call => call.Method.Name == "Log" - && call.GetArgument(0) == LogLevel.Information - && call.GetArgument(1) == EventIds.UploadEncContentPublishedEventInAzureBlobStarted.ToEventId() - && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "Uploading enccontentpublished event payload in blob storage.").MustHaveHappenedOnceExactly(); - - A.CallTo(_fakeLogger).Where(call => call.Method.Name == "Log" - && call.GetArgument(0) == LogLevel.Information - && call.GetArgument(1) == EventIds.UploadEncContentPublishedEventInAzureBlobCompleted.ToEventId() - && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "The enccontentpublished event payload is uploaded in blob storage successfully.").MustHaveHappenedOnceExactly(); - - A.CallTo(_fakeLogger).Where(call => call.Method.Name == "Log" - && call.GetArgument(0) == LogLevel.Information - && call.GetArgument(1) == EventIds.UploadSapXmlPayloadInAzureBlobStarted.ToEventId() - && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "Uploading the SAP XML payload in blob storage.").MustHaveHappenedOnceExactly(); - - A.CallTo(_fakeLogger).Where(call => call.Method.Name == "Log" - && call.GetArgument(0) == LogLevel.Information - && call.GetArgument(1) == EventIds.UploadSapXmlPayloadInAzureBlobCompleted.ToEventId() - && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "SAP XML payload is uploaded in blob storage successfully.").MustHaveHappenedOnceExactly(); - } - [Test] public void Does_Constructor_Throws_ArgumentNullException_When_Paramter_Is_Null() { @@ -243,7 +160,7 @@ public void Does_Constructor_Throws_ArgumentNullException_When_Paramter_Is_Null( _fakeAzureBlobEventWriter, _fakeAzureQueueHelper, _fakeSapClient, - _fakeEncContentSapMessageBuilder, + _fakeS57Service, null, _fakeLicenceUpdatedSapMessageBuilder)) .ParamName diff --git a/tests/UKHO.ERPFacade.API.UnitTests/ERPTestData/NewAIOCell.JSON b/tests/UKHO.ERPFacade.API.UnitTests/ERPTestData/NewAIOCell.JSON new file mode 100644 index 00000000..d04a477e --- /dev/null +++ b/tests/UKHO.ERPFacade.API.UnitTests/ERPTestData/NewAIOCell.JSON @@ -0,0 +1,82 @@ +{ + "specversion": "1.0", + "type": "uk.gov.ukho.encpublishing.enccontentpublished.v2.2", + "source": "https://encpublishing.ukho.gov.uk", + "id": "47c82948-f389-41bb-a77c-bdd3f8c306d7", + "time": "2024-10-11T12:54:30.6083284+00:00", + "subject": "GB800001", + "datacontenttype": "application/json", + "data": { + "correlationId": "19cc417e-c2a1-438d-2837-08dce9f35151", + "ukhoWeekNumber": { + "year": 2024, + "week": 28, + "currentWeekAlphaCorrection": false + }, + "products": [ + { + "dataSetName": "GB800001.000", + "productName": "GB800001", + "title": "Admiralty Information Overlay", + "scale": 1, + "usageBand": 8, + "editionNumber": 32, + "updateNumber": 0, + "mayAffectHoldings": true, + "contentChange": true, + "permit": "permitString", + "providerCode": "11", + "providerName": "VAR Unique", + "size": "large", + "bundle": [ + { + "bundleType": "DVD", + "location": "M1;B3" + } + ], + "status": { + "statusName": "New Edition", + "statusDate": "2024-01-11", + "isNewCell": true + }, + "replaces": [], + "replacedBy": [], + "additionalCoverage": [], + "geographicLimit": { + "boundingBox": { + "northLimit": 90, + "southLimit": -90, + "eastLimit": -180, + "westLimit": 180 + } + }, + "inUnitsOfSale": [], + "s63": { + "name": "GB800001.000", + "hash": "hash", + "fileSize": 1998768, + "compression": true, + "s57Crc": "DB4A0A77" + }, + "signature": { + "name": "GBP00001.000", + "hash": "hash", + "fileSize": 874 + }, + "ancillaryFiles": [ + { + "name": "GBNOOVER.TXT", + "hash": "hash", + "fileSize": 317 + }, + { + "name": "GB196063.TXT", + "hash": "hash", + "fileSize": 719 + } + ] + } + ], + "unitsOfSale": [] + } +} diff --git a/tests/UKHO.ERPFacade.API.UnitTests/ERPTestData/NewCellWithNullYearInUkhoWeekNumberSection.JSON b/tests/UKHO.ERPFacade.API.UnitTests/ERPTestData/NewCellWithNullYearInUkhoWeekNumberSection.JSON new file mode 100644 index 00000000..934a8e9f --- /dev/null +++ b/tests/UKHO.ERPFacade.API.UnitTests/ERPTestData/NewCellWithNullYearInUkhoWeekNumberSection.JSON @@ -0,0 +1,139 @@ +{ + "specversion": "1.0", + "type": "uk.gov.ukho.encpublishing.enccontentpublished.v2.2", + "source": "https://encpublishing.ukho.gov.uk", + "id": "f206ec1c-0b83-43a2-b11c-cca1d981c2a4", + "time": "2024-09-13T05:34:42.4904747+00:00", + "subject": "US5AK9DI", + "datacontenttype": "application/json", + "data": { + "correlationId": "5004bc72-5beb-42c1-5037-08dcc74c342e", + "ukhoWeekNumber": { + "year": null, + "week": 12, + "currentWeekAlphaCorrection": true + }, + "products": [ + { + "dataSetName": "US5AK9DI.000", + "productName": "US5AK9DI", + "title": "Amlia Island - Svechnikof Harbor", + "scale": 22000, + "usageBand": 5, + "editionNumber": 1, + "updateNumber": 0, + "mayAffectHoldings": true, + "contentChange": true, + "permit": "permitstring", + "providerCode": "1", + "providerName": "ICE", + "size": "medium", + "bundle": [ + { + "bundleType": "DVD", + "location": "M1;B5" + } + ], + "status": { + "statusName": "New Edition", + "statusDate": "2024-07-11", + "isNewCell": true + }, + "replaces": [], + "replacedBy": [], + "additionalCoverage": [], + "geographicLimit": { + "boundingBox": { + "northLimit": 52.125, + "southLimit": 52.05, + "eastLimit": -173.4, + "westLimit": -173.55 + }, + "polygons": [] + }, + "inUnitsOfSale": [ + "PAYSF", + "US5AK9DI" + ], + "s63": { + "name": "US5AK9DI.000", + "hash": "", + "fileSize": 0, + "compression": true, + "s57Crc": "8A46B83F" + }, + "signature": { + "name": "USMAK9DI.000", + "hash": "", + "fileSize": 0 + }, + "ancillaryFiles": [ + { + "name": "US213DIA.TXT", + "hash": "hash", + "fileSize": 4008 + }, + { + "name": "US213DIB.TXT", + "hash": "hash", + "fileSize": 293 + } + ] + } + ], + "unitsOfSale": [ + { + "unitName": "US5AK9DI", + "title": "Amlia Island - Svechnikof Harbor", + "unitOfSaleType": "unit", + "unitSize": "medium", + "unitType": "AVCS Units Harbour", + "providerCode": "1", + "providerName": "ICE", + "status": "ForSale", + "isNewUnitOfSale": true, + "geographicLimit": { + "boundingBox": { + "northLimit": 52.125, + "southLimit": 52.05, + "eastLimit": -173.4, + "westLimit": -173.55 + }, + "polygons": [] + }, + "compositionChanges": { + "addProducts": [ + "US5AK9DI" + ], + "removeProducts": [] + } + }, + { + "unitName": "PAYSF", + "title": "World Folio", + "unitOfSaleType": "folio", + "unitSize": "large", + "unitType": "AVCS Folio Transit", + "providerCode": "1", + "providerName": "ICE", + "status": "ForSale", + "isNewUnitOfSale": false, + "geographicLimit": { + "boundingBox": { + "northLimit": 0, + "southLimit": 0, + "eastLimit": 0, + "westLimit": 0 + }, + "polygons": [] + }, + "compositionChanges": { + "addProducts": [ + "US5AK9DI" + ], + "removeProducts": [] + } + } + ] + } +} diff --git a/tests/UKHO.ERPFacade.API.UnitTests/ERPTestData/NewCellWithNullcurrentWeekAlphaCorrectionInUkhoWeekNumberSection.JSON b/tests/UKHO.ERPFacade.API.UnitTests/ERPTestData/NewCellWithNullcurrentWeekAlphaCorrectionInUkhoWeekNumberSection.JSON new file mode 100644 index 00000000..0a61419f --- /dev/null +++ b/tests/UKHO.ERPFacade.API.UnitTests/ERPTestData/NewCellWithNullcurrentWeekAlphaCorrectionInUkhoWeekNumberSection.JSON @@ -0,0 +1,138 @@ +{ + "specversion": "1.0", + "type": "uk.gov.ukho.encpublishing.enccontentpublished.v2.2", + "source": "https://encpublishing.ukho.gov.uk", + "id": "f206ec1c-0b83-43a2-b11c-cca1d981c2a4", + "time": "2024-09-13T05:34:42.4904747+00:00", + "subject": "US5AK9DI", + "datacontenttype": "application/json", + "data": { + "correlationId": "5004bc72-5beb-42c1-5037-08dcc74c342e", + "ukhoWeekNumber": { + "year": 2024, + "week": 12 + }, + "products": [ + { + "dataSetName": "US5AK9DI.000", + "productName": "US5AK9DI", + "title": "Amlia Island - Svechnikof Harbor", + "scale": 22000, + "usageBand": 5, + "editionNumber": 1, + "updateNumber": 0, + "mayAffectHoldings": true, + "contentChange": true, + "permit": "permitstring", + "providerCode": "1", + "providerName": "ICE", + "size": "medium", + "bundle": [ + { + "bundleType": "DVD", + "location": "M1;B5" + } + ], + "status": { + "statusName": "New Edition", + "statusDate": "2024-07-11", + "isNewCell": true + }, + "replaces": [], + "replacedBy": [], + "additionalCoverage": [], + "geographicLimit": { + "boundingBox": { + "northLimit": 52.125, + "southLimit": 52.05, + "eastLimit": -173.4, + "westLimit": -173.55 + }, + "polygons": [] + }, + "inUnitsOfSale": [ + "PAYSF", + "US5AK9DI" + ], + "s63": { + "name": "US5AK9DI.000", + "hash": "", + "fileSize": 0, + "compression": true, + "s57Crc": "8A46B83F" + }, + "signature": { + "name": "USMAK9DI.000", + "hash": "", + "fileSize": 0 + }, + "ancillaryFiles": [ + { + "name": "US213DIA.TXT", + "hash": "hash", + "fileSize": 4008 + }, + { + "name": "US213DIB.TXT", + "hash": "hash", + "fileSize": 293 + } + ] + } + ], + "unitsOfSale": [ + { + "unitName": "US5AK9DI", + "title": "Amlia Island - Svechnikof Harbor", + "unitOfSaleType": "unit", + "unitSize": "medium", + "unitType": "AVCS Units Harbour", + "providerCode": "1", + "providerName": "ICE", + "status": "ForSale", + "isNewUnitOfSale": true, + "geographicLimit": { + "boundingBox": { + "northLimit": 52.125, + "southLimit": 52.05, + "eastLimit": -173.4, + "westLimit": -173.55 + }, + "polygons": [] + }, + "compositionChanges": { + "addProducts": [ + "US5AK9DI" + ], + "removeProducts": [] + } + }, + { + "unitName": "PAYSF", + "title": "World Folio", + "unitOfSaleType": "folio", + "unitSize": "large", + "unitType": "AVCS Folio Transit", + "providerCode": "1", + "providerName": "ICE", + "status": "ForSale", + "isNewUnitOfSale": false, + "geographicLimit": { + "boundingBox": { + "northLimit": 0, + "southLimit": 0, + "eastLimit": 0, + "westLimit": 0 + }, + "polygons": [] + }, + "compositionChanges": { + "addProducts": [ + "US5AK9DI" + ], + "removeProducts": [] + } + } + ] + } +} diff --git a/tests/UKHO.ERPFacade.API.UnitTests/ERPTestData/NewCellWithoutYearInUkhoWeekNumberSection.JSON b/tests/UKHO.ERPFacade.API.UnitTests/ERPTestData/NewCellWithoutYearInUkhoWeekNumberSection.JSON new file mode 100644 index 00000000..9aa7a633 --- /dev/null +++ b/tests/UKHO.ERPFacade.API.UnitTests/ERPTestData/NewCellWithoutYearInUkhoWeekNumberSection.JSON @@ -0,0 +1,138 @@ +{ + "specversion": "1.0", + "type": "uk.gov.ukho.encpublishing.enccontentpublished.v2.2", + "source": "https://encpublishing.ukho.gov.uk", + "id": "f206ec1c-0b83-43a2-b11c-cca1d981c2a4", + "time": "2024-09-13T05:34:42.4904747+00:00", + "subject": "US5AK9DI", + "datacontenttype": "application/json", + "data": { + "correlationId": "5004bc72-5beb-42c1-5037-08dcc74c342e", + "ukhoWeekNumber": { + "week": 12, + "currentWeekAlphaCorrection": true + }, + "products": [ + { + "dataSetName": "US5AK9DI.000", + "productName": "US5AK9DI", + "title": "Amlia Island - Svechnikof Harbor", + "scale": 22000, + "usageBand": 5, + "editionNumber": 1, + "updateNumber": 0, + "mayAffectHoldings": true, + "contentChange": true, + "permit": "permitstring", + "providerCode": "1", + "providerName": "ICE", + "size": "medium", + "bundle": [ + { + "bundleType": "DVD", + "location": "M1;B5" + } + ], + "status": { + "statusName": "New Edition", + "statusDate": "2024-07-11", + "isNewCell": true + }, + "replaces": [], + "replacedBy": [], + "additionalCoverage": [], + "geographicLimit": { + "boundingBox": { + "northLimit": 52.125, + "southLimit": 52.05, + "eastLimit": -173.4, + "westLimit": -173.55 + }, + "polygons": [] + }, + "inUnitsOfSale": [ + "PAYSF", + "US5AK9DI" + ], + "s63": { + "name": "US5AK9DI.000", + "hash": "", + "fileSize": 0, + "compression": true, + "s57Crc": "8A46B83F" + }, + "signature": { + "name": "USMAK9DI.000", + "hash": "", + "fileSize": 0 + }, + "ancillaryFiles": [ + { + "name": "US213DIA.TXT", + "hash": "hash", + "fileSize": 4008 + }, + { + "name": "US213DIB.TXT", + "hash": "hash", + "fileSize": 293 + } + ] + } + ], + "unitsOfSale": [ + { + "unitName": "US5AK9DI", + "title": "Amlia Island - Svechnikof Harbor", + "unitOfSaleType": "unit", + "unitSize": "medium", + "unitType": "AVCS Units Harbour", + "providerCode": "1", + "providerName": "ICE", + "status": "ForSale", + "isNewUnitOfSale": true, + "geographicLimit": { + "boundingBox": { + "northLimit": 52.125, + "southLimit": 52.05, + "eastLimit": -173.4, + "westLimit": -173.55 + }, + "polygons": [] + }, + "compositionChanges": { + "addProducts": [ + "US5AK9DI" + ], + "removeProducts": [] + } + }, + { + "unitName": "PAYSF", + "title": "World Folio", + "unitOfSaleType": "folio", + "unitSize": "large", + "unitType": "AVCS Folio Transit", + "providerCode": "1", + "providerName": "ICE", + "status": "ForSale", + "isNewUnitOfSale": false, + "geographicLimit": { + "boundingBox": { + "northLimit": 0, + "southLimit": 0, + "eastLimit": 0, + "westLimit": 0 + }, + "polygons": [] + }, + "compositionChanges": { + "addProducts": [ + "US5AK9DI" + ], + "removeProducts": [] + } + } + ] + } +} diff --git a/tests/UKHO.ERPFacade.API.UnitTests/Helpers/EncContentSapMessageBuilderTests.cs b/tests/UKHO.ERPFacade.API.UnitTests/Helpers/EncContentSapMessageBuilderTests.cs index 758f4752..73bddeef 100644 --- a/tests/UKHO.ERPFacade.API.UnitTests/Helpers/EncContentSapMessageBuilderTests.cs +++ b/tests/UKHO.ERPFacade.API.UnitTests/Helpers/EncContentSapMessageBuilderTests.cs @@ -75,12 +75,14 @@ public void WhenBuildSapMessageXmlIsCalledWithCancelCellWithExistingCellReplacem { var cancelReplaceCellEventPayloadJson = TestHelper.ReadFileData("ERPTestData\\CancelCellWithExistingCellReplacement.JSON"); var eventData = JsonConvert.DeserializeObject(cancelReplaceCellEventPayloadJson); + var permitKeys = new DecryptedPermit { ActiveKey = "firstkey", NextKey = "nextkey" }; XmlDocument soapXml = new(); soapXml.LoadXml(_sapXmlTemplate); A.CallTo(() => _fakeFileSystemHelper.IsFileExists(A.Ignored)).Returns(true); A.CallTo(() => _fakeXmlHelper.CreateXmlDocument(A.Ignored)).Returns(soapXml); + A.CallTo(() => _fakePermitDecryption.Decrypt(A.Ignored)).Returns(permitKeys); A.CallTo(() => _fakeWeekDetailsProvider.GetDateOfWeek(A.Ignored, A.Ignored, A.Ignored)).Returns("20240808"); var result = _fakeEncContentSapMessageBuilder.BuildSapMessageXml(eventData!); @@ -391,5 +393,46 @@ public void WhenGetXmlNodeValue(string fieldValue, string xmlNodeName, string ex result.Should().Be(expectedValue); } + + [Test] + [TestCase("ERPTestData\\NewCellWithNullYearInUkhoWeekNumberSection.JSON")] + [TestCase("ERPTestData\\NewCellWithoutYearInUkhoWeekNumberSection.JSON")] + [TestCase("ERPTestData\\NewCellWithNullcurrentWeekAlphaCorrectionInUkhoWeekNumberSection.JSON")] + public void WhenProcessingUkhoWeekNumberAttributes(string jsonPayloadFile) + { + var cancelCellWithNewCellReplacementPayloadJson = TestHelper.ReadFileData(jsonPayloadFile); + var eventData = JsonConvert.DeserializeObject(cancelCellWithNewCellReplacementPayloadJson); + var permitKeys = new DecryptedPermit { ActiveKey = "firstkey", NextKey = "nextkey" }; + + XmlDocument soapXml = new(); + soapXml.LoadXml(_sapXmlTemplate); + + A.CallTo(() => _fakeFileSystemHelper.IsFileExists(A.Ignored)).Returns(true); + A.CallTo(() => _fakeXmlHelper.CreateXmlDocument(A.Ignored)).Returns(soapXml); + A.CallTo(() => _fakePermitDecryption.Decrypt(A.Ignored)).Returns(permitKeys); + A.CallTo(() => _fakeWeekDetailsProvider.GetDateOfWeek(A.Ignored, A.Ignored, A.Ignored)).Throws(); + + Assert.Throws(() => _fakeEncContentSapMessageBuilder.BuildSapMessageXml(eventData!)) + .Message.Should().Be("Error while generating SAP action information. | Action : CREATE ENC CELL | XML Attribute : WEEKNO | ErrorMessage : Required details are missing in enccontentpublished event payload. | Property Name : "); + } + + [Test] + public void WhenBuildSapMessageXmlWithEmptyPermit_ThenThrowERPFacadeException() + { + var newCellEventPayloadJson = TestHelper.ReadFileData("ERPTestData\\NewCellWithEmptyPermit.JSON"); + var eventData = JsonConvert.DeserializeObject(newCellEventPayloadJson); + + XmlDocument soapXml = new(); + soapXml.LoadXml(_sapXmlTemplate); + + A.CallTo(() => _fakeFileSystemHelper.IsFileExists(A.Ignored)).Returns(true); + A.CallTo(() => _fakeXmlHelper.CreateXmlDocument(A.Ignored)).Returns(soapXml); + + A.CallTo(() => _fakeWeekDetailsProvider.GetDateOfWeek(A.Ignored, A.Ignored, A.Ignored)).Throws(); + A.CallTo(_fakePermitDecryption).Where(call => call.Method.Name == "Decrypt").MustNotHaveHappened(); + + Assert.Throws(() => _fakeEncContentSapMessageBuilder.BuildSapMessageXml(eventData!)) + .Message.Should().Be("Error while generating SAP action information. | Action : CREATE ENC CELL | XML Attribute : ACTIVEKEY | ErrorMessage : Required details are missing in enccontentpublished event payload. | Property Name : "); + } } } diff --git a/tests/UKHO.ERPFacade.API.UnitTests/Services/S57ServiceTests.cs b/tests/UKHO.ERPFacade.API.UnitTests/Services/S57ServiceTests.cs new file mode 100644 index 00000000..43656a5e --- /dev/null +++ b/tests/UKHO.ERPFacade.API.UnitTests/Services/S57ServiceTests.cs @@ -0,0 +1,180 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Xml; +using FakeItEasy; +using FluentAssertions; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Newtonsoft.Json.Linq; +using NUnit.Framework; +using UKHO.ERPFacade.API.Helpers; +using UKHO.ERPFacade.API.Services; +using UKHO.ERPFacade.API.UnitTests.Common; +using UKHO.ERPFacade.Common.Configuration; +using UKHO.ERPFacade.Common.Exceptions; +using UKHO.ERPFacade.Common.HttpClients; +using UKHO.ERPFacade.Common.IO.Azure; +using UKHO.ERPFacade.Common.Logging; +using UKHO.ERPFacade.Common.Models; +using UKHO.ERPFacade.Common.Models.TableEntities; + +namespace UKHO.ERPFacade.API.UnitTests.Services +{ + [TestFixture] + public class S57ServiceTests + { + private ILogger _fakeLogger; + private IAzureTableReaderWriter _fakeAzureTableReaderWriter; + private IAzureBlobEventWriter _fakeAzureBlobEventWriter; + private IAzureQueueHelper _fakeAzureQueueHelper; + private ISapClient _fakeSapClient; + private IEncContentSapMessageBuilder _fakeEncContentSapMessageBuilder; + private IOptions _fakeSapConfig; + private IOptions _fakeAioConfig; + private S57Service _fakeNewEncContentPublishedEventReceived; + + [SetUp] + public void Setup() + { + _fakeLogger = A.Fake>(); + _fakeAioConfig = A.Fake>(); + _fakeAzureTableReaderWriter = A.Fake(); + _fakeAzureBlobEventWriter = A.Fake(); + _fakeAzureQueueHelper = A.Fake(); + _fakeSapClient = A.Fake(); + _fakeEncContentSapMessageBuilder = A.Fake(); + _fakeSapConfig = Options.Create(new SapConfiguration() + { + SapServiceOperationForEncEvent = "Z_ADDS_MAT_INFO" + }); + + _fakeAioConfig.Value.AioCells = "GB800001,GB800002"; + + _fakeNewEncContentPublishedEventReceived = new S57Service(_fakeLogger, _fakeAzureTableReaderWriter, _fakeAzureBlobEventWriter, _fakeAzureQueueHelper, _fakeSapClient, _fakeEncContentSapMessageBuilder, _fakeSapConfig, _fakeAioConfig); + } + + [Test] + public void WhenSapDoesNotRespond200Ok_ThenReturn500InternalServerResponse() + { + XmlDocument xmlDocument = new(); + + var newCellEventPayloadJson = TestHelper.ReadFileData("ERPTestData\\NewCell.JSON"); + var fakeEncEventJson = JObject.Parse(newCellEventPayloadJson); + + A.CallTo(() => _fakeEncContentSapMessageBuilder.BuildSapMessageXml(A.Ignored)).Returns(xmlDocument); + A.CallTo(() => _fakeSapClient.PostEventData(A.Ignored, A.Ignored, A.Ignored, A.Ignored, A.Ignored)) + .Returns(new HttpResponseMessage() + { + StatusCode = HttpStatusCode.Unauthorized + }); + + Assert.ThrowsAsync(() => _fakeNewEncContentPublishedEventReceived.ProcessS57Event(fakeEncEventJson)) + .Message.Should().Be("An error occurred while sending a request to SAP. | Unauthorized"); + + A.CallTo(() => _fakeAzureTableReaderWriter.UpsertEntity(A.Ignored, A.Ignored, A.Ignored)).MustHaveHappened(); + A.CallTo(() => _fakeAzureBlobEventWriter.UploadEvent(A.Ignored, A.Ignored, A.Ignored)).MustHaveHappened(); + + A.CallTo(_fakeLogger).Where(call => call.Method.Name == "Log" + && call.GetArgument(0) == LogLevel.Information + && call.GetArgument(1) == EventIds.AddingEntryForEncContentPublishedEventInAzureTable.ToEventId() + && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "Adding/Updating entry for enccontentpublished event in azure table.").MustHaveHappenedOnceExactly(); + + A.CallTo(_fakeLogger).Where(call => call.Method.Name == "Log" + && call.GetArgument(0) == LogLevel.Information + && call.GetArgument(1) == EventIds.UploadEncContentPublishedEventInAzureBlobStarted.ToEventId() + && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "Uploading enccontentpublished event payload in blob storage.").MustHaveHappenedOnceExactly(); + + A.CallTo(_fakeLogger).Where(call => call.Method.Name == "Log" + && call.GetArgument(0) == LogLevel.Information + && call.GetArgument(1) == EventIds.UploadEncContentPublishedEventInAzureBlobCompleted.ToEventId() + && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "The enccontentpublished event payload is uploaded in blob storage successfully.").MustHaveHappenedOnceExactly(); + + A.CallTo(_fakeLogger).Where(call => call.Method.Name == "Log" + && call.GetArgument(0) == LogLevel.Information + && call.GetArgument(1) == EventIds.UploadSapXmlPayloadInAzureBlobStarted.ToEventId() + && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "Uploading the SAP XML payload in blob storage.").MustHaveHappenedOnceExactly(); + + A.CallTo(_fakeLogger).Where(call => call.Method.Name == "Log" + && call.GetArgument(0) == LogLevel.Information + && call.GetArgument(1) == EventIds.UploadSapXmlPayloadInAzureBlobCompleted.ToEventId() + && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "SAP XML payload is uploaded in blob storage successfully.").MustHaveHappenedOnceExactly(); + } + + [Test] + public void WhenSapDoesResponds200Ok_ThenCheckAllRequiredMessagesLoggedAsExpected() + { + XmlDocument xmlDocument = new(); + + var newCellEventPayloadJson = TestHelper.ReadFileData("ERPTestData\\NewCell.JSON"); + var fakeEncEventJson = JObject.Parse(newCellEventPayloadJson); + + A.CallTo(() => _fakeEncContentSapMessageBuilder.BuildSapMessageXml(A.Ignored)).Returns(xmlDocument); + A.CallTo(() => _fakeSapClient.PostEventData(A.Ignored, A.Ignored, A.Ignored, A.Ignored, A.Ignored)) + .Returns(new HttpResponseMessage() + { + StatusCode = HttpStatusCode.OK + }); + + _ = _fakeNewEncContentPublishedEventReceived.ProcessS57Event(fakeEncEventJson); + + A.CallTo(() => _fakeAzureTableReaderWriter.UpdateEntity(A.Ignored, A.Ignored, A[]>.Ignored)).MustHaveHappened(); + A.CallTo(() => _fakeAzureBlobEventWriter.UploadEvent(A.Ignored, A.Ignored, A.Ignored)).MustHaveHappened(); + + A.CallTo(_fakeLogger).Where(call => call.Method.Name == "Log" + && call.GetArgument(0) == LogLevel.Information + && call.GetArgument(1) == EventIds.AddingEntryForEncContentPublishedEventInAzureTable.ToEventId() + && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "Adding/Updating entry for enccontentpublished event in azure table.").MustHaveHappenedOnceExactly(); + + A.CallTo(_fakeLogger).Where(call => call.Method.Name == "Log" + && call.GetArgument(0) == LogLevel.Information + && call.GetArgument(1) == EventIds.UploadEncContentPublishedEventInAzureBlobStarted.ToEventId() + && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "Uploading enccontentpublished event payload in blob storage.").MustHaveHappenedOnceExactly(); + + A.CallTo(_fakeLogger).Where(call => call.Method.Name == "Log" + && call.GetArgument(0) == LogLevel.Information + && call.GetArgument(1) == EventIds.UploadEncContentPublishedEventInAzureBlobCompleted.ToEventId() + && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "The enccontentpublished event payload is uploaded in blob storage successfully.").MustHaveHappenedOnceExactly(); + + A.CallTo(_fakeLogger).Where(call => call.Method.Name == "Log" + && call.GetArgument(0) == LogLevel.Information + && call.GetArgument(1) == EventIds.UploadSapXmlPayloadInAzureBlobStarted.ToEventId() + && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "Uploading the SAP XML payload in blob storage.").MustHaveHappenedOnceExactly(); + + A.CallTo(_fakeLogger).Where(call => call.Method.Name == "Log" + && call.GetArgument(0) == LogLevel.Information + && call.GetArgument(1) == EventIds.UploadSapXmlPayloadInAzureBlobCompleted.ToEventId() + && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "SAP XML payload is uploaded in blob storage successfully.").MustHaveHappenedOnceExactly(); + + A.CallTo(_fakeLogger).Where(call => call.Method.Name == "Log" + && call.GetArgument(0) == LogLevel.Information + && call.GetArgument(1) == EventIds.EncUpdateSentToSap.ToEventId() + && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "ENC update has been sent to SAP successfully").MustHaveHappenedOnceExactly(); + } + + [Test] + public void WhenPayloadHasAioCells_ThenReturn200OkResponse() + { + var newCellEventPayloadJson = TestHelper.ReadFileData("ERPTestData\\NewAIOCell.JSON"); + var fakeEncEventJson = JObject.Parse(newCellEventPayloadJson); + + _ = _fakeNewEncContentPublishedEventReceived.ProcessS57Event(fakeEncEventJson); + + A.CallTo(_fakeLogger).Where(call => call.Method.Name == "Log" + && call.GetArgument(0) == LogLevel.Information + && call.GetArgument(1) == EventIds.NoProcessingOfNewEncContentPublishedEventForAioCells.ToEventId() + && call.GetArgument>>(2)!.ToDictionary(c => c.Key, c => c.Value)["{OriginalFormat}"].ToString() == "The enccontentpublished event will not be processed for Aio cells.").MustHaveHappenedOnceExactly(); + } + + [Test] + public void WhenBuildSapMessageXmlIsCalledWithoutAIOCellConfiguration_ThenThrowERPFacadeException() + { + _fakeAioConfig.Value.AioCells = string.Empty; + + Assert.Throws(() => new S57Service(_fakeLogger, _fakeAzureTableReaderWriter, _fakeAzureBlobEventWriter, _fakeAzureQueueHelper, _fakeSapClient, _fakeEncContentSapMessageBuilder, _fakeSapConfig, _fakeAioConfig)) + .Message.Should().Be("Aio cell configuration not found."); + } + } +} diff --git a/tests/UKHO.ERPFacade.API.UnitTests/UKHO.ERPFacade.API.UnitTests.csproj b/tests/UKHO.ERPFacade.API.UnitTests/UKHO.ERPFacade.API.UnitTests.csproj index 5dc94431..c980ddcf 100644 --- a/tests/UKHO.ERPFacade.API.UnitTests/UKHO.ERPFacade.API.UnitTests.csproj +++ b/tests/UKHO.ERPFacade.API.UnitTests/UKHO.ERPFacade.API.UnitTests.csproj @@ -39,6 +39,18 @@ Always + + Always + + + Always + + + Always + + + Always + Always