From f6ddcd40a1ab41f59123cd6ca30046823e1d5e3f Mon Sep 17 00:00:00 2001 From: James Friel Date: Fri, 10 Nov 2023 09:25:59 +0000 Subject: [PATCH 01/85] attempt to wget dicom plugin --- .github/workflows/build.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2bc94242b8..aaf4ddbded 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -119,6 +119,12 @@ jobs: dotnet publish Application/ResearchDataManagementPlatform/ResearchDataManagementPlatform.csproj -r win-x64 --self-contained -c Release -o PublishWinForms -p:GenerateDocumentationFile=false -p:PublishSingleFile=true -p:PublishReadyToRun=true -p:IncludeNativeLibrariesForSelfExtract=true --verbosity minimal --nologo dotnet publish Tools/rdmp/rdmp.csproj -r win-x64 --self-contained -c Release -o PublishWindows -p:GenerateDocumentationFile=false -p:PublishSingleFile=true -p:PublishReadyToRun=true -p:IncludeNativeLibrariesForSelfExtract=true --verbosity minimal --nologo dotnet publish Tools/rdmp/rdmp.csproj -r linux-x64 --self-contained -c Release -o PublishLinux -p:GenerateDocumentationFile=false -p:PublishSingleFile=true -p:PublishReadyToRun=true --verbosity minimal --nologo + - name: Install Plugins + shell: bash + run: | + cd PublishWindows + curl -s https://api.github.com/repos/SMI/RdmpDicom/releases/latest | grep "Rdmp.Dicom.*nupkg" | cut -d : -f 2,3 | tr -d \" | sed -n '2 p' | xargs wget + cd .. - name: Sign shell: bash From 0de22271e3fd9e16a2f2d19e148fb69c39716231 Mon Sep 17 00:00:00 2001 From: James Friel Date: Fri, 10 Nov 2023 09:41:31 +0000 Subject: [PATCH 02/85] improved looping for plugins --- .github/workflows/build.yml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index aaf4ddbded..d2ff6a927a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -122,9 +122,16 @@ jobs: - name: Install Plugins shell: bash run: | - cd PublishWindows - curl -s https://api.github.com/repos/SMI/RdmpDicom/releases/latest | grep "Rdmp.Dicom.*nupkg" | cut -d : -f 2,3 | tr -d \" | sed -n '2 p' | xargs wget - cd .. + for plugin in https://api.github.com/repos/SMI/RdmpDicom/releases/latest + do + PluginName="$(cut -d/ -f6 <<< $plugin)" + curl -s $plugin | grep "$pluginName.*nupkg" | cut -d : -f 2,3 | tr -d \" | sed -n '2 p' | xargs wget + for platform in PublishWindows PublishLinux + do + cp *.nupkg $platform + done + rm *.nupkg + done - name: Sign shell: bash From 3a5594255ff5a286699a9f3234596f0a6a68554b Mon Sep 17 00:00:00 2001 From: James Friel Date: Fri, 10 Nov 2023 10:47:51 +0000 Subject: [PATCH 03/85] update script --- .github/workflows/build.yml | 76 ++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d2ff6a927a..19f52172ee 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -76,43 +76,43 @@ jobs: dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- createnewexternaldatabaseserver CohortIdentificationQueryCachingServer_ID "DatabaseType:MySQL:Server=127.0.0.1;Uid=root;Pwd=YourStrong!Passw0rd;Database=rdmp_cache" --dir ~/rdmp/rdmp-yaml/ - name: Initialise RDMP run: dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- install --createdatabasetimeout 180 "(localdb)\MSSQLLocalDB" TEST_ -e - - name: Populate Databases.yaml - shell: bash - run: | - cat > ./Tools/rdmp/Databases.yaml << EOF - CatalogueConnectionString: Server=(localdb)\MSSQLLocalDB;Database=TEST_Catalogue;Trusted_Connection=True;TrustServerCertificate=true; - DataExportConnectionString: Server=(localdb)\MSSQLLocalDB;Database=TEST_DataExport;Trusted_Connection=True;TrustServerCertificate=true; - EOF - - name: Run integration test scripts - run: | - dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/create_list_destroy_catalogue.yaml - dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/create_cohort.yaml - dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/create_dataload.yaml - dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/orphan_extractable_column.yaml - - name: Test (DB) - shell: bash - run: | - rm -rf coverage - dotnet test Rdmp.UI.Tests/Rdmp.UI.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov - mv `find coverage -type f` db-ui.lcov - dotnet test Rdmp.Core.Tests/Rdmp.Core.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov - mv `find coverage -type f` db-core.lcov - - name: Test with local file system - shell: bash - run: | - echo "UseFileSystemRepo: true" >> Tests.Common/TestDatabases.txt - dotnet test Rdmp.UI.Tests/Rdmp.UI.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov - mv `find coverage -type f` fs-ui.lcov - dotnet test Rdmp.Core.Tests/Rdmp.Core.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov - mv `find coverage -type f` fs-core.lcov - - name: Merge LCovs - run: lcov-result-merger "{db,fs}-{ui,core}.lcov" all.lcov - - name: Coveralls - uses: coverallsapp/github-action@master - with: - github-token: ${{ secrets.github_token }} - path-to-lcov: all.lcov - flag-name: unit tests + # - name: Populate Databases.yaml + # shell: bash + # run: | + # cat > ./Tools/rdmp/Databases.yaml << EOF + # CatalogueConnectionString: Server=(localdb)\MSSQLLocalDB;Database=TEST_Catalogue;Trusted_Connection=True;TrustServerCertificate=true; + # DataExportConnectionString: Server=(localdb)\MSSQLLocalDB;Database=TEST_DataExport;Trusted_Connection=True;TrustServerCertificate=true; + # EOF + # - name: Run integration test scripts + # run: | + # dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/create_list_destroy_catalogue.yaml + # dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/create_cohort.yaml + # dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/create_dataload.yaml + # dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/orphan_extractable_column.yaml + # - name: Test (DB) + # shell: bash + # run: | + # rm -rf coverage + # dotnet test Rdmp.UI.Tests/Rdmp.UI.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov + # mv `find coverage -type f` db-ui.lcov + # dotnet test Rdmp.Core.Tests/Rdmp.Core.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov + # mv `find coverage -type f` db-core.lcov + # - name: Test with local file system + # shell: bash + # run: | + # echo "UseFileSystemRepo: true" >> Tests.Common/TestDatabases.txt + # dotnet test Rdmp.UI.Tests/Rdmp.UI.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov + # mv `find coverage -type f` fs-ui.lcov + # dotnet test Rdmp.Core.Tests/Rdmp.Core.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov + # mv `find coverage -type f` fs-core.lcov + # - name: Merge LCovs + # run: lcov-result-merger "{db,fs}-{ui,core}.lcov" all.lcov + # - name: Coveralls + # uses: coverallsapp/github-action@master + # with: + # github-token: ${{ secrets.github_token }} + # path-to-lcov: all.lcov + # flag-name: unit tests - name: Package run: | @@ -125,7 +125,7 @@ jobs: for plugin in https://api.github.com/repos/SMI/RdmpDicom/releases/latest do PluginName="$(cut -d/ -f6 <<< $plugin)" - curl -s $plugin | grep "$pluginName.*nupkg" | cut -d : -f 2,3 | tr -d \" | sed -n '2 p' | xargs wget + curl -s $plugin | grep "$pluginName.*nupkg" | cut -d : -f 2,3 | tr -d \" | sed -n '2 p' | xargs curl -O for platform in PublishWindows PublishLinux do cp *.nupkg $platform From 1ffd5137228338a7db3f1159d0b546faf6fbfe5e Mon Sep 17 00:00:00 2001 From: James Friel Date: Fri, 10 Nov 2023 11:40:20 +0000 Subject: [PATCH 04/85] add to bundle --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 19f52172ee..06cdb36ec1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -126,7 +126,7 @@ jobs: do PluginName="$(cut -d/ -f6 <<< $plugin)" curl -s $plugin | grep "$pluginName.*nupkg" | cut -d : -f 2,3 | tr -d \" | sed -n '2 p' | xargs curl -O - for platform in PublishWindows PublishLinux + for platform in PublishWindows PublishLinux PublishWinForms do cp *.nupkg $platform done @@ -144,11 +144,11 @@ jobs: mkdir -p dist cmd /c wix\\build.cmd ${{ steps.version.outputs.rdmpversion }} echo '"'$signtool'"' 'Sign /f GitHubActionsWorkflow.pfx /fd sha256 /tr http://timestamp.digicert.com /td sha256 /p ${{ secrets.DIGICERT_PASSWORD }} dist/rdmp.msi' | cmd - (cd PublishWindows ; echo 7z a -mx=9 ../dist/rdmp-${{ steps.version.outputs.rdmpversion }}-cli-win-x64.zip rdmp.exe NLog.config *.yaml | cmd) + (cd PublishWindows ; echo 7z a -mx=9 ../dist/rdmp-${{ steps.version.outputs.rdmpversion }}-cli-win-x64.zip rdmp.exe NLog.config *.yaml *.nupkg | cmd) (cd PublishLinux ; echo 7z a -mx=0 ../dist/rdmp-${{ steps.version.outputs.rdmpversion }}-cli-linux-x64.zip . | cmd) mv PublishLinux rdmp-${{ steps.version.outputs.rdmpversion }}-cli-linux echo 7z a dist/rdmp-${{ steps.version.outputs.rdmpversion }}-cli-linux-x64.tar rdmp-${{ steps.version.outputs.rdmpversion }}-cli-linux | cmd - (cd PublishWinForms ; echo 7z a -mx=9 ../dist/rdmp-${{ steps.version.outputs.rdmpversion }}-client.zip ResearchDataManagementPlatform.exe | cmd) + (cd PublishWinForms ; echo 7z a -mx=9 ../dist/rdmp-${{ steps.version.outputs.rdmpversion }}-client.zip ResearchDataManagementPlatform.exe *.nupkg | cmd) - name: Install Perl dependencies uses: shogo82148/actions-setup-perl@v1.24.2 From 885f6ba4cf977563ede339dae2f2a9e57bc4e2b9 Mon Sep 17 00:00:00 2001 From: James Friel Date: Mon, 13 Nov 2023 12:39:30 +0000 Subject: [PATCH 05/85] add dataset creation --- .../CommandExecution/AtomicCommandFactory.cs | 4 +- .../ExecuteCommandCreateDataset.cs | 32 ++++++++++++++ Rdmp.Core/Curation/Data/Dataset.cs | 44 +++++++++++++++++++ Rdmp.Core/Curation/Data/IDataset.cs | 19 ++++++++ .../up/077_AddDataSetMapping.sql | 26 +++++++++++ Rdmp.Core/Rdmp.Core.csproj | 10 +++-- 6 files changed, 130 insertions(+), 5 deletions(-) create mode 100644 Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs create mode 100644 Rdmp.Core/Curation/Data/Dataset.cs create mode 100644 Rdmp.Core/Curation/Data/IDataset.cs create mode 100644 Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql diff --git a/Rdmp.Core/CommandExecution/AtomicCommandFactory.cs b/Rdmp.Core/CommandExecution/AtomicCommandFactory.cs index 86fb978081..25aa05e945 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommandFactory.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommandFactory.cs @@ -104,7 +104,6 @@ public IEnumerable CreateCommands(object o) OverrideCommandName = "Catalogue SQL/Data", SuggestedCategory = View }; - yield return new ExecuteCommandAddNewCatalogueItem(_activator, c) { Weight = -99.9f, SuggestedCategory = Add, OverrideCommandName = "New Catalogue Item" }; yield return new ExecuteCommandAddNewAggregateGraph(_activator, c) @@ -475,6 +474,8 @@ public IEnumerable CreateCommands(object o) yield return new ExecuteCommandCreateHoldoutLookup(_activator, cic) { Weight = -50.5f }; + yield return new ExecuteCommandCreateDataset(_activator, "test1");//this is in the wrong place + var clone = new ExecuteCommandCloneCohortIdentificationConfiguration(_activator) { Weight = -50.4f, OverrideCommandName = "Clone" }.SetTarget(cic); if (pcic != null) clone.SetTarget((DatabaseEntity)pcic.Project); @@ -566,6 +567,7 @@ public IEnumerable CreateCommands(object o) if (Is(o, out AllPluginsNode _)) { + yield return new ExecuteCommandAddPlugins(_activator); yield return new ExecuteCommandAddPlugins(_activator); yield return new ExecuteCommandPrunePlugin(_activator); yield return new ExecuteCommandExportPlugins(_activator); diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs new file mode 100644 index 0000000000..194196e7bd --- /dev/null +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs @@ -0,0 +1,32 @@ +using NPOI.OpenXmlFormats.Spreadsheet; +using Rdmp.Core.Curation.Data; +using Rdmp.Core.Repositories.Construction; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Rdmp.Core.CommandExecution.AtomicCommands; + + public class ExecuteCommandCreateDataset :BasicCommandExecution + { + + + private string _doi; + private string _name; + private IBasicActivateItems _activator; + public ExecuteCommandCreateDataset(IBasicActivateItems activator, string name, string doi = null): base(activator) { + _activator = activator; + _name = name; + _doi = doi; + } + + + public override void Execute() + { + base.Execute(); + var dataset = new Dataset(BasicActivator.RepositoryLocator.CatalogueRepository, _name){ DigitalObjectIdentifier = _doi}; + dataset.SaveToDatabase(); + } +} \ No newline at end of file diff --git a/Rdmp.Core/Curation/Data/Dataset.cs b/Rdmp.Core/Curation/Data/Dataset.cs new file mode 100644 index 0000000000..9bdfcfdd94 --- /dev/null +++ b/Rdmp.Core/Curation/Data/Dataset.cs @@ -0,0 +1,44 @@ +using Rdmp.Core.MapsDirectlyToDatabaseTable.Attributes; +using Rdmp.Core.Repositories; +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Rdmp.Core.Curation.Data; +public class Dataset : DatabaseEntity, IDataset +{ + string _name; + string _digitalObjectIdentifier; + + [Unique] + public string Name + { + get => _name; + set => SetField(ref _name, value); + } + + [Unique] + public string DigitalObjectIdentifier + { + get => _digitalObjectIdentifier; + set => SetField(ref _digitalObjectIdentifier, value); + } + + public Dataset(ICatalogueRepository catalogueRepository, string name) + { + catalogueRepository.InsertAndHydrate(this, new Dictionary + { + {"Name", name } + }); + } + internal Dataset(ICatalogueRepository repository, DbDataReader r) + : base(repository, r) + { + Name = r["Name"].ToString(); + if (r["DigitalObjectIdentifier"] != DBNull.Value) + DigitalObjectIdentifier = r["DigitalObjectIdentifier"].ToString(); + } +} \ No newline at end of file diff --git a/Rdmp.Core/Curation/Data/IDataset.cs b/Rdmp.Core/Curation/Data/IDataset.cs new file mode 100644 index 0000000000..178773ed94 --- /dev/null +++ b/Rdmp.Core/Curation/Data/IDataset.cs @@ -0,0 +1,19 @@ +using Rdmp.Core.Repositories; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Rdmp.Core.Curation.Data; + +public interface IDataset +{ + /// + /// Returns where the object exists (e.g. database) as or null if the object does not exist in a catalogue repository. + /// + ICatalogueRepository CatalogueRepository { get; } + + string Name { get; } + string DigitalObjectIdentifier { get; } +} diff --git a/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql b/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql new file mode 100644 index 0000000000..233c7a7efd --- /dev/null +++ b/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql @@ -0,0 +1,26 @@ +--Version:8.1.1 +--Description: Adds tables to model external datasets + GO +-- Create Dataset table +if not exists(select 1 from sys.columns where object_id = OBJECT_ID('Dataset')) +CREATE TABLE [dbo].Dataset( + [ID] [int] IDENTITY(1,1) NOT NULL, + [Name] [varchar](256) NOT NULL, + [DigitalObjectIdentifier] [varchar](256) NULL, CONSTRAINT [PK_Dataset] PRIMARY KEY CLUSTERED +( + [ID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] + +if not exists (select 1 from sys.columns where name = 'Dataset' AND object_id = OBJECT_ID('ColumnInfo')) +begin +ALTER TABLE [dbo].[ColumnInfo] ADD Dataset_ID [int] NULL +end +begin +ALTER TABLE [dbo].[ColumnInfo] WITH CHECK ADD CONSTRAINT [FK_Column_Info_Dataset] FOREIGN KEY([Dataset_ID]) +REFERENCES [dbo].[Dataset] ([ID]) +end + + +--ALTER TABLE [dbo].[ANOTable] WITH CHECK ADD CONSTRAINT [FK_ANOTable_ExternalDatabaseServer] FOREIGN KEY([Server_ID]) +--REFERENCES [dbo].[ExternalDatabaseServer] ([ID]) \ No newline at end of file diff --git a/Rdmp.Core/Rdmp.Core.csproj b/Rdmp.Core/Rdmp.Core.csproj index cb08344d3f..ebf286fa0b 100644 --- a/Rdmp.Core/Rdmp.Core.csproj +++ b/Rdmp.Core/Rdmp.Core.csproj @@ -118,8 +118,9 @@ - - + + + @@ -239,8 +240,9 @@ - - + + + From a13cba50d7bf8a0277356ceae4f530a51e72b673 Mon Sep 17 00:00:00 2001 From: James Friel Date: Mon, 13 Nov 2023 13:52:33 +0000 Subject: [PATCH 06/85] add linkage --- .../CommandExecution/AtomicCommandFactory.cs | 2 +- .../ExecuteCommandCreateDataset.cs | 13 +-- .../ExecuteCommandLinkColumnInfoToDataset.cs | 40 +++++++++ Rdmp.Core/Curation/Data/ColumnInfo.cs | 14 +++ Rdmp.Core/Curation/Data/Dataset.cs | 3 + .../ExecuteCommandLinkcolumnInfoToDataSet.cs | 89 +++++++++++++++++++ Rdmp.UI/Menus/ColumnInfoMenu.cs | 2 +- 7 files changed, 155 insertions(+), 8 deletions(-) create mode 100644 Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataset.cs create mode 100644 Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkcolumnInfoToDataSet.cs diff --git a/Rdmp.Core/CommandExecution/AtomicCommandFactory.cs b/Rdmp.Core/CommandExecution/AtomicCommandFactory.cs index 25aa05e945..8efee3ad8d 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommandFactory.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommandFactory.cs @@ -231,7 +231,7 @@ public IEnumerable CreateCommands(object o) if (Is(o, out CatalogueItem ci)) { yield return new ExecuteCommandCreateNewFilter(_activator, ci) { OverrideCommandName = "Add New Filter" }; - yield return new ExecuteCommandLinkCatalogueItemToColumnInfo(_activator, ci); + //yield return new ExecuteCommandLinkCatalogueItemToColumnInfo(_activator, ci); yield return new ExecuteCommandMakeCatalogueItemExtractable(_activator, ci); yield return new ExecuteCommandChangeExtractionCategory(_activator, new[] { ci.ExtractionInformation }); yield return new ExecuteCommandImportCatalogueItemDescription(_activator, ci) diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs index 194196e7bd..ed8b42772b 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs @@ -1,5 +1,7 @@ using NPOI.OpenXmlFormats.Spreadsheet; using Rdmp.Core.Curation.Data; +using Rdmp.Core.Curation.Data.Cohort; +using Rdmp.Core.MapsDirectlyToDatabaseTable; using Rdmp.Core.Repositories.Construction; using System; using System.Collections.Generic; @@ -9,15 +11,14 @@ namespace Rdmp.Core.CommandExecution.AtomicCommands; - public class ExecuteCommandCreateDataset :BasicCommandExecution - { +public class ExecuteCommandCreateDataset : BasicCommandExecution +{ private string _doi; private string _name; - private IBasicActivateItems _activator; - public ExecuteCommandCreateDataset(IBasicActivateItems activator, string name, string doi = null): base(activator) { - _activator = activator; + public ExecuteCommandCreateDataset(IBasicActivateItems activator, string name, string doi = null) : base(activator) + { _name = name; _doi = doi; } @@ -26,7 +27,7 @@ public ExecuteCommandCreateDataset(IBasicActivateItems activator, string name, s public override void Execute() { base.Execute(); - var dataset = new Dataset(BasicActivator.RepositoryLocator.CatalogueRepository, _name){ DigitalObjectIdentifier = _doi}; + var dataset = new Dataset(BasicActivator.RepositoryLocator.CatalogueRepository, _name) { DigitalObjectIdentifier = _doi }; dataset.SaveToDatabase(); } } \ No newline at end of file diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataset.cs new file mode 100644 index 0000000000..b7a2413793 --- /dev/null +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataset.cs @@ -0,0 +1,40 @@ + + + +using Rdmp.Core.Curation.Data; +using System.Linq; + +namespace Rdmp.Core.CommandExecution.AtomicCommands; + + +//There is not currently any way to run this via the CLI +public class ExecuteCommandLinkColumnInfoToDataset : BasicCommandExecution +{ + private ColumnInfo _columnInfo; + private Dataset _dataset; + private bool _linkAll; + public ExecuteCommandLinkColumnInfoToDataset(IBasicActivateItems activator, ColumnInfo columnInfo, Dataset dataset, bool linkAllOtherColumns = true) : base(activator) + { + _columnInfo = columnInfo; + _dataset = dataset; + _linkAll = linkAllOtherColumns; + } + + + public override void Execute() + { + base.Execute(); + _columnInfo.Dataset_ID = _dataset.ID; + _columnInfo.SaveToDatabase(); + if(_linkAll ) + { + var databaseName = _columnInfo.Name[.._columnInfo.Name.LastIndexOf('.')]; + var catalogueItems = _columnInfo.CatalogueRepository.GetAllObjects().Where( ci => ci.Name[..ci.Name.LastIndexOf(".")] == databaseName); + foreach (var ci in catalogueItems) + { + ci.Dataset_ID = _dataset.ID; + ci.SaveToDatabase(); + } + } + } +} \ No newline at end of file diff --git a/Rdmp.Core/Curation/Data/ColumnInfo.cs b/Rdmp.Core/Curation/Data/ColumnInfo.cs index 7012eca9ec..1be2af70b1 100644 --- a/Rdmp.Core/Curation/Data/ColumnInfo.cs +++ b/Rdmp.Core/Curation/Data/ColumnInfo.cs @@ -297,6 +297,18 @@ public ColumnInfo(ICatalogueRepository repository, string name, string type, ITa ClearAllInjections(); } + private int _datasetID; + /// + /// The ID of the dataset this column information came from + /// + [DoNotExtractProperty] + public int Dataset_ID + { + get => _datasetID; + set => SetField(ref _datasetID, value); + } + + internal ColumnInfo(ICatalogueRepository repository, DbDataReader r) : base(repository, r) { @@ -309,6 +321,8 @@ internal ColumnInfo(ICatalogueRepository repository, DbDataReader r) Description = r["Description"].ToString(); Collation = r["Collation"] as string; IgnoreInLoads = ObjectToNullableBool(r["IgnoreInLoads"]) ?? false; + if (r["Dataset_ID"] != DBNull.Value) + Dataset_ID = int.Parse(r["Dataset_ID"].ToString()); //try to turn string value in database into enum value if (Enum.TryParse(r["Status"].ToString(), out ColumnStatus dbStatus)) diff --git a/Rdmp.Core/Curation/Data/Dataset.cs b/Rdmp.Core/Curation/Data/Dataset.cs index 9bdfcfdd94..b61a33002a 100644 --- a/Rdmp.Core/Curation/Data/Dataset.cs +++ b/Rdmp.Core/Curation/Data/Dataset.cs @@ -27,6 +27,9 @@ public string DigitalObjectIdentifier set => SetField(ref _digitalObjectIdentifier, value); } + public override string ToString() => Name; + + public Dataset(ICatalogueRepository catalogueRepository, string name) { catalogueRepository.InsertAndHydrate(this, new Dictionary diff --git a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkcolumnInfoToDataSet.cs b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkcolumnInfoToDataSet.cs new file mode 100644 index 0000000000..fd35763871 --- /dev/null +++ b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkcolumnInfoToDataSet.cs @@ -0,0 +1,89 @@ +// Copyright (c) The University of Dundee 2018-2019 +// This file is part of the Research Data Management Platform (RDMP). +// RDMP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. +// RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with RDMP. If not, see . + +using System; +using System.Collections.Generic; +using System.Linq; +using Rdmp.Core.CommandExecution; +using Rdmp.Core.CommandExecution.AtomicCommands; +using Rdmp.Core.Curation.Data; +using Rdmp.Core.Curation.Data.Cohort; +using Rdmp.Core.Icons.IconProvision; +using Rdmp.Core.ReusableLibraryCode.Icons.IconProvision; +using Rdmp.UI.ExtractionUIs.JoinsAndLookups; +using Rdmp.UI.ItemActivation; +using Rdmp.UI.SimpleDialogs; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; + +namespace Rdmp.UI.CommandExecution.AtomicCommands; + +public class ExecuteCommandLinkColumnInfoToDataSet : BasicUICommandExecution, IAtomicCommand +{ + private readonly ColumnInfo _columnInfo; + private Dataset _selectedDataset; + private IActivateItems _activateItems; + + public ExecuteCommandLinkColumnInfoToDataSet(IActivateItems activator, ColumnInfo columnInfo) : base(activator) + { + _columnInfo = columnInfo; + _activateItems = activator; + } + + public override string GetCommandHelp() => + "TODO"; + + public override void Execute() + { + base.Execute(); + Dataset[] datasets = _activateItems.RepositoryLocator.CatalogueRepository.GetAllObjects(); + DialogArgs da = new() + { + WindowTitle = "Link a dataset with this column", + TaskDescription = + "Select the Dataset that this column information came from" + }; + _selectedDataset = SelectOne(da, datasets); + var backfill = YesNo("Link all other columns that match the source table?","Do you want to link this dataset to all other columns that reference the same table as this column?"); + var cmd = new ExecuteCommandLinkColumnInfoToDataset(_activateItems,_columnInfo, _selectedDataset,backfill); + cmd.Execute(); + + + //var cic = _cic ?? (CohortIdentificationConfiguration)BasicActivator.SelectOne("Select Cohort Builder Query", + // BasicActivator.GetAll().ToArray()); + + //var cata = _catalogueIfKnown; + //if (cata == null) + // try + // { + // //make sure they really wanted to do this? + // if (YesNo(GetLookupConfirmationText(), "Create Lookup")) + // { + // //get them to pick a Catalogue the table provides descriptions for + // if (!SelectOne(_lookupTableInfoIfKnown.Repository, out cata)) + // return; + // } + // else + // { + // return; + // } + // } + // catch (Exception exception) + // { + // ExceptionViewer.Show("Error creating Lookup", exception); + // return; + // } + + ////they now deifnetly have a Catalogue! + //var t = Activator.Activate(cata); + + //if (_lookupTableInfoIfKnown != null) + // t.SetLookupTableInfo(_lookupTableInfoIfKnown); + } + + //public override Image GetImage(IIconProvider iconProvider) => + // iconProvider.GetImage(RDMPConcept.Lookup, OverlayKind.Add); +} \ No newline at end of file diff --git a/Rdmp.UI/Menus/ColumnInfoMenu.cs b/Rdmp.UI/Menus/ColumnInfoMenu.cs index 1ff63f0a64..8032af8e80 100644 --- a/Rdmp.UI/Menus/ColumnInfoMenu.cs +++ b/Rdmp.UI/Menus/ColumnInfoMenu.cs @@ -16,7 +16,7 @@ internal sealed class ColumnInfoMenu : RDMPContextMenuStrip public ColumnInfoMenu(RDMPContextMenuStripArgs args, ColumnInfo columnInfo) : base(args, columnInfo) { Add(new ExecuteCommandAddNewLookupTableRelationship(_activator, null, columnInfo.TableInfo)); - + Add(new ExecuteCommandLinkColumnInfoToDataSet(_activator, columnInfo)); Items.Add(new ToolStripSeparator()); Add(new ExecuteCommandAddJoinInfo(_activator, columnInfo.TableInfo)); From fd78d7436bd65c56a883f4d7fe55468872cb648e Mon Sep 17 00:00:00 2001 From: James Friel Date: Mon, 13 Nov 2023 15:14:24 +0000 Subject: [PATCH 07/85] add nav button --- .../TopBar/RDMPTaskBarUI.Designer.cs | 320 +++--- .../WindowManagement/TopBar/RDMPTaskBarUI.cs | 14 +- .../TopBar/RDMPTaskBarUI.resx | 155 ++- .../WindowManagement/WindowManager.cs | 6 + Rdmp.Core/RDMPCollection.cs | 3 +- Rdmp.UI/SimpleDialogs/SelectDialog`1.resx | 982 ------------------ 6 files changed, 288 insertions(+), 1192 deletions(-) delete mode 100644 Rdmp.UI/SimpleDialogs/SelectDialog`1.resx diff --git a/Application/ResearchDataManagementPlatform/WindowManagement/TopBar/RDMPTaskBarUI.Designer.cs b/Application/ResearchDataManagementPlatform/WindowManagement/TopBar/RDMPTaskBarUI.Designer.cs index a9789d8c89..5548b83c3c 100644 --- a/Application/ResearchDataManagementPlatform/WindowManagement/TopBar/RDMPTaskBarUI.Designer.cs +++ b/Application/ResearchDataManagementPlatform/WindowManagement/TopBar/RDMPTaskBarUI.Designer.cs @@ -31,235 +31,224 @@ protected override void Dispose(bool disposing) private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(RDMPTaskBarUI)); - this.btnHome = new System.Windows.Forms.ToolStripButton(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.btnCatalogues = new System.Windows.Forms.ToolStripButton(); - this.btnCohorts = new System.Windows.Forms.ToolStripButton(); - this.btnDataExport = new System.Windows.Forms.ToolStripButton(); - this.btnTables = new System.Windows.Forms.ToolStripButton(); - this.btnLoad = new System.Windows.Forms.ToolStripButton(); - this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripSeparator = new System.Windows.Forms.ToolStripSeparator(); - this.toolStrip1 = new System.Windows.Forms.ToolStrip(); - this.btnBack = new System.Windows.Forms.ToolStripSplitButton(); - this.btnForward = new System.Windows.Forms.ToolStripButton(); - this.btnFavourites = new System.Windows.Forms.ToolStripButton(); - this.btnSavedCohorts = new System.Windows.Forms.ToolStripButton(); - this.toolStripLabel2 = new System.Windows.Forms.ToolStripLabel(); - this.cbxLayouts = new System.Windows.Forms.ToolStripComboBox(); - this.btnSaveWindowLayout = new System.Windows.Forms.ToolStripButton(); - this.btnDeleteLayout = new System.Windows.Forms.ToolStripButton(); - this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); - this.cbCommits = new System.Windows.Forms.ToolStripButton(); - this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStrip1.SuspendLayout(); - this.SuspendLayout(); + btnHome = new System.Windows.Forms.ToolStripButton(); + toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + btnCatalogues = new System.Windows.Forms.ToolStripButton(); + btnCohorts = new System.Windows.Forms.ToolStripButton(); + btnDataExport = new System.Windows.Forms.ToolStripButton(); + btnTables = new System.Windows.Forms.ToolStripButton(); + btnDataSets = new System.Windows.Forms.ToolStripButton(); + toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + toolStripSeparator = new System.Windows.Forms.ToolStripSeparator(); + toolStrip1 = new System.Windows.Forms.ToolStrip(); + btnBack = new System.Windows.Forms.ToolStripSplitButton(); + btnForward = new System.Windows.Forms.ToolStripButton(); + btnFavourites = new System.Windows.Forms.ToolStripButton(); + btnSavedCohorts = new System.Windows.Forms.ToolStripButton(); + btnLoads = new System.Windows.Forms.ToolStripButton(); + toolStripLabel2 = new System.Windows.Forms.ToolStripLabel(); + cbxLayouts = new System.Windows.Forms.ToolStripComboBox(); + btnSaveWindowLayout = new System.Windows.Forms.ToolStripButton(); + btnDeleteLayout = new System.Windows.Forms.ToolStripButton(); + toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + cbCommits = new System.Windows.Forms.ToolStripButton(); + toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + toolStrip1.SuspendLayout(); + SuspendLayout(); // // btnHome // - this.btnHome.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnHome.Name = "btnHome"; - this.btnHome.Size = new System.Drawing.Size(44, 22); - this.btnHome.Text = "Home"; - this.btnHome.Click += new System.EventHandler(this.btnHome_Click); + btnHome.ImageTransparentColor = System.Drawing.Color.Magenta; + btnHome.Name = "btnHome"; + btnHome.Size = new System.Drawing.Size(44, 22); + btnHome.Text = "Home"; + btnHome.Click += btnHome_Click; // // toolStripSeparator1 // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25); + toolStripSeparator1.Name = "toolStripSeparator1"; + toolStripSeparator1.Size = new System.Drawing.Size(6, 25); // // btnCatalogues // - this.btnCatalogues.Image = ((System.Drawing.Image)(resources.GetObject("btnCatalogues.Image"))); - this.btnCatalogues.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnCatalogues.Name = "btnCatalogues"; - this.btnCatalogues.Size = new System.Drawing.Size(86, 22); - this.btnCatalogues.Text = "Catalogues"; - this.btnCatalogues.Click += new System.EventHandler(this.ToolboxButtonClicked); + btnCatalogues.Image = (System.Drawing.Image)resources.GetObject("btnCatalogues.Image"); + btnCatalogues.ImageTransparentColor = System.Drawing.Color.Magenta; + btnCatalogues.Name = "btnCatalogues"; + btnCatalogues.Size = new System.Drawing.Size(86, 22); + btnCatalogues.Text = "Catalogues"; + btnCatalogues.Click += ToolboxButtonClicked; // // btnCohorts // - this.btnCohorts.Image = ((System.Drawing.Image)(resources.GetObject("btnCohorts.Image"))); - this.btnCohorts.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnCohorts.Name = "btnCohorts"; - this.btnCohorts.Size = new System.Drawing.Size(104, 22); - this.btnCohorts.Text = "Cohort Builder"; - this.btnCohorts.Click += new System.EventHandler(this.ToolboxButtonClicked); + btnCohorts.Image = (System.Drawing.Image)resources.GetObject("btnCohorts.Image"); + btnCohorts.ImageTransparentColor = System.Drawing.Color.Magenta; + btnCohorts.Name = "btnCohorts"; + btnCohorts.Size = new System.Drawing.Size(104, 22); + btnCohorts.Text = "Cohort Builder"; + btnCohorts.Click += ToolboxButtonClicked; // // btnDataExport // - this.btnDataExport.Image = ((System.Drawing.Image)(resources.GetObject("btnDataExport.Image"))); - this.btnDataExport.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnDataExport.Name = "btnDataExport"; - this.btnDataExport.Size = new System.Drawing.Size(69, 22); - this.btnDataExport.Text = "Projects"; - this.btnDataExport.Click += new System.EventHandler(this.ToolboxButtonClicked); + btnDataExport.Image = (System.Drawing.Image)resources.GetObject("btnDataExport.Image"); + btnDataExport.ImageTransparentColor = System.Drawing.Color.Magenta; + btnDataExport.Name = "btnDataExport"; + btnDataExport.Size = new System.Drawing.Size(69, 22); + btnDataExport.Text = "Projects"; + btnDataExport.Click += ToolboxButtonClicked; // // btnTables // - this.btnTables.Image = ((System.Drawing.Image)(resources.GetObject("btnTables.Image"))); - this.btnTables.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnTables.Name = "btnTables"; - this.btnTables.Size = new System.Drawing.Size(123, 22); - this.btnTables.Text = "Tables (Advanced)"; - this.btnTables.Click += new System.EventHandler(this.ToolboxButtonClicked); + btnTables.Image = (System.Drawing.Image)resources.GetObject("btnTables.Image"); + btnTables.ImageTransparentColor = System.Drawing.Color.Magenta; + btnTables.Name = "btnTables"; + btnTables.Size = new System.Drawing.Size(123, 22); + btnTables.Text = "Tables (Advanced)"; + btnTables.Click += ToolboxButtonClicked; // - // btnLoad + // btnDataSets // - this.btnLoad.Image = ((System.Drawing.Image)(resources.GetObject("btnLoad.Image"))); - this.btnLoad.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnLoad.Name = "btnLoad"; - this.btnLoad.Size = new System.Drawing.Size(80, 22); - this.btnLoad.Text = "Data Load"; - this.btnLoad.Click += new System.EventHandler(this.ToolboxButtonClicked); + btnDataSets.Image = (System.Drawing.Image)resources.GetObject("btnDataSets.Image"); + btnDataSets.ImageTransparentColor = System.Drawing.Color.Magenta; + btnDataSets.Name = "btnDataSets"; + btnDataSets.Size = new System.Drawing.Size(71, 22); + btnDataSets.Text = "Datasets"; + btnDataSets.Click += ToolboxButtonClicked; // // toolStripSeparator2 // - this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25); + toolStripSeparator2.Name = "toolStripSeparator2"; + toolStripSeparator2.Size = new System.Drawing.Size(6, 25); // // toolStripSeparator // - this.toolStripSeparator.Name = "toolStripSeparator"; - this.toolStripSeparator.Size = new System.Drawing.Size(6, 25); + toolStripSeparator.Name = "toolStripSeparator"; + toolStripSeparator.Size = new System.Drawing.Size(6, 25); // // toolStrip1 // - this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.btnBack, - this.btnForward, - this.btnHome, - this.toolStripSeparator1, - this.btnFavourites, - this.btnCatalogues, - this.btnCohorts, - this.btnSavedCohorts, - this.btnDataExport, - this.toolStripSeparator, - this.btnTables, - this.btnLoad, - this.toolStripSeparator2, - this.toolStripLabel2, - this.cbxLayouts, - this.btnSaveWindowLayout, - this.btnDeleteLayout, - this.toolStripSeparator4, - this.cbCommits, - this.toolStripSeparator3}); - this.toolStrip1.Location = new System.Drawing.Point(0, 0); - this.toolStrip1.Name = "toolStrip1"; - this.toolStrip1.Size = new System.Drawing.Size(1539, 25); - this.toolStrip1.TabIndex = 0; - this.toolStrip1.Text = "toolStrip1"; + toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { btnBack, btnForward, btnHome, toolStripSeparator1, btnFavourites, btnCatalogues, btnCohorts, btnSavedCohorts, btnDataExport, toolStripSeparator, btnTables, btnLoads, btnDataSets, toolStripSeparator2, toolStripLabel2, cbxLayouts, btnSaveWindowLayout, btnDeleteLayout, toolStripSeparator4, cbCommits, toolStripSeparator3 }); + toolStrip1.Location = new System.Drawing.Point(0, 0); + toolStrip1.Name = "toolStrip1"; + toolStrip1.Size = new System.Drawing.Size(1539, 25); + toolStrip1.TabIndex = 0; + toolStrip1.Text = "toolStrip1"; // // btnBack // - this.btnBack.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.btnBack.Enabled = false; - this.btnBack.Image = ((System.Drawing.Image)(resources.GetObject("btnBack.Image"))); - this.btnBack.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnBack.Name = "btnBack"; - this.btnBack.Size = new System.Drawing.Size(32, 22); - this.btnBack.Text = "Back"; - this.btnBack.ButtonClick += new System.EventHandler(this.btnBack_ButtonClick); - this.btnBack.DropDownOpening += new System.EventHandler(this.btnBack_DropDownOpening); + btnBack.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + btnBack.Enabled = false; + btnBack.Image = (System.Drawing.Image)resources.GetObject("btnBack.Image"); + btnBack.ImageTransparentColor = System.Drawing.Color.Magenta; + btnBack.Name = "btnBack"; + btnBack.Size = new System.Drawing.Size(32, 22); + btnBack.Text = "Back"; + btnBack.ButtonClick += btnBack_ButtonClick; + btnBack.DropDownOpening += btnBack_DropDownOpening; // // btnForward // - this.btnForward.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.btnForward.Enabled = false; - this.btnForward.Image = ((System.Drawing.Image)(resources.GetObject("btnForward.Image"))); - this.btnForward.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnForward.Name = "btnForward"; - this.btnForward.Size = new System.Drawing.Size(23, 22); - this.btnForward.Text = "Forward"; - this.btnForward.Click += new System.EventHandler(this.btnForward_Click); + btnForward.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + btnForward.Enabled = false; + btnForward.Image = (System.Drawing.Image)resources.GetObject("btnForward.Image"); + btnForward.ImageTransparentColor = System.Drawing.Color.Magenta; + btnForward.Name = "btnForward"; + btnForward.Size = new System.Drawing.Size(23, 22); + btnForward.Text = "Forward"; + btnForward.Click += btnForward_Click; // // btnFavourites // - this.btnFavourites.Image = ((System.Drawing.Image)(resources.GetObject("btnFavourites.Image"))); - this.btnFavourites.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnFavourites.Name = "btnFavourites"; - this.btnFavourites.Size = new System.Drawing.Size(81, 22); - this.btnFavourites.Text = "Favourites"; - this.btnFavourites.Click += new System.EventHandler(this.ToolboxButtonClicked); + btnFavourites.Image = (System.Drawing.Image)resources.GetObject("btnFavourites.Image"); + btnFavourites.ImageTransparentColor = System.Drawing.Color.Magenta; + btnFavourites.Name = "btnFavourites"; + btnFavourites.Size = new System.Drawing.Size(81, 22); + btnFavourites.Text = "Favourites"; + btnFavourites.Click += ToolboxButtonClicked; // // btnSavedCohorts // - this.btnSavedCohorts.Image = ((System.Drawing.Image)(resources.GetObject("btnSavedCohorts.Image"))); - this.btnSavedCohorts.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnSavedCohorts.Name = "btnSavedCohorts"; - this.btnSavedCohorts.Size = new System.Drawing.Size(103, 22); - this.btnSavedCohorts.Text = "Saved Cohorts"; - this.btnSavedCohorts.Click += new System.EventHandler(this.ToolboxButtonClicked); + btnSavedCohorts.Image = (System.Drawing.Image)resources.GetObject("btnSavedCohorts.Image"); + btnSavedCohorts.ImageTransparentColor = System.Drawing.Color.Magenta; + btnSavedCohorts.Name = "btnSavedCohorts"; + btnSavedCohorts.Size = new System.Drawing.Size(103, 22); + btnSavedCohorts.Text = "Saved Cohorts"; + btnSavedCohorts.Click += ToolboxButtonClicked; + // + // btnLoads + // + btnLoads.Image = (System.Drawing.Image)resources.GetObject("btnLoads.Image"); + btnLoads.ImageTransparentColor = System.Drawing.Color.Magenta; + btnLoads.Name = "btnLoads"; + btnLoads.Size = new System.Drawing.Size(80, 22); + btnLoads.Text = "Data Load"; + btnLoads.Click += ToolboxButtonClicked; // // toolStripLabel2 // - this.toolStripLabel2.Name = "toolStripLabel2"; - this.toolStripLabel2.Size = new System.Drawing.Size(43, 22); - this.toolStripLabel2.Text = "Layout"; + toolStripLabel2.Name = "toolStripLabel2"; + toolStripLabel2.Size = new System.Drawing.Size(43, 22); + toolStripLabel2.Text = "Layout"; // // cbxLayouts // - this.cbxLayouts.Name = "cbxLayouts"; - this.cbxLayouts.Size = new System.Drawing.Size(174, 25); - this.cbxLayouts.DropDownClosed += new System.EventHandler(this.cbx_DropDownClosed); - this.cbxLayouts.SelectedIndexChanged += new System.EventHandler(this.cbx_SelectedIndexChanged); + cbxLayouts.Name = "cbxLayouts"; + cbxLayouts.Size = new System.Drawing.Size(174, 25); + cbxLayouts.DropDownClosed += cbx_DropDownClosed; + cbxLayouts.SelectedIndexChanged += cbx_SelectedIndexChanged; // // btnSaveWindowLayout // - this.btnSaveWindowLayout.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.btnSaveWindowLayout.Enabled = false; - this.btnSaveWindowLayout.Image = ((System.Drawing.Image)(resources.GetObject("btnSaveWindowLayout.Image"))); - this.btnSaveWindowLayout.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnSaveWindowLayout.Name = "btnSaveWindowLayout"; - this.btnSaveWindowLayout.Size = new System.Drawing.Size(23, 22); - this.btnSaveWindowLayout.Text = "Save Window Layout"; - this.btnSaveWindowLayout.Click += new System.EventHandler(this.btnSaveWindowLayout_Click); + btnSaveWindowLayout.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + btnSaveWindowLayout.Enabled = false; + btnSaveWindowLayout.Image = (System.Drawing.Image)resources.GetObject("btnSaveWindowLayout.Image"); + btnSaveWindowLayout.ImageTransparentColor = System.Drawing.Color.Magenta; + btnSaveWindowLayout.Name = "btnSaveWindowLayout"; + btnSaveWindowLayout.Size = new System.Drawing.Size(23, 22); + btnSaveWindowLayout.Text = "Save Window Layout"; + btnSaveWindowLayout.Click += btnSaveWindowLayout_Click; // // btnDeleteLayout // - this.btnDeleteLayout.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.btnDeleteLayout.Enabled = false; - this.btnDeleteLayout.Image = ((System.Drawing.Image)(resources.GetObject("btnDeleteLayout.Image"))); - this.btnDeleteLayout.ImageTransparentColor = System.Drawing.Color.Magenta; - this.btnDeleteLayout.Name = "btnDeleteLayout"; - this.btnDeleteLayout.Size = new System.Drawing.Size(23, 22); - this.btnDeleteLayout.Text = "Delete Layout"; - this.btnDeleteLayout.Click += new System.EventHandler(this.btnDelete_Click); + btnDeleteLayout.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + btnDeleteLayout.Enabled = false; + btnDeleteLayout.Image = (System.Drawing.Image)resources.GetObject("btnDeleteLayout.Image"); + btnDeleteLayout.ImageTransparentColor = System.Drawing.Color.Magenta; + btnDeleteLayout.Name = "btnDeleteLayout"; + btnDeleteLayout.Size = new System.Drawing.Size(23, 22); + btnDeleteLayout.Text = "Delete Layout"; + btnDeleteLayout.Click += btnDelete_Click; // // toolStripSeparator4 // - this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(6, 25); + toolStripSeparator4.Name = "toolStripSeparator4"; + toolStripSeparator4.Size = new System.Drawing.Size(6, 25); // // cbCommits // - this.cbCommits.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.cbCommits.Image = ((System.Drawing.Image)(resources.GetObject("cbCommits.Image"))); - this.cbCommits.ImageTransparentColor = System.Drawing.Color.Magenta; - this.cbCommits.Name = "cbCommits"; - this.cbCommits.Size = new System.Drawing.Size(23, 22); - this.cbCommits.Text = "Use Commits"; + cbCommits.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + cbCommits.Image = (System.Drawing.Image)resources.GetObject("cbCommits.Image"); + cbCommits.ImageTransparentColor = System.Drawing.Color.Magenta; + cbCommits.Name = "cbCommits"; + cbCommits.Size = new System.Drawing.Size(23, 22); + cbCommits.Text = "Use Commits"; // // toolStripSeparator3 // - this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(6, 25); + toolStripSeparator3.Name = "toolStripSeparator3"; + toolStripSeparator3.Size = new System.Drawing.Size(6, 25); // // RDMPTaskBarUI // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.toolStrip1); - this.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); - this.Name = "RDMPTaskBarUI"; - this.Size = new System.Drawing.Size(1539, 29); - this.toolStrip1.ResumeLayout(false); - this.toolStrip1.PerformLayout(); - this.ResumeLayout(false); - this.PerformLayout(); - + AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + Controls.Add(toolStrip1); + Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + Name = "RDMPTaskBarUI"; + Size = new System.Drawing.Size(1539, 29); + toolStrip1.ResumeLayout(false); + toolStrip1.PerformLayout(); + ResumeLayout(false); + PerformLayout(); } #endregion @@ -270,7 +259,7 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripButton btnCohorts; private System.Windows.Forms.ToolStripButton btnDataExport; private System.Windows.Forms.ToolStripButton btnTables; - private System.Windows.Forms.ToolStripButton btnLoad; + private System.Windows.Forms.ToolStripButton btnDataSets; private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; private System.Windows.Forms.ToolStripSeparator toolStripSeparator; private System.Windows.Forms.ToolStrip toolStrip1; @@ -285,5 +274,6 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; private System.Windows.Forms.ToolStripButton cbCommits; private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripButton btnLoads; } } diff --git a/Application/ResearchDataManagementPlatform/WindowManagement/TopBar/RDMPTaskBarUI.cs b/Application/ResearchDataManagementPlatform/WindowManagement/TopBar/RDMPTaskBarUI.cs index 6639022c8a..d82920d536 100644 --- a/Application/ResearchDataManagementPlatform/WindowManagement/TopBar/RDMPTaskBarUI.cs +++ b/Application/ResearchDataManagementPlatform/WindowManagement/TopBar/RDMPTaskBarUI.cs @@ -51,8 +51,11 @@ public RDMPTaskBarUI() btnTables.Image = CatalogueIcons.TableInfo.ImageToBitmap(); btnTables.BackgroundImage = BackColorProvider.GetBackgroundImage(btnTables.Size, RDMPCollection.Tables); - btnLoad.Image = CatalogueIcons.LoadMetadata.ImageToBitmap(); - btnLoad.BackgroundImage = BackColorProvider.GetBackgroundImage(btnLoad.Size, RDMPCollection.DataLoad); + btnDataSets.Image = CatalogueIcons.LoadMetadata.ImageToBitmap(); + btnDataSets.BackgroundImage = BackColorProvider.GetBackgroundImage(btnDataSets.Size, RDMPCollection.DataLoad); + + btnLoads.Image = CatalogueIcons.LoadMetadata.ImageToBitmap(); + btnLoads.BackgroundImage = BackColorProvider.GetBackgroundImage(btnDataSets.Size, RDMPCollection.DataLoad); btnFavourites.Image = CatalogueIcons.Favourite.ImageToBitmap(); btnDeleteLayout.Image = FamFamFamIcons.delete.ImageToBitmap(); @@ -106,8 +109,9 @@ private void SetupToolTipText() btnSavedCohorts.ToolTipText = "Finalised identifier lists, ready for linkage and extraction"; btnDataExport.ToolTipText = "Show Projects and Extractable Dataset Packages allowing data extraction"; btnTables.ToolTipText = "Advanced features e.g. logging, credentials, dashboards etc"; - btnLoad.ToolTipText = "Load configurations for reading data into your databases"; + btnLoads.ToolTipText = "Load configurations for reading data into your databases"; btnFavourites.ToolTipText = "Collection of all objects that you have favourited"; + btnDataSets.ToolTipText = "All external datasets that have been configured for use in RDMP"; } catch (Exception e) { @@ -180,12 +184,14 @@ private RDMPCollection ButtonToEnum(object button) collectionToToggle = RDMPCollection.DataExport; else if (button == btnTables) collectionToToggle = RDMPCollection.Tables; - else if (button == btnLoad) + else if (button == btnLoads) collectionToToggle = RDMPCollection.DataLoad; else if (button == btnSavedCohorts) collectionToToggle = RDMPCollection.SavedCohorts; else if (button == btnFavourites) collectionToToggle = RDMPCollection.Favourites; + else if (button == btnDataSets) + collectionToToggle = RDMPCollection.Datasets; else throw new ArgumentOutOfRangeException(nameof(button)); diff --git a/Application/ResearchDataManagementPlatform/WindowManagement/TopBar/RDMPTaskBarUI.resx b/Application/ResearchDataManagementPlatform/WindowManagement/TopBar/RDMPTaskBarUI.resx index 9c79f1917c..46a8e47b5d 100644 --- a/Application/ResearchDataManagementPlatform/WindowManagement/TopBar/RDMPTaskBarUI.resx +++ b/Application/ResearchDataManagementPlatform/WindowManagement/TopBar/RDMPTaskBarUI.resx @@ -1,4 +1,64 @@ - + + + @@ -118,7 +178,7 @@ TgDQASA1MVpwzwAAAABJRU5ErkJggg== - + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG @@ -192,54 +252,69 @@ mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D TgDQASA1MVpwzwAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG + YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 + 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw + bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc + VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 + c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 + Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo + mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ + kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D + TgDQASA1MVpwzwAAAABJRU5ErkJggg== iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAARGSURBVDhPhZTZU5pXGIe56H/TaS8SRZRpnV73pred6UzT - aIwLAZdo3Dqm1kxS25hoNS4EAorFDRU3VDaHGhMKdSGo4AKyi7KFTWT79XzoRW9qv5lnzplzzjznfd/v - nUPLr1TUMdmqzkK2aqmQrbTkc5Yit8sWU0z2YraIrUQRW4GiBwowyfzLahWKa1RkVOILjiLGrJFbi2tW - BfSK5a+K29Sf0JgcVY9I5dqWvfMEl7b8F3qjJ63ZcWd15gDe7vqxtnOOte1zrH/wQWsK5NAYfFBsOtIz - Sne8Y2zP8U2bZoxeIfuaRqLSzP3pCi1tRqA9jIP6grEkpjR2OH0XCF9kEI5nkEhmkc4CiVQW/kgaTn8S - 29Yo5rRetIn3AyRCDS2frXLNqr2XPGUA09qPSGYAy2kMnF49diwhBKNphGJpxC8zOfyRFGznl7B4E5Bt - BjH9zgeR0k7SloNWWK6MSt7a0pRM8j6EaCKDA1cUta/+xtZxCKF4Ord2QW4Jk7krkCSXJXIIVWfoWXCD - t3wCRtVslnaLFHtYfpJ9rfRjYiMIfzQFkzOKJ6JdGE/CiOREWcTIeB5Oweq9xJHnAseUTH2GzmkHuiSH - YFTKSGTsheyYxgOuwg+RJgDrWQKH5PCeI0rqcokAkYdiKXhDVETUegxGeyw38hWneDZlQ+eEGQUVi5RM - gT/WPOCTNJsER2jhbaOVb0CbwICfRz7gyagRHSIjHgsNaOXtoPn1Npquqefu4dmkFU/F+ygoXyAy0kOj - apK3woeHfCs4g2ZUD5lRwzWj7praIROqB01g9+/hAYH1ahdVfUawB0x4Om7JXUa/P38lG1G5wF09Q+Ow - Ay0iJ8GB1mtaRuxoJjQN2/BIYEXDGyvq+RbU8Y5Qyz1Eh/gIjwU7oJdJiYylgFDhwuDKGRoEdjwS2tEo - tF1BBA2CE9QTwcOc4JgIjkjkB+AMkAxItD+JzCT9TeTfm7mS8Vcd6Jd50T7mJL/aQzjF79d0z3vwUurG - i1kXumadeD7jwG8SG36dOkGz4AA/CvfQOKRDfuk0JZODt+LICSQbAdJTKZxHwjdyRogmkhCvudHANaC+ - X4u80inQmKRmXJkjF8GcNgxb8ACD2iYMaBv/E2qfOjepOUXtwBZqezeQVzJJZKQ1hpbseDnngVQbgifs - xpxxFNIboPapc+NrLlT36cHpXkfe3XHQqCdmYNGOLlIX6fuPsActEOh+wZsboPapc2LSBazuv8Dq0uD2 - 3TFSs3J59MWiOc2Xe6ExRuCLOyE74P0PfPgvXJhdd5EUtSh5rs7c/kFwSWOw5Lp2odnVN2+KT6qPM3ry - junNIehyBKEzUQT+hR+6fT/0Jh96JQaUt8uy37Utx299P+ag0StXehislSkGa9lML1lJFFUto7BKRlhC - YeUCGBXzYJRLUXB/BgVl04QpFNybBL10IlenT78VJz+7I3Z/fke88Q92NlVRGjmKRQAAAABJRU5ErkJg - gg== + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAARISURBVDhPhZTZU5pXGIe56D/Ti3baRhF1WqfXveldbzrT + mJrEhYBLNG4dbWomqa02Wo0LgUDEggu4i8qiQ40JxboFFVxAlk8E2cK+/3o+4kVvar+ZZ86Zc848533f + 753DyK9U1RVzNJ2FHM1iIUdtzufOhz4tm0sVc+ayRRw1ijgqFN1ToZjMv6jWoKRGQ0Y1PueqIsU1SktJ + zYqQWbH0ZUnb6geMYq6mV6yhdhSvnf75bW9s00Cl17YdWb3Jh1f7XqztXmJt5xLrbz3QGX05tHseqLas + 6SnlebRDemD/uk0rZVYovmKQqLSzf1KBxa0QdMdR0J8/ksSk1gaHJ4ZgLINgNIN4Mot0FoinsvCG0nB4 + k9ixhDGrc6FNcugjEWoZ+RwNNb3qSvDVPsh175DMAOaLCLh9m9g1B+APpxGIpBFNZHJ4QylYLxMwu+JQ + bPkhf+2BWG0jaSvBKCxXh2WvLGlaJnsTQDiewREVRu2zv7F9GkAgms6txcgtQTKnfElyWTyHSONG7/w5 + +EtnYFXJs4xPSLGFy+bsc7UX4xt+eMMpGB1hPBLvw3AWRCgnyiJCxstgChZXAifOGE5p2aobnXI7umXH + YFUqSGSc2axU6wRP5YVY64PFHccxOXxgD5O6JOAj8kAkBVeAjohej8Bgi+RGgeoCTyat6Bw3oaBigZap + 8MeaEwKSZpPwBC38HbQK9tAm3MNPI2/xaNSADrEB7aI9tPJ30fx8B01X1PMO8GTCgseSQxSUzxMZ6aHR + VZK3yoP7Agu4QyZUD5tQwzOh7oraYSOqh4zgDBzgHoH9bB9V/QZwBo14PGbOXca8O/deNqKhwFtxo/Gl + HS1iB8GO1itaRmxoJjS9tOKB0IKGFxbUC8yo45+glneMDskJ2oW7YN6ZITK2CiIVhaFlNxqENjwQ2dAo + sr6HCBqEZ6gngvs5wSkRnJDIj8AdJBmQaH8Um0j6W8i/PfVeJlixY0DhwkOpg/xqJ+ECv1/RM+fE05lz + /DZNoXvaga4pO36VWfHL5BmahUf4QXSAxmE98svktEwJ/rI9J5Bt+EhPpXAZCl6LmxCOJyFZO0cDbw/1 + AzrklU2CUUxqxlPYcxHM6oKw+o8wpGvCoK7xP6H36XMT2gvUDm6jtm8Ded9PEBlpjeFFG57OOjGjC8AZ + PMesYRQz10Dv0+fG1ihU92+C27OOvFtjYNBPzOCCDd2kLjNv3sHmN0Oo/xkvroHep89JSBewe/4Cu1uL + G7ekpGblynDXwmFaoHRBawjBE3VAccT/HwTwxihMr1MkRR1Ku1YzN0oFCQaLrdQ/FJmo/rmD6MTqcWaT + vGObpgD0OfzQG2l8/8IL/aEXm0YP+mR7KG9fyH7bthT97DupncGsXO5lsZcnWewlE7N0OV5UtYTCKgVh + EYWV82BVzIFVPoOCu1MouCMnTKLg9gSYZeO5On34jST50U3J+cc3JRv/AJ4BVRHR/DhKAAAAAElFTkSu + QmCC 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 TkSuQmCC diff --git a/Application/ResearchDataManagementPlatform/WindowManagement/WindowManager.cs b/Application/ResearchDataManagementPlatform/WindowManagement/WindowManager.cs index dd49fcaad6..5f66992bdf 100644 --- a/Application/ResearchDataManagementPlatform/WindowManagement/WindowManager.cs +++ b/Application/ResearchDataManagementPlatform/WindowManagement/WindowManager.cs @@ -148,6 +148,12 @@ public PersistableToolboxDockContent Create(RDMPCollection collectionToCreate, Image.Load(CatalogueIcons.Favourite)); break; + case RDMPCollection.Datasets: + collection = new FavouritesCollectionUI(); + toReturn = Show(RDMPCollection.Datasets, collection, "Datasets", + Image.Load(CatalogueIcons.Favourite)); + break; + default: throw new ArgumentOutOfRangeException(nameof(collectionToCreate)); } diff --git a/Rdmp.Core/RDMPCollection.cs b/Rdmp.Core/RDMPCollection.cs index e3e6e90320..0d61d44ee9 100644 --- a/Rdmp.Core/RDMPCollection.cs +++ b/Rdmp.Core/RDMPCollection.cs @@ -19,5 +19,6 @@ public enum RDMPCollection Favourites, Cohort, - DataLoad + DataLoad, + Datasets } \ No newline at end of file diff --git a/Rdmp.UI/SimpleDialogs/SelectDialog`1.resx b/Rdmp.UI/SimpleDialogs/SelectDialog`1.resx deleted file mode 100644 index 68cc010e31..0000000000 --- a/Rdmp.UI/SimpleDialogs/SelectDialog`1.resx +++ /dev/null @@ -1,982 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - - - R0lGODlhZABkAPcAAPhw5P7+/v78/vLc8P5K5P4g3P4K2v6a8Pym7vxE4Pw24PTE7vy68vyi8Pb29v5q - 6P484P4W2v6q8vx86PqW6vz6/Pj4+Ppq5PpM4PiO6Pz6+viC5vh45vi68PiK6Pz4/Pzr+fj2+PbE8Paa - 6PrO8vTS8PLy8vTM7vj0+Pjt9vTw8vTs9PLs8v5a5v4w4Pxg5vqM6v5x6P464v4a3PyS7Pqi7vpu5vpm - 5Piy7viA6Pau7Pbn9Pai6PTW7vyF7Pqd7PqY7Pic7PqE6PyE6vx+6vx86viW6vas6vxC4PTo8vxU5PzU - 9v4Y2vTm8v4c3P5Y5P5M5Ppu5Pps5Ppc5Pjc8/bW8PxI4vxC4vTi8P4q3vxG4Pw+4P5A4PTg8v4e3P4o - 3v4k3v4i3v4e3v4m3P4W3PTc8vjI8PbS8PzH9PbM8Pqz8PzC8vjC8P5C4vi88P5I5Py+8vy88vut8P6q - 8Pyo8P6i8Pym8Pyk8PqQ6v566vqK6vp+6PqO6vpw5viK5vpg5PqI6v5/6/6K7vye7vyK7PyI6vyA6vyC - 6vx16Pxc5PxM4vxK4PxI4Pi47va27Pig6vie6v6Q7fyM6vxv5/6c7vyO6vyO7PyQ7Pxr5/5i5vqm7vqg - 7P5W5Pxi5vyg7vqm7PxY5Pqo7v5U5Pqq7v6x8v5S5Pqs7v5Q5P669Pqw7v5O5Pqy7vxK4va87P689PbA - 7vz8/P7S9/464P4t3/444P424P404P4y4PxS4v76/v7n+vro9/ya7vxe5PyW7Pxe5vxg5Pp05vxk5Prf - 9vy48vyS7vp25vzb9/qC6P7E9f7g+P76/Pp45vbW8vq68Pp66Pz4+vrA8vr4+fz0/PrX9ffw9/Xx9Pbu - 9PzY9/ji9PbS8vjT8vbQ8vzN9fu28fzC8/jE8PjA8Py99Puw8Pyq8P6o8P649P7A9P78/P7a+P7w/Pry - +Prj9/zh+P7L9v7j+vbf8vrI8vy28vyv8vzy+vrO9P546vqk7vyJ6/jK8P6I7P4w3vrs+Pz2/Pz2+gAA - ACH5BAAFAAAAIf8LTkVUU0NBUEUyLjADAQAAACwAAAAAZABkAAAI/gADCBxIsKDBgwgTCtTgwIRDBxUU - SpxIsaLFiwJR6GnzxkO1iBhDihwZkpCMkzL4aCDJsqVLgRXaoJRBYOXLmzgphpgpA4LNnECDDnTA06fQ - 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 - PI9WCGup3FW1DOO35OjwhWKtEKq2FlwSrACCRQvsTPM6IfRILir6nBOzilYclCr1aSHWjeS+GknTKIZo - i+FeYxN6fpJ2LCko3SFX/BY1E5H2AdJ2jOS+dkWhFm0d0qbutAkAua0Fcock8Nv7dOrYEtFFclXboQr8 - lhTMU7euC5KM5K5IA9o+q4LrguaJJFvcK4LFh88a4n/r+CIlhuuJQB/ejcS+G8AVp0g6XPFfCXZV4VKp - tQ7VzWxEO9q7Mrf5RIaLWuPq/CimRS3Bfx4UaCBWsTUn+oykYQG25vwlAQEAIfkEAAUAAAAsAAAAAGQA - ZACH9nzk/v7+/vz+8t7w/kTi/iTe/gTa/pTu/Jzs/Eri/Bzc8szs/Jru+Pj4/mjm/jTg/gba/qTw/I7q - +oTo+vr6+lLi+j7e+qTu+Ijm+vj6+vj4+Gzi+GLi+LTu/Pb79ojm9sLu8vLy9pLo/hTc+fP49vL19PL0 - 9OLy9NTw9Mbu9Lbq9Kzq9KLo/Mj08ujw8uLw9erz9Oby9Njw9M7u/lTm/jLg/HLo/ELg/nTq/jrh/hLa - /Jbs+pLs+lji+Ibo+tn1+Jjq+HDk9rDs/hnc9Lzs/JTs/JLs/JDs/I7s/Izs/mTo+pLq+orq+JLq9p7q - /Fzk+obo+JDo+Ijo9try/iLc/mrm/kbi/FLi+OD09OTy/FDi/Ezi+lTi/ibe/DLc+kjg+kTg/CTc/CDc - /B7c+Mvy/hDa/gza/gra/gja+rfw9Nbw9tLy9s7w+L7w/kLi/LXx+Lzw+Lru+Lbu+rDw/Krw+qju/KXv - +qbu/KDu/qLw/qDw/pnv/J7u/Jzu/n3q/mzo/nbo/IPq/Gnm/Fjk/E7i+mLk+H3m/oTs+nvn/Dze/Cjc - /Hjo+pjs+pTq+pDq/ovs/pLu/HTo+Jrs9rLs9MTs+JTq9qbq+prq/GTm+pzs+Jzq/lvm/GDk/lTk+p7s - +KLq+qDs+KLs+KTq/qrx/C7c+Kzs/rT0/FTi/lLk/lDk/kzk9r7s/Eji/rjz/Ebi/Ebg/Pz8/Dzg/vr+ - /sn2/D7g/DTe/jDe/Frk/tX4/Nr3/izg/ize/ire/ije+mTk/uL6+mjk8uzy/Gzm+r3x+mrk/Gzo+nDm - /G7m/Of4/HTm+snz9N7w+Ov2/vr8+nLk+nLm/MPz+pbs+eT1/iDc+NTz9N7y/Pr7/Pj8+vb69vX29PT0 - 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 - +1Hq2vWuediQ3SxckGaQI7StcF6CgDAEfiaixAFoQTrFm5FWzPZmFZauwcQa2ndkhBnOOAM4gXARfEDi - EaNARg5la9lzGAwWLDYIPnr7W7GsoQJmUAAGjDsSAYxitu4VCP6WhXyQ6oYWH40NwCyH+BpczJYcYFoz - bvXH3sCKbiQ4FYkH1tHf8ao5ywa5xoAD2wop8jIA+JhtaRCiZ87GEh4ZfnQ9TrzVCKjYIJXebCxhwVtG - E3aXPrZsfCiN6IOANrT+CHRV4jFbdnwq1BH46FHbm0ssz3ayoG71QTzQ23bIWig6tSw0RIbrEgM2tH8+ - 4KAtuw5DF6TZ6Fv0WBu9wnbMdrTGETZC4tFbbv6oHrMdRfCwTZHecflH7JjtNyzCboq4ObCeRRAszOu+ - elNk19uGkTUIvVX/0kXcCSE2o2EECwlvtUEHZ/NFMEzWH1ljG3wFN70RrhB4tKMd0WYhoCs5bpxHYwTA - JudLeo+d8onclrO6bTlSNMvZfMv8b3vta5xvbpEmLWXnQQkIACH5BAAFAAAALAAAAABkAGQAh/aM5v7+ - /v78/vLe8P5M5P4e3P4M2v6c8Pyk7vwk3PSw6vy48vyi8Pb09v5s6P4+4P4O2v6s8vx66Pz6/Pr4+vp6 - 5vpY4vpE4Pqu8PqY6vz6+vj4+Phy5Pho4viY6vz4/Pz4+vj2+Pj0+Pj09vaW6PbE8Pam6Pzc9/rr9/b2 - 9vTW8PLq8vTG7vS47Pjk9fTy9PTY8PLk8P5c5v404Pxa5P587P484v4c3PyK7PqG6vpw5viC5vqh7fig - 7PTp8/TQ7vTI7vS+7v4a3PyE6vqc7PqW7P5y6fx86Pic6via6vaq6vp+6Pp66P5O5Pq88Pp85vpm5PxK - 4vpY5Pbd8vw83vjS8v4s4PpO4P4u3v4q3v4o3vww3vwm3P4g3P4U3P4S3P4Q3PzN9P4Y2v4W2v4U2v4Q - 2vbU8PbQ8vq48PzE9PzB8v5D4vy88v5K5Py08Pq28Pqy8Pys8P6q8vyo8P6k8Pym8P6e8PqT6vp25viO - 6PqM6PqA5vpu5vpe5P6H7P6A6vqM6vqC6PyS7PyI7Px+6vyA6v6M7vxr5vxY4vxC4Pw23vws3v6T7v6a - 7v5j5/5a5vyU7PyW7Pqk7Pim7PTO7vqe7PqY7Pii6vyY7Pya7Pxh5vya7vyc7vxf5Pyg7vqq7vxc5P5Y - 5vqk7vqo7v5W5Pio7P5T5PxS4/i47viw7vqs7v6y8vqu7vxO4v689Pa07PbC7vi+7vw63v7A9Pz8/P7c - +P464P4w4P444P424PxG4vxM4PrS9Pp45vxY5P76/v76/Pzx+vTa8P7I9vTe8PyQ7PjA8Prd9vLy8vyN - 7PrF8vzn+fby9P5+6vja9P7s+v586vx05/7n+v7Q9vr6+vzi+Pr2+vfs9vT09PTs9Pq/8fTk8vjW8/zV - 9vbW8PzJ9PzA9Py+8vu18vq08Pyu8Pyq8P6o8v6g8P669P7D9v78/P7g+frX9fzz+/7M9vjG8Prj9vrM - 8/zs+vfx9vjf9P7q+v7U+Pq/8vyv8vjK8vr0+Pbt9P566vzQ9f5K4gAAAAj+AAMIHEiwoMGDCBMKpLah - wYsGG2gpnEixosWLGAVag0QqVJEGEjOKHElSJCQCKAlYmlCypcuXAieESkngEUuYOHNWpECTQBNqOoMK - LRii58+hSBHSokDt5sUGRimIpAU0KcYJCwj9WeC0IlSaTaRenDDHkaNPG6xaJCejrQwMGL+mDHuRViYb - eG3wqKo2oQAHbmU4WvY06kV6a/LaaJK2r19HgWUICklRLkq6FTdIUGxjjVjHCItFltHN4gvDFUtwtiGB - MmiDLiAHhtY14WmwnxU2kMF5zbHXCWkhGM2m4u25uZWWWg3JNfCC1wAHdqCP4vHLyQ/6IMC5SfXnSp3+ - jEbg3OB1n9kLUgO0Gg543RIiO4I38TzmhN4ecHZU+33BKqPh0B9B9qU30AY6rBaPfwpRIFpkYShUoEKx - rEbIgAwO5IImkRlhYAATIsRMKL25kKFCZI3mhm2oGTQBD6sRceJE80jnlgPyIBSiQdvowpkp382YkDGj - cVIeiC0SREEOqzkB2lITHDnRBn+M9pt5SQ5UhX6KHYKhQrQI8OVBE4jDjxGb0JcRN6MN0Z9l6BkUwiGc - PcBLRtRw48AtNhQxJkHhOCCoA0bEEQxG1BQxmjIGwXnfQK+sloOUB9Hiww63WKGpFZJURAsOgw7Kjxp/ - EuSDbG4ZYU1Bjia3jyn+nLWBwlOX2LDppjR8SJAhoYbqBzuUEkQLBqORw2qS1GSwWqeZwXLKrbfS0NhE - s/Ta6wGzVmaEfNkK5ChfAUyRmGI0rDoRNcLwAS20k4Cr0AJGWDuoEW6Yq9A7o0VCWVFgOUXNE6tpM5Gl - esyw7qYzZKArbJzIO2gN34xJgR+jsTMQT2BRls9qOrjLqhJrHLxpNGriyY0fDguazAmUOjPahQIJYApN - j4Q0gSO9OZPQBkAgIrKmpORTqkIhqMFPyg4w0G1BE1QyWoQCMUITJiGFs1oxR05ADB4/W/HAJwtfNE8c - 8TpsxALpRReZsQJ9EElHmNh7AGcELD3QPncYLPL+LTjY/dIELkSC9B9h1EbLApF9M9BSDW3wmSucwUXU - K210fYgzwbZEQRVDIC1INUxT3BYOAlA0gRF5eUjQBj9o0nUTxgztUghOlC2vEXMcOpAA6ciRjuxYRcLV - 4tsskanItvAQwmu0XIMA0vyEI3twSlZiy89YBOK3Y9TQU4zn00/0ges/a8JN5mpRkE8zKSsOEzk/64JG - 2KCJII7toa6CEw4H55KBCEISlgs8YS33vQQf6+pFyQJIEGo4A1SCYkTpYPIBR+AqHuHzzwSmsYBpTBAn - WCmCNjLIwBKa8IQFocUEVsjCFrrwhTBcIfpcMoEUvOCGOMyhDneYwxTwhRb+1nCDH2pAxCIa8YhIRKIf - VkFCi3xAAlkogBSnSMUqWtGKWpBAdSbghiR68YtJ1N9QJHDFMprxihJY4RDByMYv+mGGGZlAFM9IRzNm - gQITWGMb92hEPwyFGnOsoyCpmIWIdJGPiKyBGIMygSMM8pFSrIBUuKjHRHpxiR8MigigCEk6ZqECzHAK - VTZAylKa8pSoLCVT+jIBCqTylbA0JR5RSMta2tJFtUhDN5qYkAnEYQhuoN+MqsEAQxhTDplsiTWiYIBm - UiEI0zphMFZhzGoawh44QUAzt2mATsBAmK+hQBoYYc1qpgMnveDmNsewgxXAUS206EYjymlNbMJEEur+ - 5GYWTNCAEy2jDvS0ZgRyYo0m5JObF2BBNF/TjgUEtJqMCEMyZ5eBAhy0mRDowAA8lpQJfIOcDzUEG4IU - AAHUYhi1mChCBCCNWkhDgDoAw0UNIAQAZOOdJKHFCQ4QUkNEAAWu4eIBhroAi0zDFUidBtOqsIuZGmAL - CkhBUpYRgZ7agR39scdQt7qOxU2gKa6RBlLH+tKCUCAVWHDqFX6w0Je0gw09ZcQ30vMBOmx1qEqNyTRW - sQoPDqQWY0VqOj5wEBHoQQwz/QIHYsBLpoUBpA9dwPYEkoa7DrWrAplGBDYbgbwGoB6BRWotlAIPKEBg - pgUgwQtccoJz9HQO8Pj+kjzsYNlFBmAVnI2AbYcRWlfo7iDUyEcinKqIFrS1IvLAR08b0Q2OLm4Vlj0A - YQaS280S5Bm9nUawKDAJLTjVAiqY3gTGGVJGpGF5E9mpZWfhmupGwDX26O10FSKCPXhhpl7IwdBo8Y2e - ugGoppODZc9B0gC4tysfmEVoh1EqWhyjE07FREUmQIeHMiC2Ro0u1BZ34IIANrSYpQg1YiGLi66hwRUu - ZyP6Ac5gnMOyckgOLTpMEN6FdhaEtQgFiNCFfCbCuQUJgzUZAY4CU2QW0T2BQWZc3f6INbSlwcg18PAF - bsrIIsM4ACNWAWCMSCO64ugPk3M7IHf09rcWmYD+GWgwhgTkAZwtEQB072qH7Y2ZsxwNRm/dgdOFbCAF - cG6Jeu+ahiPdebPOjW9o55uRPpfkA+awLB2MLJBDR8C5H0hHaH9nS3dEtx/BcS+Q19Hb0dLSxZaNwIcs - DWQB8Daws2gHLV0RXdCFurpA/mx2UbiM6A7v1rnNdQCOGtpnmHACEbCsHXIEJlFPpB29HYZKGdSN6A4j - c6ymyIcDa2sh1VXS9gI2nk2n6cByWkhZtmyUB+ZsilSj1EKarWXxsd92T8TVvZX1idAR3QU2G9cWwW5o - 7cmgCdD2rmyAo6Wnp+ixzuJEFL7rOdDM7iZfJMHmPhEtpnFXz3qKxhYh9Vg+Q1zwbvCV4BZZeEaq4Q53 - dPuW4t5sY2FOEZDTPCjudfTNK4Jbztp25znRLGc9DnQQ7rWvMy86majB9KTDJCAAIfkEAAUAAAAsAAAA - AGQAZACH9obm/v7+/vz+8uDw/kbk/hbc/gba/pbw/Jbu/Bra8srs/KDw+Pj4/mbo/ibe/gja/rb0/Kru - /HLo+vr6+mTk+jze+q7w+pLq+vj6+Hzk+Gzk+GLi+Fjg+MDw9pro/Pf79szw8vLy9pbo/M/1+fb49/P2 - 9vL09O709OTy9Nrw9NLw9Kro/hTa+uj39PL08ury8tbu+Nz09vD29PD09Ory9ODw8uzy/lbm/hjc/Kju - /Kbu/KTu/KLu/KDu/J7u/Jzu/Jru/E7i/nbq/i3e/hDa/Ijs+oDo+lbi+prs+Iro+G7k+Jrq9uXz9MTu - 9Kjq8tzu+pDs+KDs9Lrs/m3o/IDq/Hbo+prq+JTq+nTo+Ijo+JLo+nDm+Ibm9Oby/lTk/kjk+mzk+s/y - 9tjy/Dze+lLi+kbg/DDe/Cje/CLc9Nzw/g7a/gza/gra+NHy/jbg9tLy9tLw/Lzy+rzw+Mjw/j3h+MLw - /kzi/LXw+rrw+rbw/qby+rLw/LLx/K/w/Kvw/qbw/Kbw/p7w/n7q/nLq+ojp+mDk+HLk+nzm+nbm+lTi - +krg+pzs/ILq/Hjo/obs/Hrq/H7o/IDo+nro/Ibq/o/t/Ijq/pzu/Gbl/ETh/Dbe/Cre+LLu9sLu9Mju - 9LLq+Kzs+Kbs9Lzs+Jbq9qDo/l7m/lDk/Jzs+p7s+qDs/Fvk+lzk+qTu+qbs/Fbk+qbu+qju/FLj+q7u - /k7k/kzk/krk+Lju/rrz/Cze+Lru/vz8/EHf/vr+/vr8/sX1/D7g9sTu/t/5/DPe9NDu+mTi+JDo/Nz3 - /Eri/Jbs/iTe/Ezg/iLc+K3u/h7c/I/s+J7q+Hbk/Of4/hze/hzc/vj8/hre/hrc/Izs/vb8+pTs/tf4 - +t/2+Or2+nzo+Kjs+n7o/kri/pru/PD6/jTg/Mf0+sby/kji/kbi/q/y/pju/tL29q7s/Pv8/Pj8/NX2 - +vb69/P39fP1+vH4+OH09Oz09ur0+tf09uLy+Nbz/MDy+r7w+Mry+MTw/Lny+rry+rjwAAAACP4AAwgc - SLCgwYMIEwqcwACeC3gM1imcSLGixYsYBboDQorUoncSM4ocSVIkkBsob/QIWbKly5frSKW80YDly5s4 - LWKYiXJCzp9AEZLgecNn0KMKJ0ywWbEEUaMY1zFFWnFCHEeO4kxV6JQn1Irr+kyZYoEB1Yt8GqhtcAdj - 15lfJ67rQaAuAR1xzx4UMGhtgyktLr5NmTehvFl2Cdwwq1ehgCl+GyDYenBwT4sMqCQmIItx44ToIjeo - ZxHeU4tzNhNgRPmzQG2iGRU2aNprRXiXNs/S5lrhOlei8d0+LXeZaiCteweI19fvoHgUa8OlSM/L5hvQ - lSvMJzpCdOIJJ/5cUJ1H+0QSjCIDniid8EQxXzZPmW1+4D3RlJK3v5yQQRXVYdQ30QQIiDaCQvsVpVAH - qk2SnIABMAGZX4JgkFCC9JVAymZ2BAahbxaIxs+F4BW0DiuqofIhRSUIEdkg4SCEIUJMlLIZKSSsSNE+ - ou0gY4kDMVCJanK4to5SDx7EQBGi8UYbkAK9EV9iEtCXkFRJErQOP1Q8soCHGN0XmTVTWaZgQSRIsNkX - pGE0QQwS0EHAD1kGMI4QeArxCB8xXjSBD6KNY5CZedWiGpkXrUMPIXS44agb3lG0zgF55skIOXUGsM2E - awnhTkGEFiRDKpuVAmZ0oBDw6KOkWDkQpf6V5klJMVmuk4dofIBa4jqnqBYpRQz8ksqqq17imUK9xBrr - Dqcm9I4g6p0a6kD2yLJZA58OmEYVxBK7jKsDxSGIsnkKYku2Cukjmg8sDcUTSxMwoho5cs1zQaPdOkrH - KeAS1MIO5ObpyAjJMWCNaMUMtNO7A+mjWiPJvaMOLfk+KkmzFq1TDyUB43mANq3FIJojRgkgU0o1LTTF - ZrTE0B8IhVTsKCn6ZHoQCeQw0rEQOfRp0Do7GDhQIDMtEBI+qh2z1To1cCOzG19YYOFN8fDxSMeCxPHB - Qds0t1ZbAn3wQ0c+oLvAddkVdAIS+OZLBxRp47SOPD7sXATBBsUR2f6BAq3DAAMlMAAV0ontYRAJtQTx - tAQx2OxmGxx3DAQ0JlKyVn4UCSCEXY98xYAKlzzdSh2Oj0QCPuN23IfPAazTyznj1PlBPz/EAdU6TBDy - 9F05GrmNHztTEbtLNn2wijlPT4LxZ+tog8DO4JSO0C4NPH1JPdLnNEEYjnTM90t8yFyKHP1+RgIeqccK - AU6UuL1I7zoOtM42gCj7vUvhEwvJ8vG3HkPkQrBE9gzygSk8qhBhGGBv1tEOW6RDAD9ZRxx+gI/y9e+C - GMwgWLDEwQ568IMcbIzfXBCCEprwhChMYQldIDiCYOAOlMCKDGdIwxrakBL8YAdSpkEFcTjgh/5ADKIQ - hzhEM1DhU+u4gw2XyEQb2gIpVCCiFKdIRCpIJYZNzCITKXGUdfiQimCcojgigkUtmnGGXAzKBL4YxjYG - cYwBsMUZ54iVJwZlHYxwox5/aASz7MIWZaTjEilhCwgexR1GYOMepSgOI5SAJUf6myQnSclKUlKBGbOk - JjdZSUxq8JOgFJAAijGOYhgSJ7s4RxHyMLVQCgQafjiALPngybDBogC4xAQnjpXBcNhClsA8QDZwkgNc - GrMAFEiBBV3DjnGAI5jA7AVOIHFMYzIjCy+oJUyKsQBoBhMYxKzmMc3gBHisCBrn8GYw14cTd7RCnMcM - Qid46ZoPxEGdwP4MxAN/ggEkOACeuMSBEgawTOKNIBD4lCU+0NW6YowAGKeciDt4IIQ/8EJ+26gCNQBa - AGRo4QTavBIw9JDQA/ChBTYRgC30wFI7TgQD5jCATGnRyta1gQwcLYAbPFECqkCDDyXVA60Mkg2WGhWc - 8sMSQVgh06ZegSkT2IQbcnoEFdDTJR/oBToSGogR1HQg1ziHUVk6zL410BbZMOQ6jNBUmeIABQd5xwWU - wdFoPIMJtVxHOhCa0DjErSDjGCtLKSeQbEDgsBAoawBi0VaZauCq62gBGHDAUQd4wAUuGWlJ+wCN1oRD - sHpwaRwRCwGXkiATjWWDAsKjD2Pk1BehuP4qRcIBgaAWw1UrFeypSHtYgnSgsQYogznD0w0z5LQQYsjU - OpzJ1XEwFCEjFaw0CcJbCMBLFcBdwYPiQQhmcJQZiKrICEpqi78ihBd8EKwf/lpdm8SACI09gw0kFQMK - 5PQHYImlOv2AUou0A7TtMEh7tcTWxgKgXxOogy4AaockrSOd0FxAOyx4DdDy4asBGDBBZICGxrLgCRfB - QBQ0IU5j9CsdwQSHczPSC9AmTMC8nQoogLsB2SJkG4eIxjGjcJERLCAQtmCdRaABWltsRcMEYYAuGvuA - JmRkHfcoBDOGcIGCkkSloBXyQJBMEH08oLEVwGxGGNLCzxQDtIJCCP6X5UcB4I5CeiGdyAfEOtZzPJe6 - MUaIPArQWDTQwJUjAK1iD7Jm+SUBuBmw8Yo+K1gIWKnQA3mHJhpLBBiAssWCJWxCID2QTQCXAz3NIJEF - i48HcVogDFAEcKWQQQFAALTmhTFpH9SGNTQ2E2Lu35kFe79N59k3WwCuCOLckjkL1s4VOfVAWoCDxiaA - Cf0LtGBfTBFlD0QUwDWElYPC6LFa1yLWFggJgtHYNcBBR5geq6ar/WuK4AK4rSB2RgQA2l5kKtwLOQKl - 5R0VOhtVywrBt0DuoYa2MoPfGPmvUQed7HZLqsAyJQTCE1UMW9gCqRgROKq1MIYxiELRrtyywyor8rdH - hrzhsz45VaqrcqrYgrSibflP2kHaAMv8jmdtx8RVLpWl7NwiAQEAIfkEAAUAAAAsAAAAAGQAZACH9oDk - /v7+/vz+7u7u/kDi/iDe/gDY/pDu/Jjs/Hjo/CTc9Kzq/Jju9vb2/mDm/jLe/gza/qbx/JTs/GLk+vr6 - +mrk+kTg+qDu+obo+Pj4+Hjm+Gjk+Gbi+Kzu+Izo/Pj8/NH2+Pb49qTo9pro9PL09Mbu8PDw9Lzs+en3 - 9t7y9O3y8ury8uDw8tzw8szu/hDa/lDk/ize/JLs/Ejg/mfn/jDg/g7a/HDo+nro+lrk+orq+ITo+HDk - +JTq9qzq9L7s/hXb/I7s/Izs/iLc/Izq/Ibq/Hzq+obq+oro9p7q/H7o/Hzo/Gjm+I7o9OXy/Gbm/GTm - +mzm+dHz+Hzm/k7k/kLi+lzi9Njw/Djg/DLe+k7g/iLe/Cre/Crc+Mnw9Mru/L3y+rrx/jng98Du/j7g - /Kfw+LTu+qru+LLu+LDu+qju+qbu/KDu+qTu/pXu/J7u/Jzu/nDq+o7q/Grm/Ijq/ITq/ILo/Gzo/G7m - /G7o/nbp/oDs+oPo+mbk+Ibo+nTm+l7i/IDq/IDo+nzo/ojs/pDs+KLs+Jbo9rbs+J7q+Jjq+JTo+nLm - +pDs+pbq+prs+mTk+p7s/FPj/EDg/Dze/DDe/lbl/kzk+qDs+qLs/rTy+Kjs+qTs+Krs/FHj+LLs/E7i - /kri/Pz8/kji/ub6/kbi/kTk/kTi/D7g/Drg/DTg/r70/ire/PH5/ije/ibe/sD0/iTe/sL0/sT2+mjk - /ETg/sb0/sb2/sj2/Ebg/sz2/Nr49PT0+N70/tT29ur0/Hbo/iDc+Jrq+sHy/LLx/vr8/Mn0/rDz/Pr7 - +vb5/Nb2+fL59ub08/Dz9Ojy+df09Nzw+Mvy9NLu/ML0+r3y+MLw/Kzw+Lbu+q3u/KLu/qDw/rn0/vz8 - /PX8/N749vL2+eL2/tb49u31+sfy/Ljy/Mz1+Lru+qzw/KTu/nDo/HLo/hzc9tHw/N7399Ty/OX4/t74 - 9OLy+MTw/K7w+rLw/LDw+rTw+rbw/q7y+PD3+Nry/jzg/pzu/Fvk/FbkAAAACP4AAwgcSLCgwYMIEwpE - lqEBrwYZRCmcSLGixYsYBSZjQ4PGhRASM4ocSVKkNgcoHaBDVrKly5cCRdFI6eAOS5g4c1akQBPlTZ1A - gw4M0dPBT6FIDVJAFvJig6IURIo6mrSiKFhBDgxrWvFpz6gXRRFTp4dehqoWycVZG4ccRq80wVptA6Mu - jDNy0SIUYIRtHD0onEK9CM6SXRgO8uo1KMDvWjZcFcJNqTghhSKHYViqvJjgG8dxdlmcjJLzwWiZYdCJ - 3JngO9CEqCIknbjrncyWwLVOKMoa6GldB08UhSY15N0J8/X1a2QZRdqmCf5ykNlBK+QKh4Ge91y4ZUep - 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 - EwpQFq82qDbLd0KLykZB5DP3jwo2YAMbVKBrOdcJBXhhggHUdOO7CQgAIfkEAAUAAAAsAAAAAGQAZACH - +Gzk/v7+/vz+8PDw/krk/hrc/gra/prw/Kbu/Izs/Cze7u7u/MD0/KTw9vb2/mro/ire/hba/qry/KTu - /HLo/Pr8+Pj4+nDm+lTi+kzg+pDq/Pr6+Hbk+G7k+Lbw+JTq/Pj8/Pj6+Pb4+PT49sbw9p7q/N34+sfy - 9NTw9L7s9LDq9vD19PT09Nrw9PL09PD0/lrm/hzc/KDu/J7u/Jru/Jbu/JTu/Fjk/m/o/jDf/hbc/Irq - +oLo+mjm+Iro+pbs+H7m+Jzs9qjq9Mju/Jjs/JLs/I7s+pzq9+Hz/IDq/Hrp+pLq+Jrq9qLq/Hbo/HTo - +njm/hja+nLm/lrk/kzk/ELi+lri+lji/D7g/Djg/DLe/NP299by9tby/jri/Mz09tDy+Mby9s7w9srw - /Mb0+Mbw/ML0+7fx/j/g+Lrw/kbi+6/w/Krw/Kjw/qjw/qHw/Kbw/nrq+orq+m7k+JDp+Ibm+nro+mTk - +qbu/ITq/H7o+oXp/oDr/oru+nrm/Ibq/pHt/Gzm/Ezi/ETg/Drg/DTg/p7u+mzm+pvs9rru9rDq9M7u - +Kzs/mHm/lbk/GPl+LDu/F3k+qjs/lTk+qju+q7u/rHy/lLk/lDk/rr0/k7k+rLu+LTu/Efh+Lbu+L7u - /ELg9r7u/r/0/Pz89sDu/uL5+qXt+vD4/Izq/ibe/E7i+tz2/iLe/iLc/sb2/FDi/iDc/FLk/h7e/h7c - /FTk/O759N7w/vr8/sr2+qDs9N7y9OLy+tDy/sz2+KLs9Oby/s72/Ob5/jrg/jjg/kTi/pzu/tD2+vj6 - /OL4+sry9/D3+OH2/Nj3+Nj0/M/2+Mry/Mj0/MT0/Lzy+MDw+rLw+qzw+qrw/qbw/rj0/sP1/vz8/ur6 - +vL6+uT2/sj2/PT6+tf09Oj0/Or6/tD4/LLw/LTw+rbw/LDy/njq/jbg+J7q9ur0+rzx/ors/pru+uH2 - +On2+r7y+ub39Ory/tj4+sz0+M7y/LTy+sLy9O7y+8Py8vLy/MTy9O30/nTqAAAACP4AAwgcSLCgwYMI - EwqsYMGBQwujFEqcSLGixYsCQ8Dx5w+BiIgYQ4ocGfLag5MP2FQgybKly4U4UD7wt/KlzZsUj8k8WROn - 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 - B9nADXSbggPCEbPjxbBtUX0QcMiisIP4Mo3IfFUAbmXTCKmAHXRbAnvepAJWpXOKWQRshMADAoVVwDrI - B+i8UkwhpjYArRGSC90CwdguuWxeGQ2cZiNEBFUorCy4YCJgYPZK0TE3Qj6h20e82ScCwKwxmPJiZz1i - 0uAmySiSbVP0xtvIFVkFLMaag4CT5L82DfDBO6trdR1YqEu4t09GUQpc4GKgoOl3TkeYIAhBqGPKlWQ2 - wi0iSAdo3IDqpXjKjRJzwIJ65jexgA46GwFE4zwkFphDZynw8p+Hpx8A6OoFRmB0n2yABQOIOgtorJqA - AAAh+QQABQAAACwAAAAAZABkAIf2guT+/v7+/P7u7u7+ROL+JN7+BNr+lO78kuz8RuL8GNryyOz8lu74 - +Pj+aOb+NOD+Btr+pPD8iOr6dub6+vr6TOD6Qt76ou74lur6+Pr4fOb4ZuL4sO74lOj89vr2jOby8vL2 - luj+FNz47/f27vX08PT07vT01vD00PD0sOr0puj08vTy0O78xvTw8PD06PLy5PDy2u7+VOb+MuD8cuj8 - QOD+dOr+OuD+Etr8kOz6kOr6XuT4gub4qOz4cOT4lOr0tOz+Gtz8juz4puz4nur+ZOj8jur8jOr6gOj5 - 1vT20vL2our+Itz8XOT6eOb+SuL8VOL8TuL8SuL8SOL6VOL6UuL6TuL+Jt78Nt703PDy4PD8Mt78Ktz8 - JNz+Dtr+DNr+Ctr+CNr02PD6uvD2xu/+QuL8rvD2v+74tO76svD6rO78qvD6qu78p+/6pu78nO7+ovD+ - oPD+mO/8mu78mO7+e+r+a+j+cur6auT4i+j6VuL8ger6luz6huj8ZOX6gOb8VuT8UOL+hOz8eOj+iuz6 - iOr+ku78dOj6dOb8ON78Lt76jOr6jur2rOz0uur4ouz6ZuT6mOr+Xeb+WOT6mOz6muz6nOz8YOX6nuz8 - Xub6oOz6ouz+qfH+VOT+tPT2tOz+TuT8RuD+TOT+tvP8/Pz++vz0wOz+yPb8Ot78POD6XOL+MN78WOT+ - 0fb+Lt78WuT82vf+LOD+LN7+Kt7+KN7+2vj6aub8aOb6buT6cOb6k+r+5Pr8aub6cuT8bub32/P84vj4 - 5PX6xvL8t/H+5vr80vb+INz24/L++Pz8+vv8+Pz58vn29fb09PT8yvT07PTy6vD53fX31vP04PD6v/L4 - zPD8svD4wvD4uO76tPD6rPD8rPD8qPD8nu7+nvD+sPL+wPT+/Pz+zPb+1fj83/j+3/r42vT86Pr55/b6 - y/P8v/L81/b25/T4uu78oO78ovD+uvP85vj+xPX87vny7vL03vL20PD8sfL6tvD6sPD8pPD4yfL6uPD8 - 9vz88vwAAAAI/gADCBxIsKDBgwgTCkzWoAGzhqQUSpxIsaLFiwIzbKtTx0yDiBhDihwZkpONkzbMgCTJ - sqVLAXVQ2qiz0qXNmxUzyDyZDKfPnwgb7LTRE6hRhcmS1aQodGdRjE+PWiTV4o03Z0slNpUZdSIpeHsE - jaEg1SI4QWgFqbu4FWVXiWaKyC2S5m3Zg0LSCiI0z2JbnhaDOZhb5A7ZuxL1ot3md6jdgxQQEC5i5zDi - hJwUCyJXkZnjikomF2FwWSI6zXIeF/TslCKzOpMdoCstcZhmZ64/Txwjeg1ticvy6hXiYSJrrhNJ3Jl8 - p/hvhek0wzOuO2GyC6LXPlfYYI7mcxKP/ruVGE30HtXbBUbT3CYrQfGAEzY4InpdeonJ1miGpRA+Ueii - zeHefQSdptgBqvmXIGyEOQAegQqRQo1mLSSkIEKkZCNaPhBOtIwhihHiD0IXHsSOHZPZkEGHE0Wn2D0k - VkcQBW+IVuFlpCQlUgNxaBbPQSUWZI5oEgwYoQACXCRAC97IMUpfGAGjGRxZ/fVfQQ1IIBpnFyUTjQQy - FLFGkhS1csCZB8gBjnMVJXOPZsUYZOVbwojWzUWkkFCJDHzyOUxFnKCJpjfFGGnQCIQoZogyWMoYwAg2 - TGYHlK6hUUSffdZhmUKBCoomJ8BYNKFi2g00J0HJqCHan0xVQwOm/phqWqannj7J1AEhUhrAqQMFgyJh - dayI3zFgwoopPugRJI4ctKIpRwtsJpSEZmYQZOVKyfAhWjoSkTLCBZMY2+ckaiRb0DzDNItmHOsYSkEE - moW60FArJSGaEOgxw5u4fQoxW0ikANOGumeu8SBCwWj2BkgwyVTHQMnsIZq8kCkxCL982lAoSxQU4w3B - B8Az4kGk2KYYfwJ9I1O1AjkjWhsYspMDxmGOddMy6jCrrhzOMGrQMonqdWMAypjBkRnCBvANc8scREIP - ktDszgg/kYLOPSDDAUtWLSg2zkCkUNBQA0+dMhk1cl5jB80SBGMoS8nAEgHIZhwsECnwohUB/pkKCSDE - XDlERcEvddBsRzpv25SBMzqrq060AowDzjiJL9TCNi08lScfNEuSRtKX4QyyN61UblEpaUSNMSW60ma1 - GSB/Y/pEpRSO8R7RzG4UBUnAQXAtN6mDsQPCmFtaAy00Lqg8N8UhriRqRMuiQCPAQyvwNoFjLAJ2T09Q - wJ0e8A3fLSmzR5+DtOt93+SIU85PybSwBlbr12///S6Rov/+/Pfv//+XYQgzBkjAAhrwgAUkG6pOwYkI - OPCBEIygBCXIiVOQzyfIQAAoCMDBDnrwgyAEISgQ4JxTTPCEKJzgKY6CgBC68IUhRIBSGpjCGqKQE0Yh - xQZhyMMXgoIs/jS0oRAhiEOgJGOHPUyiB0HRgACYcIhQjIA4cthCJVqRAAggiwDEEcQonpAT4rggTjKg - wSvycIQjiEoyKMDGNrrxjXBso1IQs8ax2fGOeMzj2ChgPPz58Y/1I0YtdvGTUsCDDuroY4fmIQ9PONKC - N1GGAx5AySbso4l+9IA4HMlJTxDSJtagpCgf4IR6bGp6pajFKDrJya/ZRAijFOUNMGCC9e0CHqzs5Cdd - koZYjvIJaGDGIhuZS06u8CYZ4IUvR+kHe2DyOf1oRTE5CQ8uQawlGWhDGZYpSiQcQ5H5U+U0HVmMaC3j - DbnohvQSkgEzSMAMpSDICCTATUrWgAgk/rgMMcAxTk+conUNqIEBBkqAeEokA00ogEIzATpSJOEW9XxA - IM7wTKD44xT9BEc8lkIKRgz0o4wJACka0AwQNKMBlkmDQld6gaVQgBpRiKgtTlBRmyBDmuMcBSzsEgwR - fHSgErjbCBDBBCYMQlikEMJKFfoAdhwkA5jYZj37wA7dJUQA5MDlOFuxzoVA4qcDTcNCBiGCsopgEAMZ - w1IVqoGaDgQdSIgoAXqwgpacg5/jlEfrClINCIA1EYdJBhPMKgImFCUDUVjrFVBgnWJcIqKAIINbKeKP - TY4THMBAT0DBagBTDIQChC3rM/ex1gI0QZgJoQAanhDRQ/xidgIQ/uc0dWquHnBWFc9sQGhFgNoAJMMX - pQXC25bBhxvU8wZzECNCatFPcXT1UAUAqxdiYK3dNoMgwYjFWstQAooEYxARhRlFiJlLvVaOFDzgLAA2 - pdvQguB7OigtBoyXjHSwgpuXqBx5qUmO2UXDC2DtAjSwtNv3EmQZqVjrKqZhkVQRwJeXMB45OjmKcfis - IhTYAWdVsJT2EtbABOFAaScw2YSMwAjGFaUaLFILeIxCHCO7yDU4a4HrEti9BqEAIEpbDYyQwhyHuEEC - MHHKozQAC2CFwAIO4mGzgpggSigtFHrb4IYU+SiY4OwGJtvksj4ZbBMobSOs+pwRBAGsItBC/lAKjBB0 - rGKtqXjGH0nhBM5+4Mq7YjPJIlHaPOCZReb4Ali5QA/56PkgyyDAWmWRBfxRAAqcTQF3Dn0Qta4VDyWG - EDY4WwEqy4nSOd5Bac9gvwYoAqxgYOykcayQJFxhrZ2u3w8464NMC6TLIviyQUixh9IugcxHQYdPf6oA - GEwE17o+1APWigWnsigZuOBsCMyFbIpcoLQ8AOdRlBAGsG6hrscGdVCesFZaSKNDyYgCZx1RkWpT5Bql - 5QWwccKMbv9UD7auLqsnkoxbrDUW87YJKZgx7IF6QQx+EXdCojGLpd4g4PlrQHo/2ofZuZsipIjvSikB - cZsw4weoSAUdS8B5cYpQgAhQgMIj/vybkWo7z/vGMEQAyZTdeprmPsF1vnFOkgYYg7BMYDnPe44Iwg6i - 40OHjAmIyoQJNC3pP6EAM0AwAJPu/C4BAQAh+QQABQAAACwAAAAAZABkAIf2hub+/v7+/P7y4PD+TOT+ - HNz+FNz+DNr+nPD8INzy0O78xvT8pPD29Pb+bOj+Htz+Gtz+Dtr+rPL8eOj8+vz6+Pr6cub6SOD6sPD4 - quz8+vr4+Pj4eOb4bOT4YuL4mOr8+Pz8+Pr49vj49Pj2xvD2muj89vz88fr61/b29vb02PDw8PD0vOz0 - tOz25fT09PT04PDy7PLy5vD08vT08PT08PL+XOb+Ftz8WOT+fOz+LOD8pO78ou78nu78nO78mO78lu78 - jOz6guj6YuT6oO74huj4duT2kOb4ouz07vT2ruz0wu7y2u782/b8gur6muz6luz4muz+cun8e+r4pur4 - mur2qur8fOj8euj6euj6eOb6dub+UuT8ROL6WOT6UuD8NuD41PL8Mt7+NN7+Lt7+Kt7+KN7+JN7+MeD8 - Ktz+Etz+ENz03PL+Ftr8z/X6vPD2z/D+POL8yvT8yPT4vvD+Q+L+SuT7tfD6tPD8sPD6svD8rvD8qvD+ - qvL+pPD6kOr6bOb4juj6fOj6eub6XOL6VOL+hOz+gur6h+j8lO76hOj8hez8fuj+jO78fur8iOz8aeb8 - TuL8PuD8Pt78LNz8iuz+k+7+mu7+Y+f+VuT8luz8YuX6pu74puz2tuz6nOz6mOz8mOz6ru76oOz8XOT6 - qO72xO7+VOT6qu74su7+svL6sO7+vPT8SeL4tu78RuL0yuz4vO7+v/X4wO78/Pz+2Pj8OuD8QN78QuD8 - ROD6cOT8UuT6cOb8VOL69Pj++vz++Pz67Pf+5vr8k+z6w/H6fub+y/b8juz6fuj64vb05PL85Pj6rO73 - 8PX+fur6zPL+6vry8vL6+vr89Pz63/b36vb83fj42fT81fb7vvL4zPL8zPT4xPD8tPL4uPD8svD8rPD+ - qPL+uPT+xfb+/Pz+3vj69vr68Pn+6Pr7xfP+0ff65vf85/n48ff60fT+9vz07PT4xvD8sPL6o+z+eur2 - 2vH+OOD+SuL+jOz8cOf33vT8v/P40PL7t/L6x/QAAAAI/gADCBxIsKDBgwgTCqRQYUOKDRVoKZxIsaLF - ixgFVshjyFA3ERIzihxJUqSqHChzdAtZsqXLlwIMpcxhiOXLmzgtUpiJkkLOn0ARVuCZw2fQowopULBZ - UQRRoxmZIq1IYRsDP26kKnTKE2pFAawaNdpXYerFBWLFLsDIdaZXit0cyHXQ761ZhJbSNrJ04mLblHYT - rpMy1wE9aXcp5tWryu9Ti9J+FHYgBXFihar0il1m8W9Pi2EmO/BxeWIwzY38BDbouWjTRZOlsCs9MRtq - N00fU8wmOg/tib6AaAZigmLr1QSb0ZtMz9fviW5QyzKuOyEFPqLTPZ9YwQ9qaBOP/k+kRrhwJeTbBVJD - LUHrQPEJK1gS3ST9RAp5UNdPCB/hM9E9uGffQMEslhYCyPXHmhOxBTPgRLTsg5ox/FVXEC3eiNbNgxT5 - colmlkyDkIIEVVPeXM4Ux+FE2KDGyogWDiQNA6LJQdtSI0njnWazsRajQE2Idgx6CNEigAAYCeCGHwiw - 0ldGyaDWh1QkBlBBEKJRkxEF1ASBiQN7IFkRNgiUWeYCKurUDWoo+NiVQfGIxgBGtFRDBCY25GlDPxap - YqaZfmBDJEEFanYJCAWR2M4UsZ1zUQMZ6qmnE4MG4OefZkrAmUVoabYWQQrSoodo2VhUAT8TSCqpE5ax - iCmm/k42hQCIT2pkoYmTHVLWfS4co6qqb1QagBuvYmoMohOhgNqGAw3FE0sU9CCaOxA2wwmev+aJCQbC - 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 - /Gjm/Gbm+mjk+Hzm/lbk/kjk+mLi+lzi+krg9OLy/Dbe+kjg/Cre/CLc9tTw/CDc+sXx/hLa/hDa/g7a - /gza/gra+Mzy/jbg/MHz9s7w+Mbw/j7h/kzi+MLw/Lby+rzw+L7w+rTw/qby/LPw+rLw/K7w/Krw/qbw - /p3w/KTw/KPu/Ibq/HTo/Gzm/J3t/Jjt+qft+pns+oXp/JXt/n7q/nTo/JTs+n7m+I3p+Irn+nLm+lDi - /IPq/obs/IDq+nzo/Hzq+ojo/ozt/pru/HLo+mzk+K7u9rbs9Mzu+Jzq9qTo+pzs/l/m/FLk/lTk/Dze - /DLe/Cje+J7s+KDs+qju+qru+qzu/lDk+q7u/E3i/k7k+Lju+rLu/kzk/Eri/krk+rbu/rjz9rru+qXt - +Lru/vr89NLu+L7u+qLs+qDu+lLi9sbu/Crc/Dje/Gzo+pLr/DDe/Hbo/DTe/Hbq/Hjo/uT6/Hro/uL6 - /D7g/PL6/tj4/iTe/ELg/iDc9rLs/Ebg/h7c/Irr/hze/hzc/Ejg/Izs/hre+tf1/Nv3+Krs/rr0/I7s - /r70/JDs+Kbs/sj1+O73/jTg+Nby/Mz0/kji/kbi/q7x+n7o/pju/Fzk/Ob4+oDo/Pr7/Nb2+fT59vb2 - 9vP2+uf39u30+OT09tny+s70+NHy/MT0+Mjy/Lvy+r3y+rfw/LLyAAAACP4AAwgcSLCgwYMIEwp0x6Ah - gwkKI0qcSLGixYEe4FCi1A/DxY8gQ4ac9ajko33uRKpcyXIhJZOPvqVsSbPmxAkwS860ybPnQAw5H+30 - SdSgu6EUGQRFSpFp0YgCPqBD98FpQqU5rSIUoObGATVanxYsd6DsgXIWscIMa3BWjrc5UIqVqMfsgUrL - Kqo1yZbgPENwczyCOFdhJbsHZuldSnHCrsA5DPUVOwvxAXZJGU/MBjnHgsIRxVnGM3mvzokMrnXGDFph - PssfUGuOKKZzndYR4dW1q8eDRNNCJYoDHPhRXtwKP1jO93s2QncWOqNFrnACHsvHrzo/WK/zjcm4Yf5Y - hhMReNgJlTproy7RXWXEMBSaV3iv8x7wyMUdtktH63yESkFmiDjsURQObNpl9Rw/ne1TIEUYLICYHtkV - 9J9Bw0H2iEcPbmaZGgBut1AEnd3T2lEgTYCOZaxZKGIAMHSmDn4ECSCARVGhQ4caFVI0j2X+MHXhQBMU - 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 - 7vai6vaY6PTI7vS+7Pry+Pfi9PT09PLy8vTy9P4Q2vrX9fTw9PTo8v5Q5P4u4PyS7PyO7PyM7PyK7PyG - 7PxM4v5l5v444P4O2vxy6Pp+6PpY4vig7Ph65vhq5PiW6vaw6vae6v4Y2v4i3PyG6vyA6vx+6vqM6vqG - 6vam6vPf8P4g3Pxq5vqI6PiQ6Pxo5vpo5PbC7v5O5P5C4vh25Pw84PpO4vwy3vpQ4PfM8f4i3vww3vwq - 3vTU8P4c3P4a3P4Y3P4W3P4U3P4S3PrA8fy78vLO7v484Piy7vqx8Pa+7vyn7/qs7vqm7vyi7vqk7v6V - 7vye7vyc7v5w6vyW7vqQ7Pxt5vyI7PyJ6vxu6Pxw5v526f6A7PqD6PiC5viA5vpw5PpW4vqA6P6G6/6O - 7Pio7PiY6va27PqO6vqQ6vqS6vqY7Pxg5Pw+4Pw44Pia6vqc7Ppg5Pqe7P5W5f5M5Pqg7P608/xX5Piu - 7PxP4v5K5P5K4vz8/P76/v7E9P5G4v5E5P5E4v7c+P4s3vw64P4q3vzy+v4o3v4m3vxA4PTm8v4k3vxC - 4PxE4Pil7PxG4v72/PxK4vii7Pzb9vrn9vfD7vx66PbY8vrN8/p45v7O9vbw9fzF9Pyy8P6w8vz6+/r3 - +fzW9/r0+vjn9vrg9vTt8/Lq8PfQ8vTa8PrE8vy+8/TO7vi67vq48Pyr8Pqu7vqo7vym7v6g8Pyg7vya - 7v649P78/P7J9v7k+vz1/P76/Pzj+Prt+PjA8Pfb8/rV9P7W+Pfy9/zL9fy38vqs8Pyi8P6u8v5w6Px2 - 6Pzf+P6x8/zo+fTk8vTc8vq68Pyu8PjG8Pq+8PbK8Pq88vbo9Prb9fx06Pq28P6e7v638/74/Pbs9vrj - 9/699AAAAAj+AAMIHEiwoMGDCBMK7ERBg0MKCiNKnEixosWBHszEibMM4sWPIEOC9Heg5IFlnUSqXMly - YRyTB+KkbEmz5kRgMEvOtMmz58BgOQ/s9EnUYKehFIHmREqRadGIAoRduiTMaUKlMK0iFNCrWrVeHp9K - 3DWt7LQPFrGa1HpwWZ+3fVCKlRjB7LQIpyqq1VmxFty3M4DNjWi3rD+9QdkSBMbmbx9Cggcn9Fd4GjuK - GhJTZOG4TwTJCrtVXqdYYOalEzXE6XwZdMJelcOl1ixRWWczrhUOq2s3gjaJp7NKNEHD8YxhuRUKq4wN - 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 - N4yoAT3QxAtLMMAwjVf2Ak1oAjTCXRSGRPnZEnGav99oEECfm+YqAbSOcQ4SCuCgsGhgOc895YfConXo - PAEGL4KKhiIUFek1AUYDUDAAL+78KQEBACH5BAAFAAAALAAAAABkAGQAh/aI5v7+/v78/vLq8v5K5P4a - 3P4K2v6a8Pyo7vyO7Pwu3vTC7vy+9Pyk8Pb29v5q6P4q3v4W2v6q8vym7vx26Pz6/Pr4+fpu5vpO4Pqs - 8PqU6vz6+vj1+Ph45vhs5Pia6vz4/Pz4+vaS6Pai6vac6vzl+Prw+PTk8vTW8PTK7vfk9PT09PTa8PTy - 9P5a5v4c3Pyi7vyg7vye7vyc7vya7vyY7vyW7vyS7vxa5P5w6P4v4P4Y3PyG7PqI6Ppm5Pqg7viG6Phw - 5Piq7Paq6vTQ7vTu8vyW7PyU7PyS7PyQ7PqY7PqW7Pic6vx+6vqW6vam6vvB8vx66Px46Pp+5vTo8v5W - 5v4Y2vpw5vh+5vTm9P5M5PxK4vpY4vxE4PpW4vw04PzS9vwy3vbT8v4W3P464vzK9PnA8PzE9PzC9P4/ - 4fzA9Py28f5G4vqy8Pyq8Pqw8P6q8P6h8Pyo8Pym8PqM6vpo5PiQ6vqE6Pp05vpg5P566vqI6vqo7vyC - 6vyA6P6A6/6K7vp+6PyE6vyG6vyI6vxu5/xW4vxG4Pw44P6Q7f6c7v5i5vxi5fi47vbA7va07Pqe7Pig - 7P5Y5Pxc5Pik7P5W5P5U5PxT4vqq7v6x8v5S5Pqs7v5Q5P669Pqw7v5O5PxM4vqy7vi87vxE4v699Pz8 - /P7X+Pw64PbE7vqk7vxI4vpu5Pa87vrY9f4m3viU6P4k3v76/v7p+v4i3P4g3Pi07vp45v4e3v4e3Piy - 7vxY5PTe8PyN6/7F9fTg8Pz2+vfv9frK8vTk8Pzs+vri9v76/P464Pbe8v7g+f72/P7K9vLy8vr6+vj4 - +Pzn+vr2+vfp9vrE8vza9/jU9PzO9vjI8PzG9Pu88vq28Pys8P6o8P629P7B9P78/P7b+Prd9v7s+v7H - 9vz2/Pfx9/rS9Pzx+vrm9/jb9P7k+v74/P7Q9vjM8Pq68Pyu8PjM8vyw8Pyy8v424PzW9vjE8P5E4v6K - 7P6a7vze9/bK8PrG8vq+8vy+8vrA8vy89Pr2+AAAAAj+AAMIHEiwoMGDCBMKLMXMQjMLFRRKnEixosWL - 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 - efNU41wQa1j2DlPmUDRW64MlUznM0ImCZddxvGdwIsgoqI6fE/INLWT1AZbuTipW24NI9xfT6qmBZUMh - VJ6YgAxNJQMVdjPqhJigCmZGc4NKcYfVPgG+vU5IGyyrBDv3pBV5luclUr2lZPfnAVn9BF/rU4oHrBYV - k7E2QoJh2T4IyALRhsAVMitqC7etD1nVRK1ZUopm4LqhOjhGXfxLEWI816IumPdKsAfehiohtPymSCpu - WkgBNYMSOHABDZGS8IlU4A05yIGOOcQQYSo6thipgAUzXO3GolW85DN5rWRJjnKVMIMedGWDs1u+PDrQ - lRc030kFxhFTNvBirDm3nQOQGEUU/yUgACH5BAAFAAAALAAAAABkAGQAh/Z+5P7+/v78/vLY7v5E4v4i - 3P4E2v6U7vyU7vww3Pwe3PLO7PyY7vj4+P5m5v404P4G2v6k8Px26PqM6vr6+vo+3vqk7viW6vr4+vr4 - +Ph+5vhu4vhk4viu7vaU6Pz4/PzR9vaK5vbA7vLy8v4U3Pjv9/b29vT09PTm8vTM7vS46vSk6PbY8vLq - 8PLk8PLe8PTy9PTu9PTW8PLu8v5U5v4y4Pxc5Pp65v506v464f4S2vyO7PqU6/pW4vig7PiE5vh25va2 - 7P4X3PS+7PSu6vyB6vbO8P5k6Px66vqQ6vna9Pii6via6viW6Px46P4g3Ppu5v5o5v5I4vxI4vpw5Pw2 - 4PpS4v4k3vpE4P4i3vw43vwy3vwk3Pwi3P4Q2v4O2v4M2v4K2v4I2vq28PfO8fTS7vy+8vbG7v5C4vjC - 8PbE7vi87vi27vyu8Pqw7/qr7vyp8Pye7vqo7vqm7v6i8P6g8P6a7vyc7vya7v576v5r6P5y6vpe4viK - 6PpU4vpK4PqH6fpy5Pwo3PyY7PyI6vx86vx66P6E7PyA6Pp+6Pp86Pp85v6L7P6S7vxu5vxO4vxC4vw6 - 3vw23vyK7PyM6vqa7PqS6vyM7Pik7PTG7Pau6vxk5f5b5v5a5Pqc7Pxf5fqe7Pqg7Pqi7Ppa4v6p8f5Y - 5Pim7P609Pio7Piq7P5O5P5M5P5M4vxM4v629Pz8/P76/v7G9vw74P7Q9v4r3vpo5PxE4P7c+Pzu+fiQ - 6vxQ4vxS4vxU5PrK8vxW4vyU7PTs8v7m+vxW5Pxa5Pbu9fyS7PTq8vzZ9/Tc8vp05vp25vjj9P76/PTg - 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 - hBoOUCsnnlERbGqTlYewUSgwSYsfGCN20lDEX4NgEAIX1sACycZif+Hcg1DDHvXsZDZwyIMc0EIPLCjx - Qdrx102AOHntvWYhFquNj2QnCjgYQ+xeQeQ6SsMGfy3DQTxc1hsHQAmLRYJ5tUWBhzjGDX/9AV+ZTFYn - v+IXi/WGIEsgha+iAQUI4TL+AZwcAFxwQq0OoKr5ePDXJZxRzWwOgBsWawGaygcb//3pLmBwvRznRw9q - 7cQyzJfYv4pAIXhWSC8WO4Epd6cbf4XClCOdEGkwVK2fHV8DShFdFkSE0wnBxmJxkOfoyOGvlT61oRHy - ijssVsjIwwUBvkoAd0gE1Xc5ApybqqBXTOCvqdAQsBMyhsWC4ps0UUKgQzqMVg9k2QjBwB4WizD5vMIR - fz0DRbCNkHYsdhL/acC0DSoBS1971kKZhIKhfaNdhzQH1WAXvBUSjzer9Aj0XkkD0BvSoOq7wBZ5r0o1 - mW45fGITbxAfuTsdDiQgYQx+TlwdJ97phggyNLt198ctQ0KBkI98J9IgbFlVkfGTrygJhf2Fy3UijXcQ - VRWW0OfMVRLDE4zgBCn6T0AAACH5BAAFAAAALAAAAABkAGQAh/aO5v7+/v78/vLe8P5M5P4c3P4a3P4M - 2v6c8Pwm3PLY7vzE9Pyi8Pb29v5s6P4e3P4O2v6x8vxy5vz6/Pr4+vpu5vpG4Pqs8PqY7Pz6+vj4+PiE - 5vh45vhq4via6vz4/Pz4+vj2+PbC8PaY6Pz2/Pzy+vrh9vTU8PLq8vTA7vSw6vfq9fTw9PTW8PLk8P5c - 5vxW5P587P4s4Pyo7vyk7vyi7vyg7vye7vya7vyI7PqC6Ppc5Pqk7vqe7PiE6Phy5Pik7PTs8vao7PTI - 7vS67Pza9/qa7P5y6fx86vx76fie6vao6vx26Pxy6Pp66Pp85vp05vjV8/Tm8v5Q5PxC4Ppa4vpQ4Pw6 - 4PbO8Pww3v403v4u3v4q3v4o3v4y4Pwo3Pu98f4g3P4U3P4S3P4Y2v4W2v4Q2vzO9fi/8P484vzL9PbK - 8PzG9P5B4v5K4vq68Pq08Pyy8Pqy8Pyv8P6o8fyq8Pym8P6g8Pyk8PqS6/pm5PiL6Pp86Ppk4vpY4v6G - 7P6C6vqK6fyW7fx+6vyC6Px66Px06PyA6vyC6v6M7vyG6vyI6vxr5vxK4vxA4Pw43vws3P6S7f6a7v5i - 5v5W5PyY7Pxi5fqq7vqg7Pim7Pay7PyY7vq07vpg5Pxb5Pqk7Pi67viu7P5U5Pqs7vqw7v689PbG7vi+ - 7vxK4Pa67vxE4vTQ7v7A9Pw+4Pz8/P7V+Pw83vps5viS6PxM4v76/v7l+vxO4vyU7fvE8vxQ4vyR7PxU - 4vTa8vyO7PxU5Pqy7vTe8vr0+PqA6PrM9P7K9v74/PTi8vrr+Pzn+P6A6vjc9P5+6vbS8PjI8PLy8vqo - 7vrQ9P649Pr6+vz0/Prl9/jx+PT09PXq9Pzg+Pja9Pbk9PzA8/zU9vjC8PzM9vzI9Pu28vq48Pyw8v6s - 8vys8Pyo8P6k8P7D9v78/P7f+f7p+vrJ8/r2+vrO9P7R9v76/Prw+Pzr+vji9Pbg9PjM8vrX9fi68Pbw - 9fqm7v566v444P5I4v7b+Pj0+Pf09gAAAAj+AAMIHEiwoMGDCBMOnCCt4QSFECNKnEix4sIzESKceWix - o8ePHs+MGznOHciTKFMSjEByXASVMGNSnNBypMybOA3SrJmzJ86dLV35HEqwFjFi2CwCJSm04quM3DgS - hZiulNVSSWfWHNd0ojcEYBGc6ToV4bmrpViR0FqTLER4d8IioOO2bEFWaEuZnLh0ZF2ErkrJRXDnr12B - r/KWijeRwlbDBrENRlDqcMISiokJkOi4Ledxg++UsJywiOJanz1H5DaZGOmEH86iPSc1YeegEYOZG0zn - w+uEtRTzi3ibKURXCyYX+Z1wAjHFoxUW9wvx2OQIm5kjjKd4r+3HCif+gJuMTLtCd4rVSQefUPLgyuYT - TsOLVvN31Qcp0AkdPT5Cfoqlcx9uCJ0xmTf+hSfbVef4lh97BsHDAG+1DQUZRMHl9QpC03F1kCusKGcX - BQ00IE1HrjyXV38EdfgXMtddGBMFPjwghh/MVBgRZnm5phOEA0kTwWSMVeTKMREkIggbFOVxwJMHjAHF - ChYllpd6BfXlYUFFTLaARdWUksiYY54hkTSOQAllGB6EQBE79DGY3UJABqDfYAxMQxEFwwhCJpl0RTRB - mmpCecUpJ0qETYBZ1qnGZN5BNIEJd/z5px06HlRJoYXuoIyMAUywoFVqEaRlQXANNk6mBR0pjqX+lo4l - 0QSBiMEplGIIU01EyCi2IZ08DRTYZFkpFMw2kcBKZiTfgCpsCzvcCmUCQFCgkCtnQAdsSwRRM1k0EFEA - jSTKkhkBixQ1QMQV0j5JRTOJHsRjfSu19JJAAgwp1x1FHjQpHuWOyYAJKLEwQhjtQtCHPIaZduVAIpHk - XTqtJQQPOAEnIok7rCrlwg9jtEvGHrsa9EGcVgmIrzsZbTQQMYOZs5ZB7OCSbMCssHOTBqtY0e4BkIRi - bUEZXoWlQK4wNEFXFMvFjUHS1INAxhEc41MDKmTxcyPQVJitVZEqFE1Y0cwZKjV0ZHzHckS5wgIABrRr - RgUrkFULP6hNJED+EcTwYzY8YgYciTcd4yTNAB1A0G4Beegc0wRq3FxuKeja1cAQFmzteEoCpB3wOOWZ - 18ASXLSLD0zcBIxAEc5O5QoKG5RxKx8wsaJsJGwU/ps0CnTC6ekqvQIrOJUnKFADKbQC5RQOcj4OmeaE - brxtcOQQge4W7c0GP61P7/334CM0AQUalG/++einrz4F2KPkijTqxy+/BtJ0NcE9HHBRwP789+/////r - ghOC0RNaROAPMUigAhfIwAY28A/XsxMHAEjBCgIwCe3rSAQcyMEOOjACrtCA/ixIwgpyIYMWQaAHV9jB - P4xvhCWMYf+40D2KuEKFLMzhAl04ASTI8If++xtETzaowyLGIA4PYQcSYAhECnJhEMXoyQfigEMjcvAP - cWBHV6TRAGd48YtgDKMYv2iNBqDwI0mbgBrXyMY2uvGNSwufHOdIR4NQIBx5gMPQYCIAYkSDY3UM1Tpg - IINCTqJ5KJlAJBzAyBzUI17gM4EECklJGcQBJmxgpCYdcIO6fa8aedBCJSkZCZjMYZOaPAIcSuYfCsiB - CqOsJDhg8g1UbnIZ69jjbyYAjRfEspKMMNtJJnALW26yF8qA5GGo4YRfUjINPKhNDf0FhnwYU5M08KRd - goEDfThTBl7wAZUG8gE46AIciAzPAuxwDrOVYAZHuKYDjvAGNxGFAm/+cMM3ZaCHE+iSAoxIg0AdgL0J - /OEFCM1BhUywSHkCAhq6lIkr6mGJfRIAFA0wyAwEylFWDIREJaJAV9iA0JLOMkvQOIQ8HSAIeZxRIsfQ - wRa+qQ8PsOAgx9gHRwXKgIEEQxCUoMQmmleHkiLUAeMsCAXAEc9rHqEOrERJCHiQhn0+wRiZckUgdirQ - LwXAFZsggFgJIImBqMGoCO0BqyS00nygwZ4fmUA3prBPT2BBAwmpRxu4qgeOuIISYyUAJZrSQ7S+QBkJ - cQU2ErHSP0RBmRJxhTIqsE9VaCKjzXEAV9OABWEFVqzxqodhcxDRLK0DCSvFATUqQoE8eOGbWpD+xU0h - 8obN6iBeE/gsAfCKtFsYthkRYUccmmrMI5w0ItLowT6ZAAzIGiQYlOCqKoxBEGnoFrMCOcYk0HqEfsD0 - Biv1aEQ0QMhfwsAUvI1IDzar1hZdtyAXMKwcnOWKIuTgmongTHkr6Qgh+IMi1FAFV2FwD6W+lyDscABa - J5FUQeHCmqhMhLN4UEkvBOIa3ZsAITYLCjsemCC4MCwGnHsZchDXAV4VlBHaoI8mJNMi0NgsI9L70Q8v - BBCGjUJHvHWEGLzhjNNcyCS42oYT5MfGA1GGYQFB44m8r352gcNmA+FcCiAZaTgwbDfqCI8pcNUNUuDQ - lbOrYKM6IKrgq8T+ZjPBKit/FrsGgYNhL/HSw5hgrzv1RIHF/GbbHGHB2gjfBJKwWRFIZ8wDGYZh81Ba - /6xjs0yAs4f73Jwc5Ph7FHgBkXkRLkQPxATbNSoSmhyfC2w2DySuMaUTywDDviHIPYEHAbhKgGsQx9MD - gUeZS8oINDPHFb3YbChA5ebAShohbzAsDWB9E2XgmaOT+O+tVx2efCyYYOZxBRM2u4bG4JogvURrKc1D - gWcLlA+NPjK1rxWJBTMbJhqYNUdVIY89fbtboT7qu1WS3J3WgLX3Jkh8S3rJ+GhgFIxgxBzOWOyxHjs8 - 4QAEIH5sPChbpOFifXh4pJHuQFY34B7viHUrP9vxkINkAoAd62BNfpMJCCKwlWD5TVzhD6BSohIElHlM - XFEiZ5Qo1XYJCAAh+QQABQAAACwAAAAAZABkAIf2hOT+/v7+/P7y4PD+RuT+Ftz+Btr+lvD8hOr8INzy - 1O78ovD4+Pj+Zuj+Jt7+CNr+uPL8qu78bub6+vr6aOT6PN76svD4lur6+Pr4hOb4cOT4auT4vPD2nuj8 - 9vr2yvDy8vL2lOj59fj47vb09PT08PT05vL01vD0uOz0qOj+Ftr65fb08vTy7PL8zPT27vT07vT02vDy - 8PL+Vub+GNz8pu78pO78mu78kOz8TOL+dur+Lt7+Etr6nu76guj6WOL6lez4iuj4eOT4kOr0wuz0vOzy - 2u78iOz8huz8fOr6lur+buj6kOr2qur06PL8duj8buj6euj4iOj42PT4kuj23vL2nOj8dOb6cub6bOb+ - WOT+SuT6auT8Ot76UuL6ROD6zPP8NN78Mt78Jtz8JNz+ENr+Dtr+DNr+Ctr02PD20PD+NuD4zvL2zPD6 - wPL4xvD8uPL+PeH4wPD+SOL6uPD4vvD+pvL8tfH6tvD8r/D8pvD+pvD8ou78luz8juz8iOr+nPD8pPD8 - n+78nO7+fur+duj8lO76re76ien6XuT4jOj4eub8gur8euj8cuj6gOj6dOb6VuL6TOD8iuz+huz8fOj8 - gOj6fub6muz+je3+mu78ZuX6mOz2tOz0yOz4ouz4mOr2tOr8QuD8ON78LN7+X+b+VOT4qOz4oOr6nOz6 - nuz8V+T8U+P4quz8UOL+UuT4rOz6sO74sO7+TuT+TOT4su74tO72vO74vu7+uPT+/Pz+x/X8QOD2xO76 - qe76pe7++vz0yu7+2vj00u76YOL6YuT6ZuT8ROD83/f4juj8RuL8SOL+JN78SuL+Itz+4vr+INz+Htz+ - HN7+HNz+Gtz6eub04/H87Pn++Pz62vX58fj8gOr81vb+NOD45fX8wfP+RuL+rvH8lu7+mO7+1Pj8nez+ - tvT8+vv8+Pz69vr39fb29Pb66vj8zvb28Pb06vT43PT24vP60fT21vL40/P6yPL4yvD4w/D6u/H8tvL8 - svD8q/D+pPD+vfT+0fcAAAAI/gADCBxIsKDBgwgTDtR1bsI5XQojSpxIsaLFgQLI9evH7dzFjyBDhiSX - q2QuciJTqlxJ0GTJfixjyqwowGXJmThzGjxnM5fOnwnPqWPA4CJPm0CTEmQwpEsXKkUrHnX5UVhJYRCV - RtSFwIBXAxmyTpxq8qI/O2jtoNSq8ByNrwbKwJPa0+K1tGjDiWW70wxcAz8mUCR7k6KuXXjR7uVLUBer - vwY4DK5LcUViO7sYJ1Rz5m8YEWMpS5xw57IHzQgnaIDMKTTSidwu+0Od0AS1v9RGSCTsU6KHcInDoaON - 8FwIyFg8thWt0MVlYcQTlgjz9wy9iLwlsrsMQUD0hCgg/ueIWpz5wXP9Ll/7nlBdJMi1lr9OiOxyZvYJ - FfiFSwp0+fnnmWMafgkxsAhkiiw2UHYJxZbYbAQm5EQCfxXgzX9UIfRbcMOxpeBEunQAGQXKFcSgQYdd - hgxfEwwl2EUkVPDXA/acZ95A2yUGE1sYIOKANInMUyJFREAmCnkL3hjAORCo99E15hwAiAsVcVLAlQVI - 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 - 9PL09Mru8O7w9MDs9Lzs+fH49tjx8/Dy8uzy8ujw8uDw8tzu8PDw+tf1/lDk/i7g/JDs/Ibq/Ezi/mfn - /jjg/g7a+pTq+mzm+mTk+lTi+Yrq/hLa+H7m+Izo9qzq9OXy9MTs/iLc/Hbo+ojq9qDq/iDc/HDo/Gzm - +oTo+Jbo+Ijo+Ibo/GTm/GDm/k7k/kLi+nDk+mrk+l7k/EDg+l7i9Nbu/Drg+lLg/iLe/C7e/Cze/h7c - /hrc/hjc/hbc/hTc/hLc/gza/gra/gja+rzy9sjv9NLu9Mzu/jzi/LXx+Lfu+rDw+LDu/KLu+qzu+K7u - +qju/pbu+qTu/KDu/Jzu/nDq+prs+pLq/Gbm/Gjm/I7r/H7q/HTo/G7o/njp/Irr/oDs/Ijs+nvn+IDm - +mLi/ofs/Hrq/Hro/o7s+JTq9q7s+obo+ojo/HLo+m7m+Jzq+pzs+KLs+qPs/Fnj/ELg/Dzg/Dre/lbl - /kzk+qjs+KTs+Krs/rjz/FDj/E7i9rbs/kri/kjk/kji/kbi/kTi/Pz8/vr+/vr8/uL6+pTs/jDe/N33 - +o7q/ize+orq/ire/ije/ibe/r70/iTe/HTm99/z/sH0/sj2/ETg/Ov6+un2/Ejg+sLy/vj+9uTy/sr2 - /Eji/Eri/tT4+uP2/Lzy/qDw/IDq+sny/rDy/Pr7+vb5/Pj8/ND2+vT6+Nj08/Hz8u7w+t329Ozy9Nrw - +sDy987x/Lny9sDu+rnw+LLu/KLw+q7u+qru/pzu/KDw/J7u/rz0/vz8/uT6/OT4+N/1/sX2/PP6+u34 - +Ob2/tr4+uX4/MHz/qLw+tDz+L/w+LTu/q7y/M31/nDo/KXu+OT0/IPq/rPz/Nb2/K3w9u319N/wAAAA - CP4AAwgcSLCgwYMIEwrUMA3GABgkKCicSLGixYsYBabgUaZMBWsSM4ocSTJjqgkGUhrYEbKky5cwKZhR - aeBHS5g4c1psQNMABA06gwpFuKLnz6FIFTZroOFmRWpGGySdWpCCjiuYmgC9CJUmBKkY29nS9SoV1Yqp - jmxYu8GHWYtdVX7FuI+ZXWbtzlJsVoTthjDSuEa9qE7fXWag3upF2EyM3w1WnCaMm3Iu2l2HmelbrDDV - pccb5Fk0Mbiiu8zMdnFWmG3M40zOKpL2CnZiM1uZ9albnZACB9CUZJee+Aq1Md4Kh3B5zMUXxdlyayd0 - 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 - ullDRAEKP9V/Fon3RbSBV3NmvA1GEIQ2bCorkAMXG0MEhr2TsueMqJxHIEzlXgAsdBWad+JFF0kzXjvZ - G+w86UqJ7GTjAHWhpCIEd5hrHLJXdapRlQRJClFAAAAh+QQABQAAACwAAAAAZABkAIf4buT+/v7+/P7y - 7PL+SuT+Gtz+Ctr+mvD8qO78iur8MN7u7u78wPT8pPD29vb+auj+Kt7+DNr+qvL8pu78buj8+vz68vj6 - cub6ZOT6SuD6lOr8+vr4hOb4eub4wvD4uvD4kur8+Pz8+Pr49vj2nOj87Pn0zvDw8PD0xu70vuz49Pj4 - 8Pb09PTz8fL27PXy7vD+GNr+Wub+HNz8pO78ou78oO78nu78lu78WOT6wvL+cOj+L9/+FNz8hOr6fuj6 - bub6YOT6muz4hOj4qOz2sOr06vL0zO78juz8jOz8iuz6luz43fT4nOr8jOr8eOr6lur4mur2pur8dej8 - cuj6dub+Vub+TOT81Pb6dOb22vL8SuL6buT6bOT03vD8QuL6UuL8POD8NOD+Ftr40vL21PL01PD8zfX+ - OuL2zvL4xvD8xvT2yPD8xPT4xPD8wvT+QuH7tvD+RuT7rPD8qPD+pvD8pvD+n/D8nO78kOz+eur6jOn6 - cOb6YuT4juj6euj6ou38fOr8euj6huj+f+v8gOj+iu76gOj8fur8gOr8gur+kO3+mu78bOb8VOT8SOL8 - QuD4ru72wu72suz02O74oOz+Yub+VuT8YuT8XOT6p+74pOr6qu7+VOT+sfL+Uub+UuT8UeL6rO7+UOT+ - uvT6sO7+TuT4su72uu74tO74tu74uO74vO7+vPT8/Pz+0Pf8iOr4kuj64vb8ROD++Pz+KN7+Jtz+JN7+ - It7+IN7+INz+Ht7+Htz6zvL8VuT+3fj8hur6fOb6oOz8WuL8lOz83Pb+OuD+OOD45PX+RuL+iuz+wvT8 - luz59fn89vz48vj29Pb08fT28fby7vL8xPL06/T44PX81/f23PL05PD41/T80fb4zPL8yfT8uvL7sPD+ - pPD+uPT+v/T+/Pz+2Pj66fj++v761/X+4/n84fj46/b+yPb04vL6svD8rvL89Pr+NuD+iOz65vb++P76 - 0vT67fj62/b6xvL25vL8vPL8sPL6yvL24vT6vvL6yfT8vvMAAAAI/gADCBxIsKDBgwgTChzB4sSCEyw2 - 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 - bAH6qrUQAmZQkv1qiiIOOiEMOG034mzLDgd1CvHdcYITEgJFnJgcDmzFETjLZw5tOiGITWwD3FyeeXA2 - Afd99GZscNp6MLACUuBslk094onE47SKSHRqgOpXGrBa1gphx2ntUT8/+/UBbVUIshPijh4kFh5zlU8r - asDZDzh42glRw2nhQOmkoIOzTsg0QsC9FE+rdRAuAlArkMDZJlH41BSpx2ldDKANcBYPrK4bvifSigac - mEEI/moljnERdidkvmqFB8IJHFRvYMThCcGHWrGJcDgcYhDdQKlyQwdOkY3ewMuwTQqcRYLxzXBQkyW/ - rrBhLhLr9jbgNK85aAmrg3LnvOQICO0cfi6UVqhgAmSdw1mJflNmLLIpKd9JQAAAIfkEAAUAAAAsAAAA - AGQAZACH9nrk/v7+/vz+7u7u/kTi/iTe/gTa/pTu/JTu/FDi/B7c8srs/Jru+Pj4/mbm/jTg/gba/qTw - /JLs+obq+vr6+mDi+kTg+jre+qDu+Iro+vj6+Gri+Fbg+LLu+ITm/Pj8/Mz19rbu8PDw9oTm/hTc+PH3 - 9u709PT09N7w9Nbw9MDu9LTq9Krq8u7w8uLw8tzw9PL09PD09O/y/lTm/jLg/Hbo/Eji/nTq/jrg/hLa - /Jrs+prs+mzm+lLi+HTk+Jjq9rLs9qDo/hvc9Nrw9NTw9MLs8ujy/Jbs+pLq+tf1/mTo+pDq+o7q+ozq - +JDq9qrq9qDq9OTy/Gbm/iLc/Fzk+mrm9o7m/kji/Fjk+m7k99by/FLi/DTe+mLi/ibe+lDg+kjg/Cjc - /CTc/CDc/hDa/g7a/gza/gra/gja9s3w+rrx9M7u/Lvy9sfu/kLi9r7u+rLw+Lju/K3w+qru/Kjv/Kbu - +qbu/qLw/p7w/J7u/pju/Jzu/nvq/mvo/nLq/Izr/HTm/GHl/Frk/ITq/oTs+n3n/Drg/Czc+nbm+lTi - +H/m+nLk/Hvo+njo+KTq9rrs+JLo/ovs+p7s+pTs/pLu+nHm/G/n+JTq/Gjm+pjs/lvm/lrk/F7l+qDs - +qTs/qvx/ljk+Kbs/DLe+Kjs/rT0+LDs/E3i/k7k/kzk/kzi/D7e/rfz/Pz8/EDg/vr8/sv2/Ebi/Dbe - /jDe/GTm/OL4/tr4/izg/ize+lrk/ire/ije/uL6+J/q/HTo+svz+Oj2/PH6+pzs/vj8/NX2/h7e+OL2 - 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 - MqcG+qxBNEQVADhoFg7oUa9up5LWxH6zIrRQrTzJeN9uKiEOarGIP74KVj60VcCfnYoGKJFYtl5EAMMY - LjUZTBFrCBMUGDBBa3HLAM2upiAYJuxYEKvWeuT0d9M85jAsIgA5KEETfyjGjQWSDs3+YSwxHuxYWMGN - 0lorI+NYhR7wAIIV47Z5hNDsPg6SZPYepLeJxQN/l4LU0khDsxiITv6XO/ON0ppDlMkwL1jRi5A1I8S9 - iaUEXTfoY7/eY012Rog8SvsOK0vnHBQeKh8izOX1kuaPHTYuAFlxAM3arM6OVgiNlyqHIZdmGJqVwG4C - PZ6XJvZEAKQAH/zqAG7hJdOoLa03PL0WNmjWDr4idULYUNqH2Q8YfvCrH9ra6AFTBB3vVWsk9nyjOmj2 - HZuC9URAUFo2qI8WDvDrIESla7wwoLT+MJIENDucaBu7IukoLYkbRIFsg/UIOe22Qj7R4RtRINhDpTNV - pE2RceTZ3v4d6v72fW6LgEOtB84mrwkxjZamiN8UYcU68EBlQ2OF1mWEeMRLOEqyaLzjMekyxiRBfiTP - EpYPFid5xOXwWcOq/J8NkENZ5fDRl5eEKQ2wpJVQFBAAIfkEAAUAAAAsAAAAAGQAZACH9ojm/v7+/vz+ - 8PDw/kzk/iDe/gza/pzw/KDu/Ebg/Cbc9Kzq/Lz0/Kbw+Pb4/mzo/jzi/g7a/qzy/I7s+pbq/Pr8+uf3 - +lzi+kLg+I7o+H7k+HDk+Gbi+Mby+Lzw/Pj8/Pj68vLy9qTq9pLm/Pb8/PL6+PT49PT09ODw9NTw9MTu - +PL29PD09PDy8ury8uLw8tzw9t/z+OL09O708u7y/lzm/izg/G7m+oDo/nzs/kPi/hzc/hrc/Jzu/Jju - /JXs+qHt+nLm+lrk+KTs+Hrm9rbs9qLo9O7y9Mzu/h7c/Nj2/JDs+pzs+pbs+Jzq9qzs9Ozy/nLp+I7q - 9Oby/D7g/GDk+nDm/lDk/Fjk/E7i+mjk9OTy/Eji+rnw+k7g/Ezg/DTe/i7e/ize/ire/ije/ibe/iLe - /DDe/Cze9tDw/hTc/hLc/hDc+Nbz/hja/hba/hTa/hDa9Njw/Mz0+Mry/MT0+MLw/MTy/MDy/kzi/L70 - +L7w+7Pw/Kzw+qzw/qry/qTw/Krw/Kjw/p7w+o7q+nzo/Dze/oXs/oDq/Hvp/GTm/Fbk/Ezi+nbm+Ijo - +Ibo+lbi+oPo/ozu/Hbo/pLt/G7o/Jru/Jbu+LLu9rju9NDu/JLs+J7s+Jbo/pru/mPn/lbk+qbu+qDs - +pjs/Jjs/GLl+KLs/Dzg+qju/lTk+qru/FLi+q7u/rPy+rLu/rz0+MDu9r7u/ELg/r/0/Pz8/jPg9sTu - /uL59sru+s30/Gbm/Gjm/Grm+Krs/sn2/vj8+Pj4+n7o/vb8+tT0/Ob49vL0+vP4+Ob2/n7q/H/p+njm - /s72+77x+nrm+u74/PT89vX2+PL49PL09un0+OP2/N349Or0+rzw9tzw+Nv0/NH2+NDy/Mf09sjw/ML0 - +rbw+rDw/qrw/rj0/sP2/vz8/ur6+tL0/sz2+vn6+tz1/Ov69vD2+vT5+Oz2/tP3+sXz+rry9tjy/Lbw - /LDw/LTy/LDy/krk/kri+qTu/nrq9tjw/jzg/jrg/Ibr+nroAAAACP4AAwgcSLCgwYMIEwpEdyLEgBDQ - KiicSLGixYsYBUZrNGYMERYSM4ocSTIjrUk7Uu4Ihq6ky5cwBVYgo3JHmJYxc+qsaKLmjgI4dwodOrCY - T6BEkyKkBQxYUIssjgITWQEdLaUY0QHBgmXIU4pRaxaYehHdplNUKDjAarGJjbc2KGAMq3LsxQqRDOg1 - 4AjYVbYJK0CAa6MWtYt0U9q1mELNXgNmoP0FfLBCLcI2goQEK9UiNEiPDbxZSznhDcw2Olhs0blikdAG - hGwubTDeZcKpSE9kLZbsRBZgQqtpQzvwI9SoKvKu6zvwCNjNZhcvOG0wYQjtKC5X3BzhiyShzf5kn75U - BGpHkxFu/9ndILANsDmRV3giFeZa2Xa3ToiETWhDus13kC2oafFVQesthhA0X8Bmh4AKAWMFaswolGB7 - A9GyAGxVHAghQdjcBhcBASK4n0EzhBHaG+l8qBA6UqAmSkIXIoQOALBFkp6LBkEhC2b8WKDeiQTB4EZo - YzjD40RPoIbDjgLVaJADHMDWS2noOACMdBVBIwRqwxwkZUEqRBBaAhgOhQ4TBOiQSDZQToQLah0alBh7 - Bp2AQWgR0CFSCe7MMs4tF6ECwaEQ6LCEkhcBowxq39hJJC0iwKYFlwp9oMQsr3T6CqEUVaAIoogSwEqJ - CqEg4ls6GFPQnf4KCuSCAqHxcJhFFdwyjqeenlMRLbqQSuondGBqUAWdoNbEqyeiowFsGcR5kDq+8Mqr - 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 - 9Pba8v5m6Px+6vqQ6viW6viU6vaW6PTq8vyA6PqA6Pp45vpu5viG5v5c5P5I5PxC4vpu5PpQ4vw23vpC - 4Pwu3vrN8/wk3P4Q2v4O2v4M2v4K2vjO8vbU8f424PbO8Py+8vjJ8PbK8Pq/8f494fjE8P5I4vi88Pq6 - 8Py48vq28P6m8vy08Pyw8Pys8Pyo8P6m8Pym8P6d8P596v5u6P526PqH6Ppg4viO6PiC5vp86Pp05vpS - 4vpK4P6G7Pqm7fyW7PyE7PyC6vxu5/xN4vw83vww3vwm3Pp66PyI7P6P7fyK6v6a7viz7va67PTI7vTA - 7Piq7PqU6viY6vam6vxk5fig7Pqc7Pic6v5e5vxg5f5a5Pqe7Ppd4vqg7Pxa5Pqq7v5U5P5S5Pis7Pqs - 7v5Q5Pqw7v5O5P5M5Pwy3v5K5Pi27v648/xF4f78/Pa67v76/v76/PbA7vw84PpU4vw63vTO7vxU5Ppi - 4vpm5Pzu+v7a+PxW4vpq5P4k3vuf7f4i3Pqa7Paw7P4g3P4e3P4c3PyZ7v4a3v4a3Pin7P669Pzg9/6+ - 9PyS7Piw7P7K9fLq8vrb9fzK9Pbs9Pp+5vjv9/404Pjn9fbq9P5G4v6t8fx36P6Y7vz2+/z7/PzW9vr2 - +vb29vXy9PTw8vro+PTm8vjf9Pbg9PrU9PjX8/bV8vbS8PzA9PjE8vrF8vi+8Pq78fy68vq48Pyy8v6k - 8AAAAAj+AAMIHEiwoMGDCBMKZFCixYAW69ApnEixosWLGAWSIAQOXBB2EjOKHEkyIzoJDlI66DGhpMuX - MAVOgKTSAZqWMXPqrEiipgMdDHYKHVqQnU+gRJMiRMeAAc6LJo4GNTkhpFKLExKRIpXoacWoNZFeRKfo - 1jgh665aDIWmLZpQGMGqFFsRHaACeAtcYGBV7UF0BNyicQMDqtSLZ5zlLQC0r9+C6NwIRlPOcUK5KelO - ZHBqcYFmUx8jzDEZDRiLIg5XxOS5wCfLogcqkSwYS2iFqcPevtzL8zMlsROiu1DaVcXcc3f/jdJ6Cuzg - ArsFFkzgG0XkmZUblOHAsw7r0Jf+bip94flA7D+1E2SwoTWS8ArZYZnsZttE9JoPAovm+RYG+AqFUJoV - XhmEn3oClWBIa/gAqBAD5ZTWYEIHCsdMa8MU6GBBM9DmFg3qUKjaQSZ04Vkz8Gyo0ARQlJaIiLohNIEg - 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 - - - \ No newline at end of file From 04714ed6baf4ab9de207f02deb9ff964b98f1ada Mon Sep 17 00:00:00 2001 From: James Friel Date: Mon, 13 Nov 2023 16:05:41 +0000 Subject: [PATCH 08/85] basic datasets tree --- .../WindowManagement/WindowManager.cs | 2 +- .../DatasetsCollectionUI.Designer.cs | 81 +++++++++++ Rdmp.UI/Collections/DatasetsCollectionUI.cs | 133 ++++++++++++++++++ Rdmp.UI/Collections/DatasetsCollectionUI.resx | 120 ++++++++++++++++ Rdmp.UI/Theme/BackColorProvider.cs | 1 + 5 files changed, 336 insertions(+), 1 deletion(-) create mode 100644 Rdmp.UI/Collections/DatasetsCollectionUI.Designer.cs create mode 100644 Rdmp.UI/Collections/DatasetsCollectionUI.cs create mode 100644 Rdmp.UI/Collections/DatasetsCollectionUI.resx diff --git a/Application/ResearchDataManagementPlatform/WindowManagement/WindowManager.cs b/Application/ResearchDataManagementPlatform/WindowManagement/WindowManager.cs index 5f66992bdf..dd424cc953 100644 --- a/Application/ResearchDataManagementPlatform/WindowManagement/WindowManager.cs +++ b/Application/ResearchDataManagementPlatform/WindowManagement/WindowManager.cs @@ -149,7 +149,7 @@ public PersistableToolboxDockContent Create(RDMPCollection collectionToCreate, break; case RDMPCollection.Datasets: - collection = new FavouritesCollectionUI(); + collection = new DatasetsCollectionUI(); toReturn = Show(RDMPCollection.Datasets, collection, "Datasets", Image.Load(CatalogueIcons.Favourite)); break; diff --git a/Rdmp.UI/Collections/DatasetsCollectionUI.Designer.cs b/Rdmp.UI/Collections/DatasetsCollectionUI.Designer.cs new file mode 100644 index 0000000000..b2ec676936 --- /dev/null +++ b/Rdmp.UI/Collections/DatasetsCollectionUI.Designer.cs @@ -0,0 +1,81 @@ +namespace Rdmp.UI.Collections +{ + partial class DatasetsCollectionUI + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.tlvDatasets = new BrightIdeasSoftware.TreeListView(); + this.olvName = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); + ((System.ComponentModel.ISupportInitialize)(this.tlvDatasets)).BeginInit(); + this.SuspendLayout(); + // + // tlvFavourites + // + this.tlvDatasets.AllColumns.Add(this.olvName); + this.tlvDatasets.CellEditUseWholeCell = false; + this.tlvDatasets.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.olvName}); + this.tlvDatasets.Cursor = System.Windows.Forms.Cursors.Default; + this.tlvDatasets.Dock = System.Windows.Forms.DockStyle.Fill; + this.tlvDatasets.FullRowSelect = true; + this.tlvDatasets.HideSelection = false; + this.tlvDatasets.Location = new System.Drawing.Point(0, 0); + this.tlvDatasets.Name = "tlvFavourites"; + this.tlvDatasets.ShowGroups = false; + this.tlvDatasets.Size = new System.Drawing.Size(322, 557); + this.tlvDatasets.TabIndex = 2; + this.tlvDatasets.UseCompatibleStateImageBehavior = false; + this.tlvDatasets.View = System.Windows.Forms.View.Details; + this.tlvDatasets.VirtualMode = true; + // + // olvName + // + this.olvName.AspectName = "ToString"; + this.olvName.CellEditUseWholeCell = true; + this.olvName.Text = "Datasets"; + this.olvName.MinimumWidth = 100; + // + // FavouritesCollectionUI + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.tlvDatasets); + this.Name = "DatasetsCollectionUI"; + this.Size = new System.Drawing.Size(322, 557); + ((System.ComponentModel.ISupportInitialize)(this.tlvDatasets)).EndInit(); + this.ResumeLayout(false); + this.Text = "DatasetsCollectionUI"; + } + + #endregion + + private BrightIdeasSoftware.TreeListView tlvDatasets; + private BrightIdeasSoftware.OLVColumn olvName; + } +} \ No newline at end of file diff --git a/Rdmp.UI/Collections/DatasetsCollectionUI.cs b/Rdmp.UI/Collections/DatasetsCollectionUI.cs new file mode 100644 index 0000000000..df2dfdcbd3 --- /dev/null +++ b/Rdmp.UI/Collections/DatasetsCollectionUI.cs @@ -0,0 +1,133 @@ +using Rdmp.Core.CommandExecution.AtomicCommands; +using Rdmp.Core.Curation.Data.Cohort; +using Rdmp.Core; +using Rdmp.Core.MapsDirectlyToDatabaseTable; +using Rdmp.UI.CommandExecution.AtomicCommands; +using Rdmp.UI.ItemActivation; +using Rdmp.UI.Refreshing; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Rdmp.Core.Curation.Data; + +namespace Rdmp.UI.Collections +{ + public partial class DatasetsCollectionUI : RDMPCollectionUI, ILifetimeSubscriber + { + + private List _datasets = new(); + private bool _firstTime = true; + + public DatasetsCollectionUI() + { + InitializeComponent(); + } + + public override void SetItemActivator(IActivateItems activator) + { + base.SetItemActivator(activator); + + CommonTreeFunctionality.SetUp(RDMPCollection.Datasets, tlvDatasets, Activator, olvName, olvName, + new RDMPCollectionCommonFunctionalitySettings()); + //CommonTreeFunctionality.AxeChildren = new Type[] { typeof(CohortIdentificationConfiguration) }; + //CommonTreeFunctionality.WhitespaceRightClickMenuCommandsGetter = + // a => new IAtomicCommand[] + // { + // new ExecuteCommandAddFavourite(a), + // new ExecuteCommandClearFavourites(a) + // }; + Activator.RefreshBus.EstablishLifetimeSubscription(this); + + RefreshFavourites(); + + if (_firstTime) + { + CommonTreeFunctionality.SetupColumnTracking(olvName, new Guid("f8b0481e-378c-4996-9400-cb039c2efc5c")); + _firstTime = false; + } + } + + public void RefreshBus_RefreshObject(object sender, RefreshObjectEventArgs e) + { + RefreshFavourites(); + } + + private void RefreshFavourites() + { + var actualRootFavourites = FindRootObjects(Activator, IncludeObject); + + //no change in root favouratism + if (_datasets.SequenceEqual(actualRootFavourites)) + return; + + //remove old objects + foreach (var unfavourited in _datasets.Except(actualRootFavourites)) + tlvDatasets.RemoveObject(unfavourited); + + //add new objects + foreach (var newFavourite in actualRootFavourites.Except(_datasets)) + tlvDatasets.AddObject(newFavourite); + + //update to the new list + _datasets = actualRootFavourites; + tlvDatasets.RebuildAll(true); + } + + + /// + /// Returns all root objects in RDMP that match the . Handles unpicking tree collisions e.g. where matches 2 objects with one being the child of the other + /// + /// + /// + /// + public static List FindRootObjects(IActivateItems activator, + Func condition) + { + var datasets = + activator.RepositoryLocator.CatalogueRepository.GetAllObjects(); + + //var hierarchyCollisions = new List(); + + ////find hierarchy collisions (shared hierarchy in which one Favourite object includes a tree of objects some of which are Favourited). For this only display the parent + //foreach (var currentFavourite in potentialRootFavourites) + //{ + // //current favourite is an absolute root object Type (no parents) + // if (currentFavourite.Value == null) + // continue; + + // //if any of the current favourites parents + // foreach (var parent in currentFavourite.Value.Parents) + // //are favourites + // if (potentialRootFavourites.Any(kvp => kvp.Key.Equals(parent))) + // //then this is not a favourite it's a collision (already favourited under another node) + // hierarchyCollisions.Add(currentFavourite.Key); + //} + + var actualRootFavourites = new List(); + + foreach (var currentFavourite in datasets) + actualRootFavourites.Add(currentFavourite); + + return actualRootFavourites; + } + + + /// + /// Return true if the object should be displayed in this pane + /// + /// + /// + protected virtual bool IncludeObject(IMapsDirectlyToDatabaseTable key) => + Activator.RepositoryLocator.CatalogueRepository.GetAllObjects().Contains(key); + + public static bool IsRootObject(IActivateItems activator, object root) => + //never favourite + false; + } +} diff --git a/Rdmp.UI/Collections/DatasetsCollectionUI.resx b/Rdmp.UI/Collections/DatasetsCollectionUI.resx new file mode 100644 index 0000000000..1af7de150c --- /dev/null +++ b/Rdmp.UI/Collections/DatasetsCollectionUI.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Rdmp.UI/Theme/BackColorProvider.cs b/Rdmp.UI/Theme/BackColorProvider.cs index 9ee383ff89..8e61ecd7d5 100644 --- a/Rdmp.UI/Theme/BackColorProvider.cs +++ b/Rdmp.UI/Theme/BackColorProvider.cs @@ -29,6 +29,7 @@ public static Color GetColor(RDMPCollection collection) RDMPCollection.Favourites => SystemColors.Control, RDMPCollection.Cohort => Color.FromArgb(210, 240, 255), RDMPCollection.DataLoad => Color.DarkGray, + RDMPCollection.Datasets => Color.PaleVioletRed, _ => throw new ArgumentOutOfRangeException(nameof(collection)) }; } From b1d3ba1e6be87d1bfc2715c72fe5430a85410cea Mon Sep 17 00:00:00 2001 From: James Friel Date: Mon, 13 Nov 2023 16:25:17 +0000 Subject: [PATCH 09/85] tidy up --- Rdmp.UI/Collections/DatasetsCollectionUI.cs | 29 --------------------- 1 file changed, 29 deletions(-) diff --git a/Rdmp.UI/Collections/DatasetsCollectionUI.cs b/Rdmp.UI/Collections/DatasetsCollectionUI.cs index df2dfdcbd3..e3c3da72fc 100644 --- a/Rdmp.UI/Collections/DatasetsCollectionUI.cs +++ b/Rdmp.UI/Collections/DatasetsCollectionUI.cs @@ -62,18 +62,6 @@ private void RefreshFavourites() { var actualRootFavourites = FindRootObjects(Activator, IncludeObject); - //no change in root favouratism - if (_datasets.SequenceEqual(actualRootFavourites)) - return; - - //remove old objects - foreach (var unfavourited in _datasets.Except(actualRootFavourites)) - tlvDatasets.RemoveObject(unfavourited); - - //add new objects - foreach (var newFavourite in actualRootFavourites.Except(_datasets)) - tlvDatasets.AddObject(newFavourite); - //update to the new list _datasets = actualRootFavourites; tlvDatasets.RebuildAll(true); @@ -92,23 +80,6 @@ public static List FindRootObjects(IActivateItems var datasets = activator.RepositoryLocator.CatalogueRepository.GetAllObjects(); - //var hierarchyCollisions = new List(); - - ////find hierarchy collisions (shared hierarchy in which one Favourite object includes a tree of objects some of which are Favourited). For this only display the parent - //foreach (var currentFavourite in potentialRootFavourites) - //{ - // //current favourite is an absolute root object Type (no parents) - // if (currentFavourite.Value == null) - // continue; - - // //if any of the current favourites parents - // foreach (var parent in currentFavourite.Value.Parents) - // //are favourites - // if (potentialRootFavourites.Any(kvp => kvp.Key.Equals(parent))) - // //then this is not a favourite it's a collision (already favourited under another node) - // hierarchyCollisions.Add(currentFavourite.Key); - //} - var actualRootFavourites = new List(); foreach (var currentFavourite in datasets) From 8044789c8e4cbebf06eb90aa86565a2b3009d11b Mon Sep 17 00:00:00 2001 From: James Friel Date: Tue, 14 Nov 2023 08:56:08 +0000 Subject: [PATCH 10/85] add stub proposal --- .../ProposeExecutionWhenTargetIsDataset.cs | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 Rdmp.UI/CommandExecution/Proposals/ProposeExecutionWhenTargetIsDataset.cs diff --git a/Rdmp.UI/CommandExecution/Proposals/ProposeExecutionWhenTargetIsDataset.cs b/Rdmp.UI/CommandExecution/Proposals/ProposeExecutionWhenTargetIsDataset.cs new file mode 100644 index 0000000000..dffd9eb984 --- /dev/null +++ b/Rdmp.UI/CommandExecution/Proposals/ProposeExecutionWhenTargetIsDataset.cs @@ -0,0 +1,38 @@ +// Copyright (c) The University of Dundee 2018-2019 +// This file is part of the Research Data Management Platform (RDMP). +// RDMP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. +// RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with RDMP. If not, see . + +using Rdmp.Core.CommandExecution; +using Rdmp.Core.Curation.Data; +using Rdmp.Core.Curation.Data.Cohort; +using Rdmp.UI.ItemActivation; +using Rdmp.UI.SubComponents; +using System; + +namespace Rdmp.UI.CommandExecution.Proposals; + +internal class + ProposeExecutionWhenTargetIsDataset : RDMPCommandExecutionProposal< + Dataset> +{ + public ProposeExecutionWhenTargetIsDataset(IActivateItems itemActivator) : base( + itemActivator) + { + } + + public override bool CanActivate(Dataset target) => true; + + public override void Activate(Dataset target) + { + var x = 1 + 1; + Console.WriteLine(x); + //ItemActivator.Activate(target); + } + + public override ICommandExecution ProposeExecution(ICombineToMakeCommand cmd, + Dataset target, + InsertOption insertOption = InsertOption.Default) => + null; +} \ No newline at end of file From ef8ca1c65c842dcc7353c1789bf93692eb2df5b4 Mon Sep 17 00:00:00 2001 From: James Friel Date: Tue, 14 Nov 2023 13:41:03 +0000 Subject: [PATCH 11/85] render dataset tree --- Rdmp.UI/Collections/DatasetsCollectionUI.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Rdmp.UI/Collections/DatasetsCollectionUI.cs b/Rdmp.UI/Collections/DatasetsCollectionUI.cs index e3c3da72fc..da142923f0 100644 --- a/Rdmp.UI/Collections/DatasetsCollectionUI.cs +++ b/Rdmp.UI/Collections/DatasetsCollectionUI.cs @@ -64,6 +64,9 @@ private void RefreshFavourites() //update to the new list _datasets = actualRootFavourites; + //tlvCohortUsage.AddObjects(dx.ExtractionConfigurations.Where(e => e.Cohort_ID == _extractableCohort.ID) + //.ToArray()); + tlvDatasets.AddObjects(_datasets.ToArray()); tlvDatasets.RebuildAll(true); } From 75a3a56ec4c32d433db425612f56e5a5a93cdef4 Mon Sep 17 00:00:00 2001 From: James Friel Date: Tue, 14 Nov 2023 15:59:35 +0000 Subject: [PATCH 12/85] added ui flow --- .../ExecuteCommandCreateDataset.cs | 11 +- Rdmp.Core/Curation/Data/Dataset.cs | 12 +- .../up/077_AddDataSetMapping.sql | 4 +- Rdmp.UI/Collections/DatasetsCollectionUI.cs | 14 +- .../ExecuteCommandCreateNewDatasetUI.cs | 32 ++++ .../Datasets/CreateNewDatasetUI.Designer.cs | 139 ++++++++++++++++++ .../Datasets/CreateNewDatasetUI.cs | 47 ++++++ .../Datasets/CreateNewDatasetUI.resx | 120 +++++++++++++++ 8 files changed, 368 insertions(+), 11 deletions(-) create mode 100644 Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandCreateNewDatasetUI.cs create mode 100644 Rdmp.UI/SimpleDialogs/Datasets/CreateNewDatasetUI.Designer.cs create mode 100644 Rdmp.UI/SimpleDialogs/Datasets/CreateNewDatasetUI.cs create mode 100644 Rdmp.UI/SimpleDialogs/Datasets/CreateNewDatasetUI.resx diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs index ed8b42772b..5601ffe9b5 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs @@ -17,17 +17,24 @@ public class ExecuteCommandCreateDataset : BasicCommandExecution private string _doi; private string _name; - public ExecuteCommandCreateDataset(IBasicActivateItems activator, string name, string doi = null) : base(activator) + private string _source; + + public ExecuteCommandCreateDataset(IBasicActivateItems basicActivator) : base(basicActivator) + { + } + + public ExecuteCommandCreateDataset(IBasicActivateItems activator, string name, string doi = null,string source = null) : base(activator) { _name = name; _doi = doi; + _source = source; } public override void Execute() { base.Execute(); - var dataset = new Dataset(BasicActivator.RepositoryLocator.CatalogueRepository, _name) { DigitalObjectIdentifier = _doi }; + var dataset = new Dataset(BasicActivator.RepositoryLocator.CatalogueRepository, _name) { DigitalObjectIdentifier = _doi, Source = _source }; dataset.SaveToDatabase(); } } \ No newline at end of file diff --git a/Rdmp.Core/Curation/Data/Dataset.cs b/Rdmp.Core/Curation/Data/Dataset.cs index b61a33002a..f573944121 100644 --- a/Rdmp.Core/Curation/Data/Dataset.cs +++ b/Rdmp.Core/Curation/Data/Dataset.cs @@ -1,4 +1,5 @@ -using Rdmp.Core.MapsDirectlyToDatabaseTable.Attributes; +using Amazon.Auth.AccessControlPolicy; +using Rdmp.Core.MapsDirectlyToDatabaseTable.Attributes; using Rdmp.Core.Repositories; using System; using System.Collections.Generic; @@ -12,6 +13,7 @@ public class Dataset : DatabaseEntity, IDataset { string _name; string _digitalObjectIdentifier; + string _source; [Unique] public string Name @@ -27,6 +29,12 @@ public string DigitalObjectIdentifier set => SetField(ref _digitalObjectIdentifier, value); } + public string Source + { + get => _source; + set => SetField(ref _source, value); + } + public override string ToString() => Name; @@ -43,5 +51,7 @@ internal Dataset(ICatalogueRepository repository, DbDataReader r) Name = r["Name"].ToString(); if (r["DigitalObjectIdentifier"] != DBNull.Value) DigitalObjectIdentifier = r["DigitalObjectIdentifier"].ToString(); + if (r["Source"] != DBNull.Value) + Source = r["Source"].ToString(); } } \ No newline at end of file diff --git a/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql b/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql index 233c7a7efd..bd353fa463 100644 --- a/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql +++ b/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql @@ -6,7 +6,9 @@ if not exists(select 1 from sys.columns where object_id = OBJECT_ID('Dataset')) CREATE TABLE [dbo].Dataset( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [varchar](256) NOT NULL, - [DigitalObjectIdentifier] [varchar](256) NULL, CONSTRAINT [PK_Dataset] PRIMARY KEY CLUSTERED + [DigitalObjectIdentifier] [varchar](256) NULL, + [Source] [varchar](256) NULL, + CONSTRAINT [PK_Dataset] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] diff --git a/Rdmp.UI/Collections/DatasetsCollectionUI.cs b/Rdmp.UI/Collections/DatasetsCollectionUI.cs index da142923f0..b063ee9dda 100644 --- a/Rdmp.UI/Collections/DatasetsCollectionUI.cs +++ b/Rdmp.UI/Collections/DatasetsCollectionUI.cs @@ -36,12 +36,12 @@ public override void SetItemActivator(IActivateItems activator) CommonTreeFunctionality.SetUp(RDMPCollection.Datasets, tlvDatasets, Activator, olvName, olvName, new RDMPCollectionCommonFunctionalitySettings()); //CommonTreeFunctionality.AxeChildren = new Type[] { typeof(CohortIdentificationConfiguration) }; - //CommonTreeFunctionality.WhitespaceRightClickMenuCommandsGetter = - // a => new IAtomicCommand[] - // { - // new ExecuteCommandAddFavourite(a), - // new ExecuteCommandClearFavourites(a) - // }; + CommonTreeFunctionality.WhitespaceRightClickMenuCommandsGetter = + a => new IAtomicCommand[] + { + new ExecuteCommandCreateNewDatasetUI(Activator) + { OverrideCommandName = "Add New Dataset", Weight = -50.9f }, + }; Activator.RefreshBus.EstablishLifetimeSubscription(this); RefreshFavourites(); @@ -86,7 +86,7 @@ public static List FindRootObjects(IActivateItems var actualRootFavourites = new List(); foreach (var currentFavourite in datasets) - actualRootFavourites.Add(currentFavourite); + actualRootFavourites.Add(currentFavourite); return actualRootFavourites; } diff --git a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandCreateNewDatasetUI.cs b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandCreateNewDatasetUI.cs new file mode 100644 index 0000000000..1b01aa5a61 --- /dev/null +++ b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandCreateNewDatasetUI.cs @@ -0,0 +1,32 @@ +// Copyright (c) The University of Dundee 2018-2019 +// This file is part of the Research Data Management Platform (RDMP). +// RDMP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. +// RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with RDMP. If not, see . + +using System.IO; +using Rdmp.Core.CommandExecution; +using Rdmp.Core.CommandExecution.AtomicCommands; +using Rdmp.Core.CommandExecution.AtomicCommands.CatalogueCreationCommands; +using Rdmp.UI.ItemActivation; +using Rdmp.UI.SimpleDialogs.Datasets; +using Rdmp.UI.SimpleDialogs.SimpleFileImporting; + +namespace Rdmp.UI.CommandExecution.AtomicCommands; + +public class ExecuteCommandCreateNewDatasetUI : ExecuteCommandCreateDataset +{ + private readonly IActivateItems _activator; + + public ExecuteCommandCreateNewDatasetUI(IActivateItems activator) : base( + activator) + { + _activator = activator; + } + + public override void Execute() + { + var ui = new CreateNewDatasetUI(_activator, this); + ui.ShowDialog(); + } +} \ No newline at end of file diff --git a/Rdmp.UI/SimpleDialogs/Datasets/CreateNewDatasetUI.Designer.cs b/Rdmp.UI/SimpleDialogs/Datasets/CreateNewDatasetUI.Designer.cs new file mode 100644 index 0000000000..1b07484472 --- /dev/null +++ b/Rdmp.UI/SimpleDialogs/Datasets/CreateNewDatasetUI.Designer.cs @@ -0,0 +1,139 @@ +namespace Rdmp.UI.SimpleDialogs.Datasets +{ + partial class CreateNewDatasetUI + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + tbName = new System.Windows.Forms.TextBox(); + label1 = new System.Windows.Forms.Label(); + tbDOI = new System.Windows.Forms.TextBox(); + label2 = new System.Windows.Forms.Label(); + label3 = new System.Windows.Forms.Label(); + tbSource = new System.Windows.Forms.TextBox(); + btnCancel = new System.Windows.Forms.Button(); + btnCreate = new System.Windows.Forms.Button(); + SuspendLayout(); + // + // tbName + // + tbName.Location = new System.Drawing.Point(64, 75); + tbName.Name = "tbName"; + tbName.Size = new System.Drawing.Size(301, 23); + tbName.TabIndex = 0; + // + // label1 + // + label1.AutoSize = true; + label1.Location = new System.Drawing.Point(66, 52); + label1.Name = "label1"; + label1.Size = new System.Drawing.Size(113, 15); + label1.TabIndex = 1; + label1.Text = "1. Name the Dataset"; + // + // tbDOI + // + tbDOI.Location = new System.Drawing.Point(64, 142); + tbDOI.Name = "tbDOI"; + tbDOI.Size = new System.Drawing.Size(301, 23); + tbDOI.TabIndex = 2; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new System.Drawing.Point(64, 124); + label2.Name = "label2"; + label2.Size = new System.Drawing.Size(106, 15); + label2.TabIndex = 3; + label2.Text = "2. What is the DOI?"; + // + // label3 + // + label3.AutoSize = true; + label3.Location = new System.Drawing.Point(66, 185); + label3.Name = "label3"; + label3.Size = new System.Drawing.Size(200, 15); + label3.TabIndex = 4; + label3.Text = "3. What is the Source of this Dataset?"; + // + // tbSource + // + tbSource.Location = new System.Drawing.Point(64, 203); + tbSource.Name = "tbSource"; + tbSource.Size = new System.Drawing.Size(301, 23); + tbSource.TabIndex = 5; + // + // btnCancel + // + btnCancel.Location = new System.Drawing.Point(191, 270); + btnCancel.Name = "btnCancel"; + btnCancel.Size = new System.Drawing.Size(75, 23); + btnCancel.TabIndex = 6; + btnCancel.Text = "Cancel"; + btnCancel.UseVisualStyleBackColor = true; + btnCancel.Click += btnCancel_Click; + // + // btnCreate + // + btnCreate.Location = new System.Drawing.Point(290, 270); + btnCreate.Name = "btnCreate"; + btnCreate.Size = new System.Drawing.Size(75, 23); + btnCreate.TabIndex = 7; + btnCreate.Text = "Create"; + btnCreate.UseVisualStyleBackColor = true; + btnCreate.Click += btnCreate_Click; + // + // CreateNewDatasetUI + // + AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + ClientSize = new System.Drawing.Size(425, 346); + Controls.Add(btnCreate); + Controls.Add(btnCancel); + Controls.Add(tbSource); + Controls.Add(label3); + Controls.Add(label2); + Controls.Add(tbDOI); + Controls.Add(label1); + Controls.Add(tbName); + Name = "CreateNewDatasetUI"; + Text = "Create a new Dataset"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private System.Windows.Forms.TextBox tbName; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox tbDOI; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox tbSource; + private System.Windows.Forms.Button btnCancel; + private System.Windows.Forms.Button btnCreate; + } +} \ No newline at end of file diff --git a/Rdmp.UI/SimpleDialogs/Datasets/CreateNewDatasetUI.cs b/Rdmp.UI/SimpleDialogs/Datasets/CreateNewDatasetUI.cs new file mode 100644 index 0000000000..f32512a81a --- /dev/null +++ b/Rdmp.UI/SimpleDialogs/Datasets/CreateNewDatasetUI.cs @@ -0,0 +1,47 @@ +using Rdmp.Core.CommandExecution.AtomicCommands; +using Rdmp.UI.CommandExecution.AtomicCommands; +using Rdmp.UI.ItemActivation; +using Rdmp.UI.TestsAndSetup.ServicePropogation; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Rdmp.UI.SimpleDialogs.Datasets +{ + public partial class CreateNewDatasetUI : RDMPForm + { + private IActivateItems _activator; + public CreateNewDatasetUI(IActivateItems activator, ExecuteCommandCreateNewDatasetUI command) : base(activator) + { + _activator = activator; + InitializeComponent(); + + } + + private void CreateNewDatasetUI_Load(object sender, EventArgs e) + { + + } + + private void btnCancel_Click(object sender, EventArgs e) + { + Close(); + } + + private void btnCreate_Click(object sender, EventArgs e) + { + + var cmd = new ExecuteCommandCreateDataset(_activator,tbName.Text,tbDOI.Text,tbSource.Text); + cmd.Execute(); + Close(); + } + + + } +} diff --git a/Rdmp.UI/SimpleDialogs/Datasets/CreateNewDatasetUI.resx b/Rdmp.UI/SimpleDialogs/Datasets/CreateNewDatasetUI.resx new file mode 100644 index 0000000000..af32865ec1 --- /dev/null +++ b/Rdmp.UI/SimpleDialogs/Datasets/CreateNewDatasetUI.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file From c2d0fc30920830e406b56ca821579449d8c94e75 Mon Sep 17 00:00:00 2001 From: James Friel Date: Tue, 14 Nov 2023 16:31:58 +0000 Subject: [PATCH 13/85] working word export --- .../up/077_AddDataSetMapping.sql | 2 +- .../Reports/ExtractionTime/WordDataWriter.cs | 24 +++++++ Rdmp.UI/SimpleDialogs/SelectDialog`1.resx | 63 +++++++++++++++++++ 3 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 Rdmp.UI/SimpleDialogs/SelectDialog`1.resx diff --git a/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql b/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql index bd353fa463..18e0b2ff2d 100644 --- a/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql +++ b/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql @@ -16,7 +16,7 @@ CREATE TABLE [dbo].Dataset( if not exists (select 1 from sys.columns where name = 'Dataset' AND object_id = OBJECT_ID('ColumnInfo')) begin -ALTER TABLE [dbo].[ColumnInfo] ADD Dataset_ID [int] NULL +ALTER TABLE [dbo].[ColumnInfo] ADD Dataset_ID [int] NULLRes end begin ALTER TABLE [dbo].[ColumnInfo] WITH CHECK ADD CONSTRAINT [FK_Column_Info_Dataset] FOREIGN KEY([Dataset_ID]) diff --git a/Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs b/Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs index 801da15e83..8d1e5ad888 100644 --- a/Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs +++ b/Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs @@ -72,6 +72,23 @@ public void GenerateWordFile() var rowCount = _destination.GeneratesFiles ? 10 : 5; + List foundDatasets = new(); + foreach( var col in Executer.Source.Request.ColumnsToExtract) + { + var colInfo = col.ColumnInfo; + if(colInfo.Dataset_ID > 0) + { + foundDatasets.Add(colInfo.Dataset_ID); + } + } + string datasetString = ""; + if(foundDatasets.Count > 0) + { + rowCount++; + datasetString = $"This data was generated in part from proexisting datasets...TODO"; + } + + var t = InsertTable(document, rowCount, 2); var rownum = 0; @@ -144,6 +161,13 @@ public void GenerateWordFile() CreateValidationResultsTable(document); } + if(foundDatasets.Count >0) + { + SetTableCell(t, rownum, 0, "Datasets USed"); + SetTableCell(t, rownum, 1, datasetString); + rownum++; + } + //if a count of date times seen exists for this extraction create a graph of the counts seen if (Executer.Source.ExtractionTimeTimeCoverageAggregator != null && Executer.Source.ExtractionTimeTimeCoverageAggregator.Buckets.Any()) diff --git a/Rdmp.UI/SimpleDialogs/SelectDialog`1.resx b/Rdmp.UI/SimpleDialogs/SelectDialog`1.resx new file mode 100644 index 0000000000..6252b1ef07 --- /dev/null +++ b/Rdmp.UI/SimpleDialogs/SelectDialog`1.resx @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + \ No newline at end of file From 48fe76748f3c3032d46ed0ed817511899901e7e7 Mon Sep 17 00:00:00 2001 From: James Friel Date: Wed, 15 Nov 2023 09:17:44 +0000 Subject: [PATCH 14/85] working edit page --- .../ExecuteCommandCreateDataset.cs | 2 +- .../ExecuteCommandLinkColumnInfoToDataset.cs | 4 +- .../Dataset/DatasetConfigurationUICommon.cs | 66 ++++++++++ .../ProposeExecutionWhenTargetIsDataset.cs | 4 +- .../DatsetConfigurationUI.Designer.cs | 113 +++++++++++++++++ .../SubComponents/DatsetConfigurationUI.cs | 74 +++++++++++ .../SubComponents/DatsetConfigurationUI.resx | 120 ++++++++++++++++++ 7 files changed, 377 insertions(+), 6 deletions(-) create mode 100644 Rdmp.Core/Dataset/DatasetConfigurationUICommon.cs create mode 100644 Rdmp.UI/SubComponents/DatsetConfigurationUI.Designer.cs create mode 100644 Rdmp.UI/SubComponents/DatsetConfigurationUI.cs create mode 100644 Rdmp.UI/SubComponents/DatsetConfigurationUI.resx diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs index 5601ffe9b5..ebb196ea6a 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs @@ -34,7 +34,7 @@ public ExecuteCommandCreateDataset(IBasicActivateItems activator, string name, s public override void Execute() { base.Execute(); - var dataset = new Dataset(BasicActivator.RepositoryLocator.CatalogueRepository, _name) { DigitalObjectIdentifier = _doi, Source = _source }; + var dataset = new Curation.Data.Dataset(BasicActivator.RepositoryLocator.CatalogueRepository, _name) { DigitalObjectIdentifier = _doi, Source = _source }; dataset.SaveToDatabase(); } } \ No newline at end of file diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataset.cs index b7a2413793..fd964266de 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataset.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataset.cs @@ -11,9 +11,9 @@ namespace Rdmp.Core.CommandExecution.AtomicCommands; public class ExecuteCommandLinkColumnInfoToDataset : BasicCommandExecution { private ColumnInfo _columnInfo; - private Dataset _dataset; + private Curation.Data.Dataset _dataset; private bool _linkAll; - public ExecuteCommandLinkColumnInfoToDataset(IBasicActivateItems activator, ColumnInfo columnInfo, Dataset dataset, bool linkAllOtherColumns = true) : base(activator) + public ExecuteCommandLinkColumnInfoToDataset(IBasicActivateItems activator, ColumnInfo columnInfo, Curation.Data.Dataset dataset, bool linkAllOtherColumns = true) : base(activator) { _columnInfo = columnInfo; _dataset = dataset; diff --git a/Rdmp.Core/Dataset/DatasetConfigurationUICommon.cs b/Rdmp.Core/Dataset/DatasetConfigurationUICommon.cs new file mode 100644 index 0000000000..fcf18dd461 --- /dev/null +++ b/Rdmp.Core/Dataset/DatasetConfigurationUICommon.cs @@ -0,0 +1,66 @@ +// Copyright (c) The University of Dundee 2018-2019 +// This file is part of the Research Data Management Platform (RDMP). +// RDMP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. +// RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with RDMP. If not, see . + +using System; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Rdmp.Core.CohortCreation.Execution; +using Rdmp.Core.CohortCreation.Execution.Joinables; +using Rdmp.Core.CommandExecution; +using Rdmp.Core.Curation.Data; +using Rdmp.Core.Curation.Data.Aggregation; +using Rdmp.Core.Curation.Data.Cohort; +using Rdmp.Core.Curation.Data.Cohort.Joinables; +using Rdmp.Core.MapsDirectlyToDatabaseTable; +using Rdmp.Core.QueryCaching.Aggregation; + +namespace Rdmp.Core.Dataset; + +/// +/// Common methods used by Cohort Builder UI implementations. Eliminates +/// code duplication and makes it possible to add new UI formats later +/// e.g. web/console etc +/// +public class DatasetConfigurationUICommon +{ + //public CohortIdentificationConfiguration Configuration; + + //public ExternalDatabaseServer QueryCachingServer; + //private CohortAggregateContainer _root; + //private CancellationTokenSource _cancelGlobalOperations; + //private ISqlParameter[] _globals; + //public CohortCompilerRunner Runner; + + ///// + ///// User interface layer for modal dialogs, showing Exceptions etc + ///// + //public IBasicActivateItems Activator; + + ///// + ///// Duration in seconds to allow tasks to run for before cancelling + ///// + //public int Timeout = 3000; + + //public CohortCompiler Compiler { get; } + + + + /// + /// User interface layer for modal dialogs, showing Exceptions etc + /// + public IBasicActivateItems Activator; + + public Curation.Data.Dataset Dataset; + + + public DatasetConfigurationUICommon() + { + //Compiler = new CohortCompiler(null); + } + + +} \ No newline at end of file diff --git a/Rdmp.UI/CommandExecution/Proposals/ProposeExecutionWhenTargetIsDataset.cs b/Rdmp.UI/CommandExecution/Proposals/ProposeExecutionWhenTargetIsDataset.cs index dffd9eb984..c17f192170 100644 --- a/Rdmp.UI/CommandExecution/Proposals/ProposeExecutionWhenTargetIsDataset.cs +++ b/Rdmp.UI/CommandExecution/Proposals/ProposeExecutionWhenTargetIsDataset.cs @@ -26,9 +26,7 @@ public ProposeExecutionWhenTargetIsDataset(IActivateItems itemActivator) : base( public override void Activate(Dataset target) { - var x = 1 + 1; - Console.WriteLine(x); - //ItemActivator.Activate(target); + ItemActivator.Activate(target); } public override ICommandExecution ProposeExecution(ICombineToMakeCommand cmd, diff --git a/Rdmp.UI/SubComponents/DatsetConfigurationUI.Designer.cs b/Rdmp.UI/SubComponents/DatsetConfigurationUI.Designer.cs new file mode 100644 index 0000000000..951ede21cc --- /dev/null +++ b/Rdmp.UI/SubComponents/DatsetConfigurationUI.Designer.cs @@ -0,0 +1,113 @@ +namespace Rdmp.UI.SubComponents; + +partial class DatsetConfigurationUI +{ + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + label1 = new System.Windows.Forms.Label(); + tbName = new System.Windows.Forms.TextBox(); + tbDOI = new System.Windows.Forms.TextBox(); + tbSource = new System.Windows.Forms.TextBox(); + label2 = new System.Windows.Forms.Label(); + label3 = new System.Windows.Forms.Label(); + SuspendLayout(); + // + // label1 + // + label1.AutoSize = true; + label1.Location = new System.Drawing.Point(24, 40); + label1.Name = "label1"; + label1.Size = new System.Drawing.Size(81, 15); + label1.TabIndex = 0; + label1.Text = "Dataset Name"; + label1.Click += label1_Click; + // + // tbName + // + tbName.Location = new System.Drawing.Point(27, 65); + tbName.Name = "tbName"; + tbName.Size = new System.Drawing.Size(270, 23); + tbName.TabIndex = 1; + // + // tbDOI + // + tbDOI.Location = new System.Drawing.Point(24, 155); + tbDOI.Name = "tbDOI"; + tbDOI.Size = new System.Drawing.Size(273, 23); + tbDOI.TabIndex = 2; + // + // tbSource + // + tbSource.Location = new System.Drawing.Point(24, 235); + tbSource.Name = "tbSource"; + tbSource.Size = new System.Drawing.Size(273, 23); + tbSource.TabIndex = 3; + // + // label2 + // + label2.AutoSize = true; + label2.Location = new System.Drawing.Point(24, 123); + label2.Name = "label2"; + label2.Size = new System.Drawing.Size(69, 15); + label2.TabIndex = 4; + label2.Text = "Dataset DOI"; + // + // label3 + // + label3.AutoSize = true; + label3.Location = new System.Drawing.Point(28, 202); + label3.Name = "label3"; + label3.Size = new System.Drawing.Size(85, 15); + label3.TabIndex = 5; + label3.Text = "Dataset Source"; + // + // DatsetConfigurationUI + // + AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + ClientSize = new System.Drawing.Size(800, 450); + Controls.Add(label3); + Controls.Add(label2); + Controls.Add(tbSource); + Controls.Add(tbDOI); + Controls.Add(tbName); + Controls.Add(label1); + Name = "DatsetConfigurationUI"; + Text = "DatsetConfigurationUI"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox tbName; + private System.Windows.Forms.TextBox tbDOI; + private System.Windows.Forms.TextBox tbSource; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; +} diff --git a/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs b/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs new file mode 100644 index 0000000000..e824aee76e --- /dev/null +++ b/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs @@ -0,0 +1,74 @@ +using Rdmp.Core.Curation.Data.Cohort; +using Rdmp.UI.TestsAndSetup.ServicePropogation; +using Rdmp.UI; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Rdmp.UI.Refreshing; +using static Azure.Core.HttpHeader; +using Rdmp.Core.Dataset; +using Rdmp.Core.Curation.Data; +using NPOI.OpenXmlFormats.Dml.Diagram; +using Rdmp.Core.CommandExecution.AtomicCommands.CohortCreationCommands; +using Rdmp.Core.CommandExecution.AtomicCommands; +using Rdmp.Core.Icons.IconProvision; +using Rdmp.Core.ReusableLibraryCode.Icons.IconProvision; +using Rdmp.Core.ReusableLibraryCode.Settings; +using Rdmp.Core; +using Rdmp.UI.Collections; +using Rdmp.UI.CommandExecution.AtomicCommands; +using Rdmp.UI.ItemActivation; + +namespace Rdmp.UI.SubComponents; +public partial class DatsetConfigurationUI : DatsetConfigurationUI_Design, IRefreshBusSubscriber +{ + DatasetConfigurationUICommon Common; + + public DatsetConfigurationUI() + { + InitializeComponent(); + Common = new DatasetConfigurationUICommon(); + } + + public override void SetDatabaseObject(IActivateItems activator, Dataset databaseObject) + { + base.SetDatabaseObject(activator, databaseObject); + Common.Dataset = databaseObject; + //tbName.Text = databaseObject.Name; + //if(databaseObject.DigitalObjectIdentifier is not null) + // tbDOI.Text = databaseObject.DigitalObjectIdentifier.ToString(); + //if(databaseObject.Source is not null) + // tbSource.Text = databaseObject.Source; + + Bind(tbName, "Text", "Name", c => c.Name); + Bind(tbDOI, "Text", "DigitalObjectIdentifier", c => c.DigitalObjectIdentifier); + Bind(tbName, "Text", "Source", c => c.Source); + var s = GetObjectSaverButton(); + s.SetupFor(this, databaseObject, activator); + GetObjectSaverButton()?.Enable(false); + + } + + + public void RefreshBus_RefreshObject(object sender, RefreshObjectEventArgs e) + { + //Common.Activator = Activator; + } + + private void label1_Click(object sender, EventArgs e) + { + + } +} +[TypeDescriptionProvider( + typeof(AbstractControlDescriptionProvider))] +public abstract class + DatsetConfigurationUI_Design : RDMPSingleDatabaseObjectControl +{ +} \ No newline at end of file diff --git a/Rdmp.UI/SubComponents/DatsetConfigurationUI.resx b/Rdmp.UI/SubComponents/DatsetConfigurationUI.resx new file mode 100644 index 0000000000..af32865ec1 --- /dev/null +++ b/Rdmp.UI/SubComponents/DatsetConfigurationUI.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file From 348c6ea1c51bc4cee6766e410cf4f9c9c12aaf95 Mon Sep 17 00:00:00 2001 From: James Friel Date: Wed, 15 Nov 2023 09:31:32 +0000 Subject: [PATCH 15/85] tidy up --- Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs b/Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs index 8d1e5ad888..c513e4e2df 100644 --- a/Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs +++ b/Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs @@ -85,7 +85,7 @@ public void GenerateWordFile() if(foundDatasets.Count > 0) { rowCount++; - datasetString = $"This data was generated in part from proexisting datasets...TODO"; + datasetString = $"This data was generated in part from existing datasets...TODO"; } From 2e13cef56a9bca24dc6930f2a4d22f18e5de573d Mon Sep 17 00:00:00 2001 From: James Friel Date: Thu, 16 Nov 2023 09:29:43 +0000 Subject: [PATCH 16/85] refresh --- .../WindowManagement/TopBar/RDMPTaskBarUI.cs | 4 +- .../ExecuteCommandCreateDataset.cs | 6 +- Rdmp.Core/Curation/Data/Dataset.cs | 19 +++++- .../up/077_AddDataSetMapping.sql | 9 +-- Rdmp.Core/Icons/Dataset.png | Bin 0 -> 726 bytes .../IconProvision/CatalogueIcons.Designer.cs | 15 ++++- .../Icons/IconProvision/CatalogueIcons.resx | 5 +- Rdmp.Core/Icons/IconProvision/RDMPConcept.cs | 3 +- Rdmp.Core/Rdmp.Core.csproj | 1 + Rdmp.UI/Collections/DatasetsCollectionUI.cs | 3 +- Rdmp.UI/SimpleDialogs/SelectDialog`1.resx | 63 ------------------ .../DatsetConfigurationUI.Designer.cs | 2 +- 12 files changed, 51 insertions(+), 79 deletions(-) create mode 100644 Rdmp.Core/Icons/Dataset.png delete mode 100644 Rdmp.UI/SimpleDialogs/SelectDialog`1.resx diff --git a/Application/ResearchDataManagementPlatform/WindowManagement/TopBar/RDMPTaskBarUI.cs b/Application/ResearchDataManagementPlatform/WindowManagement/TopBar/RDMPTaskBarUI.cs index d82920d536..d79e7e9645 100644 --- a/Application/ResearchDataManagementPlatform/WindowManagement/TopBar/RDMPTaskBarUI.cs +++ b/Application/ResearchDataManagementPlatform/WindowManagement/TopBar/RDMPTaskBarUI.cs @@ -51,8 +51,8 @@ public RDMPTaskBarUI() btnTables.Image = CatalogueIcons.TableInfo.ImageToBitmap(); btnTables.BackgroundImage = BackColorProvider.GetBackgroundImage(btnTables.Size, RDMPCollection.Tables); - btnDataSets.Image = CatalogueIcons.LoadMetadata.ImageToBitmap(); - btnDataSets.BackgroundImage = BackColorProvider.GetBackgroundImage(btnDataSets.Size, RDMPCollection.DataLoad); + btnDataSets.Image = CatalogueIcons.Dataset.ImageToBitmap(); + btnDataSets.BackgroundImage = BackColorProvider.GetBackgroundImage(btnDataSets.Size, RDMPCollection.Datasets); btnLoads.Image = CatalogueIcons.LoadMetadata.ImageToBitmap(); btnLoads.BackgroundImage = BackColorProvider.GetBackgroundImage(btnDataSets.Size, RDMPCollection.DataLoad); diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs index ebb196ea6a..8475952da4 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs @@ -18,9 +18,10 @@ public class ExecuteCommandCreateDataset : BasicCommandExecution private string _doi; private string _name; private string _source; - + IBasicActivateItems _activator; public ExecuteCommandCreateDataset(IBasicActivateItems basicActivator) : base(basicActivator) { + _activator = basicActivator; } public ExecuteCommandCreateDataset(IBasicActivateItems activator, string name, string doi = null,string source = null) : base(activator) @@ -28,6 +29,7 @@ public ExecuteCommandCreateDataset(IBasicActivateItems activator, string name, s _name = name; _doi = doi; _source = source; + _activator = activator; } @@ -36,5 +38,7 @@ public override void Execute() base.Execute(); var dataset = new Curation.Data.Dataset(BasicActivator.RepositoryLocator.CatalogueRepository, _name) { DigitalObjectIdentifier = _doi, Source = _source }; dataset.SaveToDatabase(); + _activator.Publish(dataset); + } } \ No newline at end of file diff --git a/Rdmp.Core/Curation/Data/Dataset.cs b/Rdmp.Core/Curation/Data/Dataset.cs index f573944121..83c2fd8a00 100644 --- a/Rdmp.Core/Curation/Data/Dataset.cs +++ b/Rdmp.Core/Curation/Data/Dataset.cs @@ -1,12 +1,17 @@ using Amazon.Auth.AccessControlPolicy; +using Rdmp.Core.Icons.IconProvision; using Rdmp.Core.MapsDirectlyToDatabaseTable.Attributes; using Rdmp.Core.Repositories; +using Rdmp.Core.ReusableLibraryCode.Icons.IconProvision; +using SixLabors.ImageSharp.PixelFormats; +using SixLabors.ImageSharp; using System; using System.Collections.Generic; using System.Data.Common; using System.Linq; using System.Text; using System.Threading.Tasks; +using Rdmp.Core.MapsDirectlyToDatabaseTable; namespace Rdmp.Core.Curation.Data; public class Dataset : DatabaseEntity, IDataset @@ -14,6 +19,16 @@ public class Dataset : DatabaseEntity, IDataset string _name; string _digitalObjectIdentifier; string _source; + private string _folder = FolderHelper.Root; + + /// + [DoNotImportDescriptions] + [UsefulProperty] + public string Folder + { + get => _folder; + set => SetField(ref _folder, FolderHelper.Adjust(value)); + } [Unique] public string Name @@ -42,13 +57,15 @@ public Dataset(ICatalogueRepository catalogueRepository, string name) { catalogueRepository.InsertAndHydrate(this, new Dictionary { - {"Name", name } + {"Name", name }, + {"Folder", _folder } }); } internal Dataset(ICatalogueRepository repository, DbDataReader r) : base(repository, r) { Name = r["Name"].ToString(); + Folder = r["Folder"].ToString(); if (r["DigitalObjectIdentifier"] != DBNull.Value) DigitalObjectIdentifier = r["DigitalObjectIdentifier"].ToString(); if (r["Source"] != DBNull.Value) diff --git a/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql b/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql index 18e0b2ff2d..a34e1c5f7d 100644 --- a/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql +++ b/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql @@ -6,6 +6,7 @@ if not exists(select 1 from sys.columns where object_id = OBJECT_ID('Dataset')) CREATE TABLE [dbo].Dataset( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [varchar](256) NOT NULL, + [Folder] [nvarchar](1000) NOT NULL, [DigitalObjectIdentifier] [varchar](256) NULL, [Source] [varchar](256) NULL, CONSTRAINT [PK_Dataset] PRIMARY KEY CLUSTERED @@ -16,13 +17,9 @@ CREATE TABLE [dbo].Dataset( if not exists (select 1 from sys.columns where name = 'Dataset' AND object_id = OBJECT_ID('ColumnInfo')) begin -ALTER TABLE [dbo].[ColumnInfo] ADD Dataset_ID [int] NULLRes +ALTER TABLE [dbo].[ColumnInfo] ADD Dataset_ID [int] NULL end begin ALTER TABLE [dbo].[ColumnInfo] WITH CHECK ADD CONSTRAINT [FK_Column_Info_Dataset] FOREIGN KEY([Dataset_ID]) REFERENCES [dbo].[Dataset] ([ID]) -end - - ---ALTER TABLE [dbo].[ANOTable] WITH CHECK ADD CONSTRAINT [FK_ANOTable_ExternalDatabaseServer] FOREIGN KEY([Server_ID]) ---REFERENCES [dbo].[ExternalDatabaseServer] ([ID]) \ No newline at end of file +end \ No newline at end of file diff --git a/Rdmp.Core/Icons/Dataset.png b/Rdmp.Core/Icons/Dataset.png new file mode 100644 index 0000000000000000000000000000000000000000..693709cbc1b156839a754e53cbaf409edec69567 GIT binary patch literal 726 zcmV;{0xA88P)T&uF!>{(iS?1OX-eX zKw9bunxR5FrF6QaYs~9>A4#zW^dwIvCpq(+cfR?U`T6-{9LHUqo16RKcDwUVr?cX4 zIN~hJDs48~aRAJ}U_2g=KAB9SP$;0;Y@*$6Ly{z<(`i^NmbL#1W@l#$wOS3;YPBOE zJ;7`?L*?Ga6XzC292wl75}>gDz`(>h?is$JPxm#0jGnotoK|nAVM5$DQ z!C*kO-aeF@+Ejy?nVHEp8V&F~k7BWicsx!aH9kHLRpcQ?L&JFBAB4i&kAaVUxVvzh z3a-EY0%m%8nhI7|SE(QpiBL#sG#VUMM9}*(0mg2(Q$Zq;z|PJNd_Euiem@;jtJN@i za|c2MmsL?PR;yKNwOUA}QuO=7;V@#c7!{~gs?J7hAlsE7U#g?$aRkhSTqLq6iuCu9 z10_j_=;?Dc?4cZ386qH0HkgHTDT|HmGR`W4V2noNQJqfLJEot)q{V_UtsW+m31cP~ zDwWEi3HYBSoF4M;T?VaIdqinn1HZ9}32qs-PdwPbCf+WI6n9jl0-8cjV3%1FB%B&r z+`mzSliyLSH0dxYE}rk&=!uCa*V>()2znj`_XYjtbt>@4FLHnJE|G`xv)Ba@oLBny z1%3K7c4fiB^4{k6E8Pif0kNy62}b@9+ + /// Looks up a localized resource of type Image. + /// + public static Byte[] Dataset + { + get + { + object obj = ResourceManager.GetObject("Dataset", resourceCulture); + return ((Byte[])(obj)); + } + } + /// /// Looks up a localized resource of type Image. /// diff --git a/Rdmp.Core/Icons/IconProvision/CatalogueIcons.resx b/Rdmp.Core/Icons/IconProvision/CatalogueIcons.resx index a3981a1138..c8154eed89 100644 --- a/Rdmp.Core/Icons/IconProvision/CatalogueIcons.resx +++ b/Rdmp.Core/Icons/IconProvision/CatalogueIcons.resx @@ -748,7 +748,10 @@ ..\Memento.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + ..\TableInfoDatabaseNode.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Dataset.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/Rdmp.Core/Icons/IconProvision/RDMPConcept.cs b/Rdmp.Core/Icons/IconProvision/RDMPConcept.cs index 271eef1661..5c3ee77f1d 100644 --- a/Rdmp.Core/Icons/IconProvision/RDMPConcept.cs +++ b/Rdmp.Core/Icons/IconProvision/RDMPConcept.cs @@ -202,5 +202,6 @@ public enum RDMPConcept MutilateDataTables, Commit, Memento, - TableInfoDatabaseNode + TableInfoDatabaseNode, + Dataset } \ No newline at end of file diff --git a/Rdmp.Core/Rdmp.Core.csproj b/Rdmp.Core/Rdmp.Core.csproj index ebf286fa0b..d0316322c0 100644 --- a/Rdmp.Core/Rdmp.Core.csproj +++ b/Rdmp.Core/Rdmp.Core.csproj @@ -327,6 +327,7 @@ + diff --git a/Rdmp.UI/Collections/DatasetsCollectionUI.cs b/Rdmp.UI/Collections/DatasetsCollectionUI.cs index b063ee9dda..d5e546ff3e 100644 --- a/Rdmp.UI/Collections/DatasetsCollectionUI.cs +++ b/Rdmp.UI/Collections/DatasetsCollectionUI.cs @@ -35,7 +35,6 @@ public override void SetItemActivator(IActivateItems activator) CommonTreeFunctionality.SetUp(RDMPCollection.Datasets, tlvDatasets, Activator, olvName, olvName, new RDMPCollectionCommonFunctionalitySettings()); - //CommonTreeFunctionality.AxeChildren = new Type[] { typeof(CohortIdentificationConfiguration) }; CommonTreeFunctionality.WhitespaceRightClickMenuCommandsGetter = a => new IAtomicCommand[] { @@ -66,7 +65,7 @@ private void RefreshFavourites() _datasets = actualRootFavourites; //tlvCohortUsage.AddObjects(dx.ExtractionConfigurations.Where(e => e.Cohort_ID == _extractableCohort.ID) //.ToArray()); - tlvDatasets.AddObjects(_datasets.ToArray()); + tlvDatasets.SetObjects(_datasets.ToArray()); tlvDatasets.RebuildAll(true); } diff --git a/Rdmp.UI/SimpleDialogs/SelectDialog`1.resx b/Rdmp.UI/SimpleDialogs/SelectDialog`1.resx deleted file mode 100644 index 6252b1ef07..0000000000 --- a/Rdmp.UI/SimpleDialogs/SelectDialog`1.resx +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - \ No newline at end of file diff --git a/Rdmp.UI/SubComponents/DatsetConfigurationUI.Designer.cs b/Rdmp.UI/SubComponents/DatsetConfigurationUI.Designer.cs index 951ede21cc..8fb734c793 100644 --- a/Rdmp.UI/SubComponents/DatsetConfigurationUI.Designer.cs +++ b/Rdmp.UI/SubComponents/DatsetConfigurationUI.Designer.cs @@ -43,7 +43,7 @@ private void InitializeComponent() label1.Name = "label1"; label1.Size = new System.Drawing.Size(81, 15); label1.TabIndex = 0; - label1.Text = "Dataset Name"; + label1.Text = "Dataset Name*"; label1.Click += label1_Click; // // tbName From 56d2c0d8e8c60295886149f001c14f2d4704b6ad Mon Sep 17 00:00:00 2001 From: James Friel Date: Thu, 16 Nov 2023 09:36:56 +0000 Subject: [PATCH 17/85] added folder --- .../DatsetConfigurationUI.Designer.cs | 28 +++++++++++++++++-- .../SubComponents/DatsetConfigurationUI.cs | 8 +++++- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/Rdmp.UI/SubComponents/DatsetConfigurationUI.Designer.cs b/Rdmp.UI/SubComponents/DatsetConfigurationUI.Designer.cs index 8fb734c793..0e5fddacfd 100644 --- a/Rdmp.UI/SubComponents/DatsetConfigurationUI.Designer.cs +++ b/Rdmp.UI/SubComponents/DatsetConfigurationUI.Designer.cs @@ -34,6 +34,8 @@ private void InitializeComponent() tbSource = new System.Windows.Forms.TextBox(); label2 = new System.Windows.Forms.Label(); label3 = new System.Windows.Forms.Label(); + label4 = new System.Windows.Forms.Label(); + tbFolder = new System.Windows.Forms.TextBox(); SuspendLayout(); // // label1 @@ -41,7 +43,7 @@ private void InitializeComponent() label1.AutoSize = true; label1.Location = new System.Drawing.Point(24, 40); label1.Name = "label1"; - label1.Size = new System.Drawing.Size(81, 15); + label1.Size = new System.Drawing.Size(86, 15); label1.TabIndex = 0; label1.Text = "Dataset Name*"; label1.Click += label1_Click; @@ -85,11 +87,29 @@ private void InitializeComponent() label3.TabIndex = 5; label3.Text = "Dataset Source"; // + // label4 + // + label4.AutoSize = true; + label4.Location = new System.Drawing.Point(28, 282); + label4.Name = "label4"; + label4.Size = new System.Drawing.Size(82, 15); + label4.TabIndex = 6; + label4.Text = "Dataset Folder"; + label4.Click += label4_Click; + // + // tbFolder + // + tbFolder.Location = new System.Drawing.Point(24, 314); + tbFolder.Name = "tbFolder"; + tbFolder.Size = new System.Drawing.Size(273, 23); + tbFolder.TabIndex = 7; + // // DatsetConfigurationUI // AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - ClientSize = new System.Drawing.Size(800, 450); + Controls.Add(tbFolder); + Controls.Add(label4); Controls.Add(label3); Controls.Add(label2); Controls.Add(tbSource); @@ -97,7 +117,7 @@ private void InitializeComponent() Controls.Add(tbName); Controls.Add(label1); Name = "DatsetConfigurationUI"; - Text = "DatsetConfigurationUI"; + Size = new System.Drawing.Size(800, 450); ResumeLayout(false); PerformLayout(); } @@ -110,4 +130,6 @@ private void InitializeComponent() private System.Windows.Forms.TextBox tbSource; private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.TextBox tbFolder; } diff --git a/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs b/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs index e824aee76e..9d17d27063 100644 --- a/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs +++ b/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs @@ -49,10 +49,11 @@ public override void SetDatabaseObject(IActivateItems activator, Dataset databas Bind(tbName, "Text", "Name", c => c.Name); Bind(tbDOI, "Text", "DigitalObjectIdentifier", c => c.DigitalObjectIdentifier); Bind(tbName, "Text", "Source", c => c.Source); + Bind(tbFolder, "Text", "Folder", c => c.Folder); var s = GetObjectSaverButton(); s.SetupFor(this, databaseObject, activator); GetObjectSaverButton()?.Enable(false); - + } @@ -65,6 +66,11 @@ private void label1_Click(object sender, EventArgs e) { } + + private void label4_Click(object sender, EventArgs e) + { + + } } [TypeDescriptionProvider( typeof(AbstractControlDescriptionProvider))] From 941f4e7be0c5de09d7863b7aa9fd4a5abcaa63df Mon Sep 17 00:00:00 2001 From: James Friel Date: Thu, 16 Nov 2023 12:05:06 +0000 Subject: [PATCH 18/85] add whole catalogue --- .../ExecuteCommandLinkCatalogueToDataset.cs | 52 +++++++++++++++++ .../up/077_AddDataSetMapping.sql | 11 +--- .../ExecuteCommandLinkCatalogueToDataset.cs | 57 +++++++++++++++++++ Rdmp.UI/Menus/CatalogueMenu.cs | 2 +- 4 files changed, 113 insertions(+), 9 deletions(-) create mode 100644 Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs create mode 100644 Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs new file mode 100644 index 0000000000..ef3c46dd48 --- /dev/null +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs @@ -0,0 +1,52 @@ + + + +using Rdmp.Core.Curation.Data; +using System.Linq; + +namespace Rdmp.Core.CommandExecution.AtomicCommands; + + +//There is not currently any way to run this via the CLI +public class ExecuteCommandLinkCatalogueInfoToDataset : BasicCommandExecution, IAtomicCommand +{ + private Catalogue _catalogue; + private Curation.Data.Dataset _dataset; + private bool _linkAll; + public ExecuteCommandLinkCatalogueInfoToDataset(IBasicActivateItems activator, Catalogue catalogue, Curation.Data.Dataset dataset, bool linkAllOtherColumns = true) : base(activator) + { + _catalogue = catalogue; + _dataset = dataset; + _linkAll = linkAllOtherColumns; + } + + + public override void Execute() + { + base.Execute(); + var items = _catalogue.CatalogueItems.ToList(); + foreach (var item in items) + { + var ci = item.ColumnInfo; + if (ci.Dataset_ID == _dataset.ID) + { + continue; + } + + ci.Dataset_ID = _dataset.ID; + ci.SaveToDatabase(); + if (_linkAll) + { + var databaseName = ci.Name[..ci.Name.LastIndexOf('.')]; + var catalogueItems = ci.CatalogueRepository.GetAllObjects().Where(ci => ci.Name[..ci.Name.LastIndexOf(".")] == databaseName); + foreach (var aci in catalogueItems) + { + aci.Dataset_ID = _dataset.ID; + aci.SaveToDatabase(); + } + } + + } + + } +} \ No newline at end of file diff --git a/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql b/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql index a34e1c5f7d..1943499063 100644 --- a/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql +++ b/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql @@ -14,12 +14,7 @@ CREATE TABLE [dbo].Dataset( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] - -if not exists (select 1 from sys.columns where name = 'Dataset' AND object_id = OBJECT_ID('ColumnInfo')) -begin ALTER TABLE [dbo].[ColumnInfo] ADD Dataset_ID [int] NULL -end -begin -ALTER TABLE [dbo].[ColumnInfo] WITH CHECK ADD CONSTRAINT [FK_Column_Info_Dataset] FOREIGN KEY([Dataset_ID]) -REFERENCES [dbo].[Dataset] ([ID]) -end \ No newline at end of file +-- todo this was causing issues +--ALTER TABLE [dbo].[ColumnInfo] WITH NOCHECK ADD CONSTRAINT [FK_Column_Info_Dataset] FOREIGN KEY([Dataset_ID]) +--REFERENCES [dbo].[Dataset] ([ID]) diff --git a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs new file mode 100644 index 0000000000..40f3f924ec --- /dev/null +++ b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs @@ -0,0 +1,57 @@ +// Copyright (c) The University of Dundee 2018-2019 +// This file is part of the Research Data Management Platform (RDMP). +// RDMP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. +// RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with RDMP. If not, see . + +using System; +using System.Collections.Generic; +using System.Linq; +using Rdmp.Core.CommandExecution; +using Rdmp.Core.CommandExecution.AtomicCommands; +using Rdmp.Core.Curation.Data; +using Rdmp.Core.Curation.Data.Cohort; +using Rdmp.Core.Icons.IconProvision; +using Rdmp.Core.ReusableLibraryCode.Icons.IconProvision; +using Rdmp.UI.ExtractionUIs.JoinsAndLookups; +using Rdmp.UI.ItemActivation; +using Rdmp.UI.SimpleDialogs; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; + +namespace Rdmp.UI.CommandExecution.AtomicCommands; + +public class ExecuteCommandLinkCatalogueToDataSet : BasicUICommandExecution, IAtomicCommand +{ + private readonly Catalogue _catalogue; + private Dataset _selectedDataset; + private IActivateItems _activateItems; + + public ExecuteCommandLinkCatalogueToDataSet(IActivateItems activator, Catalogue catalogue) : base(activator) + { + _catalogue = catalogue; + _activateItems = activator; + } + + public override string GetCommandHelp() => + "TODO"; + + public override void Execute() + { + base.Execute(); + Dataset[] datasets = _activateItems.RepositoryLocator.CatalogueRepository.GetAllObjects(); + DialogArgs da = new() + { + WindowTitle = "Link a dataset with this catalogue", + TaskDescription = + "Select the Dataset that this catalogue information came from" + }; + _selectedDataset = SelectOne(da, datasets); + var backfill = YesNo("Link all other columns that match the source table?", "Do you want to link this dataset to all other columns that reference the same table as this column?"); + var cmd = new ExecuteCommandLinkCatalogueInfoToDataset(_activateItems, _catalogue, _selectedDataset, backfill); + cmd.Execute(); + } + + //public override Image GetImage(IIconProvider iconProvider) => + // iconProvider.GetImage(RDMPConcept.Lookup, OverlayKind.Add); +} \ No newline at end of file diff --git a/Rdmp.UI/Menus/CatalogueMenu.cs b/Rdmp.UI/Menus/CatalogueMenu.cs index e4debe2e5b..d17456d237 100644 --- a/Rdmp.UI/Menus/CatalogueMenu.cs +++ b/Rdmp.UI/Menus/CatalogueMenu.cs @@ -24,7 +24,7 @@ internal class CatalogueMenu : RDMPContextMenuStrip public CatalogueMenu(RDMPContextMenuStripArgs args, Catalogue catalogue) : base(args, catalogue) { var isApiCall = catalogue.IsApiCall(); - + Add(new ExecuteCommandLinkCatalogueToDataSet(_activator, catalogue)); Add(new ExecuteCommandGenerateMetadataReport(_activator, catalogue) { Weight = -99.059f From d9834743ee462c29445b464387ec0a0438ec387d Mon Sep 17 00:00:00 2001 From: James Friel Date: Thu, 16 Nov 2023 14:45:55 +0000 Subject: [PATCH 19/85] ad dhas folder --- Rdmp.Core/Curation/Data/Dataset.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rdmp.Core/Curation/Data/Dataset.cs b/Rdmp.Core/Curation/Data/Dataset.cs index 83c2fd8a00..05806e58f4 100644 --- a/Rdmp.Core/Curation/Data/Dataset.cs +++ b/Rdmp.Core/Curation/Data/Dataset.cs @@ -14,7 +14,7 @@ using Rdmp.Core.MapsDirectlyToDatabaseTable; namespace Rdmp.Core.Curation.Data; -public class Dataset : DatabaseEntity, IDataset +public class Dataset : DatabaseEntity, IDataset, IHasFolder { string _name; string _digitalObjectIdentifier; From d0b40774765b140971c26af00e4df5b88a40e585 Mon Sep 17 00:00:00 2001 From: James Friel Date: Fri, 17 Nov 2023 09:16:20 +0000 Subject: [PATCH 20/85] resx --- Rdmp.UI/SimpleDialogs/SelectDialog`1.resx | 63 +++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 Rdmp.UI/SimpleDialogs/SelectDialog`1.resx diff --git a/Rdmp.UI/SimpleDialogs/SelectDialog`1.resx b/Rdmp.UI/SimpleDialogs/SelectDialog`1.resx new file mode 100644 index 0000000000..6252b1ef07 --- /dev/null +++ b/Rdmp.UI/SimpleDialogs/SelectDialog`1.resx @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + \ No newline at end of file From 54c05d3aa4d36a69d26f3c16457b4478c393da2b Mon Sep 17 00:00:00 2001 From: James Friel Date: Fri, 17 Nov 2023 10:10:20 +0000 Subject: [PATCH 21/85] update work writer --- .../Reports/ExtractionTime/WordDataWriter.cs | 48 +++++++++++++++---- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs b/Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs index c513e4e2df..f6b1ae14a5 100644 --- a/Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs +++ b/Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs @@ -11,6 +11,7 @@ using System.Linq; using System.Text; using NPOI.XWPF.UserModel; +using Rdmp.Core.CommandExecution; using Rdmp.Core.Curation.Data; using Rdmp.Core.DataExport.Data; using Rdmp.Core.DataExport.DataExtraction; @@ -18,6 +19,7 @@ using Rdmp.Core.DataExport.DataExtraction.Pipeline.Destinations; using Rdmp.Core.ReusableLibraryCode; using Rdmp.Core.Validation.Constraints; +using static Rdmp.Core.ReusableLibraryCode.Diff; using IFilter = Rdmp.Core.Curation.Data.IFilter; namespace Rdmp.Core.Reports.ExtractionTime; @@ -53,6 +55,17 @@ public WordDataWriter(ExtractionPipelineUseCase executer) private static readonly object OLockOnWordUsage = new(); private readonly IExecuteDatasetExtractionDestination _destination; + + + private string getDOI(Curation.Data.Dataset ds) + { + if (!string.IsNullOrWhiteSpace(ds.DigitalObjectIdentifier)) + { + return $" (DOI: {ds.DigitalObjectIdentifier})"; + } + return ""; + } + /// /// Generates a new meta data word file in the extraction directory and populates it with information about the extraction. /// It returns the open document as an object so that you can supplement it e.g. with catalogue information @@ -73,19 +86,20 @@ public void GenerateWordFile() var rowCount = _destination.GeneratesFiles ? 10 : 5; List foundDatasets = new(); - foreach( var col in Executer.Source.Request.ColumnsToExtract) + foreach (var col in Executer.Source.Request.ColumnsToExtract) { var colInfo = col.ColumnInfo; - if(colInfo.Dataset_ID > 0) + if (colInfo.Dataset_ID > 0) { - foundDatasets.Add(colInfo.Dataset_ID); + if (!foundDatasets.Contains(colInfo.Dataset_ID)) + { + foundDatasets.Add(colInfo.Dataset_ID); + } } } - string datasetString = ""; - if(foundDatasets.Count > 0) + if (foundDatasets.Count > 0) { rowCount++; - datasetString = $"This data was generated in part from existing datasets...TODO"; } @@ -161,9 +175,27 @@ public void GenerateWordFile() CreateValidationResultsTable(document); } - if(foundDatasets.Count >0) + if (foundDatasets.Count > 0) { - SetTableCell(t, rownum, 0, "Datasets USed"); + var datasets = Executer.Source.Request.Catalogue.Repository.GetAllObjects(); + + string datasetString = ""; + int last = foundDatasets.Last(); + foreach (var ds in foundDatasets) + { + var fullDataset = datasets.FirstOrDefault(d => d.ID == ds); + if (fullDataset != null) + { + datasetString += $"{fullDataset.Name}{getDOI(fullDataset)}"; + if(last != ds) + { + datasetString += ", "; + } + } + } + + + SetTableCell(t, rownum, 0, "Datasets Used"); SetTableCell(t, rownum, 1, datasetString); rownum++; } From 9236164c78a315c7b49de08167b9dfb44a3d4bc9 Mon Sep 17 00:00:00 2001 From: James Friel Date: Fri, 17 Nov 2023 11:17:28 +0000 Subject: [PATCH 22/85] attempt sql update --- .../CatalogueDatabase/up/077_AddDataSetMapping.sql | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql b/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql index 1943499063..3e56c44af2 100644 --- a/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql +++ b/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql @@ -3,6 +3,7 @@ GO -- Create Dataset table if not exists(select 1 from sys.columns where object_id = OBJECT_ID('Dataset')) +BEGIN CREATE TABLE [dbo].Dataset( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [varchar](256) NOT NULL, @@ -14,7 +15,14 @@ CREATE TABLE [dbo].Dataset( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] +END +GO + +IF NOT EXISTS(SELECT 1 FROM sys.columns + WHERE Name = N'Dataset_ID' + AND Object_ID = Object_ID('ColumnInfo')) +BEGIN ALTER TABLE [dbo].[ColumnInfo] ADD Dataset_ID [int] NULL --- todo this was causing issues ---ALTER TABLE [dbo].[ColumnInfo] WITH NOCHECK ADD CONSTRAINT [FK_Column_Info_Dataset] FOREIGN KEY([Dataset_ID]) ---REFERENCES [dbo].[Dataset] ([ID]) +--ALTER TABLE [dbo].[ColumnInfo] ADD CONSTRAINT [FK_Column_Info_Dataset] FOREIGN KEY([Dataset_ID]) REFERENCES [dbo].[Dataset] ([ID]) ON DELETE CASCADE ON UPDATE CASCADE +END +GO \ No newline at end of file From 14b3aec3631844bfc5e2be77397a6abcad787e79 Mon Sep 17 00:00:00 2001 From: James Friel Date: Fri, 17 Nov 2023 12:40:28 +0000 Subject: [PATCH 23/85] update build --- .github/workflows/build.yml | 76 ++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 06cdb36ec1..7aaac779e3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -76,43 +76,43 @@ jobs: dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- createnewexternaldatabaseserver CohortIdentificationQueryCachingServer_ID "DatabaseType:MySQL:Server=127.0.0.1;Uid=root;Pwd=YourStrong!Passw0rd;Database=rdmp_cache" --dir ~/rdmp/rdmp-yaml/ - name: Initialise RDMP run: dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- install --createdatabasetimeout 180 "(localdb)\MSSQLLocalDB" TEST_ -e - # - name: Populate Databases.yaml - # shell: bash - # run: | - # cat > ./Tools/rdmp/Databases.yaml << EOF - # CatalogueConnectionString: Server=(localdb)\MSSQLLocalDB;Database=TEST_Catalogue;Trusted_Connection=True;TrustServerCertificate=true; - # DataExportConnectionString: Server=(localdb)\MSSQLLocalDB;Database=TEST_DataExport;Trusted_Connection=True;TrustServerCertificate=true; - # EOF - # - name: Run integration test scripts - # run: | - # dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/create_list_destroy_catalogue.yaml - # dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/create_cohort.yaml - # dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/create_dataload.yaml - # dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/orphan_extractable_column.yaml - # - name: Test (DB) - # shell: bash - # run: | - # rm -rf coverage - # dotnet test Rdmp.UI.Tests/Rdmp.UI.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov - # mv `find coverage -type f` db-ui.lcov - # dotnet test Rdmp.Core.Tests/Rdmp.Core.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov - # mv `find coverage -type f` db-core.lcov - # - name: Test with local file system - # shell: bash - # run: | - # echo "UseFileSystemRepo: true" >> Tests.Common/TestDatabases.txt - # dotnet test Rdmp.UI.Tests/Rdmp.UI.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov - # mv `find coverage -type f` fs-ui.lcov - # dotnet test Rdmp.Core.Tests/Rdmp.Core.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov - # mv `find coverage -type f` fs-core.lcov - # - name: Merge LCovs - # run: lcov-result-merger "{db,fs}-{ui,core}.lcov" all.lcov - # - name: Coveralls - # uses: coverallsapp/github-action@master - # with: - # github-token: ${{ secrets.github_token }} - # path-to-lcov: all.lcov - # flag-name: unit tests + - name: Populate Databases.yaml + shell: bash + run: | + cat > ./Tools/rdmp/Databases.yaml << EOF + CatalogueConnectionString: Server=(localdb)\MSSQLLocalDB;Database=TEST_Catalogue;Trusted_Connection=True;TrustServerCertificate=true; + DataExportConnectionString: Server=(localdb)\MSSQLLocalDB;Database=TEST_DataExport;Trusted_Connection=True;TrustServerCertificate=true; + EOF + - name: Run integration test scripts + run: | + dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/create_list_destroy_catalogue.yaml + dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/create_cohort.yaml + dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/create_dataload.yaml + dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/orphan_extractable_column.yaml + - name: Test (DB) + shell: bash + run: | + rm -rf coverage + dotnet test Rdmp.UI.Tests/Rdmp.UI.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov + mv `find coverage -type f` db-ui.lcov + dotnet test Rdmp.Core.Tests/Rdmp.Core.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov + mv `find coverage -type f` db-core.lcov + - name: Test with local file system + shell: bash + run: | + echo "UseFileSystemRepo: true" >> Tests.Common/TestDatabases.txt + dotnet test Rdmp.UI.Tests/Rdmp.UI.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov + mv `find coverage -type f` fs-ui.lcov + dotnet test Rdmp.Core.Tests/Rdmp.Core.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov + mv `find coverage -type f` fs-core.lcov + - name: Merge LCovs + run: lcov-result-merger "{db,fs}-{ui,core}.lcov" all.lcov + - name: Coveralls + uses: coverallsapp/github-action@master + with: + github-token: ${{ secrets.github_token }} + path-to-lcov: all.lcov + flag-name: unit tests - name: Package run: | @@ -122,7 +122,7 @@ jobs: - name: Install Plugins shell: bash run: | - for plugin in https://api.github.com/repos/SMI/RdmpDicom/releases/latest + for plugin in https://api.github.com/repos/SMI/RdmpDicom/releases/latest https://api.github.com/repos/HICServices/HicPlugin/releases/latest https://api.github.com/repos/HICServices/RdmpExtensions/releases/latest do PluginName="$(cut -d/ -f6 <<< $plugin)" curl -s $plugin | grep "$pluginName.*nupkg" | cut -d : -f 2,3 | tr -d \" | sed -n '2 p' | xargs curl -O From b44457af7aa02eac2fdce3dd4aa7009cc26c8089 Mon Sep 17 00:00:00 2001 From: James Friel Date: Mon, 20 Nov 2023 08:22:28 +0000 Subject: [PATCH 24/85] add missing file --- Rdmp.Core/Providers/DatasetChildProvider.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 Rdmp.Core/Providers/DatasetChildProvider.cs diff --git a/Rdmp.Core/Providers/DatasetChildProvider.cs b/Rdmp.Core/Providers/DatasetChildProvider.cs new file mode 100644 index 0000000000..628a3d4b40 --- /dev/null +++ b/Rdmp.Core/Providers/DatasetChildProvider.cs @@ -0,0 +1,16 @@ +using Rdmp.Core.Repositories; +using Rdmp.Core.ReusableLibraryCode.Checks; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Rdmp.Core.Providers; +public class DatasetChildProvider : CatalogueChildProvider +{ + public DatasetChildProvider(ICatalogueRepository repository, IChildProvider[] pluginChildProviders, ICheckNotifier errorsCheckNotifier, CatalogueChildProvider previousStateIfKnown) : base(repository, pluginChildProviders, errorsCheckNotifier, previousStateIfKnown) + { + } +} + From 672fc90877b9032034233e9b1cdb2f703b2b91bd Mon Sep 17 00:00:00 2001 From: James Friel Date: Mon, 20 Nov 2023 09:59:09 +0000 Subject: [PATCH 25/85] add delete --- .../ExecuteCommandDeleteDataset.cs | 28 ++++++++++++ Rdmp.Core/Curation/Data/ColumnInfo.cs | 4 +- .../CreateCatalogue.sql | 27 +++++++++++- .../up/077_AddDataSetMapping.sql | 1 - .../Reports/ExtractionTime/WordDataWriter.cs | 4 +- .../ExecuteCommandDeleteDataset.cs | 44 +++++++++++++++++++ .../ExecuteCommandLinkCatalogueToDataset.cs | 6 +-- Rdmp.UI/Menus/DatasetMenu.cs | 18 ++++++++ 8 files changed, 123 insertions(+), 9 deletions(-) create mode 100644 Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs create mode 100644 Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs create mode 100644 Rdmp.UI/Menus/DatasetMenu.cs diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs new file mode 100644 index 0000000000..009656a3f0 --- /dev/null +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs @@ -0,0 +1,28 @@ + +using NPOI.OpenXmlFormats.Dml.WordProcessing; +using Rdmp.Core.Curation.Data; +using System.Linq; + +namespace Rdmp.Core.CommandExecution.AtomicCommands; +public class ExecuteCommandDeleteDataset: BasicCommandExecution, IAtomicCommand +{ + private Curation.Data.Dataset _dataset; + private IBasicActivateItems _activator; +public ExecuteCommandDeleteDataset(IBasicActivateItems activator, Curation.Data.Dataset dataset) + { + _dataset = dataset; + _activator = activator; + } + + public override void Execute() + { + base.Execute(); + var columnItemsLinkedToDataset = _activator.RepositoryLocator.CatalogueRepository.GetAllObjects().Where(cif => cif.Dataset_ID == _dataset.ID); + foreach (var col in columnItemsLinkedToDataset) + { + col.Dataset_ID = null; + col.SaveToDatabase(); + } + _dataset.DeleteInDatabase(); + } +} diff --git a/Rdmp.Core/Curation/Data/ColumnInfo.cs b/Rdmp.Core/Curation/Data/ColumnInfo.cs index 1be2af70b1..c0f192138f 100644 --- a/Rdmp.Core/Curation/Data/ColumnInfo.cs +++ b/Rdmp.Core/Curation/Data/ColumnInfo.cs @@ -297,12 +297,12 @@ public ColumnInfo(ICatalogueRepository repository, string name, string type, ITa ClearAllInjections(); } - private int _datasetID; + private int? _datasetID; /// /// The ID of the dataset this column information came from /// [DoNotExtractProperty] - public int Dataset_ID + public int? Dataset_ID { get => _datasetID; set => SetField(ref _datasetID, value); diff --git a/Rdmp.Core/Databases/CatalogueDatabase/runAfterCreateDatabase/CreateCatalogue.sql b/Rdmp.Core/Databases/CatalogueDatabase/runAfterCreateDatabase/CreateCatalogue.sql index 95818e0d03..222c98e19e 100644 --- a/Rdmp.Core/Databases/CatalogueDatabase/runAfterCreateDatabase/CreateCatalogue.sql +++ b/Rdmp.Core/Databases/CatalogueDatabase/runAfterCreateDatabase/CreateCatalogue.sql @@ -893,6 +893,31 @@ CREATE TABLE [dbo].[TableInfo]( )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] + +GO +/****** Object: Table [dbo],[Dataset] ******/ +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO +SET ANSI_PADDING ON +GO +CREATE TABLE [dbo].Dataset( + [ID] [int] IDENTITY(1,1) NOT NULL, + [Name] [varchar](256) NOT NULL, + [Folder] [nvarchar](1000) NOT NULL, + [DigitalObjectIdentifier] [varchar](256) NULL, + [Source] [varchar](256) NULL, + CONSTRAINT [PK_Dataset] PRIMARY KEY CLUSTERED +( + [ID] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] +) ON [PRIMARY] +GO +ALTER TABLE [dbo].[ColumnInfo] ADD Dataset_ID [int] NULL +--GO +--ALTER TABLE [dbo].[ColumnInfo] ADD CONSTRAINT [FK_Column_Info_Dataset] FOREIGN KEY([Dataset_ID]) REFERENCES [dbo].[Dataset] ([ID]) ON DELETE CASCADE ON UPDATE CASCADE + GO SET ANSI_PADDING OFF GO @@ -1412,4 +1437,4 @@ GO insert into sysdiagrams(name, principal_id, diagram_id, version, definition) VALUES (N'Catalogue_Data_Diagram', 1, 1, 1, -0xD0CF11E0A1B11AE1000000000000000000000000000000003E000300FEFF0900060000000000000000000000020000000100000000000000001000005A00000001000000FEFFFFFF00000000000000005D000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFF5C000000030000000400000005000000060000000700000008000000090000000A0000000B0000000C0000000D0000000E0000000F000000100000001100000012000000130000001400000015000000160000001700000018000000FEFFFFFF1A0000001B0000001C0000001D0000001E0000001F000000200000002100000022000000230000002400000025000000260000002700000028000000290000002A0000002B0000002C0000002D0000002E0000002F000000300000003100000032000000330000003400000035000000360000003700000038000000390000003A0000003B0000003C0000003D0000003E0000003F000000400000004100000042000000430000004400000045000000460000004700000048000000490000004A0000004B0000004C0000004D0000004E0000004F00000050000000510000005200000053000000540000005500000056000000570000005800000059000000FEFFFFFFFEFFFFFF91000000FEFFFFFFFDFFFFFF5F000000600000006100000062000000630000006400000065000000660000006700000068000000690000006A0000006B0000006C0000006D0000006E0000006F000000700000007100000072000000730000007400000075000000760000007700000078000000790000007A0000007B0000007C0000007D0000007E0000007F0000008000000052006F006F007400200045006E00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500FFFFFFFFFFFFFFFF0200000000000000000000000000000000000000000000000000000000000000705AF83BF38BD0015B000000C00A0000000000006600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000201FFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000002000000322C0000000000006F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040002010100000004000000FFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000019000000AC80000000000000010043006F006D0070004F0062006A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000201FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000005F00000000000000000438000A1ED00D05000080D60000000F00FFFF5000000000000000D6000000007D0000E6930000175900001A9401001A4301000CCFFFFF7289FFFFDE805B10F195D011B0A000AA00BDCB5C000008003000000000020000030000003C006B0000000900000000000000D9E6B0E91C81D011AD5100A0C90F5739F43B7F847F61C74385352986E1D552F8A0327DB2D86295428D98273C25A2DA2D00002800430000000000000053444DD2011FD1118E63006097D2DF4834C9D2777977D811907000065B840D9C00002800430000000000000051444DD2011FD1118E63006097D2DF4834C9D2777977D811907000065B840D9C80000000382B000000FF01000170931500003800A50900000700008001000000AC020000008000000D0000805363684772696400A8480000E6FBFFFF436174616C6F6775654974656D07000000003400A50900000700008002000000A402000000800000090000805363684772696400A84800001E2D0000436174616C6F67756549746500008000A50900000700008003000000520000000180000058000080436F6E74726F6C00A74700004521000052656C6174696F6E736869702027464B5F436174616C6F6775655F4974656D735F446174615F436174616C6F67756527206265747765656E2027436174616C6F6775652720616E642027436174616C6F6775654974656D2700002800B50100000700008004000000310000007500000002800000436F6E74726F6C00ED490000E327000000003400A50900000700008005000000A402000000800000090000805363684772696400F4CFFFFF903300005461626C65496E666F49746500003400A50900000700008006000000A6020000008000000A0000805363684772696400FCD6FFFF6AFFFFFF436F6C756D6E496E666F746500007800A5090000070000800700000052000000018000004E000080436F6E74726F6C005BDFFFFF492A000052656C6174696F6E736869702027464B5F5461626C655F4974656D735F446174615F5461626C657327206265747765656E20275461626C65496E666F2720616E642027436F6C756D6E496E666F27000000002800B50100000700008008000000310000006700000002800000436F6E74726F6C00A1E1FFFF4E2F000000004000A5090000070000800D000000C20200000080000018000080536368477269640094110000A2E5FFFF436F6C756D6E496E666F5F436174616C6F6775654974656D00009400A509000007000080120000005A0000000180000069000080436F6E74726F6C0069FEFFFF51F6FFFF52656C6174696F6E736869702027464B5F436F6C756D6E496E666F5F436174616C6F6775654974656D5F436F6C756D6E496E666F27206265747765656E2027436F6C756D6E496E666F2720616E642027436F6C756D6E496E666F5F436174616C6F6775654974656D2700690000002800B50100000700008013000000310000007F00000002800000436F6E74726F6C00ABF6FFFFC5F5FFFF00009800A509000007000080160000006A000000018000006F000080436F6E74726F6C005B37000093F7FFFF52656C6174696F6E736869702027464B5F436F6C756D6E496E666F5F436174616C6F6775654974656D5F436174616C6F6775654974656D27206265747765656E2027436174616C6F6775654974656D2720616E642027436F6C756D6E496E666F5F436174616C6F6775654974656D270000002800B50100000700008017000000310000008500000002800000436F6E74726F6C005A29000075FAFFFF00003C00A50900000700008018000000B602000000800000120000805363684772696400FA7D00004A2E0000537570706F7274696E67446F63756D656E74756500008400A5090000070000801900000052000000018000005B000080436F6E74726F6C00F57000006331000052656C6174696F6E736869702027464B5F537570706F7274696E67446F63756D656E745F436174616C6F67756527206265747765656E2027436174616C6F6775652720616E642027537570706F7274696E67446F63756D656E74270000002800B5010000070000801A000000310000007100000002800000436F6E74726F6C004F6E0000A933000000004000A5090000070000801B000000BC020000008000001500008053636847726964007A0D0000E40C000045787472616374696F6E496E666F726D6174696F6E74656D0000A800A5090000070000802200000052000000018000007F000080436F6E74726F6C00391F000093F7FFFF52656C6174696F6E736869702027464B5F436F6C756D6E496E666F5F436174616C6F6775654974656D5F45787472616374696F6E496E666F726D6174696F6E27206265747765656E202745787472616374696F6E496E666F726D6174696F6E2720616E642027436F6C756D6E496E666F5F436174616C6F6775654974656D270000002800B50100000700008023000000310000009500000002800000436F6E74726F6C007F210000ED02000000003000A509000007000080240000009E02000000800000060000805363684772696400E2D2FFFF16DBFFFF4C6F6F6B7570640000007000A50900000700008027000000520000000180000045000080436F6E74726F6C0049E2FFFF49EDFFFF52656C6174696F6E736869702027464B5F4C6F6F6B75705F436F6C756D6E496E666F27206265747765656E2027436F6C756D6E496E666F2720616E6420274C6F6F6B757027D0135E00002800B50100000700008028000000310000005B00000002800000436F6E74726F6C008FE4FFFF0BF7FFFF00007000A50900000700008029000000520000000180000046000080436F6E74726F6C008FE7FFFF49EDFFFF52656C6174696F6E736869702027464B5F4C6F6F6B75705F436F6C756D6E496E666F3127206265747765656E2027436F6C756D6E496E666F2720616E6420274C6F6F6B757027135E00002800B5010000070000802A000000310000005D00000002800000436F6E74726F6C00D5E9FFFF0BF7FFFF00007000A5090000070000802B000000520000000180000046000080436F6E74726F6C005BDFFFFF49EDFFFF52656C6174696F6E736869702027464B5F4C6F6F6B75705F436F6C756D6E496E666F3227206265747765656E2027436F6C756D6E496E666F2720616E6420274C6F6F6B757027135E00002800B5010000070000802C000000310000005D00000002800000436F6E74726F6C00A1E1FFFF0BF7FFFF00003000A5090000070000802F000000A202000000800000080000805363684772696400A0ABFFFF12FDFFFF4A6F696E496E666F00007C00A50900000700008033000000520000000180000052000080436F6E74726F6C6F70D0FFFF95FFFFFF52656C6174696F6E736869702027464B5F4A6F696E496E666F5F436F6C756D6E496E666F5F4A6F696E4B65793127206265747765656E2027436F6C756D6E496E666F2720616E6420274A6F696E496E666F27654900002800B50100000700008034000000310000007100000002800000436F6E74726F6C6F9CD1FFFF25FFFFFF00007C00A50900000700008035000000520000000180000052000080436F6E74726F6C6F70D0FFFF4504000052656C6174696F6E736869702027464B5F4A6F696E496E666F5F436F6C756D6E496E666F5F4A6F696E4B65793227206265747765656E2027436F6C756D6E496E666F2720616E6420274A6F696E496E666F27654900002800B50100000700008036000000310000007100000002800000436F6E74726F6C6F9CD1FFFFD503000000003800A50900000700008038000000B20200000080000010000080536368477269646F12FDFFFFE835000045787472616374696F6E46696C74657200009800A5090000070000803900000052000000018000006F000080436F6E74726F6C6FEB1200001F2B000052656C6174696F6E736869702027464B5F45787472616374696F6E46696C7465725F45787472616374696F6E496E666F726D6174696F6E27206265747765656E202745787472616374696F6E496E666F726D6174696F6E2720616E64202745787472616374696F6E46696C746572270000002800B5010000070000803A000000310000008500000002800000436F6E74726F6C6F11FDFFFF3331000000004400A5090000070000803B000000C40200000080000019000080536368477269646F6AFFFFFFF654000045787472616374696F6E46696C746572506172616D657465720000000000A000A5090000070000803C000000520000000180000077000080436F6E74726F6C6F4D0B0000F64A000052656C6174696F6E736869702027464B5F45787472616374696F6E46696C746572506172616D657465725F45787472616374696F6E46696C74657227206265747765656E202745787472616374696F6E46696C7465722720616E64202745787472616374696F6E46696C746572506172616D65746572270000002800B5010000070000803D000000310000008D00000002800000436F6E74726F6C6F6DF3FFFFA550000000008C00A509000007000080400000005A0000000180000061000080436F6E74726F6C6F633100001F2B000052656C6174696F6E736869702027464B5F436174616C6F6775655F45787472616374696F6E496E666F726D6174696F6E27206265747765656E202745787472616374696F6E496E666F726D6174696F6E2720616E642027436174616C6F6775652700650000002800B50100000700008041000000310000007700000002800000436F6E74726F6C6F3E1E0000C76B000000004000A5090000070000804C000000C00200000080000017000080536368477269646F78D3FFFF22C0FFFF4C6F6F6B7570436F6D706F736974654A6F696E496E666F6D00008800A5090000070000805400000052000000018000005F000080436F6E74726F6C6F15DAFFFFC9D4FFFF52656C6174696F6E736869702027464B5F4C6F6F6B7570436F6D706F736974654A6F696E496E666F5F4C6F6F6B757027206265747765656E20274C6F6F6B75702720616E6420274C6F6F6B7570436F6D706F736974654A6F696E496E666F270000002800B50100000700008055000000310000007500000002800000436F6E74726F6C6F5BDCFFFFA1D8FFFF00009000A509000007000080560000006A0000000180000067000080436F6E74726F6C6F0FC8FFFF9DC8FFFF52656C6174696F6E736869702027464B5F4C6F6F6B7570436F6D706F736974654A6F696E496E666F5F436F6C756D6E496E666F27206265747765656E2027436F6C756D6E496E666F2720616E6420274C6F6F6B7570436F6D706F736974654A6F696E496E666F270000002800B50100000700008057000000310000007D00000002800000436F6E74726F6C6FEAC9FFFF9AE8FFFF00009400A509000007000080590000006A000000018000006A000080436F6E74726F6C6F57C1FFFF19C5FFFF52656C6174696F6E736869702027464B5F4C6F6F6B7570436F6D706F736974654A6F696E496E666F5F436F6C756D6E496E666F5F464B27206265747765656E2027436F6C756D6E496E666F2720616E6420274C6F6F6B7570436F6D706F736974654A6F696E496E666F276C7400002800B5010000070000805A000000310000008300000002800000436F6E74726F6C6F32C3FFFF08E5FFFF00003C00A5090000070000805C000000B60200000080000012000080536368477269646FDAAC0000D20F0000537570706F7274696E6753514C5461626C656E4900008400A5090000070000805D00000062000000018000005B000080436F6E74726F6C6FF5700000551F000052656C6174696F6E736869702027464B5F537570706F7274696E6753514C5461626C655F436174616C6F67756527206265747765656E2027436174616C6F6775652720616E642027537570706F7274696E6753514C5461626C65276E00002800B5010000070000805E000000310000007100000002800000436F6E74726F6C6F217200005131000000004000A5090000070000805F000000BE0200000080000016000080536368477269646FC201000086A7FFFF416767726567617465436F6E66696775726174696F6E6F6D00004000A50900000700008060000000C20200000080000018000080536368477269646F5C2B00006CA3FFFF41676772656761746546696C746572436F6E7461696E657200004400A50900000700008063000000C8020000008000001B000080536368477269646F7A580000FA9CFFFF41676772656761746546696C746572537562436F6E7461696E6572000000B400A5090000070000806400000052000000018000008B000080436F6E74726F6C6F6C4C000047A8FFFF52656C6174696F6E736869702027464B5F41676772656761746546696C746572537562436F6E7461696E65725F41676772656761746546696C746572436F6E7461696E657227206265747765656E202741676772656761746546696C746572436F6E7461696E65722720616E64202741676772656761746546696C746572537562436F6E7461696E6572270000002800B5010000070000806500000031000000A100000002800000436F6E74726F6C6FED4200008DAAFFFF0000B400A5090000070000806600000052000000018000008C000080436F6E74726F6C6F6C4C00006BA2FFFF52656C6174696F6E736869702027464B5F41676772656761746546696C746572537562436F6E7461696E65725F41676772656761746546696C746572436F6E7461696E65723127206265747765656E202741676772656761746546696C746572436F6E7461696E65722720616E64202741676772656761746546696C746572537562436F6E7461696E65722700002800B5010000070000806700000031000000A300000002800000436F6E74726F6C6F96420000FBA1FFFF00003800A5090000070000806E000000B0020000008000000F000080536368477269646F1059000050B0FFFF41676772656761746546696C7465727200009C00A5090000070000806F000000520000000180000073000080436F6E74726F6C6F6C4C00004FAFFFFF52656C6174696F6E736869702027464B5F41676772656761746546696C7465725F41676772656761746546696C746572436F6E7461696E657227206265747765656E202741676772656761746546696C746572436F6E7461696E65722720616E64202741676772656761746546696C746572277400002800B50100000700008070000000310000008900000002800000436F6E74726F6C6F55440000DFAEFFFF00003C00A50900000700008071000000B60200000080000012000080536368477269646FB42D000000B5FFFF41676772656761746544696D656E73696F6E74610000A000A50900000700008072000000520000000180000075000080436F6E74726F6C6FCC2200002BB5FFFF52656C6174696F6E736869702027464B5F41676772656761746544696D656E73696F6E5F416767726567617465436F6E66696775726174696F6E27206265747765656E2027416767726567617465436F6E66696775726174696F6E2720616E64202741676772656761746544696D656E73696F6E2772270000002800B50100000700008073000000310000008B00000002800000436F6E74726F6C6F351B000071B7FFFF0000AC00A50900000700008074000000520000000180000081000080436F6E74726F6C6FCC22000085A6FFFF52656C6174696F6E736869702027464B5F416767726567617465436F6E66696775726174696F6E5F41676772656761746546696C746572436F6E7461696E657227206265747765656E202741676772656761746546696C746572436F6E7461696E65722720616E642027416767726567617465436F6E66696775726174696F6E2700000000002800B50100000700008075000000310000009700000002800000436F6E74726F6C6FE818000015A6FFFF00004000A50900000700008076000000C20200000080000018000080536368477269646FD683000012B2FFFF41676772656761746546696C746572506172616D6574657200009C00A50900000700008077000000520000000180000073000080436F6E74726F6C6F1A7A000011B1FFFF52656C6174696F6E736869702027464B5F41676772656761746546696C746572506172616D657465725F41676772656761746546696C74657227206265747765656E202741676772656761746546696C7465722720616E64202741676772656761746546696C746572506172616D65746572276E00002800B50100000700008078000000310000008900000002800000436F6E74726F6C6FF072000057B3FFFF00003C00A5090000070000807C000000B60200000080000012000080536368477269646FF27600000CE5FFFF436174616C6F6775654974656D4973737565616D00008C00A509000007000080810000005A0000000180000063000080436F6E74726F6C6FD9600000F9F3FFFF52656C6174696F6E736869702027464B5F436174616C6F6775654974656D49737375655F436174616C6F6775654974656D27206265747765656E2027436174616C6F6775654974656D2720616E642027436174616C6F6775654974656D4973737565276E00002800B50100000700008082000000310000007900000002800000436F6E74726F6C6F8062000023F6FFFF00003800A50900000700008083000000B0020000008000000F000080536368477269646FF4B0000070CCFFFF497373756553797374656D557365727200009800A509000007000080840000005A000000018000006D000080436F6E74726F6C6F48A400004CDFFFFF52656C6174696F6E736869702027464B5F436174616C6F6775654974656D49737375655F4F776E65725F497373756553797374656D5573657227206265747765656E2027497373756553797374656D557365722720616E642027436174616C6F6775654974656D49737375652772270000002800B50100000700008085000000310000008900000002800000436F6E74726F6C6FF09700007CE3FFFF00009800A509000007000080860000005A0000000180000070000080436F6E74726F6C6F619A0000ABDAFFFF52656C6174696F6E736869702027464B5F436174616C6F6775654974656D49737375655F5265706F727465725F497373756553797374656D5573657227206265747765656E2027497373756553797374656D557365722720616E642027436174616C6F6775654974656D49737375652700002800B50100000700008087000000310000008F00000002800000436F6E74726F6C6F4B9200003BDAFFFF00003000A50900000700008088000000A20200000080000008000080536368477269646FC694FFFF56130000414E4F5461626C6500007400A5090000070000808B000000520000000180000049000080436F6E74726F6C65D6B5FFFF5512000052656C6174696F6E736869702027464B5F436F6C756D6E496E666F5F414E4F5461626C6527206265747765656E2027414E4F5461626C652720616E642027436F6C756D6E496E666F27496E6600002800B5010000070000808C000000310000005F00000002800000436F6E74726F6C65D8BFFFFF9B14000000004000A5090000070000808D000000BE0200000080000016000080536368477269646586A7FFFF302A00005072654C6F6164446973636172646564436F6C756D6E657200008C00A5090000070000808E000000520000000180000063000080436F6E74726F6C6596C8FFFF8F32000052656C6174696F6E736869702027464B5F5072654C6F6164446973636172646564436F6C756D6E5F5461626C65496E666F27206265747765656E20275461626C65496E666F2720616E6420275072654C6F6164446973636172646564436F6C756D6E276E00002800B5010000070000808F000000310000007900000002800000436F6E74726F6C6519C2FFFF1F32000000003C00A50900000700008091000000B80200000080000013000080536368477269646536D80000565E000050726F636573735461736B417267756D656E747500008C00A50900000700008094000000520000000180000061000080436F6E74726F6C6572D00000555D000052656C6174696F6E736869702027464B5F50726F636573735461736B417267756D656E745F50726F636573735461736B27206265747765656E202750726F636573735461736B2720616E64202750726F636573735461736B417267756D656E74276E276E00002800B50100000700008095000000310000007700000002800000436F6E74726F6C6544CA0000E55C000000003400A50900000700008090000000A8020000008000000B00008053636847726964659CAE0000D25A000050726F636573735461736B5500009C00A509000007000080960000005A0000000180000073000080436F6E74726F6C65F837000065C9FFFF52656C6174696F6E736869702027464B5F41676772656761746544696D656E73696F6E5F45787472616374696F6E496E666F726D6174696F6E27206265747765656E202745787472616374696F6E496E666F726D6174696F6E2720616E64202741676772656761746544696D656E73696F6E276E00002800B50100000700008097000000310000008900000002800000436F6E74726F6C658D4000008BF0FFFF00007800A5090000070000809A0000005A000000018000004D000080436F6E74726F6C65F5700000E87C000052656C6174696F6E736869702027464B5F50726F636573735461736B5F436174616C6F67756527206265747765656E2027436174616C6F6775652720616E64202750726F636573735461736B2727000000002800B5010000070000809B000000310000006300000002800000436F6E74726F6C65E99E00009592000000002400A5010000070000809C0000007100000002800000436F6E74726F6C65C47200005355000000003C00A5090000070000809D000000B60200000080000012000080536368477269646592B80000383100004C6F61644D6F64756C65417373656D626C79747500003400A5090000070000809E000000AA020000008000000C0000805363684772696465D8BD0000408300004C6F61645363686564756C6500004000A509000007000080A2000000BE0200000080000016000080536368477269646536F7FFFF0E6A000045787465726E616C4461746162617365536572766572657200008C00A509000007000080A30000005A0000000180000063000080436F6E74726F6C6539E1FFFF8E56000052656C6174696F6E736869702027464B5F5461626C65496E666F5F45787465726E616C446174616261736553657276657227206265747765656E202745787465726E616C44617461626173655365727665722720616E6420275461626C65496E666F276E00002800B501000007000080A4000000310000007900000002800000436F6E74726F6C6544CDFFFFAB6D000000008C00A509000007000080A60000005A0000000180000063000080436F6E74726F6C65B51B00006780000052656C6174696F6E736869702027464B5F436174616C6F6775655F45787465726E616C446174616261736553657276657227206265747765656E202745787465726E616C44617461626173655365727665722720616E642027436174616C6F677565276E00002800B501000007000080A7000000310000007900000002800000436F6E74726F6C65F50F0000B79D000000008C00A509000007000080A80000005A0000000180000064000080436F6E74726F6C65D91500006780000052656C6174696F6E736869702027464B5F436174616C6F6775655F45787465726E616C44617461626173655365727665723127206265747765656E202745787465726E616C44617461626173655365727665722720616E642027436174616C6F6775652700002800B501000007000080A9000000310000007B00000002800000436F6E74726F6C65B4090000FDA2000000008C00A509000007000080AA0000005A0000000180000061000080436F6E74726F6C65B3A3FFFF5723000052656C6174696F6E736869702027464B5F414E4F5461626C655F45787465726E616C446174616261736553657276657227206265747765656E202745787465726E616C44617461626173655365727665722720616E642027414E4F5461626C652775652700002800B501000007000080AB000000310000007700000002800000436F6E74726F6C65DDA5FFFF9268000000003800A509000007000080AC000000B2020000008000001000008053636847726964659E9D0000F69F00004C6F6164506572696F646963616C6C790000A000A509000007000080AF000000520000000180000075000080436F6E74726F6C65CC2200004DC0FFFF52656C6174696F6E736869702027464B5F416767726567617465436F6E66696775726174696F6E5F41676772656761746544696D656E73696F6E27206265747765656E202741676772656761746544696D656E73696F6E2720616E642027416767726567617465436F6E66696775726174696F6E2772270000002800B501000007000080B0000000310000008B00000002800000436F6E74726F6C655F1B0000DDBFFFFF00003400A509000007000080BD000000AA020000008000000C0000805363684772696465AA820000345300004C6F61644D6574616461746100007800A509000007000080BE00000052000000018000004F000080436F6E74726F6C65F57000005F53000052656C6174696F6E736869702027464B5F436174616C6F6775655F4C6F61644D6574616461746127206265747765656E20274C6F61644D657461646174612720616E642027436174616C6F677565270000002800B501000007000080BF000000310000006500000002800000436F6E74726F6C6566720000EF52000000008800A509000007000080C000000062000000018000005D000080436F6E74726F6C65FA9C0000CF85000052656C6174696F6E736869702027464B5F4C6F6164506572696F646963616C6C795F4C6F61644D6574616461746127206265747765656E20274C6F61644D657461646174612720616E6420274C6F6164506572696F646963616C6C79276F270000002800B501000007000080C1000000310000007300000002800000436F6E74726F6C65D98A00000695000000007C00A509000007000080C2000000520000000180000053000080436F6E74726F6C65659D0000A369000052656C6174696F6E736869702027464B5F50726F636573735461736B5F4C6F61644D6574616461746127206265747765656E20274C6F61644D657461646174612720616E64202750726F636573735461736B274900002800B501000007000080C3000000310000006900000002800000436F6E74726F6C65079E0000E96B000000008000A509000007000080C4000000620000000180000055000080436F6E74726F6C65659D0000517F000052656C6174696F6E736869702027464B5F4C6F61645363686564756C655F4C6F61644D6574616461746127206265747765656E20274C6F61644D657461646174612720616E6420274C6F61645363686564756C6527656D2700002800B501000007000080C5000000310000006B00000002800000436F6E74726F6C6581AA0000CF81000000004400A509000007000080C6000000C6020000008000001A000080536368477269646530750000CA9E0000444C4557696E646F777353657276696365457863657074696F6E720000009C00A509000007000080C7000000520000000180000071000080436F6E74726F6C65A98100005C86000052656C6174696F6E736869702027464B5F444C4557696E646F777353657276696365457863657074696F6E5F4C6F61644D6574616461746127206265747765656E20274C6F61644D657461646174612720616E642027444C4557696E646F777353657276696365457863657074696F6E27696F6E00002800B501000007000080C8000000310000008700000002800000436F6E74726F6C65FC6700004293000000008800A509000007000080C90000006A000000018000005E000080436F6E74726F6C65ED9700005C86000052656C6174696F6E736869702027464B5F4C6F6164506572696F646963616C6C795F4C6F61644D657461646174613127206265747765656E20274C6F61644D657461646174612720616E6420274C6F6164506572696F646963616C6C7927270000002800B501000007000080CA000000310000007500000002800000436F6E74726F6C65E7840000C995000000004400A509000007000080CB000000C8020000008000001B000080536368477269646562430000F4CFFFFF416767726567617465436F6E74696E756F75734461746541786973000000A800A509000007000080CC00000052000000018000007F000080436F6E74726F6C656142000069C9FFFF52656C6174696F6E736869702027464B5F416767726567617465436F6E74696E756F757344617465417869735F41676772656761746544696D656E73696F6E27206265747765656E202741676772656761746544696D656E73696F6E2720616E642027416767726567617465436F6E74696E756F75734461746541786973270000002800B501000007000080CD000000310000009500000002800000436F6E74726F6C65C22400005ECDFFFF00003C00A509000007000080D0000000B802000000800000130000805363684772696465B80B0000C8CEFFFF416767726567617465466F726365644A6F696E760000A000A509000007000080D10000005A0000000180000077000080436F6E74726F6C65DB04000016C9FFFF52656C6174696F6E736869702027464B5F416767726567617465466F726365644A6F696E5F416767726567617465436F6E66696775726174696F6E27206265747765656E2027416767726567617465436F6E66696775726174696F6E2720616E642027416767726567617465466F726365644A6F696E270000002800B501000007000080D2000000310000008D00000002800000436F6E74726F6C6564EAFFFFE9CFFFFF00008800A509000007000080D300000062000000018000005D000080436F6E74726F6C6582F8FFFF1FDDFFFF52656C6174696F6E736869702027464B5F416767726567617465466F726365644A6F696E5F5461626C65496E666F27206265747765656E20275461626C65496E666F2720616E642027416767726567617465466F726365644A6F696E2727270000002800B501000007000080D4000000310000007300000002800000436F6E74726F6C65360800002416000000008C00A509000007000080D50000007A0000000180000063000080436F6E74726F6C65AD21000012C9FFFF52656C6174696F6E736869702027464B5F416767726567617465436F6E66696775726174696F6E5F436174616C6F67756527206265747765656E2027436174616C6F6775652720616E642027416767726567617465436F6E66696775726174696F6E272700002800B501000007000080D6000000310000007900000002800000436F6E74726F6C656B3D00003DECFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002143341208000000A72900001A28000078563412070000001401000043006100740061006C006F006700750065004900740065006D00000073000000000010400100000000000000000000000E000000050000001801000000000000000000000000000000000000F8000000000000000500000000000000000000000200000000000000009492400000000000000000000000000094924000000000000000400400000020000000300000000000000000000000008C924000000000000010400000000000000040000000000000004000000000000000000100000000000000050000000000000040000000010000000000000000000040000000000000104004000000200000002000000000000000000000000000000005000000540000002C0000002C0000002C000000340000000000000000000000A72900001A280000000000002D0100000D0000000C000000070000001C010000F70800005307000094020000390300003A020000DD040000DD040000EE020000DD04000036060000380400000000000001000000411700003F230000000000000C0000000C00000002000000020000001C010000E60A00000000000001000000F21300009408000000000000020000000200000002000000020000001C010000F70800000100000000000000F21300000804000000000000000000000000000002000000020000001C010000F7080000000000000000000055320000DD23000000000000000000000D00000004000000040000001C010000F70800009B0A00008106000078563412040000006400000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000000E00000043006100740061006C006F006700750065004900740065006D000000214334120800000079290000BC7E000078563412070000001401000043006100740061006C006F00670075006500000067007500650000000000870AC03D66020500000000000000020000000000000000000000000100000001000000000000484B75575034A75728307C57484B755763006F006D00700075007400650064005F0063006F006C0075006D006E007300200063006D0063006501006453C20F00E05A6B16109AA70A6F0062006A006500630074005F006900640020003D00200063006F006C002E006F0062006A006500630074005F0069006400200061006E006400200063006D0063002E0063006F006C0075006D006E005F006900640020003D00200063006F006C00000000000000000000000000000005000000540000002C0000002C0000002C00000034000000000000000000000079290000BC7E0000000000002D0100000D0000000C000000070000001C0100002F0D00005307000094020000390300003A020000DD040000DD040000EE020000DD04000036060000380400000000000001000000411700000341000000000000180000000C00000002000000020000001C010000D70A00000000000001000000F21300004E06000000000000010000000100000002000000020000001C010000F70800000100000000000000F21300000804000000000000000000000000000002000000020000001C010000F7080000000000000000000055320000DD23000000000000000000000D00000004000000040000001C010000F70800009B0A00008106000078563412040000005C00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000000A00000043006100740061006C006F00670075006500000002000B003E4900001E2D00003E490000002400000000000002000000F0F0F00000000000000000000000000000000000010000000400000000000000ED490000E3270000BA1400005801000032000000010000020000BA14000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61210046004B005F0043006100740061006C006F006700750065005F004900740065006D0073005F0044006100740061005F0043006100740061006C006F006700750065002143341208000000BA290000B92500007856341207000000140100005400610062006C00650049006E0066006F00000073000000540020006E0061006D0065002C002000760061006C00750065002000460052004F004D0020007300790073002E0065007800740065006E006400650064005F00700072006F0070006500720074006900650073002000570048004500520045002000280063006C0061007300730020003D00200031002900200041004E004400200028006D0061006A006F0072005F006900640020003D0020004F0042004A004500430054005F004900440028004E0027005B00640062006F005D002E005B005400610062006C0065005F0031005D00270029002900000000000000000000000000000005000000540000002C0000002C0000002C000000340000000000000000000000BA290000B9250000000000002D010000080000000C000000070000001C010000F70800005307000094020000390300003A020000DD040000DD040000EE020000DD04000036060000380400000000000001000000AF1C0000A823000000000000060000000600000002000000020000001C010000F20D00000000000001000000F21300004E06000000000000010000000100000002000000020000001C010000F70800000100000000000000F21300000804000000000000000000000000000002000000020000001C010000F7080000000000000000000055320000DD23000000000000000000000D00000004000000040000001C010000F70800009B0A00008106000078563412040000005C00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000000A0000005400610062006C00650049006E0066006F0000002143341208000000C42E00009A2D000078563412070000001401000043006F006C0075006D006E0049006E0066006F0000000000540020006E0061006D0065002C002000760061006C00750065002000460052004F004D0020007300790073002E0065007800740065006E006400650064005F00700072006F0070006500720074006900650073002000570048004500520045002000280063006C0061007300730020003D00200031002900200041004E004400200028006D0061006A006F0072005F006900640020003D0020004F0042004A004500430054005F004900440028004E0027005B00640062006F005D002E005B005400610062006C0065005F0031005D00270029002900000000000000000000000000000005000000540000002C0000002C0000002C000000340000000000000000000000C42E00009A2D0000000000002D010000080000000C000000070000001C010000F50A00005307000094020000390300003A020000DD040000DD040000EE020000DD04000036060000380400000000000001000000411700005D14000000000000060000000600000002000000020000001C010000E60A00000000000001000000F21300009408000000000000020000000200000002000000020000001C010000F70800000100000000000000F21300000804000000000000000000000000000002000000020000001C010000F7080000000000000000000055320000DD23000000000000000000000D00000004000000040000001C010000F70800009B0A00008106000078563412040000005E00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000000B00000043006F006C0075006D006E0049006E0066006F00000002000B00F2E0FFFF90330000F2E0FFFF042D00000000000002000000F0F0F00000000000000000000000000000000000010000000800000000000000A1E1FFFF4E2F00001C10000058010000380000000100000200001C10000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D611A0046004B005F005400610062006C0065005F004900740065006D0073005F0044006100740061005F005400610062006C00650073002143341208000000BA290000AC14000078563412070000001401000043006F006C0075006D006E0049006E0066006F005F0043006100740061006C006F006700750065004900740065006D0000000000050000001801000000000000000000000000000000000000F800000000000000050000000000000000000000020000000000000000D09D4000000000000000000000000000D09D400000000000000040040000002000000030000000000000000000000000C89D4000000000000010400000000000000040000000000000004000000000000000000100000000000000050000000000000040000000010000000000000000000040000000000000104004000000200000002000000000000000000000000000000005000000540000002C0000002C0000002C000000340000000000000000000000BA290000AC140000000000002D0100000D0000000C000000070000001C010000F70800005307000094020000390300003A020000DD040000DD040000EE020000DD04000036060000380400000000000001000000F21300000804000000000000000000000000000002000000020000001C010000F70800000000000001000000F21300000804000000000000000000000000000002000000020000001C010000F70800000100000000000000F21300000804000000000000000000000000000002000000020000001C010000F7080000000000000000000055320000DD23000000000000000000000D00000004000000040000001C010000F70800009B0A00008106000078563412040000007A00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000001900000043006F006C0075006D006E0049006E0066006F005F0043006100740061006C006F006700750065004900740065006D00000003000B00000000006AFFFFFF00000000CCF7FFFF94110000CCF7FFFF0000000002000000F0F0F00000000000000000000000000000000000010000001300000000000000ABF6FFFFC5F5FFFFC51700005801000058000000010000020000C517000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61260046004B005F0043006F006C0075006D006E0049006E0066006F005F0043006100740061006C006F006700750065004900740065006D005F0043006F006C0075006D006E0049006E0066006F0005000B00A84800007CFCFFFFBF4000007CFCFFFFBF40000097FCFFFFD638000097FCFFFFD63800004EFAFFFF0000000002000000F0F0F000000000000000000000000000000000000100000017000000000000005A29000075FAFFFF92190000580100001D0000000100000200009219000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61290046004B005F0043006F006C0075006D006E0049006E0066006F005F0043006100740061006C006F006700750065004900740065006D005F0043006100740061006C006F006700750065004900740065006D0021433412080000003D2200005D1E000078563412070000001401000053007500700070006F007200740069006E00670044006F00630075006D0065006E0074000000000000000000D800000003000000010000000001000000000000446174615F5053004D756C7469706C7952616469616C4772616469656E7443656E74657265645F5053315F436F6E7374616E745461626C6500666C48616C66546578656C53697A654E6F726D616C697A656400AB000003000100010001000000000000007D00000098000000050000000100010001000100A80000004C000000B0000000050000000100010001000100C00000004D756C7469706C7952616469616C4772616469656E7443656E74000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000003D2200005D1E0000000000002D0100000D0000000C000000070000001C01000026070000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000006E00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000001300000053007500700070006F007200740069006E00670044006F00630075006D0065006E007400000002000B0021720000FA320000FA7D0000FA3200000000000002000000F0F0F00000000000000000000000000000000000010000001A000000000000004F6E0000A93300007C13000058010000320000000100000200007C13000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D611F0046004B005F0053007500700070006F007200740069006E00670044006F00630075006D0065006E0074005F0043006100740061006C006F006700750065002143341208000000AA2B0000F2200000785634120700000014010000450078007400720061006300740069006F006E0049006E0066006F0072006D006100740069006F006E000000000000000E000000050000001801000000000000000000000000000000000000E800000000000000050000000000000000000000010000000000000000002A400000000000000000040000002000000020000000000000000000000000002E4000000000000000400000000000000040000000000000004000000000000000000100000000000000050000000000000040000000010000000000000000002E400000000000003640040000002000000020000000000000000000000000002A400000000000000000000000000000000005000000540000002C0000002C0000002C000000340000000000000000000000AA2B0000F2200000000000002D0100000D0000000C000000070000001C01000060090000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000007400000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F00000016000000450078007400720061006300740069006F006E0049006E0066006F0072006D006100740069006F006E00000002000B00D0200000E40C0000D02000004EFAFFFF0000000002000000F0F0F000000000000000000000000000000000000100000023000000000000007F210000ED020000671D00005801000032000000010000020000671D000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61310046004B005F0043006F006C0075006D006E0049006E0066006F005F0043006100740061006C006F006700750065004900740065006D005F00450078007400720061006300740069006F006E0049006E0066006F0072006D006100740069006F006E0021433412080000001C260000EE1400007856341207000000140100004C006F006F006B0075007000000000000001000010010000440000000200000001000000C800000000000000D800000003000000010000000001000000000000446174615F5053004D756C7469706C7952616469616C4772616469656E7443656E74657265645F5053315F436F6E7374616E745461626C6500666C48616C66546578656C53697A654E6F726D616C697A656400AB000003000100010001000000000000007D00000098000000050000000100010001000100A80000004C000000B0000000050000000100010001000100C00000004D756C7469706C7952616469616C4772616469656E7443656E74000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000001C260000EE140000000000002D0100000D0000000C000000070000001C010000160800009F06000094020000390300003A02000065040000DD040000EE020000DD04000036060000380400000000000001000000661200000804000000000000000000000000000002000000020000001C010000160800000000000001000000661200000804000000000000000000000000000002000000020000001C010000160800000100000000000000661200000804000000000000000000000000000002000000020000001C010000160800000000000000000000E42D00001224000000000000000000000D00000004000000040000001C010000160800008D090000DC05000078563412040000005600000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F000000070000004C006F006F006B0075007000000002000B00E0E3FFFF6AFFFFFFE0E3FFFF04F0FFFF0000000002000000F0F0F000000000000000000000000000000000000100000028000000000000008FE4FFFF0BF7FFFFBB0C00005801000032000000010000020000BB0C000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61140046004B005F004C006F006F006B00750070005F0043006F006C0075006D006E0049006E0066006F0002000B0026E9FFFF6AFFFFFF26E9FFFF04F0FFFF0000000002000000F0F0F00000000000000000000000000000000000010000002A00000000000000D5E9FFFF0BF7FFFF680D00005801000032000000010000020000680D000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61150046004B005F004C006F006F006B00750070005F0043006F006C0075006D006E0049006E0066006F00310002000B00F2E0FFFF6AFFFFFFF2E0FFFF04F0FFFF0000000002000000F0F0F00000000000000000000000000000000000010000002C00000000000000A1E1FFFF0BF7FFFF680D00005801000032000000010000020000680D000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61150046004B005F004C006F006F006B00750070005F0043006F006C0075006D006E0049006E0066006F0032002143341208000000FC250000301500007856341207000000140100004A006F0069006E0049006E0066006F0000006E0064006F00770073002E0046006F0072006D0073002C002000560065007200730069006F006E003D0034002E0030002E0030002E0030002C002000430075006C0074007500720065003D006E00650075007400720061006C002C0020005000750062006C00690063004B006500790054006F006B0065006E003D00620037003700610035006300350036003100390033003400650030003800390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000540000002C0000002C0000002C000000340000000000000000000000FC25000030150000000000002D0100000D0000000C000000070000001C010000160800005406000094020000390300003A02000065040000DD040000EE020000DD04000036060000380400000000000001000000661200000804000000000000000000000000000002000000020000001C010000160800000000000001000000661200000804000000000000000000000000000002000000020000001C010000160800000100000000000000661200000804000000000000000000000000000002000000020000001C010000160800000000000000000000E42D00001224000000000000000000000D00000004000000040000001C010000160800008D090000DC05000078563412040000005A00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F000000090000004A006F0069006E0049006E0066006F00000002000B00FCD6FFFF2C0100009CD1FFFF2C0100000000000002000000F0F0F000000000000000000000000000000000000100000034000000000000009CD1FFFF25FFFFFFD01200005801000064000000010000020000D012000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D611F0046004B005F004A006F0069006E0049006E0066006F005F0043006F006C0075006D006E0049006E0066006F005F004A006F0069006E004B0065007900310002000B00FCD6FFFFDC0500009CD1FFFFDC0500000000000002000000F0F0F000000000000000000000000000000000000100000036000000000000009CD1FFFFD5030000D01200005801000064000000010000020000D012000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D611F0046004B005F004A006F0069006E0049006E0066006F005F0043006F006C0075006D006E0049006E0066006F005F004A006F0069006E004B00650079003200214334120800000066230000C5170000785634120700000014010000450078007400720061006300740069006F006E00460069006C0074006500720000002E0030002E0030002E0030002C002000430075006C0074007500720065003D006E00650075007400720061006C002C0020005000750062006C00690063004B006500790054006F006B0065006E003D0062003700370061003500630035003600310039003300340065003000380039000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000540000002C0000002C0000002C00000034000000000000000000000066230000C5170000000000002D0100000D0000000C000000070000001C010000070800009204000094020000390300003A02000029040000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000006A00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F00000011000000450078007400720061006300740069006F006E00460069006C00740065007200000002000B0082140000D62D000082140000E83500000000000002000000F0F0F00000000000000000000000000000000000010000003A0000000000000011FDFFFF33310000C21600005801000032000000010000020000C216000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61290046004B005F00450078007400720061006300740069006F006E00460069006C007400650072005F00450078007400720061006300740069006F006E0049006E0066006F0072006D006100740069006F006E002143341208000000EA1F00007A120000785634120700000014010000450078007400720061006300740069006F006E00460069006C0074006500720050006100720061006D006500740065007200000069006F006E003D0034002E0030002E0030002E0030002C002000430075006C0074007500720065003D006E00650075007400720061006C002C0020005000750062006C00690063004B006500790054006F006B0065006E003D00620037003700610035006300350036003100390033003400650030003800390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000540000002C0000002C0000002C000000340000000000000000000000EA1F00007A120000000000002D0100000D0000000C000000070000001C010000090600009204000094020000390300003A02000029040000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000007C00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000001A000000450078007400720061006300740069006F006E00460069006C0074006500720050006100720061006D006500740065007200000002000B00E40C0000AD4D0000E40C0000F65400000000000002000000F0F0F00000000000000000000000000000000000010000003D000000000000006DF3FFFFA5500000C81800005801000032000000010000020000C818000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D612D0046004B005F00450078007400720061006300740069006F006E00460069006C0074006500720050006100720061006D0065007400650072005F00450078007400720061006300740069006F006E00460069006C0074006500720003000B00FA320000D62D0000FA320000F0870000A8480000F08700000000000002000000F0F0F000000000000000000000000000000000000100000041000000000000003E1E0000C76B00000D14000058010000370000000100000200000D14000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61220046004B005F0043006100740061006C006F006700750065005F00450078007400720061006300740069006F006E0049006E0066006F0072006D006100740069006F006E00214334120800000056250000621700007856341207000000140100004C006F006F006B007500700043006F006D0070006F0073006900740065004A006F0069006E0049006E0066006F000000680050006100720073006500720043006C00690065006E0074002C002000560065007200730069006F006E003D00310031002E0030002E0030002E0030002C002000430075006C0074007500720065003D006E00650075007400720061006C002C0020005000750062006C00690063004B006500790054006F006B0065006E003D00380039003800340035006400630064003800300038003000630063003900310000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000005625000062170000000000002D010000070000000C000000070000001C01000026070000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000042700004710000000000000040000000400000002000000020000001C010000CE1300000000000001000000D91000006806000000000000010000000100000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000007800000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F000000180000004C006F006F006B007500700043006F006D0070006F0073006900740065004A006F0069006E0049006E0066006F00000002000B00ACDBFFFF16DBFFFFACDBFFFF84D7FFFF0000000002000000F0F0F000000000000000000000000000000000000100000055000000000000005BDCFFFFA1D8FFFF6414000058010000320000000100000200006414000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61210046004B005F004C006F006F006B007500700043006F006D0070006F0073006900740065004A006F0069006E0049006E0066006F005F004C006F006F006B007500700005000B006EDDFFFF6AFFFFFF6EDDFFFF07F9FFFF3BC9FFFF07F9FFFF3BC9FFFF18CAFFFF78D3FFFF18CAFFFF0000000002000000F0F0F00000000000000000000000000000000000010000005700000000000000EAC9FFFF9AE8FFFFC21600005801000032000000010000020000C216000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61250046004B005F004C006F006F006B007500700043006F006D0070006F0073006900740065004A006F0069006E0049006E0066006F005F0043006F006C0075006D006E0049006E0066006F0005000B0054D9FFFF6AFFFFFF54D9FFFFDDFBFFFF83C2FFFFDDFBFFFF83C2FFFF94C6FFFF78D3FFFF94C6FFFF0000000002000000F0F0F00000000000000000000000000000000000010000005A0000000000000032C3FFFF08E5FFFFC81800005801000032000000010000020000C818000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61280046004B005F004C006F006F006B007500700043006F006D0070006F0073006900740065004A006F0069006E0049006E0066006F005F0043006F006C0075006D006E0049006E0066006F005F0046004B0021433412080000003D2200005B1A000078563412070000001401000053007500700070006F007200740069006E006700530051004C005400610062006C00650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000003D2200005B1A0000000000002D0100000D0000000C000000070000001C01000026070000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000006E00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000001300000053007500700070006F007200740069006E006700530051004C005400610062006C006500000004000B0021720000A2300000FB7A0000A2300000FB7A0000D0200000DAAC0000D02000000000000002000000F0F0F00000000000000000000000000000000000010000005E0000000000000021720000513100002613000058010000000000000100000200002613000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D611F0046004B005F0053007500700070006F007200740069006E006700530051004C005400610062006C0065005F0043006100740061006C006F006700750065002143341208000000362200004724000078563412070000001401000041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E000000000003000000010000000001000000000000446174615F5053004D756C7469706C7952616469616C4772616469656E7443656E74657265645F5053315F436F6E7374616E745461626C6500666C48616C66546578656C53697A654E6F726D616C697A656400AB000003000100010001000000000000007D00000098000000050000000100010001000100A80000004C000000B0000000050000000100010001000100C00000004D756C7469706C7952616469616C4772616469656E7443656E74000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000003622000047240000000000002D0100000D0000000C000000070000001C01000026070000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000007600000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000001700000041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E00000021433412080000003C2200005F0F0000785634120700000014010000410067006700720065006700610074006500460069006C0074006500720043006F006E007400610069006E0065007200000000000200000000001066000000010000200000005A66D11F3372CF63785FCA7F40C69EA7DCEDA7CC247BCFBB00C38E42D74AECAA000000000E800000000200002000000022DD4B17FD42971A525C6C9C486DCAF55C6C488516735862E36E352C2D42E2C460000000A7DE800C07B35B3F0D6263AC81AE6E31CA8A493A12274568746645EF462AD47FD8892C9460826B6F5F558A0E75CC4E4AC5561556A9455D20A14B4EE450E669AB1E892532D8D21B364B2F844052BF0F8ECA46A54A000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000003C2200005F0F0000000000002D0100000D0000000C000000070000001C010000500A0000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000007A00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F00000019000000410067006700720065006700610074006500460069006C0074006500720043006F006E007400610069006E0065007200000021433412080000003C220000CC100000785634120700000014010000410067006700720065006700610074006500460069006C0074006500720053007500620043006F006E007400610069006E006500720000006E003D0034002E0030002E0030002E0030002C002000430075006C0074007500720065003D006E00650075007400720061006C002C0020005000750062006C00690063004B006500790054006F006B0065006E003D00620037003700610035006300350036003100390033003400650030003800390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000003C220000CC100000000000002D0100000D0000000C000000070000001C010000300C0000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000008000000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000001C000000410067006700720065006700610074006500460069006C0074006500720053007500620043006F006E007400610069006E0065007200000002000B00984D0000DEA9FFFF7A580000DEA9FFFF0000000002000000F0F0F00000000000000000000000000000000000010000006500000000000000ED4200008DAAFFFF3820000058010000320000000100000200003820000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61370046004B005F00410067006700720065006700610074006500460069006C0074006500720053007500620043006F006E007400610069006E00650072005F00410067006700720065006700610074006500460069006C0074006500720043006F006E007400610069006E006500720002000B00984D000002A4FFFF7A58000002A4FFFF0000000002000000F0F0F0000000000000000000000000000000000001000000670000000000000096420000FBA1FFFFE52000005801000032000000010000020000E520000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61380046004B005F00410067006700720065006700610074006500460069006C0074006500720053007500620043006F006E007400610069006E00650072005F00410067006700720065006700610074006500460069006C0074006500720043006F006E007400610069006E00650072003100214334120800000036220000CF1C0000785634120700000014010000410067006700720065006700610074006500460069006C0074006500720000007600650072002E004200610074006300680050006100720073006500720043006C00690065006E0074002C002000560065007200730069006F006E003D00310031002E0030002E0030002E0030002C002000430075006C0074007500720065003D006E00650075007400720061006C002C0020005000750062006C00690063004B006500790054006F006B0065006E003D00380039003800340035006400630064003800300038003000630063003900310000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000540000002C0000002C0000002C00000034000000000000000000000036220000CF1C0000000000002D010000070000000C000000070000001C01000026070000DC05000094020000390300003A020000DE030000DD040000EE020000DD040000360600003804000000000000010000000B2400005015000000000000050000000500000002000000020000001C0100002A1200000000000001000000D9100000AF08000000000000020000000200000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000006800000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F00000010000000410067006700720065006700610074006500460069006C00740065007200000002000B00984D0000E6B0FFFF10590000E6B0FFFF0000000002000000F0F0F0000000000000000000000000000000000001000000700000000000000055440000DFAEFFFFE51800005801000045000000010000020000E518000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D612B0046004B005F00410067006700720065006700610074006500460069006C007400650072005F00410067006700720065006700610074006500460069006C0074006500720043006F006E007400610069006E006500720021433412080000007829000020170000785634120700000014010000410067006700720065006700610074006500440069006D0065006E00730069006F006E000000674797F9A80390A9CEBA040000000200000000001066000000010000200000005A66D11F3372CF63785FCA7F40C69EA7DCEDA7CC247BCFBB00C38E42D74AECAA000000000E800000000200002000000022DD4B17FD42971A525C6C9C486DCAF55C6C488516735862E36E352C2D42E2C460000000A7DE800C07B35B3F0D6263AC81AE6E31CA8A493A12274568746645EF462AD47FD8892C9460826B6F5F558A0E75CC4E4AC5561556A9455D20A14B4EE450E669AB1E892532D8D21B364B2F844052BF0F8ECA46A54A000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000007829000020170000000000002D0100000D0000000C000000070000001C0100005F0A0000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000006E00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F00000013000000410067006700720065006700610074006500440069006D0065006E00730069006F006E00000002000B00F8230000C2B6FFFFB42D0000C2B6FFFF0000000002000000F0F0F00000000000000000000000000000000000010000007300000000000000351B000071B7FFFFED1A00005801000033000000010000020000ED1A000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D612C0046004B005F00410067006700720065006700610074006500440069006D0065006E00730069006F006E005F0041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E0002000B005C2B00001CA8FFFFF82300001CA8FFFF0000000002000000F0F0F00000000000000000000000000000000000010000007500000000000000E818000015A6FFFF831D00005801000032000000010000020000831D000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61320046004B005F0041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E005F00410067006700720065006700610074006500460069006C0074006500720043006F006E007400610069006E006500720021433412080000003C2200000E150000785634120700000014010000410067006700720065006700610074006500460069006C0074006500720050006100720061006D006500740065007200000000000200000000001066000000010000200000005A66D11F3372CF63785FCA7F40C69EA7DCEDA7CC247BCFBB00C38E42D74AECAA000000000E800000000200002000000022DD4B17FD42971A525C6C9C486DCAF55C6C488516735862E36E352C2D42E2C460000000A7DE800C07B35B3F0D6263AC81AE6E31CA8A493A12274568746645EF462AD47FD8892C9460826B6F5F558A0E75CC4E4AC5561556A9455D20A14B4EE450E669AB1E892532D8D21B364B2F844052BF0F8ECA46A54A000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000003C2200000E150000000000002D0100000D0000000C000000070000001C01000026070000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000007A00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F00000019000000410067006700720065006700610074006500460069006C0074006500720050006100720061006D006500740065007200000002000B00467B0000A8B2FFFFD6830000A8B2FFFF0000000002000000F0F0F00000000000000000000000000000000000010000007800000000000000F072000057B3FFFF3C19000058010000320000000100000200003C19000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D612B0046004B005F00410067006700720065006700610074006500460069006C0074006500720050006100720061006D0065007400650072005F00410067006700720065006700610074006500460069006C007400650072002143341208000000822E0000641F000078563412070000001401000043006100740061006C006F006700750065004900740065006D004900730073007500650000002E0030002E0030002C002000430075006C0074007500720065003D006E00650075007400720061006C002C0020005000750062006C00690063004B006500790054006F006B0065006E003D0062003700370061003500630035003600310039003300340065003000380039000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000540000002C0000002C0000002C000000340000000000000000000000822E0000641F0000000000002D010000090000000C000000070000001C0100006C0C0000DC05000094020000390300003A020000DE030000DD040000EE020000DD040000360600003804000000000000010000003E260000E717000000000000070000000700000002000000020000001C010000561300000000000001000000D91000006806000000000000010000000100000002000000020000001C010000260700000100000000000000D91000009E03000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000006E00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000001300000043006100740061006C006F006700750065004900740065006D0049007300730075006500000003000B0070620000E6FBFFFF7062000074F5FFFFF276000074F5FFFF0000000002000000F0F0F000000000000000000000000000000000000100000082000000000000008062000023F6FFFFA11500005801000032000000010000020000A115000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61230046004B005F0043006100740061006C006F006700750065004900740065006D00490073007300750065005F0043006100740061006C006F006700750065004900740065006D0021433412080000003C2200009315000078563412070000001401000049007300730075006500530079007300740065006D005500730065007200000001000000C800000000000000D800000003000000010000000001000000000000446174615F5053004D756C7469706C7952616469616C4772616469656E7443656E74657265645F5053315F436F6E7374616E745461626C6500666C48616C66546578656C53697A654E6F726D616C697A656400AB000003000100010001000000000000007D00000098000000050000000100010001000100A80000004C000000B0000000050000000100010001000100C00000004D756C7469706C7952616469616C4772616469656E7443656E74000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000003C22000093150000000000002D0100000D0000000C000000070000001C01000026070000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000006800000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000001000000049007300730075006500530079007300740065006D005500730065007200000003000B00E2B3000003E2FFFFE2B3000040EDFFFF74A5000040EDFFFF0000000002000000F0F0F00000000000000000000000000000000000010000008500000000000000F09700007CE3FFFF431B00005801000007000000010000020000431B000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D612B0046004B005F0043006100740061006C006F006700750065004900740065006D00490073007300750065005F004F0077006E00650072005F0049007300730075006500530079007300740065006D00550073006500720003000B00F4B0000042DCFFFFDC9B000042DCFFFFDC9B00000CE5FFFF0000000002000000F0F0F000000000000000000000000000000000000100000087000000000000004B9200003BDAFFFF801C00005801000007000000010000020000801C000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D612E0046004B005F0043006100740061006C006F006700750065004900740065006D00490073007300750065005F005200650070006F0072007400650072005F0049007300730075006500530079007300740065006D00550073006500720021433412080000003C220000BC12000078563412070000001401000041004E004F005400610062006C00650000006E0066006F00000000000200000001000000C800000000000000D800000003000000010000000001000000000000446174615F5053004D756C7469706C7952616469616C4772616469656E7443656E74657265645F5053315F436F6E7374616E745461626C6500666C48616C66546578656C53697A654E6F726D616C697A656400AB000003000100010001000000000000007D00000098000000050000000100010001000100A80000004C000000B0000000050000000100010001000100C00000004D756C7469706C7952616469616C4772616469656E7443656E74000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000003C220000BC120000000000002D0100000D0000000C000000070000001C01000026070000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000005A00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000000900000041004E004F005400610062006C006500000002000B0002B7FFFFEC130000FCD6FFFFEC1300000000000002000000F0F0F00000000000000000000000000000000000010000008C00000000000000D8BFFFFF9B1400004E0E000058010000320000000100000200004E0E000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61160046004B005F0043006F006C0075006D006E0049006E0066006F005F0041004E004F005400610062006C00650021433412080000003C2200007B1A00007856341207000000140100005000720065004C006F006100640044006900730063006100720064006500640043006F006C0075006D006E0000000000040000000200000000001066000000010000200000005A66D11F3372CF63785FCA7F40C69EA7DCEDA7CC247BCFBB00C38E42D74AECAA000000000E800000000200002000000022DD4B17FD42971A525C6C9C486DCAF55C6C488516735862E36E352C2D42E2C460000000A7DE800C07B35B3F0D6263AC81AE6E31CA8A493A12274568746645EF462AD47FD8892C9460826B6F5F558A0E75CC4E4AC5561556A9455D20A14B4EE450E669AB1E892532D8D21B364B2F844052BF0F8ECA46A54A000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000003C2200007B1A0000000000002D0100000D0000000C000000070000001C01000052080000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000007600000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F000000170000005000720065004C006F006100640044006900730063006100720064006500640043006F006C0075006D006E00000002000B00F4CFFFFF26340000C2C9FFFF263400000000000002000000F0F0F00000000000000000000000000000000000010000008F0000000000000019C2FFFF1F3200008415000058010000320000000100000200008415000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61230046004B005F005000720065004C006F006100640044006900730063006100720064006500640043006F006C0075006D006E005F005400610062006C00650049006E0066006F0021433412080000009A290000A51B0000785634120700000014010000500072006F0063006500730073005400610073006B0041007200670075006D0065006E00740000002C002000560065007200730069006F006E003D0034002E0030002E0030002E0030002C002000430075006C0074007500720065003D006E00650075007400720061006C002C0020005000750062006C00690063004B006500790054006F006B0065006E003D00620037003700610035006300350036003100390033003400650030003800390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000009A290000A51B0000000000002D0100000D0000000C000000070000001C010000F70800005307000094020000390300003A020000DD040000DD040000EE020000DD04000036060000380400000000000001000000F21300000804000000000000000000000000000002000000020000001C010000F70800000000000001000000F21300000804000000000000000000000000000002000000020000001C010000F70800000100000000000000F21300000804000000000000000000000000000002000000020000001C010000F7080000000000000000000055320000DD23000000000000000000000D00000004000000040000001C010000F70800009B0A00008106000078563412040000007000000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F00000014000000500072006F0063006500730073005400610073006B0041007200670075006D0065006E007400000002000B009ED10000EC5E000036D80000EC5E00000000000002000000F0F0F0000000000000000000000000000000000001000000950000000000000044CA0000E55C00004B15000058010000320000000100000200004B15000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61220046004B005F00500072006F0063006500730073005400610073006B0041007200670075006D0065006E0074005F00500072006F0063006500730073005400610073006B00214334120800000002230000D1240000785634120700000014010000500072006F0063006500730073005400610073006B0000006700720061006D002000460069006C00650073002000280078003800360029002F004D006900630072006F0073006F00660074002000530051004C0020005300650072007600650072002F003100310030002F0054006F006F006C0073002F00420069006E006E002F004D0061006E006100670065006D0065006E007400530074007500640069006F002F004900440045002F00500072006900760061007400650041007300730065006D0062006C006900650073002F004F0062006A006500630074004500780070006C006F007200650072005200000000000000000000000000000005000000540000002C0000002C0000002C00000034000000000000000000000002230000D1240000000000002D0100000D0000000C000000070000001C010000450600002805000094020000390300003A02000066030000DD040000EE020000DD040000360600003804000000000000010000004C0F00000804000000000000000000000000000002000000020000001C0100004506000000000000010000004C0F00000804000000000000000000000000000002000000020000001C0100004506000001000000000000004C0F00000804000000000000000000000000000002000000020000001C010000450600000000000000000000CB2400007C24000000000000000000000D00000004000000040000001C01000045060000710700009204000078563412040000006000000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000000C000000500072006F0063006500730073005400610073006B00000003000B00243900007A0D0000DE3F00007A0D0000DE3F000020CCFFFF0000000002000000F0F0F000000000000000000000000000000000000100000097000000000000008D4000008BF0FFFFAF1900005801000032000000010000020000AF19000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D612B0046004B005F00410067006700720065006700610074006500440069006D0065006E00730069006F006E005F00450078007400720061006300740069006F006E0049006E0066006F0072006D006100740069006F006E0003000B0021720000E691000092B80000E691000092B80000A37F00000000000002000000F0F0F00000000000000000000000000000000000010000009B00000000000000E99E000095920000DF0E00005801000032000000010000020000DF0E000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61180046004B005F00500072006F0063006500730073005400610073006B005F0043006100740061006C006F0067007500650000020000F90C0000160900000200640000000500008000000000000000003A00010000009001C0D40100085365676F652055491E004E0065007600650072002000430041005300430041004400450020000D000A00440045004C0045005400450020000D000A0048006500720065002100214334120800000036220000472400007856341207000000140100004C006F00610064004D006F00640075006C00650041007300730065006D0062006C0079000000000000000000D800000003000000010000000001000000000000446174615F5053004D756C7469706C7952616469616C4772616469656E7443656E74657265645F5053315F436F6E7374616E745461626C6500666C48616C66546578656C53697A654E6F726D616C697A656400AB000003000100010001000000000000007D00000098000000050000000100010001000100A80000004C000000B0000000050000000100010001000100C00000004D756C7469706C7952616469616C4772616469656E7443656E74000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000003622000047240000000000002D0100000D0000000C000000070000001C01000026070000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000006E00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F000000130000004C006F00610064004D006F00640075006C00650041007300730065006D0062006C007900000021433412080000009E390000252700007856341207000000140100004C006F00610064005300630068006500640075006C00650000005300650072007600650072002E004200610074006300680050006100720073006500720043006C00690065006E0074002C002000560065007200730069006F006E003D00310031002E0030002E0030002E0030002C002000430075006C0074007500720065003D006E00650075007400720061006C002C0020005000750062006C00690063004B006500790054006F006B0065006E003D00380039003800340035006400630064003800300038003000630063003900310000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000009E39000025270000000000002D0100000D0000000C000000070000001C010000C50D0000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000104F0000B1240000000000000B0000000B00000002000000020000001C0100007B2A00000000000001000000D9100000AF08000000000000020000000200000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000006200000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000000D0000004C006F00610064005300630068006500640075006C006500000021433412080000007829000010190000785634120700000014010000450078007400650072006E0061006C0044006100740061006200610073006500530065007200760065007200000000007501000000000000140000000000000000000000010000000400000075010000430000004700000004000000000000000600000004000000750100001400000047000000010000000300000005000000E4FFFFFF750100001400000047000000000000000300000005000000E8FFFFFF7501000014000000470000000200000003000000050000000800000075010000530000005C0100000400000000000000060000000800000075010000530000005C01000001000000030000000500000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000007829000010190000000000002D0100000D0000000C000000070000001C01000026070000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000007600000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F00000017000000450078007400650072006E0061006C0044006100740061006200610073006500530065007200760065007200000003000B0036F7FFFFFC6C0000B4E2FFFFFC6C0000B4E2FFFF495900000000000002000000F0F0F0000000000000000000000000000000000001000000A40000000000000044CDFFFFAB6D00002D15000058010000320000000100000200002D15000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61230046004B005F005400610062006C00650049006E0066006F005F00450078007400650072006E0061006C004400610074006100620061007300650053006500720076006500720003000B004C1D00001E8300004C1D0000089D0000A8480000089D00000000000002000000F0F0F0000000000000000000000000000000000001000000A700000000000000F50F0000B79D00008415000058010000320000000100000200008415000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D61230046004B005F0043006100740061006C006F006700750065005F00450078007400650072006E0061006C004400610074006100620061007300650053006500720076006500720003000B00701700001E830000701700004EA20000A84800004EA200000000000002000000F0F0F0000000000000000000000000000000000001000000A900000000000000B4090000FDA200003116000058010000320000000100000200003116000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D61240046004B005F0043006100740061006C006F006700750065005F00450078007400650072006E0061006C0044006100740061006200610073006500530065007200760065007200310003000B0036F7FFFF546F00002EA5FFFF546F00002EA5FFFF122600000000000002000000F0F0F0000000000000000000000000000000000001000000AB00000000000000DDA5FFFF926800006715000058010000380000000100000200006715000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D61220046004B005F0041004E004F005400610062006C0065005F00450078007400650072006E0061006C00440061007400610062006100730065005300650072007600650072002143341208000000C61B0000E61700007856341207000000140100004C006F006100640050006500720069006F0064006900630061006C006C0079000000440026004400570044004F0052004A005800480003001000030026004400570044004F0052004A005800480042002700440057004400420027004C0044004A00550044005000000080400000004100001041000000410000C040000040400000C0400000E04000008040000040400000E040000080400000C0400000E0400000E04000008040000000410000C040000080400000C040000000410000C040000080400000C040000040400000E0400000E0400000E0400000C040000040400000A04000004040000000410000000000000000000000000000000005000000540000002C0000002C0000002C000000340000000000000000000000C61B0000E6170000000000002D0100000D0000000C000000070000001C010000890D0000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000006A00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F000000110000004C006F006100640050006500720069006F0064006900630061006C006C007900000002000B00B42D0000E4C1FFFFF8230000E4C1FFFF0000000002000000F0F0F0000000000000000000000000000000000001000000B0000000000000005F1B0000DDBFFFFFED1A00005801000032000000010000020000ED1A000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D612C0046004B005F0041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E005F00410067006700720065006700610074006500440069006D0065006E00730069006F006E002143341208000000E71B0000DF3500007856341207000000140100004C006F00610064004D0065007400610064006100740061000000954000000000000010400100000000000000000000000E000000050000001801000000000000000000000000000000000000F800000000000000050000000000000000000000020000000000000000C0954000000000000000000000000000C095400000000000000040040000002000000030000000000000000000000000B8954000000000000010400000000000000040000000000000004000000000000000000100000000000000050000000000000040000000010000000000000000000040000000000000104004000000200000002000000000000000000000000100000005000000540000002C0000002C0000002C0000003400000000000000000000003622000047240000000000002D0100000D0000000C000000070000001C01000026070000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000E71B0000DF35000000000000140000000C00000002000000020000001C0100007A0D00000000000001000000D91000006806000000000000010000000100000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000006200000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000000D0000004C006F00610064004D006500740061006400610074006100000002000B00AA820000F654000021720000F65400000000000002000000F0F0F0000000000000000000000000000000000001000000BF0000000000000066720000EF520000FF0F00005801000032000000010000020000FF0F000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D61190046004B005F0043006100740061006C006F006700750065005F004C006F00610064004D00650074006100640061007400610004000B00919E000086880000919E000084940000CA9E000084940000CA9E0000F69F00000200000002000000F0F0F0000000000000000000000000000000000001000000C100000000000000D98A0000069500000913000058010000320000000100000200000913000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D61200046004B005F004C006F006100640050006500720069006F0064006900630061006C006C0079005F004C006F00610064004D00650074006100640061007400610002000B00919E00003A6B00009CAE00003A6B00000000000002000000F0F0F0000000000000000000000000000000000001000000C300000000000000079E0000E96B00001F11000058010000320000000100000200001F11000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D611B0046004B005F00500072006F0063006500730073005400610073006B005F004C006F00610064004D00650074006100640061007400610004000B00919E0000E88000008EA90000E88000008EA90000D6830000D8BD0000D68300000000000002000000F0F0F0000000000000000000000000000000000001000000C50000000000000081AA0000CF810000E91100005801000032000000010000020000E911000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D611C0046004B005F004C006F00610064005300630068006500640075006C0065005F004C006F00610064004D0065007400610064006100740061002143341208000000362200003A1A000078563412070000001401000044004C004500570069006E0064006F0077007300530065007200760069006300650045007800630065007000740069006F006E000000720073006500720043006C00690065006E0074002C002000560065007200730069006F006E003D00310031002E0030002E0030002E0030002C002000430075006C0074007500720065003D006E00650075007400720061006C002C0020005000750062006C00690063004B006500790054006F006B0065006E003D00380039003800340035006400630064003800300038003000630063003900310000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000540000002C0000002C0000002C000000340000000000000000000000362200003A1A0000000000002D010000080000000C000000070000001C01000026070000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000621700007B1A000000000000060000000600000002000000020000001C010000E60A00000000000001000000D91000006806000000000000010000000100000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000007E00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000001B00000044004C004500570069006E0064006F0077007300530065007200760069006300650045007800630065007000740069006F006E00000002000B00408300001389000040830000CA9E00000000000002000000F0F0F0000000000000000000000000000000000001000000C800000000000000FC67000042930000951A00005801000032000000010000020000951A000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D612A0046004B005F0044004C004500570069006E0064006F0077007300530065007200760069006300650045007800630065007000740069006F006E005F004C006F00610064004D00650074006100640061007400610005000B00849900001389000084990000849400004C990000849400004C9900008CA000009E9D00008CA000000000000002000000F0F0F0000000000000000000000000000000000001000000CA00000000000000E7840000C9950000B61300005801000033000000010000020000B613000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D61210046004B005F004C006F006100640050006500720069006F0064006900630061006C006C0079005F004C006F00610064004D00650074006100640061007400610031002143341208000000112E00007116000078563412070000001401000041006700670072006500670061007400650043006F006E00740069006E0075006F0075007300440061007400650041007800690073000000010000002CF19F123CF19F1204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A891B10B000400000000000074F19F120400000000000000000000000000000000000000000000000000000080457D121884AC0B00000000AA550000E0F09F1210000000604578120C0000000500000094DF7B007CDF7B00C4F19F1200000000D5FFAA55001000000C00000000000000A891B10B0000000000000000000000000000000005000000540000002C0000002C0000002C000000340000000000000000000000112E000071160000000000002D0100000D0000000C000000070000001C010000F7080000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000008000000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000001C00000041006700670072006500670061007400650043006F006E00740069006E0075006F007500730044006100740065004100780069007300000002000B00F843000020CCFFFFF8430000F4CFFFFF0200000002000000F0F0F0000000000000000000000000000000000001000000CD00000000000000C22400005ECDFFFF871E00005801000032000000010000020000871E000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D61310046004B005F0041006700670072006500670061007400650043006F006E00740069006E0075006F0075007300440061007400650041007800690073005F00410067006700720065006700610074006500440069006D0065006E00730069006F006E0021433412080000003D2200006910000078563412070000001401000041006700670072006500670061007400650046006F0072006300650064004A006F0069006E00000000000000D800000003000000010000000001000000000000446174615F5053004D756C7469706C7952616469616C4772616469656E7443656E74657265645F5053315F436F6E7374616E745461626C6500666C48616C66546578656C53697A654E6F726D616C697A656400AB000003000100010001000000000000007D00000098000000050000000100010001000100A80000004C000000B0000000050000000100010001000100C00000004D756C7469706C7952616469616C4772616469656E7443656E74000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000003D22000069100000000000002D0100000D0000000C000000070000001C01000015090000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000007000000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000001400000041006700670072006500670061007400650046006F0072006300650064004A006F0069006E00000003000B0072060000CDCBFFFF720600005ECFFFFFB80B00005ECFFFFF0000000002000000F0F0F0000000000000000000000000000000000001000000D20000000000000064EAFFFFE9CFFFFF5F1B000058010000270000000100000200005F1B000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D612D0046004B005F0041006700670072006500670061007400650046006F0072006300650064004A006F0069006E005F0041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E0004000B00AEF9FFFF263400008707000026340000870700009ADEFFFFB80B00009ADEFFFF0000000002000000F0F0F0000000000000000000000000000000000001000000D40000000000000036080000241600007C130000580100002B0000000100000200007C13000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D61200046004B005F0041006700670072006500670061007400650046006F0072006300650064004A006F0069006E005F005400610062006C00650049006E0066006F0007000B00A8480000B42D0000F2430000B42D0000F243000020280000BC3C000020280000BC3C00005DCDFFFF282300005DCDFFFF28230000CDCBFFFF0000000002000000F0F0F0000000000000000000000000000000000001000000D6000000000000006B3D00003DECFFFF4B15000058010000380000000100000200004B15000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D61230046004B005F0041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E005F0043006100740061006C006F006700750065000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000FEFFFFFFFEFFFFFF0400000005000000060000000700000008000000090000000A0000000B0000000C0000000D0000000E0000000F000000100000001100000012000000130000001400000015000000160000001700000018000000190000001A0000001B0000001C0000001D0000001E0000001F00000020000000210000002200000023000000240000002500000026000000270000002800000029000000FEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0100FEFF030A0000FFFFFFFF00000000000000000000000000000000170000004D6963726F736F66742044445320466F726D20322E300010000000456D626564646564204F626A6563740000000000F439B271000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010003000000000000000C0000000B0000004E61BC00000000000000000000000000000000000000000000000000000000000000000000000000000000000000DBE6B0E91C81D011AD5100A0C90F573900000200D062F43BF38BD0010202000010484500000000000000000000000000000000007A0100004400610074006100200053006F0075007200630065003D006A0061006E00750073003B0049006E0069007400690061006C00200043006100740061006C006F0067003D0053007000720069006E00740046006F0075007200440061007400610043006100740061006C006F006700750065003B0049006E00740065006700720061007400650064002000530065006300750072006900740079003D0054007200750065003B004D0075006C007400690070006C00650041006300740069007600650052006500730075006C00740053006500740073003D00460061006C00730065003B005000610063006B00650074002000530069007A0065003D0034003000390036003B0041000300440064007300530074007200650061006D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160002000300000006000000FFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000005E0000007A6500000000000053006300680065006D00610020005500440056002000440065006600610075006C0074000000000000000000000000000000000000000000000000000000000026000200FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000020000001600000000000000440053005200450046002D0053004300480045004D0041002D0043004F004E00540045004E0054005300000000000000000000000000000000000000000000002C0002010500000007000000FFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000003000000A40900000000000053006300680065006D00610020005500440056002000440065006600610075006C007400200050006F007300740020005600360000000000000000000000000036000200FFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000002A00000012000000000000008100000082000000830000008400000085000000860000008700000088000000890000008A0000008B0000008C0000008D0000008E0000008F00000090000000FEFFFFFF92000000930000009400000095000000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C0000000CCFFFFF7289FFFF0100260000007300630068005F006C006100620065006C0073005F00760069007300690062006C0065000000010000000B0000001E000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000010000000100000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003A00000034002C0030002C003200380034002C0030002C0032003200390035002C0031002C0031003800370035002C0035002C0031003200340035000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0032003700390030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0032003200390035002C00310032002C0032003700310035002C00310031002C0031003600360035000000020000000200000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003A00000034002C0030002C003200380034002C0030002C0033003300370035002C0031002C0031003800370035002C0035002C0031003200340035000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0032003700370035000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0032003200390035002C00310032002C0032003700310035002C00310031002C0031003600360035000000030000000300000000000000540000000103737401000000640062006F00000046004B005F0043006100740061006C006F006700750065005F004900740065006D0073005F0044006100740061005F0043006100740061006C006F0067007500650000000000000000000000C40200000000040000000400000003000000080000000100650DC800650D0000000000000000AD070000000000050000000500000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003A00000034002C0030002C003200380034002C0030002C0032003200390035002C0031002C0031003800370035002C0035002C0031003200340035000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0033003500370030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0032003200390035002C00310032002C0032003700310035002C00310031002C0031003600360035000000060000000600000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003A00000034002C0030002C003200380034002C0030002C0032003800300035002C0031002C0031003800370035002C0035002C0031003200340035000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0032003700390030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0032003200390035002C00310032002C0032003700310035002C00310031002C00310036003600350000000700000007000000000000004600000001038A7601000000640062006F00000046004B005F005400610062006C0065005F004900740065006D0073005F0044006100740061005F005400610062006C006500730000000000000000000000C40200000000080000000800000007000000080000000100650D8800650D0000000000000000AD0700000000000D0000000D00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003A00000034002C0030002C003200380034002C0030002C0032003200390035002C0031002C0031003800370035002C0035002C0031003200340035000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0032003200390035002C00310032002C0032003700310035002C00310031002C00310036003600350000001200000012000000000000005E00000001FF5F5E01000000640062006F00000046004B005F0043006F006C0075006D006E0049006E0066006F005F0043006100740061006C006F006700750065004900740065006D005F0043006F006C0075006D006E0049006E0066006F0000000000000000000000C40200000000130000001300000012000000080000000100650D4800650D0000000000000000AD0700000000001600000016000000000000006400000001016F0001000000640062006F00000046004B005F0043006F006C0075006D006E0049006E0066006F005F0043006100740061006C006F006700750065004900740065006D005F0043006100740061006C006F006700750065004900740065006D0000000000000000000000C40200000000170000001700000016000000080000000100650D0800650D0000000000000000AD070000000000180000001800000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003800330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C00310033003300350000001900000019000000000000005000000001FF5F5E01000000640062006F00000046004B005F0053007500700070006F007200740069006E00670044006F00630075006D0065006E0074005F0043006100740061006C006F0067007500650000000000000000000000C402000000001A0000001A000000190000000800000001FF640DC8FF640D0000000000000000AD0700000000001B0000001B00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0032003400300030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000220000002200000000000000740000000102000001000000640062006F00000046004B005F0043006F006C0075006D006E0049006E0066006F005F0043006100740061006C006F006700750065004900740065006D005F00450078007400720061006300740069006F006E0049006E0066006F0072006D006100740069006F006E0000000000000000000000C402000000002300000023000000220000000800000001FF640D88FF640D0000000000000000AD070000000000240000002400000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003A00000034002C0030002C003200380034002C0030002C0032003000370030002C0031002C0031003600390035002C0035002C0031003100320035000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0032003000370030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0032003000370030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0032003000370030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0032003000370030002C00310032002C0032003400340035002C00310031002C00310035003000300000002700000027000000000000003A0000000106000001000000640062006F00000046004B005F004C006F006F006B00750070005F0043006F006C0075006D006E0049006E0066006F0000000000000000000000C402000000002800000028000000270000000800000001FF640D48FF640D0000000000000000AD0700000000002900000029000000000000003C0000000107000001000000640062006F00000046004B005F004C006F006F006B00750070005F0043006F006C0075006D006E0049006E0066006F00310000000000000000000000C402000000002A0000002A000000290000000800000001FF640D08FF640D0000000000000000AD0700000000002B0000002B000000000000003C0000000105000001000000640062006F00000046004B005F004C006F006F006B00750070005F0043006F006C0075006D006E0049006E0066006F00320000000000000000000000C402000000002C0000002C0000002B0000000800000001FE640DC8FE640D0000000000000000AD0700000000002F0000002F00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003A00000034002C0030002C003200380034002C0030002C0032003000370030002C0031002C0031003600320030002C0035002C0031003100320035000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0032003000370030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0032003000370030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0032003000370030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0032003000370030002C00310032002C0032003400340035002C00310031002C00310035003000300000003300000033000000000000005000000001FF5F5E01000000640062006F00000046004B005F004A006F0069006E0049006E0066006F005F0043006F006C0075006D006E0049006E0066006F005F004A006F0069006E004B0065007900310000000000000000000000C402000000003400000034000000330000000800000001FE640D88FE640D0000000000000000AD0700000000003500000035000000000000005000000001FF5F5E01000000640062006F00000046004B005F004A006F0069006E0049006E0066006F005F0043006F006C0075006D006E0049006E0066006F005F004A006F0069006E004B0065007900320000000000000000000000C402000000003600000036000000350000000800000001FE640D48FE640D0000000000000000AD070000000000380000003800000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003A00000034002C0030002C003200380034002C0030002C0032003000350035002C0031002C0031003100370030002C0035002C0031003000360035000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C00310033003300350000003900000039000000000000006400000001006F0001000000640062006F00000046004B005F00450078007400720061006300740069006F006E00460069006C007400650072005F00450078007400720061006300740069006F006E0049006E0066006F0072006D006100740069006F006E0000000000000000000000C402000000003A0000003A000000390000000800000001FE640D08FE640D0000000000000000AD0700000000003B0000003B00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003A00000034002C0030002C003200380034002C0030002C0031003500340035002C0031002C0031003100370030002C0035002C0031003000360035000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C00310033003300350000003C0000003C000000000000006C000000011A5F5E01000000640062006F00000046004B005F00450078007400720061006300740069006F006E00460069006C0074006500720050006100720061006D0065007400650072005F00450078007400720061006300740069006F006E00460069006C0074006500720000000000000000000000C402000000003D0000003D0000003C0000000800000001FD640DC8FD640D0000000000000000AD070000000000400000004000000000000000560000000103737401000000640062006F00000046004B005F0043006100740061006C006F006700750065005F00450078007400720061006300740069006F006E0049006E0066006F0072006D006100740069006F006E0000000000000000000000C402000000004100000041000000400000000800000001FD640D88FD640D0000000000000000AD0700000000004C0000004C00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003800330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0035003000370030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000540000005400000000000000540000000103737401000000640062006F00000046004B005F004C006F006F006B007500700043006F006D0070006F0073006900740065004A006F0069006E0049006E0066006F005F004C006F006F006B007500700000000000000000000000C402000000005500000055000000540000000800000001FD640D48FD640D0000000000000000AD0700000000005600000056000000000000005C00000001FF5F5E01000000640062006F00000046004B005F004C006F006F006B007500700043006F006D0070006F0073006900740065004A006F0069006E0049006E0066006F005F0043006F006C0075006D006E0049006E0066006F0000000000000000000000C402000000005700000057000000560000000800000001FD640D08FD640D0000000000000000AD0700000000005900000059000000000000006200000001006F0001000000640062006F00000046004B005F004C006F006F006B007500700043006F006D0070006F0073006900740065004A006F0069006E0049006E0066006F005F0043006F006C0075006D006E0049006E0066006F005F0046004B0000000000000000000000C402000000005A0000005A000000590000000800000001FC640DC8FC640D0000000000000000AD0700000000005C0000005C00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003800330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C00310033003300350000005D0000005D000000000000005000000001FF5F5E01000000640062006F00000046004B005F0053007500700070006F007200740069006E006700530051004C005400610062006C0065005F0043006100740061006C006F0067007500650000000000000000000000C402000000005E0000005E0000005D0000000800000001FC640D88FC640D0000000000000000AD0700000000005F0000005F00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003800330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000600000006000000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0032003600340030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000630000006300000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0033003100320030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000640000006400000000000000800000000106401001000000640062006F00000046004B005F00410067006700720065006700610074006500460069006C0074006500720053007500620043006F006E007400610069006E00650072005F00410067006700720065006700610074006500460069006C0074006500720043006F006E007400610069006E006500720000000000000000000000C402000000006500000065000000640000000800000001FC640D48FC640D0000000000000000AD0700000000006600000066000000000000008200000001FF690001000000640062006F00000046004B005F00410067006700720065006700610074006500460069006C0074006500720053007500620043006F006E007400610069006E00650072005F00410067006700720065006700610074006500460069006C0074006500720043006F006E007400610069006E0065007200310000000000000000000000C402000000006700000067000000660000000800000001F57115C8F571150000000000000000AD0700000000006E0000006E00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003800330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0034003600350030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C00310033003300350000006F0000006F000000000000006800000001006F0001000000640062006F00000046004B005F00410067006700720065006700610074006500460069006C007400650072005F00410067006700720065006700610074006500460069006C0074006500720043006F006E007400610069006E006500720000000000000000000000C4020000000070000000700000006F0000000800000001F5711588F571150000000000000000AD070000000000710000007100000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0032003600350035002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C00310033003300350000007200000072000000000000006A000000011A5F5E01000000640062006F00000046004B005F00410067006700720065006700610074006500440069006D0065006E00730069006F006E005F0041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E0000000000000000000000C402000000007300000073000000720000000800000001F5711548F571150000000000000000AD070000000000740000007400000000000000760000000102000001000000640062006F00000046004B005F0041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E005F00410067006700720065006700610074006500460069006C0074006500720043006F006E007400610069006E006500720000000000000000000000C402000000007500000075000000740000000800000001F5711508F571150000000000000000AD070000000000760000007600000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003800330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C00310033003300350000007700000077000000000000006800000001016F0001000000640062006F00000046004B005F00410067006700720065006700610074006500460069006C0074006500720050006100720061006D0065007400650072005F00410067006700720065006700610074006500460069006C0074006500720000000000000000000000C402000000007800000078000000770000000800000001F47115C8F471150000000000000000AD0700000000007C0000007C00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0033003100380030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0034003900350030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000810000008100000000000000580000000103737401000000640062006F00000046004B005F0043006100740061006C006F006700750065004900740065006D00490073007300750065005F0043006100740061006C006F006700750065004900740065006D0000000000000000000000C402000000008200000082000000810000000800000001F4711588F471150000000000000000AD070000000000830000008300000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003800330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C00310033003300350000008400000084000000000000006800000001016F0001000000640062006F00000046004B005F0043006100740061006C006F006700750065004900740065006D00490073007300750065005F004F0077006E00650072005F0049007300730075006500530079007300740065006D00550073006500720000000000000000000000C402000000008500000085000000840000000800000001F4711548F471150000000000000000AD0700000000008600000086000000000000006E000000011A5F5E01000000640062006F00000046004B005F0043006100740061006C006F006700750065004900740065006D00490073007300750065005F005200650070006F0072007400650072005F0049007300730075006500530079007300740065006D00550073006500720000000000000000000000C402000000008700000087000000860000000800000001F4711508F471150000000000000000AD070000000000880000008800000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003800330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C00310033003300350000008B0000008B000000000000003E0000000105000001000000640062006F00000046004B005F0043006F006C0075006D006E0049006E0066006F005F0041004E004F005400610062006C00650000000000000000000000C402000000008C0000008C0000008B0000000800000001F37115C8F371150000000000000000AD0700000000008D0000008D00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0032003100330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C00310033003300350000008E0000008E00000000000000580000000102737401000000640062006F00000046004B005F005000720065004C006F006100640044006900730063006100720064006500640043006F006C0075006D006E005F005400610062006C00650049006E0066006F0000000000000000000000C402000000008F0000008F0000008E0000000800000001F3711588F371150000000000000000AD070000000000900000009000000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003600300035002C0031002C0031003300320030002C0035002C003800370030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003600300035000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003600300035000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003600300035000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003600300035002C00310032002C0031003900300035002C00310031002C0031003100370030000000910000009100000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003A00000034002C0030002C003200380034002C0030002C0032003200390035002C0031002C0031003800370035002C0035002C0031003200340035000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0032003200390035002C00310032002C0032003700310035002C00310031002C0031003600360035000000940000009400000000000000560000000101737401000000640062006F00000046004B005F00500072006F0063006500730073005400610073006B0041007200670075006D0065006E0074005F00500072006F0063006500730073005400610073006B0000000000000000000000C402000000009500000095000000940000000800000001F3711548F371150000000000000000AD0700000000009600000096000000000000006800000001016F0001000000640062006F00000046004B005F00410067006700720065006700610074006500440069006D0065006E00730069006F006E005F00450078007400720061006300740069006F006E0049006E0066006F0072006D006100740069006F006E0000000000000000000000C402000000009700000097000000960000000800000001F3711508F371150000000000000000AD0700000000009A0000009A000000000000004200000001038A7601000000640062006F00000046004B005F00500072006F0063006500730073005400610073006B005F0043006100740061006C006F0067007500650000000000000000000000C402000000009B0000009B0000009A0000000800000001F27115C8F271150000000000000000AD0700000000009C0000009C000000000000000800000001F2711588F271150000000000000000E40700000000009D0000009D00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003800330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C00310033003300350000009E0000009E00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0033003500320035002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008002000000032002C0030002C003200380034002C0030002C00310030003800370035000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000A2000000A200000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003800330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000A3000000A300000000000000580000000103737401000000640062006F00000046004B005F005400610062006C00650049006E0066006F005F00450078007400650072006E0061006C004400610074006100620061007300650053006500720076006500720000000000000000000000C40200000000A4000000A4000000A30000000800000001F2711548F271150000000000000000AD070000000000A6000000A600000000000000580000000103737401000000640062006F00000046004B005F0043006100740061006C006F006700750065005F00450078007400650072006E0061006C004400610074006100620061007300650053006500720076006500720000000000000000000000C40200000000A7000000A7000000A60000000800000001F2711508F271150000000000000000AD070000000000A8000000A8000000000000005A00000001075F5E01000000640062006F00000046004B005F0043006100740061006C006F006700750065005F00450078007400650072006E0061006C0044006100740061006200610073006500530065007200760065007200310000000000000000000000C40200000000A9000000A9000000A80000000800000001F17115C8F171150000000000000000AD070000000000AA000000AA00000000000000560000000103737401000000640062006F00000046004B005F0041004E004F005400610062006C0065005F00450078007400650072006E0061006C004400610074006100620061007300650053006500720076006500720000000000000000000000C40200000000AB000000AB000000AA0000000800000001F1711588F171150000000000000000AD070000000000AC000000AC00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0033003400360035002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000AF000000AF000000000000006A000000011A5F5E01000000640062006F00000046004B005F0041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E005F00410067006700720065006700610074006500440069006D0065006E00730069006F006E0000000000000000000000C40200000000B0000000B0000000AF0000000800000001F1711548F171150000000000000000AD070000000000BD000000BD00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000031000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003800330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0033003400350030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000BE000000BE000000000000004400000001038A7601000000640062006F00000046004B005F0043006100740061006C006F006700750065005F004C006F00610064004D00650074006100640061007400610000000000000000000000C40200000000BF000000BF000000BE0000000800000001F1711508F171150000000000000000AD070000000000C0000000C000000000000000520000000103737401000000640062006F00000046004B005F004C006F006100640050006500720069006F0064006900630061006C006C0079005F004C006F00610064004D00650074006100640061007400610000000000000000000000C40200000000C1000000C1000000C00000000800000001F07115C8F071150000000000000000AD070000000000C2000000C2000000000000004800000001038A7601000000640062006F00000046004B005F00500072006F0063006500730073005400610073006B005F004C006F00610064004D00650074006100640061007400610000000000000000000000C40200000000C3000000C3000000C20000000800000001F0711588F071150000000000000000AD070000000000C4000000C4000000000000004A00000001FF5F5E01000000640062006F00000046004B005F004C006F00610064005300630068006500640075006C0065005F004C006F00610064004D00650074006100640061007400610000000000000000000000C40200000000C5000000C5000000C40000000800000001F0711548F071150000000000000000AD070000000000C6000000C600000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003800330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0032003700390030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000C7000000C7000000000000006600000001006F0001000000640062006F00000046004B005F0044004C004500570069006E0064006F0077007300530065007200760069006300650045007800630065007000740069006F006E005F004C006F00610064004D00650074006100640061007400610000000000000000000000C40200000000C8000000C8000000C70000000800000001F0711508F071150000000000000000AD070000000000C9000000C900000000000000540000000103737401000000640062006F00000046004B005F004C006F006100640050006500720069006F0064006900630061006C006C0079005F004C006F00610064004D006500740061006400610074006100310000000000000000000000C40200000000CA000000CA000000C90000000800000001EF7115C8EF71150000000000000000AD070000000000CB000000CB00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0032003200390035002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000CC000000CC00000000000000740000000102000001000000640062006F00000046004B005F0041006700670072006500670061007400650043006F006E00740069006E0075006F0075007300440061007400650041007800690073005F00410067006700720065006700610074006500440069006D0065006E00730069006F006E0000000000000000000000C40200000000CD000000CD000000CC0000000800000001EF711588EF71150000000000000000AD070000000000D0000000D000000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0032003300320035002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000D1000000D1000000000000006C000000011A5F5E01000000640062006F00000046004B005F0041006700670072006500670061007400650046006F0072006300650064004A006F0069006E005F0041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E0000000000000000000000C40200000000D2000000D2000000D10000000800000001EF711548EF71150000000000000000AD070000000000D3000000D300000000000000520000000100737401000000640062006F00000046004B005F0041006700670072006500670061007400650046006F0072006300650064004A006F0069006E005F005400610062006C00650049006E0066006F0000000000000000000000C40200000000D4000000D4000000D30000000800000001B5511558B551150000000000000000AD070000000000D5000000D500000000000000580000000103737401000000640062006F00000046004B005F0041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E005F0043006100740061006C006F0067007500650000000000000000000000C40200000000D6000000D6000000D50000000800000001337715E03377150000000000000000AD0F0000010000EB00000081000000010000007C00000056000000D200000016000000010000000D0000008C00000085000000D5000000020000005F0000008C000000710000005D000000020000005C00000097000000AA0000001900000002000000180000009F0000008000000003000000020000000100000000000000010000009A0000000200000090000000E30100002100000007000000050000000600000038000000210000008E000000050000008D0000008C00000093000000D300000005000000D00000008D000000A600000012000000060000000D0000008A000000C80000002700000006000000240000002A000000390000002900000006000000240000003C0000004B0000002B0000000600000024000000200000002F00000033000000060000002F000000A20000008D00000035000000060000002F000000B20000009D00000056000000060000004C000000140000009C00000059000000060000004C0000000600000090000000960000001B00000071000000930000003D000000220000001B0000000D0000004000000033000000390000001B00000038000000170000004E000000400000001B000000020000007F000000C001000054000000240000004C0000001C0000001B0000003C000000380000003B000000350000002C000000720000005F00000071000000A500000090000000D10000005F000000D00000000F0000007200000074000000600000005F00000080000000730000006F000000600000006E0000009F000000720000006600000060000000630000007300000088000000640000006000000063000000870000009C000000770000006E000000760000007900000072000000AF000000710000005F000000B6000000CB000000CC00000071000000CB0000004B0000000000000084000000830000007C00000009000000B700000086000000830000007C000000A60000007C0000008B000000880000000600000073000000E2000000940000009000000091000000830000008C000000AA000000A2000000880000009C00000037000000A8000000A2000000020000006D0000001A020000A6000000A2000000020000008100000008020000A3000000A200000005000000940000003F000000C9000000BD000000AC0000004D0000005C000000BE000000BD000000020000006000000013010000C0000000BD000000AC0000001101000002000000C2000000BD00000090000000AD000000AC000000C4000000BD0000009E000000F7000000C2000000C7000000BD000000C6000000010000002E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700070006C00690063006100740069006F006E0020004E0061006D0065003D0022004D006900630072006F0073006F00660074002000530051004C00200053006500720076006500720020004D0061006E006100670065006D0065006E0074002000530074007500640069006F0022000000008005002E00000043006100740061006C006F006700750065005F0044006100740061005F004400690061006700720061006D000000000226002800000041006700670072006500670061007400650046006F0072006300650064004A006F0069006E00000008000000640062006F000000000226003800000041006700670072006500670061007400650043006F006E00740069006E0075006F007500730044006100740065004100780069007300000008000000640062006F000000000226003600000044004C004500570069006E0064006F0077007300530065007200760069006300650045007800630065007000740069006F006E00000008000000640062006F000000000226001A0000004C006F00610064004D006500740061006400610074006100000008000000640062006F00000000022600220000004C006F006100640050006500720069006F0064006900630061006C006C007900000008000000640062006F000000000226002E000000450078007400650072006E0061006C0044006100740061006200610073006500530065007200760065007200000008000000640062006F000000000226001A0000004C006F00610064005300630068006500640075006C006500000008000000640062006F00000000022600260000004C006F00610064004D006F00640075006C00650041007300730065006D0062006C007900000008000000640062006F0000000002260028000000500072006F0063006500730073005400610073006B0041007200670075006D0065006E007400000008000000640062006F0000000002260018000000500072006F0063006500730073005400610073006B00000008000000640062006F000000000226002E0000005000720065004C006F006100640044006900730063006100720064006500640043006F006C0075006D006E00000008000000640062006F000000000226001200000041004E004F005400610062006C006500000008000000640062006F000000000226002000000049007300730075006500530079007300740065006D005500730065007200000008000000640062006F000000000226002600000043006100740061006C006F006700750065004900740065006D0049007300730075006500000008000000640062006F0000000002260032000000410067006700720065006700610074006500460069006C0074006500720050006100720061006D006500740065007200000008000000640062006F0000000002260026000000410067006700720065006700610074006500440069006D0065006E00730069006F006E00000008000000640062006F0000000002260020000000410067006700720065006700610074006500460069006C00740065007200000008000000640062006F0000000002260038000000410067006700720065006700610074006500460069006C0074006500720053007500620043006F006E007400610069006E0065007200000008000000640062006F0000000002260032000000410067006700720065006700610074006500460069006C0074006500720043006F006E007400610069006E0065007200000008000000640062006F000000000226002E00000041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E00000008000000640062006F000000000226002600000053007500700070006F007200740069006E006700530051004C005400610062006C006500000008000000640062006F00000000022600300000004C006F006F006B007500700043006F006D0070006F0073006900740065004A006F0069006E0049006E0066006F00000008000000640062006F0000000002260034000000450078007400720061006300740069006F006E00460069006C0074006500720050006100720061006D006500740065007200000008000000640062006F0000000002260022000000450078007400720061006300740069006F006E00460069006C00740065007200000008000000640062006F00000000022600120000004A006F0069006E0049006E0066006F00000008000000640062006F000000000226000E0000004C006F006F006B0075007000000008000000640062006F000000000226002C000000450078007400720061006300740069006F006E0049006E0066006F0072006D006100740069006F006E00000008000000640062006F000000000226002600000053007500700070006F007200740069006E00670044006F00630075006D0065006E007400000008000000640062006F000000000226003200000043006F006C0075006D006E0049006E0066006F005F0043006100740061006C006F006700750065004900740065006D00000008000000640062006F000000000226001600000043006F006C0075006D006E0049006E0066006F00000008000000640062006F00000000022600140000005400610062006C00650049006E0066006F00000008000000640062006F000000000226001400000043006100740061006C006F00670075006500000008000000640062006F000000000224001C00000043006100740061006C006F006700750065004900740065006D00000008000000640062006F00000001000000D68509B3BB6BF2459AB8371664F0327008004E0000007B00310036003300340043004400440037002D0030003800380038002D0034003200450033002D0039004600410032002D004200360044003300320035003600330042003900310044007D00000000000000000000000000000000000000000000000000000000000000010003000000000000000C0000000B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062885214) \ No newline at end of file +0xD0CF11E0A1B11AE1000000000000000000000000000000003E000300FEFF0900060000000000000000000000020000000100000000000000001000005A00000001000000FEFFFFFF00000000000000005D000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFF5C000000030000000400000005000000060000000700000008000000090000000A0000000B0000000C0000000D0000000E0000000F000000100000001100000012000000130000001400000015000000160000001700000018000000FEFFFFFF1A0000001B0000001C0000001D0000001E0000001F000000200000002100000022000000230000002400000025000000260000002700000028000000290000002A0000002B0000002C0000002D0000002E0000002F000000300000003100000032000000330000003400000035000000360000003700000038000000390000003A0000003B0000003C0000003D0000003E0000003F000000400000004100000042000000430000004400000045000000460000004700000048000000490000004A0000004B0000004C0000004D0000004E0000004F00000050000000510000005200000053000000540000005500000056000000570000005800000059000000FEFFFFFFFEFFFFFF91000000FEFFFFFFFDFFFFFF5F000000600000006100000062000000630000006400000065000000660000006700000068000000690000006A0000006B0000006C0000006D0000006E0000006F000000700000007100000072000000730000007400000075000000760000007700000078000000790000007A0000007B0000007C0000007D0000007E0000007F0000008000000052006F006F007400200045006E00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500FFFFFFFFFFFFFFFF0200000000000000000000000000000000000000000000000000000000000000705AF83BF38BD0015B000000C00A0000000000006600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000201FFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000002000000322C0000000000006F000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040002010100000004000000FFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000019000000AC80000000000000010043006F006D0070004F0062006A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000201FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000000000005F00000000000000000438000A1ED00D05000080D60000000F00FFFF5000000000000000D6000000007D0000E6930000175900001A9401001A4301000CCFFFFF7289FFFFDE805B10F195D011B0A000AA00BDCB5C000008003000000000020000030000003C006B0000000900000000000000D9E6B0E91C81D011AD5100A0C90F5739F43B7F847F61C74385352986E1D552F8A0327DB2D86295428D98273C25A2DA2D00002800430000000000000053444DD2011FD1118E63006097D2DF4834C9D2777977D811907000065B840D9C00002800430000000000000051444DD2011FD1118E63006097D2DF4834C9D2777977D811907000065B840D9C80000000382B000000FF01000170931500003800A50900000700008001000000AC020000008000000D0000805363684772696400A8480000E6FBFFFF436174616C6F6775654974656D07000000003400A50900000700008002000000A402000000800000090000805363684772696400A84800001E2D0000436174616C6F67756549746500008000A50900000700008003000000520000000180000058000080436F6E74726F6C00A74700004521000052656C6174696F6E736869702027464B5F436174616C6F6775655F4974656D735F446174615F436174616C6F67756527206265747765656E2027436174616C6F6775652720616E642027436174616C6F6775654974656D2700002800B50100000700008004000000310000007500000002800000436F6E74726F6C00ED490000E327000000003400A50900000700008005000000A402000000800000090000805363684772696400F4CFFFFF903300005461626C65496E666F49746500003400A50900000700008006000000A6020000008000000A0000805363684772696400FCD6FFFF6AFFFFFF436F6C756D6E496E666F746500007800A5090000070000800700000052000000018000004E000080436F6E74726F6C005BDFFFFF492A000052656C6174696F6E736869702027464B5F5461626C655F4974656D735F446174615F5461626C657327206265747765656E20275461626C65496E666F2720616E642027436F6C756D6E496E666F27000000002800B50100000700008008000000310000006700000002800000436F6E74726F6C00A1E1FFFF4E2F000000004000A5090000070000800D000000C20200000080000018000080536368477269640094110000A2E5FFFF436F6C756D6E496E666F5F436174616C6F6775654974656D00009400A509000007000080120000005A0000000180000069000080436F6E74726F6C0069FEFFFF51F6FFFF52656C6174696F6E736869702027464B5F436F6C756D6E496E666F5F436174616C6F6775654974656D5F436F6C756D6E496E666F27206265747765656E2027436F6C756D6E496E666F2720616E642027436F6C756D6E496E666F5F436174616C6F6775654974656D2700690000002800B50100000700008013000000310000007F00000002800000436F6E74726F6C00ABF6FFFFC5F5FFFF00009800A509000007000080160000006A000000018000006F000080436F6E74726F6C005B37000093F7FFFF52656C6174696F6E736869702027464B5F436F6C756D6E496E666F5F436174616C6F6775654974656D5F436174616C6F6775654974656D27206265747765656E2027436174616C6F6775654974656D2720616E642027436F6C756D6E496E666F5F436174616C6F6775654974656D270000002800B50100000700008017000000310000008500000002800000436F6E74726F6C005A29000075FAFFFF00003C00A50900000700008018000000B602000000800000120000805363684772696400FA7D00004A2E0000537570706F7274696E67446F63756D656E74756500008400A5090000070000801900000052000000018000005B000080436F6E74726F6C00F57000006331000052656C6174696F6E736869702027464B5F537570706F7274696E67446F63756D656E745F436174616C6F67756527206265747765656E2027436174616C6F6775652720616E642027537570706F7274696E67446F63756D656E74270000002800B5010000070000801A000000310000007100000002800000436F6E74726F6C004F6E0000A933000000004000A5090000070000801B000000BC020000008000001500008053636847726964007A0D0000E40C000045787472616374696F6E496E666F726D6174696F6E74656D0000A800A5090000070000802200000052000000018000007F000080436F6E74726F6C00391F000093F7FFFF52656C6174696F6E736869702027464B5F436F6C756D6E496E666F5F436174616C6F6775654974656D5F45787472616374696F6E496E666F726D6174696F6E27206265747765656E202745787472616374696F6E496E666F726D6174696F6E2720616E642027436F6C756D6E496E666F5F436174616C6F6775654974656D270000002800B50100000700008023000000310000009500000002800000436F6E74726F6C007F210000ED02000000003000A509000007000080240000009E02000000800000060000805363684772696400E2D2FFFF16DBFFFF4C6F6F6B7570640000007000A50900000700008027000000520000000180000045000080436F6E74726F6C0049E2FFFF49EDFFFF52656C6174696F6E736869702027464B5F4C6F6F6B75705F436F6C756D6E496E666F27206265747765656E2027436F6C756D6E496E666F2720616E6420274C6F6F6B757027D0135E00002800B50100000700008028000000310000005B00000002800000436F6E74726F6C008FE4FFFF0BF7FFFF00007000A50900000700008029000000520000000180000046000080436F6E74726F6C008FE7FFFF49EDFFFF52656C6174696F6E736869702027464B5F4C6F6F6B75705F436F6C756D6E496E666F3127206265747765656E2027436F6C756D6E496E666F2720616E6420274C6F6F6B757027135E00002800B5010000070000802A000000310000005D00000002800000436F6E74726F6C00D5E9FFFF0BF7FFFF00007000A5090000070000802B000000520000000180000046000080436F6E74726F6C005BDFFFFF49EDFFFF52656C6174696F6E736869702027464B5F4C6F6F6B75705F436F6C756D6E496E666F3227206265747765656E2027436F6C756D6E496E666F2720616E6420274C6F6F6B757027135E00002800B5010000070000802C000000310000005D00000002800000436F6E74726F6C00A1E1FFFF0BF7FFFF00003000A5090000070000802F000000A202000000800000080000805363684772696400A0ABFFFF12FDFFFF4A6F696E496E666F00007C00A50900000700008033000000520000000180000052000080436F6E74726F6C6F70D0FFFF95FFFFFF52656C6174696F6E736869702027464B5F4A6F696E496E666F5F436F6C756D6E496E666F5F4A6F696E4B65793127206265747765656E2027436F6C756D6E496E666F2720616E6420274A6F696E496E666F27654900002800B50100000700008034000000310000007100000002800000436F6E74726F6C6F9CD1FFFF25FFFFFF00007C00A50900000700008035000000520000000180000052000080436F6E74726F6C6F70D0FFFF4504000052656C6174696F6E736869702027464B5F4A6F696E496E666F5F436F6C756D6E496E666F5F4A6F696E4B65793227206265747765656E2027436F6C756D6E496E666F2720616E6420274A6F696E496E666F27654900002800B50100000700008036000000310000007100000002800000436F6E74726F6C6F9CD1FFFFD503000000003800A50900000700008038000000B20200000080000010000080536368477269646F12FDFFFFE835000045787472616374696F6E46696C74657200009800A5090000070000803900000052000000018000006F000080436F6E74726F6C6FEB1200001F2B000052656C6174696F6E736869702027464B5F45787472616374696F6E46696C7465725F45787472616374696F6E496E666F726D6174696F6E27206265747765656E202745787472616374696F6E496E666F726D6174696F6E2720616E64202745787472616374696F6E46696C746572270000002800B5010000070000803A000000310000008500000002800000436F6E74726F6C6F11FDFFFF3331000000004400A5090000070000803B000000C40200000080000019000080536368477269646F6AFFFFFFF654000045787472616374696F6E46696C746572506172616D657465720000000000A000A5090000070000803C000000520000000180000077000080436F6E74726F6C6F4D0B0000F64A000052656C6174696F6E736869702027464B5F45787472616374696F6E46696C746572506172616D657465725F45787472616374696F6E46696C74657227206265747765656E202745787472616374696F6E46696C7465722720616E64202745787472616374696F6E46696C746572506172616D65746572270000002800B5010000070000803D000000310000008D00000002800000436F6E74726F6C6F6DF3FFFFA550000000008C00A509000007000080400000005A0000000180000061000080436F6E74726F6C6F633100001F2B000052656C6174696F6E736869702027464B5F436174616C6F6775655F45787472616374696F6E496E666F726D6174696F6E27206265747765656E202745787472616374696F6E496E666F726D6174696F6E2720616E642027436174616C6F6775652700650000002800B50100000700008041000000310000007700000002800000436F6E74726F6C6F3E1E0000C76B000000004000A5090000070000804C000000C00200000080000017000080536368477269646F78D3FFFF22C0FFFF4C6F6F6B7570436F6D706F736974654A6F696E496E666F6D00008800A5090000070000805400000052000000018000005F000080436F6E74726F6C6F15DAFFFFC9D4FFFF52656C6174696F6E736869702027464B5F4C6F6F6B7570436F6D706F736974654A6F696E496E666F5F4C6F6F6B757027206265747765656E20274C6F6F6B75702720616E6420274C6F6F6B7570436F6D706F736974654A6F696E496E666F270000002800B50100000700008055000000310000007500000002800000436F6E74726F6C6F5BDCFFFFA1D8FFFF00009000A509000007000080560000006A0000000180000067000080436F6E74726F6C6F0FC8FFFF9DC8FFFF52656C6174696F6E736869702027464B5F4C6F6F6B7570436F6D706F736974654A6F696E496E666F5F436F6C756D6E496E666F27206265747765656E2027436F6C756D6E496E666F2720616E6420274C6F6F6B7570436F6D706F736974654A6F696E496E666F270000002800B50100000700008057000000310000007D00000002800000436F6E74726F6C6FEAC9FFFF9AE8FFFF00009400A509000007000080590000006A000000018000006A000080436F6E74726F6C6F57C1FFFF19C5FFFF52656C6174696F6E736869702027464B5F4C6F6F6B7570436F6D706F736974654A6F696E496E666F5F436F6C756D6E496E666F5F464B27206265747765656E2027436F6C756D6E496E666F2720616E6420274C6F6F6B7570436F6D706F736974654A6F696E496E666F276C7400002800B5010000070000805A000000310000008300000002800000436F6E74726F6C6F32C3FFFF08E5FFFF00003C00A5090000070000805C000000B60200000080000012000080536368477269646FDAAC0000D20F0000537570706F7274696E6753514C5461626C656E4900008400A5090000070000805D00000062000000018000005B000080436F6E74726F6C6FF5700000551F000052656C6174696F6E736869702027464B5F537570706F7274696E6753514C5461626C655F436174616C6F67756527206265747765656E2027436174616C6F6775652720616E642027537570706F7274696E6753514C5461626C65276E00002800B5010000070000805E000000310000007100000002800000436F6E74726F6C6F217200005131000000004000A5090000070000805F000000BE0200000080000016000080536368477269646FC201000086A7FFFF416767726567617465436F6E66696775726174696F6E6F6D00004000A50900000700008060000000C20200000080000018000080536368477269646F5C2B00006CA3FFFF41676772656761746546696C746572436F6E7461696E657200004400A50900000700008063000000C8020000008000001B000080536368477269646F7A580000FA9CFFFF41676772656761746546696C746572537562436F6E7461696E6572000000B400A5090000070000806400000052000000018000008B000080436F6E74726F6C6F6C4C000047A8FFFF52656C6174696F6E736869702027464B5F41676772656761746546696C746572537562436F6E7461696E65725F41676772656761746546696C746572436F6E7461696E657227206265747765656E202741676772656761746546696C746572436F6E7461696E65722720616E64202741676772656761746546696C746572537562436F6E7461696E6572270000002800B5010000070000806500000031000000A100000002800000436F6E74726F6C6FED4200008DAAFFFF0000B400A5090000070000806600000052000000018000008C000080436F6E74726F6C6F6C4C00006BA2FFFF52656C6174696F6E736869702027464B5F41676772656761746546696C746572537562436F6E7461696E65725F41676772656761746546696C746572436F6E7461696E65723127206265747765656E202741676772656761746546696C746572436F6E7461696E65722720616E64202741676772656761746546696C746572537562436F6E7461696E65722700002800B5010000070000806700000031000000A300000002800000436F6E74726F6C6F96420000FBA1FFFF00003800A5090000070000806E000000B0020000008000000F000080536368477269646F1059000050B0FFFF41676772656761746546696C7465727200009C00A5090000070000806F000000520000000180000073000080436F6E74726F6C6F6C4C00004FAFFFFF52656C6174696F6E736869702027464B5F41676772656761746546696C7465725F41676772656761746546696C746572436F6E7461696E657227206265747765656E202741676772656761746546696C746572436F6E7461696E65722720616E64202741676772656761746546696C746572277400002800B50100000700008070000000310000008900000002800000436F6E74726F6C6F55440000DFAEFFFF00003C00A50900000700008071000000B60200000080000012000080536368477269646FB42D000000B5FFFF41676772656761746544696D656E73696F6E74610000A000A50900000700008072000000520000000180000075000080436F6E74726F6C6FCC2200002BB5FFFF52656C6174696F6E736869702027464B5F41676772656761746544696D656E73696F6E5F416767726567617465436F6E66696775726174696F6E27206265747765656E2027416767726567617465436F6E66696775726174696F6E2720616E64202741676772656761746544696D656E73696F6E2772270000002800B50100000700008073000000310000008B00000002800000436F6E74726F6C6F351B000071B7FFFF0000AC00A50900000700008074000000520000000180000081000080436F6E74726F6C6FCC22000085A6FFFF52656C6174696F6E736869702027464B5F416767726567617465436F6E66696775726174696F6E5F41676772656761746546696C746572436F6E7461696E657227206265747765656E202741676772656761746546696C746572436F6E7461696E65722720616E642027416767726567617465436F6E66696775726174696F6E2700000000002800B50100000700008075000000310000009700000002800000436F6E74726F6C6FE818000015A6FFFF00004000A50900000700008076000000C20200000080000018000080536368477269646FD683000012B2FFFF41676772656761746546696C746572506172616D6574657200009C00A50900000700008077000000520000000180000073000080436F6E74726F6C6F1A7A000011B1FFFF52656C6174696F6E736869702027464B5F41676772656761746546696C746572506172616D657465725F41676772656761746546696C74657227206265747765656E202741676772656761746546696C7465722720616E64202741676772656761746546696C746572506172616D65746572276E00002800B50100000700008078000000310000008900000002800000436F6E74726F6C6FF072000057B3FFFF00003C00A5090000070000807C000000B60200000080000012000080536368477269646FF27600000CE5FFFF436174616C6F6775654974656D4973737565616D00008C00A509000007000080810000005A0000000180000063000080436F6E74726F6C6FD9600000F9F3FFFF52656C6174696F6E736869702027464B5F436174616C6F6775654974656D49737375655F436174616C6F6775654974656D27206265747765656E2027436174616C6F6775654974656D2720616E642027436174616C6F6775654974656D4973737565276E00002800B50100000700008082000000310000007900000002800000436F6E74726F6C6F8062000023F6FFFF00003800A50900000700008083000000B0020000008000000F000080536368477269646FF4B0000070CCFFFF497373756553797374656D557365727200009800A509000007000080840000005A000000018000006D000080436F6E74726F6C6F48A400004CDFFFFF52656C6174696F6E736869702027464B5F436174616C6F6775654974656D49737375655F4F776E65725F497373756553797374656D5573657227206265747765656E2027497373756553797374656D557365722720616E642027436174616C6F6775654974656D49737375652772270000002800B50100000700008085000000310000008900000002800000436F6E74726F6C6FF09700007CE3FFFF00009800A509000007000080860000005A0000000180000070000080436F6E74726F6C6F619A0000ABDAFFFF52656C6174696F6E736869702027464B5F436174616C6F6775654974656D49737375655F5265706F727465725F497373756553797374656D5573657227206265747765656E2027497373756553797374656D557365722720616E642027436174616C6F6775654974656D49737375652700002800B50100000700008087000000310000008F00000002800000436F6E74726F6C6F4B9200003BDAFFFF00003000A50900000700008088000000A20200000080000008000080536368477269646FC694FFFF56130000414E4F5461626C6500007400A5090000070000808B000000520000000180000049000080436F6E74726F6C65D6B5FFFF5512000052656C6174696F6E736869702027464B5F436F6C756D6E496E666F5F414E4F5461626C6527206265747765656E2027414E4F5461626C652720616E642027436F6C756D6E496E666F27496E6600002800B5010000070000808C000000310000005F00000002800000436F6E74726F6C65D8BFFFFF9B14000000004000A5090000070000808D000000BE0200000080000016000080536368477269646586A7FFFF302A00005072654C6F6164446973636172646564436F6C756D6E657200008C00A5090000070000808E000000520000000180000063000080436F6E74726F6C6596C8FFFF8F32000052656C6174696F6E736869702027464B5F5072654C6F6164446973636172646564436F6C756D6E5F5461626C65496E666F27206265747765656E20275461626C65496E666F2720616E6420275072654C6F6164446973636172646564436F6C756D6E276E00002800B5010000070000808F000000310000007900000002800000436F6E74726F6C6519C2FFFF1F32000000003C00A50900000700008091000000B80200000080000013000080536368477269646536D80000565E000050726F636573735461736B417267756D656E747500008C00A50900000700008094000000520000000180000061000080436F6E74726F6C6572D00000555D000052656C6174696F6E736869702027464B5F50726F636573735461736B417267756D656E745F50726F636573735461736B27206265747765656E202750726F636573735461736B2720616E64202750726F636573735461736B417267756D656E74276E276E00002800B50100000700008095000000310000007700000002800000436F6E74726F6C6544CA0000E55C000000003400A50900000700008090000000A8020000008000000B00008053636847726964659CAE0000D25A000050726F636573735461736B5500009C00A509000007000080960000005A0000000180000073000080436F6E74726F6C65F837000065C9FFFF52656C6174696F6E736869702027464B5F41676772656761746544696D656E73696F6E5F45787472616374696F6E496E666F726D6174696F6E27206265747765656E202745787472616374696F6E496E666F726D6174696F6E2720616E64202741676772656761746544696D656E73696F6E276E00002800B50100000700008097000000310000008900000002800000436F6E74726F6C658D4000008BF0FFFF00007800A5090000070000809A0000005A000000018000004D000080436F6E74726F6C65F5700000E87C000052656C6174696F6E736869702027464B5F50726F636573735461736B5F436174616C6F67756527206265747765656E2027436174616C6F6775652720616E64202750726F636573735461736B2727000000002800B5010000070000809B000000310000006300000002800000436F6E74726F6C65E99E00009592000000002400A5010000070000809C0000007100000002800000436F6E74726F6C65C47200005355000000003C00A5090000070000809D000000B60200000080000012000080536368477269646592B80000383100004C6F61644D6F64756C65417373656D626C79747500003400A5090000070000809E000000AA020000008000000C0000805363684772696465D8BD0000408300004C6F61645363686564756C6500004000A509000007000080A2000000BE0200000080000016000080536368477269646536F7FFFF0E6A000045787465726E616C4461746162617365536572766572657200008C00A509000007000080A30000005A0000000180000063000080436F6E74726F6C6539E1FFFF8E56000052656C6174696F6E736869702027464B5F5461626C65496E666F5F45787465726E616C446174616261736553657276657227206265747765656E202745787465726E616C44617461626173655365727665722720616E6420275461626C65496E666F276E00002800B501000007000080A4000000310000007900000002800000436F6E74726F6C6544CDFFFFAB6D000000008C00A509000007000080A60000005A0000000180000063000080436F6E74726F6C65B51B00006780000052656C6174696F6E736869702027464B5F436174616C6F6775655F45787465726E616C446174616261736553657276657227206265747765656E202745787465726E616C44617461626173655365727665722720616E642027436174616C6F677565276E00002800B501000007000080A7000000310000007900000002800000436F6E74726F6C65F50F0000B79D000000008C00A509000007000080A80000005A0000000180000064000080436F6E74726F6C65D91500006780000052656C6174696F6E736869702027464B5F436174616C6F6775655F45787465726E616C44617461626173655365727665723127206265747765656E202745787465726E616C44617461626173655365727665722720616E642027436174616C6F6775652700002800B501000007000080A9000000310000007B00000002800000436F6E74726F6C65B4090000FDA2000000008C00A509000007000080AA0000005A0000000180000061000080436F6E74726F6C65B3A3FFFF5723000052656C6174696F6E736869702027464B5F414E4F5461626C655F45787465726E616C446174616261736553657276657227206265747765656E202745787465726E616C44617461626173655365727665722720616E642027414E4F5461626C652775652700002800B501000007000080AB000000310000007700000002800000436F6E74726F6C65DDA5FFFF9268000000003800A509000007000080AC000000B2020000008000001000008053636847726964659E9D0000F69F00004C6F6164506572696F646963616C6C790000A000A509000007000080AF000000520000000180000075000080436F6E74726F6C65CC2200004DC0FFFF52656C6174696F6E736869702027464B5F416767726567617465436F6E66696775726174696F6E5F41676772656761746544696D656E73696F6E27206265747765656E202741676772656761746544696D656E73696F6E2720616E642027416767726567617465436F6E66696775726174696F6E2772270000002800B501000007000080B0000000310000008B00000002800000436F6E74726F6C655F1B0000DDBFFFFF00003400A509000007000080BD000000AA020000008000000C0000805363684772696465AA820000345300004C6F61644D6574616461746100007800A509000007000080BE00000052000000018000004F000080436F6E74726F6C65F57000005F53000052656C6174696F6E736869702027464B5F436174616C6F6775655F4C6F61644D6574616461746127206265747765656E20274C6F61644D657461646174612720616E642027436174616C6F677565270000002800B501000007000080BF000000310000006500000002800000436F6E74726F6C6566720000EF52000000008800A509000007000080C000000062000000018000005D000080436F6E74726F6C65FA9C0000CF85000052656C6174696F6E736869702027464B5F4C6F6164506572696F646963616C6C795F4C6F61644D6574616461746127206265747765656E20274C6F61644D657461646174612720616E6420274C6F6164506572696F646963616C6C79276F270000002800B501000007000080C1000000310000007300000002800000436F6E74726F6C65D98A00000695000000007C00A509000007000080C2000000520000000180000053000080436F6E74726F6C65659D0000A369000052656C6174696F6E736869702027464B5F50726F636573735461736B5F4C6F61644D6574616461746127206265747765656E20274C6F61644D657461646174612720616E64202750726F636573735461736B274900002800B501000007000080C3000000310000006900000002800000436F6E74726F6C65079E0000E96B000000008000A509000007000080C4000000620000000180000055000080436F6E74726F6C65659D0000517F000052656C6174696F6E736869702027464B5F4C6F61645363686564756C655F4C6F61644D6574616461746127206265747765656E20274C6F61644D657461646174612720616E6420274C6F61645363686564756C6527656D2700002800B501000007000080C5000000310000006B00000002800000436F6E74726F6C6581AA0000CF81000000004400A509000007000080C6000000C6020000008000001A000080536368477269646530750000CA9E0000444C4557696E646F777353657276696365457863657074696F6E720000009C00A509000007000080C7000000520000000180000071000080436F6E74726F6C65A98100005C86000052656C6174696F6E736869702027464B5F444C4557696E646F777353657276696365457863657074696F6E5F4C6F61644D6574616461746127206265747765656E20274C6F61644D657461646174612720616E642027444C4557696E646F777353657276696365457863657074696F6E27696F6E00002800B501000007000080C8000000310000008700000002800000436F6E74726F6C65FC6700004293000000008800A509000007000080C90000006A000000018000005E000080436F6E74726F6C65ED9700005C86000052656C6174696F6E736869702027464B5F4C6F6164506572696F646963616C6C795F4C6F61644D657461646174613127206265747765656E20274C6F61644D657461646174612720616E6420274C6F6164506572696F646963616C6C7927270000002800B501000007000080CA000000310000007500000002800000436F6E74726F6C65E7840000C995000000004400A509000007000080CB000000C8020000008000001B000080536368477269646562430000F4CFFFFF416767726567617465436F6E74696E756F75734461746541786973000000A800A509000007000080CC00000052000000018000007F000080436F6E74726F6C656142000069C9FFFF52656C6174696F6E736869702027464B5F416767726567617465436F6E74696E756F757344617465417869735F41676772656761746544696D656E73696F6E27206265747765656E202741676772656761746544696D656E73696F6E2720616E642027416767726567617465436F6E74696E756F75734461746541786973270000002800B501000007000080CD000000310000009500000002800000436F6E74726F6C65C22400005ECDFFFF00003C00A509000007000080D0000000B802000000800000130000805363684772696465B80B0000C8CEFFFF416767726567617465466F726365644A6F696E760000A000A509000007000080D10000005A0000000180000077000080436F6E74726F6C65DB04000016C9FFFF52656C6174696F6E736869702027464B5F416767726567617465466F726365644A6F696E5F416767726567617465436F6E66696775726174696F6E27206265747765656E2027416767726567617465436F6E66696775726174696F6E2720616E642027416767726567617465466F726365644A6F696E270000002800B501000007000080D2000000310000008D00000002800000436F6E74726F6C6564EAFFFFE9CFFFFF00008800A509000007000080D300000062000000018000005D000080436F6E74726F6C6582F8FFFF1FDDFFFF52656C6174696F6E736869702027464B5F416767726567617465466F726365644A6F696E5F5461626C65496E666F27206265747765656E20275461626C65496E666F2720616E642027416767726567617465466F726365644A6F696E2727270000002800B501000007000080D4000000310000007300000002800000436F6E74726F6C65360800002416000000008C00A509000007000080D50000007A0000000180000063000080436F6E74726F6C65AD21000012C9FFFF52656C6174696F6E736869702027464B5F416767726567617465436F6E66696775726174696F6E5F436174616C6F67756527206265747765656E2027436174616C6F6775652720616E642027416767726567617465436F6E66696775726174696F6E272700002800B501000007000080D6000000310000007900000002800000436F6E74726F6C656B3D00003DECFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002143341208000000A72900001A28000078563412070000001401000043006100740061006C006F006700750065004900740065006D00000073000000000010400100000000000000000000000E000000050000001801000000000000000000000000000000000000F8000000000000000500000000000000000000000200000000000000009492400000000000000000000000000094924000000000000000400400000020000000300000000000000000000000008C924000000000000010400000000000000040000000000000004000000000000000000100000000000000050000000000000040000000010000000000000000000040000000000000104004000000200000002000000000000000000000000000000005000000540000002C0000002C0000002C000000340000000000000000000000A72900001A280000000000002D0100000D0000000C000000070000001C010000F70800005307000094020000390300003A020000DD040000DD040000EE020000DD04000036060000380400000000000001000000411700003F230000000000000C0000000C00000002000000020000001C010000E60A00000000000001000000F21300009408000000000000020000000200000002000000020000001C010000F70800000100000000000000F21300000804000000000000000000000000000002000000020000001C010000F7080000000000000000000055320000DD23000000000000000000000D00000004000000040000001C010000F70800009B0A00008106000078563412040000006400000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000000E00000043006100740061006C006F006700750065004900740065006D000000214334120800000079290000BC7E000078563412070000001401000043006100740061006C006F00670075006500000067007500650000000000870AC03D66020500000000000000020000000000000000000000000100000001000000000000484B75575034A75728307C57484B755763006F006D00700075007400650064005F0063006F006C0075006D006E007300200063006D0063006501006453C20F00E05A6B16109AA70A6F0062006A006500630074005F006900640020003D00200063006F006C002E006F0062006A006500630074005F0069006400200061006E006400200063006D0063002E0063006F006C0075006D006E005F006900640020003D00200063006F006C00000000000000000000000000000005000000540000002C0000002C0000002C00000034000000000000000000000079290000BC7E0000000000002D0100000D0000000C000000070000001C0100002F0D00005307000094020000390300003A020000DD040000DD040000EE020000DD04000036060000380400000000000001000000411700000341000000000000180000000C00000002000000020000001C010000D70A00000000000001000000F21300004E06000000000000010000000100000002000000020000001C010000F70800000100000000000000F21300000804000000000000000000000000000002000000020000001C010000F7080000000000000000000055320000DD23000000000000000000000D00000004000000040000001C010000F70800009B0A00008106000078563412040000005C00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000000A00000043006100740061006C006F00670075006500000002000B003E4900001E2D00003E490000002400000000000002000000F0F0F00000000000000000000000000000000000010000000400000000000000ED490000E3270000BA1400005801000032000000010000020000BA14000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61210046004B005F0043006100740061006C006F006700750065005F004900740065006D0073005F0044006100740061005F0043006100740061006C006F006700750065002143341208000000BA290000B92500007856341207000000140100005400610062006C00650049006E0066006F00000073000000540020006E0061006D0065002C002000760061006C00750065002000460052004F004D0020007300790073002E0065007800740065006E006400650064005F00700072006F0070006500720074006900650073002000570048004500520045002000280063006C0061007300730020003D00200031002900200041004E004400200028006D0061006A006F0072005F006900640020003D0020004F0042004A004500430054005F004900440028004E0027005B00640062006F005D002E005B005400610062006C0065005F0031005D00270029002900000000000000000000000000000005000000540000002C0000002C0000002C000000340000000000000000000000BA290000B9250000000000002D010000080000000C000000070000001C010000F70800005307000094020000390300003A020000DD040000DD040000EE020000DD04000036060000380400000000000001000000AF1C0000A823000000000000060000000600000002000000020000001C010000F20D00000000000001000000F21300004E06000000000000010000000100000002000000020000001C010000F70800000100000000000000F21300000804000000000000000000000000000002000000020000001C010000F7080000000000000000000055320000DD23000000000000000000000D00000004000000040000001C010000F70800009B0A00008106000078563412040000005C00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000000A0000005400610062006C00650049006E0066006F0000002143341208000000C42E00009A2D000078563412070000001401000043006F006C0075006D006E0049006E0066006F0000000000540020006E0061006D0065002C002000760061006C00750065002000460052004F004D0020007300790073002E0065007800740065006E006400650064005F00700072006F0070006500720074006900650073002000570048004500520045002000280063006C0061007300730020003D00200031002900200041004E004400200028006D0061006A006F0072005F006900640020003D0020004F0042004A004500430054005F004900440028004E0027005B00640062006F005D002E005B005400610062006C0065005F0031005D00270029002900000000000000000000000000000005000000540000002C0000002C0000002C000000340000000000000000000000C42E00009A2D0000000000002D010000080000000C000000070000001C010000F50A00005307000094020000390300003A020000DD040000DD040000EE020000DD04000036060000380400000000000001000000411700005D14000000000000060000000600000002000000020000001C010000E60A00000000000001000000F21300009408000000000000020000000200000002000000020000001C010000F70800000100000000000000F21300000804000000000000000000000000000002000000020000001C010000F7080000000000000000000055320000DD23000000000000000000000D00000004000000040000001C010000F70800009B0A00008106000078563412040000005E00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000000B00000043006F006C0075006D006E0049006E0066006F00000002000B00F2E0FFFF90330000F2E0FFFF042D00000000000002000000F0F0F00000000000000000000000000000000000010000000800000000000000A1E1FFFF4E2F00001C10000058010000380000000100000200001C10000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D611A0046004B005F005400610062006C0065005F004900740065006D0073005F0044006100740061005F005400610062006C00650073002143341208000000BA290000AC14000078563412070000001401000043006F006C0075006D006E0049006E0066006F005F0043006100740061006C006F006700750065004900740065006D0000000000050000001801000000000000000000000000000000000000F800000000000000050000000000000000000000020000000000000000D09D4000000000000000000000000000D09D400000000000000040040000002000000030000000000000000000000000C89D4000000000000010400000000000000040000000000000004000000000000000000100000000000000050000000000000040000000010000000000000000000040000000000000104004000000200000002000000000000000000000000000000005000000540000002C0000002C0000002C000000340000000000000000000000BA290000AC140000000000002D0100000D0000000C000000070000001C010000F70800005307000094020000390300003A020000DD040000DD040000EE020000DD04000036060000380400000000000001000000F21300000804000000000000000000000000000002000000020000001C010000F70800000000000001000000F21300000804000000000000000000000000000002000000020000001C010000F70800000100000000000000F21300000804000000000000000000000000000002000000020000001C010000F7080000000000000000000055320000DD23000000000000000000000D00000004000000040000001C010000F70800009B0A00008106000078563412040000007A00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000001900000043006F006C0075006D006E0049006E0066006F005F0043006100740061006C006F006700750065004900740065006D00000003000B00000000006AFFFFFF00000000CCF7FFFF94110000CCF7FFFF0000000002000000F0F0F00000000000000000000000000000000000010000001300000000000000ABF6FFFFC5F5FFFFC51700005801000058000000010000020000C517000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61260046004B005F0043006F006C0075006D006E0049006E0066006F005F0043006100740061006C006F006700750065004900740065006D005F0043006F006C0075006D006E0049006E0066006F0005000B00A84800007CFCFFFFBF4000007CFCFFFFBF40000097FCFFFFD638000097FCFFFFD63800004EFAFFFF0000000002000000F0F0F000000000000000000000000000000000000100000017000000000000005A29000075FAFFFF92190000580100001D0000000100000200009219000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61290046004B005F0043006F006C0075006D006E0049006E0066006F005F0043006100740061006C006F006700750065004900740065006D005F0043006100740061006C006F006700750065004900740065006D0021433412080000003D2200005D1E000078563412070000001401000053007500700070006F007200740069006E00670044006F00630075006D0065006E0074000000000000000000D800000003000000010000000001000000000000446174615F5053004D756C7469706C7952616469616C4772616469656E7443656E74657265645F5053315F436F6E7374616E745461626C6500666C48616C66546578656C53697A654E6F726D616C697A656400AB000003000100010001000000000000007D00000098000000050000000100010001000100A80000004C000000B0000000050000000100010001000100C00000004D756C7469706C7952616469616C4772616469656E7443656E74000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000003D2200005D1E0000000000002D0100000D0000000C000000070000001C01000026070000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000006E00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000001300000053007500700070006F007200740069006E00670044006F00630075006D0065006E007400000002000B0021720000FA320000FA7D0000FA3200000000000002000000F0F0F00000000000000000000000000000000000010000001A000000000000004F6E0000A93300007C13000058010000320000000100000200007C13000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D611F0046004B005F0053007500700070006F007200740069006E00670044006F00630075006D0065006E0074005F0043006100740061006C006F006700750065002143341208000000AA2B0000F2200000785634120700000014010000450078007400720061006300740069006F006E0049006E0066006F0072006D006100740069006F006E000000000000000E000000050000001801000000000000000000000000000000000000E800000000000000050000000000000000000000010000000000000000002A400000000000000000040000002000000020000000000000000000000000002E4000000000000000400000000000000040000000000000004000000000000000000100000000000000050000000000000040000000010000000000000000002E400000000000003640040000002000000020000000000000000000000000002A400000000000000000000000000000000005000000540000002C0000002C0000002C000000340000000000000000000000AA2B0000F2200000000000002D0100000D0000000C000000070000001C01000060090000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000007400000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F00000016000000450078007400720061006300740069006F006E0049006E0066006F0072006D006100740069006F006E00000002000B00D0200000E40C0000D02000004EFAFFFF0000000002000000F0F0F000000000000000000000000000000000000100000023000000000000007F210000ED020000671D00005801000032000000010000020000671D000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61310046004B005F0043006F006C0075006D006E0049006E0066006F005F0043006100740061006C006F006700750065004900740065006D005F00450078007400720061006300740069006F006E0049006E0066006F0072006D006100740069006F006E0021433412080000001C260000EE1400007856341207000000140100004C006F006F006B0075007000000000000001000010010000440000000200000001000000C800000000000000D800000003000000010000000001000000000000446174615F5053004D756C7469706C7952616469616C4772616469656E7443656E74657265645F5053315F436F6E7374616E745461626C6500666C48616C66546578656C53697A654E6F726D616C697A656400AB000003000100010001000000000000007D00000098000000050000000100010001000100A80000004C000000B0000000050000000100010001000100C00000004D756C7469706C7952616469616C4772616469656E7443656E74000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000001C260000EE140000000000002D0100000D0000000C000000070000001C010000160800009F06000094020000390300003A02000065040000DD040000EE020000DD04000036060000380400000000000001000000661200000804000000000000000000000000000002000000020000001C010000160800000000000001000000661200000804000000000000000000000000000002000000020000001C010000160800000100000000000000661200000804000000000000000000000000000002000000020000001C010000160800000000000000000000E42D00001224000000000000000000000D00000004000000040000001C010000160800008D090000DC05000078563412040000005600000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F000000070000004C006F006F006B0075007000000002000B00E0E3FFFF6AFFFFFFE0E3FFFF04F0FFFF0000000002000000F0F0F000000000000000000000000000000000000100000028000000000000008FE4FFFF0BF7FFFFBB0C00005801000032000000010000020000BB0C000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61140046004B005F004C006F006F006B00750070005F0043006F006C0075006D006E0049006E0066006F0002000B0026E9FFFF6AFFFFFF26E9FFFF04F0FFFF0000000002000000F0F0F00000000000000000000000000000000000010000002A00000000000000D5E9FFFF0BF7FFFF680D00005801000032000000010000020000680D000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61150046004B005F004C006F006F006B00750070005F0043006F006C0075006D006E0049006E0066006F00310002000B00F2E0FFFF6AFFFFFFF2E0FFFF04F0FFFF0000000002000000F0F0F00000000000000000000000000000000000010000002C00000000000000A1E1FFFF0BF7FFFF680D00005801000032000000010000020000680D000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61150046004B005F004C006F006F006B00750070005F0043006F006C0075006D006E0049006E0066006F0032002143341208000000FC250000301500007856341207000000140100004A006F0069006E0049006E0066006F0000006E0064006F00770073002E0046006F0072006D0073002C002000560065007200730069006F006E003D0034002E0030002E0030002E0030002C002000430075006C0074007500720065003D006E00650075007400720061006C002C0020005000750062006C00690063004B006500790054006F006B0065006E003D00620037003700610035006300350036003100390033003400650030003800390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000540000002C0000002C0000002C000000340000000000000000000000FC25000030150000000000002D0100000D0000000C000000070000001C010000160800005406000094020000390300003A02000065040000DD040000EE020000DD04000036060000380400000000000001000000661200000804000000000000000000000000000002000000020000001C010000160800000000000001000000661200000804000000000000000000000000000002000000020000001C010000160800000100000000000000661200000804000000000000000000000000000002000000020000001C010000160800000000000000000000E42D00001224000000000000000000000D00000004000000040000001C010000160800008D090000DC05000078563412040000005A00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F000000090000004A006F0069006E0049006E0066006F00000002000B00FCD6FFFF2C0100009CD1FFFF2C0100000000000002000000F0F0F000000000000000000000000000000000000100000034000000000000009CD1FFFF25FFFFFFD01200005801000064000000010000020000D012000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D611F0046004B005F004A006F0069006E0049006E0066006F005F0043006F006C0075006D006E0049006E0066006F005F004A006F0069006E004B0065007900310002000B00FCD6FFFFDC0500009CD1FFFFDC0500000000000002000000F0F0F000000000000000000000000000000000000100000036000000000000009CD1FFFFD5030000D01200005801000064000000010000020000D012000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D611F0046004B005F004A006F0069006E0049006E0066006F005F0043006F006C0075006D006E0049006E0066006F005F004A006F0069006E004B00650079003200214334120800000066230000C5170000785634120700000014010000450078007400720061006300740069006F006E00460069006C0074006500720000002E0030002E0030002E0030002C002000430075006C0074007500720065003D006E00650075007400720061006C002C0020005000750062006C00690063004B006500790054006F006B0065006E003D0062003700370061003500630035003600310039003300340065003000380039000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000540000002C0000002C0000002C00000034000000000000000000000066230000C5170000000000002D0100000D0000000C000000070000001C010000070800009204000094020000390300003A02000029040000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000006A00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F00000011000000450078007400720061006300740069006F006E00460069006C00740065007200000002000B0082140000D62D000082140000E83500000000000002000000F0F0F00000000000000000000000000000000000010000003A0000000000000011FDFFFF33310000C21600005801000032000000010000020000C216000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61290046004B005F00450078007400720061006300740069006F006E00460069006C007400650072005F00450078007400720061006300740069006F006E0049006E0066006F0072006D006100740069006F006E002143341208000000EA1F00007A120000785634120700000014010000450078007400720061006300740069006F006E00460069006C0074006500720050006100720061006D006500740065007200000069006F006E003D0034002E0030002E0030002E0030002C002000430075006C0074007500720065003D006E00650075007400720061006C002C0020005000750062006C00690063004B006500790054006F006B0065006E003D00620037003700610035006300350036003100390033003400650030003800390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000540000002C0000002C0000002C000000340000000000000000000000EA1F00007A120000000000002D0100000D0000000C000000070000001C010000090600009204000094020000390300003A02000029040000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000007C00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000001A000000450078007400720061006300740069006F006E00460069006C0074006500720050006100720061006D006500740065007200000002000B00E40C0000AD4D0000E40C0000F65400000000000002000000F0F0F00000000000000000000000000000000000010000003D000000000000006DF3FFFFA5500000C81800005801000032000000010000020000C818000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D612D0046004B005F00450078007400720061006300740069006F006E00460069006C0074006500720050006100720061006D0065007400650072005F00450078007400720061006300740069006F006E00460069006C0074006500720003000B00FA320000D62D0000FA320000F0870000A8480000F08700000000000002000000F0F0F000000000000000000000000000000000000100000041000000000000003E1E0000C76B00000D14000058010000370000000100000200000D14000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61220046004B005F0043006100740061006C006F006700750065005F00450078007400720061006300740069006F006E0049006E0066006F0072006D006100740069006F006E00214334120800000056250000621700007856341207000000140100004C006F006F006B007500700043006F006D0070006F0073006900740065004A006F0069006E0049006E0066006F000000680050006100720073006500720043006C00690065006E0074002C002000560065007200730069006F006E003D00310031002E0030002E0030002E0030002C002000430075006C0074007500720065003D006E00650075007400720061006C002C0020005000750062006C00690063004B006500790054006F006B0065006E003D00380039003800340035006400630064003800300038003000630063003900310000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000005625000062170000000000002D010000070000000C000000070000001C01000026070000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000042700004710000000000000040000000400000002000000020000001C010000CE1300000000000001000000D91000006806000000000000010000000100000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000007800000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F000000180000004C006F006F006B007500700043006F006D0070006F0073006900740065004A006F0069006E0049006E0066006F00000002000B00ACDBFFFF16DBFFFFACDBFFFF84D7FFFF0000000002000000F0F0F000000000000000000000000000000000000100000055000000000000005BDCFFFFA1D8FFFF6414000058010000320000000100000200006414000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61210046004B005F004C006F006F006B007500700043006F006D0070006F0073006900740065004A006F0069006E0049006E0066006F005F004C006F006F006B007500700005000B006EDDFFFF6AFFFFFF6EDDFFFF07F9FFFF3BC9FFFF07F9FFFF3BC9FFFF18CAFFFF78D3FFFF18CAFFFF0000000002000000F0F0F00000000000000000000000000000000000010000005700000000000000EAC9FFFF9AE8FFFFC21600005801000032000000010000020000C216000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61250046004B005F004C006F006F006B007500700043006F006D0070006F0073006900740065004A006F0069006E0049006E0066006F005F0043006F006C0075006D006E0049006E0066006F0005000B0054D9FFFF6AFFFFFF54D9FFFFDDFBFFFF83C2FFFFDDFBFFFF83C2FFFF94C6FFFF78D3FFFF94C6FFFF0000000002000000F0F0F00000000000000000000000000000000000010000005A0000000000000032C3FFFF08E5FFFFC81800005801000032000000010000020000C818000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61280046004B005F004C006F006F006B007500700043006F006D0070006F0073006900740065004A006F0069006E0049006E0066006F005F0043006F006C0075006D006E0049006E0066006F005F0046004B0021433412080000003D2200005B1A000078563412070000001401000053007500700070006F007200740069006E006700530051004C005400610062006C00650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000003D2200005B1A0000000000002D0100000D0000000C000000070000001C01000026070000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000006E00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000001300000053007500700070006F007200740069006E006700530051004C005400610062006C006500000004000B0021720000A2300000FB7A0000A2300000FB7A0000D0200000DAAC0000D02000000000000002000000F0F0F00000000000000000000000000000000000010000005E0000000000000021720000513100002613000058010000000000000100000200002613000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D611F0046004B005F0053007500700070006F007200740069006E006700530051004C005400610062006C0065005F0043006100740061006C006F006700750065002143341208000000362200004724000078563412070000001401000041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E000000000003000000010000000001000000000000446174615F5053004D756C7469706C7952616469616C4772616469656E7443656E74657265645F5053315F436F6E7374616E745461626C6500666C48616C66546578656C53697A654E6F726D616C697A656400AB000003000100010001000000000000007D00000098000000050000000100010001000100A80000004C000000B0000000050000000100010001000100C00000004D756C7469706C7952616469616C4772616469656E7443656E74000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000003622000047240000000000002D0100000D0000000C000000070000001C01000026070000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000007600000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000001700000041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E00000021433412080000003C2200005F0F0000785634120700000014010000410067006700720065006700610074006500460069006C0074006500720043006F006E007400610069006E0065007200000000000200000000001066000000010000200000005A66D11F3372CF63785FCA7F40C69EA7DCEDA7CC247BCFBB00C38E42D74AECAA000000000E800000000200002000000022DD4B17FD42971A525C6C9C486DCAF55C6C488516735862E36E352C2D42E2C460000000A7DE800C07B35B3F0D6263AC81AE6E31CA8A493A12274568746645EF462AD47FD8892C9460826B6F5F558A0E75CC4E4AC5561556A9455D20A14B4EE450E669AB1E892532D8D21B364B2F844052BF0F8ECA46A54A000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000003C2200005F0F0000000000002D0100000D0000000C000000070000001C010000500A0000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000007A00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F00000019000000410067006700720065006700610074006500460069006C0074006500720043006F006E007400610069006E0065007200000021433412080000003C220000CC100000785634120700000014010000410067006700720065006700610074006500460069006C0074006500720053007500620043006F006E007400610069006E006500720000006E003D0034002E0030002E0030002E0030002C002000430075006C0074007500720065003D006E00650075007400720061006C002C0020005000750062006C00690063004B006500790054006F006B0065006E003D00620037003700610035006300350036003100390033003400650030003800390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000003C220000CC100000000000002D0100000D0000000C000000070000001C010000300C0000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000008000000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000001C000000410067006700720065006700610074006500460069006C0074006500720053007500620043006F006E007400610069006E0065007200000002000B00984D0000DEA9FFFF7A580000DEA9FFFF0000000002000000F0F0F00000000000000000000000000000000000010000006500000000000000ED4200008DAAFFFF3820000058010000320000000100000200003820000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61370046004B005F00410067006700720065006700610074006500460069006C0074006500720053007500620043006F006E007400610069006E00650072005F00410067006700720065006700610074006500460069006C0074006500720043006F006E007400610069006E006500720002000B00984D000002A4FFFF7A58000002A4FFFF0000000002000000F0F0F0000000000000000000000000000000000001000000670000000000000096420000FBA1FFFFE52000005801000032000000010000020000E520000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61380046004B005F00410067006700720065006700610074006500460069006C0074006500720053007500620043006F006E007400610069006E00650072005F00410067006700720065006700610074006500460069006C0074006500720043006F006E007400610069006E00650072003100214334120800000036220000CF1C0000785634120700000014010000410067006700720065006700610074006500460069006C0074006500720000007600650072002E004200610074006300680050006100720073006500720043006C00690065006E0074002C002000560065007200730069006F006E003D00310031002E0030002E0030002E0030002C002000430075006C0074007500720065003D006E00650075007400720061006C002C0020005000750062006C00690063004B006500790054006F006B0065006E003D00380039003800340035006400630064003800300038003000630063003900310000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000540000002C0000002C0000002C00000034000000000000000000000036220000CF1C0000000000002D010000070000000C000000070000001C01000026070000DC05000094020000390300003A020000DE030000DD040000EE020000DD040000360600003804000000000000010000000B2400005015000000000000050000000500000002000000020000001C0100002A1200000000000001000000D9100000AF08000000000000020000000200000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000006800000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F00000010000000410067006700720065006700610074006500460069006C00740065007200000002000B00984D0000E6B0FFFF10590000E6B0FFFF0000000002000000F0F0F0000000000000000000000000000000000001000000700000000000000055440000DFAEFFFFE51800005801000045000000010000020000E518000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D612B0046004B005F00410067006700720065006700610074006500460069006C007400650072005F00410067006700720065006700610074006500460069006C0074006500720043006F006E007400610069006E006500720021433412080000007829000020170000785634120700000014010000410067006700720065006700610074006500440069006D0065006E00730069006F006E000000674797F9A80390A9CEBA040000000200000000001066000000010000200000005A66D11F3372CF63785FCA7F40C69EA7DCEDA7CC247BCFBB00C38E42D74AECAA000000000E800000000200002000000022DD4B17FD42971A525C6C9C486DCAF55C6C488516735862E36E352C2D42E2C460000000A7DE800C07B35B3F0D6263AC81AE6E31CA8A493A12274568746645EF462AD47FD8892C9460826B6F5F558A0E75CC4E4AC5561556A9455D20A14B4EE450E669AB1E892532D8D21B364B2F844052BF0F8ECA46A54A000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000007829000020170000000000002D0100000D0000000C000000070000001C0100005F0A0000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000006E00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F00000013000000410067006700720065006700610074006500440069006D0065006E00730069006F006E00000002000B00F8230000C2B6FFFFB42D0000C2B6FFFF0000000002000000F0F0F00000000000000000000000000000000000010000007300000000000000351B000071B7FFFFED1A00005801000033000000010000020000ED1A000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D612C0046004B005F00410067006700720065006700610074006500440069006D0065006E00730069006F006E005F0041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E0002000B005C2B00001CA8FFFFF82300001CA8FFFF0000000002000000F0F0F00000000000000000000000000000000000010000007500000000000000E818000015A6FFFF831D00005801000032000000010000020000831D000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61320046004B005F0041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E005F00410067006700720065006700610074006500460069006C0074006500720043006F006E007400610069006E006500720021433412080000003C2200000E150000785634120700000014010000410067006700720065006700610074006500460069006C0074006500720050006100720061006D006500740065007200000000000200000000001066000000010000200000005A66D11F3372CF63785FCA7F40C69EA7DCEDA7CC247BCFBB00C38E42D74AECAA000000000E800000000200002000000022DD4B17FD42971A525C6C9C486DCAF55C6C488516735862E36E352C2D42E2C460000000A7DE800C07B35B3F0D6263AC81AE6E31CA8A493A12274568746645EF462AD47FD8892C9460826B6F5F558A0E75CC4E4AC5561556A9455D20A14B4EE450E669AB1E892532D8D21B364B2F844052BF0F8ECA46A54A000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000003C2200000E150000000000002D0100000D0000000C000000070000001C01000026070000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000007A00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F00000019000000410067006700720065006700610074006500460069006C0074006500720050006100720061006D006500740065007200000002000B00467B0000A8B2FFFFD6830000A8B2FFFF0000000002000000F0F0F00000000000000000000000000000000000010000007800000000000000F072000057B3FFFF3C19000058010000320000000100000200003C19000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D612B0046004B005F00410067006700720065006700610074006500460069006C0074006500720050006100720061006D0065007400650072005F00410067006700720065006700610074006500460069006C007400650072002143341208000000822E0000641F000078563412070000001401000043006100740061006C006F006700750065004900740065006D004900730073007500650000002E0030002E0030002C002000430075006C0074007500720065003D006E00650075007400720061006C002C0020005000750062006C00690063004B006500790054006F006B0065006E003D0062003700370061003500630035003600310039003300340065003000380039000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000540000002C0000002C0000002C000000340000000000000000000000822E0000641F0000000000002D010000090000000C000000070000001C0100006C0C0000DC05000094020000390300003A020000DE030000DD040000EE020000DD040000360600003804000000000000010000003E260000E717000000000000070000000700000002000000020000001C010000561300000000000001000000D91000006806000000000000010000000100000002000000020000001C010000260700000100000000000000D91000009E03000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000006E00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000001300000043006100740061006C006F006700750065004900740065006D0049007300730075006500000003000B0070620000E6FBFFFF7062000074F5FFFFF276000074F5FFFF0000000002000000F0F0F000000000000000000000000000000000000100000082000000000000008062000023F6FFFFA11500005801000032000000010000020000A115000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61230046004B005F0043006100740061006C006F006700750065004900740065006D00490073007300750065005F0043006100740061006C006F006700750065004900740065006D0021433412080000003C2200009315000078563412070000001401000049007300730075006500530079007300740065006D005500730065007200000001000000C800000000000000D800000003000000010000000001000000000000446174615F5053004D756C7469706C7952616469616C4772616469656E7443656E74657265645F5053315F436F6E7374616E745461626C6500666C48616C66546578656C53697A654E6F726D616C697A656400AB000003000100010001000000000000007D00000098000000050000000100010001000100A80000004C000000B0000000050000000100010001000100C00000004D756C7469706C7952616469616C4772616469656E7443656E74000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000003C22000093150000000000002D0100000D0000000C000000070000001C01000026070000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000006800000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000001000000049007300730075006500530079007300740065006D005500730065007200000003000B00E2B3000003E2FFFFE2B3000040EDFFFF74A5000040EDFFFF0000000002000000F0F0F00000000000000000000000000000000000010000008500000000000000F09700007CE3FFFF431B00005801000007000000010000020000431B000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D612B0046004B005F0043006100740061006C006F006700750065004900740065006D00490073007300750065005F004F0077006E00650072005F0049007300730075006500530079007300740065006D00550073006500720003000B00F4B0000042DCFFFFDC9B000042DCFFFFDC9B00000CE5FFFF0000000002000000F0F0F000000000000000000000000000000000000100000087000000000000004B9200003BDAFFFF801C00005801000007000000010000020000801C000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D612E0046004B005F0043006100740061006C006F006700750065004900740065006D00490073007300750065005F005200650070006F0072007400650072005F0049007300730075006500530079007300740065006D00550073006500720021433412080000003C220000BC12000078563412070000001401000041004E004F005400610062006C00650000006E0066006F00000000000200000001000000C800000000000000D800000003000000010000000001000000000000446174615F5053004D756C7469706C7952616469616C4772616469656E7443656E74657265645F5053315F436F6E7374616E745461626C6500666C48616C66546578656C53697A654E6F726D616C697A656400AB000003000100010001000000000000007D00000098000000050000000100010001000100A80000004C000000B0000000050000000100010001000100C00000004D756C7469706C7952616469616C4772616469656E7443656E74000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000003C220000BC120000000000002D0100000D0000000C000000070000001C01000026070000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000005A00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000000900000041004E004F005400610062006C006500000002000B0002B7FFFFEC130000FCD6FFFFEC1300000000000002000000F0F0F00000000000000000000000000000000000010000008C00000000000000D8BFFFFF9B1400004E0E000058010000320000000100000200004E0E000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61160046004B005F0043006F006C0075006D006E0049006E0066006F005F0041004E004F005400610062006C00650021433412080000003C2200007B1A00007856341207000000140100005000720065004C006F006100640044006900730063006100720064006500640043006F006C0075006D006E0000000000040000000200000000001066000000010000200000005A66D11F3372CF63785FCA7F40C69EA7DCEDA7CC247BCFBB00C38E42D74AECAA000000000E800000000200002000000022DD4B17FD42971A525C6C9C486DCAF55C6C488516735862E36E352C2D42E2C460000000A7DE800C07B35B3F0D6263AC81AE6E31CA8A493A12274568746645EF462AD47FD8892C9460826B6F5F558A0E75CC4E4AC5561556A9455D20A14B4EE450E669AB1E892532D8D21B364B2F844052BF0F8ECA46A54A000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000003C2200007B1A0000000000002D0100000D0000000C000000070000001C01000052080000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000007600000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F000000170000005000720065004C006F006100640044006900730063006100720064006500640043006F006C0075006D006E00000002000B00F4CFFFFF26340000C2C9FFFF263400000000000002000000F0F0F00000000000000000000000000000000000010000008F0000000000000019C2FFFF1F3200008415000058010000320000000100000200008415000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61230046004B005F005000720065004C006F006100640044006900730063006100720064006500640043006F006C0075006D006E005F005400610062006C00650049006E0066006F0021433412080000009A290000A51B0000785634120700000014010000500072006F0063006500730073005400610073006B0041007200670075006D0065006E00740000002C002000560065007200730069006F006E003D0034002E0030002E0030002E0030002C002000430075006C0074007500720065003D006E00650075007400720061006C002C0020005000750062006C00690063004B006500790054006F006B0065006E003D00620037003700610035006300350036003100390033003400650030003800390000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000009A290000A51B0000000000002D0100000D0000000C000000070000001C010000F70800005307000094020000390300003A020000DD040000DD040000EE020000DD04000036060000380400000000000001000000F21300000804000000000000000000000000000002000000020000001C010000F70800000000000001000000F21300000804000000000000000000000000000002000000020000001C010000F70800000100000000000000F21300000804000000000000000000000000000002000000020000001C010000F7080000000000000000000055320000DD23000000000000000000000D00000004000000040000001C010000F70800009B0A00008106000078563412040000007000000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F00000014000000500072006F0063006500730073005400610073006B0041007200670075006D0065006E007400000002000B009ED10000EC5E000036D80000EC5E00000000000002000000F0F0F0000000000000000000000000000000000001000000950000000000000044CA0000E55C00004B15000058010000320000000100000200004B15000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61220046004B005F00500072006F0063006500730073005400610073006B0041007200670075006D0065006E0074005F00500072006F0063006500730073005400610073006B00214334120800000002230000D1240000785634120700000014010000500072006F0063006500730073005400610073006B0000006700720061006D002000460069006C00650073002000280078003800360029002F004D006900630072006F0073006F00660074002000530051004C0020005300650072007600650072002F003100310030002F0054006F006F006C0073002F00420069006E006E002F004D0061006E006100670065006D0065006E007400530074007500640069006F002F004900440045002F00500072006900760061007400650041007300730065006D0062006C006900650073002F004F0062006A006500630074004500780070006C006F007200650072005200000000000000000000000000000005000000540000002C0000002C0000002C00000034000000000000000000000002230000D1240000000000002D0100000D0000000C000000070000001C010000450600002805000094020000390300003A02000066030000DD040000EE020000DD040000360600003804000000000000010000004C0F00000804000000000000000000000000000002000000020000001C0100004506000000000000010000004C0F00000804000000000000000000000000000002000000020000001C0100004506000001000000000000004C0F00000804000000000000000000000000000002000000020000001C010000450600000000000000000000CB2400007C24000000000000000000000D00000004000000040000001C01000045060000710700009204000078563412040000006000000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000000C000000500072006F0063006500730073005400610073006B00000003000B00243900007A0D0000DE3F00007A0D0000DE3F000020CCFFFF0000000002000000F0F0F000000000000000000000000000000000000100000097000000000000008D4000008BF0FFFFAF1900005801000032000000010000020000AF19000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D612B0046004B005F00410067006700720065006700610074006500440069006D0065006E00730069006F006E005F00450078007400720061006300740069006F006E0049006E0066006F0072006D006100740069006F006E0003000B0021720000E691000092B80000E691000092B80000A37F00000000000002000000F0F0F00000000000000000000000000000000000010000009B00000000000000E99E000095920000DF0E00005801000032000000010000020000DF0E000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61180046004B005F00500072006F0063006500730073005400610073006B005F0043006100740061006C006F0067007500650000020000F90C0000160900000200640000000500008000000000000000003A00010000009001C0D40100085365676F652055491E004E0065007600650072002000430041005300430041004400450020000D000A00440045004C0045005400450020000D000A0048006500720065002100214334120800000036220000472400007856341207000000140100004C006F00610064004D006F00640075006C00650041007300730065006D0062006C0079000000000000000000D800000003000000010000000001000000000000446174615F5053004D756C7469706C7952616469616C4772616469656E7443656E74657265645F5053315F436F6E7374616E745461626C6500666C48616C66546578656C53697A654E6F726D616C697A656400AB000003000100010001000000000000007D00000098000000050000000100010001000100A80000004C000000B0000000050000000100010001000100C00000004D756C7469706C7952616469616C4772616469656E7443656E74000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000003622000047240000000000002D0100000D0000000C000000070000001C01000026070000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000006E00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F000000130000004C006F00610064004D006F00640075006C00650041007300730065006D0062006C007900000021433412080000009E390000252700007856341207000000140100004C006F00610064005300630068006500640075006C00650000005300650072007600650072002E004200610074006300680050006100720073006500720043006C00690065006E0074002C002000560065007200730069006F006E003D00310031002E0030002E0030002E0030002C002000430075006C0074007500720065003D006E00650075007400720061006C002C0020005000750062006C00690063004B006500790054006F006B0065006E003D00380039003800340035006400630064003800300038003000630063003900310000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000009E39000025270000000000002D0100000D0000000C000000070000001C010000C50D0000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000104F0000B1240000000000000B0000000B00000002000000020000001C0100007B2A00000000000001000000D9100000AF08000000000000020000000200000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000006200000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000000D0000004C006F00610064005300630068006500640075006C006500000021433412080000007829000010190000785634120700000014010000450078007400650072006E0061006C0044006100740061006200610073006500530065007200760065007200000000007501000000000000140000000000000000000000010000000400000075010000430000004700000004000000000000000600000004000000750100001400000047000000010000000300000005000000E4FFFFFF750100001400000047000000000000000300000005000000E8FFFFFF7501000014000000470000000200000003000000050000000800000075010000530000005C0100000400000000000000060000000800000075010000530000005C01000001000000030000000500000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000007829000010190000000000002D0100000D0000000C000000070000001C01000026070000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000007600000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F00000017000000450078007400650072006E0061006C0044006100740061006200610073006500530065007200760065007200000003000B0036F7FFFFFC6C0000B4E2FFFFFC6C0000B4E2FFFF495900000000000002000000F0F0F0000000000000000000000000000000000001000000A40000000000000044CDFFFFAB6D00002D15000058010000320000000100000200002D15000058010000020000000000050000800800008001000000150001000000900144420100065461686F6D61230046004B005F005400610062006C00650049006E0066006F005F00450078007400650072006E0061006C004400610074006100620061007300650053006500720076006500720003000B004C1D00001E8300004C1D0000089D0000A8480000089D00000000000002000000F0F0F0000000000000000000000000000000000001000000A700000000000000F50F0000B79D00008415000058010000320000000100000200008415000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D61230046004B005F0043006100740061006C006F006700750065005F00450078007400650072006E0061006C004400610074006100620061007300650053006500720076006500720003000B00701700001E830000701700004EA20000A84800004EA200000000000002000000F0F0F0000000000000000000000000000000000001000000A900000000000000B4090000FDA200003116000058010000320000000100000200003116000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D61240046004B005F0043006100740061006C006F006700750065005F00450078007400650072006E0061006C0044006100740061006200610073006500530065007200760065007200310003000B0036F7FFFF546F00002EA5FFFF546F00002EA5FFFF122600000000000002000000F0F0F0000000000000000000000000000000000001000000AB00000000000000DDA5FFFF926800006715000058010000380000000100000200006715000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D61220046004B005F0041004E004F005400610062006C0065005F00450078007400650072006E0061006C00440061007400610062006100730065005300650072007600650072002143341208000000C61B0000E61700007856341207000000140100004C006F006100640050006500720069006F0064006900630061006C006C0079000000440026004400570044004F0052004A005800480003001000030026004400570044004F0052004A005800480042002700440057004400420027004C0044004A00550044005000000080400000004100001041000000410000C040000040400000C0400000E04000008040000040400000E040000080400000C0400000E0400000E04000008040000000410000C040000080400000C040000000410000C040000080400000C040000040400000E0400000E0400000E0400000C040000040400000A04000004040000000410000000000000000000000000000000005000000540000002C0000002C0000002C000000340000000000000000000000C61B0000E6170000000000002D0100000D0000000C000000070000001C010000890D0000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000006A00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F000000110000004C006F006100640050006500720069006F0064006900630061006C006C007900000002000B00B42D0000E4C1FFFFF8230000E4C1FFFF0000000002000000F0F0F0000000000000000000000000000000000001000000B0000000000000005F1B0000DDBFFFFFED1A00005801000032000000010000020000ED1A000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D612C0046004B005F0041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E005F00410067006700720065006700610074006500440069006D0065006E00730069006F006E002143341208000000E71B0000DF3500007856341207000000140100004C006F00610064004D0065007400610064006100740061000000954000000000000010400100000000000000000000000E000000050000001801000000000000000000000000000000000000F800000000000000050000000000000000000000020000000000000000C0954000000000000000000000000000C095400000000000000040040000002000000030000000000000000000000000B8954000000000000010400000000000000040000000000000004000000000000000000100000000000000050000000000000040000000010000000000000000000040000000000000104004000000200000002000000000000000000000000100000005000000540000002C0000002C0000002C0000003400000000000000000000003622000047240000000000002D0100000D0000000C000000070000001C01000026070000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000E71B0000DF35000000000000140000000C00000002000000020000001C0100007A0D00000000000001000000D91000006806000000000000010000000100000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000006200000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000000D0000004C006F00610064004D006500740061006400610074006100000002000B00AA820000F654000021720000F65400000000000002000000F0F0F0000000000000000000000000000000000001000000BF0000000000000066720000EF520000FF0F00005801000032000000010000020000FF0F000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D61190046004B005F0043006100740061006C006F006700750065005F004C006F00610064004D00650074006100640061007400610004000B00919E000086880000919E000084940000CA9E000084940000CA9E0000F69F00000200000002000000F0F0F0000000000000000000000000000000000001000000C100000000000000D98A0000069500000913000058010000320000000100000200000913000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D61200046004B005F004C006F006100640050006500720069006F0064006900630061006C006C0079005F004C006F00610064004D00650074006100640061007400610002000B00919E00003A6B00009CAE00003A6B00000000000002000000F0F0F0000000000000000000000000000000000001000000C300000000000000079E0000E96B00001F11000058010000320000000100000200001F11000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D611B0046004B005F00500072006F0063006500730073005400610073006B005F004C006F00610064004D00650074006100640061007400610004000B00919E0000E88000008EA90000E88000008EA90000D6830000D8BD0000D68300000000000002000000F0F0F0000000000000000000000000000000000001000000C50000000000000081AA0000CF810000E91100005801000032000000010000020000E911000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D611C0046004B005F004C006F00610064005300630068006500640075006C0065005F004C006F00610064004D0065007400610064006100740061002143341208000000362200003A1A000078563412070000001401000044004C004500570069006E0064006F0077007300530065007200760069006300650045007800630065007000740069006F006E000000720073006500720043006C00690065006E0074002C002000560065007200730069006F006E003D00310031002E0030002E0030002E0030002C002000430075006C0074007500720065003D006E00650075007400720061006C002C0020005000750062006C00690063004B006500790054006F006B0065006E003D00380039003800340035006400630064003800300038003000630063003900310000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000540000002C0000002C0000002C000000340000000000000000000000362200003A1A0000000000002D010000080000000C000000070000001C01000026070000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000621700007B1A000000000000060000000600000002000000020000001C010000E60A00000000000001000000D91000006806000000000000010000000100000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000007E00000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000001B00000044004C004500570069006E0064006F0077007300530065007200760069006300650045007800630065007000740069006F006E00000002000B00408300001389000040830000CA9E00000000000002000000F0F0F0000000000000000000000000000000000001000000C800000000000000FC67000042930000951A00005801000032000000010000020000951A000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D612A0046004B005F0044004C004500570069006E0064006F0077007300530065007200760069006300650045007800630065007000740069006F006E005F004C006F00610064004D00650074006100640061007400610005000B00849900001389000084990000849400004C990000849400004C9900008CA000009E9D00008CA000000000000002000000F0F0F0000000000000000000000000000000000001000000CA00000000000000E7840000C9950000B61300005801000033000000010000020000B613000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D61210046004B005F004C006F006100640050006500720069006F0064006900630061006C006C0079005F004C006F00610064004D00650074006100640061007400610031002143341208000000112E00007116000078563412070000001401000041006700670072006500670061007400650043006F006E00740069006E0075006F0075007300440061007400650041007800690073000000010000002CF19F123CF19F1204000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000A891B10B000400000000000074F19F120400000000000000000000000000000000000000000000000000000080457D121884AC0B00000000AA550000E0F09F1210000000604578120C0000000500000094DF7B007CDF7B00C4F19F1200000000D5FFAA55001000000C00000000000000A891B10B0000000000000000000000000000000005000000540000002C0000002C0000002C000000340000000000000000000000112E000071160000000000002D0100000D0000000C000000070000001C010000F7080000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000008000000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000001C00000041006700670072006500670061007400650043006F006E00740069006E0075006F007500730044006100740065004100780069007300000002000B00F843000020CCFFFFF8430000F4CFFFFF0200000002000000F0F0F0000000000000000000000000000000000001000000CD00000000000000C22400005ECDFFFF871E00005801000032000000010000020000871E000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D61310046004B005F0041006700670072006500670061007400650043006F006E00740069006E0075006F0075007300440061007400650041007800690073005F00410067006700720065006700610074006500440069006D0065006E00730069006F006E0021433412080000003D2200006910000078563412070000001401000041006700670072006500670061007400650046006F0072006300650064004A006F0069006E00000000000000D800000003000000010000000001000000000000446174615F5053004D756C7469706C7952616469616C4772616469656E7443656E74657265645F5053315F436F6E7374616E745461626C6500666C48616C66546578656C53697A654E6F726D616C697A656400AB000003000100010001000000000000007D00000098000000050000000100010001000100A80000004C000000B0000000050000000100010001000100C00000004D756C7469706C7952616469616C4772616469656E7443656E74000000000000000000000000000005000000540000002C0000002C0000002C0000003400000000000000000000003D22000069100000000000002D0100000D0000000C000000070000001C01000015090000DC05000094020000390300003A020000DE030000DD040000EE020000DD04000036060000380400000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000000000001000000D91000000804000000000000000000000000000002000000020000001C010000260700000100000000000000D91000000804000000000000000000000000000002000000020000001C0100002607000000000000000000003D2900004724000000000000000000000D00000004000000040000001C010000260700007F0800003705000078563412040000007000000001000000010000000B000000000000000100000002000000030000000400000005000000060000000700000008000000090000000A00000004000000640062006F0000001400000041006700670072006500670061007400650046006F0072006300650064004A006F0069006E00000003000B0072060000CDCBFFFF720600005ECFFFFFB80B00005ECFFFFF0000000002000000F0F0F0000000000000000000000000000000000001000000D20000000000000064EAFFFFE9CFFFFF5F1B000058010000270000000100000200005F1B000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D612D0046004B005F0041006700670072006500670061007400650046006F0072006300650064004A006F0069006E005F0041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E0004000B00AEF9FFFF263400008707000026340000870700009ADEFFFFB80B00009ADEFFFF0000000002000000F0F0F0000000000000000000000000000000000001000000D40000000000000036080000241600007C130000580100002B0000000100000200007C13000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D61200046004B005F0041006700670072006500670061007400650046006F0072006300650064004A006F0069006E005F005400610062006C00650049006E0066006F0007000B00A8480000B42D0000F2430000B42D0000F243000020280000BC3C000020280000BC3C00005DCDFFFF282300005DCDFFFF28230000CDCBFFFF0000000002000000F0F0F0000000000000000000000000000000000001000000D6000000000000006B3D00003DECFFFF4B15000058010000380000000100000200004B15000058010000020000000000FFFFFF000800008001000000150001000000900144420100065461686F6D61230046004B005F0041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E005F0043006100740061006C006F006700750065000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000FEFFFFFFFEFFFFFF0400000005000000060000000700000008000000090000000A0000000B0000000C0000000D0000000E0000000F000000100000001100000012000000130000001400000015000000160000001700000018000000190000001A0000001B0000001C0000001D0000001E0000001F00000020000000210000002200000023000000240000002500000026000000270000002800000029000000FEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0100FEFF030A0000FFFFFFFF00000000000000000000000000000000170000004D6963726F736F66742044445320466F726D20322E300010000000456D626564646564204F626A6563740000000000F439B271000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010003000000000000000C0000000B0000004E61BC00000000000000000000000000000000000000000000000000000000000000000000000000000000000000DBE6B0E91C81D011AD5100A0C90F573900000200D062F43BF38BD0010202000010484500000000000000000000000000000000007A0100004400610074006100200053006F0075007200630065003D006A0061006E00750073003B0049006E0069007400690061006C00200043006100740061006C006F0067003D0053007000720069006E00740046006F0075007200440061007400610043006100740061006C006F006700750065003B0049006E00740065006700720061007400650064002000530065006300750072006900740079003D0054007200750065003B004D0075006C007400690070006C00650041006300740069007600650052006500730075006C00740053006500740073003D00460061006C00730065003B005000610063006B00650074002000530069007A0065003D0034003000390036003B0041000300440064007300530074007200650061006D000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160002000300000006000000FFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000005E0000007A6500000000000053006300680065006D00610020005500440056002000440065006600610075006C0074000000000000000000000000000000000000000000000000000000000026000200FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000020000001600000000000000440053005200450046002D0053004300480045004D0041002D0043004F004E00540045004E0054005300000000000000000000000000000000000000000000002C0002010500000007000000FFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000003000000A40900000000000053006300680065006D00610020005500440056002000440065006600610075006C007400200050006F007300740020005600360000000000000000000000000036000200FFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000002A00000012000000000000008100000082000000830000008400000085000000860000008700000088000000890000008A0000008B0000008C0000008D0000008E0000008F00000090000000FEFFFFFF92000000930000009400000095000000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0C0000000CCFFFFF7289FFFF0100260000007300630068005F006C006100620065006C0073005F00760069007300690062006C0065000000010000000B0000001E000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000010000000100000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003A00000034002C0030002C003200380034002C0030002C0032003200390035002C0031002C0031003800370035002C0035002C0031003200340035000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0032003700390030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0032003200390035002C00310032002C0032003700310035002C00310031002C0031003600360035000000020000000200000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003A00000034002C0030002C003200380034002C0030002C0033003300370035002C0031002C0031003800370035002C0035002C0031003200340035000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0032003700370035000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0032003200390035002C00310032002C0032003700310035002C00310031002C0031003600360035000000030000000300000000000000540000000103737401000000640062006F00000046004B005F0043006100740061006C006F006700750065005F004900740065006D0073005F0044006100740061005F0043006100740061006C006F0067007500650000000000000000000000C40200000000040000000400000003000000080000000100650DC800650D0000000000000000AD070000000000050000000500000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003A00000034002C0030002C003200380034002C0030002C0032003200390035002C0031002C0031003800370035002C0035002C0031003200340035000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0033003500370030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0032003200390035002C00310032002C0032003700310035002C00310031002C0031003600360035000000060000000600000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003A00000034002C0030002C003200380034002C0030002C0032003800300035002C0031002C0031003800370035002C0035002C0031003200340035000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0032003700390030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0032003200390035002C00310032002C0032003700310035002C00310031002C00310036003600350000000700000007000000000000004600000001038A7601000000640062006F00000046004B005F005400610062006C0065005F004900740065006D0073005F0044006100740061005F005400610062006C006500730000000000000000000000C40200000000080000000800000007000000080000000100650D8800650D0000000000000000AD0700000000000D0000000D00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003A00000034002C0030002C003200380034002C0030002C0032003200390035002C0031002C0031003800370035002C0035002C0031003200340035000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0032003200390035002C00310032002C0032003700310035002C00310031002C00310036003600350000001200000012000000000000005E00000001FF5F5E01000000640062006F00000046004B005F0043006F006C0075006D006E0049006E0066006F005F0043006100740061006C006F006700750065004900740065006D005F0043006F006C0075006D006E0049006E0066006F0000000000000000000000C40200000000130000001300000012000000080000000100650D4800650D0000000000000000AD0700000000001600000016000000000000006400000001016F0001000000640062006F00000046004B005F0043006F006C0075006D006E0049006E0066006F005F0043006100740061006C006F006700750065004900740065006D005F0043006100740061006C006F006700750065004900740065006D0000000000000000000000C40200000000170000001700000016000000080000000100650D0800650D0000000000000000AD070000000000180000001800000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003800330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C00310033003300350000001900000019000000000000005000000001FF5F5E01000000640062006F00000046004B005F0053007500700070006F007200740069006E00670044006F00630075006D0065006E0074005F0043006100740061006C006F0067007500650000000000000000000000C402000000001A0000001A000000190000000800000001FF640DC8FF640D0000000000000000AD0700000000001B0000001B00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0032003400300030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000220000002200000000000000740000000102000001000000640062006F00000046004B005F0043006F006C0075006D006E0049006E0066006F005F0043006100740061006C006F006700750065004900740065006D005F00450078007400720061006300740069006F006E0049006E0066006F0072006D006100740069006F006E0000000000000000000000C402000000002300000023000000220000000800000001FF640D88FF640D0000000000000000AD070000000000240000002400000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003A00000034002C0030002C003200380034002C0030002C0032003000370030002C0031002C0031003600390035002C0035002C0031003100320035000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0032003000370030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0032003000370030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0032003000370030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0032003000370030002C00310032002C0032003400340035002C00310031002C00310035003000300000002700000027000000000000003A0000000106000001000000640062006F00000046004B005F004C006F006F006B00750070005F0043006F006C0075006D006E0049006E0066006F0000000000000000000000C402000000002800000028000000270000000800000001FF640D48FF640D0000000000000000AD0700000000002900000029000000000000003C0000000107000001000000640062006F00000046004B005F004C006F006F006B00750070005F0043006F006C0075006D006E0049006E0066006F00310000000000000000000000C402000000002A0000002A000000290000000800000001FF640D08FF640D0000000000000000AD0700000000002B0000002B000000000000003C0000000105000001000000640062006F00000046004B005F004C006F006F006B00750070005F0043006F006C0075006D006E0049006E0066006F00320000000000000000000000C402000000002C0000002C0000002B0000000800000001FE640DC8FE640D0000000000000000AD0700000000002F0000002F00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003A00000034002C0030002C003200380034002C0030002C0032003000370030002C0031002C0031003600320030002C0035002C0031003100320035000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0032003000370030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0032003000370030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0032003000370030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0032003000370030002C00310032002C0032003400340035002C00310031002C00310035003000300000003300000033000000000000005000000001FF5F5E01000000640062006F00000046004B005F004A006F0069006E0049006E0066006F005F0043006F006C0075006D006E0049006E0066006F005F004A006F0069006E004B0065007900310000000000000000000000C402000000003400000034000000330000000800000001FE640D88FE640D0000000000000000AD0700000000003500000035000000000000005000000001FF5F5E01000000640062006F00000046004B005F004A006F0069006E0049006E0066006F005F0043006F006C0075006D006E0049006E0066006F005F004A006F0069006E004B0065007900320000000000000000000000C402000000003600000036000000350000000800000001FE640D48FE640D0000000000000000AD070000000000380000003800000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003A00000034002C0030002C003200380034002C0030002C0032003000350035002C0031002C0031003100370030002C0035002C0031003000360035000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C00310033003300350000003900000039000000000000006400000001006F0001000000640062006F00000046004B005F00450078007400720061006300740069006F006E00460069006C007400650072005F00450078007400720061006300740069006F006E0049006E0066006F0072006D006100740069006F006E0000000000000000000000C402000000003A0000003A000000390000000800000001FE640D08FE640D0000000000000000AD0700000000003B0000003B00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003A00000034002C0030002C003200380034002C0030002C0031003500340035002C0031002C0031003100370030002C0035002C0031003000360035000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C00310033003300350000003C0000003C000000000000006C000000011A5F5E01000000640062006F00000046004B005F00450078007400720061006300740069006F006E00460069006C0074006500720050006100720061006D0065007400650072005F00450078007400720061006300740069006F006E00460069006C0074006500720000000000000000000000C402000000003D0000003D0000003C0000000800000001FD640DC8FD640D0000000000000000AD070000000000400000004000000000000000560000000103737401000000640062006F00000046004B005F0043006100740061006C006F006700750065005F00450078007400720061006300740069006F006E0049006E0066006F0072006D006100740069006F006E0000000000000000000000C402000000004100000041000000400000000800000001FD640D88FD640D0000000000000000AD0700000000004C0000004C00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003800330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0035003000370030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000540000005400000000000000540000000103737401000000640062006F00000046004B005F004C006F006F006B007500700043006F006D0070006F0073006900740065004A006F0069006E0049006E0066006F005F004C006F006F006B007500700000000000000000000000C402000000005500000055000000540000000800000001FD640D48FD640D0000000000000000AD0700000000005600000056000000000000005C00000001FF5F5E01000000640062006F00000046004B005F004C006F006F006B007500700043006F006D0070006F0073006900740065004A006F0069006E0049006E0066006F005F0043006F006C0075006D006E0049006E0066006F0000000000000000000000C402000000005700000057000000560000000800000001FD640D08FD640D0000000000000000AD0700000000005900000059000000000000006200000001006F0001000000640062006F00000046004B005F004C006F006F006B007500700043006F006D0070006F0073006900740065004A006F0069006E0049006E0066006F005F0043006F006C0075006D006E0049006E0066006F005F0046004B0000000000000000000000C402000000005A0000005A000000590000000800000001FC640DC8FC640D0000000000000000AD0700000000005C0000005C00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003800330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C00310033003300350000005D0000005D000000000000005000000001FF5F5E01000000640062006F00000046004B005F0053007500700070006F007200740069006E006700530051004C005400610062006C0065005F0043006100740061006C006F0067007500650000000000000000000000C402000000005E0000005E0000005D0000000800000001FC640D88FC640D0000000000000000AD0700000000005F0000005F00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003800330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000600000006000000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0032003600340030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000630000006300000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0033003100320030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000640000006400000000000000800000000106401001000000640062006F00000046004B005F00410067006700720065006700610074006500460069006C0074006500720053007500620043006F006E007400610069006E00650072005F00410067006700720065006700610074006500460069006C0074006500720043006F006E007400610069006E006500720000000000000000000000C402000000006500000065000000640000000800000001FC640D48FC640D0000000000000000AD0700000000006600000066000000000000008200000001FF690001000000640062006F00000046004B005F00410067006700720065006700610074006500460069006C0074006500720053007500620043006F006E007400610069006E00650072005F00410067006700720065006700610074006500460069006C0074006500720043006F006E007400610069006E0065007200310000000000000000000000C402000000006700000067000000660000000800000001F57115C8F571150000000000000000AD0700000000006E0000006E00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003800330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0034003600350030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C00310033003300350000006F0000006F000000000000006800000001006F0001000000640062006F00000046004B005F00410067006700720065006700610074006500460069006C007400650072005F00410067006700720065006700610074006500460069006C0074006500720043006F006E007400610069006E006500720000000000000000000000C4020000000070000000700000006F0000000800000001F5711588F571150000000000000000AD070000000000710000007100000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0032003600350035002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C00310033003300350000007200000072000000000000006A000000011A5F5E01000000640062006F00000046004B005F00410067006700720065006700610074006500440069006D0065006E00730069006F006E005F0041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E0000000000000000000000C402000000007300000073000000720000000800000001F5711548F571150000000000000000AD070000000000740000007400000000000000760000000102000001000000640062006F00000046004B005F0041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E005F00410067006700720065006700610074006500460069006C0074006500720043006F006E007400610069006E006500720000000000000000000000C402000000007500000075000000740000000800000001F5711508F571150000000000000000AD070000000000760000007600000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003800330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C00310033003300350000007700000077000000000000006800000001016F0001000000640062006F00000046004B005F00410067006700720065006700610074006500460069006C0074006500720050006100720061006D0065007400650072005F00410067006700720065006700610074006500460069006C0074006500720000000000000000000000C402000000007800000078000000770000000800000001F47115C8F471150000000000000000AD0700000000007C0000007C00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0033003100380030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0034003900350030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000810000008100000000000000580000000103737401000000640062006F00000046004B005F0043006100740061006C006F006700750065004900740065006D00490073007300750065005F0043006100740061006C006F006700750065004900740065006D0000000000000000000000C402000000008200000082000000810000000800000001F4711588F471150000000000000000AD070000000000830000008300000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003800330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C00310033003300350000008400000084000000000000006800000001016F0001000000640062006F00000046004B005F0043006100740061006C006F006700750065004900740065006D00490073007300750065005F004F0077006E00650072005F0049007300730075006500530079007300740065006D00550073006500720000000000000000000000C402000000008500000085000000840000000800000001F4711548F471150000000000000000AD0700000000008600000086000000000000006E000000011A5F5E01000000640062006F00000046004B005F0043006100740061006C006F006700750065004900740065006D00490073007300750065005F005200650070006F0072007400650072005F0049007300730075006500530079007300740065006D00550073006500720000000000000000000000C402000000008700000087000000860000000800000001F4711508F471150000000000000000AD070000000000880000008800000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003800330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C00310033003300350000008B0000008B000000000000003E0000000105000001000000640062006F00000046004B005F0043006F006C0075006D006E0049006E0066006F005F0041004E004F005400610062006C00650000000000000000000000C402000000008C0000008C0000008B0000000800000001F37115C8F371150000000000000000AD0700000000008D0000008D00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0032003100330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C00310033003300350000008E0000008E00000000000000580000000102737401000000640062006F00000046004B005F005000720065004C006F006100640044006900730063006100720064006500640043006F006C0075006D006E005F005400610062006C00650049006E0066006F0000000000000000000000C402000000008F0000008F0000008E0000000800000001F3711588F371150000000000000000AD070000000000900000009000000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003600300035002C0031002C0031003300320030002C0035002C003800370030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003600300035000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003600300035000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003600300035000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003600300035002C00310032002C0031003900300035002C00310031002C0031003100370030000000910000009100000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003A00000034002C0030002C003200380034002C0030002C0032003200390035002C0031002C0031003800370035002C0035002C0031003200340035000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0032003200390035000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0032003200390035002C00310032002C0032003700310035002C00310031002C0031003600360035000000940000009400000000000000560000000101737401000000640062006F00000046004B005F00500072006F0063006500730073005400610073006B0041007200670075006D0065006E0074005F00500072006F0063006500730073005400610073006B0000000000000000000000C402000000009500000095000000940000000800000001F3711548F371150000000000000000AD0700000000009600000096000000000000006800000001016F0001000000640062006F00000046004B005F00410067006700720065006700610074006500440069006D0065006E00730069006F006E005F00450078007400720061006300740069006F006E0049006E0066006F0072006D006100740069006F006E0000000000000000000000C402000000009700000097000000960000000800000001F3711508F371150000000000000000AD0700000000009A0000009A000000000000004200000001038A7601000000640062006F00000046004B005F00500072006F0063006500730073005400610073006B005F0043006100740061006C006F0067007500650000000000000000000000C402000000009B0000009B0000009A0000000800000001F27115C8F271150000000000000000AD0700000000009C0000009C000000000000000800000001F2711588F271150000000000000000E40700000000009D0000009D00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003800330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C00310033003300350000009E0000009E00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0033003500320035002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008002000000032002C0030002C003200380034002C0030002C00310030003800370035000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000A2000000A200000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003800330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000A3000000A300000000000000580000000103737401000000640062006F00000046004B005F005400610062006C00650049006E0066006F005F00450078007400650072006E0061006C004400610074006100620061007300650053006500720076006500720000000000000000000000C40200000000A4000000A4000000A30000000800000001F2711548F271150000000000000000AD070000000000A6000000A600000000000000580000000103737401000000640062006F00000046004B005F0043006100740061006C006F006700750065005F00450078007400650072006E0061006C004400610074006100620061007300650053006500720076006500720000000000000000000000C40200000000A7000000A7000000A60000000800000001F2711508F271150000000000000000AD070000000000A8000000A8000000000000005A00000001075F5E01000000640062006F00000046004B005F0043006100740061006C006F006700750065005F00450078007400650072006E0061006C0044006100740061006200610073006500530065007200760065007200310000000000000000000000C40200000000A9000000A9000000A80000000800000001F17115C8F171150000000000000000AD070000000000AA000000AA00000000000000560000000103737401000000640062006F00000046004B005F0041004E004F005400610062006C0065005F00450078007400650072006E0061006C004400610074006100620061007300650053006500720076006500720000000000000000000000C40200000000AB000000AB000000AA0000000800000001F1711588F171150000000000000000AD070000000000AC000000AC00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0033003400360035002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000AF000000AF000000000000006A000000011A5F5E01000000640062006F00000046004B005F0041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E005F00410067006700720065006700610074006500440069006D0065006E00730069006F006E0000000000000000000000C40200000000B0000000B0000000AF0000000800000001F1711548F171150000000000000000AD070000000000BD000000BD00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000031000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003800330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0033003400350030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000BE000000BE000000000000004400000001038A7601000000640062006F00000046004B005F0043006100740061006C006F006700750065005F004C006F00610064004D00650074006100640061007400610000000000000000000000C40200000000BF000000BF000000BE0000000800000001F1711508F171150000000000000000AD070000000000C0000000C000000000000000520000000103737401000000640062006F00000046004B005F004C006F006100640050006500720069006F0064006900630061006C006C0079005F004C006F00610064004D00650074006100640061007400610000000000000000000000C40200000000C1000000C1000000C00000000800000001F07115C8F071150000000000000000AD070000000000C2000000C2000000000000004800000001038A7601000000640062006F00000046004B005F00500072006F0063006500730073005400610073006B005F004C006F00610064004D00650074006100640061007400610000000000000000000000C40200000000C3000000C3000000C20000000800000001F0711588F071150000000000000000AD070000000000C4000000C4000000000000004A00000001FF5F5E01000000640062006F00000046004B005F004C006F00610064005300630068006500640075006C0065005F004C006F00610064004D00650074006100640061007400610000000000000000000000C40200000000C5000000C5000000C40000000800000001F0711548F071150000000000000000AD070000000000C6000000C600000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0031003800330030002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0032003700390030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000C7000000C7000000000000006600000001006F0001000000640062006F00000046004B005F0044004C004500570069006E0064006F0077007300530065007200760069006300650045007800630065007000740069006F006E005F004C006F00610064004D00650074006100640061007400610000000000000000000000C40200000000C8000000C8000000C70000000800000001F0711508F071150000000000000000AD070000000000C9000000C900000000000000540000000103737401000000640062006F00000046004B005F004C006F006100640050006500720069006F0064006900630061006C006C0079005F004C006F00610064004D006500740061006400610074006100310000000000000000000000C40200000000CA000000CA000000C90000000800000001EF7115C8EF71150000000000000000AD070000000000CB000000CB00000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0032003200390035002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000CC000000CC00000000000000740000000102000001000000640062006F00000046004B005F0041006700670072006500670061007400650043006F006E00740069006E0075006F0075007300440061007400650041007800690073005F00410067006700720065006700610074006500440069006D0065006E00730069006F006E0000000000000000000000C40200000000CD000000CD000000CC0000000800000001EF711588EF71150000000000000000AD070000000000D0000000D000000000000000000000000000000000000000D00200000600280000004100630074006900760065005400610062006C00650056006900650077004D006F006400650000000100000008000400000030000000200000005400610062006C00650056006900650077004D006F00640065003A00300000000100000008003800000034002C0030002C003200380034002C0030002C0032003300320035002C0031002C0031003500300030002C0035002C003900390030000000200000005400610062006C00650056006900650077004D006F00640065003A00310000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00320000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00330000000100000008001E00000032002C0030002C003200380034002C0030002C0031003800330030000000200000005400610062006C00650056006900650077004D006F00640065003A00340000000100000008003E00000034002C0030002C003200380034002C0030002C0031003800330030002C00310032002C0032003100370035002C00310031002C0031003300330035000000D1000000D1000000000000006C000000011A5F5E01000000640062006F00000046004B005F0041006700670072006500670061007400650046006F0072006300650064004A006F0069006E005F0041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E0000000000000000000000C40200000000D2000000D2000000D10000000800000001EF711548EF71150000000000000000AD070000000000D3000000D300000000000000520000000100737401000000640062006F00000046004B005F0041006700670072006500670061007400650046006F0072006300650064004A006F0069006E005F005400610062006C00650049006E0066006F0000000000000000000000C40200000000D4000000D4000000D30000000800000001B5511558B551150000000000000000AD070000000000D5000000D500000000000000580000000103737401000000640062006F00000046004B005F0041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E005F0043006100740061006C006F0067007500650000000000000000000000C40200000000D6000000D6000000D50000000800000001337715E03377150000000000000000AD0F0000010000EB00000081000000010000007C00000056000000D200000016000000010000000D0000008C00000085000000D5000000020000005F0000008C000000710000005D000000020000005C00000097000000AA0000001900000002000000180000009F0000008000000003000000020000000100000000000000010000009A0000000200000090000000E30100002100000007000000050000000600000038000000210000008E000000050000008D0000008C00000093000000D300000005000000D00000008D000000A600000012000000060000000D0000008A000000C80000002700000006000000240000002A000000390000002900000006000000240000003C0000004B0000002B0000000600000024000000200000002F00000033000000060000002F000000A20000008D00000035000000060000002F000000B20000009D00000056000000060000004C000000140000009C00000059000000060000004C0000000600000090000000960000001B00000071000000930000003D000000220000001B0000000D0000004000000033000000390000001B00000038000000170000004E000000400000001B000000020000007F000000C001000054000000240000004C0000001C0000001B0000003C000000380000003B000000350000002C000000720000005F00000071000000A500000090000000D10000005F000000D00000000F0000007200000074000000600000005F00000080000000730000006F000000600000006E0000009F000000720000006600000060000000630000007300000088000000640000006000000063000000870000009C000000770000006E000000760000007900000072000000AF000000710000005F000000B6000000CB000000CC00000071000000CB0000004B0000000000000084000000830000007C00000009000000B700000086000000830000007C000000A60000007C0000008B000000880000000600000073000000E2000000940000009000000091000000830000008C000000AA000000A2000000880000009C00000037000000A8000000A2000000020000006D0000001A020000A6000000A2000000020000008100000008020000A3000000A200000005000000940000003F000000C9000000BD000000AC0000004D0000005C000000BE000000BD000000020000006000000013010000C0000000BD000000AC0000001101000002000000C2000000BD00000090000000AD000000AC000000C4000000BD0000009E000000F7000000C2000000C7000000BD000000C6000000010000002E0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000700070006C00690063006100740069006F006E0020004E0061006D0065003D0022004D006900630072006F0073006F00660074002000530051004C00200053006500720076006500720020004D0061006E006100670065006D0065006E0074002000530074007500640069006F0022000000008005002E00000043006100740061006C006F006700750065005F0044006100740061005F004400690061006700720061006D000000000226002800000041006700670072006500670061007400650046006F0072006300650064004A006F0069006E00000008000000640062006F000000000226003800000041006700670072006500670061007400650043006F006E00740069006E0075006F007500730044006100740065004100780069007300000008000000640062006F000000000226003600000044004C004500570069006E0064006F0077007300530065007200760069006300650045007800630065007000740069006F006E00000008000000640062006F000000000226001A0000004C006F00610064004D006500740061006400610074006100000008000000640062006F00000000022600220000004C006F006100640050006500720069006F0064006900630061006C006C007900000008000000640062006F000000000226002E000000450078007400650072006E0061006C0044006100740061006200610073006500530065007200760065007200000008000000640062006F000000000226001A0000004C006F00610064005300630068006500640075006C006500000008000000640062006F00000000022600260000004C006F00610064004D006F00640075006C00650041007300730065006D0062006C007900000008000000640062006F0000000002260028000000500072006F0063006500730073005400610073006B0041007200670075006D0065006E007400000008000000640062006F0000000002260018000000500072006F0063006500730073005400610073006B00000008000000640062006F000000000226002E0000005000720065004C006F006100640044006900730063006100720064006500640043006F006C0075006D006E00000008000000640062006F000000000226001200000041004E004F005400610062006C006500000008000000640062006F000000000226002000000049007300730075006500530079007300740065006D005500730065007200000008000000640062006F000000000226002600000043006100740061006C006F006700750065004900740065006D0049007300730075006500000008000000640062006F0000000002260032000000410067006700720065006700610074006500460069006C0074006500720050006100720061006D006500740065007200000008000000640062006F0000000002260026000000410067006700720065006700610074006500440069006D0065006E00730069006F006E00000008000000640062006F0000000002260020000000410067006700720065006700610074006500460069006C00740065007200000008000000640062006F0000000002260038000000410067006700720065006700610074006500460069006C0074006500720053007500620043006F006E007400610069006E0065007200000008000000640062006F0000000002260032000000410067006700720065006700610074006500460069006C0074006500720043006F006E007400610069006E0065007200000008000000640062006F000000000226002E00000041006700670072006500670061007400650043006F006E00660069006700750072006100740069006F006E00000008000000640062006F000000000226002600000053007500700070006F007200740069006E006700530051004C005400610062006C006500000008000000640062006F00000000022600300000004C006F006F006B007500700043006F006D0070006F0073006900740065004A006F0069006E0049006E0066006F00000008000000640062006F0000000002260034000000450078007400720061006300740069006F006E00460069006C0074006500720050006100720061006D006500740065007200000008000000640062006F0000000002260022000000450078007400720061006300740069006F006E00460069006C00740065007200000008000000640062006F00000000022600120000004A006F0069006E0049006E0066006F00000008000000640062006F000000000226000E0000004C006F006F006B0075007000000008000000640062006F000000000226002C000000450078007400720061006300740069006F006E0049006E0066006F0072006D006100740069006F006E00000008000000640062006F000000000226002600000053007500700070006F007200740069006E00670044006F00630075006D0065006E007400000008000000640062006F000000000226003200000043006F006C0075006D006E0049006E0066006F005F0043006100740061006C006F006700750065004900740065006D00000008000000640062006F000000000226001600000043006F006C0075006D006E0049006E0066006F00000008000000640062006F00000000022600140000005400610062006C00650049006E0066006F00000008000000640062006F000000000226001400000043006100740061006C006F00670075006500000008000000640062006F000000000224001C00000043006100740061006C006F006700750065004900740065006D00000008000000640062006F00000001000000D68509B3BB6BF2459AB8371664F0327008004E0000007B00310036003300340043004400440037002D0030003800380038002D0034003200450033002D0039004600410032002D004200360044003300320035003600330042003900310044007D00000000000000000000000000000000000000000000000000000000000000010003000000000000000C0000000B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000062885214) diff --git a/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql b/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql index 3e56c44af2..f282266c41 100644 --- a/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql +++ b/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql @@ -25,4 +25,3 @@ BEGIN ALTER TABLE [dbo].[ColumnInfo] ADD Dataset_ID [int] NULL --ALTER TABLE [dbo].[ColumnInfo] ADD CONSTRAINT [FK_Column_Info_Dataset] FOREIGN KEY([Dataset_ID]) REFERENCES [dbo].[Dataset] ([ID]) ON DELETE CASCADE ON UPDATE CASCADE END -GO \ No newline at end of file diff --git a/Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs b/Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs index f6b1ae14a5..89c8ba0212 100644 --- a/Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs +++ b/Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs @@ -91,9 +91,9 @@ public void GenerateWordFile() var colInfo = col.ColumnInfo; if (colInfo.Dataset_ID > 0) { - if (!foundDatasets.Contains(colInfo.Dataset_ID)) + if (!foundDatasets.Contains((int)colInfo.Dataset_ID)) { - foundDatasets.Add(colInfo.Dataset_ID); + foundDatasets.Add((int)colInfo.Dataset_ID); } } } diff --git a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs new file mode 100644 index 0000000000..2873265b1b --- /dev/null +++ b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs @@ -0,0 +1,44 @@ +using Rdmp.Core.CommandExecution.AtomicCommands; +using Rdmp.Core.Curation.Data; +using Rdmp.Core.Icons.IconProvision; +using Rdmp.Core.ReusableLibraryCode.Icons.IconProvision; +using Rdmp.UI.ItemActivation; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Rdmp.UI.CommandExecution.AtomicCommands; + +public class ExecuteCommandDeleteDataset : BasicUICommandExecution, IAtomicCommand +{ + private IActivateItems _activateItems; + private Dataset _dataset; + + public ExecuteCommandDeleteDataset(IActivateItems activator, Dataset dataset) : base(activator) + { + _dataset = dataset; + _activateItems = activator; + } + + public override string GetCommandHelp() => + "Delete this dataset and remove all links to it within RDMP"; + + public override void Execute() + { + base.Execute(); + var confirmDelete = YesNo( $"Are you sure you want to delete the dataset \"{_dataset.Name}\"?", $"Delete Dataset: {_dataset.Name}"); + if (confirmDelete) + { + var cmd = new Core.CommandExecution.AtomicCommands.ExecuteCommandDeleteDataset(_activateItems, _dataset); + cmd.Execute(); + } + } + + + public override Image GetImage(IIconProvider iconProvider) => + iconProvider.GetImage(RDMPConcept.Dataset, OverlayKind.Delete); +} diff --git a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs index 40f3f924ec..ca00ad429d 100644 --- a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs +++ b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs @@ -34,7 +34,7 @@ public ExecuteCommandLinkCatalogueToDataSet(IActivateItems activator, Catalogue } public override string GetCommandHelp() => - "TODO"; + "Link all colu,n of this catalogue to a dataset"; public override void Execute() { @@ -52,6 +52,6 @@ public override void Execute() cmd.Execute(); } - //public override Image GetImage(IIconProvider iconProvider) => - // iconProvider.GetImage(RDMPConcept.Lookup, OverlayKind.Add); + public override Image GetImage(IIconProvider iconProvider) => + iconProvider.GetImage(RDMPConcept.Dataset, OverlayKind.Link); } \ No newline at end of file diff --git a/Rdmp.UI/Menus/DatasetMenu.cs b/Rdmp.UI/Menus/DatasetMenu.cs new file mode 100644 index 0000000000..cf398fc118 --- /dev/null +++ b/Rdmp.UI/Menus/DatasetMenu.cs @@ -0,0 +1,18 @@ +using Rdmp.Core.Curation.Data; +using Rdmp.UI.CommandExecution.AtomicCommands; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Rdmp.UI.Menus; + +public class DatasetMenu: RDMPContextMenuStrip +{ + + public DatasetMenu(RDMPContextMenuStripArgs args, Dataset dataset): base(args, dataset) + { + Add(new ExecuteCommandDeleteDataset(_activator,dataset)); + } +} From 8b2e89db2b23633526a012ceec3a2872681c4725 Mon Sep 17 00:00:00 2001 From: James Friel Date: Mon, 20 Nov 2023 11:39:20 +0000 Subject: [PATCH 26/85] can list datasets --- .../CatalogueItemUI.Designer.cs | 597 +++--- Rdmp.UI/MainFormUITabs/CatalogueItemUI.cs | 36 + Rdmp.UI/MainFormUITabs/CatalogueItemUI.resx | 62 +- .../MainFormUITabs/CatalogueUI.Designer.cs | 1755 +++++++++-------- Rdmp.UI/MainFormUITabs/CatalogueUI.cs | 27 + Rdmp.UI/MainFormUITabs/CatalogueUI.resx | 65 +- 6 files changed, 1377 insertions(+), 1165 deletions(-) diff --git a/Rdmp.UI/MainFormUITabs/CatalogueItemUI.Designer.cs b/Rdmp.UI/MainFormUITabs/CatalogueItemUI.Designer.cs index 9b50ab9c65..8effa716c1 100644 --- a/Rdmp.UI/MainFormUITabs/CatalogueItemUI.Designer.cs +++ b/Rdmp.UI/MainFormUITabs/CatalogueItemUI.Designer.cs @@ -28,377 +28,386 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - this.ci_tbID = new System.Windows.Forms.TextBox(); - this.label28 = new System.Windows.Forms.Label(); - this.label27 = new System.Windows.Forms.Label(); - this.label26 = new System.Windows.Forms.Label(); - this.ci_tbComments = new System.Windows.Forms.TextBox(); - this.label30 = new System.Windows.Forms.Label(); - this.ci_tbLimitations = new System.Windows.Forms.TextBox(); - this.label31 = new System.Windows.Forms.Label(); - this.ci_tbTopics = new System.Windows.Forms.TextBox(); - this.label32 = new System.Windows.Forms.Label(); - this.ci_tbAggregationMethod = new System.Windows.Forms.TextBox(); - this.label33 = new System.Windows.Forms.Label(); - this.label34 = new System.Windows.Forms.Label(); - this.ci_tbResearchRelevance = new System.Windows.Forms.TextBox(); - this.ci_ddPeriodicity = new System.Windows.Forms.ComboBox(); - this.ci_tbStatisticalConsiderations = new System.Windows.Forms.TextBox(); - this.label35 = new System.Windows.Forms.Label(); - this.label36 = new System.Windows.Forms.Label(); - this.ci_tbName = new System.Windows.Forms.TextBox(); - this.splitContainer1 = new System.Windows.Forms.SplitContainer(); - this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); - this.panel1 = new System.Windows.Forms.Panel(); - this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); - this.splitContainer1.Panel1.SuspendLayout(); - this.splitContainer1.Panel2.SuspendLayout(); - this.splitContainer1.SuspendLayout(); - this.tableLayoutPanel1.SuspendLayout(); - this.tableLayoutPanel2.SuspendLayout(); - this.SuspendLayout(); + ci_tbID = new System.Windows.Forms.TextBox(); + label28 = new System.Windows.Forms.Label(); + label27 = new System.Windows.Forms.Label(); + label26 = new System.Windows.Forms.Label(); + ci_tbComments = new System.Windows.Forms.TextBox(); + label30 = new System.Windows.Forms.Label(); + ci_tbLimitations = new System.Windows.Forms.TextBox(); + label31 = new System.Windows.Forms.Label(); + ci_tbTopics = new System.Windows.Forms.TextBox(); + label32 = new System.Windows.Forms.Label(); + ci_tbAggregationMethod = new System.Windows.Forms.TextBox(); + label33 = new System.Windows.Forms.Label(); + label34 = new System.Windows.Forms.Label(); + ci_tbResearchRelevance = new System.Windows.Forms.TextBox(); + ci_ddPeriodicity = new System.Windows.Forms.ComboBox(); + ci_tbStatisticalConsiderations = new System.Windows.Forms.TextBox(); + label35 = new System.Windows.Forms.Label(); + label36 = new System.Windows.Forms.Label(); + ci_tbName = new System.Windows.Forms.TextBox(); + splitContainer1 = new System.Windows.Forms.SplitContainer(); + tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + panel1 = new System.Windows.Forms.Panel(); + lbDataset = new System.Windows.Forms.Label(); + lbDatasetValue = new System.Windows.Forms.Label(); + tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); + ((System.ComponentModel.ISupportInitialize)splitContainer1).BeginInit(); + splitContainer1.Panel1.SuspendLayout(); + splitContainer1.Panel2.SuspendLayout(); + splitContainer1.SuspendLayout(); + tableLayoutPanel1.SuspendLayout(); + tableLayoutPanel2.SuspendLayout(); + SuspendLayout(); // // ci_tbID // - this.ci_tbID.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.ci_tbID.Location = new System.Drawing.Point(117, 3); - this.ci_tbID.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.ci_tbID.Name = "ci_tbID"; - this.ci_tbID.ReadOnly = true; - this.ci_tbID.Size = new System.Drawing.Size(302, 23); - this.ci_tbID.TabIndex = 137; + ci_tbID.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ci_tbID.Location = new System.Drawing.Point(117, 3); + ci_tbID.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); + ci_tbID.Name = "ci_tbID"; + ci_tbID.ReadOnly = true; + ci_tbID.Size = new System.Drawing.Size(302, 23); + ci_tbID.TabIndex = 137; // // label28 // - this.label28.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label28.AutoSize = true; - this.label28.Location = new System.Drawing.Point(4, 7); - this.label28.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label28.Name = "label28"; - this.label28.Size = new System.Drawing.Size(105, 15); - this.label28.TabIndex = 147; - this.label28.Text = "Catalogue Item ID:"; - this.label28.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label28.Anchor = System.Windows.Forms.AnchorStyles.Right; + label28.AutoSize = true; + label28.Location = new System.Drawing.Point(4, 7); + label28.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label28.Name = "label28"; + label28.Size = new System.Drawing.Size(105, 15); + label28.TabIndex = 147; + label28.Text = "Catalogue Item ID:"; + label28.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // label27 // - this.label27.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label27.AutoSize = true; - this.label27.Location = new System.Drawing.Point(15, 0); - this.label27.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label27.Name = "label27"; - this.label27.Size = new System.Drawing.Size(105, 30); - this.label27.TabIndex = 148; - this.label27.Text = "Statistical Concept\r\nand Methodology:"; - this.label27.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label27.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + label27.AutoSize = true; + label27.Location = new System.Drawing.Point(15, 0); + label27.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label27.Name = "label27"; + label27.Size = new System.Drawing.Size(105, 30); + label27.TabIndex = 148; + label27.Text = "Statistical Concept\r\nand Methodology:"; + label27.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // label26 // - this.label26.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label26.AutoSize = true; - this.label26.Location = new System.Drawing.Point(67, 36); - this.label26.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label26.Name = "label26"; - this.label26.Size = new System.Drawing.Size(42, 15); - this.label26.TabIndex = 149; - this.label26.Text = "Name:"; - this.label26.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label26.Anchor = System.Windows.Forms.AnchorStyles.Right; + label26.AutoSize = true; + label26.Location = new System.Drawing.Point(67, 36); + label26.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label26.Name = "label26"; + label26.Size = new System.Drawing.Size(42, 15); + label26.TabIndex = 149; + label26.Text = "Name:"; + label26.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // ci_tbComments // - this.ci_tbComments.AcceptsReturn = true; - this.ci_tbComments.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ci_tbComments.Location = new System.Drawing.Point(128, 485); - this.ci_tbComments.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); - this.ci_tbComments.Multiline = true; - this.ci_tbComments.Name = "ci_tbComments"; - this.ci_tbComments.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.ci_tbComments.Size = new System.Drawing.Size(287, 102); - this.ci_tbComments.TabIndex = 146; + ci_tbComments.AcceptsReturn = true; + ci_tbComments.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ci_tbComments.Location = new System.Drawing.Point(128, 485); + ci_tbComments.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ci_tbComments.Multiline = true; + ci_tbComments.Name = "ci_tbComments"; + ci_tbComments.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + ci_tbComments.Size = new System.Drawing.Size(287, 152); + ci_tbComments.TabIndex = 146; // // label30 // - this.label30.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label30.AutoSize = true; - this.label30.Location = new System.Drawing.Point(7, 106); - this.label30.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label30.Name = "label30"; - this.label30.Size = new System.Drawing.Size(113, 15); - this.label30.TabIndex = 150; - this.label30.Text = "Research Relevance:"; - this.label30.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label30.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + label30.AutoSize = true; + label30.Location = new System.Drawing.Point(7, 106); + label30.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label30.Name = "label30"; + label30.Size = new System.Drawing.Size(113, 15); + label30.TabIndex = 150; + label30.Text = "Research Relevance:"; + label30.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // ci_tbLimitations // - this.ci_tbLimitations.AcceptsReturn = true; - this.ci_tbLimitations.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ci_tbLimitations.Location = new System.Drawing.Point(128, 379); - this.ci_tbLimitations.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); - this.ci_tbLimitations.Multiline = true; - this.ci_tbLimitations.Name = "ci_tbLimitations"; - this.ci_tbLimitations.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.ci_tbLimitations.Size = new System.Drawing.Size(287, 100); - this.ci_tbLimitations.TabIndex = 145; + ci_tbLimitations.AcceptsReturn = true; + ci_tbLimitations.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ci_tbLimitations.Location = new System.Drawing.Point(128, 379); + ci_tbLimitations.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ci_tbLimitations.Multiline = true; + ci_tbLimitations.Name = "ci_tbLimitations"; + ci_tbLimitations.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + ci_tbLimitations.Size = new System.Drawing.Size(287, 100); + ci_tbLimitations.TabIndex = 145; // // label31 // - this.label31.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label31.AutoSize = true; - this.label31.Location = new System.Drawing.Point(39, 58); - this.label31.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label31.Name = "label31"; - this.label31.Size = new System.Drawing.Size(70, 15); - this.label31.TabIndex = 151; - this.label31.Text = "Description:"; - this.label31.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label31.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + label31.AutoSize = true; + label31.Location = new System.Drawing.Point(39, 58); + label31.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label31.Name = "label31"; + label31.Size = new System.Drawing.Size(70, 15); + label31.TabIndex = 151; + label31.Text = "Description:"; + label31.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // ci_tbTopics // - this.ci_tbTopics.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ci_tbTopics.Location = new System.Drawing.Point(128, 215); - this.ci_tbTopics.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); - this.ci_tbTopics.Name = "ci_tbTopics"; - this.ci_tbTopics.Size = new System.Drawing.Size(287, 23); - this.ci_tbTopics.TabIndex = 142; + ci_tbTopics.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ci_tbTopics.Location = new System.Drawing.Point(128, 215); + ci_tbTopics.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ci_tbTopics.Name = "ci_tbTopics"; + ci_tbTopics.Size = new System.Drawing.Size(287, 23); + ci_tbTopics.TabIndex = 142; // // label32 // - this.label32.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label32.AutoSize = true; - this.label32.Location = new System.Drawing.Point(4, 270); - this.label32.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label32.Name = "label32"; - this.label32.Size = new System.Drawing.Size(116, 30); - this.label32.TabIndex = 152; - this.label32.Text = "Aggregation\r\nProcessPipelineData:"; - this.label32.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label32.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + label32.AutoSize = true; + label32.Location = new System.Drawing.Point(4, 270); + label32.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label32.Name = "label32"; + label32.Size = new System.Drawing.Size(116, 30); + label32.TabIndex = 152; + label32.Text = "Aggregation\r\nProcessPipelineData:"; + label32.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // ci_tbAggregationMethod // - this.ci_tbAggregationMethod.AcceptsReturn = true; - this.ci_tbAggregationMethod.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ci_tbAggregationMethod.Location = new System.Drawing.Point(128, 273); - this.ci_tbAggregationMethod.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); - this.ci_tbAggregationMethod.Multiline = true; - this.ci_tbAggregationMethod.Name = "ci_tbAggregationMethod"; - this.ci_tbAggregationMethod.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.ci_tbAggregationMethod.Size = new System.Drawing.Size(287, 100); - this.ci_tbAggregationMethod.TabIndex = 144; + ci_tbAggregationMethod.AcceptsReturn = true; + ci_tbAggregationMethod.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ci_tbAggregationMethod.Location = new System.Drawing.Point(128, 273); + ci_tbAggregationMethod.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ci_tbAggregationMethod.Multiline = true; + ci_tbAggregationMethod.Name = "ci_tbAggregationMethod"; + ci_tbAggregationMethod.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + ci_tbAggregationMethod.Size = new System.Drawing.Size(287, 100); + ci_tbAggregationMethod.TabIndex = 144; // // label33 // - this.label33.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label33.AutoSize = true; - this.label33.Location = new System.Drawing.Point(82, 219); - this.label33.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label33.Name = "label33"; - this.label33.Size = new System.Drawing.Size(38, 15); - this.label33.TabIndex = 153; - this.label33.Text = "Topic:"; - this.label33.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label33.Anchor = System.Windows.Forms.AnchorStyles.Right; + label33.AutoSize = true; + label33.Location = new System.Drawing.Point(82, 219); + label33.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label33.Name = "label33"; + label33.Size = new System.Drawing.Size(38, 15); + label33.TabIndex = 153; + label33.Text = "Topic:"; + label33.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // label34 // - this.label34.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label34.AutoSize = true; - this.label34.Location = new System.Drawing.Point(54, 248); - this.label34.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label34.Name = "label34"; - this.label34.Size = new System.Drawing.Size(66, 15); - this.label34.TabIndex = 154; - this.label34.Text = "Periodicity:"; - this.label34.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label34.Anchor = System.Windows.Forms.AnchorStyles.Right; + label34.AutoSize = true; + label34.Location = new System.Drawing.Point(54, 248); + label34.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label34.Name = "label34"; + label34.Size = new System.Drawing.Size(66, 15); + label34.TabIndex = 154; + label34.Text = "Periodicity:"; + label34.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // ci_tbResearchRelevance // - this.ci_tbResearchRelevance.AcceptsReturn = true; - this.ci_tbResearchRelevance.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ci_tbResearchRelevance.Location = new System.Drawing.Point(128, 109); - this.ci_tbResearchRelevance.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); - this.ci_tbResearchRelevance.Multiline = true; - this.ci_tbResearchRelevance.Name = "ci_tbResearchRelevance"; - this.ci_tbResearchRelevance.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.ci_tbResearchRelevance.Size = new System.Drawing.Size(287, 100); - this.ci_tbResearchRelevance.TabIndex = 141; + ci_tbResearchRelevance.AcceptsReturn = true; + ci_tbResearchRelevance.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ci_tbResearchRelevance.Location = new System.Drawing.Point(128, 109); + ci_tbResearchRelevance.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ci_tbResearchRelevance.Multiline = true; + ci_tbResearchRelevance.Name = "ci_tbResearchRelevance"; + ci_tbResearchRelevance.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + ci_tbResearchRelevance.Size = new System.Drawing.Size(287, 100); + ci_tbResearchRelevance.TabIndex = 141; // // ci_ddPeriodicity // - this.ci_ddPeriodicity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.ci_ddPeriodicity.FormattingEnabled = true; - this.ci_ddPeriodicity.Location = new System.Drawing.Point(128, 244); - this.ci_ddPeriodicity.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); - this.ci_ddPeriodicity.Name = "ci_ddPeriodicity"; - this.ci_ddPeriodicity.Size = new System.Drawing.Size(250, 23); - this.ci_ddPeriodicity.TabIndex = 143; + ci_ddPeriodicity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + ci_ddPeriodicity.FormattingEnabled = true; + ci_ddPeriodicity.Location = new System.Drawing.Point(128, 244); + ci_ddPeriodicity.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ci_ddPeriodicity.Name = "ci_ddPeriodicity"; + ci_ddPeriodicity.Size = new System.Drawing.Size(250, 23); + ci_ddPeriodicity.TabIndex = 143; // // ci_tbStatisticalConsiderations // - this.ci_tbStatisticalConsiderations.AcceptsReturn = true; - this.ci_tbStatisticalConsiderations.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ci_tbStatisticalConsiderations.Location = new System.Drawing.Point(128, 3); - this.ci_tbStatisticalConsiderations.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); - this.ci_tbStatisticalConsiderations.Multiline = true; - this.ci_tbStatisticalConsiderations.Name = "ci_tbStatisticalConsiderations"; - this.ci_tbStatisticalConsiderations.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.ci_tbStatisticalConsiderations.Size = new System.Drawing.Size(287, 100); - this.ci_tbStatisticalConsiderations.TabIndex = 140; + ci_tbStatisticalConsiderations.AcceptsReturn = true; + ci_tbStatisticalConsiderations.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ci_tbStatisticalConsiderations.Location = new System.Drawing.Point(128, 3); + ci_tbStatisticalConsiderations.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + ci_tbStatisticalConsiderations.Multiline = true; + ci_tbStatisticalConsiderations.Name = "ci_tbStatisticalConsiderations"; + ci_tbStatisticalConsiderations.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + ci_tbStatisticalConsiderations.Size = new System.Drawing.Size(287, 100); + ci_tbStatisticalConsiderations.TabIndex = 140; // // label35 // - this.label35.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label35.AutoSize = true; - this.label35.Location = new System.Drawing.Point(51, 376); - this.label35.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label35.Name = "label35"; - this.label35.Size = new System.Drawing.Size(69, 15); - this.label35.TabIndex = 155; - this.label35.Text = "Limitations:"; - this.label35.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label35.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + label35.AutoSize = true; + label35.Location = new System.Drawing.Point(51, 376); + label35.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label35.Name = "label35"; + label35.Size = new System.Drawing.Size(69, 15); + label35.TabIndex = 155; + label35.Text = "Limitations:"; + label35.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // label36 // - this.label36.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label36.AutoSize = true; - this.label36.Location = new System.Drawing.Point(51, 482); - this.label36.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label36.Name = "label36"; - this.label36.Size = new System.Drawing.Size(69, 15); - this.label36.TabIndex = 156; - this.label36.Text = "Comments:"; - this.label36.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label36.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + label36.AutoSize = true; + label36.Location = new System.Drawing.Point(51, 482); + label36.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + label36.Name = "label36"; + label36.Size = new System.Drawing.Size(69, 15); + label36.TabIndex = 156; + label36.Text = "Comments:"; + label36.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // ci_tbName // - this.ci_tbName.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.ci_tbName.Location = new System.Drawing.Point(117, 32); - this.ci_tbName.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.ci_tbName.Name = "ci_tbName"; - this.ci_tbName.Size = new System.Drawing.Size(302, 23); - this.ci_tbName.TabIndex = 138; + ci_tbName.Anchor = System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + ci_tbName.Location = new System.Drawing.Point(117, 32); + ci_tbName.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); + ci_tbName.Name = "ci_tbName"; + ci_tbName.Size = new System.Drawing.Size(302, 23); + ci_tbName.TabIndex = 138; // // splitContainer1 // - this.splitContainer1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; - this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; - this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; - this.splitContainer1.Location = new System.Drawing.Point(0, 0); - this.splitContainer1.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); - this.splitContainer1.Name = "splitContainer1"; - this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + splitContainer1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + splitContainer1.Location = new System.Drawing.Point(0, 0); + splitContainer1.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + splitContainer1.Name = "splitContainer1"; + splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; // // splitContainer1.Panel1 // - this.splitContainer1.Panel1.Controls.Add(this.tableLayoutPanel1); - this.splitContainer1.Panel1MinSize = 150; + splitContainer1.Panel1.Controls.Add(tableLayoutPanel1); + splitContainer1.Panel1MinSize = 150; // // splitContainer1.Panel2 // - this.splitContainer1.Panel2.AutoScroll = true; - this.splitContainer1.Panel2.Controls.Add(this.tableLayoutPanel2); - this.splitContainer1.Panel2MinSize = 200; - this.splitContainer1.Size = new System.Drawing.Size(445, 839); - this.splitContainer1.SplitterDistance = 220; - this.splitContainer1.SplitterWidth = 5; - this.splitContainer1.TabIndex = 158; + splitContainer1.Panel2.AutoScroll = true; + splitContainer1.Panel2.Controls.Add(tableLayoutPanel2); + splitContainer1.Panel2MinSize = 200; + splitContainer1.Size = new System.Drawing.Size(445, 839); + splitContainer1.SplitterDistance = 246; + splitContainer1.SplitterWidth = 5; + splitContainer1.TabIndex = 158; + splitContainer1.SplitterMoved += splitContainer1_SplitterMoved; // // tableLayoutPanel1 // - this.tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.tableLayoutPanel1.ColumnCount = 2; - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - this.tableLayoutPanel1.Controls.Add(this.ci_tbID, 1, 0); - this.tableLayoutPanel1.Controls.Add(this.label31, 0, 2); - this.tableLayoutPanel1.Controls.Add(this.panel1, 1, 2); - this.tableLayoutPanel1.Controls.Add(this.label26, 0, 1); - this.tableLayoutPanel1.Controls.Add(this.label28, 0, 0); - this.tableLayoutPanel1.Controls.Add(this.ci_tbName, 1, 1); - this.tableLayoutPanel1.Location = new System.Drawing.Point(1, 1); - this.tableLayoutPanel1.Name = "tableLayoutPanel1"; - this.tableLayoutPanel1.RowCount = 3; - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.Size = new System.Drawing.Size(439, 210); - this.tableLayoutPanel1.TabIndex = 162; + tableLayoutPanel1.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + tableLayoutPanel1.ColumnCount = 2; + tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + tableLayoutPanel1.Controls.Add(ci_tbID, 1, 0); + tableLayoutPanel1.Controls.Add(label31, 0, 2); + tableLayoutPanel1.Controls.Add(panel1, 1, 2); + tableLayoutPanel1.Controls.Add(label26, 0, 1); + tableLayoutPanel1.Controls.Add(label28, 0, 0); + tableLayoutPanel1.Controls.Add(ci_tbName, 1, 1); + tableLayoutPanel1.Controls.Add(lbDataset, 0, 3); + tableLayoutPanel1.Controls.Add(lbDatasetValue, 1, 3); + tableLayoutPanel1.Location = new System.Drawing.Point(1, 1); + tableLayoutPanel1.Name = "tableLayoutPanel1"; + tableLayoutPanel1.RowCount = 4; + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + tableLayoutPanel1.Size = new System.Drawing.Size(439, 322); + tableLayoutPanel1.TabIndex = 162; + tableLayoutPanel1.Paint += tableLayoutPanel1_Paint; // // panel1 // - this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.panel1.Location = new System.Drawing.Point(117, 61); - this.panel1.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(302, 146); - this.panel1.TabIndex = 161; + panel1.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + panel1.Location = new System.Drawing.Point(117, 61); + panel1.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); + panel1.Name = "panel1"; + panel1.Size = new System.Drawing.Size(302, 146); + panel1.TabIndex = 161; + // + // lbDataset + // + lbDataset.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right; + lbDataset.AutoSize = true; + lbDataset.Location = new System.Drawing.Point(61, 210); + lbDataset.Name = "lbDataset"; + lbDataset.Size = new System.Drawing.Size(49, 15); + lbDataset.TabIndex = 162; + lbDataset.Text = "Dataset:"; + lbDataset.Click += label1_Click; + // + // lbDatasetValue + // + lbDatasetValue.AutoSize = true; + lbDatasetValue.Location = new System.Drawing.Point(116, 210); + lbDatasetValue.Name = "lbDatasetValue"; + lbDatasetValue.Size = new System.Drawing.Size(0, 15); + lbDatasetValue.TabIndex = 163; // // tableLayoutPanel2 // - this.tableLayoutPanel2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.tableLayoutPanel2.ColumnCount = 2; - this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - this.tableLayoutPanel2.Controls.Add(this.label27, 0, 0); - this.tableLayoutPanel2.Controls.Add(this.ci_tbComments, 1, 6); - this.tableLayoutPanel2.Controls.Add(this.label36, 0, 6); - this.tableLayoutPanel2.Controls.Add(this.ci_tbLimitations, 1, 5); - this.tableLayoutPanel2.Controls.Add(this.label35, 0, 5); - this.tableLayoutPanel2.Controls.Add(this.ci_tbStatisticalConsiderations, 1, 0); - this.tableLayoutPanel2.Controls.Add(this.label30, 0, 1); - this.tableLayoutPanel2.Controls.Add(this.ci_tbResearchRelevance, 1, 1); - this.tableLayoutPanel2.Controls.Add(this.label33, 0, 2); - this.tableLayoutPanel2.Controls.Add(this.ci_tbAggregationMethod, 1, 4); - this.tableLayoutPanel2.Controls.Add(this.ci_tbTopics, 1, 2); - this.tableLayoutPanel2.Controls.Add(this.label32, 0, 4); - this.tableLayoutPanel2.Controls.Add(this.ci_ddPeriodicity, 1, 3); - this.tableLayoutPanel2.Controls.Add(this.label34, 0, 3); - this.tableLayoutPanel2.Location = new System.Drawing.Point(1, 3); - this.tableLayoutPanel2.Name = "tableLayoutPanel2"; - this.tableLayoutPanel2.RowCount = 7; - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.Size = new System.Drawing.Size(419, 590); - this.tableLayoutPanel2.TabIndex = 157; + tableLayoutPanel2.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + tableLayoutPanel2.ColumnCount = 2; + tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + tableLayoutPanel2.Controls.Add(label27, 0, 0); + tableLayoutPanel2.Controls.Add(ci_tbComments, 1, 6); + tableLayoutPanel2.Controls.Add(label36, 0, 6); + tableLayoutPanel2.Controls.Add(ci_tbLimitations, 1, 5); + tableLayoutPanel2.Controls.Add(label35, 0, 5); + tableLayoutPanel2.Controls.Add(ci_tbStatisticalConsiderations, 1, 0); + tableLayoutPanel2.Controls.Add(label30, 0, 1); + tableLayoutPanel2.Controls.Add(ci_tbResearchRelevance, 1, 1); + tableLayoutPanel2.Controls.Add(label33, 0, 2); + tableLayoutPanel2.Controls.Add(ci_tbAggregationMethod, 1, 4); + tableLayoutPanel2.Controls.Add(ci_tbTopics, 1, 2); + tableLayoutPanel2.Controls.Add(label32, 0, 4); + tableLayoutPanel2.Controls.Add(ci_ddPeriodicity, 1, 3); + tableLayoutPanel2.Controls.Add(label34, 0, 3); + tableLayoutPanel2.Location = new System.Drawing.Point(1, 53); + tableLayoutPanel2.Name = "tableLayoutPanel2"; + tableLayoutPanel2.RowCount = 7; + tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); + tableLayoutPanel2.Size = new System.Drawing.Size(351, 640); + tableLayoutPanel2.TabIndex = 157; // // CatalogueItemUI // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.splitContainer1); - this.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); - this.Name = "CatalogueItemUI"; - this.Size = new System.Drawing.Size(445, 839); - this.splitContainer1.Panel1.ResumeLayout(false); - this.splitContainer1.Panel2.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); - this.splitContainer1.ResumeLayout(false); - this.tableLayoutPanel1.ResumeLayout(false); - this.tableLayoutPanel1.PerformLayout(); - this.tableLayoutPanel2.ResumeLayout(false); - this.tableLayoutPanel2.PerformLayout(); - this.ResumeLayout(false); - + AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + Controls.Add(splitContainer1); + Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + Name = "CatalogueItemUI"; + Size = new System.Drawing.Size(445, 839); + splitContainer1.Panel1.ResumeLayout(false); + splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)splitContainer1).EndInit(); + splitContainer1.ResumeLayout(false); + tableLayoutPanel1.ResumeLayout(false); + tableLayoutPanel1.PerformLayout(); + tableLayoutPanel2.ResumeLayout(false); + tableLayoutPanel2.PerformLayout(); + ResumeLayout(false); } #endregion @@ -426,5 +435,7 @@ private void InitializeComponent() private System.Windows.Forms.Panel panel1; private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2; + private System.Windows.Forms.Label lbDataset; + private System.Windows.Forms.Label lbDatasetValue; } } diff --git a/Rdmp.UI/MainFormUITabs/CatalogueItemUI.cs b/Rdmp.UI/MainFormUITabs/CatalogueItemUI.cs index 552d11dea9..ae361536ec 100644 --- a/Rdmp.UI/MainFormUITabs/CatalogueItemUI.cs +++ b/Rdmp.UI/MainFormUITabs/CatalogueItemUI.cs @@ -6,6 +6,7 @@ using System; using System.ComponentModel; +using System.Linq; using System.Windows.Forms; using Rdmp.Core; using Rdmp.Core.CommandExecution.AtomicCommands; @@ -40,6 +41,7 @@ public CatalogueItemUI() AssociatedCollection = RDMPCollection.Catalogue; ci_ddPeriodicity.DataSource = Enum.GetValues(typeof(Catalogue.CataloguePeriodicity)); + } private bool objectSaverButton1_BeforeSave(DatabaseEntity databaseEntity) @@ -60,6 +62,25 @@ private bool objectSaverButton1_BeforeSave(DatabaseEntity databaseEntity) public override void SetDatabaseObject(IActivateItems activator, CatalogueItem databaseObject) { _catalogueItem = databaseObject; + if (_catalogueItem != null) + { + var columnInfoDatasetValue = _catalogueItem.ColumnInfo.Dataset_ID; + if (columnInfoDatasetValue != null) + { + lbDatasetValue.Visible = true; + lbDataset.Visible = true; + var dataset = _catalogueItem.CatalogueRepository.GetAllObjects().Where(ds => ds.ID == columnInfoDatasetValue).First(); + if (dataset != null) + { + lbDatasetValue.Text = dataset.Name; + } + } + else + { + lbDatasetValue.Visible = false; + lbDataset.Visible = false; + } + } if (_scintillaDescription == null) { @@ -95,6 +116,21 @@ protected override void SetBindings(BinderWithErrorProviderFactory rules, Catalo } public override string GetTabName() => $"{base.GetTabName()} ({_catalogueItem.Catalogue.Name})"; + + private void tableLayoutPanel1_Paint(object sender, PaintEventArgs e) + { + + } + + private void label1_Click(object sender, EventArgs e) + { + + } + + private void splitContainer1_SplitterMoved(object sender, SplitterEventArgs e) + { + + } } [TypeDescriptionProvider(typeof(AbstractControlDescriptionProvider))] diff --git a/Rdmp.UI/MainFormUITabs/CatalogueItemUI.resx b/Rdmp.UI/MainFormUITabs/CatalogueItemUI.resx index f298a7be80..af32865ec1 100644 --- a/Rdmp.UI/MainFormUITabs/CatalogueItemUI.resx +++ b/Rdmp.UI/MainFormUITabs/CatalogueItemUI.resx @@ -1,4 +1,64 @@ - + + + diff --git a/Rdmp.UI/MainFormUITabs/CatalogueUI.Designer.cs b/Rdmp.UI/MainFormUITabs/CatalogueUI.Designer.cs index ea861d057c..c07ce662af 100644 --- a/Rdmp.UI/MainFormUITabs/CatalogueUI.Designer.cs +++ b/Rdmp.UI/MainFormUITabs/CatalogueUI.Designer.cs @@ -31,1125 +31,1138 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); - this.tbDatasetStartDate = new System.Windows.Forms.TextBox(); - this.label41 = new System.Windows.Forms.Label(); - this.label28 = new System.Windows.Forms.Label(); - this.c_tbSubjectNumbers = new System.Windows.Forms.TextBox(); - this.tbDataStandards = new System.Windows.Forms.TextBox(); - this.label26 = new System.Windows.Forms.Label(); - this.label27 = new System.Windows.Forms.Label(); - this.tbCountryOfOrigin = new System.Windows.Forms.TextBox(); - this.label23 = new System.Windows.Forms.Label(); - this.label22 = new System.Windows.Forms.Label(); - this.c_ddGranularity = new System.Windows.Forms.ComboBox(); - this.label21 = new System.Windows.Forms.Label(); - this.label64 = new System.Windows.Forms.Label(); - this.label20 = new System.Windows.Forms.Label(); - this.c_tbDetailPageURL = new System.Windows.Forms.TextBox(); - this.label19 = new System.Windows.Forms.Label(); - this.label18 = new System.Windows.Forms.Label(); - this.label16 = new System.Windows.Forms.Label(); - this.c_tbUpdateFrequency = new System.Windows.Forms.TextBox(); - this.label4 = new System.Windows.Forms.Label(); - this.label17 = new System.Windows.Forms.Label(); - this.c_tbSourceUrl = new System.Windows.Forms.TextBox(); - this.c_tbTopics = new System.Windows.Forms.TextBox(); - this.label14 = new System.Windows.Forms.Label(); - this.c_tbQueryToolUrl = new System.Windows.Forms.TextBox(); - this.c_tbBackgroundSummary = new System.Windows.Forms.TextBox(); - this.label6 = new System.Windows.Forms.Label(); - this.c_tbBulkDownloadUrl = new System.Windows.Forms.TextBox(); - this.c_tbTimeCoverage = new System.Windows.Forms.TextBox(); - this.label7 = new System.Windows.Forms.Label(); - this.label12 = new System.Windows.Forms.Label(); - this.c_tbBrowseUrl = new System.Windows.Forms.TextBox(); - this.c_tbUpdateSchedule = new System.Windows.Forms.TextBox(); - this.label13 = new System.Windows.Forms.Label(); - this.c_tbAPIAccessURL = new System.Windows.Forms.TextBox(); - this.label10 = new System.Windows.Forms.Label(); - this.c_ddPeriodicity = new System.Windows.Forms.ComboBox(); - this.c_tbAccessOptions = new System.Windows.Forms.TextBox(); - this.c_tbLastRevisionDate = new System.Windows.Forms.TextBox(); - this.label9 = new System.Windows.Forms.Label(); - this.c_ddType = new System.Windows.Forms.ComboBox(); - this.c_tbResourceOwner = new System.Windows.Forms.TextBox(); - this.c_tbAttributionCitation = new System.Windows.Forms.TextBox(); - this.label8 = new System.Windows.Forms.Label(); - this.c_tbNumberOfThese = new System.Windows.Forms.TextBox(); - this.splitContainer1 = new System.Windows.Forms.SplitContainer(); - this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); - this.flowLayoutPanel1 = new System.Windows.Forms.FlowLayoutPanel(); - this.cbDeprecated = new System.Windows.Forms.CheckBox(); - this.cbInternal = new System.Windows.Forms.CheckBox(); - this.cbColdStorage = new System.Windows.Forms.CheckBox(); - this.tbFolder = new System.Windows.Forms.TextBox(); - this.tbAcronym = new System.Windows.Forms.TextBox(); - this.tbName = new System.Windows.Forms.TextBox(); - this.c_tbID = new System.Windows.Forms.TextBox(); - this.label1 = new System.Windows.Forms.Label(); - this.label24 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.label25 = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.panel1 = new System.Windows.Forms.Panel(); - this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); - this.tbSourceOfDataCollection = new System.Windows.Forms.TextBox(); - this.tbEthicsApprover = new System.Windows.Forms.TextBox(); - this.label33 = new System.Windows.Forms.Label(); - this.ddExplicitConsent = new System.Windows.Forms.ComboBox(); - this.label32 = new System.Windows.Forms.Label(); - this.tbAdministrativeContactAddress = new System.Windows.Forms.TextBox(); - this.label31 = new System.Windows.Forms.Label(); - this.tbAdministrativeContactTelephone = new System.Windows.Forms.TextBox(); - this.label11 = new System.Windows.Forms.Label(); - this.tbAdministrativeContactEmail = new System.Windows.Forms.TextBox(); - this.label30 = new System.Windows.Forms.Label(); - this.tbAdministrativeContactName = new System.Windows.Forms.TextBox(); - this.label29 = new System.Windows.Forms.Label(); - this.label15 = new System.Windows.Forms.Label(); - this.label5 = new System.Windows.Forms.Label(); - this.c_tbGeographicalCoverage = new System.Windows.Forms.TextBox(); - this.ticketingControl1 = new Rdmp.UI.LocationsMenu.Ticketing.TicketingControlUI(); - this.errorProvider1 = new System.Windows.Forms.ErrorProvider(this.components); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); - this.splitContainer1.Panel1.SuspendLayout(); - this.splitContainer1.Panel2.SuspendLayout(); - this.splitContainer1.SuspendLayout(); - this.tableLayoutPanel1.SuspendLayout(); - this.flowLayoutPanel1.SuspendLayout(); - this.tableLayoutPanel2.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.errorProvider1)).BeginInit(); - this.SuspendLayout(); + components = new System.ComponentModel.Container(); + tbDatasetStartDate = new TextBox(); + label41 = new Label(); + label28 = new Label(); + c_tbSubjectNumbers = new TextBox(); + tbDataStandards = new TextBox(); + label26 = new Label(); + label27 = new Label(); + tbCountryOfOrigin = new TextBox(); + label23 = new Label(); + label22 = new Label(); + c_ddGranularity = new ComboBox(); + label21 = new Label(); + label64 = new Label(); + label20 = new Label(); + c_tbDetailPageURL = new TextBox(); + label19 = new Label(); + label18 = new Label(); + label16 = new Label(); + c_tbUpdateFrequency = new TextBox(); + label4 = new Label(); + label17 = new Label(); + c_tbSourceUrl = new TextBox(); + c_tbTopics = new TextBox(); + label14 = new Label(); + c_tbQueryToolUrl = new TextBox(); + c_tbBackgroundSummary = new TextBox(); + label6 = new Label(); + c_tbBulkDownloadUrl = new TextBox(); + c_tbTimeCoverage = new TextBox(); + label7 = new Label(); + label12 = new Label(); + c_tbBrowseUrl = new TextBox(); + c_tbUpdateSchedule = new TextBox(); + label13 = new Label(); + c_tbAPIAccessURL = new TextBox(); + label10 = new Label(); + c_ddPeriodicity = new ComboBox(); + c_tbAccessOptions = new TextBox(); + c_tbLastRevisionDate = new TextBox(); + label9 = new Label(); + c_ddType = new ComboBox(); + c_tbResourceOwner = new TextBox(); + c_tbAttributionCitation = new TextBox(); + label8 = new Label(); + c_tbNumberOfThese = new TextBox(); + splitContainer1 = new SplitContainer(); + tableLayoutPanel1 = new TableLayoutPanel(); + flowLayoutPanel1 = new FlowLayoutPanel(); + cbDeprecated = new CheckBox(); + cbInternal = new CheckBox(); + cbColdStorage = new CheckBox(); + tbFolder = new TextBox(); + tbAcronym = new TextBox(); + tbName = new TextBox(); + c_tbID = new TextBox(); + label1 = new Label(); + label24 = new Label(); + label2 = new Label(); + label25 = new Label(); + label3 = new Label(); + panel1 = new Panel(); + tableLayoutPanel2 = new TableLayoutPanel(); + tbSourceOfDataCollection = new TextBox(); + tbEthicsApprover = new TextBox(); + label33 = new Label(); + ddExplicitConsent = new ComboBox(); + label32 = new Label(); + tbAdministrativeContactAddress = new TextBox(); + label31 = new Label(); + tbAdministrativeContactTelephone = new TextBox(); + label11 = new Label(); + tbAdministrativeContactEmail = new TextBox(); + label30 = new Label(); + tbAdministrativeContactName = new TextBox(); + label29 = new Label(); + label15 = new Label(); + label5 = new Label(); + c_tbGeographicalCoverage = new TextBox(); + ticketingControl1 = new TicketingControlUI(); + errorProvider1 = new ErrorProvider(components); + lbDatasetslbl = new Label(); + lbDatasets = new Label(); + ((System.ComponentModel.ISupportInitialize)splitContainer1).BeginInit(); + splitContainer1.Panel1.SuspendLayout(); + splitContainer1.Panel2.SuspendLayout(); + splitContainer1.SuspendLayout(); + tableLayoutPanel1.SuspendLayout(); + flowLayoutPanel1.SuspendLayout(); + tableLayoutPanel2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)errorProvider1).BeginInit(); + SuspendLayout(); // // tbDatasetStartDate // - this.tbDatasetStartDate.Anchor = System.Windows.Forms.AnchorStyles.Left; - this.tbDatasetStartDate.Location = new System.Drawing.Point(135, 674); - this.tbDatasetStartDate.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.tbDatasetStartDate.Name = "tbDatasetStartDate"; - this.tbDatasetStartDate.Size = new System.Drawing.Size(250, 23); - this.tbDatasetStartDate.TabIndex = 14; - this.tbDatasetStartDate.TextChanged += new System.EventHandler(this.tbDatasetStartDate_TextChanged); + tbDatasetStartDate.Anchor = AnchorStyles.Left; + tbDatasetStartDate.Location = new System.Drawing.Point(135, 674); + tbDatasetStartDate.Margin = new Padding(4, 3, 20, 3); + tbDatasetStartDate.Name = "tbDatasetStartDate"; + tbDatasetStartDate.Size = new System.Drawing.Size(250, 23); + tbDatasetStartDate.TabIndex = 14; + tbDatasetStartDate.TextChanged += tbDatasetStartDate_TextChanged; // // label41 // - this.label41.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label41.Location = new System.Drawing.Point(7, 675); - this.label41.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label41.Name = "label41"; - this.label41.Size = new System.Drawing.Size(120, 20); - this.label41.TabIndex = 147; - this.label41.Text = "Dataset Start Date:"; - this.label41.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label41.Anchor = AnchorStyles.Right; + label41.Location = new System.Drawing.Point(7, 675); + label41.Margin = new Padding(4, 0, 4, 0); + label41.Name = "label41"; + label41.Size = new System.Drawing.Size(120, 20); + label41.TabIndex = 147; + label41.Text = "Dataset Start Date:"; + label41.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // label28 // - this.label28.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label28.ForeColor = System.Drawing.Color.Black; - this.label28.Location = new System.Drawing.Point(7, 616); - this.label28.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label28.Name = "label28"; - this.label28.Size = new System.Drawing.Size(120, 23); - this.label28.TabIndex = 134; - this.label28.Text = "Subject Numbers:"; - this.label28.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label28.Anchor = AnchorStyles.Right; + label28.ForeColor = System.Drawing.Color.Black; + label28.Location = new System.Drawing.Point(7, 616); + label28.Margin = new Padding(4, 0, 4, 0); + label28.Name = "label28"; + label28.Size = new System.Drawing.Size(120, 23); + label28.TabIndex = 134; + label28.Text = "Subject Numbers:"; + label28.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // c_tbSubjectNumbers // - this.c_tbSubjectNumbers.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.c_tbSubjectNumbers.BackColor = System.Drawing.SystemColors.Window; - this.c_tbSubjectNumbers.Location = new System.Drawing.Point(135, 616); - this.c_tbSubjectNumbers.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.c_tbSubjectNumbers.Name = "c_tbSubjectNumbers"; - this.c_tbSubjectNumbers.Size = new System.Drawing.Size(369, 23); - this.c_tbSubjectNumbers.TabIndex = 12; + c_tbSubjectNumbers.Anchor = AnchorStyles.Left | AnchorStyles.Right; + c_tbSubjectNumbers.BackColor = System.Drawing.SystemColors.Window; + c_tbSubjectNumbers.Location = new System.Drawing.Point(135, 616); + c_tbSubjectNumbers.Margin = new Padding(4, 3, 20, 3); + c_tbSubjectNumbers.Name = "c_tbSubjectNumbers"; + c_tbSubjectNumbers.Size = new System.Drawing.Size(369, 23); + c_tbSubjectNumbers.TabIndex = 12; // // tbDataStandards // - this.tbDataStandards.AcceptsReturn = true; - this.tbDataStandards.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.tbDataStandards.Location = new System.Drawing.Point(135, 1012); - this.tbDataStandards.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.tbDataStandards.Multiline = true; - this.tbDataStandards.Name = "tbDataStandards"; - this.tbDataStandards.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.tbDataStandards.Size = new System.Drawing.Size(369, 100); - this.tbDataStandards.TabIndex = 23; + tbDataStandards.AcceptsReturn = true; + tbDataStandards.Anchor = AnchorStyles.Left | AnchorStyles.Right; + tbDataStandards.Location = new System.Drawing.Point(135, 1012); + tbDataStandards.Margin = new Padding(4, 3, 20, 3); + tbDataStandards.Multiline = true; + tbDataStandards.Name = "tbDataStandards"; + tbDataStandards.ScrollBars = ScrollBars.Vertical; + tbDataStandards.Size = new System.Drawing.Size(369, 100); + tbDataStandards.TabIndex = 23; // // label26 // - this.label26.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label26.Location = new System.Drawing.Point(7, 1009); - this.label26.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label26.Name = "label26"; - this.label26.Size = new System.Drawing.Size(120, 20); - this.label26.TabIndex = 115; - this.label26.Text = "Data Standards:"; - this.label26.TextAlign = System.Drawing.ContentAlignment.TopRight; + label26.Anchor = AnchorStyles.Top | AnchorStyles.Right; + label26.Location = new System.Drawing.Point(7, 1009); + label26.Margin = new Padding(4, 0, 4, 0); + label26.Name = "label26"; + label26.Size = new System.Drawing.Size(120, 20); + label26.TabIndex = 115; + label26.Text = "Data Standards:"; + label26.TextAlign = System.Drawing.ContentAlignment.TopRight; // // label27 // - this.label27.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label27.AutoSize = true; - this.label27.Location = new System.Drawing.Point(24, 987); - this.label27.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label27.Name = "label27"; - this.label27.Size = new System.Drawing.Size(103, 15); - this.label27.TabIndex = 114; - this.label27.Text = "Country of Origin:"; - this.label27.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label27.Anchor = AnchorStyles.Right; + label27.AutoSize = true; + label27.Location = new System.Drawing.Point(24, 987); + label27.Margin = new Padding(4, 0, 4, 0); + label27.Name = "label27"; + label27.Size = new System.Drawing.Size(103, 15); + label27.TabIndex = 114; + label27.Text = "Country of Origin:"; + label27.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // tbCountryOfOrigin // - this.tbCountryOfOrigin.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.tbCountryOfOrigin.Location = new System.Drawing.Point(135, 983); - this.tbCountryOfOrigin.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.tbCountryOfOrigin.Name = "tbCountryOfOrigin"; - this.tbCountryOfOrigin.Size = new System.Drawing.Size(369, 23); - this.tbCountryOfOrigin.TabIndex = 22; + tbCountryOfOrigin.Anchor = AnchorStyles.Left | AnchorStyles.Right; + tbCountryOfOrigin.Location = new System.Drawing.Point(135, 983); + tbCountryOfOrigin.Margin = new Padding(4, 3, 20, 3); + tbCountryOfOrigin.Name = "tbCountryOfOrigin"; + tbCountryOfOrigin.Size = new System.Drawing.Size(369, 23); + tbCountryOfOrigin.TabIndex = 22; // // label23 // - this.label23.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label23.AutoSize = true; - this.label23.Location = new System.Drawing.Point(57, 958); - this.label23.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label23.Name = "label23"; - this.label23.Size = new System.Drawing.Size(70, 15); - this.label23.TabIndex = 104; - this.label23.Text = "Source URL:"; - this.label23.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label23.Anchor = AnchorStyles.Right; + label23.AutoSize = true; + label23.Location = new System.Drawing.Point(57, 958); + label23.Margin = new Padding(4, 0, 4, 0); + label23.Name = "label23"; + label23.Size = new System.Drawing.Size(70, 15); + label23.TabIndex = 104; + label23.Text = "Source URL:"; + label23.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // label22 // - this.label22.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label22.AutoSize = true; - this.label22.Location = new System.Drawing.Point(36, 929); - this.label22.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label22.Name = "label22"; - this.label22.Size = new System.Drawing.Size(91, 15); - this.label22.TabIndex = 103; - this.label22.Text = "Query Tool URL:"; - this.label22.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label22.Anchor = AnchorStyles.Right; + label22.AutoSize = true; + label22.Location = new System.Drawing.Point(36, 929); + label22.Margin = new Padding(4, 0, 4, 0); + label22.Name = "label22"; + label22.Size = new System.Drawing.Size(91, 15); + label22.TabIndex = 103; + label22.Text = "Query Tool URL:"; + label22.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // c_ddGranularity // - this.c_ddGranularity.Anchor = System.Windows.Forms.AnchorStyles.Left; - this.c_ddGranularity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.c_ddGranularity.FormattingEnabled = true; - this.c_ddGranularity.Location = new System.Drawing.Point(135, 167); - this.c_ddGranularity.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.c_ddGranularity.Name = "c_ddGranularity"; - this.c_ddGranularity.Size = new System.Drawing.Size(250, 23); - this.c_ddGranularity.TabIndex = 3; + c_ddGranularity.Anchor = AnchorStyles.Left; + c_ddGranularity.DropDownStyle = ComboBoxStyle.DropDownList; + c_ddGranularity.FormattingEnabled = true; + c_ddGranularity.Location = new System.Drawing.Point(135, 167); + c_ddGranularity.Margin = new Padding(4, 3, 20, 3); + c_ddGranularity.Name = "c_ddGranularity"; + c_ddGranularity.Size = new System.Drawing.Size(250, 23); + c_ddGranularity.TabIndex = 3; // // label21 // - this.label21.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label21.AutoSize = true; - this.label21.Location = new System.Drawing.Point(13, 900); - this.label21.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label21.Name = "label21"; - this.label21.Size = new System.Drawing.Size(114, 15); - this.label21.TabIndex = 102; - this.label21.Text = "Bulk Download URL:"; - this.label21.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label21.Anchor = AnchorStyles.Right; + label21.AutoSize = true; + label21.Location = new System.Drawing.Point(13, 900); + label21.Margin = new Padding(4, 0, 4, 0); + label21.Name = "label21"; + label21.Size = new System.Drawing.Size(114, 15); + label21.TabIndex = 102; + label21.Text = "Bulk Download URL:"; + label21.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // label64 // - this.label64.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label64.AutoSize = true; - this.label64.Location = new System.Drawing.Point(59, 171); - this.label64.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label64.Name = "label64"; - this.label64.Size = new System.Drawing.Size(68, 15); - this.label64.TabIndex = 108; - this.label64.Text = "Granularity:"; - this.label64.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label64.Anchor = AnchorStyles.Right; + label64.AutoSize = true; + label64.Location = new System.Drawing.Point(59, 171); + label64.Margin = new Padding(4, 0, 4, 0); + label64.Name = "label64"; + label64.Size = new System.Drawing.Size(68, 15); + label64.TabIndex = 108; + label64.Text = "Granularity:"; + label64.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // label20 // - this.label20.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label20.AutoSize = true; - this.label20.Location = new System.Drawing.Point(55, 871); - this.label20.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label20.Name = "label20"; - this.label20.Size = new System.Drawing.Size(72, 15); - this.label20.TabIndex = 101; - this.label20.Text = "Browse URL:"; - this.label20.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label20.Anchor = AnchorStyles.Right; + label20.AutoSize = true; + label20.Location = new System.Drawing.Point(55, 871); + label20.Margin = new Padding(4, 0, 4, 0); + label20.Name = "label20"; + label20.Size = new System.Drawing.Size(72, 15); + label20.TabIndex = 101; + label20.Text = "Browse URL:"; + label20.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // c_tbDetailPageURL // - this.c_tbDetailPageURL.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.c_tbDetailPageURL.Location = new System.Drawing.Point(135, 3); - this.c_tbDetailPageURL.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.c_tbDetailPageURL.Name = "c_tbDetailPageURL"; - this.c_tbDetailPageURL.Size = new System.Drawing.Size(369, 23); - this.c_tbDetailPageURL.TabIndex = 0; - this.c_tbDetailPageURL.TextChanged += new System.EventHandler(this.c_tbDetailPageURL_TextChanged); + c_tbDetailPageURL.Anchor = AnchorStyles.Left | AnchorStyles.Right; + c_tbDetailPageURL.Location = new System.Drawing.Point(135, 3); + c_tbDetailPageURL.Margin = new Padding(4, 3, 20, 3); + c_tbDetailPageURL.Name = "c_tbDetailPageURL"; + c_tbDetailPageURL.Size = new System.Drawing.Size(369, 23); + c_tbDetailPageURL.TabIndex = 0; + c_tbDetailPageURL.TextChanged += c_tbDetailPageURL_TextChanged; // // label19 // - this.label19.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label19.AutoSize = true; - this.label19.Location = new System.Drawing.Point(36, 842); - this.label19.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label19.Name = "label19"; - this.label19.Size = new System.Drawing.Size(91, 15); - this.label19.TabIndex = 100; - this.label19.Text = "API Access URL:"; - this.label19.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label19.Anchor = AnchorStyles.Right; + label19.AutoSize = true; + label19.Location = new System.Drawing.Point(36, 842); + label19.Margin = new Padding(4, 0, 4, 0); + label19.Name = "label19"; + label19.Size = new System.Drawing.Size(91, 15); + label19.TabIndex = 100; + label19.Text = "API Access URL:"; + label19.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // label18 // - this.label18.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label18.AutoSize = true; - this.label18.Location = new System.Drawing.Point(36, 813); - this.label18.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label18.Name = "label18"; - this.label18.Size = new System.Drawing.Size(91, 15); - this.label18.TabIndex = 99; - this.label18.Text = "Access Options:"; - this.label18.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label18.Anchor = AnchorStyles.Right; + label18.AutoSize = true; + label18.Location = new System.Drawing.Point(36, 813); + label18.Margin = new Padding(4, 0, 4, 0); + label18.Name = "label18"; + label18.Size = new System.Drawing.Size(91, 15); + label18.TabIndex = 99; + label18.Text = "Access Options:"; + label18.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // label16 // - this.label16.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label16.Location = new System.Drawing.Point(7, 646); - this.label16.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label16.Name = "label16"; - this.label16.Size = new System.Drawing.Size(120, 20); - this.label16.TabIndex = 98; - this.label16.Text = "Resource Owner:"; - this.label16.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label16.Anchor = AnchorStyles.Right; + label16.Location = new System.Drawing.Point(7, 646); + label16.Margin = new Padding(4, 0, 4, 0); + label16.Name = "label16"; + label16.Size = new System.Drawing.Size(120, 20); + label16.TabIndex = 98; + label16.Text = "Resource Owner:"; + label16.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // c_tbUpdateFrequency // - this.c_tbUpdateFrequency.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.c_tbUpdateFrequency.Location = new System.Drawing.Point(135, 500); - this.c_tbUpdateFrequency.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.c_tbUpdateFrequency.Name = "c_tbUpdateFrequency"; - this.c_tbUpdateFrequency.Size = new System.Drawing.Size(369, 23); - this.c_tbUpdateFrequency.TabIndex = 7; + c_tbUpdateFrequency.Anchor = AnchorStyles.Left | AnchorStyles.Right; + c_tbUpdateFrequency.Location = new System.Drawing.Point(135, 500); + c_tbUpdateFrequency.Margin = new Padding(4, 3, 20, 3); + c_tbUpdateFrequency.Name = "c_tbUpdateFrequency"; + c_tbUpdateFrequency.Size = new System.Drawing.Size(369, 23); + c_tbUpdateFrequency.TabIndex = 7; // // label4 // - this.label4.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(34, 7); - this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(93, 15); - this.label4.TabIndex = 65; - this.label4.Text = "Detail Page URL:"; - this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label4.Anchor = AnchorStyles.Right; + label4.AutoSize = true; + label4.Location = new System.Drawing.Point(34, 7); + label4.Margin = new Padding(4, 0, 4, 0); + label4.Name = "label4"; + label4.Size = new System.Drawing.Size(93, 15); + label4.TabIndex = 65; + label4.Text = "Detail Page URL:"; + label4.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // label17 // - this.label17.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label17.Location = new System.Drawing.Point(7, 700); - this.label17.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label17.Name = "label17"; - this.label17.Size = new System.Drawing.Size(120, 20); - this.label17.TabIndex = 97; - this.label17.Text = "Attribution Citation:"; - this.label17.TextAlign = System.Drawing.ContentAlignment.TopRight; + label17.Anchor = AnchorStyles.Top | AnchorStyles.Right; + label17.Location = new System.Drawing.Point(7, 700); + label17.Margin = new Padding(4, 0, 4, 0); + label17.Name = "label17"; + label17.Size = new System.Drawing.Size(120, 20); + label17.TabIndex = 97; + label17.Text = "Attribution Citation:"; + label17.TextAlign = System.Drawing.ContentAlignment.TopRight; // // c_tbSourceUrl // - this.c_tbSourceUrl.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.c_tbSourceUrl.Location = new System.Drawing.Point(135, 954); - this.c_tbSourceUrl.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.c_tbSourceUrl.Name = "c_tbSourceUrl"; - this.c_tbSourceUrl.Size = new System.Drawing.Size(369, 23); - this.c_tbSourceUrl.TabIndex = 21; - this.c_tbSourceUrl.TextChanged += new System.EventHandler(this.c_tbSourceUrl_TextChanged); + c_tbSourceUrl.Anchor = AnchorStyles.Left | AnchorStyles.Right; + c_tbSourceUrl.Location = new System.Drawing.Point(135, 954); + c_tbSourceUrl.Margin = new Padding(4, 3, 20, 3); + c_tbSourceUrl.Name = "c_tbSourceUrl"; + c_tbSourceUrl.Size = new System.Drawing.Size(369, 23); + c_tbSourceUrl.TabIndex = 21; + c_tbSourceUrl.TextChanged += c_tbSourceUrl_TextChanged; // // c_tbTopics // - this.c_tbTopics.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.c_tbTopics.Location = new System.Drawing.Point(135, 331); - this.c_tbTopics.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.c_tbTopics.Multiline = true; - this.c_tbTopics.Name = "c_tbTopics"; - this.c_tbTopics.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.c_tbTopics.Size = new System.Drawing.Size(369, 100); - this.c_tbTopics.TabIndex = 6; + c_tbTopics.Anchor = AnchorStyles.Left | AnchorStyles.Right; + c_tbTopics.Location = new System.Drawing.Point(135, 331); + c_tbTopics.Margin = new Padding(4, 3, 20, 3); + c_tbTopics.Multiline = true; + c_tbTopics.Name = "c_tbTopics"; + c_tbTopics.ScrollBars = ScrollBars.Vertical; + c_tbTopics.Size = new System.Drawing.Size(369, 100); + c_tbTopics.TabIndex = 6; // // label14 // - this.label14.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label14.Location = new System.Drawing.Point(7, 587); - this.label14.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label14.Name = "label14"; - this.label14.Size = new System.Drawing.Size(120, 23); - this.label14.TabIndex = 96; - this.label14.Text = "Last Revision Date:"; - this.label14.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label14.Anchor = AnchorStyles.Right; + label14.Location = new System.Drawing.Point(7, 587); + label14.Margin = new Padding(4, 0, 4, 0); + label14.Name = "label14"; + label14.Size = new System.Drawing.Size(120, 23); + label14.TabIndex = 96; + label14.Text = "Last Revision Date:"; + label14.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // c_tbQueryToolUrl // - this.c_tbQueryToolUrl.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.c_tbQueryToolUrl.Location = new System.Drawing.Point(135, 925); - this.c_tbQueryToolUrl.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.c_tbQueryToolUrl.Name = "c_tbQueryToolUrl"; - this.c_tbQueryToolUrl.Size = new System.Drawing.Size(369, 23); - this.c_tbQueryToolUrl.TabIndex = 20; - this.c_tbQueryToolUrl.TextChanged += new System.EventHandler(this.c_tbQueryToolUrl_TextChanged); + c_tbQueryToolUrl.Anchor = AnchorStyles.Left | AnchorStyles.Right; + c_tbQueryToolUrl.Location = new System.Drawing.Point(135, 925); + c_tbQueryToolUrl.Margin = new Padding(4, 3, 20, 3); + c_tbQueryToolUrl.Name = "c_tbQueryToolUrl"; + c_tbQueryToolUrl.Size = new System.Drawing.Size(369, 23); + c_tbQueryToolUrl.TabIndex = 20; + c_tbQueryToolUrl.TextChanged += c_tbQueryToolUrl_TextChanged; // // c_tbBackgroundSummary // - this.c_tbBackgroundSummary.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.c_tbBackgroundSummary.Location = new System.Drawing.Point(135, 196); - this.c_tbBackgroundSummary.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.c_tbBackgroundSummary.Multiline = true; - this.c_tbBackgroundSummary.Name = "c_tbBackgroundSummary"; - this.c_tbBackgroundSummary.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.c_tbBackgroundSummary.Size = new System.Drawing.Size(369, 100); - this.c_tbBackgroundSummary.TabIndex = 4; + c_tbBackgroundSummary.Anchor = AnchorStyles.Left | AnchorStyles.Right; + c_tbBackgroundSummary.Location = new System.Drawing.Point(135, 196); + c_tbBackgroundSummary.Margin = new Padding(4, 3, 20, 3); + c_tbBackgroundSummary.Multiline = true; + c_tbBackgroundSummary.Name = "c_tbBackgroundSummary"; + c_tbBackgroundSummary.ScrollBars = ScrollBars.Vertical; + c_tbBackgroundSummary.Size = new System.Drawing.Size(369, 100); + c_tbBackgroundSummary.TabIndex = 4; // // label6 // - this.label6.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(42, 36); - this.label6.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(85, 15); - this.label6.TabIndex = 69; - this.label6.Text = "Resource Type:"; - this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label6.Anchor = AnchorStyles.Right; + label6.AutoSize = true; + label6.Location = new System.Drawing.Point(42, 36); + label6.Margin = new Padding(4, 0, 4, 0); + label6.Name = "label6"; + label6.Size = new System.Drawing.Size(85, 15); + label6.TabIndex = 69; + label6.Text = "Resource Type:"; + label6.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // c_tbBulkDownloadUrl // - this.c_tbBulkDownloadUrl.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.c_tbBulkDownloadUrl.Location = new System.Drawing.Point(135, 896); - this.c_tbBulkDownloadUrl.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.c_tbBulkDownloadUrl.Name = "c_tbBulkDownloadUrl"; - this.c_tbBulkDownloadUrl.Size = new System.Drawing.Size(369, 23); - this.c_tbBulkDownloadUrl.TabIndex = 19; - this.c_tbBulkDownloadUrl.TextChanged += new System.EventHandler(this.c_tbBulkDownloadUrl_TextChanged); + c_tbBulkDownloadUrl.Anchor = AnchorStyles.Left | AnchorStyles.Right; + c_tbBulkDownloadUrl.Location = new System.Drawing.Point(135, 896); + c_tbBulkDownloadUrl.Margin = new Padding(4, 3, 20, 3); + c_tbBulkDownloadUrl.Name = "c_tbBulkDownloadUrl"; + c_tbBulkDownloadUrl.Size = new System.Drawing.Size(369, 23); + c_tbBulkDownloadUrl.TabIndex = 19; + c_tbBulkDownloadUrl.TextChanged += c_tbBulkDownloadUrl_TextChanged; // // c_tbTimeCoverage // - this.c_tbTimeCoverage.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.c_tbTimeCoverage.Location = new System.Drawing.Point(135, 558); - this.c_tbTimeCoverage.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.c_tbTimeCoverage.Name = "c_tbTimeCoverage"; - this.c_tbTimeCoverage.Size = new System.Drawing.Size(369, 23); - this.c_tbTimeCoverage.TabIndex = 10; + c_tbTimeCoverage.Anchor = AnchorStyles.Left | AnchorStyles.Right; + c_tbTimeCoverage.Location = new System.Drawing.Point(135, 558); + c_tbTimeCoverage.Margin = new Padding(4, 3, 20, 3); + c_tbTimeCoverage.Name = "c_tbTimeCoverage"; + c_tbTimeCoverage.Size = new System.Drawing.Size(369, 23); + c_tbTimeCoverage.TabIndex = 10; // // label7 // - this.label7.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label7.AutoSize = true; - this.label7.Location = new System.Drawing.Point(61, 306); - this.label7.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(66, 15); - this.label7.TabIndex = 72; - this.label7.Text = "Periodicity:"; - this.label7.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label7.Anchor = AnchorStyles.Right; + label7.AutoSize = true; + label7.Location = new System.Drawing.Point(61, 306); + label7.Margin = new Padding(4, 0, 4, 0); + label7.Name = "label7"; + label7.Size = new System.Drawing.Size(66, 15); + label7.TabIndex = 72; + label7.Text = "Periodicity:"; + label7.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // label12 // - this.label12.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label12.Location = new System.Drawing.Point(7, 529); - this.label12.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label12.Name = "label12"; - this.label12.Size = new System.Drawing.Size(120, 23); - this.label12.TabIndex = 93; - this.label12.Text = "Update Schedule:"; - this.label12.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label12.Anchor = AnchorStyles.Right; + label12.Location = new System.Drawing.Point(7, 529); + label12.Margin = new Padding(4, 0, 4, 0); + label12.Name = "label12"; + label12.Size = new System.Drawing.Size(120, 23); + label12.TabIndex = 93; + label12.Text = "Update Schedule:"; + label12.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // c_tbBrowseUrl // - this.c_tbBrowseUrl.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.c_tbBrowseUrl.Location = new System.Drawing.Point(135, 867); - this.c_tbBrowseUrl.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.c_tbBrowseUrl.Name = "c_tbBrowseUrl"; - this.c_tbBrowseUrl.Size = new System.Drawing.Size(369, 23); - this.c_tbBrowseUrl.TabIndex = 18; - this.c_tbBrowseUrl.TextChanged += new System.EventHandler(this.c_tbBrowseUrl_TextChanged); + c_tbBrowseUrl.Anchor = AnchorStyles.Left | AnchorStyles.Right; + c_tbBrowseUrl.Location = new System.Drawing.Point(135, 867); + c_tbBrowseUrl.Margin = new Padding(4, 3, 20, 3); + c_tbBrowseUrl.Name = "c_tbBrowseUrl"; + c_tbBrowseUrl.Size = new System.Drawing.Size(369, 23); + c_tbBrowseUrl.TabIndex = 18; + c_tbBrowseUrl.TextChanged += c_tbBrowseUrl_TextChanged; // // c_tbUpdateSchedule // - this.c_tbUpdateSchedule.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.c_tbUpdateSchedule.Location = new System.Drawing.Point(135, 529); - this.c_tbUpdateSchedule.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.c_tbUpdateSchedule.Name = "c_tbUpdateSchedule"; - this.c_tbUpdateSchedule.Size = new System.Drawing.Size(369, 23); - this.c_tbUpdateSchedule.TabIndex = 9; + c_tbUpdateSchedule.Anchor = AnchorStyles.Left | AnchorStyles.Right; + c_tbUpdateSchedule.Location = new System.Drawing.Point(135, 529); + c_tbUpdateSchedule.Margin = new Padding(4, 3, 20, 3); + c_tbUpdateSchedule.Name = "c_tbUpdateSchedule"; + c_tbUpdateSchedule.Size = new System.Drawing.Size(369, 23); + c_tbUpdateSchedule.TabIndex = 9; // // label13 // - this.label13.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label13.Location = new System.Drawing.Point(7, 558); - this.label13.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label13.Name = "label13"; - this.label13.Size = new System.Drawing.Size(120, 23); - this.label13.TabIndex = 89; - this.label13.Text = "Time Coverage:"; - this.label13.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label13.Anchor = AnchorStyles.Right; + label13.Location = new System.Drawing.Point(7, 558); + label13.Margin = new Padding(4, 0, 4, 0); + label13.Name = "label13"; + label13.Size = new System.Drawing.Size(120, 23); + label13.TabIndex = 89; + label13.Text = "Time Coverage:"; + label13.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // c_tbAPIAccessURL // - this.c_tbAPIAccessURL.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.c_tbAPIAccessURL.Location = new System.Drawing.Point(135, 838); - this.c_tbAPIAccessURL.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.c_tbAPIAccessURL.Name = "c_tbAPIAccessURL"; - this.c_tbAPIAccessURL.Size = new System.Drawing.Size(369, 23); - this.c_tbAPIAccessURL.TabIndex = 17; - this.c_tbAPIAccessURL.TextChanged += new System.EventHandler(this.c_tbAPIAccessURL_TextChanged); + c_tbAPIAccessURL.Anchor = AnchorStyles.Left | AnchorStyles.Right; + c_tbAPIAccessURL.Location = new System.Drawing.Point(135, 838); + c_tbAPIAccessURL.Margin = new Padding(4, 3, 20, 3); + c_tbAPIAccessURL.Name = "c_tbAPIAccessURL"; + c_tbAPIAccessURL.Size = new System.Drawing.Size(369, 23); + c_tbAPIAccessURL.TabIndex = 17; + c_tbAPIAccessURL.TextChanged += c_tbAPIAccessURL_TextChanged; // // label10 // - this.label10.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label10.Location = new System.Drawing.Point(7, 500); - this.label10.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label10.Name = "label10"; - this.label10.Size = new System.Drawing.Size(120, 23); - this.label10.TabIndex = 77; - this.label10.Text = "Update Frequency:"; - this.label10.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label10.Anchor = AnchorStyles.Right; + label10.Location = new System.Drawing.Point(7, 500); + label10.Margin = new Padding(4, 0, 4, 0); + label10.Name = "label10"; + label10.Size = new System.Drawing.Size(120, 23); + label10.TabIndex = 77; + label10.Text = "Update Frequency:"; + label10.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // c_ddPeriodicity // - this.c_ddPeriodicity.Anchor = System.Windows.Forms.AnchorStyles.Left; - this.c_ddPeriodicity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.c_ddPeriodicity.FormattingEnabled = true; - this.c_ddPeriodicity.Location = new System.Drawing.Point(135, 302); - this.c_ddPeriodicity.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.c_ddPeriodicity.Name = "c_ddPeriodicity"; - this.c_ddPeriodicity.Size = new System.Drawing.Size(250, 23); - this.c_ddPeriodicity.TabIndex = 5; + c_ddPeriodicity.Anchor = AnchorStyles.Left; + c_ddPeriodicity.DropDownStyle = ComboBoxStyle.DropDownList; + c_ddPeriodicity.FormattingEnabled = true; + c_ddPeriodicity.Location = new System.Drawing.Point(135, 302); + c_ddPeriodicity.Margin = new Padding(4, 3, 20, 3); + c_ddPeriodicity.Name = "c_ddPeriodicity"; + c_ddPeriodicity.Size = new System.Drawing.Size(250, 23); + c_ddPeriodicity.TabIndex = 5; // // c_tbAccessOptions // - this.c_tbAccessOptions.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.c_tbAccessOptions.Location = new System.Drawing.Point(135, 809); - this.c_tbAccessOptions.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.c_tbAccessOptions.Name = "c_tbAccessOptions"; - this.c_tbAccessOptions.Size = new System.Drawing.Size(369, 23); - this.c_tbAccessOptions.TabIndex = 16; + c_tbAccessOptions.Anchor = AnchorStyles.Left | AnchorStyles.Right; + c_tbAccessOptions.Location = new System.Drawing.Point(135, 809); + c_tbAccessOptions.Margin = new Padding(4, 3, 20, 3); + c_tbAccessOptions.Name = "c_tbAccessOptions"; + c_tbAccessOptions.Size = new System.Drawing.Size(369, 23); + c_tbAccessOptions.TabIndex = 16; // // c_tbLastRevisionDate // - this.c_tbLastRevisionDate.Anchor = System.Windows.Forms.AnchorStyles.Left; - this.c_tbLastRevisionDate.Location = new System.Drawing.Point(135, 587); - this.c_tbLastRevisionDate.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.c_tbLastRevisionDate.Name = "c_tbLastRevisionDate"; - this.c_tbLastRevisionDate.Size = new System.Drawing.Size(250, 23); - this.c_tbLastRevisionDate.TabIndex = 11; - this.c_tbLastRevisionDate.TextChanged += new System.EventHandler(this.c_tbLastRevisionDate_TextChanged); + c_tbLastRevisionDate.Anchor = AnchorStyles.Left; + c_tbLastRevisionDate.Location = new System.Drawing.Point(135, 587); + c_tbLastRevisionDate.Margin = new Padding(4, 3, 20, 3); + c_tbLastRevisionDate.Name = "c_tbLastRevisionDate"; + c_tbLastRevisionDate.Size = new System.Drawing.Size(250, 23); + c_tbLastRevisionDate.TabIndex = 11; + c_tbLastRevisionDate.TextChanged += c_tbLastRevisionDate_TextChanged; // // label9 // - this.label9.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label9.AutoSize = true; - this.label9.ForeColor = System.Drawing.Color.Black; - this.label9.Location = new System.Drawing.Point(53, 193); - this.label9.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label9.Name = "label9"; - this.label9.Size = new System.Drawing.Size(74, 15); - this.label9.TabIndex = 79; - this.label9.Text = "Background:"; - this.label9.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label9.Anchor = AnchorStyles.Top | AnchorStyles.Right; + label9.AutoSize = true; + label9.ForeColor = System.Drawing.Color.Black; + label9.Location = new System.Drawing.Point(53, 193); + label9.Margin = new Padding(4, 0, 4, 0); + label9.Name = "label9"; + label9.Size = new System.Drawing.Size(74, 15); + label9.TabIndex = 79; + label9.Text = "Background:"; + label9.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // c_ddType // - this.c_ddType.Anchor = System.Windows.Forms.AnchorStyles.Left; - this.c_ddType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.c_ddType.FormattingEnabled = true; - this.c_ddType.Location = new System.Drawing.Point(135, 32); - this.c_ddType.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.c_ddType.Name = "c_ddType"; - this.c_ddType.Size = new System.Drawing.Size(250, 23); - this.c_ddType.TabIndex = 1; + c_ddType.Anchor = AnchorStyles.Left; + c_ddType.DropDownStyle = ComboBoxStyle.DropDownList; + c_ddType.FormattingEnabled = true; + c_ddType.Location = new System.Drawing.Point(135, 32); + c_ddType.Margin = new Padding(4, 3, 20, 3); + c_ddType.Name = "c_ddType"; + c_ddType.Size = new System.Drawing.Size(250, 23); + c_ddType.TabIndex = 1; // // c_tbResourceOwner // - this.c_tbResourceOwner.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.c_tbResourceOwner.Location = new System.Drawing.Point(135, 645); - this.c_tbResourceOwner.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.c_tbResourceOwner.Name = "c_tbResourceOwner"; - this.c_tbResourceOwner.Size = new System.Drawing.Size(369, 23); - this.c_tbResourceOwner.TabIndex = 13; + c_tbResourceOwner.Anchor = AnchorStyles.Left | AnchorStyles.Right; + c_tbResourceOwner.Location = new System.Drawing.Point(135, 645); + c_tbResourceOwner.Margin = new Padding(4, 3, 20, 3); + c_tbResourceOwner.Name = "c_tbResourceOwner"; + c_tbResourceOwner.Size = new System.Drawing.Size(369, 23); + c_tbResourceOwner.TabIndex = 13; // // c_tbAttributionCitation // - this.c_tbAttributionCitation.AcceptsReturn = true; - this.c_tbAttributionCitation.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.c_tbAttributionCitation.Location = new System.Drawing.Point(135, 703); - this.c_tbAttributionCitation.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.c_tbAttributionCitation.Multiline = true; - this.c_tbAttributionCitation.Name = "c_tbAttributionCitation"; - this.c_tbAttributionCitation.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.c_tbAttributionCitation.Size = new System.Drawing.Size(369, 100); - this.c_tbAttributionCitation.TabIndex = 15; + c_tbAttributionCitation.AcceptsReturn = true; + c_tbAttributionCitation.Anchor = AnchorStyles.Left | AnchorStyles.Right; + c_tbAttributionCitation.Location = new System.Drawing.Point(135, 703); + c_tbAttributionCitation.Margin = new Padding(4, 3, 20, 3); + c_tbAttributionCitation.Multiline = true; + c_tbAttributionCitation.Name = "c_tbAttributionCitation"; + c_tbAttributionCitation.ScrollBars = ScrollBars.Vertical; + c_tbAttributionCitation.Size = new System.Drawing.Size(369, 100); + c_tbAttributionCitation.TabIndex = 15; // // label8 // - this.label8.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label8.AutoSize = true; - this.label8.Location = new System.Drawing.Point(28, 328); - this.label8.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label8.Name = "label8"; - this.label8.Size = new System.Drawing.Size(99, 15); - this.label8.TabIndex = 83; - this.label8.Text = "Search Keywords:"; - this.label8.TextAlign = System.Drawing.ContentAlignment.TopRight; + label8.Anchor = AnchorStyles.Top | AnchorStyles.Right; + label8.AutoSize = true; + label8.Location = new System.Drawing.Point(28, 328); + label8.Margin = new Padding(4, 0, 4, 0); + label8.Name = "label8"; + label8.Size = new System.Drawing.Size(99, 15); + label8.TabIndex = 83; + label8.Text = "Search Keywords:"; + label8.TextAlign = System.Drawing.ContentAlignment.TopRight; // // c_tbNumberOfThese // - this.c_tbNumberOfThese.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.c_tbNumberOfThese.Location = new System.Drawing.Point(601, 537); - this.c_tbNumberOfThese.Name = "c_tbNumberOfThese"; - this.c_tbNumberOfThese.Size = new System.Drawing.Size(28, 23); - this.c_tbNumberOfThese.TabIndex = 68; - this.c_tbNumberOfThese.Visible = false; + c_tbNumberOfThese.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + c_tbNumberOfThese.Location = new System.Drawing.Point(601, 537); + c_tbNumberOfThese.Name = "c_tbNumberOfThese"; + c_tbNumberOfThese.Size = new System.Drawing.Size(28, 23); + c_tbNumberOfThese.TabIndex = 68; + c_tbNumberOfThese.Visible = false; // // splitContainer1 // - this.splitContainer1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; - this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; - this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; - this.splitContainer1.Location = new System.Drawing.Point(0, 0); - this.splitContainer1.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); - this.splitContainer1.Name = "splitContainer1"; - this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + splitContainer1.BorderStyle = BorderStyle.Fixed3D; + splitContainer1.Dock = DockStyle.Fill; + splitContainer1.FixedPanel = FixedPanel.Panel1; + splitContainer1.Location = new System.Drawing.Point(0, 0); + splitContainer1.Margin = new Padding(4, 3, 4, 3); + splitContainer1.Name = "splitContainer1"; + splitContainer1.Orientation = Orientation.Horizontal; // // splitContainer1.Panel1 // - this.splitContainer1.Panel1.Controls.Add(this.tableLayoutPanel1); - this.splitContainer1.Panel1MinSize = 200; + splitContainer1.Panel1.Controls.Add(tableLayoutPanel1); + splitContainer1.Panel1MinSize = 200; // // splitContainer1.Panel2 // - this.splitContainer1.Panel2.AutoScroll = true; - this.splitContainer1.Panel2.Controls.Add(this.tableLayoutPanel2); - this.splitContainer1.Panel2MinSize = 200; - this.splitContainer1.Size = new System.Drawing.Size(551, 1085); - this.splitContainer1.SplitterDistance = 288; - this.splitContainer1.SplitterWidth = 5; - this.splitContainer1.TabIndex = 114; + splitContainer1.Panel2.AutoScroll = true; + splitContainer1.Panel2.Controls.Add(tableLayoutPanel2); + splitContainer1.Panel2MinSize = 200; + splitContainer1.Size = new System.Drawing.Size(551, 1085); + splitContainer1.SplitterDistance = 288; + splitContainer1.SplitterWidth = 5; + splitContainer1.TabIndex = 114; // // tableLayoutPanel1 // - this.tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.tableLayoutPanel1.ColumnCount = 2; - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - this.tableLayoutPanel1.Controls.Add(this.flowLayoutPanel1, 1, 6); - this.tableLayoutPanel1.Controls.Add(this.tbFolder, 1, 3); - this.tableLayoutPanel1.Controls.Add(this.tbAcronym, 1, 2); - this.tableLayoutPanel1.Controls.Add(this.tbName, 1, 1); - this.tableLayoutPanel1.Controls.Add(this.c_tbID, 1, 0); - this.tableLayoutPanel1.Controls.Add(this.label1, 0, 0); - this.tableLayoutPanel1.Controls.Add(this.label24, 0, 3); - this.tableLayoutPanel1.Controls.Add(this.label2, 0, 2); - this.tableLayoutPanel1.Controls.Add(this.label25, 0, 1); - this.tableLayoutPanel1.Controls.Add(this.label3, 0, 7); - this.tableLayoutPanel1.Controls.Add(this.panel1, 1, 7); - this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 3); - this.tableLayoutPanel1.Name = "tableLayoutPanel1"; - this.tableLayoutPanel1.Padding = new System.Windows.Forms.Padding(0, 0, 5, 0); - this.tableLayoutPanel1.RowCount = 8; - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); - this.tableLayoutPanel1.Size = new System.Drawing.Size(524, 278); - this.tableLayoutPanel1.TabIndex = 160; + tableLayoutPanel1.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + tableLayoutPanel1.ColumnCount = 2; + tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle()); + tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle()); + tableLayoutPanel1.Controls.Add(flowLayoutPanel1, 1, 6); + tableLayoutPanel1.Controls.Add(tbFolder, 1, 3); + tableLayoutPanel1.Controls.Add(tbAcronym, 1, 2); + tableLayoutPanel1.Controls.Add(tbName, 1, 1); + tableLayoutPanel1.Controls.Add(c_tbID, 1, 0); + tableLayoutPanel1.Controls.Add(label1, 0, 0); + tableLayoutPanel1.Controls.Add(label24, 0, 3); + tableLayoutPanel1.Controls.Add(label2, 0, 2); + tableLayoutPanel1.Controls.Add(label25, 0, 1); + tableLayoutPanel1.Controls.Add(label3, 0, 7); + tableLayoutPanel1.Controls.Add(panel1, 1, 7); + tableLayoutPanel1.Controls.Add(lbDatasetslbl, 0, 8); + tableLayoutPanel1.Controls.Add(lbDatasets, 1, 8); + tableLayoutPanel1.Location = new System.Drawing.Point(3, 3); + tableLayoutPanel1.Name = "tableLayoutPanel1"; + tableLayoutPanel1.Padding = new Padding(0, 0, 5, 0); + tableLayoutPanel1.RowCount = 9; + tableLayoutPanel1.RowStyles.Add(new RowStyle()); + tableLayoutPanel1.RowStyles.Add(new RowStyle()); + tableLayoutPanel1.RowStyles.Add(new RowStyle()); + tableLayoutPanel1.RowStyles.Add(new RowStyle()); + tableLayoutPanel1.RowStyles.Add(new RowStyle()); + tableLayoutPanel1.RowStyles.Add(new RowStyle()); + tableLayoutPanel1.RowStyles.Add(new RowStyle()); + tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Absolute, 112F)); + tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Absolute, 13F)); + tableLayoutPanel1.Size = new System.Drawing.Size(524, 278); + tableLayoutPanel1.TabIndex = 160; // // flowLayoutPanel1 // - this.flowLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.flowLayoutPanel1.Controls.Add(this.cbDeprecated); - this.flowLayoutPanel1.Controls.Add(this.cbInternal); - this.flowLayoutPanel1.Controls.Add(this.cbColdStorage); - this.flowLayoutPanel1.Location = new System.Drawing.Point(132, 119); - this.flowLayoutPanel1.Margin = new System.Windows.Forms.Padding(3, 3, 20, 3); - this.flowLayoutPanel1.Name = "flowLayoutPanel1"; - this.flowLayoutPanel1.Size = new System.Drawing.Size(367, 23); - this.flowLayoutPanel1.TabIndex = 159; + flowLayoutPanel1.Anchor = AnchorStyles.Left | AnchorStyles.Right; + flowLayoutPanel1.Controls.Add(cbDeprecated); + flowLayoutPanel1.Controls.Add(cbInternal); + flowLayoutPanel1.Controls.Add(cbColdStorage); + flowLayoutPanel1.Location = new System.Drawing.Point(132, 119); + flowLayoutPanel1.Margin = new Padding(3, 3, 20, 3); + flowLayoutPanel1.Name = "flowLayoutPanel1"; + flowLayoutPanel1.Size = new System.Drawing.Size(367, 23); + flowLayoutPanel1.TabIndex = 159; // // cbDeprecated // - this.cbDeprecated.AutoSize = true; - this.cbDeprecated.Location = new System.Drawing.Point(4, 3); - this.cbDeprecated.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); - this.cbDeprecated.Name = "cbDeprecated"; - this.cbDeprecated.Size = new System.Drawing.Size(86, 19); - this.cbDeprecated.TabIndex = 5; - this.cbDeprecated.Text = "Deprecated"; - this.cbDeprecated.UseVisualStyleBackColor = true; + cbDeprecated.AutoSize = true; + cbDeprecated.Location = new System.Drawing.Point(4, 3); + cbDeprecated.Margin = new Padding(4, 3, 4, 3); + cbDeprecated.Name = "cbDeprecated"; + cbDeprecated.Size = new System.Drawing.Size(86, 19); + cbDeprecated.TabIndex = 5; + cbDeprecated.Text = "Deprecated"; + cbDeprecated.UseVisualStyleBackColor = true; // // cbInternal // - this.cbInternal.AutoSize = true; - this.cbInternal.Location = new System.Drawing.Point(98, 3); - this.cbInternal.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); - this.cbInternal.Name = "cbInternal"; - this.cbInternal.Size = new System.Drawing.Size(66, 19); - this.cbInternal.TabIndex = 6; - this.cbInternal.Text = "Internal"; - this.cbInternal.UseVisualStyleBackColor = true; + cbInternal.AutoSize = true; + cbInternal.Location = new System.Drawing.Point(98, 3); + cbInternal.Margin = new Padding(4, 3, 4, 3); + cbInternal.Name = "cbInternal"; + cbInternal.Size = new System.Drawing.Size(66, 19); + cbInternal.TabIndex = 6; + cbInternal.Text = "Internal"; + cbInternal.UseVisualStyleBackColor = true; // // cbColdStorage // - this.cbColdStorage.AutoSize = true; - this.cbColdStorage.Location = new System.Drawing.Point(172, 3); - this.cbColdStorage.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); - this.cbColdStorage.Name = "cbColdStorage"; - this.cbColdStorage.Size = new System.Drawing.Size(91, 19); - this.cbColdStorage.TabIndex = 7; - this.cbColdStorage.Text = "ColdStorage"; - this.cbColdStorage.UseVisualStyleBackColor = true; + cbColdStorage.AutoSize = true; + cbColdStorage.Location = new System.Drawing.Point(172, 3); + cbColdStorage.Margin = new Padding(4, 3, 4, 3); + cbColdStorage.Name = "cbColdStorage"; + cbColdStorage.Size = new System.Drawing.Size(91, 19); + cbColdStorage.TabIndex = 7; + cbColdStorage.Text = "ColdStorage"; + cbColdStorage.UseVisualStyleBackColor = true; // // tbFolder // - this.tbFolder.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.tbFolder.Location = new System.Drawing.Point(133, 90); - this.tbFolder.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.tbFolder.Name = "tbFolder"; - this.tbFolder.Size = new System.Drawing.Size(366, 23); - this.tbFolder.TabIndex = 3; - this.tbFolder.TextChanged += new System.EventHandler(this.tbFolder_TextChanged); + tbFolder.Anchor = AnchorStyles.Left | AnchorStyles.Right; + tbFolder.Location = new System.Drawing.Point(133, 90); + tbFolder.Margin = new Padding(4, 3, 20, 3); + tbFolder.Name = "tbFolder"; + tbFolder.Size = new System.Drawing.Size(366, 23); + tbFolder.TabIndex = 3; + tbFolder.TextChanged += tbFolder_TextChanged; // // tbAcronym // - this.tbAcronym.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.tbAcronym.Location = new System.Drawing.Point(133, 61); - this.tbAcronym.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.tbAcronym.Name = "tbAcronym"; - this.tbAcronym.Size = new System.Drawing.Size(366, 23); - this.tbAcronym.TabIndex = 2; + tbAcronym.Anchor = AnchorStyles.Left | AnchorStyles.Right; + tbAcronym.Location = new System.Drawing.Point(133, 61); + tbAcronym.Margin = new Padding(4, 3, 20, 3); + tbAcronym.Name = "tbAcronym"; + tbAcronym.Size = new System.Drawing.Size(366, 23); + tbAcronym.TabIndex = 2; // // tbName // - this.tbName.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.tbName.Location = new System.Drawing.Point(133, 32); - this.tbName.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.tbName.Name = "tbName"; - this.tbName.Size = new System.Drawing.Size(366, 23); - this.tbName.TabIndex = 1; - this.tbName.TextChanged += new System.EventHandler(this.tbName_TextChanged); + tbName.Anchor = AnchorStyles.Left | AnchorStyles.Right; + tbName.Location = new System.Drawing.Point(133, 32); + tbName.Margin = new Padding(4, 3, 20, 3); + tbName.Name = "tbName"; + tbName.Size = new System.Drawing.Size(366, 23); + tbName.TabIndex = 1; + tbName.TextChanged += tbName_TextChanged; // // c_tbID // - this.c_tbID.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.c_tbID.Location = new System.Drawing.Point(133, 3); - this.c_tbID.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.c_tbID.Name = "c_tbID"; - this.c_tbID.ReadOnly = true; - this.c_tbID.Size = new System.Drawing.Size(366, 23); - this.c_tbID.TabIndex = 0; + c_tbID.Anchor = AnchorStyles.Left | AnchorStyles.Right; + c_tbID.Location = new System.Drawing.Point(133, 3); + c_tbID.Margin = new Padding(4, 3, 20, 3); + c_tbID.Name = "c_tbID"; + c_tbID.ReadOnly = true; + c_tbID.Size = new System.Drawing.Size(366, 23); + c_tbID.TabIndex = 0; // // label1 // - this.label1.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label1.AutoEllipsis = true; - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(47, 7); - this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(78, 15); - this.label1.TabIndex = 56; - this.label1.Text = "Catalogue ID:"; - this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label1.Anchor = AnchorStyles.Right; + label1.AutoEllipsis = true; + label1.AutoSize = true; + label1.Location = new System.Drawing.Point(47, 7); + label1.Margin = new Padding(4, 0, 4, 0); + label1.Name = "label1"; + label1.Size = new System.Drawing.Size(78, 15); + label1.TabIndex = 56; + label1.Text = "Catalogue ID:"; + label1.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // label24 // - this.label24.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label24.AutoSize = true; - this.label24.Location = new System.Drawing.Point(82, 94); - this.label24.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label24.Name = "label24"; - this.label24.Size = new System.Drawing.Size(43, 15); - this.label24.TabIndex = 152; - this.label24.Text = "Folder:"; - this.label24.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label24.Anchor = AnchorStyles.Right; + label24.AutoSize = true; + label24.Location = new System.Drawing.Point(82, 94); + label24.Margin = new Padding(4, 0, 4, 0); + label24.Name = "label24"; + label24.Size = new System.Drawing.Size(43, 15); + label24.TabIndex = 152; + label24.Text = "Folder:"; + label24.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // label2 // - this.label2.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(15, 65); - this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(110, 15); - this.label2.TabIndex = 58; - this.label2.Text = "Resource Acronym:"; - this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label2.Anchor = AnchorStyles.Right; + label2.AutoSize = true; + label2.Location = new System.Drawing.Point(15, 65); + label2.Margin = new Padding(4, 0, 4, 0); + label2.Name = "label2"; + label2.Size = new System.Drawing.Size(110, 15); + label2.TabIndex = 58; + label2.Text = "Resource Acronym:"; + label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // label25 // - this.label25.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label25.AutoSize = true; - this.label25.Location = new System.Drawing.Point(5, 36); - this.label25.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label25.Name = "label25"; - this.label25.Size = new System.Drawing.Size(120, 15); - this.label25.TabIndex = 107; - this.label25.Text = "Resource Name/Title:"; - this.label25.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label25.Anchor = AnchorStyles.Right; + label25.AutoSize = true; + label25.Location = new System.Drawing.Point(5, 36); + label25.Margin = new Padding(4, 0, 4, 0); + label25.Name = "label25"; + label25.Size = new System.Drawing.Size(120, 15); + label25.TabIndex = 107; + label25.Text = "Resource Name/Title:"; + label25.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // label3 // - this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(4, 145); - this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(121, 15); - this.label3.TabIndex = 61; - this.label3.Text = "Resource Description:"; - this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label3.Anchor = AnchorStyles.Top | AnchorStyles.Right; + label3.AutoSize = true; + label3.Location = new System.Drawing.Point(4, 145); + label3.Margin = new Padding(4, 0, 4, 0); + label3.Name = "label3"; + label3.Size = new System.Drawing.Size(121, 15); + label3.TabIndex = 61; + label3.Text = "Resource Description:"; + label3.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // panel1 // - this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.panel1.Location = new System.Drawing.Point(133, 148); - this.panel1.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(366, 127); - this.panel1.TabIndex = 153; + panel1.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + panel1.Location = new System.Drawing.Point(133, 148); + panel1.Margin = new Padding(4, 3, 20, 3); + panel1.Name = "panel1"; + panel1.Size = new System.Drawing.Size(366, 106); + panel1.TabIndex = 153; // // tableLayoutPanel2 // - this.tableLayoutPanel2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.tableLayoutPanel2.ColumnCount = 2; - this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); - this.tableLayoutPanel2.Controls.Add(this.tbSourceOfDataCollection, 1, 30); - this.tableLayoutPanel2.Controls.Add(this.tbEthicsApprover, 1, 29); - this.tableLayoutPanel2.Controls.Add(this.label33, 0, 30); - this.tableLayoutPanel2.Controls.Add(this.ddExplicitConsent, 1, 28); - this.tableLayoutPanel2.Controls.Add(this.label32, 0, 29); - this.tableLayoutPanel2.Controls.Add(this.tbAdministrativeContactAddress, 1, 27); - this.tableLayoutPanel2.Controls.Add(this.label31, 0, 28); - this.tableLayoutPanel2.Controls.Add(this.tbAdministrativeContactTelephone, 1, 26); - this.tableLayoutPanel2.Controls.Add(this.label11, 0, 27); - this.tableLayoutPanel2.Controls.Add(this.tbAdministrativeContactEmail, 1, 25); - this.tableLayoutPanel2.Controls.Add(this.label30, 0, 26); - this.tableLayoutPanel2.Controls.Add(this.tbAdministrativeContactName, 1, 24); - this.tableLayoutPanel2.Controls.Add(this.label29, 0, 25); - this.tableLayoutPanel2.Controls.Add(this.tbDataStandards, 1, 23); - this.tableLayoutPanel2.Controls.Add(this.label15, 0, 24); - this.tableLayoutPanel2.Controls.Add(this.tbCountryOfOrigin, 1, 22); - this.tableLayoutPanel2.Controls.Add(this.label26, 0, 23); - this.tableLayoutPanel2.Controls.Add(this.c_tbSourceUrl, 1, 21); - this.tableLayoutPanel2.Controls.Add(this.label27, 0, 22); - this.tableLayoutPanel2.Controls.Add(this.c_tbQueryToolUrl, 1, 20); - this.tableLayoutPanel2.Controls.Add(this.label23, 0, 21); - this.tableLayoutPanel2.Controls.Add(this.c_tbBulkDownloadUrl, 1, 19); - this.tableLayoutPanel2.Controls.Add(this.label22, 0, 20); - this.tableLayoutPanel2.Controls.Add(this.c_tbBrowseUrl, 1, 18); - this.tableLayoutPanel2.Controls.Add(this.label21, 0, 19); - this.tableLayoutPanel2.Controls.Add(this.c_tbAPIAccessURL, 1, 17); - this.tableLayoutPanel2.Controls.Add(this.label20, 0, 18); - this.tableLayoutPanel2.Controls.Add(this.c_tbAccessOptions, 1, 16); - this.tableLayoutPanel2.Controls.Add(this.label19, 0, 17); - this.tableLayoutPanel2.Controls.Add(this.tbDatasetStartDate, 1, 14); - this.tableLayoutPanel2.Controls.Add(this.label18, 0, 16); - this.tableLayoutPanel2.Controls.Add(this.label17, 0, 15); - this.tableLayoutPanel2.Controls.Add(this.c_tbResourceOwner, 1, 13); - this.tableLayoutPanel2.Controls.Add(this.label41, 0, 14); - this.tableLayoutPanel2.Controls.Add(this.c_tbSubjectNumbers, 1, 12); - this.tableLayoutPanel2.Controls.Add(this.label16, 0, 13); - this.tableLayoutPanel2.Controls.Add(this.c_tbLastRevisionDate, 1, 11); - this.tableLayoutPanel2.Controls.Add(this.label28, 0, 12); - this.tableLayoutPanel2.Controls.Add(this.c_tbTimeCoverage, 1, 10); - this.tableLayoutPanel2.Controls.Add(this.label14, 0, 11); - this.tableLayoutPanel2.Controls.Add(this.c_tbBackgroundSummary, 1, 4); - this.tableLayoutPanel2.Controls.Add(this.label13, 0, 10); - this.tableLayoutPanel2.Controls.Add(this.c_tbUpdateSchedule, 1, 9); - this.tableLayoutPanel2.Controls.Add(this.c_tbUpdateFrequency, 1, 8); - this.tableLayoutPanel2.Controls.Add(this.label12, 0, 9); - this.tableLayoutPanel2.Controls.Add(this.c_tbTopics, 1, 6); - this.tableLayoutPanel2.Controls.Add(this.c_ddPeriodicity, 1, 5); - this.tableLayoutPanel2.Controls.Add(this.label10, 0, 8); - this.tableLayoutPanel2.Controls.Add(this.c_ddGranularity, 1, 3); - this.tableLayoutPanel2.Controls.Add(this.label8, 0, 6); - this.tableLayoutPanel2.Controls.Add(this.c_ddType, 1, 1); - this.tableLayoutPanel2.Controls.Add(this.label7, 0, 5); - this.tableLayoutPanel2.Controls.Add(this.c_tbDetailPageURL, 1, 0); - this.tableLayoutPanel2.Controls.Add(this.label64, 0, 3); - this.tableLayoutPanel2.Controls.Add(this.label4, 0, 0); - this.tableLayoutPanel2.Controls.Add(this.label6, 0, 1); - this.tableLayoutPanel2.Controls.Add(this.label5, 0, 2); - this.tableLayoutPanel2.Controls.Add(this.c_tbGeographicalCoverage, 1, 2); - this.tableLayoutPanel2.Controls.Add(this.label9, 0, 4); - this.tableLayoutPanel2.Controls.Add(this.ticketingControl1, 1, 7); - this.tableLayoutPanel2.Controls.Add(this.c_tbAttributionCitation, 1, 15); - this.tableLayoutPanel2.Location = new System.Drawing.Point(3, 3); - this.tableLayoutPanel2.Name = "tableLayoutPanel2"; - this.tableLayoutPanel2.RowCount = 31; - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.Size = new System.Drawing.Size(473, 1475); - this.tableLayoutPanel2.TabIndex = 194; + tableLayoutPanel2.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + tableLayoutPanel2.ColumnCount = 2; + tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle()); + tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle()); + tableLayoutPanel2.Controls.Add(tbSourceOfDataCollection, 1, 30); + tableLayoutPanel2.Controls.Add(tbEthicsApprover, 1, 29); + tableLayoutPanel2.Controls.Add(label33, 0, 30); + tableLayoutPanel2.Controls.Add(ddExplicitConsent, 1, 28); + tableLayoutPanel2.Controls.Add(label32, 0, 29); + tableLayoutPanel2.Controls.Add(tbAdministrativeContactAddress, 1, 27); + tableLayoutPanel2.Controls.Add(label31, 0, 28); + tableLayoutPanel2.Controls.Add(tbAdministrativeContactTelephone, 1, 26); + tableLayoutPanel2.Controls.Add(label11, 0, 27); + tableLayoutPanel2.Controls.Add(tbAdministrativeContactEmail, 1, 25); + tableLayoutPanel2.Controls.Add(label30, 0, 26); + tableLayoutPanel2.Controls.Add(tbAdministrativeContactName, 1, 24); + tableLayoutPanel2.Controls.Add(label29, 0, 25); + tableLayoutPanel2.Controls.Add(tbDataStandards, 1, 23); + tableLayoutPanel2.Controls.Add(label15, 0, 24); + tableLayoutPanel2.Controls.Add(tbCountryOfOrigin, 1, 22); + tableLayoutPanel2.Controls.Add(label26, 0, 23); + tableLayoutPanel2.Controls.Add(c_tbSourceUrl, 1, 21); + tableLayoutPanel2.Controls.Add(label27, 0, 22); + tableLayoutPanel2.Controls.Add(c_tbQueryToolUrl, 1, 20); + tableLayoutPanel2.Controls.Add(label23, 0, 21); + tableLayoutPanel2.Controls.Add(c_tbBulkDownloadUrl, 1, 19); + tableLayoutPanel2.Controls.Add(label22, 0, 20); + tableLayoutPanel2.Controls.Add(c_tbBrowseUrl, 1, 18); + tableLayoutPanel2.Controls.Add(label21, 0, 19); + tableLayoutPanel2.Controls.Add(c_tbAPIAccessURL, 1, 17); + tableLayoutPanel2.Controls.Add(label20, 0, 18); + tableLayoutPanel2.Controls.Add(c_tbAccessOptions, 1, 16); + tableLayoutPanel2.Controls.Add(label19, 0, 17); + tableLayoutPanel2.Controls.Add(tbDatasetStartDate, 1, 14); + tableLayoutPanel2.Controls.Add(label18, 0, 16); + tableLayoutPanel2.Controls.Add(label17, 0, 15); + tableLayoutPanel2.Controls.Add(c_tbResourceOwner, 1, 13); + tableLayoutPanel2.Controls.Add(label41, 0, 14); + tableLayoutPanel2.Controls.Add(c_tbSubjectNumbers, 1, 12); + tableLayoutPanel2.Controls.Add(label16, 0, 13); + tableLayoutPanel2.Controls.Add(c_tbLastRevisionDate, 1, 11); + tableLayoutPanel2.Controls.Add(label28, 0, 12); + tableLayoutPanel2.Controls.Add(c_tbTimeCoverage, 1, 10); + tableLayoutPanel2.Controls.Add(label14, 0, 11); + tableLayoutPanel2.Controls.Add(c_tbBackgroundSummary, 1, 4); + tableLayoutPanel2.Controls.Add(label13, 0, 10); + tableLayoutPanel2.Controls.Add(c_tbUpdateSchedule, 1, 9); + tableLayoutPanel2.Controls.Add(c_tbUpdateFrequency, 1, 8); + tableLayoutPanel2.Controls.Add(label12, 0, 9); + tableLayoutPanel2.Controls.Add(c_tbTopics, 1, 6); + tableLayoutPanel2.Controls.Add(c_ddPeriodicity, 1, 5); + tableLayoutPanel2.Controls.Add(label10, 0, 8); + tableLayoutPanel2.Controls.Add(c_ddGranularity, 1, 3); + tableLayoutPanel2.Controls.Add(label8, 0, 6); + tableLayoutPanel2.Controls.Add(c_ddType, 1, 1); + tableLayoutPanel2.Controls.Add(label7, 0, 5); + tableLayoutPanel2.Controls.Add(c_tbDetailPageURL, 1, 0); + tableLayoutPanel2.Controls.Add(label64, 0, 3); + tableLayoutPanel2.Controls.Add(label4, 0, 0); + tableLayoutPanel2.Controls.Add(label6, 0, 1); + tableLayoutPanel2.Controls.Add(label5, 0, 2); + tableLayoutPanel2.Controls.Add(c_tbGeographicalCoverage, 1, 2); + tableLayoutPanel2.Controls.Add(label9, 0, 4); + tableLayoutPanel2.Controls.Add(ticketingControl1, 1, 7); + tableLayoutPanel2.Controls.Add(c_tbAttributionCitation, 1, 15); + tableLayoutPanel2.Location = new System.Drawing.Point(3, 3); + tableLayoutPanel2.Name = "tableLayoutPanel2"; + tableLayoutPanel2.RowCount = 31; + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.RowStyles.Add(new RowStyle()); + tableLayoutPanel2.Size = new System.Drawing.Size(456, 1475); + tableLayoutPanel2.TabIndex = 194; // // tbSourceOfDataCollection // - this.tbSourceOfDataCollection.AcceptsReturn = true; - this.tbSourceOfDataCollection.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.tbSourceOfDataCollection.Location = new System.Drawing.Point(135, 1370); - this.tbSourceOfDataCollection.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.tbSourceOfDataCollection.Multiline = true; - this.tbSourceOfDataCollection.Name = "tbSourceOfDataCollection"; - this.tbSourceOfDataCollection.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.tbSourceOfDataCollection.Size = new System.Drawing.Size(369, 100); - this.tbSourceOfDataCollection.TabIndex = 30; + tbSourceOfDataCollection.AcceptsReturn = true; + tbSourceOfDataCollection.Anchor = AnchorStyles.Left | AnchorStyles.Right; + tbSourceOfDataCollection.Location = new System.Drawing.Point(135, 1370); + tbSourceOfDataCollection.Margin = new Padding(4, 3, 20, 3); + tbSourceOfDataCollection.Multiline = true; + tbSourceOfDataCollection.Name = "tbSourceOfDataCollection"; + tbSourceOfDataCollection.ScrollBars = ScrollBars.Vertical; + tbSourceOfDataCollection.Size = new System.Drawing.Size(369, 100); + tbSourceOfDataCollection.TabIndex = 30; // // tbEthicsApprover // - this.tbEthicsApprover.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.tbEthicsApprover.Location = new System.Drawing.Point(135, 1340); - this.tbEthicsApprover.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.tbEthicsApprover.Name = "tbEthicsApprover"; - this.tbEthicsApprover.Size = new System.Drawing.Size(369, 23); - this.tbEthicsApprover.TabIndex = 29; + tbEthicsApprover.Anchor = AnchorStyles.Left | AnchorStyles.Right; + tbEthicsApprover.Location = new System.Drawing.Point(135, 1340); + tbEthicsApprover.Margin = new Padding(4, 3, 20, 3); + tbEthicsApprover.Name = "tbEthicsApprover"; + tbEthicsApprover.Size = new System.Drawing.Size(369, 23); + tbEthicsApprover.TabIndex = 29; // // label33 // - this.label33.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label33.AutoSize = true; - this.label33.Location = new System.Drawing.Point(43, 1366); - this.label33.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label33.Name = "label33"; - this.label33.Size = new System.Drawing.Size(84, 30); - this.label33.TabIndex = 163; - this.label33.Text = "Source of Data\r\nCollection:"; - this.label33.TextAlign = System.Drawing.ContentAlignment.TopRight; + label33.Anchor = AnchorStyles.Top | AnchorStyles.Right; + label33.AutoSize = true; + label33.Location = new System.Drawing.Point(43, 1366); + label33.Margin = new Padding(4, 0, 4, 0); + label33.Name = "label33"; + label33.Size = new System.Drawing.Size(84, 30); + label33.TabIndex = 163; + label33.Text = "Source of Data\r\nCollection:"; + label33.TextAlign = System.Drawing.ContentAlignment.TopRight; // // ddExplicitConsent // - this.ddExplicitConsent.Anchor = System.Windows.Forms.AnchorStyles.Left; - this.ddExplicitConsent.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.ddExplicitConsent.FormattingEnabled = true; - this.ddExplicitConsent.Items.AddRange(new object[] { - "", - "Yes", - "No"}); - this.ddExplicitConsent.Location = new System.Drawing.Point(135, 1311); - this.ddExplicitConsent.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.ddExplicitConsent.Name = "ddExplicitConsent"; - this.ddExplicitConsent.Size = new System.Drawing.Size(250, 23); - this.ddExplicitConsent.TabIndex = 28; - this.ddExplicitConsent.SelectedIndexChanged += new System.EventHandler(this.ddExplicitConsent_SelectedIndexChanged); + ddExplicitConsent.Anchor = AnchorStyles.Left; + ddExplicitConsent.DropDownStyle = ComboBoxStyle.DropDownList; + ddExplicitConsent.FormattingEnabled = true; + ddExplicitConsent.Items.AddRange(new object[] { "", "Yes", "No" }); + ddExplicitConsent.Location = new System.Drawing.Point(135, 1311); + ddExplicitConsent.Margin = new Padding(4, 3, 20, 3); + ddExplicitConsent.Name = "ddExplicitConsent"; + ddExplicitConsent.Size = new System.Drawing.Size(250, 23); + ddExplicitConsent.TabIndex = 28; + ddExplicitConsent.SelectedIndexChanged += ddExplicitConsent_SelectedIndexChanged; // // label32 // - this.label32.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label32.AutoSize = true; - this.label32.Location = new System.Drawing.Point(34, 1344); - this.label32.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label32.Name = "label32"; - this.label32.Size = new System.Drawing.Size(93, 15); - this.label32.TabIndex = 162; - this.label32.Text = "Ethics Approver:"; - this.label32.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label32.Anchor = AnchorStyles.Right; + label32.AutoSize = true; + label32.Location = new System.Drawing.Point(34, 1344); + label32.Margin = new Padding(4, 0, 4, 0); + label32.Name = "label32"; + label32.Size = new System.Drawing.Size(93, 15); + label32.TabIndex = 162; + label32.Text = "Ethics Approver:"; + label32.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // tbAdministrativeContactAddress // - this.tbAdministrativeContactAddress.AcceptsReturn = true; - this.tbAdministrativeContactAddress.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.tbAdministrativeContactAddress.Location = new System.Drawing.Point(135, 1205); - this.tbAdministrativeContactAddress.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.tbAdministrativeContactAddress.Multiline = true; - this.tbAdministrativeContactAddress.Name = "tbAdministrativeContactAddress"; - this.tbAdministrativeContactAddress.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.tbAdministrativeContactAddress.Size = new System.Drawing.Size(369, 100); - this.tbAdministrativeContactAddress.TabIndex = 27; + tbAdministrativeContactAddress.AcceptsReturn = true; + tbAdministrativeContactAddress.Anchor = AnchorStyles.Left | AnchorStyles.Right; + tbAdministrativeContactAddress.Location = new System.Drawing.Point(135, 1205); + tbAdministrativeContactAddress.Margin = new Padding(4, 3, 20, 3); + tbAdministrativeContactAddress.Multiline = true; + tbAdministrativeContactAddress.Name = "tbAdministrativeContactAddress"; + tbAdministrativeContactAddress.ScrollBars = ScrollBars.Vertical; + tbAdministrativeContactAddress.Size = new System.Drawing.Size(369, 100); + tbAdministrativeContactAddress.TabIndex = 27; // // label31 // - this.label31.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label31.AutoSize = true; - this.label31.Location = new System.Drawing.Point(32, 1315); - this.label31.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label31.Name = "label31"; - this.label31.Size = new System.Drawing.Size(95, 15); - this.label31.TabIndex = 161; - this.label31.Text = "Explicit Consent:"; - this.label31.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label31.Anchor = AnchorStyles.Right; + label31.AutoSize = true; + label31.Location = new System.Drawing.Point(32, 1315); + label31.Margin = new Padding(4, 0, 4, 0); + label31.Name = "label31"; + label31.Size = new System.Drawing.Size(95, 15); + label31.TabIndex = 161; + label31.Text = "Explicit Consent:"; + label31.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // tbAdministrativeContactTelephone // - this.tbAdministrativeContactTelephone.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.tbAdministrativeContactTelephone.Location = new System.Drawing.Point(135, 1176); - this.tbAdministrativeContactTelephone.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.tbAdministrativeContactTelephone.Name = "tbAdministrativeContactTelephone"; - this.tbAdministrativeContactTelephone.Size = new System.Drawing.Size(369, 23); - this.tbAdministrativeContactTelephone.TabIndex = 26; + tbAdministrativeContactTelephone.Anchor = AnchorStyles.Left | AnchorStyles.Right; + tbAdministrativeContactTelephone.Location = new System.Drawing.Point(135, 1176); + tbAdministrativeContactTelephone.Margin = new Padding(4, 3, 20, 3); + tbAdministrativeContactTelephone.Name = "tbAdministrativeContactTelephone"; + tbAdministrativeContactTelephone.Size = new System.Drawing.Size(369, 23); + tbAdministrativeContactTelephone.TabIndex = 26; // // label11 // - this.label11.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label11.Location = new System.Drawing.Point(7, 1202); - this.label11.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label11.Name = "label11"; - this.label11.Size = new System.Drawing.Size(120, 20); - this.label11.TabIndex = 160; - this.label11.Text = "Admin Address:"; - this.label11.TextAlign = System.Drawing.ContentAlignment.TopRight; + label11.Anchor = AnchorStyles.Top | AnchorStyles.Right; + label11.Location = new System.Drawing.Point(7, 1202); + label11.Margin = new Padding(4, 0, 4, 0); + label11.Name = "label11"; + label11.Size = new System.Drawing.Size(120, 20); + label11.TabIndex = 160; + label11.Text = "Admin Address:"; + label11.TextAlign = System.Drawing.ContentAlignment.TopRight; // // tbAdministrativeContactEmail // - this.tbAdministrativeContactEmail.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.tbAdministrativeContactEmail.Location = new System.Drawing.Point(135, 1147); - this.tbAdministrativeContactEmail.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.tbAdministrativeContactEmail.Name = "tbAdministrativeContactEmail"; - this.tbAdministrativeContactEmail.Size = new System.Drawing.Size(369, 23); - this.tbAdministrativeContactEmail.TabIndex = 25; + tbAdministrativeContactEmail.Anchor = AnchorStyles.Left | AnchorStyles.Right; + tbAdministrativeContactEmail.Location = new System.Drawing.Point(135, 1147); + tbAdministrativeContactEmail.Margin = new Padding(4, 3, 20, 3); + tbAdministrativeContactEmail.Name = "tbAdministrativeContactEmail"; + tbAdministrativeContactEmail.Size = new System.Drawing.Size(369, 23); + tbAdministrativeContactEmail.TabIndex = 25; // // label30 // - this.label30.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label30.AutoSize = true; - this.label30.Location = new System.Drawing.Point(19, 1180); - this.label30.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label30.Name = "label30"; - this.label30.Size = new System.Drawing.Size(108, 15); - this.label30.TabIndex = 159; - this.label30.Text = "Admin Contact Tel:"; - this.label30.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label30.Anchor = AnchorStyles.Right; + label30.AutoSize = true; + label30.Location = new System.Drawing.Point(19, 1180); + label30.Margin = new Padding(4, 0, 4, 0); + label30.Name = "label30"; + label30.Size = new System.Drawing.Size(108, 15); + label30.TabIndex = 159; + label30.Text = "Admin Contact Tel:"; + label30.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // tbAdministrativeContactName // - this.tbAdministrativeContactName.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.tbAdministrativeContactName.Location = new System.Drawing.Point(135, 1118); - this.tbAdministrativeContactName.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.tbAdministrativeContactName.Name = "tbAdministrativeContactName"; - this.tbAdministrativeContactName.Size = new System.Drawing.Size(369, 23); - this.tbAdministrativeContactName.TabIndex = 24; + tbAdministrativeContactName.Anchor = AnchorStyles.Left | AnchorStyles.Right; + tbAdministrativeContactName.Location = new System.Drawing.Point(135, 1118); + tbAdministrativeContactName.Margin = new Padding(4, 3, 20, 3); + tbAdministrativeContactName.Name = "tbAdministrativeContactName"; + tbAdministrativeContactName.Size = new System.Drawing.Size(369, 23); + tbAdministrativeContactName.TabIndex = 24; // // label29 // - this.label29.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label29.AutoSize = true; - this.label29.Location = new System.Drawing.Point(4, 1151); - this.label29.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label29.Name = "label29"; - this.label29.Size = new System.Drawing.Size(123, 15); - this.label29.TabIndex = 158; - this.label29.Text = "Admin Contact Email:"; - this.label29.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label29.Anchor = AnchorStyles.Right; + label29.AutoSize = true; + label29.Location = new System.Drawing.Point(4, 1151); + label29.Margin = new Padding(4, 0, 4, 0); + label29.Name = "label29"; + label29.Size = new System.Drawing.Size(123, 15); + label29.TabIndex = 158; + label29.Text = "Admin Contact Email:"; + label29.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // label15 // - this.label15.Anchor = System.Windows.Forms.AnchorStyles.Right; - this.label15.AutoSize = true; - this.label15.Location = new System.Drawing.Point(36, 1122); - this.label15.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label15.Name = "label15"; - this.label15.Size = new System.Drawing.Size(91, 15); - this.label15.TabIndex = 157; - this.label15.Text = "Admin Contact:"; - this.label15.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + label15.Anchor = AnchorStyles.Right; + label15.AutoSize = true; + label15.Location = new System.Drawing.Point(36, 1122); + label15.Margin = new Padding(4, 0, 4, 0); + label15.Name = "label15"; + label15.Size = new System.Drawing.Size(91, 15); + label15.TabIndex = 157; + label15.Text = "Admin Contact:"; + label15.TextAlign = System.Drawing.ContentAlignment.MiddleRight; // // label5 // - this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.label5.AutoSize = true; - this.label5.ForeColor = System.Drawing.Color.Black; - this.label5.Location = new System.Drawing.Point(43, 58); - this.label5.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(84, 15); - this.label5.TabIndex = 67; - this.label5.Text = "Geo Coverage:"; - this.label5.TextAlign = System.Drawing.ContentAlignment.TopRight; + label5.Anchor = AnchorStyles.Top | AnchorStyles.Right; + label5.AutoSize = true; + label5.ForeColor = System.Drawing.Color.Black; + label5.Location = new System.Drawing.Point(43, 58); + label5.Margin = new Padding(4, 0, 4, 0); + label5.Name = "label5"; + label5.Size = new System.Drawing.Size(84, 15); + label5.TabIndex = 67; + label5.Text = "Geo Coverage:"; + label5.TextAlign = System.Drawing.ContentAlignment.TopRight; // // c_tbGeographicalCoverage // - this.c_tbGeographicalCoverage.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); - this.c_tbGeographicalCoverage.Location = new System.Drawing.Point(135, 61); - this.c_tbGeographicalCoverage.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.c_tbGeographicalCoverage.Multiline = true; - this.c_tbGeographicalCoverage.Name = "c_tbGeographicalCoverage"; - this.c_tbGeographicalCoverage.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.c_tbGeographicalCoverage.Size = new System.Drawing.Size(369, 100); - this.c_tbGeographicalCoverage.TabIndex = 2; + c_tbGeographicalCoverage.Anchor = AnchorStyles.Left | AnchorStyles.Right; + c_tbGeographicalCoverage.Location = new System.Drawing.Point(135, 61); + c_tbGeographicalCoverage.Margin = new Padding(4, 3, 20, 3); + c_tbGeographicalCoverage.Multiline = true; + c_tbGeographicalCoverage.Name = "c_tbGeographicalCoverage"; + c_tbGeographicalCoverage.ScrollBars = ScrollBars.Vertical; + c_tbGeographicalCoverage.Size = new System.Drawing.Size(369, 100); + c_tbGeographicalCoverage.TabIndex = 2; // // ticketingControl1 // - this.ticketingControl1.Anchor = System.Windows.Forms.AnchorStyles.Left; - this.ticketingControl1.Location = new System.Drawing.Point(135, 437); - this.ticketingControl1.Margin = new System.Windows.Forms.Padding(4, 3, 20, 3); - this.ticketingControl1.Name = "ticketingControl1"; - this.ticketingControl1.Size = new System.Drawing.Size(350, 57); - this.ticketingControl1.TabIndex = 8; - this.ticketingControl1.TicketText = ""; + ticketingControl1.Anchor = AnchorStyles.Left; + ticketingControl1.Location = new System.Drawing.Point(135, 437); + ticketingControl1.Margin = new Padding(4, 3, 20, 3); + ticketingControl1.Name = "ticketingControl1"; + ticketingControl1.Size = new System.Drawing.Size(350, 57); + ticketingControl1.TabIndex = 8; + ticketingControl1.TicketText = ""; // // errorProvider1 // - this.errorProvider1.ContainerControl = this; + errorProvider1.ContainerControl = this; + // + // lbDatasetslbl + // + lbDatasetslbl.Anchor = AnchorStyles.Top | AnchorStyles.Right; + lbDatasetslbl.AutoSize = true; + lbDatasetslbl.Location = new System.Drawing.Point(72, 257); + lbDatasetslbl.Name = "lbDatasetslbl"; + lbDatasetslbl.Size = new System.Drawing.Size(54, 15); + lbDatasetslbl.TabIndex = 160; + lbDatasetslbl.Text = "Datasets:"; + // + // lbDatasets + // + lbDatasets.AutoSize = true; + lbDatasets.Location = new System.Drawing.Point(132, 257); + lbDatasets.Name = "lbDatasets"; + lbDatasets.Size = new System.Drawing.Size(0, 15); + lbDatasets.TabIndex = 161; // // CatalogueUI // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.splitContainer1); - this.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); - this.Name = "CatalogueUI"; - this.Size = new System.Drawing.Size(551, 1085); - this.splitContainer1.Panel1.ResumeLayout(false); - this.splitContainer1.Panel2.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); - this.splitContainer1.ResumeLayout(false); - this.tableLayoutPanel1.ResumeLayout(false); - this.tableLayoutPanel1.PerformLayout(); - this.flowLayoutPanel1.ResumeLayout(false); - this.flowLayoutPanel1.PerformLayout(); - this.tableLayoutPanel2.ResumeLayout(false); - this.tableLayoutPanel2.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.errorProvider1)).EndInit(); - this.ResumeLayout(false); - + AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + Controls.Add(splitContainer1); + Margin = new Padding(4, 3, 4, 3); + Name = "CatalogueUI"; + Size = new System.Drawing.Size(551, 1085); + splitContainer1.Panel1.ResumeLayout(false); + splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)splitContainer1).EndInit(); + splitContainer1.ResumeLayout(false); + tableLayoutPanel1.ResumeLayout(false); + tableLayoutPanel1.PerformLayout(); + flowLayoutPanel1.ResumeLayout(false); + flowLayoutPanel1.PerformLayout(); + tableLayoutPanel2.ResumeLayout(false); + tableLayoutPanel2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)errorProvider1).EndInit(); + ResumeLayout(false); } #endregion @@ -1233,5 +1246,7 @@ private void InitializeComponent() private TextBox c_tbGeographicalCoverage; private Label label5; private TableLayoutPanel tableLayoutPanel2; + private Label lbDatasetslbl; + private Label lbDatasets; } } diff --git a/Rdmp.UI/MainFormUITabs/CatalogueUI.cs b/Rdmp.UI/MainFormUITabs/CatalogueUI.cs index b86a6e7de5..3fcca9e4fc 100644 --- a/Rdmp.UI/MainFormUITabs/CatalogueUI.cs +++ b/Rdmp.UI/MainFormUITabs/CatalogueUI.cs @@ -5,6 +5,7 @@ // You should have received a copy of the GNU General Public License along with RDMP. If not, see . using System; +using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Linq; @@ -122,6 +123,32 @@ public override void SetDatabaseObject(IActivateItems activator, Catalogue datab base.SetDatabaseObject(activator, databaseObject); _catalogue = databaseObject; + var associatedDatasets = new List(); + foreach (var catalogueItem in _catalogue.CatalogueItems) + { + var datasetId = catalogueItem.ColumnInfo.Dataset_ID; + if (datasetId != null) + { + var foundDataset = _catalogue.CatalogueRepository.GetAllObjectsWhere("ID", datasetId).First(); + if (!associatedDatasets.Contains(foundDataset.Name)) + { + associatedDatasets.Add(foundDataset.Name); + } + + } + } + if (associatedDatasets.Count > 0) + { + lbDatasets.Visible = true; + lbDatasetslbl.Visible = true; + string finalString = associatedDatasets.Count == 1 ? associatedDatasets[0] : String.Join(", ", associatedDatasets.ToArray(), 0, associatedDatasets.Count - 1) + " and " + associatedDatasets.LastOrDefault(); + lbDatasets.Text = $"This catalogues contains data from the datasets:{finalString}"; + } + else + { + lbDatasets.Visible = false; + lbDatasetslbl.Visible = false; + } RefreshUIFromDatabase(); } diff --git a/Rdmp.UI/MainFormUITabs/CatalogueUI.resx b/Rdmp.UI/MainFormUITabs/CatalogueUI.resx index f298a7be80..54b06b46cc 100644 --- a/Rdmp.UI/MainFormUITabs/CatalogueUI.resx +++ b/Rdmp.UI/MainFormUITabs/CatalogueUI.resx @@ -1,4 +1,64 @@ - + + + @@ -57,4 +117,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + \ No newline at end of file From 75d3d2983f15a3be3b21e5030026132fae562a46 Mon Sep 17 00:00:00 2001 From: James Friel Date: Mon, 20 Nov 2023 12:02:00 +0000 Subject: [PATCH 27/85] add dataset usgae list --- .../DatsetConfigurationUI.Designer.cs | 12 ++++++++++++ Rdmp.UI/SubComponents/DatsetConfigurationUI.cs | 16 +++++++++++----- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/Rdmp.UI/SubComponents/DatsetConfigurationUI.Designer.cs b/Rdmp.UI/SubComponents/DatsetConfigurationUI.Designer.cs index 0e5fddacfd..08cfe2f4b6 100644 --- a/Rdmp.UI/SubComponents/DatsetConfigurationUI.Designer.cs +++ b/Rdmp.UI/SubComponents/DatsetConfigurationUI.Designer.cs @@ -36,6 +36,7 @@ private void InitializeComponent() label3 = new System.Windows.Forms.Label(); label4 = new System.Windows.Forms.Label(); tbFolder = new System.Windows.Forms.TextBox(); + lblDatasetUsage = new System.Windows.Forms.Label(); SuspendLayout(); // // label1 @@ -104,10 +105,20 @@ private void InitializeComponent() tbFolder.Size = new System.Drawing.Size(273, 23); tbFolder.TabIndex = 7; // + // lblDatasetUsage + // + lblDatasetUsage.AutoSize = true; + lblDatasetUsage.Location = new System.Drawing.Point(369, 65); + lblDatasetUsage.Name = "lblDatasetUsage"; + lblDatasetUsage.Size = new System.Drawing.Size(38, 15); + lblDatasetUsage.TabIndex = 8; + lblDatasetUsage.Text = "label5"; + // // DatsetConfigurationUI // AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + Controls.Add(lblDatasetUsage); Controls.Add(tbFolder); Controls.Add(label4); Controls.Add(label3); @@ -132,4 +143,5 @@ private void InitializeComponent() private System.Windows.Forms.Label label3; private System.Windows.Forms.Label label4; private System.Windows.Forms.TextBox tbFolder; + private System.Windows.Forms.Label lblDatasetUsage; } diff --git a/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs b/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs index 9d17d27063..6d5e69dc9d 100644 --- a/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs +++ b/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs @@ -40,11 +40,17 @@ public override void SetDatabaseObject(IActivateItems activator, Dataset databas { base.SetDatabaseObject(activator, databaseObject); Common.Dataset = databaseObject; - //tbName.Text = databaseObject.Name; - //if(databaseObject.DigitalObjectIdentifier is not null) - // tbDOI.Text = databaseObject.DigitalObjectIdentifier.ToString(); - //if(databaseObject.Source is not null) - // tbSource.Text = databaseObject.Source; + + var catalogues = databaseObject.CatalogueRepository.GetAllObjectsWhere("Dataset_ID", databaseObject.ID).SelectMany(ci => ci.CatalogueItems).ToList().Select(ci => ci.CatalogueName).Distinct(); + if(catalogues.Count() < 1) + { + lblDatasetUsage.Text = "This dataset is not linked to data yet."; + } + else + { + var catalogueString = string.Join(Environment.NewLine, catalogues); + lblDatasetUsage.Text = $"This dataset is used in the following catalogues:{Environment.NewLine}{catalogueString}"; + } Bind(tbName, "Text", "Name", c => c.Name); Bind(tbDOI, "Text", "DigitalObjectIdentifier", c => c.DigitalObjectIdentifier); From d2e348ee563d1b87d18b930b9eb9cf6db7f114fc Mon Sep 17 00:00:00 2001 From: James Friel Date: Mon, 20 Nov 2023 12:51:08 +0000 Subject: [PATCH 28/85] fix refresh issue --- .../AtomicCommands/ExecuteCommandDeleteDataset.cs | 1 + Rdmp.UI/SubComponents/DatsetConfigurationUI.cs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs index 2873265b1b..75810e0982 100644 --- a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs +++ b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs @@ -35,6 +35,7 @@ public override void Execute() { var cmd = new Core.CommandExecution.AtomicCommands.ExecuteCommandDeleteDataset(_activateItems, _dataset); cmd.Execute(); + _activateItems.RefreshBus.Publish(this, new Refreshing.RefreshObjectEventArgs(_dataset)); } } diff --git a/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs b/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs index 6d5e69dc9d..eabd63d04d 100644 --- a/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs +++ b/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs @@ -54,7 +54,7 @@ public override void SetDatabaseObject(IActivateItems activator, Dataset databas Bind(tbName, "Text", "Name", c => c.Name); Bind(tbDOI, "Text", "DigitalObjectIdentifier", c => c.DigitalObjectIdentifier); - Bind(tbName, "Text", "Source", c => c.Source); + Bind(tbSource, "Text", "Source", c => c.Source); Bind(tbFolder, "Text", "Folder", c => c.Folder); var s = GetObjectSaverButton(); s.SetupFor(this, databaseObject, activator); From d987af622d01430be768b2c0475ccf39f486c9ad Mon Sep 17 00:00:00 2001 From: James Friel Date: Mon, 20 Nov 2023 14:34:07 +0000 Subject: [PATCH 29/85] folders --- Rdmp.Core/Providers/CatalogueChildProvider.cs | 54 ++++++++++++++++++- Rdmp.Core/Providers/ICoreChildProvider.cs | 2 + Rdmp.UI/Collections/DatasetsCollectionUI.cs | 40 +++++++++----- 3 files changed, 83 insertions(+), 13 deletions(-) diff --git a/Rdmp.Core/Providers/CatalogueChildProvider.cs b/Rdmp.Core/Providers/CatalogueChildProvider.cs index 9eba51d97a..6195c42d09 100644 --- a/Rdmp.Core/Providers/CatalogueChildProvider.cs +++ b/Rdmp.Core/Providers/CatalogueChildProvider.cs @@ -63,6 +63,7 @@ public class CatalogueChildProvider : ICoreChildProvider //Catalogue side of things public Catalogue[] AllCatalogues { get; set; } + public Curation.Data.Dataset[] AllDatasets { get; set; } public Dictionary AllCataloguesDictionary { get; private set; } public SupportingDocument[] AllSupportingDocuments { get; set; } @@ -197,6 +198,7 @@ public class CatalogueChildProvider : ICoreChildProvider public AllOrphanAggregateConfigurationsNode OrphanAggregateConfigurationsNode { get; set; } = new(); public AllTemplateAggregateConfigurationsNode TemplateAggregateConfigurationsNode { get; set; } = new(); public FolderNode CatalogueRootFolder { get; private set; } + public FolderNode DatasetRootFolder { get; private set; } public HashSet OrphanAggregateConfigurations; public AggregateConfiguration[] TemplateAggregateConfigurations; @@ -241,6 +243,8 @@ public CatalogueChildProvider(ICatalogueRepository repository, IChildProvider[] AllCatalogues = GetAllObjects(repository); AllCataloguesDictionary = AllCatalogues.ToDictionaryEx(i => i.ID, o => o); + AllDatasets = GetAllObjects(repository); + AllLoadMetadatas = GetAllObjects(repository); AllProcessTasks = GetAllObjects(repository); AllProcessTasksArguments = GetAllObjects(repository); @@ -376,6 +380,10 @@ public CatalogueChildProvider(ICatalogueRepository repository, IChildProvider[] CatalogueRootFolder = FolderHelper.BuildFolderTree(AllCatalogues); AddChildren(CatalogueRootFolder, new DescendancyList(CatalogueRootFolder)); + + DatasetRootFolder = FolderHelper.BuildFolderTree(AllDatasets); + AddChildren(DatasetRootFolder, new DescendancyList(DatasetRootFolder)); + ReportProgress("Build Catalogue Folder Root"); LoadMetadataRootFolder = FolderHelper.BuildFolderTree(AllLoadMetadatas); @@ -602,7 +610,6 @@ private void AddChildren(GovernancePeriod governancePeriod, DescendancyList desc AddToDictionaries(children, descendancy); } - private void AddChildren(AllPermissionWindowsNode allPermissionWindowsNode) { var descendancy = new DescendancyList(allPermissionWindowsNode); @@ -824,6 +831,22 @@ private void AddChildren(FolderNode folder, DescendancyList descen ); } + private void AddChildren(FolderNode folder, DescendancyList descendancy) + { + foreach (var child in folder.ChildFolders) + //add subfolder children + AddChildren(child, descendancy.Add(child)); + + //add loads in folder + foreach (var ds in folder.ChildObjects) AddChildren(ds, descendancy.Add(ds)); + + // Children are the folders + objects + AddToDictionaries(new HashSet( + folder.ChildFolders.Cast() + .Union(folder.ChildObjects)), descendancy + ); + } + private void AddChildren(FolderNode folder, DescendancyList descendancy) { foreach (var child in folder.ChildFolders) @@ -840,6 +863,35 @@ private void AddChildren(FolderNode folder, D ); } + private void AddChildren(Curation.Data.Dataset lmd, DescendancyList descendancy) + { + var childObjects = new List(); + + //if (lmd.OverrideRAWServer_ID.HasValue) + //{ + // var server = AllExternalServers.Single(s => s.ID == lmd.OverrideRAWServer_ID.Value); + // var usage = new OverrideRawServerNode(lmd, server); + // childObjects.Add(usage); + //} + + //var allSchedulesNode = new LoadMetadataScheduleNode(lmd); + //AddChildren(allSchedulesNode, descendancy.Add(allSchedulesNode)); + //childObjects.Add(allSchedulesNode); + + //var allCataloguesNode = new AllCataloguesUsedByLoadMetadataNode(lmd); + //AddChildren(allCataloguesNode, descendancy.Add(allCataloguesNode)); + //childObjects.Add(allCataloguesNode); + + //var processTasksNode = new AllProcessTasksUsedByLoadMetadataNode(lmd); + //AddChildren(processTasksNode, descendancy.Add(processTasksNode)); + //childObjects.Add(processTasksNode); + + //childObjects.Add(new LoadDirectoryNode(lmd)); + + AddToDictionaries(new HashSet(childObjects), descendancy); + } + + #region Load Metadata private void AddChildren(LoadMetadata lmd, DescendancyList descendancy) diff --git a/Rdmp.Core/Providers/ICoreChildProvider.cs b/Rdmp.Core/Providers/ICoreChildProvider.cs index c3879cf5da..a578400621 100644 --- a/Rdmp.Core/Providers/ICoreChildProvider.cs +++ b/Rdmp.Core/Providers/ICoreChildProvider.cs @@ -44,10 +44,12 @@ public interface ICoreChildProvider : IChildProvider JoinableCohortAggregateConfigurationUse[] AllJoinUses { get; set; } FolderNode CatalogueRootFolder { get; } + FolderNode DatasetRootFolder { get; } FolderNode LoadMetadataRootFolder { get; } FolderNode CohortIdentificationConfigurationRootFolder { get; } Catalogue[] AllCatalogues { get; } + Curation.Data.Dataset[] AllDatasets { get; } Dictionary AllCataloguesDictionary { get; } ExternalDatabaseServer[] AllExternalServers { get; } diff --git a/Rdmp.UI/Collections/DatasetsCollectionUI.cs b/Rdmp.UI/Collections/DatasetsCollectionUI.cs index d5e546ff3e..5c8d74669f 100644 --- a/Rdmp.UI/Collections/DatasetsCollectionUI.cs +++ b/Rdmp.UI/Collections/DatasetsCollectionUI.cs @@ -21,7 +21,8 @@ namespace Rdmp.UI.Collections public partial class DatasetsCollectionUI : RDMPCollectionUI, ILifetimeSubscriber { - private List _datasets = new(); + //private List _datasets = new(); + private Dataset[] _datasets; private bool _firstTime = true; public DatasetsCollectionUI() @@ -42,8 +43,9 @@ public override void SetItemActivator(IActivateItems activator) { OverrideCommandName = "Add New Dataset", Weight = -50.9f }, }; Activator.RefreshBus.EstablishLifetimeSubscription(this); + tlvDatasets.AddObject(activator.CoreChildProvider.DatasetRootFolder); - RefreshFavourites(); + RefreshDatasets(Activator.CoreChildProvider.DatasetRootFolder); if (_firstTime) { @@ -54,19 +56,33 @@ public override void SetItemActivator(IActivateItems activator) public void RefreshBus_RefreshObject(object sender, RefreshObjectEventArgs e) { - RefreshFavourites(); + RefreshDatasets(Activator.CoreChildProvider.DatasetRootFolder); } - private void RefreshFavourites() + private void RefreshDatasets(object oRefreshFrom) { - var actualRootFavourites = FindRootObjects(Activator, IncludeObject); - - //update to the new list - _datasets = actualRootFavourites; - //tlvCohortUsage.AddObjects(dx.ExtractionConfigurations.Where(e => e.Cohort_ID == _extractableCohort.ID) - //.ToArray()); - tlvDatasets.SetObjects(_datasets.ToArray()); - tlvDatasets.RebuildAll(true); + var rootFolder = Activator.CoreChildProvider.DatasetRootFolder; + if (_datasets != null) + { + var newCatalogues = CommonTreeFunctionality.CoreChildProvider.AllDatasets.Except(_datasets); + if (newCatalogues.Any()) + { + oRefreshFrom = rootFolder; //refresh from the root instead + tlvDatasets.RefreshObject(oRefreshFrom); + } + } + _datasets = CommonTreeFunctionality.CoreChildProvider.AllDatasets; + if (_firstTime || Equals(oRefreshFrom, rootFolder)) + { + tlvDatasets.RefreshObject(rootFolder); + tlvDatasets.Expand(rootFolder); + _firstTime = false; + } + + //var actualRootFavourites = FindRootObjects(Activator, IncludeObject); + //_datasets = actualRootFavourites; + //tlvDatasets.SetObjects(_datasets.ToArray()); + //tlvDatasets.RebuildAll(true); } From 1c191597b8ea29d1503c57ee8368b3e01488ed36 Mon Sep 17 00:00:00 2001 From: James Friel Date: Tue, 21 Nov 2023 09:12:02 +0000 Subject: [PATCH 30/85] improved release documents --- .../WordDataReleaseFileGenerator.cs | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/Rdmp.Core/Reports/ExtractionTime/WordDataReleaseFileGenerator.cs b/Rdmp.Core/Reports/ExtractionTime/WordDataReleaseFileGenerator.cs index ae1910d6d6..521061daa0 100644 --- a/Rdmp.Core/Reports/ExtractionTime/WordDataReleaseFileGenerator.cs +++ b/Rdmp.Core/Reports/ExtractionTime/WordDataReleaseFileGenerator.cs @@ -9,6 +9,7 @@ using System.IO; using System.Linq; using NPOI.XWPF.UserModel; +using Rdmp.Core.Curation.Data; using Rdmp.Core.DataExport.Data; using Rdmp.Core.Repositories; using Rdmp.Core.Repositories.Managers; @@ -160,9 +161,18 @@ private void CreateCohortDetailsTable(XWPFDocument document) Cohort.GetCountDistinctFromDatabase(CohortCountTimeoutInSeconds).ToString("N0")); } + private string getDOI(Curation.Data.Dataset ds) + { + if (!string.IsNullOrWhiteSpace(ds.DigitalObjectIdentifier)) + { + return $" (DOI: {ds.DigitalObjectIdentifier})"; + } + return ""; + } + private void CreateFileSummary(XWPFDocument document) { - var table = InsertTable(document, ExtractionResults.Length + 1, 5); + var table = InsertTable(document, ExtractionResults.Length + 1, 6); var tableLine = 0; @@ -171,18 +181,27 @@ private void CreateFileSummary(XWPFDocument document) SetTableCell(table, tableLine, 2, "Filename"); SetTableCell(table, tableLine, 3, "Records"); SetTableCell(table, tableLine, 4, "Unique Individuals"); + SetTableCell(table, tableLine, 5, "Datasets"); tableLine++; foreach (var result in ExtractionResults) { var filename = GetFileName(result); - + var extractableDataset = _repository.GetObjectByID(result.ExtractableDataSet_ID); SetTableCell(table, tableLine, 0, - _repository.GetObjectByID(result.ExtractableDataSet_ID).ToString()); + extractableDataset.ToString()); + var linkedDatasets = extractableDataset.Catalogue.CatalogueItems.Select(c => c.ColumnInfo).Where(ci => ci.Dataset_ID != null).Distinct().Select(ci => ci.Dataset_ID);// + var datasets = _repository.CatalogueRepository.GetAllObjects().Where(d => linkedDatasets.Contains(d.ID)).ToList(); + string datasetString = ""; + foreach (var ds in datasets) + { + datasetString += $"{ds.Name} {getDOI(ds)}, {Environment.NewLine}"; + } SetTableCell(table, tableLine, 1, result.FiltersUsed); SetTableCell(table, tableLine, 2, filename); SetTableCell(table, tableLine, 3, result.RecordsExtracted.ToString("N0")); SetTableCell(table, tableLine, 4, result.DistinctReleaseIdentifiersEncountered.ToString("N0")); + SetTableCell(table, tableLine, 5, datasetString); tableLine++; } } From e61ba5a2d67912324eccec7449f33fc52f5d7bcb Mon Sep 17 00:00:00 2001 From: James Friel Date: Tue, 21 Nov 2023 09:24:25 +0000 Subject: [PATCH 31/85] rename clashing file --- ...oDataSet.cs => ExecuteCommandLinkColumnInfoToDataSetUI.cs} | 4 ++-- Rdmp.UI/Menus/ColumnInfoMenu.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename Rdmp.UI/CommandExecution/AtomicCommands/{ExecuteCommandLinkcolumnInfoToDataSet.cs => ExecuteCommandLinkColumnInfoToDataSetUI.cs} (94%) diff --git a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkcolumnInfoToDataSet.cs b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataSetUI.cs similarity index 94% rename from Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkcolumnInfoToDataSet.cs rename to Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataSetUI.cs index fd35763871..8fbde96268 100644 --- a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkcolumnInfoToDataSet.cs +++ b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataSetUI.cs @@ -21,13 +21,13 @@ namespace Rdmp.UI.CommandExecution.AtomicCommands; -public class ExecuteCommandLinkColumnInfoToDataSet : BasicUICommandExecution, IAtomicCommand +public class ExecuteCommandLinkColumnInfoToDataSetUI : BasicUICommandExecution, IAtomicCommand { private readonly ColumnInfo _columnInfo; private Dataset _selectedDataset; private IActivateItems _activateItems; - public ExecuteCommandLinkColumnInfoToDataSet(IActivateItems activator, ColumnInfo columnInfo) : base(activator) + public ExecuteCommandLinkColumnInfoToDataSetUI(IActivateItems activator, ColumnInfo columnInfo) : base(activator) { _columnInfo = columnInfo; _activateItems = activator; diff --git a/Rdmp.UI/Menus/ColumnInfoMenu.cs b/Rdmp.UI/Menus/ColumnInfoMenu.cs index 8032af8e80..3031589617 100644 --- a/Rdmp.UI/Menus/ColumnInfoMenu.cs +++ b/Rdmp.UI/Menus/ColumnInfoMenu.cs @@ -16,7 +16,7 @@ internal sealed class ColumnInfoMenu : RDMPContextMenuStrip public ColumnInfoMenu(RDMPContextMenuStripArgs args, ColumnInfo columnInfo) : base(args, columnInfo) { Add(new ExecuteCommandAddNewLookupTableRelationship(_activator, null, columnInfo.TableInfo)); - Add(new ExecuteCommandLinkColumnInfoToDataSet(_activator, columnInfo)); + Add(new ExecuteCommandLinkColumnInfoToDataSetUI(_activator, columnInfo)); Items.Add(new ToolStripSeparator()); Add(new ExecuteCommandAddJoinInfo(_activator, columnInfo.TableInfo)); From e7e2ee2b19b6b4dc27c2e801aa01be8da018ea2e Mon Sep 17 00:00:00 2001 From: James Friel Date: Tue, 21 Nov 2023 11:29:21 +0000 Subject: [PATCH 32/85] attempt to fix up tests --- Rdmp.Core/Icons/IconProvision/CatalogueIconProvider.cs | 1 + Rdmp.UI/MainFormUITabs/CatalogueItemUI.cs | 2 +- Tests.Common/UnitTests.cs | 4 +++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Rdmp.Core/Icons/IconProvision/CatalogueIconProvider.cs b/Rdmp.Core/Icons/IconProvision/CatalogueIconProvider.cs index fd9d90b5ac..f6db65f99a 100644 --- a/Rdmp.Core/Icons/IconProvision/CatalogueIconProvider.cs +++ b/Rdmp.Core/Icons/IconProvision/CatalogueIconProvider.cs @@ -226,6 +226,7 @@ public static RDMPConcept GetConceptForCollection(RDMPCollection rdmpCollection) RDMPCollection.Favourites => RDMPConcept.Favourite, RDMPCollection.Cohort => RDMPConcept.CohortIdentificationConfiguration, RDMPCollection.DataLoad => RDMPConcept.LoadMetadata, + RDMPCollection.Datasets => RDMPConcept.Dataset, _ => throw new ArgumentOutOfRangeException(nameof(rdmpCollection)) }; } diff --git a/Rdmp.UI/MainFormUITabs/CatalogueItemUI.cs b/Rdmp.UI/MainFormUITabs/CatalogueItemUI.cs index ae361536ec..95943a909c 100644 --- a/Rdmp.UI/MainFormUITabs/CatalogueItemUI.cs +++ b/Rdmp.UI/MainFormUITabs/CatalogueItemUI.cs @@ -64,7 +64,7 @@ public override void SetDatabaseObject(IActivateItems activator, CatalogueItem d _catalogueItem = databaseObject; if (_catalogueItem != null) { - var columnInfoDatasetValue = _catalogueItem.ColumnInfo.Dataset_ID; + var columnInfoDatasetValue = _catalogueItem?.ColumnInfo?.Dataset_ID; if (columnInfoDatasetValue != null) { lbDatasetValue.Visible = true; diff --git a/Tests.Common/UnitTests.cs b/Tests.Common/UnitTests.cs index e15ac1b6e4..109b66cc9b 100644 --- a/Tests.Common/UnitTests.cs +++ b/Tests.Common/UnitTests.cs @@ -16,6 +16,7 @@ using FAnsi.Implementations.MySql; using FAnsi.Implementations.Oracle; using FAnsi.Implementations.PostgreSql; +using NPOI.SS.Formula.Functions; using NUnit.Framework; using Rdmp.Core.CommandExecution; using Rdmp.Core.CommandLine.Interactive; @@ -59,7 +60,8 @@ public class UnitTests "ExtractableCohort", "DQEGraphAnnotation", "Evaluation", - "WindowLayout" + "WindowLayout", + "Dataset" }); From 5ef1788fe649c4c8ba8766c5fd403e08478728a2 Mon Sep 17 00:00:00 2001 From: James Friel Date: Tue, 21 Nov 2023 11:44:12 +0000 Subject: [PATCH 33/85] fix imports --- Tests.Common/UnitTests.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Tests.Common/UnitTests.cs b/Tests.Common/UnitTests.cs index 109b66cc9b..4a85a8f7f7 100644 --- a/Tests.Common/UnitTests.cs +++ b/Tests.Common/UnitTests.cs @@ -16,7 +16,6 @@ using FAnsi.Implementations.MySql; using FAnsi.Implementations.Oracle; using FAnsi.Implementations.PostgreSql; -using NPOI.SS.Formula.Functions; using NUnit.Framework; using Rdmp.Core.CommandExecution; using Rdmp.Core.CommandLine.Interactive; From f88657dbf137a2e9e672607864e2357670270fb5 Mon Sep 17 00:00:00 2001 From: James Friel Date: Tue, 21 Nov 2023 13:41:14 +0000 Subject: [PATCH 34/85] update for testing --- Rdmp.Core/Providers/CatalogueChildProvider.cs | 3 ++- Rdmp.Core/Providers/DataExportChildProvider.cs | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Rdmp.Core/Providers/CatalogueChildProvider.cs b/Rdmp.Core/Providers/CatalogueChildProvider.cs index 6195c42d09..cece4fddfe 100644 --- a/Rdmp.Core/Providers/CatalogueChildProvider.cs +++ b/Rdmp.Core/Providers/CatalogueChildProvider.cs @@ -139,6 +139,8 @@ public class CatalogueChildProvider : ICoreChildProvider public AllPermissionWindowsNode AllPermissionWindowsNode { get; set; } public FolderNode LoadMetadataRootFolder { get; set; } + + public FolderNode DatasetRootFolder { get; set; } public FolderNode CohortIdentificationConfigurationRootFolder { get; set; } public AllConnectionStringKeywordsNode AllConnectionStringKeywordsNode { get; set; } @@ -198,7 +200,6 @@ public class CatalogueChildProvider : ICoreChildProvider public AllOrphanAggregateConfigurationsNode OrphanAggregateConfigurationsNode { get; set; } = new(); public AllTemplateAggregateConfigurationsNode TemplateAggregateConfigurationsNode { get; set; } = new(); public FolderNode CatalogueRootFolder { get; private set; } - public FolderNode DatasetRootFolder { get; private set; } public HashSet OrphanAggregateConfigurations; public AggregateConfiguration[] TemplateAggregateConfigurations; diff --git a/Rdmp.Core/Providers/DataExportChildProvider.cs b/Rdmp.Core/Providers/DataExportChildProvider.cs index 2014248761..26175c7508 100644 --- a/Rdmp.Core/Providers/DataExportChildProvider.cs +++ b/Rdmp.Core/Providers/DataExportChildProvider.cs @@ -52,6 +52,7 @@ public class DataExportChildProvider : CatalogueChildProvider public ExtractableDataSetPackage[] AllPackages { get; set; } public FolderNode ProjectRootFolder { get; private set; } + //public FolderNode DatasetRootFolder { get; private set; } public Project[] Projects { get; set; } private Dictionary> _cohortsByOriginId; @@ -798,6 +799,7 @@ public override void UpdateTo(ICoreChildProvider other) _extractionInformationsByCatalogueItem = dxOther._extractionInformationsByCatalogueItem; _extractionProgressesBySelectedDataSetID = dxOther._extractionProgressesBySelectedDataSetID; ProjectRootFolder = dxOther.ProjectRootFolder; + DatasetRootFolder = dxOther.DatasetRootFolder; } } From 733b32176110170fef8c4489fdc0a46a37b42ddb Mon Sep 17 00:00:00 2001 From: James Friel Date: Wed, 22 Nov 2023 09:34:02 +0000 Subject: [PATCH 35/85] add charts --- ...alogueToDatasetLinkagePieChart.Designer.cs | 99 ++++++++++++++++ .../CatalogueToDatasetLinkagePieChart.cs | 112 ++++++++++++++++++ .../CatalogueToDatasetObjectCollection.cs | 12 ++ 3 files changed, 223 insertions(+) create mode 100644 Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.Designer.cs create mode 100644 Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.cs create mode 100644 Rdmp.UI/PieCharts/CatalogueToDatasetObjectCollection.cs diff --git a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.Designer.cs b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.Designer.cs new file mode 100644 index 0000000000..adb8d81380 --- /dev/null +++ b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.Designer.cs @@ -0,0 +1,99 @@ +namespace Rdmp.UI.PieCharts +{ + partial class CatalogueToDatasetLinkagePieChart + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Text = "CatalogueToDatasetLinkagePieChart"; + this.gbWhatThisIs = new System.Windows.Forms.GroupBox();//TODO + this.chart1 = new System.Windows.Forms.DataVisualization.Charting.Chart(); + System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); + System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend(); + System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series(); + + ((System.ComponentModel.ISupportInitialize)(this.chart1)).BeginInit(); + // + // chart1 + // + this.chart1.BackColor = System.Drawing.Color.DarkGray; + this.chart1.BackGradientStyle = System.Windows.Forms.DataVisualization.Charting.GradientStyle.TopBottom; + this.chart1.BorderSkin.PageColor = System.Drawing.Color.Black; + chartArea1.Area3DStyle.Enable3D = true; + chartArea1.Area3DStyle.WallWidth = 10; + chartArea1.BackColor = System.Drawing.Color.DarkGray; + chartArea1.BackGradientStyle = System.Windows.Forms.DataVisualization.Charting.GradientStyle.TopBottom; + chartArea1.Name = "ChartArea1"; + this.chart1.ChartAreas.Add(chartArea1); + this.chart1.Dock = System.Windows.Forms.DockStyle.Fill; + legend1.BackColor = System.Drawing.Color.Gainsboro; + legend1.BackGradientStyle = System.Windows.Forms.DataVisualization.Charting.GradientStyle.TopBottom; + legend1.BorderColor = System.Drawing.Color.White; + legend1.BorderWidth = 2; + legend1.Name = "Legend1"; + this.chart1.Legends.Add(legend1); + this.chart1.Location = new System.Drawing.Point(3, 16); + this.chart1.Name = "chart1"; + this.chart1.Palette = System.Windows.Forms.DataVisualization.Charting.ChartColorPalette.None; + this.chart1.PaletteCustomColors = new System.Drawing.Color[] { + System.Drawing.Color.Red, + System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(192)))), ((int)(((byte)(0)))))}; + series1.ChartArea = "ChartArea1"; + series1.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Pie; + series1.CustomProperties = "PieDrawingStyle=SoftEdge, PieLabelStyle=Disabled"; + series1.Legend = "Legend1"; + series1.Name = "Series1"; + this.chart1.Series.Add(series1); + this.chart1.Size = new System.Drawing.Size(387, 203); + this.chart1.TabIndex = 0; + this.chart1.Text = "chart1"; + // + // gbWhatThisIs + // + this.gbWhatThisIs.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + //this.gbWhatThisIs.Controls.Add(this.btnViewDataTable); + //this.gbWhatThisIs.Controls.Add(this.lblNoIssues); + this.gbWhatThisIs.Controls.Add(this.chart1); + this.gbWhatThisIs.Location = new System.Drawing.Point(0, 28); + this.gbWhatThisIs.Name = "gbWhatThisIs"; + this.gbWhatThisIs.Size = new System.Drawing.Size(393, 222); + this.gbWhatThisIs.TabIndex = 1; + this.gbWhatThisIs.TabStop = false; + this.gbWhatThisIs.Text = "What This Is"; + } + + #endregion + + private System.Windows.Forms.GroupBox gbWhatThisIs; + private System.Windows.Forms.DataVisualization.Charting.Chart chart1; + //private System.Windows.Forms.Label lblNoIssues; + } +} \ No newline at end of file diff --git a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.cs b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.cs new file mode 100644 index 0000000000..fff5063678 --- /dev/null +++ b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.cs @@ -0,0 +1,112 @@ +using Rdmp.Core.Curation.Data.Dashboarding; +using Rdmp.UI.DashboardTabs.Construction; +using Rdmp.UI.ItemActivation; +using Rdmp.UI.Refreshing; +using Rdmp.UI.TestsAndSetup.ServicePropogation; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Rdmp.UI.PieCharts; + +public partial class CatalogueToDatasetLinkagePieChart : RDMPUserControl, IDashboardableControl +{ + private DashboardControl _dashboardControlDatabaseRecord; + private CatalogueToDatasetObjectCollection _collection; + public CatalogueToDatasetLinkagePieChart() + { + InitializeComponent(); + } + + public IPersistableObjectCollection ConstructEmptyCollection(DashboardControl databaseRecord) + { + _dashboardControlDatabaseRecord = databaseRecord; + return new CatalogueToDatasetObjectCollection(); + } + + public IPersistableObjectCollection GetCollection() + { + return _collection; + } + + public string GetTabName() + { + return Text; + } + + public string GetTabToolTip() + { + return null; + } + + public void NotifyEditModeChange(bool isEditModeOn) + { + var l = new Point(Margin.Left, Margin.Right); + var s = new Size(Width - Margin.Horizontal, Height - Margin.Vertical); + + CommonFunctionality.ToolStrip.Visible = isEditModeOn; + + if (isEditModeOn) + { + gbWhatThisIs.Location = l with { Y = l.Y + 25 }; //move it down 25 to allow space for tool bar + gbWhatThisIs.Size = s with { Height = s.Height - 25 }; //and adjust height accordingly + } + else + { + gbWhatThisIs.Location = l; + gbWhatThisIs.Size = s; + } + } + + public void RefreshBus_RefreshObject(object sender, RefreshObjectEventArgs e) + { + //TOD this does nothing right now + } + + //private bool _bLoading; + //private bool firstTime = true; + + public void SetCollection(IActivateItems activator, IPersistableObjectCollection collection) + { + SetItemActivator(activator); + + _collection = (CatalogueToDatasetObjectCollection)collection; + + //if (firstTime) + // SetupFlags(); + + //btnAllCatalogues.Checked = !_collection.IsSingleCatalogueMode; + //btnSingleCatalogue.Checked = _collection.IsSingleCatalogueMode; + //btnShowLabels.Checked = _collection.ShowLabels; + + //CommonFunctionality.Add(btnAllCatalogues); + //CommonFunctionality.Add(toolStripLabel1); + //CommonFunctionality.Add(btnAllCatalogues); + //CommonFunctionality.Add(btnSingleCatalogue); + //CommonFunctionality.Add(btnShowLabels); + //CommonFunctionality.Add(btnRefresh); + + //foreach (var mi in _flagOptions) + // CommonFunctionality.AddToMenu(mi); + + GenerateChart(); + //_bLoading = false; + } + private void GenerateChart() + { + chart1.Visible = false; + //lblNoIssues.Visible = false; + gbWhatThisIs.Text = "Hello1"; + //gbWhatThisIs.Text = _collection.IsSingleCatalogueMode + // ? $"Column Descriptions in {_collection.GetSingleCatalogueModeCatalogue()}" + // : "Column Descriptions"; + + } + +} diff --git a/Rdmp.UI/PieCharts/CatalogueToDatasetObjectCollection.cs b/Rdmp.UI/PieCharts/CatalogueToDatasetObjectCollection.cs new file mode 100644 index 0000000000..b49e9d7207 --- /dev/null +++ b/Rdmp.UI/PieCharts/CatalogueToDatasetObjectCollection.cs @@ -0,0 +1,12 @@ +using Rdmp.Core.Curation.Data.Dashboarding; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Rdmp.UI.PieCharts; + +public class CatalogueToDatasetObjectCollection: PersistableObjectCollection +{ +} From c4bbbc92feaadaa8f62b9de0c0f2cc955e9d3097 Mon Sep 17 00:00:00 2001 From: James Friel Date: Wed, 22 Nov 2023 09:46:49 +0000 Subject: [PATCH 36/85] update changelog --- CHANGELOG.md | 5 +++-- SharedAssemblyInfo.cs | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 425572477a..4530b93d38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,11 +8,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [8.1.1] - WIP -... - ### Changed - Improved file transfer (FTP/SFTP/FTPS) support +- Improved Plugin Bundling +- Add ability to bundle UI notifications from plugin pipeline components +- Add ability to use .bak files as data load ## [8.1.0] - 2023-09-19 diff --git a/SharedAssemblyInfo.cs b/SharedAssemblyInfo.cs index 145e22c980..edd0c8e80a 100644 --- a/SharedAssemblyInfo.cs +++ b/SharedAssemblyInfo.cs @@ -12,4 +12,4 @@ [assembly: AssemblyVersion("8.1.1")] [assembly: AssemblyFileVersion("8.1.1")] -[assembly: AssemblyInformationalVersion("8.1.1-rc1")] \ No newline at end of file +[assembly: AssemblyInformationalVersion("8.1.1-rc2")] \ No newline at end of file From d62033132f91a0fc5380cdc09e97bcff16a0c18e Mon Sep 17 00:00:00 2001 From: James Friel Date: Wed, 22 Nov 2023 09:58:28 +0000 Subject: [PATCH 37/85] remove bad files --- ...alogueToDatasetLinkagePieChart.Designer.cs | 99 ---------------- .../CatalogueToDatasetLinkagePieChart.cs | 112 ------------------ .../CatalogueToDatasetObjectCollection.cs | 12 -- 3 files changed, 223 deletions(-) delete mode 100644 Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.Designer.cs delete mode 100644 Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.cs delete mode 100644 Rdmp.UI/PieCharts/CatalogueToDatasetObjectCollection.cs diff --git a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.Designer.cs b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.Designer.cs deleted file mode 100644 index adb8d81380..0000000000 --- a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.Designer.cs +++ /dev/null @@ -1,99 +0,0 @@ -namespace Rdmp.UI.PieCharts -{ - partial class CatalogueToDatasetLinkagePieChart - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(800, 450); - this.Text = "CatalogueToDatasetLinkagePieChart"; - this.gbWhatThisIs = new System.Windows.Forms.GroupBox();//TODO - this.chart1 = new System.Windows.Forms.DataVisualization.Charting.Chart(); - System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); - System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend(); - System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series(); - - ((System.ComponentModel.ISupportInitialize)(this.chart1)).BeginInit(); - // - // chart1 - // - this.chart1.BackColor = System.Drawing.Color.DarkGray; - this.chart1.BackGradientStyle = System.Windows.Forms.DataVisualization.Charting.GradientStyle.TopBottom; - this.chart1.BorderSkin.PageColor = System.Drawing.Color.Black; - chartArea1.Area3DStyle.Enable3D = true; - chartArea1.Area3DStyle.WallWidth = 10; - chartArea1.BackColor = System.Drawing.Color.DarkGray; - chartArea1.BackGradientStyle = System.Windows.Forms.DataVisualization.Charting.GradientStyle.TopBottom; - chartArea1.Name = "ChartArea1"; - this.chart1.ChartAreas.Add(chartArea1); - this.chart1.Dock = System.Windows.Forms.DockStyle.Fill; - legend1.BackColor = System.Drawing.Color.Gainsboro; - legend1.BackGradientStyle = System.Windows.Forms.DataVisualization.Charting.GradientStyle.TopBottom; - legend1.BorderColor = System.Drawing.Color.White; - legend1.BorderWidth = 2; - legend1.Name = "Legend1"; - this.chart1.Legends.Add(legend1); - this.chart1.Location = new System.Drawing.Point(3, 16); - this.chart1.Name = "chart1"; - this.chart1.Palette = System.Windows.Forms.DataVisualization.Charting.ChartColorPalette.None; - this.chart1.PaletteCustomColors = new System.Drawing.Color[] { - System.Drawing.Color.Red, - System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(192)))), ((int)(((byte)(0)))))}; - series1.ChartArea = "ChartArea1"; - series1.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Pie; - series1.CustomProperties = "PieDrawingStyle=SoftEdge, PieLabelStyle=Disabled"; - series1.Legend = "Legend1"; - series1.Name = "Series1"; - this.chart1.Series.Add(series1); - this.chart1.Size = new System.Drawing.Size(387, 203); - this.chart1.TabIndex = 0; - this.chart1.Text = "chart1"; - // - // gbWhatThisIs - // - this.gbWhatThisIs.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - //this.gbWhatThisIs.Controls.Add(this.btnViewDataTable); - //this.gbWhatThisIs.Controls.Add(this.lblNoIssues); - this.gbWhatThisIs.Controls.Add(this.chart1); - this.gbWhatThisIs.Location = new System.Drawing.Point(0, 28); - this.gbWhatThisIs.Name = "gbWhatThisIs"; - this.gbWhatThisIs.Size = new System.Drawing.Size(393, 222); - this.gbWhatThisIs.TabIndex = 1; - this.gbWhatThisIs.TabStop = false; - this.gbWhatThisIs.Text = "What This Is"; - } - - #endregion - - private System.Windows.Forms.GroupBox gbWhatThisIs; - private System.Windows.Forms.DataVisualization.Charting.Chart chart1; - //private System.Windows.Forms.Label lblNoIssues; - } -} \ No newline at end of file diff --git a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.cs b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.cs deleted file mode 100644 index fff5063678..0000000000 --- a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.cs +++ /dev/null @@ -1,112 +0,0 @@ -using Rdmp.Core.Curation.Data.Dashboarding; -using Rdmp.UI.DashboardTabs.Construction; -using Rdmp.UI.ItemActivation; -using Rdmp.UI.Refreshing; -using Rdmp.UI.TestsAndSetup.ServicePropogation; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; - -namespace Rdmp.UI.PieCharts; - -public partial class CatalogueToDatasetLinkagePieChart : RDMPUserControl, IDashboardableControl -{ - private DashboardControl _dashboardControlDatabaseRecord; - private CatalogueToDatasetObjectCollection _collection; - public CatalogueToDatasetLinkagePieChart() - { - InitializeComponent(); - } - - public IPersistableObjectCollection ConstructEmptyCollection(DashboardControl databaseRecord) - { - _dashboardControlDatabaseRecord = databaseRecord; - return new CatalogueToDatasetObjectCollection(); - } - - public IPersistableObjectCollection GetCollection() - { - return _collection; - } - - public string GetTabName() - { - return Text; - } - - public string GetTabToolTip() - { - return null; - } - - public void NotifyEditModeChange(bool isEditModeOn) - { - var l = new Point(Margin.Left, Margin.Right); - var s = new Size(Width - Margin.Horizontal, Height - Margin.Vertical); - - CommonFunctionality.ToolStrip.Visible = isEditModeOn; - - if (isEditModeOn) - { - gbWhatThisIs.Location = l with { Y = l.Y + 25 }; //move it down 25 to allow space for tool bar - gbWhatThisIs.Size = s with { Height = s.Height - 25 }; //and adjust height accordingly - } - else - { - gbWhatThisIs.Location = l; - gbWhatThisIs.Size = s; - } - } - - public void RefreshBus_RefreshObject(object sender, RefreshObjectEventArgs e) - { - //TOD this does nothing right now - } - - //private bool _bLoading; - //private bool firstTime = true; - - public void SetCollection(IActivateItems activator, IPersistableObjectCollection collection) - { - SetItemActivator(activator); - - _collection = (CatalogueToDatasetObjectCollection)collection; - - //if (firstTime) - // SetupFlags(); - - //btnAllCatalogues.Checked = !_collection.IsSingleCatalogueMode; - //btnSingleCatalogue.Checked = _collection.IsSingleCatalogueMode; - //btnShowLabels.Checked = _collection.ShowLabels; - - //CommonFunctionality.Add(btnAllCatalogues); - //CommonFunctionality.Add(toolStripLabel1); - //CommonFunctionality.Add(btnAllCatalogues); - //CommonFunctionality.Add(btnSingleCatalogue); - //CommonFunctionality.Add(btnShowLabels); - //CommonFunctionality.Add(btnRefresh); - - //foreach (var mi in _flagOptions) - // CommonFunctionality.AddToMenu(mi); - - GenerateChart(); - //_bLoading = false; - } - private void GenerateChart() - { - chart1.Visible = false; - //lblNoIssues.Visible = false; - gbWhatThisIs.Text = "Hello1"; - //gbWhatThisIs.Text = _collection.IsSingleCatalogueMode - // ? $"Column Descriptions in {_collection.GetSingleCatalogueModeCatalogue()}" - // : "Column Descriptions"; - - } - -} diff --git a/Rdmp.UI/PieCharts/CatalogueToDatasetObjectCollection.cs b/Rdmp.UI/PieCharts/CatalogueToDatasetObjectCollection.cs deleted file mode 100644 index b49e9d7207..0000000000 --- a/Rdmp.UI/PieCharts/CatalogueToDatasetObjectCollection.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Rdmp.Core.Curation.Data.Dashboarding; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Rdmp.UI.PieCharts; - -public class CatalogueToDatasetObjectCollection: PersistableObjectCollection -{ -} From a99fc283476f1677b74c730ab2a95a51a56237a1 Mon Sep 17 00:00:00 2001 From: James Friel Date: Wed, 22 Nov 2023 11:08:18 +0000 Subject: [PATCH 38/85] add pie chart --- ...talogueToDatasetLinkageObjectCollection.cs | 12 ++ ...alogueToDatasetLinkagePieChart.Designer.cs | 133 ++++++++++++++++ .../CatalogueToDatasetLinkagePieChart.cs | 150 ++++++++++++++++++ .../CatalogueToDatasetLinkagePieChart.resx | 120 ++++++++++++++ 4 files changed, 415 insertions(+) create mode 100644 Rdmp.UI/PieCharts/CatalogueToDatasetLinkageObjectCollection.cs create mode 100644 Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.Designer.cs create mode 100644 Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.cs create mode 100644 Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.resx diff --git a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkageObjectCollection.cs b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkageObjectCollection.cs new file mode 100644 index 0000000000..cf3dcb2344 --- /dev/null +++ b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkageObjectCollection.cs @@ -0,0 +1,12 @@ +using Rdmp.Core.Curation.Data.Dashboarding; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Rdmp.UI.PieCharts; + +public class CatalogueToDatasetLinkageObjectCollection : PersistableObjectCollection +{ +} diff --git a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.Designer.cs b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.Designer.cs new file mode 100644 index 0000000000..9ad0f7815a --- /dev/null +++ b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.Designer.cs @@ -0,0 +1,133 @@ +using System.Windows.Forms.DataVisualization.Charting; + +namespace Rdmp.UI.PieCharts +{ + partial class CatalogueToDatasetLinkagePieChart + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); + System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend(); + System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GoodBadCataloguePieChart)); + btnViewDataTable = new System.Windows.Forms.Button(); + lblNoIssues = new System.Windows.Forms.Label(); + gbWhatThisIs = new System.Windows.Forms.GroupBox(); + this.chart1 = new System.Windows.Forms.DataVisualization.Charting.Chart(); + gbWhatThisIs.SuspendLayout(); + SuspendLayout(); + // + // btnViewDataTable + // + btnViewDataTable.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; + btnViewDataTable.Location = new System.Drawing.Point(677, 379); + btnViewDataTable.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + btnViewDataTable.Name = "btnViewDataTable"; + btnViewDataTable.Size = new System.Drawing.Size(31, 27); + btnViewDataTable.TabIndex = 4; + btnViewDataTable.UseVisualStyleBackColor = true; + // + // lblNoIssues + // + lblNoIssues.Anchor = System.Windows.Forms.AnchorStyles.None; + lblNoIssues.AutoSize = true; + lblNoIssues.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point); + lblNoIssues.Location = new System.Drawing.Point(246, 206); + lblNoIssues.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + lblNoIssues.Name = "lblNoIssues"; + lblNoIssues.Size = new System.Drawing.Size(153, 13); + lblNoIssues.TabIndex = 1; + lblNoIssues.Text = "No Issues Reported In Dataset"; + // + // chart1 + // + this.chart1.BackColor = System.Drawing.Color.DarkGray; + this.chart1.BackGradientStyle = System.Windows.Forms.DataVisualization.Charting.GradientStyle.TopBottom; + this.chart1.BorderSkin.PageColor = System.Drawing.Color.Black; + chartArea1.Area3DStyle.Enable3D = true; + chartArea1.Area3DStyle.WallWidth = 10; + chartArea1.BackColor = System.Drawing.Color.DarkGray; + chartArea1.BackGradientStyle = System.Windows.Forms.DataVisualization.Charting.GradientStyle.TopBottom; + chartArea1.Name = "ChartArea1"; + this.chart1.ChartAreas.Add(chartArea1); + this.chart1.Dock = System.Windows.Forms.DockStyle.Fill; + legend1.BackColor = System.Drawing.Color.Gainsboro; + legend1.BackGradientStyle = System.Windows.Forms.DataVisualization.Charting.GradientStyle.TopBottom; + legend1.BorderColor = System.Drawing.Color.White; + legend1.BorderWidth = 2; + legend1.Name = "Legend1"; + this.chart1.Legends.Add(legend1); + this.chart1.Location = new System.Drawing.Point(3, 16); + this.chart1.Name = "chart1"; + this.chart1.Palette = System.Windows.Forms.DataVisualization.Charting.ChartColorPalette.None; + this.chart1.PaletteCustomColors = new System.Drawing.Color[] { + System.Drawing.Color.Red, + System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(192)))), ((int)(((byte)(0)))))}; + series1.ChartArea = "ChartArea1"; + series1.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Pie; + series1.CustomProperties = "PieDrawingStyle=SoftEdge, PieLabelStyle=Disabled"; + series1.Legend = "Legend1"; + series1.Name = "Series1"; + this.chart1.Series.Add(series1); + this.chart1.Size = new System.Drawing.Size(387, 203); + this.chart1.TabIndex = 0; + this.chart1.Text = "chart1"; + // + // gbWhatThisIs + // + gbWhatThisIs.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; + gbWhatThisIs.Controls.Add(btnViewDataTable); + gbWhatThisIs.Controls.Add(lblNoIssues); + gbWhatThisIs.Location = new System.Drawing.Point(171, 97); + gbWhatThisIs.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + gbWhatThisIs.Name = "gbWhatThisIs"; + gbWhatThisIs.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3); + gbWhatThisIs.Size = new System.Drawing.Size(458, 256); + gbWhatThisIs.TabIndex = 2; + gbWhatThisIs.TabStop = false; + gbWhatThisIs.Text = "What This Is"; + // + // CatalogueToDatasetLinkagePieChart + // + AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + Controls.Add(gbWhatThisIs); + Name = "CatalogueToDatasetLinkagePieChart"; + Size = new System.Drawing.Size(800, 450); + gbWhatThisIs.ResumeLayout(false); + gbWhatThisIs.PerformLayout(); + ResumeLayout(false); + } + + #endregion + private System.Windows.Forms.DataVisualization.Charting.Chart chart1; + + private System.Windows.Forms.Button btnViewDataTable; + private System.Windows.Forms.Label lblNoIssues; + private System.Windows.Forms.GroupBox gbWhatThisIs; + } +} \ No newline at end of file diff --git a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.cs b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.cs new file mode 100644 index 0000000000..0e1fc25973 --- /dev/null +++ b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.cs @@ -0,0 +1,150 @@ +using NPOI.OpenXmlFormats.Dml; +using Rdmp.Core.Curation.Data.Dashboarding; +using Rdmp.UI.DashboardTabs.Construction; +using Rdmp.UI.ItemActivation; +using Rdmp.UI.Refreshing; +using Rdmp.UI.TestsAndSetup.ServicePropogation; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Rdmp.UI.PieCharts; + +public partial class CatalogueToDatasetLinkagePieChart : RDMPUserControl, IDashboardableControl +{ + + private DashboardControl _dashboardControlDatabaseRecord; + private CatalogueToDatasetLinkageObjectCollection _collection; + public CatalogueToDatasetLinkagePieChart() + { + InitializeComponent(); + btnViewDataTable.Click += btnAllCatalogues_Click; + } + + public IPersistableObjectCollection ConstructEmptyCollection(DashboardControl databaseRecord) + { + _dashboardControlDatabaseRecord = databaseRecord; + + return new CatalogueToDatasetLinkageObjectCollection(); + } + + public IPersistableObjectCollection GetCollection() + { + return _collection; + } + + public string GetTabName() + { + return Text; + } + + public string GetTabToolTip() + { + return null; + } + + public void NotifyEditModeChange(bool isEditModeOn) + { + var l = new Point(Margin.Left, Margin.Right); + var s = new Size(Width - Margin.Horizontal, Height - Margin.Vertical); + + CommonFunctionality.ToolStrip.Visible = isEditModeOn; + + if (isEditModeOn) + { + gbWhatThisIs.Location = l with { Y = l.Y + 25 }; //move it down 25 to allow space for tool bar + gbWhatThisIs.Size = s with { Height = s.Height - 25 }; //and adjust height accordingly + } + else + { + gbWhatThisIs.Location = l; + gbWhatThisIs.Size = s; + } + } + + public void RefreshBus_RefreshObject(object sender, RefreshObjectEventArgs e) + { + } + + private void SetupFlags() { } + + private void GenerateChart() + { + chart1.Visible = false; + lblNoIssues.Visible = false; + + gbWhatThisIs.Text = "TODO!"; + + PopulateAsEmptyDescriptionsChart(); + } + + private void PopulateAsEmptyDescriptionsChart() + { + var dt = new DataTable(); + dt.Columns.Add("Count"); + dt.Columns.Add("State"); + + dt.Rows.Add(new object[] { 100, $"Missing ({100})" }); + dt.Rows.Add(new object[] { 100, $"Populated ({100})" }); + + chart1.Series[0].XValueMember = dt.Columns[1].ColumnName; + chart1.Series[0].YValueMembers = dt.Columns[0].ColumnName; + + chart1.DataSource = dt; + chart1.DataBind(); + chart1.Visible = true; + lblNoIssues.Visible = false; + } + private void btnAllCatalogues_Click(object sender, EventArgs e) + { + //btnAllCatalogues.Checked = true; + //btnSingleCatalogue.Checked = false; + //_collection.SetAllCataloguesMode(); + //GenerateChart();`` + SaveCollectionChanges(); + } + + private void SaveCollectionChanges() + { + if (_bLoading) + return; + + _dashboardControlDatabaseRecord.SaveCollectionState(_collection); + } + + private bool _bLoading; + private bool firstTime = true; + public void SetCollection(IActivateItems activator, IPersistableObjectCollection collection) + { + _bLoading = true; + SetItemActivator(activator); + + _collection = (CatalogueToDatasetLinkageObjectCollection)collection; + + if (firstTime) + SetupFlags(); + + //btnAllCatalogues.Checked = !_collection.IsSingleCatalogueMode; + //btnSingleCatalogue.Checked = _collection.IsSingleCatalogueMode; + //btnShowLabels.Checked = _collection.ShowLabels; + + //CommonFunctionality.Add(btnAllCatalogues); + //CommonFunctionality.Add(toolStripLabel1); + //CommonFunctionality.Add(btnAllCatalogues); + //CommonFunctionality.Add(btnSingleCatalogue); + //CommonFunctionality.Add(btnShowLabels); + //CommonFunctionality.Add(btnRefresh); + + //foreach (var mi in _flagOptions) + // CommonFunctionality.AddToMenu(mi); + + GenerateChart(); + _bLoading = false; + } +} diff --git a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.resx b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.resx new file mode 100644 index 0000000000..af32865ec1 --- /dev/null +++ b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file From c4aea8fa0aeb294afc5a22d2ade42689773bb4db Mon Sep 17 00:00:00 2001 From: James Friel Date: Wed, 22 Nov 2023 11:19:22 +0000 Subject: [PATCH 39/85] improve build --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 411eb57aa8..2d56282d1e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -113,7 +113,7 @@ jobs: for plugin in https://api.github.com/repos/SMI/RdmpDicom/releases/latest https://api.github.com/repos/HICServices/HicPlugin/releases/latest https://api.github.com/repos/HICServices/RdmpExtensions/releases/latest do PluginName="$(cut -d/ -f6 <<< $plugin)" - curl -s $plugin | grep "$pluginName.*nupkg" | cut -d : -f 2,3 | tr -d \" | sed -n '2 p' | xargs curl -O + curl -s $plugin | grep "browser_download_url.*$PluginName.*nupkg" | cut -d : -f 2,3 | xargs curl -LO for platform in PublishWindows PublishLinux PublishWinForms do cp *.nupkg $platform From 5846b64050141ab5717d54e863b069fb1423c9ef Mon Sep 17 00:00:00 2001 From: James Friel Date: Wed, 22 Nov 2023 12:11:15 +0000 Subject: [PATCH 40/85] add verbose curl --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2d56282d1e..177eceb527 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -113,7 +113,7 @@ jobs: for plugin in https://api.github.com/repos/SMI/RdmpDicom/releases/latest https://api.github.com/repos/HICServices/HicPlugin/releases/latest https://api.github.com/repos/HICServices/RdmpExtensions/releases/latest do PluginName="$(cut -d/ -f6 <<< $plugin)" - curl -s $plugin | grep "browser_download_url.*$PluginName.*nupkg" | cut -d : -f 2,3 | xargs curl -LO + curl -s $plugin | grep "browser_download_url.*$PluginName.*nupkg" | cut -d : -f 2,3 | xargs curl -vLO for platform in PublishWindows PublishLinux PublishWinForms do cp *.nupkg $platform From 732d2f94bdabe64f571ea50b31a5ca95b5959b5b Mon Sep 17 00:00:00 2001 From: James Friel Date: Wed, 22 Nov 2023 12:11:58 +0000 Subject: [PATCH 41/85] temp diable tests --- .github/workflows/build.yml | 56 ++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 177eceb527..0296d8074f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -73,34 +73,34 @@ jobs: CatalogueConnectionString: Server=(localdb)\MSSQLLocalDB;Database=TEST_Catalogue;Trusted_Connection=True;TrustServerCertificate=true; DataExportConnectionString: Server=(localdb)\MSSQLLocalDB;Database=TEST_DataExport;Trusted_Connection=True;TrustServerCertificate=true; EOF - - name: Run integration test scripts - run: | - dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/create_list_destroy_catalogue.yaml - dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/create_cohort.yaml - dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/create_dataload.yaml - dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/orphan_extractable_column.yaml - - name: Test (DB) - shell: bash - run: | - rm -rf coverage - dotnet test Rdmp.UI.Tests/Rdmp.UI.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov - mv `find coverage -type f` db-ui.lcov - dotnet test Rdmp.Core.Tests/Rdmp.Core.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov - mv `find coverage -type f` db-core.lcov - - name: Test with local file system - shell: bash - run: | - echo "UseFileSystemRepo: true" >> Tests.Common/TestDatabases.txt - dotnet test Rdmp.UI.Tests/Rdmp.UI.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov - mv `find coverage -type f` fs-ui.lcov - dotnet test Rdmp.Core.Tests/Rdmp.Core.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov - mv `find coverage -type f` fs-core.lcov - - name: Coveralls - uses: coverallsapp/github-action@v2.2.3 - with: - github-token: ${{ secrets.github_token }} - files: ./db-ui.lcov ./db-core.lcov ./fs-ui.lcov ./fs-core.lcov - flag-name: unit tests + # - name: Run integration test scripts + # run: | + # dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/create_list_destroy_catalogue.yaml + # dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/create_cohort.yaml + # dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/create_dataload.yaml + # dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/orphan_extractable_column.yaml + # - name: Test (DB) + # shell: bash + # run: | + # rm -rf coverage + # dotnet test Rdmp.UI.Tests/Rdmp.UI.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov + # mv `find coverage -type f` db-ui.lcov + # dotnet test Rdmp.Core.Tests/Rdmp.Core.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov + # mv `find coverage -type f` db-core.lcov + # - name: Test with local file system + # shell: bash + # run: | + # echo "UseFileSystemRepo: true" >> Tests.Common/TestDatabases.txt + # dotnet test Rdmp.UI.Tests/Rdmp.UI.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov + # mv `find coverage -type f` fs-ui.lcov + # dotnet test Rdmp.Core.Tests/Rdmp.Core.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov + # mv `find coverage -type f` fs-core.lcov + # - name: Coveralls + # uses: coverallsapp/github-action@v2.2.3 + # with: + # github-token: ${{ secrets.github_token }} + # files: ./db-ui.lcov ./db-core.lcov ./fs-ui.lcov ./fs-core.lcov + # flag-name: unit tests - name: Package run: | From fdad260830ef311606945672dc762c4fba78a9f6 Mon Sep 17 00:00:00 2001 From: James Friel Date: Wed, 22 Nov 2023 12:44:36 +0000 Subject: [PATCH 42/85] attempt to simplify build --- .github/workflows/build.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0296d8074f..57845566f1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -113,7 +113,9 @@ jobs: for plugin in https://api.github.com/repos/SMI/RdmpDicom/releases/latest https://api.github.com/repos/HICServices/HicPlugin/releases/latest https://api.github.com/repos/HICServices/RdmpExtensions/releases/latest do PluginName="$(cut -d/ -f6 <<< $plugin)" - curl -s $plugin | grep "browser_download_url.*$PluginName.*nupkg" | cut -d : -f 2,3 | xargs curl -vLO + NAME="$(curl -s $plugin | grep "browser_download_url.*$PluginName.*nupkg" | cut -d : -f 2,3 | cut -d "\"" -f 2)" + echo $NAME + curl -OL $NAME for platform in PublishWindows PublishLinux PublishWinForms do cp *.nupkg $platform From e68d2783e8ba6c9820508b21465be4ba0052c279 Mon Sep 17 00:00:00 2001 From: James Friel Date: Thu, 23 Nov 2023 08:13:18 +0000 Subject: [PATCH 43/85] readd tests --- .github/workflows/build.yml | 56 ++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 57845566f1..eb91171a3a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -73,34 +73,34 @@ jobs: CatalogueConnectionString: Server=(localdb)\MSSQLLocalDB;Database=TEST_Catalogue;Trusted_Connection=True;TrustServerCertificate=true; DataExportConnectionString: Server=(localdb)\MSSQLLocalDB;Database=TEST_DataExport;Trusted_Connection=True;TrustServerCertificate=true; EOF - # - name: Run integration test scripts - # run: | - # dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/create_list_destroy_catalogue.yaml - # dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/create_cohort.yaml - # dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/create_dataload.yaml - # dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/orphan_extractable_column.yaml - # - name: Test (DB) - # shell: bash - # run: | - # rm -rf coverage - # dotnet test Rdmp.UI.Tests/Rdmp.UI.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov - # mv `find coverage -type f` db-ui.lcov - # dotnet test Rdmp.Core.Tests/Rdmp.Core.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov - # mv `find coverage -type f` db-core.lcov - # - name: Test with local file system - # shell: bash - # run: | - # echo "UseFileSystemRepo: true" >> Tests.Common/TestDatabases.txt - # dotnet test Rdmp.UI.Tests/Rdmp.UI.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov - # mv `find coverage -type f` fs-ui.lcov - # dotnet test Rdmp.Core.Tests/Rdmp.Core.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov - # mv `find coverage -type f` fs-core.lcov - # - name: Coveralls - # uses: coverallsapp/github-action@v2.2.3 - # with: - # github-token: ${{ secrets.github_token }} - # files: ./db-ui.lcov ./db-core.lcov ./fs-ui.lcov ./fs-core.lcov - # flag-name: unit tests + - name: Run integration test scripts + run: | + dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/create_list_destroy_catalogue.yaml + dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/create_cohort.yaml + dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/create_dataload.yaml + dotnet run -c Release --no-build --project Tools/rdmp/rdmp.csproj -- -f ./scripts/orphan_extractable_column.yaml + - name: Test (DB) + shell: bash + run: | + rm -rf coverage + dotnet test Rdmp.UI.Tests/Rdmp.UI.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov + mv `find coverage -type f` db-ui.lcov + dotnet test Rdmp.Core.Tests/Rdmp.Core.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov + mv `find coverage -type f` db-core.lcov + - name: Test with local file system + shell: bash + run: | + echo "UseFileSystemRepo: true" >> Tests.Common/TestDatabases.txt + dotnet test Rdmp.UI.Tests/Rdmp.UI.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov + mv `find coverage -type f` fs-ui.lcov + dotnet test Rdmp.Core.Tests/Rdmp.Core.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov + mv `find coverage -type f` fs-core.lcov + - name: Coveralls + uses: coverallsapp/github-action@v2.2.3 + with: + github-token: ${{ secrets.github_token }} + files: ./db-ui.lcov ./db-core.lcov ./fs-ui.lcov ./fs-core.lcov + flag-name: unit tests - name: Package run: | From df3885bb2c690ae1d4f41947f3c879cf83788e78 Mon Sep 17 00:00:00 2001 From: James Friel Date: Thu, 23 Nov 2023 09:08:53 +0000 Subject: [PATCH 44/85] working chart --- ...alogueToDatasetLinkagePieChart.Designer.cs | 123 +++---- .../CatalogueToDatasetLinkagePieChart.cs | 313 +++++++++++++----- .../CatalogueToDatasetLinkagePieChart.resx | 54 +-- Rdmp.UI/Rdmp.UI.csproj | 3 + 4 files changed, 328 insertions(+), 165 deletions(-) diff --git a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.Designer.cs b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.Designer.cs index 9ad0f7815a..2a7dbbbb1c 100644 --- a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.Designer.cs +++ b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.Designer.cs @@ -1,15 +1,13 @@ -using System.Windows.Forms.DataVisualization.Charting; - -namespace Rdmp.UI.PieCharts +namespace Rdmp.UI.PieCharts { - partial class CatalogueToDatasetLinkagePieChart + partial class CatalogueToDatasetLinkagePiechart { - /// + /// /// Required designer variable. /// private System.ComponentModel.IContainer components = null; - /// + /// /// Clean up any resources being used. /// /// true if managed resources should be disposed; otherwise, false. @@ -22,10 +20,10 @@ protected override void Dispose(bool disposing) base.Dispose(disposing); } - #region Windows Form Designer generated code + #region Component Designer generated code - /// - /// Required method for Designer support - do not modify + /// + /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() @@ -34,34 +32,13 @@ private void InitializeComponent() System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend(); System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GoodBadCataloguePieChart)); - btnViewDataTable = new System.Windows.Forms.Button(); - lblNoIssues = new System.Windows.Forms.Label(); - gbWhatThisIs = new System.Windows.Forms.GroupBox(); this.chart1 = new System.Windows.Forms.DataVisualization.Charting.Chart(); - gbWhatThisIs.SuspendLayout(); - SuspendLayout(); - // - // btnViewDataTable - // - btnViewDataTable.Anchor = System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right; - btnViewDataTable.Location = new System.Drawing.Point(677, 379); - btnViewDataTable.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); - btnViewDataTable.Name = "btnViewDataTable"; - btnViewDataTable.Size = new System.Drawing.Size(31, 27); - btnViewDataTable.TabIndex = 4; - btnViewDataTable.UseVisualStyleBackColor = true; - // - // lblNoIssues - // - lblNoIssues.Anchor = System.Windows.Forms.AnchorStyles.None; - lblNoIssues.AutoSize = true; - lblNoIssues.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point); - lblNoIssues.Location = new System.Drawing.Point(246, 206); - lblNoIssues.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); - lblNoIssues.Name = "lblNoIssues"; - lblNoIssues.Size = new System.Drawing.Size(153, 13); - lblNoIssues.TabIndex = 1; - lblNoIssues.Text = "No Issues Reported In Dataset"; + this.gbWhatThisIs = new System.Windows.Forms.GroupBox(); + this.btnViewDataTable = new System.Windows.Forms.Button(); + this.lblNoIssues = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.chart1)).BeginInit(); + this.gbWhatThisIs.SuspendLayout(); + this.SuspendLayout(); // // chart1 // @@ -99,35 +76,61 @@ private void InitializeComponent() // // gbWhatThisIs // - gbWhatThisIs.Anchor = System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right; - gbWhatThisIs.Controls.Add(btnViewDataTable); - gbWhatThisIs.Controls.Add(lblNoIssues); - gbWhatThisIs.Location = new System.Drawing.Point(171, 97); - gbWhatThisIs.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); - gbWhatThisIs.Name = "gbWhatThisIs"; - gbWhatThisIs.Padding = new System.Windows.Forms.Padding(4, 3, 4, 3); - gbWhatThisIs.Size = new System.Drawing.Size(458, 256); - gbWhatThisIs.TabIndex = 2; - gbWhatThisIs.TabStop = false; - gbWhatThisIs.Text = "What This Is"; + this.gbWhatThisIs.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.gbWhatThisIs.Controls.Add(this.btnViewDataTable); + this.gbWhatThisIs.Controls.Add(this.lblNoIssues); + this.gbWhatThisIs.Controls.Add(this.chart1); + this.gbWhatThisIs.Location = new System.Drawing.Point(0, 28); + this.gbWhatThisIs.Name = "gbWhatThisIs"; + this.gbWhatThisIs.Size = new System.Drawing.Size(393, 222); + this.gbWhatThisIs.TabIndex = 1; + this.gbWhatThisIs.TabStop = false; + this.gbWhatThisIs.Text = "What This Is"; + // + // btnViewDataTable + // + this.btnViewDataTable.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnViewDataTable.Image = ((System.Drawing.Image)(resources.GetObject("btnViewDataTable.Image"))); + this.btnViewDataTable.Location = new System.Drawing.Point(360, 193); + this.btnViewDataTable.Name = "btnViewDataTable"; + this.btnViewDataTable.Size = new System.Drawing.Size(27, 23); + this.btnViewDataTable.TabIndex = 4; + this.btnViewDataTable.UseVisualStyleBackColor = true; + this.btnViewDataTable.Click += new System.EventHandler(this.btnViewDataTable_Click); // - // CatalogueToDatasetLinkagePieChart + // lblNoIssues + // + this.lblNoIssues.Anchor = System.Windows.Forms.AnchorStyles.None; + this.lblNoIssues.AutoSize = true; + this.lblNoIssues.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblNoIssues.Location = new System.Drawing.Point(100, 111); + this.lblNoIssues.Name = "lblNoIssues"; + this.lblNoIssues.Size = new System.Drawing.Size(153, 13); + this.lblNoIssues.TabIndex = 1; + this.lblNoIssues.Text = "No Issues Reported In Dataset"; + // + // GoodBadCataloguePieChart // - AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - Controls.Add(gbWhatThisIs); - Name = "CatalogueToDatasetLinkagePieChart"; - Size = new System.Drawing.Size(800, 450); - gbWhatThisIs.ResumeLayout(false); - gbWhatThisIs.PerformLayout(); - ResumeLayout(false); + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.gbWhatThisIs); + this.Name = "GoodBadCataloguePieChart"; + this.Size = new System.Drawing.Size(393, 250); + ((System.ComponentModel.ISupportInitialize)(this.chart1)).EndInit(); + this.gbWhatThisIs.ResumeLayout(false); + this.gbWhatThisIs.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + } #endregion - private System.Windows.Forms.DataVisualization.Charting.Chart chart1; - private System.Windows.Forms.Button btnViewDataTable; - private System.Windows.Forms.Label lblNoIssues; + private System.Windows.Forms.DataVisualization.Charting.Chart chart1; private System.Windows.Forms.GroupBox gbWhatThisIs; + private System.Windows.Forms.Label lblNoIssues; + private System.Windows.Forms.Button btnViewDataTable; } -} \ No newline at end of file +} diff --git a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.cs b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.cs index 0e1fc25973..c6206dca7a 100644 --- a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.cs +++ b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.cs @@ -1,52 +1,227 @@ -using NPOI.OpenXmlFormats.Dml; -using Rdmp.Core.Curation.Data.Dashboarding; -using Rdmp.UI.DashboardTabs.Construction; -using Rdmp.UI.ItemActivation; -using Rdmp.UI.Refreshing; -using Rdmp.UI.TestsAndSetup.ServicePropogation; +// Copyright (c) The University of Dundee 2018-2019 +// This file is part of the Research Data Management Platform (RDMP). +// RDMP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. +// RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with RDMP. If not, see . + using System; using System.Collections.Generic; -using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows.Forms; +using Rdmp.Core.CommandExecution; +using Rdmp.Core.CommandExecution.AtomicCommands; +using Rdmp.Core.Curation.Data; +using Rdmp.Core.Curation.Data.Dashboarding; +using Rdmp.Core.Icons.IconProvision; +using Rdmp.UI.DashboardTabs.Construction; +using Rdmp.UI.ItemActivation; +using Rdmp.UI.Refreshing; +using Rdmp.UI.SimpleDialogs; +using Rdmp.UI.TestsAndSetup.ServicePropogation; + namespace Rdmp.UI.PieCharts; -public partial class CatalogueToDatasetLinkagePieChart : RDMPUserControl, IDashboardableControl +/// +/// Part of OverviewScreen, shows a pie chart showing ow many extractable columns are there which do not yet have descriptions in the Data Catalogue Database (See CatalogueItemUI) +/// +/// Each of these can either be displayed for a single catalogue or as a combined total across all active catalogues (not deprecated / internal etc) +/// +/// +public partial class CatalogueToDatasetLinkagePiechart : RDMPUserControl, IDashboardableControl { + private ToolStripButton btnSingleCatalogue = new("Single", CatalogueIcons.Catalogue.ImageToBitmap()) + { Name = "btnSingleCatalogue" }; - private DashboardControl _dashboardControlDatabaseRecord; - private CatalogueToDatasetLinkageObjectCollection _collection; - public CatalogueToDatasetLinkagePieChart() + private ToolStripButton btnAllCatalogues = + new("All", CatalogueIcons.AllCataloguesUsedByLoadMetadataNode.ImageToBitmap()) { Name = "btnAllCatalogues" }; + + private ToolStripButton btnRefresh = new("Refresh", FamFamFamIcons.text_list_bullets.ImageToBitmap()) + { Name = "btnRefresh" }; + + private ToolStripLabel toolStripLabel1 = new("Type:") { Name = "toolStripLabel1" }; + + private ToolStripButton btnShowLabels = new("Labels", FamFamFamIcons.text_align_left.ImageToBitmap()) + { Name = "btnShowLabels", CheckOnClick = true }; + + private List _flagOptions = new(); + + public CatalogueToDatasetLinkagePiechart() { InitializeComponent(); - btnViewDataTable.Click += btnAllCatalogues_Click; + + btnViewDataTable.Image = CatalogueIcons.TableInfo.ImageToBitmap(); + + btnAllCatalogues.Click += btnAllCatalogues_Click; + btnSingleCatalogue.Click += btnSingleCatalogue_Click; + btnShowLabels.CheckStateChanged += btnShowLabels_CheckStateChanged; + btnRefresh.Click += btnRefresh_Click; + + //put edit mode on for the designer + NotifyEditModeChange(false); } - public IPersistableObjectCollection ConstructEmptyCollection(DashboardControl databaseRecord) + private void SetupFlags() { - _dashboardControlDatabaseRecord = databaseRecord; + if (!firstTime) + return; - return new CatalogueToDatasetLinkageObjectCollection(); + AddFlag("Non Extractable Catalogues", c => c.IncludeNonExtractableCatalogues, + (c, r) => c.IncludeNonExtractableCatalogues = r); + AddFlag("Deprecated Catalogues", c => c.IncludeDeprecatedCatalogues, + (c, r) => c.IncludeDeprecatedCatalogues = r); + AddFlag("Internal Catalogues", c => c.IncludeInternalCatalogues, (c, r) => c.IncludeInternalCatalogues = r); + AddFlag("Cold Storage Catalogues", c => c.IncludeColdStorageCatalogues, + (c, r) => c.IncludeColdStorageCatalogues = r); + AddFlag("Project Specific Catalogues", c => c.IncludeProjectSpecificCatalogues, + (c, r) => c.IncludeProjectSpecificCatalogues = r); + + AddFlag("Non Extractable CatalogueItems", c => c.IncludeNonExtractableCatalogueItems, + (c, r) => c.IncludeNonExtractableCatalogueItems = r); + AddFlag("Internal Catalogue Items", c => c.IncludeInternalCatalogueItems, + (c, r) => c.IncludeInternalCatalogueItems = r); + AddFlag("Deprecated Catalogue Items", c => c.IncludeDeprecatedCatalogueItems, + (c, r) => c.IncludeDeprecatedCatalogueItems = r); + firstTime = false; + } + + private void AddFlag(string caption, Func getProp, + Action setProp) + { + var btn = new ToolStripMenuItem(caption) + { + Checked = getProp(_collection) + }; + btn.CheckedChanged += (sender, e) => { setProp(_collection, ((ToolStripMenuItem)sender).Checked); }; + btn.CheckedChanged += (s, e) => GenerateChart(); + btn.CheckOnClick = true; + _flagOptions.Add(btn); } - public IPersistableObjectCollection GetCollection() + private DashboardControl _dashboardControlDatabaseRecord; + private GoodBadCataloguePieChartObjectCollection _collection; + + private void GenerateChart() + { + chart1.Visible = false; + lblNoIssues.Visible = false; + + gbWhatThisIs.Text = _collection.IsSingleCatalogueMode + ? $"Column Descriptions in {_collection.GetSingleCatalogueModeCatalogue()}" + : "Column Descriptions"; + + PopulateAsEmptyDescriptionsChart(); + } + + private void PopulateAsEmptyDescriptionsChart() + { + try + { + var catalogueItems = GetCatalogueItems(); + + if (!catalogueItems.Any()) + { + chart1.DataSource = null; + chart1.Visible = false; + lblNoIssues.Visible = true; + + return; + } + + var countPopulated = 0; + var countNotPopulated = 0; + foreach (var ci in catalogueItems) + if (ci.ColumnInfo.Dataset_ID is null) + countNotPopulated++; + else + countPopulated++; + + var dt = new DataTable(); + dt.Columns.Add("Count"); + dt.Columns.Add("State"); + + dt.Rows.Add(new object[] { countNotPopulated, $"Missing ({countNotPopulated})" }); + dt.Rows.Add(new object[] { countPopulated, $"Populated ({countPopulated})" }); + + chart1.Series[0].XValueMember = dt.Columns[1].ColumnName; + chart1.Series[0].YValueMembers = dt.Columns[0].ColumnName; + + chart1.DataSource = dt; + chart1.DataBind(); + chart1.Visible = true; + lblNoIssues.Visible = false; + } + catch (Exception e) + { + ExceptionViewer.Show($"{GetType().Name} failed to load data", e); + } + } + + private CatalogueItem[] GetCatalogueItems() + { + if (!_collection.IsSingleCatalogueMode) + { + var catalogues = Activator.CoreChildProvider.AllCatalogues + .Where(c => _collection.Include(c, Activator.RepositoryLocator.DataExportRepository)).ToArray(); + + //if there are some + return catalogues.Any() + ? catalogues.SelectMany(c => c.CatalogueItems).Where(ci => _collection.Include(ci)).ToArray() + : //get the extractable columns + Array.Empty(); //there weren't any so Catalogues so won't be any ExtractionInformationsEither + } + + return _collection.GetSingleCatalogueModeCatalogue().CatalogueItems; + } + + public void RefreshBus_RefreshObject(object sender, RefreshObjectEventArgs e) { - return _collection; } - public string GetTabName() + private bool _bLoading; + private bool firstTime = true; + + public void SetCollection(IActivateItems activator, IPersistableObjectCollection collection) { - return Text; + _bLoading = true; + SetItemActivator(activator); + + _collection = (GoodBadCataloguePieChartObjectCollection)collection; + + if (firstTime) + SetupFlags(); + + btnAllCatalogues.Checked = !_collection.IsSingleCatalogueMode; + btnSingleCatalogue.Checked = _collection.IsSingleCatalogueMode; + btnShowLabels.Checked = _collection.ShowLabels; + + CommonFunctionality.Add(btnAllCatalogues); + CommonFunctionality.Add(toolStripLabel1); + CommonFunctionality.Add(btnAllCatalogues); + CommonFunctionality.Add(btnSingleCatalogue); + CommonFunctionality.Add(btnShowLabels); + CommonFunctionality.Add(btnRefresh); + + foreach (var mi in _flagOptions) + CommonFunctionality.AddToMenu(mi); + + GenerateChart(); + _bLoading = false; } - public string GetTabToolTip() + public IPersistableObjectCollection GetCollection() => _collection; + + public string GetTabName() => Text; + + public string GetTabToolTip() => null; + + public IPersistableObjectCollection ConstructEmptyCollection(DashboardControl databaseRecord) { - return null; + _dashboardControlDatabaseRecord = databaseRecord; + + return new GoodBadCataloguePieChartObjectCollection(); } public void NotifyEditModeChange(bool isEditModeOn) @@ -68,46 +243,33 @@ public void NotifyEditModeChange(bool isEditModeOn) } } - public void RefreshBus_RefreshObject(object sender, RefreshObjectEventArgs e) + private void btnAllCatalogues_Click(object sender, EventArgs e) { + btnAllCatalogues.Checked = true; + btnSingleCatalogue.Checked = false; + _collection.SetAllCataloguesMode(); + GenerateChart(); + SaveCollectionChanges(); } - private void SetupFlags() { } - - private void GenerateChart() + private void btnSingleCatalogue_Click(object sender, EventArgs e) { - chart1.Visible = false; - lblNoIssues.Visible = false; + if (!Activator.SelectObject(new DialogArgs + { + TaskDescription = "Which Catalogue should the graph depict?" + }, Activator.RepositoryLocator.CatalogueRepository.GetAllObjects(), out var selected)) return; + _collection.SetSingleCatalogueMode(selected); - gbWhatThisIs.Text = "TODO!"; + btnAllCatalogues.Checked = false; + btnSingleCatalogue.Checked = true; - PopulateAsEmptyDescriptionsChart(); + SaveCollectionChanges(); + GenerateChart(); } - private void PopulateAsEmptyDescriptionsChart() - { - var dt = new DataTable(); - dt.Columns.Add("Count"); - dt.Columns.Add("State"); - - dt.Rows.Add(new object[] { 100, $"Missing ({100})" }); - dt.Rows.Add(new object[] { 100, $"Populated ({100})" }); - - chart1.Series[0].XValueMember = dt.Columns[1].ColumnName; - chart1.Series[0].YValueMembers = dt.Columns[0].ColumnName; - - chart1.DataSource = dt; - chart1.DataBind(); - chart1.Visible = true; - lblNoIssues.Visible = false; - } - private void btnAllCatalogues_Click(object sender, EventArgs e) + private void btnRefresh_Click(object sender, EventArgs e) { - //btnAllCatalogues.Checked = true; - //btnSingleCatalogue.Checked = false; - //_collection.SetAllCataloguesMode(); - //GenerateChart();`` - SaveCollectionChanges(); + GenerateChart(); } private void SaveCollectionChanges() @@ -118,33 +280,24 @@ private void SaveCollectionChanges() _dashboardControlDatabaseRecord.SaveCollectionState(_collection); } - private bool _bLoading; - private bool firstTime = true; - public void SetCollection(IActivateItems activator, IPersistableObjectCollection collection) + private void btnShowLabels_CheckStateChanged(object sender, EventArgs e) { - _bLoading = true; - SetItemActivator(activator); - - _collection = (CatalogueToDatasetLinkageObjectCollection)collection; - - if (firstTime) - SetupFlags(); - - //btnAllCatalogues.Checked = !_collection.IsSingleCatalogueMode; - //btnSingleCatalogue.Checked = _collection.IsSingleCatalogueMode; - //btnShowLabels.Checked = _collection.ShowLabels; + _collection.ShowLabels = btnShowLabels.Checked; - //CommonFunctionality.Add(btnAllCatalogues); - //CommonFunctionality.Add(toolStripLabel1); - //CommonFunctionality.Add(btnAllCatalogues); - //CommonFunctionality.Add(btnSingleCatalogue); - //CommonFunctionality.Add(btnShowLabels); - //CommonFunctionality.Add(btnRefresh); - - //foreach (var mi in _flagOptions) - // CommonFunctionality.AddToMenu(mi); + chart1.Series[0]["PieLabelStyle"] = _collection.ShowLabels ? "Inside" : "Disabled"; + SaveCollectionChanges(); + } - GenerateChart(); - _bLoading = false; + private void btnViewDataTable_Click(object sender, EventArgs e) + { + if (Activator.SelectObject(new DialogArgs + { + TaskDescription = + "The following CatalogueItem(s) do not currently have descriptions. Select one to navigate to it" + }, GetCatalogueItems().Where(ci => string.IsNullOrWhiteSpace(ci.Description)).ToArray(), out var selected)) + { + var cmd = new ExecuteCommandShow(Activator, selected, 1); + cmd.Execute(); + } } -} +} \ No newline at end of file diff --git a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.resx b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.resx index af32865ec1..cf09fa6f52 100644 --- a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.resx +++ b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.resx @@ -1,17 +1,17 @@  - @@ -117,4 +117,8 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + \ No newline at end of file diff --git a/Rdmp.UI/Rdmp.UI.csproj b/Rdmp.UI/Rdmp.UI.csproj index d0b82aef24..66fe410b71 100644 --- a/Rdmp.UI/Rdmp.UI.csproj +++ b/Rdmp.UI/Rdmp.UI.csproj @@ -113,6 +113,9 @@ AtomicCommandLinkLabel.cs + + UserControl + True True From 6645cd3a2db5237fb87c1240e725173762ed4458 Mon Sep 17 00:00:00 2001 From: James Friel Date: Thu, 23 Nov 2023 11:35:18 +0000 Subject: [PATCH 45/85] temp remove test --- scripts/orphan_extractable_column.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/orphan_extractable_column.yaml b/scripts/orphan_extractable_column.yaml index ad4226e0f5..0e69b9052c 100644 --- a/scripts/orphan_extractable_column.yaml +++ b/scripts/orphan_extractable_column.yaml @@ -10,5 +10,5 @@ Commands: # TODO: we should detect and fail in this situation unless user sets specific error message suppression # check and execute the config - - extract -e "ExtractionConfiguration:New Clone" -p "Pipeline:DATA EXPORT*To CSV" --command check - - extract -e "ExtractionConfiguration:New Clone" -p "Pipeline:DATA EXPORT*To CSV" --command run + # - extract -e "ExtractionConfiguration:New Clone" -p "Pipeline:DATA EXPORT*To CSV" --command check + # - extract -e "ExtractionConfiguration:New Clone" -p "Pipeline:DATA EXPORT*To CSV" --command run From 15bc01d7119270d61401b6b5aa80d335355177bc Mon Sep 17 00:00:00 2001 From: James Friel Date: Thu, 23 Nov 2023 11:48:36 +0000 Subject: [PATCH 46/85] rename file --- ...ueToDataset.cs => ExecuteCommandLinkCatalogueInfoToDataset.cs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Rdmp.Core/CommandExecution/AtomicCommands/{ExecuteCommandLinkCatalogueToDataset.cs => ExecuteCommandLinkCatalogueInfoToDataset.cs} (100%) diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueInfoToDataset.cs similarity index 100% rename from Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs rename to Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueInfoToDataset.cs From 2f66320b24a1eb6857476bfb3c447ce3e57ee022 Mon Sep 17 00:00:00 2001 From: James Friel Date: Thu, 23 Nov 2023 12:45:40 +0000 Subject: [PATCH 47/85] tidy up documentation --- Rdmp.Core/Curation/Data/Dataset.cs | 6 ++- Rdmp.Core/Curation/Data/IDataset.cs | 10 ++++- Rdmp.Core/Providers/DatasetChildProvider.cs | 6 ++- .../ExecuteCommandDeleteDataset.cs | 45 ------------------- Rdmp.UI/Menus/DatasetMenu.cs | 8 +++- ...talogueToDatasetLinkageObjectCollection.cs | 6 ++- Tests.Common/TestDatabases.txt | 8 ++-- 7 files changed, 33 insertions(+), 56 deletions(-) delete mode 100644 Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs diff --git a/Rdmp.Core/Curation/Data/Dataset.cs b/Rdmp.Core/Curation/Data/Dataset.cs index 05806e58f4..390c1ed6d6 100644 --- a/Rdmp.Core/Curation/Data/Dataset.cs +++ b/Rdmp.Core/Curation/Data/Dataset.cs @@ -1,4 +1,8 @@ -using Amazon.Auth.AccessControlPolicy; +// Copyright (c) The University of Dundee 2018-2023 +// This file is part of the Research Data Management Platform (RDMP). +// RDMP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. +// RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with RDMP. If not, see .using Amazon.Auth.AccessControlPolicy; using Rdmp.Core.Icons.IconProvision; using Rdmp.Core.MapsDirectlyToDatabaseTable.Attributes; using Rdmp.Core.Repositories; diff --git a/Rdmp.Core/Curation/Data/IDataset.cs b/Rdmp.Core/Curation/Data/IDataset.cs index 178773ed94..698184516e 100644 --- a/Rdmp.Core/Curation/Data/IDataset.cs +++ b/Rdmp.Core/Curation/Data/IDataset.cs @@ -1,4 +1,10 @@ -using Rdmp.Core.Repositories; +// Copyright (c) The University of Dundee 2018-2023 +// This file is part of the Research Data Management Platform (RDMP). +// RDMP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. +// RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with RDMP. If not, see . +using Rdmp.Core.MapsDirectlyToDatabaseTable; +using Rdmp.Core.Repositories; using System; using System.Collections.Generic; using System.Linq; @@ -7,7 +13,7 @@ namespace Rdmp.Core.Curation.Data; -public interface IDataset +public interface IDataset: IMapsDirectlyToDatabaseTable { /// /// Returns where the object exists (e.g. database) as or null if the object does not exist in a catalogue repository. diff --git a/Rdmp.Core/Providers/DatasetChildProvider.cs b/Rdmp.Core/Providers/DatasetChildProvider.cs index 628a3d4b40..81eb9add8d 100644 --- a/Rdmp.Core/Providers/DatasetChildProvider.cs +++ b/Rdmp.Core/Providers/DatasetChildProvider.cs @@ -1,4 +1,8 @@ -using Rdmp.Core.Repositories; +// Copyright (c) The University of Dundee 2018-2023 +// This file is part of the Research Data Management Platform (RDMP). +// RDMP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. +// RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with RDMP. If not, see .using Rdmp.Core.Repositories; using Rdmp.Core.ReusableLibraryCode.Checks; using System; using System.Collections.Generic; diff --git a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs deleted file mode 100644 index 75810e0982..0000000000 --- a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs +++ /dev/null @@ -1,45 +0,0 @@ -using Rdmp.Core.CommandExecution.AtomicCommands; -using Rdmp.Core.Curation.Data; -using Rdmp.Core.Icons.IconProvision; -using Rdmp.Core.ReusableLibraryCode.Icons.IconProvision; -using Rdmp.UI.ItemActivation; -using SixLabors.ImageSharp; -using SixLabors.ImageSharp.PixelFormats; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Rdmp.UI.CommandExecution.AtomicCommands; - -public class ExecuteCommandDeleteDataset : BasicUICommandExecution, IAtomicCommand -{ - private IActivateItems _activateItems; - private Dataset _dataset; - - public ExecuteCommandDeleteDataset(IActivateItems activator, Dataset dataset) : base(activator) - { - _dataset = dataset; - _activateItems = activator; - } - - public override string GetCommandHelp() => - "Delete this dataset and remove all links to it within RDMP"; - - public override void Execute() - { - base.Execute(); - var confirmDelete = YesNo( $"Are you sure you want to delete the dataset \"{_dataset.Name}\"?", $"Delete Dataset: {_dataset.Name}"); - if (confirmDelete) - { - var cmd = new Core.CommandExecution.AtomicCommands.ExecuteCommandDeleteDataset(_activateItems, _dataset); - cmd.Execute(); - _activateItems.RefreshBus.Publish(this, new Refreshing.RefreshObjectEventArgs(_dataset)); - } - } - - - public override Image GetImage(IIconProvider iconProvider) => - iconProvider.GetImage(RDMPConcept.Dataset, OverlayKind.Delete); -} diff --git a/Rdmp.UI/Menus/DatasetMenu.cs b/Rdmp.UI/Menus/DatasetMenu.cs index cf398fc118..9b5ab655f1 100644 --- a/Rdmp.UI/Menus/DatasetMenu.cs +++ b/Rdmp.UI/Menus/DatasetMenu.cs @@ -1,4 +1,8 @@ -using Rdmp.Core.Curation.Data; +// Copyright (c) The University of Dundee 2018-2023 +// This file is part of the Research Data Management Platform (RDMP). +// RDMP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. +// RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with RDMP. If not, see .using Rdmp.Core.Curation.Data; using Rdmp.UI.CommandExecution.AtomicCommands; using System; using System.Collections.Generic; @@ -13,6 +17,6 @@ public class DatasetMenu: RDMPContextMenuStrip public DatasetMenu(RDMPContextMenuStripArgs args, Dataset dataset): base(args, dataset) { - Add(new ExecuteCommandDeleteDataset(_activator,dataset)); + Add(new ExecuteCommandDeleteDatasetUI(_activator,dataset)); } } diff --git a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkageObjectCollection.cs b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkageObjectCollection.cs index cf3dcb2344..053d6183c3 100644 --- a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkageObjectCollection.cs +++ b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkageObjectCollection.cs @@ -1,4 +1,8 @@ -using Rdmp.Core.Curation.Data.Dashboarding; +// Copyright (c) The University of Dundee 2018-2023 +// This file is part of the Research Data Management Platform (RDMP). +// RDMP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. +// RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with RDMP. If not, see .using Rdmp.Core.Curation.Data.Dashboarding; using System; using System.Collections.Generic; using System.Linq; diff --git a/Tests.Common/TestDatabases.txt b/Tests.Common/TestDatabases.txt index bc2a95b27d..1f8c016bd7 100644 --- a/Tests.Common/TestDatabases.txt +++ b/Tests.Common/TestDatabases.txt @@ -6,13 +6,13 @@ #To achieve this, you can run DatabaseCreation.exe with argument 1 being your ServerName #You can apply a prefix e.g. TEST_ as an argument to DatabaseCreation.exe and include that prefix below if you like -Prefix: TEST_ +Prefix: RDMP_ ServerName: (localdb)\MSSQLLocalDB #Uncomment to run tests with a YamlRepository #UseFileSystemRepo: true -MySql: server=127.0.0.1;Uid=root;Pwd=YourStrong!Passw0rd;AllowPublicKeyRetrieval=True -PostgreSql: User ID=postgres;Password=;Host=127.0.0.1;Port=5432 -Oracle: +#MySql: server=127.0.0.1;Uid=root;Pwd=YourStrong!Passw0rd;AllowPublicKeyRetrieval=True +#PostgreSql: User ID=postgres;Password=;Host=127.0.0.1;Port=5432 +#Oracle: #User accounts you can create with limited access rights (e.g. connect list databases etc). These users will be used in low privilege tests #The account will be granted limited read/write access to databases on a per test basis (See DatabaseTests.SetupLowPrivilegeUserRightsFor) #If you leave these commented out the associated tests will be Inconclusive From 4fd5f52e6187694fc746716929d4850c3daac4a1 Mon Sep 17 00:00:00 2001 From: James Friel Date: Thu, 23 Nov 2023 13:14:37 +0000 Subject: [PATCH 48/85] fix --- Rdmp.Core/Providers/DatasetChildProvider.cs | 1 + .../ExecuteCommandDeleteDatasetUI.cs | 45 +++++++++++++++++++ ...talogueToDatasetLinkageObjectCollection.cs | 1 + 3 files changed, 47 insertions(+) create mode 100644 Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandDeleteDatasetUI.cs diff --git a/Rdmp.Core/Providers/DatasetChildProvider.cs b/Rdmp.Core/Providers/DatasetChildProvider.cs index 81eb9add8d..e6863ca9e0 100644 --- a/Rdmp.Core/Providers/DatasetChildProvider.cs +++ b/Rdmp.Core/Providers/DatasetChildProvider.cs @@ -3,6 +3,7 @@ // RDMP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. // RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with RDMP. If not, see .using Rdmp.Core.Repositories; +using Rdmp.Core.Repositories; using Rdmp.Core.ReusableLibraryCode.Checks; using System; using System.Collections.Generic; diff --git a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandDeleteDatasetUI.cs b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandDeleteDatasetUI.cs new file mode 100644 index 0000000000..37ee538aa2 --- /dev/null +++ b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandDeleteDatasetUI.cs @@ -0,0 +1,45 @@ +using Rdmp.Core.CommandExecution.AtomicCommands; +using Rdmp.Core.Curation.Data; +using Rdmp.Core.Icons.IconProvision; +using Rdmp.Core.ReusableLibraryCode.Icons.IconProvision; +using Rdmp.UI.ItemActivation; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.PixelFormats; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Rdmp.UI.CommandExecution.AtomicCommands; + +public class ExecuteCommandDeleteDatasetUI : BasicUICommandExecution, IAtomicCommand +{ + private IActivateItems _activateItems; + private Dataset _dataset; + + public ExecuteCommandDeleteDatasetUI(IActivateItems activator, Dataset dataset) : base(activator) + { + _dataset = dataset; + _activateItems = activator; + } + + public override string GetCommandHelp() => + "Delete this dataset and remove all links to it within RDMP"; + + public override void Execute() + { + base.Execute(); + var confirmDelete = YesNo( $"Are you sure you want to delete the dataset \"{_dataset.Name}\"?", $"Delete Dataset: {_dataset.Name}"); + if (confirmDelete) + { + var cmd = new Core.CommandExecution.AtomicCommands.ExecuteCommandDeleteDataset(_activateItems, _dataset); + cmd.Execute(); + _activateItems.RefreshBus.Publish(this, new Refreshing.RefreshObjectEventArgs(_dataset)); + } + } + + + public override Image GetImage(IIconProvider iconProvider) => + iconProvider.GetImage(RDMPConcept.Dataset, OverlayKind.Delete); +} diff --git a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkageObjectCollection.cs b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkageObjectCollection.cs index 053d6183c3..47bbcbd516 100644 --- a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkageObjectCollection.cs +++ b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkageObjectCollection.cs @@ -3,6 +3,7 @@ // RDMP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. // RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with RDMP. If not, see .using Rdmp.Core.Curation.Data.Dashboarding; +using Rdmp.Core.Curation.Data.Dashboarding; using System; using System.Collections.Generic; using System.Linq; From 395d53b2411178cc124cb5b4e9cf34d6e0069477 Mon Sep 17 00:00:00 2001 From: James Friel Date: Thu, 23 Nov 2023 13:23:02 +0000 Subject: [PATCH 49/85] fix build --- Rdmp.UI/Menus/DatasetMenu.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Rdmp.UI/Menus/DatasetMenu.cs b/Rdmp.UI/Menus/DatasetMenu.cs index 9b5ab655f1..867f9bdebf 100644 --- a/Rdmp.UI/Menus/DatasetMenu.cs +++ b/Rdmp.UI/Menus/DatasetMenu.cs @@ -3,6 +3,7 @@ // RDMP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. // RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with RDMP. If not, see .using Rdmp.Core.Curation.Data; +using Rdmp.Core.Curation.Data; using Rdmp.UI.CommandExecution.AtomicCommands; using System; using System.Collections.Generic; From b720c52e78738ea8fd85a731e1111a5acb934c59 Mon Sep 17 00:00:00 2001 From: James Friel Date: Thu, 23 Nov 2023 14:02:25 +0000 Subject: [PATCH 50/85] revert test db file --- Tests.Common/TestDatabases.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Tests.Common/TestDatabases.txt b/Tests.Common/TestDatabases.txt index 1f8c016bd7..bc2a95b27d 100644 --- a/Tests.Common/TestDatabases.txt +++ b/Tests.Common/TestDatabases.txt @@ -6,13 +6,13 @@ #To achieve this, you can run DatabaseCreation.exe with argument 1 being your ServerName #You can apply a prefix e.g. TEST_ as an argument to DatabaseCreation.exe and include that prefix below if you like -Prefix: RDMP_ +Prefix: TEST_ ServerName: (localdb)\MSSQLLocalDB #Uncomment to run tests with a YamlRepository #UseFileSystemRepo: true -#MySql: server=127.0.0.1;Uid=root;Pwd=YourStrong!Passw0rd;AllowPublicKeyRetrieval=True -#PostgreSql: User ID=postgres;Password=;Host=127.0.0.1;Port=5432 -#Oracle: +MySql: server=127.0.0.1;Uid=root;Pwd=YourStrong!Passw0rd;AllowPublicKeyRetrieval=True +PostgreSql: User ID=postgres;Password=;Host=127.0.0.1;Port=5432 +Oracle: #User accounts you can create with limited access rights (e.g. connect list databases etc). These users will be used in low privilege tests #The account will be granted limited read/write access to databases on a per test basis (See DatabaseTests.SetupLowPrivilegeUserRightsFor) #If you leave these commented out the associated tests will be Inconclusive From b0313eae597737ac75b4c02c654a9b0d0d0b96da Mon Sep 17 00:00:00 2001 From: James Friel Date: Thu, 23 Nov 2023 14:12:14 +0000 Subject: [PATCH 51/85] add usmmary --- Rdmp.Core/Curation/Data/Dataset.cs | 4 ++++ Rdmp.Core/Curation/Data/IDataset.cs | 3 +++ Rdmp.Core/Providers/DatasetChildProvider.cs | 3 +++ Rdmp.UI/Menus/DatasetMenu.cs | 4 +++- .../PieCharts/CatalogueToDatasetLinkageObjectCollection.cs | 3 +++ 5 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Rdmp.Core/Curation/Data/Dataset.cs b/Rdmp.Core/Curation/Data/Dataset.cs index 390c1ed6d6..0321dac97e 100644 --- a/Rdmp.Core/Curation/Data/Dataset.cs +++ b/Rdmp.Core/Curation/Data/Dataset.cs @@ -18,6 +18,10 @@ using Rdmp.Core.MapsDirectlyToDatabaseTable; namespace Rdmp.Core.Curation.Data; + +/// +/// todo +/// public class Dataset : DatabaseEntity, IDataset, IHasFolder { string _name; diff --git a/Rdmp.Core/Curation/Data/IDataset.cs b/Rdmp.Core/Curation/Data/IDataset.cs index 698184516e..2b129cc5c6 100644 --- a/Rdmp.Core/Curation/Data/IDataset.cs +++ b/Rdmp.Core/Curation/Data/IDataset.cs @@ -13,6 +13,9 @@ namespace Rdmp.Core.Curation.Data; +/// +/// todo +/// public interface IDataset: IMapsDirectlyToDatabaseTable { /// diff --git a/Rdmp.Core/Providers/DatasetChildProvider.cs b/Rdmp.Core/Providers/DatasetChildProvider.cs index e6863ca9e0..df627d8531 100644 --- a/Rdmp.Core/Providers/DatasetChildProvider.cs +++ b/Rdmp.Core/Providers/DatasetChildProvider.cs @@ -12,6 +12,9 @@ using System.Threading.Tasks; namespace Rdmp.Core.Providers; +/// +/// todo +/// public class DatasetChildProvider : CatalogueChildProvider { public DatasetChildProvider(ICatalogueRepository repository, IChildProvider[] pluginChildProviders, ICheckNotifier errorsCheckNotifier, CatalogueChildProvider previousStateIfKnown) : base(repository, pluginChildProviders, errorsCheckNotifier, previousStateIfKnown) diff --git a/Rdmp.UI/Menus/DatasetMenu.cs b/Rdmp.UI/Menus/DatasetMenu.cs index 867f9bdebf..0202bc8b79 100644 --- a/Rdmp.UI/Menus/DatasetMenu.cs +++ b/Rdmp.UI/Menus/DatasetMenu.cs @@ -12,7 +12,9 @@ using System.Threading.Tasks; namespace Rdmp.UI.Menus; - +/// +/// todo +/// public class DatasetMenu: RDMPContextMenuStrip { diff --git a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkageObjectCollection.cs b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkageObjectCollection.cs index 47bbcbd516..d3be2529e6 100644 --- a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkageObjectCollection.cs +++ b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkageObjectCollection.cs @@ -12,6 +12,9 @@ namespace Rdmp.UI.PieCharts; +/// +/// todo +/// public class CatalogueToDatasetLinkageObjectCollection : PersistableObjectCollection { } From 2d604cf41a0c38fcc0ce561dc0172a53609399d8 Mon Sep 17 00:00:00 2001 From: James Friel Date: Thu, 23 Nov 2023 14:33:50 +0000 Subject: [PATCH 52/85] tidy up code --- ...ner.cs => CatalogueToDatasetLinkagePieChartUI.Designer.cs} | 2 +- ...kagePieChart.cs => CatalogueToDatasetLinkagePieChartUI.cs} | 4 ++-- ...PieChart.resx => CatalogueToDatasetLinkagePieChartUI.resx} | 0 3 files changed, 3 insertions(+), 3 deletions(-) rename Rdmp.UI/PieCharts/{CatalogueToDatasetLinkagePieChart.Designer.cs => CatalogueToDatasetLinkagePieChartUI.Designer.cs} (99%) rename Rdmp.UI/PieCharts/{CatalogueToDatasetLinkagePieChart.cs => CatalogueToDatasetLinkagePieChartUI.cs} (98%) rename Rdmp.UI/PieCharts/{CatalogueToDatasetLinkagePieChart.resx => CatalogueToDatasetLinkagePieChartUI.resx} (100%) diff --git a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.Designer.cs b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChartUI.Designer.cs similarity index 99% rename from Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.Designer.cs rename to Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChartUI.Designer.cs index 2a7dbbbb1c..66739831e0 100644 --- a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.Designer.cs +++ b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChartUI.Designer.cs @@ -1,6 +1,6 @@ namespace Rdmp.UI.PieCharts { - partial class CatalogueToDatasetLinkagePiechart + partial class CatalogueToDatasetLinkagePieChartUI { /// /// Required designer variable. diff --git a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.cs b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChartUI.cs similarity index 98% rename from Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.cs rename to Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChartUI.cs index c6206dca7a..070f58a26a 100644 --- a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.cs +++ b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChartUI.cs @@ -30,7 +30,7 @@ namespace Rdmp.UI.PieCharts; /// Each of these can either be displayed for a single catalogue or as a combined total across all active catalogues (not deprecated / internal etc) /// /// -public partial class CatalogueToDatasetLinkagePiechart : RDMPUserControl, IDashboardableControl +public partial class CatalogueToDatasetLinkagePieChartUI : RDMPUserControl, IDashboardableControl { private ToolStripButton btnSingleCatalogue = new("Single", CatalogueIcons.Catalogue.ImageToBitmap()) { Name = "btnSingleCatalogue" }; @@ -48,7 +48,7 @@ public partial class CatalogueToDatasetLinkagePiechart : RDMPUserControl, IDashb private List _flagOptions = new(); - public CatalogueToDatasetLinkagePiechart() + public CatalogueToDatasetLinkagePieChartUI() { InitializeComponent(); diff --git a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.resx b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChartUI.resx similarity index 100% rename from Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChart.resx rename to Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChartUI.resx From 5fb77de4d2f39bd46e61e960983418a10151696a Mon Sep 17 00:00:00 2001 From: James Friel Date: Thu, 23 Nov 2023 15:08:40 +0000 Subject: [PATCH 53/85] add dataset blank constructor --- Rdmp.Core/Curation/Data/Dataset.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Rdmp.Core/Curation/Data/Dataset.cs b/Rdmp.Core/Curation/Data/Dataset.cs index 0321dac97e..d24a2e31b6 100644 --- a/Rdmp.Core/Curation/Data/Dataset.cs +++ b/Rdmp.Core/Curation/Data/Dataset.cs @@ -69,6 +69,8 @@ public Dataset(ICatalogueRepository catalogueRepository, string name) {"Folder", _folder } }); } + + public Dataset() { } internal Dataset(ICatalogueRepository repository, DbDataReader r) : base(repository, r) { From 0a6b86a2203b110befdda2f505f4d28b84ca329c Mon Sep 17 00:00:00 2001 From: James Friel Date: Fri, 24 Nov 2023 10:17:25 +0000 Subject: [PATCH 54/85] partial test coverage --- .../ExecuteCommandCreateDatasetTests.cs | 32 +++++ .../ExecuteCommandDeleteDatasetTest.cs | 36 +++++ ...ecuteCommandLinkCatalogueToDatasetTests.cs | 128 ++++++++++++++++++ .../ExecuteCommandCreateDataset.cs | 17 +-- ...xecuteCommandLinkCatalogueInfoToDataset.cs | 4 + Rdmp.Core/Curation/Data/Dataset.cs | 2 + Tests.Common/TestDatabases.txt | 8 +- 7 files changed, 212 insertions(+), 15 deletions(-) create mode 100644 Rdmp.Core.Tests/CommandExecution/ExecuteCommandCreateDatasetTests.cs create mode 100644 Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs create mode 100644 Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandCreateDatasetTests.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandCreateDatasetTests.cs new file mode 100644 index 0000000000..d558739b02 --- /dev/null +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandCreateDatasetTests.cs @@ -0,0 +1,32 @@ + +using NUnit.Framework; +using Rdmp.Core.CommandExecution.AtomicCommands; +using System; +using System.Linq; + +namespace Rdmp.Core.Tests.CommandExecution; + +public class ExecuteCommandCreateDatasetTests : CommandCliTests +{ + [Test] + public void TestDatasetCreationOKParameters() { + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(),"TEST_dataset"); + Assert.DoesNotThrow(()=>cmd.Execute()); + } + + [Test] + public void TestDatasetCreationNoParameters() + { + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), null); + Assert.Throws(() => cmd.Execute()); + } + + [Test] + public void TestDatasetCreationOKExtendedParameters() + { + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "TEST_dataset2","somedoi","some source"); + Assert.DoesNotThrow(() => cmd.Execute()); + var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ds => ds.Name == "TEST_dataset2" && ds.DigitalObjectIdentifier == "somedoi" && ds.Source == "some source").First(); + Assert.IsNotNull(founddataset); + } +} diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs new file mode 100644 index 0000000000..e4a8470914 --- /dev/null +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs @@ -0,0 +1,36 @@ +using NUnit.Framework; +using Rdmp.Core.CommandExecution.AtomicCommands; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Rdmp.Core.Tests.CommandExecution +{ + internal class ExecuteCommandDeleteDatasetTest: CommandCliTests + { + + [Test] + public void TestDeleteExistingDataset() + { + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "TEST_dataset"); + Assert.DoesNotThrow(() => cmd.Execute()); + Assert.AreEqual(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Length, 1); + var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ds => ds.Name == "TEST_dataset").First(); + var delCmd = new ExecuteCommandDeleteDataset(GetMockActivator(), founddataset); + Assert.DoesNotThrow(() => delCmd.Execute()); + Assert.AreEqual(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Length, 0); + } + + [Test] + public void TestDeleteNonExistantDataset() + { + Assert.AreEqual(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Length, 0); + var founddataset = new Core.Curation.Data.Dataset(); + var delCmd = new ExecuteCommandDeleteDataset(GetMockActivator(), founddataset); + Assert.Throws(() => delCmd.Execute()); + Assert.AreEqual(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Length, 0); + } + } +} diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs new file mode 100644 index 0000000000..879e09a5f4 --- /dev/null +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs @@ -0,0 +1,128 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FAnsi.Discovery; +using NUnit.Framework; +using Rdmp.Core.CommandExecution.AtomicCommands; +using Rdmp.Core.CommandExecution.AtomicCommands.CatalogueCreationCommands; +using Rdmp.Core.Curation.Data; +using Rdmp.Core.Curation.Data.Pipelines; +using Rdmp.Core.Repositories; +using Rdmp.Core.Tests.CohortCreation; +using Tests.Common; + +namespace Rdmp.Core.Tests.CommandExecution +{ + internal class ExecuteCommandLinkCatalogueToDatasetTests : CommandCliTests + { + + //all ok + [Test] + public void TestLinkCatalogueToDataset() + { + var _cata1 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset1"); + var _cata2 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset2"); + _cata1.SaveToDatabase(); + _cata2.SaveToDatabase(); + var _t1 = new TableInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "T1"); + var _t2 = new TableInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "T2"); + _t1.SaveToDatabase(); + _t2.SaveToDatabase(); + var _c1 = new ColumnInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "test.db", "varchar(10)", _t1); + var _c2 = new ColumnInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "test.db", "int", _t2); + _c1.SaveToDatabase(); + _c2.SaveToDatabase(); + var _ci1 = new CatalogueItem(GetMockActivator().RepositoryLocator.CatalogueRepository, _cata1, "PrivateIdentifierA"); + _ci1.SetColumnInfo(_c1); + var _ci2 = new CatalogueItem(GetMockActivator().RepositoryLocator.CatalogueRepository, _cata2, "PrivateIdentifierB"); + _ci2.SetColumnInfo(_c2); + _ci1.SaveToDatabase(); + _ci2.SaveToDatabase(); + + + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "TEST_dataset"); + Assert.DoesNotThrow(() => cmd.Execute()); + var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); + var foundCatalogue = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(c => c.Name == "Dataset1").First(); + var linkCmd = new ExecuteCommandLinkCatalogueInfoToDataset(GetMockActivator(), foundCatalogue, founddataset); + Assert.DoesNotThrow(() => linkCmd.Execute()); + var columInfo = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects(); + foreach (var ci in columInfo) + { + Assert.AreEqual(ci.Dataset_ID, founddataset.ID); + } + + } + [Test] + public void TestLinkCatalogueToDatasetNotAll() + { + var _cata1 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset1"); + var _cata2 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset2"); + _cata1.SaveToDatabase(); + _cata2.SaveToDatabase(); + var _t1 = new TableInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "T1"); + var _t2 = new TableInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "T2"); + _t1.SaveToDatabase(); + _t2.SaveToDatabase(); + var _c1 = new ColumnInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "test.db", "varchar(10)", _t1); + var _c2 = new ColumnInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "test.db", "int", _t2); + _c1.SaveToDatabase(); + _c2.SaveToDatabase(); + var _ci1 = new CatalogueItem(GetMockActivator().RepositoryLocator.CatalogueRepository, _cata1, "PrivateIdentifierA"); + _ci1.SetColumnInfo(_c1); + var _ci2 = new CatalogueItem(GetMockActivator().RepositoryLocator.CatalogueRepository, _cata2, "PrivateIdentifierB"); + _ci2.SetColumnInfo(_c2); + _ci1.SaveToDatabase(); + _ci2.SaveToDatabase(); + + + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "TEST_dataset"); + Assert.DoesNotThrow(() => cmd.Execute()); + var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); + var foundCatalogue = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(c => c.Name == "Dataset1").First(); + var linkCmd = new ExecuteCommandLinkCatalogueInfoToDataset(GetMockActivator(), foundCatalogue, founddataset, false); + Assert.DoesNotThrow(() => linkCmd.Execute()); + var columInfo = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ci => _cata1.CatalogueItems.Contains(ci)); + foreach (var ci in columInfo) + { + Assert.AreEqual(ci.ColumnInfo.Dataset_ID, founddataset.ID); + } + + var columInfo2 = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ci => _cata2.CatalogueItems.Contains(ci)); + foreach (var ci in columInfo2) + { + Assert.AreEqual(ci.ColumnInfo.Dataset_ID, null); + } + + } + [Test] + public void TestLinkCatalogueToDatasetBadCatalogue() + { + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "TEST_dataset"); + Assert.DoesNotThrow(() => cmd.Execute()); + var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); + var linkCmd = new ExecuteCommandLinkCatalogueInfoToDataset(GetMockActivator(), null, founddataset, false); + Assert.Throws(()=>linkCmd.Execute()); + } + + [Test] + public void TestLinkCatalogueToDatasetBadDataset() + { + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "TEST_dataset"); + Assert.DoesNotThrow(() => cmd.Execute()); + var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); + var linkCmd = new ExecuteCommandLinkCatalogueInfoToDataset(GetMockActivator(), new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository,"catalogue"), null, false); + Assert.Throws(() => linkCmd.Execute()); + } + + [Test] + public void TestLinkCatalogueToDatasetBadEverything() + { + var linkCmd = new ExecuteCommandLinkCatalogueInfoToDataset(GetMockActivator(), null, null, false); + Assert.Throws(() => linkCmd.Execute()); + } + } +} diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs index 8475952da4..c835394cc0 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs @@ -1,17 +1,8 @@ -using NPOI.OpenXmlFormats.Spreadsheet; -using Rdmp.Core.Curation.Data; -using Rdmp.Core.Curation.Data.Cohort; -using Rdmp.Core.MapsDirectlyToDatabaseTable; -using Rdmp.Core.Repositories.Construction; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System; namespace Rdmp.Core.CommandExecution.AtomicCommands; -public class ExecuteCommandCreateDataset : BasicCommandExecution +public class ExecuteCommandCreateDataset : BasicCommandExecution, IAtomicCommand { @@ -35,6 +26,10 @@ public ExecuteCommandCreateDataset(IBasicActivateItems activator, string name, s public override void Execute() { + if (string.IsNullOrWhiteSpace(_name)) + { + throw new Exception("Datasets requires a name"); + } base.Execute(); var dataset = new Curation.Data.Dataset(BasicActivator.RepositoryLocator.CatalogueRepository, _name) { DigitalObjectIdentifier = _doi, Source = _source }; dataset.SaveToDatabase(); diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueInfoToDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueInfoToDataset.cs index ef3c46dd48..a19d79a44e 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueInfoToDataset.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueInfoToDataset.cs @@ -2,6 +2,7 @@ using Rdmp.Core.Curation.Data; +using System; using System.Linq; namespace Rdmp.Core.CommandExecution.AtomicCommands; @@ -24,10 +25,13 @@ public ExecuteCommandLinkCatalogueInfoToDataset(IBasicActivateItems activator, C public override void Execute() { base.Execute(); + if (_catalogue is null) throw new Exception("No Catalogue Selected"); + if (_dataset is null) throw new Exception("No Dataset Selected"); var items = _catalogue.CatalogueItems.ToList(); foreach (var item in items) { var ci = item.ColumnInfo; + if (ci is null) continue; if (ci.Dataset_ID == _dataset.ID) { continue; diff --git a/Rdmp.Core/Curation/Data/Dataset.cs b/Rdmp.Core/Curation/Data/Dataset.cs index d24a2e31b6..de3a907ddc 100644 --- a/Rdmp.Core/Curation/Data/Dataset.cs +++ b/Rdmp.Core/Curation/Data/Dataset.cs @@ -16,6 +16,7 @@ using System.Text; using System.Threading.Tasks; using Rdmp.Core.MapsDirectlyToDatabaseTable; +using System.Diagnostics.CodeAnalysis; namespace Rdmp.Core.Curation.Data; @@ -39,6 +40,7 @@ public string Folder } [Unique] + [NotNull] public string Name { get => _name; diff --git a/Tests.Common/TestDatabases.txt b/Tests.Common/TestDatabases.txt index bc2a95b27d..1f8c016bd7 100644 --- a/Tests.Common/TestDatabases.txt +++ b/Tests.Common/TestDatabases.txt @@ -6,13 +6,13 @@ #To achieve this, you can run DatabaseCreation.exe with argument 1 being your ServerName #You can apply a prefix e.g. TEST_ as an argument to DatabaseCreation.exe and include that prefix below if you like -Prefix: TEST_ +Prefix: RDMP_ ServerName: (localdb)\MSSQLLocalDB #Uncomment to run tests with a YamlRepository #UseFileSystemRepo: true -MySql: server=127.0.0.1;Uid=root;Pwd=YourStrong!Passw0rd;AllowPublicKeyRetrieval=True -PostgreSql: User ID=postgres;Password=;Host=127.0.0.1;Port=5432 -Oracle: +#MySql: server=127.0.0.1;Uid=root;Pwd=YourStrong!Passw0rd;AllowPublicKeyRetrieval=True +#PostgreSql: User ID=postgres;Password=;Host=127.0.0.1;Port=5432 +#Oracle: #User accounts you can create with limited access rights (e.g. connect list databases etc). These users will be used in low privilege tests #The account will be granted limited read/write access to databases on a per test basis (See DatabaseTests.SetupLowPrivilegeUserRightsFor) #If you leave these commented out the associated tests will be Inconclusive From 91170a15023608afa3dac45d6dcaf710a4435e1b Mon Sep 17 00:00:00 2001 From: James Friel Date: Fri, 24 Nov 2023 10:38:22 +0000 Subject: [PATCH 55/85] more tests --- ...teCommandLinkCoulmnInfoWithDatasetTests.cs | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs new file mode 100644 index 0000000000..0f885da77b --- /dev/null +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs @@ -0,0 +1,123 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FAnsi.Discovery; +using NUnit.Framework; +using Rdmp.Core.CommandExecution.AtomicCommands; +using Rdmp.Core.CommandExecution.AtomicCommands.CatalogueCreationCommands; +using Rdmp.Core.Curation.Data; +using Rdmp.Core.Curation.Data.Pipelines; +using Rdmp.Core.Repositories; +using Rdmp.Core.Tests.CohortCreation; +using Tests.Common; +namespace Rdmp.Core.Tests.CommandExecution +{ + internal class ExecuteCommandLinkCoulmnInfoWithDatasetTests: CommandCliTests + { + [Test] + public void TestLinkColumnInfoToDataset() + { + var _cata1 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset1"); + var _cata2 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset2"); + _cata1.SaveToDatabase(); + _cata2.SaveToDatabase(); + var _t1 = new TableInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "T1"); + var _t2 = new TableInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "T2"); + _t1.SaveToDatabase(); + _t2.SaveToDatabase(); + var _c1 = new ColumnInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "test.db", "varchar(10)", _t1); + var _c2 = new ColumnInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "test.db", "int", _t2); + _c1.SaveToDatabase(); + _c2.SaveToDatabase(); + var _ci1 = new CatalogueItem(GetMockActivator().RepositoryLocator.CatalogueRepository, _cata1, "PrivateIdentifierA"); + _ci1.SetColumnInfo(_c1); + var _ci2 = new CatalogueItem(GetMockActivator().RepositoryLocator.CatalogueRepository, _cata2, "PrivateIdentifierB"); + _ci2.SetColumnInfo(_c2); + _ci1.SaveToDatabase(); + _ci2.SaveToDatabase(); + + + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "TEST_dataset"); + Assert.DoesNotThrow(() => cmd.Execute()); + var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); + var foundCatalogue = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(c => c.Name == "Dataset1").First(); + var linkCmd = new ExecuteCommandLinkColumnInfoToDataset(GetMockActivator(), _c1, founddataset); + Assert.DoesNotThrow(() => linkCmd.Execute()); + var columInfo = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects(); + foreach (var ci in columInfo) + { + Assert.AreEqual(ci.Dataset_ID, founddataset.ID); + } + } + [Test] + public void TestLinkColumnInfoToDatasetNotAll() + { + var _cata1 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset1"); + var _cata2 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset2"); + _cata1.SaveToDatabase(); + _cata2.SaveToDatabase(); + var _t1 = new TableInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "T1"); + var _t2 = new TableInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "T2"); + _t1.SaveToDatabase(); + _t2.SaveToDatabase(); + var _c1 = new ColumnInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "test.db", "varchar(10)", _t1); + var _c2 = new ColumnInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "test.db", "int", _t2); + _c1.SaveToDatabase(); + _c2.SaveToDatabase(); + var _ci1 = new CatalogueItem(GetMockActivator().RepositoryLocator.CatalogueRepository, _cata1, "PrivateIdentifierA"); + _ci1.SetColumnInfo(_c1); + var _ci2 = new CatalogueItem(GetMockActivator().RepositoryLocator.CatalogueRepository, _cata2, "PrivateIdentifierB"); + _ci2.SetColumnInfo(_c2); + _ci1.SaveToDatabase(); + _ci2.SaveToDatabase(); + + + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "TEST_dataset"); + Assert.DoesNotThrow(() => cmd.Execute()); + var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); + var foundCatalogue = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(c => c.Name == "Dataset1").First(); + var linkCmd = new ExecuteCommandLinkColumnInfoToDataset(GetMockActivator(), _c1, founddataset, false); + Assert.DoesNotThrow(() => linkCmd.Execute()); + var columInfo = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ci => _cata1.CatalogueItems.Contains(ci)); + foreach (var ci in columInfo) + { + Assert.AreEqual(ci.ColumnInfo.Dataset_ID, founddataset.ID); + } + + var columInfo2 = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ci => _cata2.CatalogueItems.Contains(ci)); + foreach (var ci in columInfo2) + { + Assert.AreEqual(ci.ColumnInfo.Dataset_ID, null); + } + } + [Test] + public void TestLinkCatalogueToDatasetBadCoulmnInfo() + { + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "TEST_dataset"); + Assert.DoesNotThrow(() => cmd.Execute()); + var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); + var linkCmd = new ExecuteCommandLinkColumnInfoToDataset(GetMockActivator(), null, founddataset, false); + Assert.Throws(() => linkCmd.Execute()); + } + + [Test] + public void TestLinkColumInfoToDatasetBadDataset() + { + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "TEST_dataset"); + Assert.DoesNotThrow(() => cmd.Execute()); + var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); + var linkCmd = new ExecuteCommandLinkColumnInfoToDataset(GetMockActivator(), new ColumnInfo(), null, false); + Assert.Throws(() => linkCmd.Execute()); + } + + [Test] + public void TestLinkColumnInfoToDatasetBadEverything() + { + var linkCmd = new ExecuteCommandLinkColumnInfoToDataset(GetMockActivator(), null, null, false); + Assert.Throws(() => linkCmd.Execute()); + } + } +} From 83f7348016cfcbd0e830b5a4c1a6dc609e3dc788 Mon Sep 17 00:00:00 2001 From: James Friel Date: Fri, 24 Nov 2023 14:04:34 +0000 Subject: [PATCH 56/85] tidy up files --- .../WindowManagement/WindowManager.cs | 2 +- ...ecuteCommandLinkCatalogueToDatasetTests.cs | 1 - .../CommandExecution/AtomicCommandFactory.cs | 1 - ...xecuteCommandLinkCatalogueInfoToDataset.cs | 2 - .../ExecuteCommandLinkColumnInfoToDataset.cs | 2 - .../Dataset/DatasetConfigurationUICommon.cs | 25 +----------- Rdmp.Core/Providers/CatalogueChildProvider.cs | 22 ----------- .../Providers/DataExportChildProvider.cs | 1 - .../WordDataReleaseFileGenerator.cs | 2 +- Rdmp.UI/Collections/DatasetsCollectionUI.cs | 5 --- .../ExecuteCommandLinkCatalogueToDataset.cs | 13 ++++--- ...ExecuteCommandLinkColumnInfoToDataSetUI.cs | 39 ++----------------- .../ProposeExecutionWhenTargetIsDataset.cs | 2 +- .../SubComponents/DatsetConfigurationUI.cs | 1 - Tests.Common/TestDatabases.txt | 8 ++-- 15 files changed, 20 insertions(+), 106 deletions(-) diff --git a/Application/ResearchDataManagementPlatform/WindowManagement/WindowManager.cs b/Application/ResearchDataManagementPlatform/WindowManagement/WindowManager.cs index dd424cc953..406e858db8 100644 --- a/Application/ResearchDataManagementPlatform/WindowManagement/WindowManager.cs +++ b/Application/ResearchDataManagementPlatform/WindowManagement/WindowManager.cs @@ -151,7 +151,7 @@ public PersistableToolboxDockContent Create(RDMPCollection collectionToCreate, case RDMPCollection.Datasets: collection = new DatasetsCollectionUI(); toReturn = Show(RDMPCollection.Datasets, collection, "Datasets", - Image.Load(CatalogueIcons.Favourite)); + Image.Load(CatalogueIcons.Dataset)); break; default: throw new ArgumentOutOfRangeException(nameof(collectionToCreate)); diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs index 879e09a5f4..8e3fee55fe 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs @@ -19,7 +19,6 @@ namespace Rdmp.Core.Tests.CommandExecution internal class ExecuteCommandLinkCatalogueToDatasetTests : CommandCliTests { - //all ok [Test] public void TestLinkCatalogueToDataset() { diff --git a/Rdmp.Core/CommandExecution/AtomicCommandFactory.cs b/Rdmp.Core/CommandExecution/AtomicCommandFactory.cs index 8efee3ad8d..10542aa27a 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommandFactory.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommandFactory.cs @@ -231,7 +231,6 @@ public IEnumerable CreateCommands(object o) if (Is(o, out CatalogueItem ci)) { yield return new ExecuteCommandCreateNewFilter(_activator, ci) { OverrideCommandName = "Add New Filter" }; - //yield return new ExecuteCommandLinkCatalogueItemToColumnInfo(_activator, ci); yield return new ExecuteCommandMakeCatalogueItemExtractable(_activator, ci); yield return new ExecuteCommandChangeExtractionCategory(_activator, new[] { ci.ExtractionInformation }); yield return new ExecuteCommandImportCatalogueItemDescription(_activator, ci) diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueInfoToDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueInfoToDataset.cs index a19d79a44e..2507d47152 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueInfoToDataset.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueInfoToDataset.cs @@ -7,8 +7,6 @@ namespace Rdmp.Core.CommandExecution.AtomicCommands; - -//There is not currently any way to run this via the CLI public class ExecuteCommandLinkCatalogueInfoToDataset : BasicCommandExecution, IAtomicCommand { private Catalogue _catalogue; diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataset.cs index fd964266de..df9d018f7a 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataset.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataset.cs @@ -6,8 +6,6 @@ namespace Rdmp.Core.CommandExecution.AtomicCommands; - -//There is not currently any way to run this via the CLI public class ExecuteCommandLinkColumnInfoToDataset : BasicCommandExecution { private ColumnInfo _columnInfo; diff --git a/Rdmp.Core/Dataset/DatasetConfigurationUICommon.cs b/Rdmp.Core/Dataset/DatasetConfigurationUICommon.cs index fcf18dd461..383c565883 100644 --- a/Rdmp.Core/Dataset/DatasetConfigurationUICommon.cs +++ b/Rdmp.Core/Dataset/DatasetConfigurationUICommon.cs @@ -27,29 +27,7 @@ namespace Rdmp.Core.Dataset; /// public class DatasetConfigurationUICommon { - //public CohortIdentificationConfiguration Configuration; - - //public ExternalDatabaseServer QueryCachingServer; - //private CohortAggregateContainer _root; - //private CancellationTokenSource _cancelGlobalOperations; - //private ISqlParameter[] _globals; - //public CohortCompilerRunner Runner; - - ///// - ///// User interface layer for modal dialogs, showing Exceptions etc - ///// - //public IBasicActivateItems Activator; - - ///// - ///// Duration in seconds to allow tasks to run for before cancelling - ///// - //public int Timeout = 3000; - - //public CohortCompiler Compiler { get; } - - - - /// + /// /// User interface layer for modal dialogs, showing Exceptions etc /// public IBasicActivateItems Activator; @@ -59,7 +37,6 @@ public class DatasetConfigurationUICommon public DatasetConfigurationUICommon() { - //Compiler = new CohortCompiler(null); } diff --git a/Rdmp.Core/Providers/CatalogueChildProvider.cs b/Rdmp.Core/Providers/CatalogueChildProvider.cs index cece4fddfe..43c65ecb2b 100644 --- a/Rdmp.Core/Providers/CatalogueChildProvider.cs +++ b/Rdmp.Core/Providers/CatalogueChildProvider.cs @@ -867,28 +867,6 @@ private void AddChildren(FolderNode folder, D private void AddChildren(Curation.Data.Dataset lmd, DescendancyList descendancy) { var childObjects = new List(); - - //if (lmd.OverrideRAWServer_ID.HasValue) - //{ - // var server = AllExternalServers.Single(s => s.ID == lmd.OverrideRAWServer_ID.Value); - // var usage = new OverrideRawServerNode(lmd, server); - // childObjects.Add(usage); - //} - - //var allSchedulesNode = new LoadMetadataScheduleNode(lmd); - //AddChildren(allSchedulesNode, descendancy.Add(allSchedulesNode)); - //childObjects.Add(allSchedulesNode); - - //var allCataloguesNode = new AllCataloguesUsedByLoadMetadataNode(lmd); - //AddChildren(allCataloguesNode, descendancy.Add(allCataloguesNode)); - //childObjects.Add(allCataloguesNode); - - //var processTasksNode = new AllProcessTasksUsedByLoadMetadataNode(lmd); - //AddChildren(processTasksNode, descendancy.Add(processTasksNode)); - //childObjects.Add(processTasksNode); - - //childObjects.Add(new LoadDirectoryNode(lmd)); - AddToDictionaries(new HashSet(childObjects), descendancy); } diff --git a/Rdmp.Core/Providers/DataExportChildProvider.cs b/Rdmp.Core/Providers/DataExportChildProvider.cs index 26175c7508..c87066ad16 100644 --- a/Rdmp.Core/Providers/DataExportChildProvider.cs +++ b/Rdmp.Core/Providers/DataExportChildProvider.cs @@ -52,7 +52,6 @@ public class DataExportChildProvider : CatalogueChildProvider public ExtractableDataSetPackage[] AllPackages { get; set; } public FolderNode ProjectRootFolder { get; private set; } - //public FolderNode DatasetRootFolder { get; private set; } public Project[] Projects { get; set; } private Dictionary> _cohortsByOriginId; diff --git a/Rdmp.Core/Reports/ExtractionTime/WordDataReleaseFileGenerator.cs b/Rdmp.Core/Reports/ExtractionTime/WordDataReleaseFileGenerator.cs index 521061daa0..f608d9a8da 100644 --- a/Rdmp.Core/Reports/ExtractionTime/WordDataReleaseFileGenerator.cs +++ b/Rdmp.Core/Reports/ExtractionTime/WordDataReleaseFileGenerator.cs @@ -190,7 +190,7 @@ private void CreateFileSummary(XWPFDocument document) var extractableDataset = _repository.GetObjectByID(result.ExtractableDataSet_ID); SetTableCell(table, tableLine, 0, extractableDataset.ToString()); - var linkedDatasets = extractableDataset.Catalogue.CatalogueItems.Select(c => c.ColumnInfo).Where(ci => ci.Dataset_ID != null).Distinct().Select(ci => ci.Dataset_ID);// + var linkedDatasets = extractableDataset.Catalogue.CatalogueItems.Select(c => c.ColumnInfo).Where(ci => ci.Dataset_ID != null).Distinct().Select(ci => ci.Dataset_ID); var datasets = _repository.CatalogueRepository.GetAllObjects().Where(d => linkedDatasets.Contains(d.ID)).ToList(); string datasetString = ""; foreach (var ds in datasets) diff --git a/Rdmp.UI/Collections/DatasetsCollectionUI.cs b/Rdmp.UI/Collections/DatasetsCollectionUI.cs index 5c8d74669f..becf5b4a1f 100644 --- a/Rdmp.UI/Collections/DatasetsCollectionUI.cs +++ b/Rdmp.UI/Collections/DatasetsCollectionUI.cs @@ -21,7 +21,6 @@ namespace Rdmp.UI.Collections public partial class DatasetsCollectionUI : RDMPCollectionUI, ILifetimeSubscriber { - //private List _datasets = new(); private Dataset[] _datasets; private bool _firstTime = true; @@ -79,10 +78,6 @@ private void RefreshDatasets(object oRefreshFrom) _firstTime = false; } - //var actualRootFavourites = FindRootObjects(Activator, IncludeObject); - //_datasets = actualRootFavourites; - //tlvDatasets.SetObjects(_datasets.ToArray()); - //tlvDatasets.RebuildAll(true); } diff --git a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs index ca00ad429d..dd27e0c95c 100644 --- a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs +++ b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs @@ -1,4 +1,4 @@ -// Copyright (c) The University of Dundee 2018-2019 +// Copyright (c) The University of Dundee 2018-2023 // This file is part of the Research Data Management Platform (RDMP). // RDMP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. // RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. @@ -34,7 +34,7 @@ public ExecuteCommandLinkCatalogueToDataSet(IActivateItems activator, Catalogue } public override string GetCommandHelp() => - "Link all colu,n of this catalogue to a dataset"; + "Link all columns of this catalogue to a dataset"; public override void Execute() { @@ -47,9 +47,12 @@ public override void Execute() "Select the Dataset that this catalogue information came from" }; _selectedDataset = SelectOne(da, datasets); - var backfill = YesNo("Link all other columns that match the source table?", "Do you want to link this dataset to all other columns that reference the same table as this column?"); - var cmd = new ExecuteCommandLinkCatalogueInfoToDataset(_activateItems, _catalogue, _selectedDataset, backfill); - cmd.Execute(); + if (_selectedDataset is not null) + { + var backfill = YesNo("Link all other columns that match the source table?", "Do you want to link this dataset to all other columns that reference the same table as this column?"); + var cmd = new ExecuteCommandLinkCatalogueInfoToDataset(_activateItems, _catalogue, _selectedDataset, backfill); + cmd.Execute(); + } } public override Image GetImage(IIconProvider iconProvider) => diff --git a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataSetUI.cs b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataSetUI.cs index 8fbde96268..9fd72daa99 100644 --- a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataSetUI.cs +++ b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataSetUI.cs @@ -1,4 +1,4 @@ -// Copyright (c) The University of Dundee 2018-2019 +// Copyright (c) The University of Dundee 2018-2023 // This file is part of the Research Data Management Platform (RDMP). // RDMP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. // RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. @@ -34,7 +34,7 @@ public ExecuteCommandLinkColumnInfoToDataSetUI(IActivateItems activator, ColumnI } public override string GetCommandHelp() => - "TODO"; + "Link this column to an existing dataset"; public override void Execute() { @@ -51,39 +51,8 @@ public override void Execute() var cmd = new ExecuteCommandLinkColumnInfoToDataset(_activateItems,_columnInfo, _selectedDataset,backfill); cmd.Execute(); - - //var cic = _cic ?? (CohortIdentificationConfiguration)BasicActivator.SelectOne("Select Cohort Builder Query", - // BasicActivator.GetAll().ToArray()); - - //var cata = _catalogueIfKnown; - //if (cata == null) - // try - // { - // //make sure they really wanted to do this? - // if (YesNo(GetLookupConfirmationText(), "Create Lookup")) - // { - // //get them to pick a Catalogue the table provides descriptions for - // if (!SelectOne(_lookupTableInfoIfKnown.Repository, out cata)) - // return; - // } - // else - // { - // return; - // } - // } - // catch (Exception exception) - // { - // ExceptionViewer.Show("Error creating Lookup", exception); - // return; - // } - - ////they now deifnetly have a Catalogue! - //var t = Activator.Activate(cata); - - //if (_lookupTableInfoIfKnown != null) - // t.SetLookupTableInfo(_lookupTableInfoIfKnown); } - //public override Image GetImage(IIconProvider iconProvider) => - // iconProvider.GetImage(RDMPConcept.Lookup, OverlayKind.Add); + public override Image GetImage(IIconProvider iconProvider) => + iconProvider.GetImage(RDMPConcept.Dataset, OverlayKind.Link); } \ No newline at end of file diff --git a/Rdmp.UI/CommandExecution/Proposals/ProposeExecutionWhenTargetIsDataset.cs b/Rdmp.UI/CommandExecution/Proposals/ProposeExecutionWhenTargetIsDataset.cs index c17f192170..dc3459c5b1 100644 --- a/Rdmp.UI/CommandExecution/Proposals/ProposeExecutionWhenTargetIsDataset.cs +++ b/Rdmp.UI/CommandExecution/Proposals/ProposeExecutionWhenTargetIsDataset.cs @@ -1,4 +1,4 @@ -// Copyright (c) The University of Dundee 2018-2019 +// Copyright (c) The University of Dundee 2018-2023 // This file is part of the Research Data Management Platform (RDMP). // RDMP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. // RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. diff --git a/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs b/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs index eabd63d04d..62cc88122a 100644 --- a/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs +++ b/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs @@ -65,7 +65,6 @@ public override void SetDatabaseObject(IActivateItems activator, Dataset databas public void RefreshBus_RefreshObject(object sender, RefreshObjectEventArgs e) { - //Common.Activator = Activator; } private void label1_Click(object sender, EventArgs e) diff --git a/Tests.Common/TestDatabases.txt b/Tests.Common/TestDatabases.txt index 1f8c016bd7..bc2a95b27d 100644 --- a/Tests.Common/TestDatabases.txt +++ b/Tests.Common/TestDatabases.txt @@ -6,13 +6,13 @@ #To achieve this, you can run DatabaseCreation.exe with argument 1 being your ServerName #You can apply a prefix e.g. TEST_ as an argument to DatabaseCreation.exe and include that prefix below if you like -Prefix: RDMP_ +Prefix: TEST_ ServerName: (localdb)\MSSQLLocalDB #Uncomment to run tests with a YamlRepository #UseFileSystemRepo: true -#MySql: server=127.0.0.1;Uid=root;Pwd=YourStrong!Passw0rd;AllowPublicKeyRetrieval=True -#PostgreSql: User ID=postgres;Password=;Host=127.0.0.1;Port=5432 -#Oracle: +MySql: server=127.0.0.1;Uid=root;Pwd=YourStrong!Passw0rd;AllowPublicKeyRetrieval=True +PostgreSql: User ID=postgres;Password=;Host=127.0.0.1;Port=5432 +Oracle: #User accounts you can create with limited access rights (e.g. connect list databases etc). These users will be used in low privilege tests #The account will be granted limited read/write access to databases on a per test basis (See DatabaseTests.SetupLowPrivilegeUserRightsFor) #If you leave these commented out the associated tests will be Inconclusive From fa7129de6f03256d927e4a3b0b0f2ef92fe953af Mon Sep 17 00:00:00 2001 From: James Friel Date: Fri, 24 Nov 2023 14:10:49 +0000 Subject: [PATCH 57/85] tidy up chart --- Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChartUI.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChartUI.cs b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChartUI.cs index 070f58a26a..e073bb9be1 100644 --- a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChartUI.cs +++ b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChartUI.cs @@ -25,7 +25,7 @@ namespace Rdmp.UI.PieCharts; /// -/// Part of OverviewScreen, shows a pie chart showing ow many extractable columns are there which do not yet have descriptions in the Data Catalogue Database (See CatalogueItemUI) +/// Part of OverviewScreen, shows a pie chart showing how many columns there are which do not yet have associated datasets in the Data Catalogue Database (See CatalogueItemUI) /// /// Each of these can either be displayed for a single catalogue or as a combined total across all active catalogues (not deprecated / internal etc) /// From 7f0040168cf0b2c3ffe807f5f18cde28df96b097 Mon Sep 17 00:00:00 2001 From: James Friel Date: Fri, 24 Nov 2023 14:16:14 +0000 Subject: [PATCH 58/85] tidy up atomic command --- Rdmp.Core/CommandExecution/AtomicCommandFactory.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Rdmp.Core/CommandExecution/AtomicCommandFactory.cs b/Rdmp.Core/CommandExecution/AtomicCommandFactory.cs index 10542aa27a..a07364b233 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommandFactory.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommandFactory.cs @@ -473,7 +473,6 @@ public IEnumerable CreateCommands(object o) yield return new ExecuteCommandCreateHoldoutLookup(_activator, cic) { Weight = -50.5f }; - yield return new ExecuteCommandCreateDataset(_activator, "test1");//this is in the wrong place var clone = new ExecuteCommandCloneCohortIdentificationConfiguration(_activator) { Weight = -50.4f, OverrideCommandName = "Clone" }.SetTarget(cic); From 5db3706d3ce1089a282fbba9a8e354a01c79ab8e Mon Sep 17 00:00:00 2001 From: James Friel Date: Fri, 24 Nov 2023 14:21:09 +0000 Subject: [PATCH 59/85] update summaries --- Rdmp.Core/Curation/Data/Dataset.cs | 5 ++--- Rdmp.Core/Curation/Data/IDataset.cs | 3 ++- Rdmp.Core/Providers/DatasetChildProvider.cs | 5 ++--- Rdmp.UI/Menus/DatasetMenu.cs | 4 +--- .../PieCharts/CatalogueToDatasetLinkageObjectCollection.cs | 2 +- 5 files changed, 8 insertions(+), 11 deletions(-) diff --git a/Rdmp.Core/Curation/Data/Dataset.cs b/Rdmp.Core/Curation/Data/Dataset.cs index de3a907ddc..2bba894c7e 100644 --- a/Rdmp.Core/Curation/Data/Dataset.cs +++ b/Rdmp.Core/Curation/Data/Dataset.cs @@ -20,9 +20,8 @@ namespace Rdmp.Core.Curation.Data; -/// -/// todo -/// +/// + public class Dataset : DatabaseEntity, IDataset, IHasFolder { string _name; diff --git a/Rdmp.Core/Curation/Data/IDataset.cs b/Rdmp.Core/Curation/Data/IDataset.cs index 2b129cc5c6..210c537c4f 100644 --- a/Rdmp.Core/Curation/Data/IDataset.cs +++ b/Rdmp.Core/Curation/Data/IDataset.cs @@ -14,7 +14,8 @@ namespace Rdmp.Core.Curation.Data; /// -/// todo +/// The core of datasets within RDMP. +/// Simple objects to link up catalogue data to DOI and datasets /// public interface IDataset: IMapsDirectlyToDatabaseTable { diff --git a/Rdmp.Core/Providers/DatasetChildProvider.cs b/Rdmp.Core/Providers/DatasetChildProvider.cs index df627d8531..f39d338618 100644 --- a/Rdmp.Core/Providers/DatasetChildProvider.cs +++ b/Rdmp.Core/Providers/DatasetChildProvider.cs @@ -12,9 +12,8 @@ using System.Threading.Tasks; namespace Rdmp.Core.Providers; -/// -/// todo -/// + +/// public class DatasetChildProvider : CatalogueChildProvider { public DatasetChildProvider(ICatalogueRepository repository, IChildProvider[] pluginChildProviders, ICheckNotifier errorsCheckNotifier, CatalogueChildProvider previousStateIfKnown) : base(repository, pluginChildProviders, errorsCheckNotifier, previousStateIfKnown) diff --git a/Rdmp.UI/Menus/DatasetMenu.cs b/Rdmp.UI/Menus/DatasetMenu.cs index 0202bc8b79..867f9bdebf 100644 --- a/Rdmp.UI/Menus/DatasetMenu.cs +++ b/Rdmp.UI/Menus/DatasetMenu.cs @@ -12,9 +12,7 @@ using System.Threading.Tasks; namespace Rdmp.UI.Menus; -/// -/// todo -/// + public class DatasetMenu: RDMPContextMenuStrip { diff --git a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkageObjectCollection.cs b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkageObjectCollection.cs index d3be2529e6..e44ff6c8dc 100644 --- a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkageObjectCollection.cs +++ b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkageObjectCollection.cs @@ -13,7 +13,7 @@ namespace Rdmp.UI.PieCharts; /// -/// todo +/// Input object for . /// public class CatalogueToDatasetLinkageObjectCollection : PersistableObjectCollection { From b1c59805a1bf42c9ac6b31fd2519432c87fe2266 Mon Sep 17 00:00:00 2001 From: James Friel Date: Fri, 24 Nov 2023 14:36:12 +0000 Subject: [PATCH 60/85] add summary --- Rdmp.UI/Menus/DatasetMenu.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Rdmp.UI/Menus/DatasetMenu.cs b/Rdmp.UI/Menus/DatasetMenu.cs index 867f9bdebf..3f2cb77479 100644 --- a/Rdmp.UI/Menus/DatasetMenu.cs +++ b/Rdmp.UI/Menus/DatasetMenu.cs @@ -12,7 +12,9 @@ using System.Threading.Tasks; namespace Rdmp.UI.Menus; - +/// +/// Menu item for datasets +/// public class DatasetMenu: RDMPContextMenuStrip { From faec0375825386f794968a2a60a62bd91db8ffd9 Mon Sep 17 00:00:00 2001 From: James Friel Date: Fri, 24 Nov 2023 14:49:12 +0000 Subject: [PATCH 61/85] remove test string --- .../CommandExecution/ExecuteCommandCreateDatasetTests.cs | 2 +- .../CommandExecution/ExecuteCommandDeleteDatasetTest.cs | 2 +- .../ExecuteCommandLinkCatalogueToDatasetTests.cs | 2 +- .../ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandCreateDatasetTests.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandCreateDatasetTests.cs index d558739b02..7f56725e8c 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandCreateDatasetTests.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandCreateDatasetTests.cs @@ -10,7 +10,7 @@ public class ExecuteCommandCreateDatasetTests : CommandCliTests { [Test] public void TestDatasetCreationOKParameters() { - var cmd = new ExecuteCommandCreateDataset(GetMockActivator(),"TEST_dataset"); + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(),"dataset"); Assert.DoesNotThrow(()=>cmd.Execute()); } diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs index e4a8470914..d7af690917 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs @@ -14,7 +14,7 @@ internal class ExecuteCommandDeleteDatasetTest: CommandCliTests [Test] public void TestDeleteExistingDataset() { - var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "TEST_dataset"); + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); Assert.DoesNotThrow(() => cmd.Execute()); Assert.AreEqual(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Length, 1); var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ds => ds.Name == "TEST_dataset").First(); diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs index 8e3fee55fe..9a6b97cb82 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs @@ -42,7 +42,7 @@ public void TestLinkCatalogueToDataset() _ci2.SaveToDatabase(); - var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "TEST_dataset"); + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); Assert.DoesNotThrow(() => cmd.Execute()); var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); var foundCatalogue = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(c => c.Name == "Dataset1").First(); diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs index 0f885da77b..f0dcc70e33 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs @@ -40,7 +40,7 @@ public void TestLinkColumnInfoToDataset() _ci2.SaveToDatabase(); - var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "TEST_dataset"); + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); Assert.DoesNotThrow(() => cmd.Execute()); var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); var foundCatalogue = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(c => c.Name == "Dataset1").First(); From 353e1de2a3fbfdeb059486315a839262f284feff Mon Sep 17 00:00:00 2001 From: James Friel Date: Fri, 24 Nov 2023 14:58:08 +0000 Subject: [PATCH 62/85] remove test string --- .../CommandExecution/ExecuteCommandCreateDatasetTests.cs | 4 ++-- .../CommandExecution/ExecuteCommandDeleteDatasetTest.cs | 2 +- .../ExecuteCommandLinkCatalogueToDatasetTests.cs | 4 ++-- .../ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandCreateDatasetTests.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandCreateDatasetTests.cs index 7f56725e8c..d2ac86824a 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandCreateDatasetTests.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandCreateDatasetTests.cs @@ -24,9 +24,9 @@ public void TestDatasetCreationNoParameters() [Test] public void TestDatasetCreationOKExtendedParameters() { - var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "TEST_dataset2","somedoi","some source"); + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset2","somedoi","some source"); Assert.DoesNotThrow(() => cmd.Execute()); - var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ds => ds.Name == "TEST_dataset2" && ds.DigitalObjectIdentifier == "somedoi" && ds.Source == "some source").First(); + var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ds => ds.Name == "dataset2" && ds.DigitalObjectIdentifier == "somedoi" && ds.Source == "some source").First(); Assert.IsNotNull(founddataset); } } diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs index d7af690917..43a714edb6 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs @@ -17,7 +17,7 @@ public void TestDeleteExistingDataset() var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); Assert.DoesNotThrow(() => cmd.Execute()); Assert.AreEqual(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Length, 1); - var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ds => ds.Name == "TEST_dataset").First(); + var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ds => ds.Name == "dataset").First(); var delCmd = new ExecuteCommandDeleteDataset(GetMockActivator(), founddataset); Assert.DoesNotThrow(() => delCmd.Execute()); Assert.AreEqual(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Length, 0); diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs index 9a6b97cb82..9d2a395def 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs @@ -78,7 +78,7 @@ public void TestLinkCatalogueToDatasetNotAll() _ci2.SaveToDatabase(); - var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "TEST_dataset"); + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); Assert.DoesNotThrow(() => cmd.Execute()); var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); var foundCatalogue = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(c => c.Name == "Dataset1").First(); @@ -100,7 +100,7 @@ public void TestLinkCatalogueToDatasetNotAll() [Test] public void TestLinkCatalogueToDatasetBadCatalogue() { - var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "TEST_dataset"); + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); Assert.DoesNotThrow(() => cmd.Execute()); var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); var linkCmd = new ExecuteCommandLinkCatalogueInfoToDataset(GetMockActivator(), null, founddataset, false); diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs index f0dcc70e33..7cf8ee63bc 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs @@ -75,7 +75,7 @@ public void TestLinkColumnInfoToDatasetNotAll() _ci2.SaveToDatabase(); - var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "TEST_dataset"); + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); Assert.DoesNotThrow(() => cmd.Execute()); var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); var foundCatalogue = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(c => c.Name == "Dataset1").First(); @@ -96,7 +96,7 @@ public void TestLinkColumnInfoToDatasetNotAll() [Test] public void TestLinkCatalogueToDatasetBadCoulmnInfo() { - var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "TEST_dataset"); + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); Assert.DoesNotThrow(() => cmd.Execute()); var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); var linkCmd = new ExecuteCommandLinkColumnInfoToDataset(GetMockActivator(), null, founddataset, false); @@ -106,7 +106,7 @@ public void TestLinkCatalogueToDatasetBadCoulmnInfo() [Test] public void TestLinkColumInfoToDatasetBadDataset() { - var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "TEST_dataset"); + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); Assert.DoesNotThrow(() => cmd.Execute()); var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); var linkCmd = new ExecuteCommandLinkColumnInfoToDataset(GetMockActivator(), new ColumnInfo(), null, false); From c7f60b358fcfb036f9e24fddec2d6d124c27f32d Mon Sep 17 00:00:00 2001 From: James Friel Date: Fri, 24 Nov 2023 15:07:36 +0000 Subject: [PATCH 63/85] remove test string --- .../ExecuteCommandLinkCatalogueToDatasetTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs index 9d2a395def..48fb366351 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs @@ -110,7 +110,7 @@ public void TestLinkCatalogueToDatasetBadCatalogue() [Test] public void TestLinkCatalogueToDatasetBadDataset() { - var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "TEST_dataset"); + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); Assert.DoesNotThrow(() => cmd.Execute()); var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); var linkCmd = new ExecuteCommandLinkCatalogueInfoToDataset(GetMockActivator(), new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository,"catalogue"), null, false); From 110b123b63925c1361a2870b129feb3b633e9f5c Mon Sep 17 00:00:00 2001 From: James Friel Date: Mon, 27 Nov 2023 08:38:27 +0000 Subject: [PATCH 64/85] cli create --- .../AtomicCommands/ExecuteCommandCreateDataset.cs | 9 +++------ .../AtomicCommands/ExecuteCommandCreateNewDatasetUI.cs | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs index c835394cc0..bdd936a5bc 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs @@ -1,4 +1,5 @@ -using System; +using Rdmp.Core.Curation.Data; +using System; namespace Rdmp.Core.CommandExecution.AtomicCommands; @@ -10,12 +11,8 @@ public class ExecuteCommandCreateDataset : BasicCommandExecution, IAtomicCommand private string _name; private string _source; IBasicActivateItems _activator; - public ExecuteCommandCreateDataset(IBasicActivateItems basicActivator) : base(basicActivator) - { - _activator = basicActivator; - } - public ExecuteCommandCreateDataset(IBasicActivateItems activator, string name, string doi = null,string source = null) : base(activator) + public ExecuteCommandCreateDataset(IBasicActivateItems activator, [DemandsInitialization("The name of the dataset")]string name, string doi = null,string source = null) : base(activator) { _name = name; _doi = doi; diff --git a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandCreateNewDatasetUI.cs b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandCreateNewDatasetUI.cs index 1b01aa5a61..d6ab1c9c41 100644 --- a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandCreateNewDatasetUI.cs +++ b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandCreateNewDatasetUI.cs @@ -19,7 +19,7 @@ public class ExecuteCommandCreateNewDatasetUI : ExecuteCommandCreateDataset private readonly IActivateItems _activator; public ExecuteCommandCreateNewDatasetUI(IActivateItems activator) : base( - activator) + activator,"") { _activator = activator; } From 32619814abfd0876f23ce3d39112e50fe08d58fc Mon Sep 17 00:00:00 2001 From: James Friel Date: Mon, 27 Nov 2023 08:50:43 +0000 Subject: [PATCH 65/85] update cli commands --- .../ExecuteCommandLinkCatalogueToDatasetTests.cs | 10 +++++----- .../AtomicCommands/ExecuteCommandDeleteDataset.cs | 2 +- ...aset.cs => ExecuteCommandLinkCatalogueToDataset.cs} | 4 ++-- .../ExecuteCommandLinkColumnInfoToDataset.cs | 6 +++--- .../ExecuteCommandLinkCatalogueToDataset.cs | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) rename Rdmp.Core/CommandExecution/AtomicCommands/{ExecuteCommandLinkCatalogueInfoToDataset.cs => ExecuteCommandLinkCatalogueToDataset.cs} (79%) diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs index 48fb366351..9368f25d0d 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs @@ -46,7 +46,7 @@ public void TestLinkCatalogueToDataset() Assert.DoesNotThrow(() => cmd.Execute()); var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); var foundCatalogue = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(c => c.Name == "Dataset1").First(); - var linkCmd = new ExecuteCommandLinkCatalogueInfoToDataset(GetMockActivator(), foundCatalogue, founddataset); + var linkCmd = new ExecuteCommandLinkCatalogueToDataset(GetMockActivator(), foundCatalogue, founddataset); Assert.DoesNotThrow(() => linkCmd.Execute()); var columInfo = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects(); foreach (var ci in columInfo) @@ -82,7 +82,7 @@ public void TestLinkCatalogueToDatasetNotAll() Assert.DoesNotThrow(() => cmd.Execute()); var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); var foundCatalogue = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(c => c.Name == "Dataset1").First(); - var linkCmd = new ExecuteCommandLinkCatalogueInfoToDataset(GetMockActivator(), foundCatalogue, founddataset, false); + var linkCmd = new ExecuteCommandLinkCatalogueToDataset(GetMockActivator(), foundCatalogue, founddataset, false); Assert.DoesNotThrow(() => linkCmd.Execute()); var columInfo = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ci => _cata1.CatalogueItems.Contains(ci)); foreach (var ci in columInfo) @@ -103,7 +103,7 @@ public void TestLinkCatalogueToDatasetBadCatalogue() var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); Assert.DoesNotThrow(() => cmd.Execute()); var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); - var linkCmd = new ExecuteCommandLinkCatalogueInfoToDataset(GetMockActivator(), null, founddataset, false); + var linkCmd = new ExecuteCommandLinkCatalogueToDataset(GetMockActivator(), null, founddataset, false); Assert.Throws(()=>linkCmd.Execute()); } @@ -113,14 +113,14 @@ public void TestLinkCatalogueToDatasetBadDataset() var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); Assert.DoesNotThrow(() => cmd.Execute()); var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); - var linkCmd = new ExecuteCommandLinkCatalogueInfoToDataset(GetMockActivator(), new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository,"catalogue"), null, false); + var linkCmd = new ExecuteCommandLinkCatalogueToDataset(GetMockActivator(), new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository,"catalogue"), null, false); Assert.Throws(() => linkCmd.Execute()); } [Test] public void TestLinkCatalogueToDatasetBadEverything() { - var linkCmd = new ExecuteCommandLinkCatalogueInfoToDataset(GetMockActivator(), null, null, false); + var linkCmd = new ExecuteCommandLinkCatalogueToDataset(GetMockActivator(), null, null, false); Assert.Throws(() => linkCmd.Execute()); } } diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs index 009656a3f0..739fae4cca 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs @@ -8,7 +8,7 @@ public class ExecuteCommandDeleteDataset: BasicCommandExecution, IAtomicCommand { private Curation.Data.Dataset _dataset; private IBasicActivateItems _activator; -public ExecuteCommandDeleteDataset(IBasicActivateItems activator, Curation.Data.Dataset dataset) +public ExecuteCommandDeleteDataset(IBasicActivateItems activator, [DemandsInitialization("The Dataset to delete")]Curation.Data.Dataset dataset) { _dataset = dataset; _activator = activator; diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueInfoToDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs similarity index 79% rename from Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueInfoToDataset.cs rename to Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs index 2507d47152..b6badf54a9 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueInfoToDataset.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs @@ -7,12 +7,12 @@ namespace Rdmp.Core.CommandExecution.AtomicCommands; -public class ExecuteCommandLinkCatalogueInfoToDataset : BasicCommandExecution, IAtomicCommand +public class ExecuteCommandLinkCatalogueToDataset : BasicCommandExecution, IAtomicCommand { private Catalogue _catalogue; private Curation.Data.Dataset _dataset; private bool _linkAll; - public ExecuteCommandLinkCatalogueInfoToDataset(IBasicActivateItems activator, Catalogue catalogue, Curation.Data.Dataset dataset, bool linkAllOtherColumns = true) : base(activator) + public ExecuteCommandLinkCatalogueToDataset(IBasicActivateItems activator, [DemandsInitialization("The catalogue To link")]Catalogue catalogue, [DemandsInitialization("The dataset to link to")]Curation.Data.Dataset dataset, bool linkAllOtherColumns = true) : base(activator) { _catalogue = catalogue; _dataset = dataset; diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataset.cs index df9d018f7a..ec6f6ba3fa 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataset.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataset.cs @@ -11,7 +11,7 @@ public class ExecuteCommandLinkColumnInfoToDataset : BasicCommandExecution private ColumnInfo _columnInfo; private Curation.Data.Dataset _dataset; private bool _linkAll; - public ExecuteCommandLinkColumnInfoToDataset(IBasicActivateItems activator, ColumnInfo columnInfo, Curation.Data.Dataset dataset, bool linkAllOtherColumns = true) : base(activator) + public ExecuteCommandLinkColumnInfoToDataset(IBasicActivateItems activator, [DemandsInitialization("The column to link")] ColumnInfo columnInfo, [DemandsInitialization("The dataset to link to")] Curation.Data.Dataset dataset, bool linkAllOtherColumns = true) : base(activator) { _columnInfo = columnInfo; _dataset = dataset; @@ -24,10 +24,10 @@ public override void Execute() base.Execute(); _columnInfo.Dataset_ID = _dataset.ID; _columnInfo.SaveToDatabase(); - if(_linkAll ) + if (_linkAll) { var databaseName = _columnInfo.Name[.._columnInfo.Name.LastIndexOf('.')]; - var catalogueItems = _columnInfo.CatalogueRepository.GetAllObjects().Where( ci => ci.Name[..ci.Name.LastIndexOf(".")] == databaseName); + var catalogueItems = _columnInfo.CatalogueRepository.GetAllObjects().Where(ci => ci.Name[..ci.Name.LastIndexOf(".")] == databaseName); foreach (var ci in catalogueItems) { ci.Dataset_ID = _dataset.ID; diff --git a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs index dd27e0c95c..d234dc5774 100644 --- a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs +++ b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs @@ -50,7 +50,7 @@ public override void Execute() if (_selectedDataset is not null) { var backfill = YesNo("Link all other columns that match the source table?", "Do you want to link this dataset to all other columns that reference the same table as this column?"); - var cmd = new ExecuteCommandLinkCatalogueInfoToDataset(_activateItems, _catalogue, _selectedDataset, backfill); + var cmd = new ExecuteCommandLinkCatalogueToDataset(_activateItems, _catalogue, _selectedDataset, backfill); cmd.Execute(); } } From 29cd964e6aaed49e9023c6f7ab2e5f9756dbbe7b Mon Sep 17 00:00:00 2001 From: James Friel Date: Mon, 27 Nov 2023 09:08:14 +0000 Subject: [PATCH 66/85] fix test --- .../ExecuteCommandLinkCatalogueToDatasetTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs index 9368f25d0d..47042bcf35 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs @@ -53,6 +53,8 @@ public void TestLinkCatalogueToDataset() { Assert.AreEqual(ci.Dataset_ID, founddataset.ID); } + founddataset.DeleteInDatabase(); + foundCatalogue.DeleteInDatabase(); } [Test] From 1c253c6537032a5b024afac4b76be8331800406e Mon Sep 17 00:00:00 2001 From: James Friel Date: Mon, 27 Nov 2023 09:32:44 +0000 Subject: [PATCH 67/85] fix dupe file name --- .../AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs | 7 +++++-- ...ataset.cs => ExecuteCommandLinkCatalogueToDatasetUI.cs} | 4 ++-- Rdmp.UI/Menus/CatalogueMenu.cs | 2 +- Tests.Common/TestDatabases.txt | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) rename Rdmp.UI/CommandExecution/AtomicCommands/{ExecuteCommandLinkCatalogueToDataset.cs => ExecuteCommandLinkCatalogueToDatasetUI.cs} (92%) diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs index b6badf54a9..957d2df911 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs @@ -1,5 +1,8 @@ - - +// Copyright (c) The University of Dundee 2018-2023 +// This file is part of the Research Data Management Platform (RDMP). +// RDMP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. +// RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with RDMP. If not, see . using Rdmp.Core.Curation.Data; using System; diff --git a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDatasetUI.cs similarity index 92% rename from Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs rename to Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDatasetUI.cs index d234dc5774..5ae8668c1b 100644 --- a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs +++ b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDatasetUI.cs @@ -21,13 +21,13 @@ namespace Rdmp.UI.CommandExecution.AtomicCommands; -public class ExecuteCommandLinkCatalogueToDataSet : BasicUICommandExecution, IAtomicCommand +public class ExecuteCommandLinkCatalogueToDatasetUI : BasicUICommandExecution, IAtomicCommand { private readonly Catalogue _catalogue; private Dataset _selectedDataset; private IActivateItems _activateItems; - public ExecuteCommandLinkCatalogueToDataSet(IActivateItems activator, Catalogue catalogue) : base(activator) + public ExecuteCommandLinkCatalogueToDatasetUI(IActivateItems activator, Catalogue catalogue) : base(activator) { _catalogue = catalogue; _activateItems = activator; diff --git a/Rdmp.UI/Menus/CatalogueMenu.cs b/Rdmp.UI/Menus/CatalogueMenu.cs index d17456d237..d4689f85ae 100644 --- a/Rdmp.UI/Menus/CatalogueMenu.cs +++ b/Rdmp.UI/Menus/CatalogueMenu.cs @@ -24,7 +24,7 @@ internal class CatalogueMenu : RDMPContextMenuStrip public CatalogueMenu(RDMPContextMenuStripArgs args, Catalogue catalogue) : base(args, catalogue) { var isApiCall = catalogue.IsApiCall(); - Add(new ExecuteCommandLinkCatalogueToDataSet(_activator, catalogue)); + Add(new ExecuteCommandLinkCatalogueToDatasetUI(_activator, catalogue)); Add(new ExecuteCommandGenerateMetadataReport(_activator, catalogue) { Weight = -99.059f diff --git a/Tests.Common/TestDatabases.txt b/Tests.Common/TestDatabases.txt index bc2a95b27d..168e37154c 100644 --- a/Tests.Common/TestDatabases.txt +++ b/Tests.Common/TestDatabases.txt @@ -6,7 +6,7 @@ #To achieve this, you can run DatabaseCreation.exe with argument 1 being your ServerName #You can apply a prefix e.g. TEST_ as an argument to DatabaseCreation.exe and include that prefix below if you like -Prefix: TEST_ +Prefix: RDMP_ ServerName: (localdb)\MSSQLLocalDB #Uncomment to run tests with a YamlRepository #UseFileSystemRepo: true From c98f279a9b731e57e1fe79853ad32f0ace8551a2 Mon Sep 17 00:00:00 2001 From: James Friel Date: Mon, 27 Nov 2023 09:42:39 +0000 Subject: [PATCH 68/85] revert test db --- Tests.Common/TestDatabases.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests.Common/TestDatabases.txt b/Tests.Common/TestDatabases.txt index 168e37154c..bc2a95b27d 100644 --- a/Tests.Common/TestDatabases.txt +++ b/Tests.Common/TestDatabases.txt @@ -6,7 +6,7 @@ #To achieve this, you can run DatabaseCreation.exe with argument 1 being your ServerName #You can apply a prefix e.g. TEST_ as an argument to DatabaseCreation.exe and include that prefix below if you like -Prefix: RDMP_ +Prefix: TEST_ ServerName: (localdb)\MSSQLLocalDB #Uncomment to run tests with a YamlRepository #UseFileSystemRepo: true From 4902c5dee7621a3e34ed915a6eb3fbf5f0c0bfe3 Mon Sep 17 00:00:00 2001 From: James Friel Date: Mon, 27 Nov 2023 13:29:49 +0000 Subject: [PATCH 69/85] set dataset private --- Rdmp.Core/Curation/Data/Dataset.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Rdmp.Core/Curation/Data/Dataset.cs b/Rdmp.Core/Curation/Data/Dataset.cs index 2bba894c7e..8cb910294d 100644 --- a/Rdmp.Core/Curation/Data/Dataset.cs +++ b/Rdmp.Core/Curation/Data/Dataset.cs @@ -24,9 +24,9 @@ namespace Rdmp.Core.Curation.Data; public class Dataset : DatabaseEntity, IDataset, IHasFolder { - string _name; - string _digitalObjectIdentifier; - string _source; + private string _name; + private string _digitalObjectIdentifier; + private string _source; private string _folder = FolderHelper.Root; /// From 2faf796c7dad336222205385439b04e8bcc0895f Mon Sep 17 00:00:00 2001 From: James Friel Date: Mon, 27 Nov 2023 13:38:58 +0000 Subject: [PATCH 70/85] re-add fk --- .../runAfterCreateDatabase/CreateCatalogue.sql | 4 ++-- .../Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Rdmp.Core/Databases/CatalogueDatabase/runAfterCreateDatabase/CreateCatalogue.sql b/Rdmp.Core/Databases/CatalogueDatabase/runAfterCreateDatabase/CreateCatalogue.sql index 222c98e19e..ac7d12b279 100644 --- a/Rdmp.Core/Databases/CatalogueDatabase/runAfterCreateDatabase/CreateCatalogue.sql +++ b/Rdmp.Core/Databases/CatalogueDatabase/runAfterCreateDatabase/CreateCatalogue.sql @@ -915,8 +915,8 @@ CREATE TABLE [dbo].Dataset( ) ON [PRIMARY] GO ALTER TABLE [dbo].[ColumnInfo] ADD Dataset_ID [int] NULL ---GO ---ALTER TABLE [dbo].[ColumnInfo] ADD CONSTRAINT [FK_Column_Info_Dataset] FOREIGN KEY([Dataset_ID]) REFERENCES [dbo].[Dataset] ([ID]) ON DELETE CASCADE ON UPDATE CASCADE +GO +ALTER TABLE [dbo].[ColumnInfo] ADD CONSTRAINT [FK_Column_Info_Dataset] FOREIGN KEY([Dataset_ID]) REFERENCES [dbo].[Dataset] ([ID]) ON DELETE CASCADE ON UPDATE CASCADE GO SET ANSI_PADDING OFF diff --git a/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql b/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql index f282266c41..114460613d 100644 --- a/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql +++ b/Rdmp.Core/Databases/CatalogueDatabase/up/077_AddDataSetMapping.sql @@ -23,5 +23,5 @@ IF NOT EXISTS(SELECT 1 FROM sys.columns AND Object_ID = Object_ID('ColumnInfo')) BEGIN ALTER TABLE [dbo].[ColumnInfo] ADD Dataset_ID [int] NULL ---ALTER TABLE [dbo].[ColumnInfo] ADD CONSTRAINT [FK_Column_Info_Dataset] FOREIGN KEY([Dataset_ID]) REFERENCES [dbo].[Dataset] ([ID]) ON DELETE CASCADE ON UPDATE CASCADE +ALTER TABLE [dbo].[ColumnInfo] ADD CONSTRAINT [FK_Column_Info_Dataset] FOREIGN KEY([Dataset_ID]) REFERENCES [dbo].[Dataset] ([ID]) ON DELETE CASCADE ON UPDATE CASCADE END From 2b432c91ededd4c4dd8793e9f8750e1d6ddeaf75 Mon Sep 17 00:00:00 2001 From: jas88 Date: Tue, 5 Dec 2023 09:37:43 -0600 Subject: [PATCH 71/85] Fix up NUnit 4 API changes, cache MockActivator --- .../CommandExecution/CommandCliTests.cs | 14 ++++++++++++-- .../ExecuteCommandCreateDatasetTests.cs | 2 +- .../ExecuteCommandDeleteDatasetTest.cs | 8 ++++---- .../ExecuteCommandLinkCatalogueToDatasetTests.cs | 6 +++--- ...ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs | 8 ++++---- 5 files changed, 24 insertions(+), 14 deletions(-) diff --git a/Rdmp.Core.Tests/CommandExecution/CommandCliTests.cs b/Rdmp.Core.Tests/CommandExecution/CommandCliTests.cs index 246768e000..fb3f04fa1f 100644 --- a/Rdmp.Core.Tests/CommandExecution/CommandCliTests.cs +++ b/Rdmp.Core.Tests/CommandExecution/CommandCliTests.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading; using NSubstitute; using Rdmp.Core.CommandExecution; using Rdmp.Core.CommandLine.Interactive; @@ -31,12 +32,19 @@ protected CommandInvoker GetInvoker() { DisallowInput = true }); - invoker.CommandImpossible += (s, c) => throw new Exception(c.Command.ReasonCommandImpossible); + invoker.CommandImpossible += static (s, c) => throw new Exception(c.Command.ReasonCommandImpossible); return invoker; } - protected IBasicActivateItems GetMockActivator() + private readonly Lazy _mockActivator; + + protected CommandCliTests() + { + _mockActivator = new Lazy(MakeMockActivator, LazyThreadSafetyMode.ExecutionAndPublication); + } + + private IBasicActivateItems MakeMockActivator() { var mock = Substitute.For(); mock.RepositoryLocator.Returns(RepositoryLocator); @@ -44,6 +52,8 @@ protected IBasicActivateItems GetMockActivator() return mock; } + protected IBasicActivateItems GetMockActivator() => _mockActivator.Value; + /// /// Runs the provided string which should start after the cmd e.g. the bit after rdmp cmd /// diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandCreateDatasetTests.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandCreateDatasetTests.cs index d2ac86824a..9efdbd6f2d 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandCreateDatasetTests.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandCreateDatasetTests.cs @@ -27,6 +27,6 @@ public void TestDatasetCreationOKExtendedParameters() var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset2","somedoi","some source"); Assert.DoesNotThrow(() => cmd.Execute()); var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ds => ds.Name == "dataset2" && ds.DigitalObjectIdentifier == "somedoi" && ds.Source == "some source").First(); - Assert.IsNotNull(founddataset); + Assert.That(founddataset,Is.Not.Null); } } diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs index 43a714edb6..5ca61af1ae 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs @@ -16,21 +16,21 @@ public void TestDeleteExistingDataset() { var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); Assert.DoesNotThrow(() => cmd.Execute()); - Assert.AreEqual(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Length, 1); + Assert.That(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Length,Is.EqualTo(1)); var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ds => ds.Name == "dataset").First(); var delCmd = new ExecuteCommandDeleteDataset(GetMockActivator(), founddataset); Assert.DoesNotThrow(() => delCmd.Execute()); - Assert.AreEqual(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Length, 0); + Assert.That(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Length, Is.EqualTo(0)); } [Test] public void TestDeleteNonExistantDataset() { - Assert.AreEqual(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Length, 0); + Assert.That(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Length, Is.EqualTo(0)); var founddataset = new Core.Curation.Data.Dataset(); var delCmd = new ExecuteCommandDeleteDataset(GetMockActivator(), founddataset); Assert.Throws(() => delCmd.Execute()); - Assert.AreEqual(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Length, 0); + Assert.That(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Length, Is.EqualTo(0)); } } } diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs index 47042bcf35..8cacad8064 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs @@ -51,7 +51,7 @@ public void TestLinkCatalogueToDataset() var columInfo = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects(); foreach (var ci in columInfo) { - Assert.AreEqual(ci.Dataset_ID, founddataset.ID); + Assert.That(ci.Dataset_ID, Is.EqualTo(founddataset.ID)); } founddataset.DeleteInDatabase(); foundCatalogue.DeleteInDatabase(); @@ -89,13 +89,13 @@ public void TestLinkCatalogueToDatasetNotAll() var columInfo = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ci => _cata1.CatalogueItems.Contains(ci)); foreach (var ci in columInfo) { - Assert.AreEqual(ci.ColumnInfo.Dataset_ID, founddataset.ID); + Assert.That(ci.ColumnInfo.Dataset_ID, Is.EqualTo(founddataset.ID)); } var columInfo2 = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ci => _cata2.CatalogueItems.Contains(ci)); foreach (var ci in columInfo2) { - Assert.AreEqual(ci.ColumnInfo.Dataset_ID, null); + Assert.That(ci.ColumnInfo.Dataset_ID, Is.Null); } } diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs index 7cf8ee63bc..ffc13c2254 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs @@ -49,7 +49,7 @@ public void TestLinkColumnInfoToDataset() var columInfo = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects(); foreach (var ci in columInfo) { - Assert.AreEqual(ci.Dataset_ID, founddataset.ID); + Assert.That(ci.Dataset_ID, Is.EqualTo(founddataset.ID)); } } [Test] @@ -84,17 +84,17 @@ public void TestLinkColumnInfoToDatasetNotAll() var columInfo = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ci => _cata1.CatalogueItems.Contains(ci)); foreach (var ci in columInfo) { - Assert.AreEqual(ci.ColumnInfo.Dataset_ID, founddataset.ID); + Assert.That(ci.ColumnInfo.Dataset_ID, Is.EqualTo(founddataset.ID)); } var columInfo2 = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ci => _cata2.CatalogueItems.Contains(ci)); foreach (var ci in columInfo2) { - Assert.AreEqual(ci.ColumnInfo.Dataset_ID, null); + Assert.That(ci.ColumnInfo.Dataset_ID, Is.Null); } } [Test] - public void TestLinkCatalogueToDatasetBadCoulmnInfo() + public void TestLinkCatalogueToDatasetBadColumnInfo() { var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); Assert.DoesNotThrow(() => cmd.Execute()); From 956f43f657606f79f49a41996d5a906b1926a016 Mon Sep 17 00:00:00 2001 From: jas88 Date: Tue, 5 Dec 2023 09:40:21 -0600 Subject: [PATCH 72/85] Update AtomicCommandFactory.cs Fix duplication of 'add plugin' item --- Rdmp.Core/CommandExecution/AtomicCommandFactory.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Rdmp.Core/CommandExecution/AtomicCommandFactory.cs b/Rdmp.Core/CommandExecution/AtomicCommandFactory.cs index a07364b233..e5b382dbb5 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommandFactory.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommandFactory.cs @@ -473,7 +473,6 @@ public IEnumerable CreateCommands(object o) yield return new ExecuteCommandCreateHoldoutLookup(_activator, cic) { Weight = -50.5f }; - var clone = new ExecuteCommandCloneCohortIdentificationConfiguration(_activator) { Weight = -50.4f, OverrideCommandName = "Clone" }.SetTarget(cic); if (pcic != null) clone.SetTarget((DatabaseEntity)pcic.Project); @@ -565,7 +564,6 @@ public IEnumerable CreateCommands(object o) if (Is(o, out AllPluginsNode _)) { - yield return new ExecuteCommandAddPlugins(_activator); yield return new ExecuteCommandAddPlugins(_activator); yield return new ExecuteCommandPrunePlugin(_activator); yield return new ExecuteCommandExportPlugins(_activator); From a9f91e293b29f02f0bdcb1d9b4696d5e06136f46 Mon Sep 17 00:00:00 2001 From: jas88 Date: Tue, 5 Dec 2023 09:41:37 -0600 Subject: [PATCH 73/85] Update ExecuteCommandCreateDataset.cs Make the instance-constants readonly and private --- .../AtomicCommands/ExecuteCommandCreateDataset.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs index bdd936a5bc..4c446f1906 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs @@ -5,12 +5,10 @@ namespace Rdmp.Core.CommandExecution.AtomicCommands; public class ExecuteCommandCreateDataset : BasicCommandExecution, IAtomicCommand { - - - private string _doi; - private string _name; - private string _source; - IBasicActivateItems _activator; + private readonly string _doi; + private readonly string _name; + private readonly string _source; + private readonly IBasicActivateItems _activator; public ExecuteCommandCreateDataset(IBasicActivateItems activator, [DemandsInitialization("The name of the dataset")]string name, string doi = null,string source = null) : base(activator) { From e06907600a4ae5c325802df2c989441773e16f76 Mon Sep 17 00:00:00 2001 From: jas88 Date: Tue, 5 Dec 2023 09:44:03 -0600 Subject: [PATCH 74/85] Update ExecuteCommandCreateDataset.cs Move name validation to constructor, use SetImpossible --- .../AtomicCommands/ExecuteCommandCreateDataset.cs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs index 4c446f1906..f7bc115f6c 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs @@ -16,19 +16,17 @@ public ExecuteCommandCreateDataset(IBasicActivateItems activator, [DemandsInitia _doi = doi; _source = source; _activator = activator; + + if (string.IsNullOrWhiteSpace(_name)) + SetImpossible("Datasets require a name"); } public override void Execute() { - if (string.IsNullOrWhiteSpace(_name)) - { - throw new Exception("Datasets requires a name"); - } base.Execute(); var dataset = new Curation.Data.Dataset(BasicActivator.RepositoryLocator.CatalogueRepository, _name) { DigitalObjectIdentifier = _doi, Source = _source }; dataset.SaveToDatabase(); _activator.Publish(dataset); - } } \ No newline at end of file From b2e7e291c6050d2cf5b5bcc272a22ae8e5e7a1af Mon Sep 17 00:00:00 2001 From: jas88 Date: Tue, 5 Dec 2023 09:47:48 -0600 Subject: [PATCH 75/85] Readonly, redundant subclassing --- .../ExecuteCommandCreateDataset.cs | 3 +-- .../ExecuteCommandDeleteDataset.cs | 6 ++--- .../ExecuteCommandDeleteDatasetUI.cs | 25 +++++++------------ 3 files changed, 13 insertions(+), 21 deletions(-) diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs index f7bc115f6c..c04a7929c8 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateDataset.cs @@ -1,9 +1,8 @@ using Rdmp.Core.Curation.Data; -using System; namespace Rdmp.Core.CommandExecution.AtomicCommands; -public class ExecuteCommandCreateDataset : BasicCommandExecution, IAtomicCommand +public class ExecuteCommandCreateDataset : BasicCommandExecution { private readonly string _doi; private readonly string _name; diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs index 739fae4cca..3b8bd1c80c 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs @@ -4,10 +4,10 @@ using System.Linq; namespace Rdmp.Core.CommandExecution.AtomicCommands; -public class ExecuteCommandDeleteDataset: BasicCommandExecution, IAtomicCommand +public sealed class ExecuteCommandDeleteDataset: BasicCommandExecution { - private Curation.Data.Dataset _dataset; - private IBasicActivateItems _activator; + private readonly Curation.Data.Dataset _dataset; + private readonly IBasicActivateItems _activator; public ExecuteCommandDeleteDataset(IBasicActivateItems activator, [DemandsInitialization("The Dataset to delete")]Curation.Data.Dataset dataset) { _dataset = dataset; diff --git a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandDeleteDatasetUI.cs b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandDeleteDatasetUI.cs index 37ee538aa2..90803cb3a3 100644 --- a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandDeleteDatasetUI.cs +++ b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandDeleteDatasetUI.cs @@ -1,22 +1,16 @@ -using Rdmp.Core.CommandExecution.AtomicCommands; -using Rdmp.Core.Curation.Data; +using Rdmp.Core.Curation.Data; using Rdmp.Core.Icons.IconProvision; using Rdmp.Core.ReusableLibraryCode.Icons.IconProvision; using Rdmp.UI.ItemActivation; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Rdmp.UI.CommandExecution.AtomicCommands; -public class ExecuteCommandDeleteDatasetUI : BasicUICommandExecution, IAtomicCommand +public sealed class ExecuteCommandDeleteDatasetUI : BasicUICommandExecution { - private IActivateItems _activateItems; - private Dataset _dataset; + private readonly IActivateItems _activateItems; + private readonly Dataset _dataset; public ExecuteCommandDeleteDatasetUI(IActivateItems activator, Dataset dataset) : base(activator) { @@ -31,12 +25,11 @@ public override void Execute() { base.Execute(); var confirmDelete = YesNo( $"Are you sure you want to delete the dataset \"{_dataset.Name}\"?", $"Delete Dataset: {_dataset.Name}"); - if (confirmDelete) - { - var cmd = new Core.CommandExecution.AtomicCommands.ExecuteCommandDeleteDataset(_activateItems, _dataset); - cmd.Execute(); - _activateItems.RefreshBus.Publish(this, new Refreshing.RefreshObjectEventArgs(_dataset)); - } + if (!confirmDelete) return; + + var cmd = new Core.CommandExecution.AtomicCommands.ExecuteCommandDeleteDataset(_activateItems, _dataset); + cmd.Execute(); + _activateItems.RefreshBus.Publish(this, new Refreshing.RefreshObjectEventArgs(_dataset)); } From 7f8234cc780fe4756e88d370e3b00a17c0a18d0a Mon Sep 17 00:00:00 2001 From: jas88 Date: Tue, 5 Dec 2023 09:53:32 -0600 Subject: [PATCH 76/85] Update ExecuteCommandLinkCatalogueToDataset.cs Use SetImpossible instead of throwing plain Exception --- .../ExecuteCommandLinkCatalogueToDataset.cs | 38 ++++++++----------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs index 957d2df911..888b1de515 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs @@ -10,47 +10,39 @@ namespace Rdmp.Core.CommandExecution.AtomicCommands; -public class ExecuteCommandLinkCatalogueToDataset : BasicCommandExecution, IAtomicCommand +public sealed class ExecuteCommandLinkCatalogueToDataset : BasicCommandExecution { - private Catalogue _catalogue; - private Curation.Data.Dataset _dataset; - private bool _linkAll; + private readonly Catalogue _catalogue; + private readonly Curation.Data.Dataset _dataset; + private readonly bool _linkAll; public ExecuteCommandLinkCatalogueToDataset(IBasicActivateItems activator, [DemandsInitialization("The catalogue To link")]Catalogue catalogue, [DemandsInitialization("The dataset to link to")]Curation.Data.Dataset dataset, bool linkAllOtherColumns = true) : base(activator) { _catalogue = catalogue; _dataset = dataset; _linkAll = linkAllOtherColumns; + + if (_catalogue is null) SetImpossible("No Catalogue Selected"); + if (_dataset is null) SetImpossible("No Dataset Selected"); } public override void Execute() { base.Execute(); - if (_catalogue is null) throw new Exception("No Catalogue Selected"); - if (_dataset is null) throw new Exception("No Dataset Selected"); var items = _catalogue.CatalogueItems.ToList(); - foreach (var item in items) + foreach (var ci in items.Select(static item => item.ColumnInfo).Where(ci => ci?.Dataset_ID != _dataset.ID)) { - var ci = item.ColumnInfo; - if (ci is null) continue; - if (ci.Dataset_ID == _dataset.ID) - { - continue; - } - ci.Dataset_ID = _dataset.ID; ci.SaveToDatabase(); - if (_linkAll) + if (!_linkAll) continue; + + var databaseName = ci.Name[..ci.Name.LastIndexOf('.')]; + var catalogueItems = ci.CatalogueRepository.GetAllObjects().Where(ci => ci.Name[..ci.Name.LastIndexOf(".")] == databaseName).ToList(); + foreach (var aci in catalogueItems) { - var databaseName = ci.Name[..ci.Name.LastIndexOf('.')]; - var catalogueItems = ci.CatalogueRepository.GetAllObjects().Where(ci => ci.Name[..ci.Name.LastIndexOf(".")] == databaseName); - foreach (var aci in catalogueItems) - { - aci.Dataset_ID = _dataset.ID; - aci.SaveToDatabase(); - } + aci.Dataset_ID = _dataset.ID; + aci.SaveToDatabase(); } - } } From 7a8c325ce12d9a8a0e0d68a8a3e726a7ce1f2618 Mon Sep 17 00:00:00 2001 From: jas88 Date: Tue, 5 Dec 2023 10:09:06 -0600 Subject: [PATCH 77/85] Update AtomicCommandFactory.cs Fix edit slip from earlier --- Rdmp.Core/CommandExecution/AtomicCommandFactory.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Rdmp.Core/CommandExecution/AtomicCommandFactory.cs b/Rdmp.Core/CommandExecution/AtomicCommandFactory.cs index e5b382dbb5..30fb077df2 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommandFactory.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommandFactory.cs @@ -231,6 +231,7 @@ public IEnumerable CreateCommands(object o) if (Is(o, out CatalogueItem ci)) { yield return new ExecuteCommandCreateNewFilter(_activator, ci) { OverrideCommandName = "Add New Filter" }; + yield return new ExecuteCommandLinkCatalogueItemToColumnInfo(_activator, ci); yield return new ExecuteCommandMakeCatalogueItemExtractable(_activator, ci); yield return new ExecuteCommandChangeExtractionCategory(_activator, new[] { ci.ExtractionInformation }); yield return new ExecuteCommandImportCatalogueItemDescription(_activator, ci) From 493f03bb9bf22cb1f546cff6c5e6c0a782db0110 Mon Sep 17 00:00:00 2001 From: jas88 Date: Tue, 5 Dec 2023 10:09:42 -0600 Subject: [PATCH 78/85] Update ExecuteCommandDeleteDatasetTest.cs NUnit 4 API fixup --- .../CommandExecution/ExecuteCommandDeleteDatasetTest.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs index 5ca61af1ae..902659c57e 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs @@ -16,21 +16,21 @@ public void TestDeleteExistingDataset() { var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); Assert.DoesNotThrow(() => cmd.Execute()); - Assert.That(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Length,Is.EqualTo(1)); + Assert.That(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects(), Has.Length.EqualTo(1)); var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ds => ds.Name == "dataset").First(); var delCmd = new ExecuteCommandDeleteDataset(GetMockActivator(), founddataset); Assert.DoesNotThrow(() => delCmd.Execute()); - Assert.That(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Length, Is.EqualTo(0)); + Assert.That(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects(), Is.Empty); } [Test] public void TestDeleteNonExistantDataset() { - Assert.That(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Length, Is.EqualTo(0)); + Assert.That(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects(), Is.Empty); var founddataset = new Core.Curation.Data.Dataset(); var delCmd = new ExecuteCommandDeleteDataset(GetMockActivator(), founddataset); Assert.Throws(() => delCmd.Execute()); - Assert.That(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Length, Is.EqualTo(0)); + Assert.That(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects(), Is.Empty); } } } From 4c9c8f19b30d66f0d6b271bb532365e3f20b7804 Mon Sep 17 00:00:00 2001 From: jas88 Date: Tue, 5 Dec 2023 10:09:59 -0600 Subject: [PATCH 79/85] Update ExecuteCommandLinkCatalogueToDataset.cs Use StringComparison.Ordinal where possible --- .../AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs index 888b1de515..683d910a14 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDataset.cs @@ -4,8 +4,8 @@ // RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with RDMP. If not, see . -using Rdmp.Core.Curation.Data; using System; +using Rdmp.Core.Curation.Data; using System.Linq; namespace Rdmp.Core.CommandExecution.AtomicCommands; @@ -37,7 +37,7 @@ public override void Execute() if (!_linkAll) continue; var databaseName = ci.Name[..ci.Name.LastIndexOf('.')]; - var catalogueItems = ci.CatalogueRepository.GetAllObjects().Where(ci => ci.Name[..ci.Name.LastIndexOf(".")] == databaseName).ToList(); + var catalogueItems = ci.CatalogueRepository.GetAllObjects().Where(ci => ci.Name[..ci.Name.LastIndexOf(".", StringComparison.Ordinal)] == databaseName).ToList(); foreach (var aci in catalogueItems) { aci.Dataset_ID = _dataset.ID; From 7c094def167420f5ba73b18cd0aae4f91b67f90a Mon Sep 17 00:00:00 2001 From: jas88 Date: Tue, 5 Dec 2023 10:10:14 -0600 Subject: [PATCH 80/85] Update ExecuteCommandLinkColumnInfoToDataset.cs Syntax tidy, seal class --- .../ExecuteCommandLinkColumnInfoToDataset.cs | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataset.cs index ec6f6ba3fa..7eac784215 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataset.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataset.cs @@ -1,16 +1,20 @@ - - +// Copyright (c) The University of Dundee 2018-2023 +// This file is part of the Research Data Management Platform (RDMP). +// RDMP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. +// RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with RDMP. If not, see . +using System; using Rdmp.Core.Curation.Data; using System.Linq; namespace Rdmp.Core.CommandExecution.AtomicCommands; -public class ExecuteCommandLinkColumnInfoToDataset : BasicCommandExecution +public sealed class ExecuteCommandLinkColumnInfoToDataset : BasicCommandExecution { - private ColumnInfo _columnInfo; - private Curation.Data.Dataset _dataset; - private bool _linkAll; + private readonly ColumnInfo _columnInfo; + private readonly Curation.Data.Dataset _dataset; + private readonly bool _linkAll; public ExecuteCommandLinkColumnInfoToDataset(IBasicActivateItems activator, [DemandsInitialization("The column to link")] ColumnInfo columnInfo, [DemandsInitialization("The dataset to link to")] Curation.Data.Dataset dataset, bool linkAllOtherColumns = true) : base(activator) { _columnInfo = columnInfo; @@ -24,15 +28,14 @@ public override void Execute() base.Execute(); _columnInfo.Dataset_ID = _dataset.ID; _columnInfo.SaveToDatabase(); - if (_linkAll) + if (!_linkAll) return; + + var databaseName = _columnInfo.Name[.._columnInfo.Name.LastIndexOf('.')]; + var catalogueItems = _columnInfo.CatalogueRepository.GetAllObjects().Where(ci => ci.Name[..ci.Name.LastIndexOf(".", StringComparison.Ordinal)] == databaseName); + foreach (var ci in catalogueItems) { - var databaseName = _columnInfo.Name[.._columnInfo.Name.LastIndexOf('.')]; - var catalogueItems = _columnInfo.CatalogueRepository.GetAllObjects().Where(ci => ci.Name[..ci.Name.LastIndexOf(".")] == databaseName); - foreach (var ci in catalogueItems) - { - ci.Dataset_ID = _dataset.ID; - ci.SaveToDatabase(); - } + ci.Dataset_ID = _dataset.ID; + ci.SaveToDatabase(); } } } \ No newline at end of file From e6d0f44e2fb0f4cc0449fe5e36f8e727572c6ed7 Mon Sep 17 00:00:00 2001 From: jas88 Date: Tue, 5 Dec 2023 10:11:11 -0600 Subject: [PATCH 81/85] Unused usings --- .../ResearchDataManagementPlatform/Program.cs | 2 -- .../WindowManagement/CollectionNavigation.cs | 1 - .../Caching/Integration/CachingHostTests.cs | 2 -- .../Caching/Unit/PipelineExecutionTests.cs | 1 - .../ExecuteCommandDeleteDatasetTest.cs | 3 --- ...ecuteCommandLinkCatalogueToDatasetTests.cs | 10 ---------- ...teCommandLinkCoulmnInfoWithDatasetTests.cs | 11 +---------- .../TestExecuteCommandClearUserSettings.cs | 1 - .../ImportTests/GatherAndShareTests.cs | 2 -- .../Curation/Integration/ColumnInfoTests.cs | 1 - .../Curation/Integration/MEFCheckerTests.cs | 1 - ...jectSharingObscureDependencyFinderTests.cs | 1 - .../Curation/SimpleExampleTests.cs | 1 - .../Curation/Unit/SqlSyntaxHelperTests.cs | 2 -- .../Curation/YamlRepositoryTests.cs | 2 -- .../CustomData/CustomDataImportingTests.cs | 2 -- ...eCrossServerDatasetExtractionSourceTest.cs | 1 - .../HashedDataExtractionTests.cs | 1 - .../NormalDataExtractionTests.cs | 1 - .../DataExtraction/TestCohortRefreshing.cs | 2 -- .../ImportFilesDataProviderTests.cs | 1 - .../Integration/MigrationStrategyTests.cs | 1 - .../DatabaseEntityConventionTests.cs | 1 - Rdmp.Core.Tests/Logging/LogManagerTest.cs | 1 - .../Pipeline/CohortHoldoutLookupRequest.cs | 3 --- ...CohortIdentificationConfigurationSource.cs | 1 - .../ExecuteCommandCreateHoldoutLookup.cs | 3 --- .../ExecuteCommandDeleteDataset.cs | 4 +--- .../DatabaseCreation/NightmareDatasets.cs | 1 - Rdmp.Core/Curation/Data/CommitInProgress.cs | 1 - Rdmp.Core/Curation/Data/Dataset.cs | 8 +------- Rdmp.Core/Curation/Data/IDataset.cs | 5 ----- Rdmp.Core/Curation/Data/LoadModuleAssembly.cs | 1 - Rdmp.Core/Curation/Data/Plugin.cs | 5 ----- .../Runtime/ExecuteSqlBakFileRuntimeTask.cs | 3 --- .../DataLoad/Modules/FTP/FTPDownloader.cs | 3 --- .../DataLoad/Modules/FTP/SFTPDownloader.cs | 1 - .../Dataset/DatasetConfigurationUICommon.cs | 12 ------------ Rdmp.Core/Providers/DatasetChildProvider.cs | 5 ----- Rdmp.Core/Providers/Nodes/SingletonNode.cs | 3 --- .../WordDataReleaseFileGenerator.cs | 1 - .../Reports/ExtractionTime/WordDataWriter.cs | 2 -- Rdmp.Core/Repositories/MEF.cs | 1 - Rdmp.UI.Tests/UITests.cs | 1 - Rdmp.UI.Tests/UITimeoutAttribute.cs | 1 - Rdmp.UI/Collections/DatasetsCollectionUI.cs | 7 ------- .../ExecuteCommandCreateNewDatasetUI.cs | 4 ---- .../ExecuteCommandDeletePlugin.cs | 2 -- .../ExecuteCommandLinkCatalogueToDatasetUI.cs | 6 ------ ...ExecuteCommandLinkColumnInfoToDataSetUI.cs | 6 ------ .../ProposeExecutionWhenTargetIsDataset.cs | 2 -- Rdmp.UI/Menus/DatasetMenu.cs | 5 ----- ...talogueToDatasetLinkageObjectCollection.cs | 5 ----- .../Datasets/CreateNewDatasetUI.cs | 8 -------- .../SubComponents/DatsetConfigurationUI.cs | 19 +------------------ 55 files changed, 4 insertions(+), 177 deletions(-) diff --git a/Application/ResearchDataManagementPlatform/Program.cs b/Application/ResearchDataManagementPlatform/Program.cs index 693670d108..bf5d49e128 100644 --- a/Application/ResearchDataManagementPlatform/Program.cs +++ b/Application/ResearchDataManagementPlatform/Program.cs @@ -5,10 +5,8 @@ // You should have received a copy of the GNU General Public License along with RDMP. If not, see . using System; -using System.IO; using System.Runtime.InteropServices; using CommandLine; -using Rdmp.Core.Curation.Data; using Rdmp.Core.ReusableLibraryCode; using Rdmp.Core.ReusableLibraryCode.Checks; using Rdmp.Core.Startup; diff --git a/Application/ResearchDataManagementPlatform/WindowManagement/CollectionNavigation.cs b/Application/ResearchDataManagementPlatform/WindowManagement/CollectionNavigation.cs index 8e66a34146..6e2b4855b1 100644 --- a/Application/ResearchDataManagementPlatform/WindowManagement/CollectionNavigation.cs +++ b/Application/ResearchDataManagementPlatform/WindowManagement/CollectionNavigation.cs @@ -6,7 +6,6 @@ using FAnsi.Discovery; using Rdmp.Core.CommandExecution; -using System.Collections.Generic; using Equ; using Rdmp.Core.MapsDirectlyToDatabaseTable; diff --git a/Rdmp.Core.Tests/Caching/Integration/CachingHostTests.cs b/Rdmp.Core.Tests/Caching/Integration/CachingHostTests.cs index c8cef0be77..91b3eb653e 100644 --- a/Rdmp.Core.Tests/Caching/Integration/CachingHostTests.cs +++ b/Rdmp.Core.Tests/Caching/Integration/CachingHostTests.cs @@ -9,13 +9,11 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -using NSubstitute; using NUnit.Framework; using Rdmp.Core.Caching; using Rdmp.Core.Curation; using Rdmp.Core.Curation.Data; using Rdmp.Core.Curation.Data.Cache; -using Rdmp.Core.Curation.Data.Pipelines; using Rdmp.Core.DataFlowPipeline; using Rdmp.Core.ReusableLibraryCode.Progress; using Tests.Common; diff --git a/Rdmp.Core.Tests/Caching/Unit/PipelineExecutionTests.cs b/Rdmp.Core.Tests/Caching/Unit/PipelineExecutionTests.cs index ff5e813575..b4e969047d 100644 --- a/Rdmp.Core.Tests/Caching/Unit/PipelineExecutionTests.cs +++ b/Rdmp.Core.Tests/Caching/Unit/PipelineExecutionTests.cs @@ -4,7 +4,6 @@ // RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with RDMP. If not, see . -using System; using NSubstitute; using NUnit.Framework; using Rdmp.Core.Caching.Pipeline; diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs index 902659c57e..5c85e9ed3a 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs @@ -1,10 +1,7 @@ using NUnit.Framework; using Rdmp.Core.CommandExecution.AtomicCommands; using System; -using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Rdmp.Core.Tests.CommandExecution { diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs index 8cacad8064..d702371a43 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs @@ -1,18 +1,8 @@ using System; -using System.Collections.Generic; -using System.IO; using System.Linq; -using System.Text; -using System.Threading.Tasks; -using FAnsi.Discovery; using NUnit.Framework; using Rdmp.Core.CommandExecution.AtomicCommands; -using Rdmp.Core.CommandExecution.AtomicCommands.CatalogueCreationCommands; using Rdmp.Core.Curation.Data; -using Rdmp.Core.Curation.Data.Pipelines; -using Rdmp.Core.Repositories; -using Rdmp.Core.Tests.CohortCreation; -using Tests.Common; namespace Rdmp.Core.Tests.CommandExecution { diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs index ffc13c2254..3c1669b773 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs @@ -1,18 +1,9 @@ using System; -using System.Collections.Generic; -using System.IO; using System.Linq; -using System.Text; -using System.Threading.Tasks; -using FAnsi.Discovery; using NUnit.Framework; using Rdmp.Core.CommandExecution.AtomicCommands; -using Rdmp.Core.CommandExecution.AtomicCommands.CatalogueCreationCommands; using Rdmp.Core.Curation.Data; -using Rdmp.Core.Curation.Data.Pipelines; -using Rdmp.Core.Repositories; -using Rdmp.Core.Tests.CohortCreation; -using Tests.Common; + namespace Rdmp.Core.Tests.CommandExecution { internal class ExecuteCommandLinkCoulmnInfoWithDatasetTests: CommandCliTests diff --git a/Rdmp.Core.Tests/CommandExecution/TestExecuteCommandClearUserSettings.cs b/Rdmp.Core.Tests/CommandExecution/TestExecuteCommandClearUserSettings.cs index 71cd20f8d3..3491944822 100644 --- a/Rdmp.Core.Tests/CommandExecution/TestExecuteCommandClearUserSettings.cs +++ b/Rdmp.Core.Tests/CommandExecution/TestExecuteCommandClearUserSettings.cs @@ -7,7 +7,6 @@ using NUnit.Framework; using Rdmp.Core.CommandExecution.AtomicCommands; using Rdmp.Core.CommandLine.Interactive.Picking; -using Rdmp.Core.ReusableLibraryCode.Checks; using Rdmp.Core.ReusableLibraryCode.Settings; namespace Rdmp.Core.Tests.CommandExecution; diff --git a/Rdmp.Core.Tests/Curation/ImportTests/GatherAndShareTests.cs b/Rdmp.Core.Tests/Curation/ImportTests/GatherAndShareTests.cs index 925b4d597a..13baabc4c2 100644 --- a/Rdmp.Core.Tests/Curation/ImportTests/GatherAndShareTests.cs +++ b/Rdmp.Core.Tests/Curation/ImportTests/GatherAndShareTests.cs @@ -6,10 +6,8 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using NUnit.Framework; -using Rdmp.Core.CommandLine.Runners; using Rdmp.Core.Curation.Data; using Rdmp.Core.Curation.Data.DataLoad; using Rdmp.Core.Curation.Data.ImportExport; diff --git a/Rdmp.Core.Tests/Curation/Integration/ColumnInfoTests.cs b/Rdmp.Core.Tests/Curation/Integration/ColumnInfoTests.cs index a333f4d4f2..a027b42cf0 100644 --- a/Rdmp.Core.Tests/Curation/Integration/ColumnInfoTests.cs +++ b/Rdmp.Core.Tests/Curation/Integration/ColumnInfoTests.cs @@ -5,7 +5,6 @@ // You should have received a copy of the GNU General Public License along with RDMP. If not, see . using System.Collections.Generic; -using System.Linq; using NUnit.Framework; using Rdmp.Core.Curation.Data; using Rdmp.Core.Curation.Data.DataLoad; diff --git a/Rdmp.Core.Tests/Curation/Integration/MEFCheckerTests.cs b/Rdmp.Core.Tests/Curation/Integration/MEFCheckerTests.cs index c6661af558..c6924cf153 100644 --- a/Rdmp.Core.Tests/Curation/Integration/MEFCheckerTests.cs +++ b/Rdmp.Core.Tests/Curation/Integration/MEFCheckerTests.cs @@ -5,7 +5,6 @@ // You should have received a copy of the GNU General Public License along with RDMP. If not, see . using System; -using System.IO; using NUnit.Framework; using Rdmp.Core.Curation.Checks; using Rdmp.Core.Curation.Data; diff --git a/Rdmp.Core.Tests/Curation/Integration/ObscureDependencyTests/ObjectSharingObscureDependencyFinderTests.cs b/Rdmp.Core.Tests/Curation/Integration/ObscureDependencyTests/ObjectSharingObscureDependencyFinderTests.cs index a1d53f246a..90262e4b62 100644 --- a/Rdmp.Core.Tests/Curation/Integration/ObscureDependencyTests/ObjectSharingObscureDependencyFinderTests.cs +++ b/Rdmp.Core.Tests/Curation/Integration/ObscureDependencyTests/ObjectSharingObscureDependencyFinderTests.cs @@ -5,7 +5,6 @@ // You should have received a copy of the GNU General Public License along with RDMP. If not, see . using System; -using System.Linq; using NUnit.Framework; using Rdmp.Core.Curation.Data; using Rdmp.Core.Curation.Data.ImportExport; diff --git a/Rdmp.Core.Tests/Curation/SimpleExampleTests.cs b/Rdmp.Core.Tests/Curation/SimpleExampleTests.cs index 6012d7cd55..dd5d0d54e8 100644 --- a/Rdmp.Core.Tests/Curation/SimpleExampleTests.cs +++ b/Rdmp.Core.Tests/Curation/SimpleExampleTests.cs @@ -5,7 +5,6 @@ // You should have received a copy of the GNU General Public License along with RDMP. If not, see . using System.Data; -using System.Linq; using FAnsi; using NUnit.Framework; using Rdmp.Core.Curation.Data; diff --git a/Rdmp.Core.Tests/Curation/Unit/SqlSyntaxHelperTests.cs b/Rdmp.Core.Tests/Curation/Unit/SqlSyntaxHelperTests.cs index 54717ad10a..ca5aa79b5f 100644 --- a/Rdmp.Core.Tests/Curation/Unit/SqlSyntaxHelperTests.cs +++ b/Rdmp.Core.Tests/Curation/Unit/SqlSyntaxHelperTests.cs @@ -5,9 +5,7 @@ // You should have received a copy of the GNU General Public License along with RDMP. If not, see . using FAnsi.Implementations.MicrosoftSQL; -using NSubstitute; using NUnit.Framework; -using Rdmp.Core.Curation.Data; using Rdmp.Core.QueryBuilding; namespace Rdmp.Core.Tests.Curation.Unit; diff --git a/Rdmp.Core.Tests/Curation/YamlRepositoryTests.cs b/Rdmp.Core.Tests/Curation/YamlRepositoryTests.cs index e852a530c6..cfe30dfad3 100644 --- a/Rdmp.Core.Tests/Curation/YamlRepositoryTests.cs +++ b/Rdmp.Core.Tests/Curation/YamlRepositoryTests.cs @@ -14,10 +14,8 @@ using Rdmp.Core.Repositories; using Rdmp.Core.Repositories.Managers; using System; -using System.Diagnostics; using System.IO; using System.Linq; -using System.Reflection; using System.Text; using Tests.Common; diff --git a/Rdmp.Core.Tests/DataExport/CustomData/CustomDataImportingTests.cs b/Rdmp.Core.Tests/DataExport/CustomData/CustomDataImportingTests.cs index bb6cfaf37a..c0a31b4e1a 100644 --- a/Rdmp.Core.Tests/DataExport/CustomData/CustomDataImportingTests.cs +++ b/Rdmp.Core.Tests/DataExport/CustomData/CustomDataImportingTests.cs @@ -11,8 +11,6 @@ using Rdmp.Core.Curation.Data; using Rdmp.Core.DataExport.Data; using Rdmp.Core.DataExport.DataExtraction.Commands; -using Rdmp.Core.DataExport.DataExtraction.Pipeline; -using Rdmp.Core.DataExport.DataExtraction.Pipeline.Destinations; using Rdmp.Core.DataExport.DataExtraction.UserPicks; using Tests.Common.Scenarios; diff --git a/Rdmp.Core.Tests/DataExport/DataExtraction/ExecuteCrossServerDatasetExtractionSourceTest.cs b/Rdmp.Core.Tests/DataExport/DataExtraction/ExecuteCrossServerDatasetExtractionSourceTest.cs index 7594ac8cb9..845b472ef9 100644 --- a/Rdmp.Core.Tests/DataExport/DataExtraction/ExecuteCrossServerDatasetExtractionSourceTest.cs +++ b/Rdmp.Core.Tests/DataExport/DataExtraction/ExecuteCrossServerDatasetExtractionSourceTest.cs @@ -10,7 +10,6 @@ using NUnit.Framework; using Rdmp.Core.Curation.Data.Pipelines; using Rdmp.Core.DataExport.Data; -using Rdmp.Core.DataExport.DataExtraction.Pipeline; using Rdmp.Core.DataExport.DataExtraction.Pipeline.Destinations; using Rdmp.Core.DataExport.DataExtraction.Pipeline.Sources; using Rdmp.Core.ReusableLibraryCode.Progress; diff --git a/Rdmp.Core.Tests/DataExport/DataExtraction/HashedDataExtractionTests.cs b/Rdmp.Core.Tests/DataExport/DataExtraction/HashedDataExtractionTests.cs index 2ca1f2a8ad..6c5d45f132 100644 --- a/Rdmp.Core.Tests/DataExport/DataExtraction/HashedDataExtractionTests.cs +++ b/Rdmp.Core.Tests/DataExport/DataExtraction/HashedDataExtractionTests.cs @@ -7,7 +7,6 @@ using System.IO; using System.Linq; using NUnit.Framework; -using Rdmp.Core.DataExport.DataExtraction.Pipeline; using Rdmp.Core.DataExport.DataExtraction.Pipeline.Destinations; using Rdmp.Core.QueryBuilding; using Rdmp.Core.ReusableLibraryCode.Progress; diff --git a/Rdmp.Core.Tests/DataExport/DataExtraction/NormalDataExtractionTests.cs b/Rdmp.Core.Tests/DataExport/DataExtraction/NormalDataExtractionTests.cs index 53f86cf73d..68e0862a01 100644 --- a/Rdmp.Core.Tests/DataExport/DataExtraction/NormalDataExtractionTests.cs +++ b/Rdmp.Core.Tests/DataExport/DataExtraction/NormalDataExtractionTests.cs @@ -10,7 +10,6 @@ using NUnit.Framework; using Rdmp.Core.Curation.Data; using Rdmp.Core.DataExport.DataExtraction; -using Rdmp.Core.DataExport.DataExtraction.Pipeline; using Rdmp.Core.DataExport.DataExtraction.Pipeline.Destinations; using Rdmp.Core.QueryBuilding; using Tests.Common.Scenarios; diff --git a/Rdmp.Core.Tests/DataExport/DataExtraction/TestCohortRefreshing.cs b/Rdmp.Core.Tests/DataExport/DataExtraction/TestCohortRefreshing.cs index 4290aba335..a719fe8715 100644 --- a/Rdmp.Core.Tests/DataExport/DataExtraction/TestCohortRefreshing.cs +++ b/Rdmp.Core.Tests/DataExport/DataExtraction/TestCohortRefreshing.cs @@ -13,8 +13,6 @@ using Rdmp.Core.Curation.Data.Cohort; using Rdmp.Core.Curation.Data.Pipelines; using Rdmp.Core.Databases; -using Rdmp.Core.DataExport.DataExtraction.Pipeline; -using Rdmp.Core.DataExport.DataExtraction.Pipeline.Destinations; using Rdmp.Core.DataFlowPipeline; using Rdmp.Core.MapsDirectlyToDatabaseTable.Versioning; using Rdmp.Core.ReusableLibraryCode.Checks; diff --git a/Rdmp.Core.Tests/DataLoad/Engine/Integration/ImportFilesDataProviderTests.cs b/Rdmp.Core.Tests/DataLoad/Engine/Integration/ImportFilesDataProviderTests.cs index d179098c24..3538e9b021 100644 --- a/Rdmp.Core.Tests/DataLoad/Engine/Integration/ImportFilesDataProviderTests.cs +++ b/Rdmp.Core.Tests/DataLoad/Engine/Integration/ImportFilesDataProviderTests.cs @@ -7,7 +7,6 @@ using System; using System.IO; -using System.Linq; using NSubstitute; using NUnit.Framework; using Rdmp.Core.Curation; diff --git a/Rdmp.Core.Tests/DataLoad/Engine/Integration/MigrationStrategyTests.cs b/Rdmp.Core.Tests/DataLoad/Engine/Integration/MigrationStrategyTests.cs index 0ebfe446e3..fe1a752a27 100644 --- a/Rdmp.Core.Tests/DataLoad/Engine/Integration/MigrationStrategyTests.cs +++ b/Rdmp.Core.Tests/DataLoad/Engine/Integration/MigrationStrategyTests.cs @@ -9,7 +9,6 @@ using FAnsi.Discovery; using NSubstitute; using NUnit.Framework; -using Rdmp.Core.DataLoad.Engine.Job; using Rdmp.Core.DataLoad.Engine.Migration; using Rdmp.Core.DataLoad.Engine.Migration.QueryBuilding; using Tests.Common; diff --git a/Rdmp.Core.Tests/DesignPatternTests/DatabaseEntityConventionTests.cs b/Rdmp.Core.Tests/DesignPatternTests/DatabaseEntityConventionTests.cs index dba42e4296..645357ddf2 100644 --- a/Rdmp.Core.Tests/DesignPatternTests/DatabaseEntityConventionTests.cs +++ b/Rdmp.Core.Tests/DesignPatternTests/DatabaseEntityConventionTests.cs @@ -4,7 +4,6 @@ // RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with RDMP. If not, see . -using System.Collections.Generic; using System.Linq; using NUnit.Framework; using Rdmp.Core.Curation.Data; diff --git a/Rdmp.Core.Tests/Logging/LogManagerTest.cs b/Rdmp.Core.Tests/Logging/LogManagerTest.cs index 15549f5181..aa23f34db8 100644 --- a/Rdmp.Core.Tests/Logging/LogManagerTest.cs +++ b/Rdmp.Core.Tests/Logging/LogManagerTest.cs @@ -6,7 +6,6 @@ using System; using System.Linq; -using System.Threading; using FAnsi.Discovery; using NUnit.Framework; using Rdmp.Core.Logging; diff --git a/Rdmp.Core/CohortCommitting/Pipeline/CohortHoldoutLookupRequest.cs b/Rdmp.Core/CohortCommitting/Pipeline/CohortHoldoutLookupRequest.cs index 2299ce6249..d83a53f0db 100644 --- a/Rdmp.Core/CohortCommitting/Pipeline/CohortHoldoutLookupRequest.cs +++ b/Rdmp.Core/CohortCommitting/Pipeline/CohortHoldoutLookupRequest.cs @@ -5,10 +5,7 @@ // You should have received a copy of the GNU General Public License along with RDMP. If not, see . using System; -using System.Data; using System.Globalization; -using System.Security.Permissions; -using NPOI.SS.Formula.Functions; using Rdmp.Core.Curation.Data.Cohort; using Rdmp.Core.Curation.Data.Pipelines; using Rdmp.Core.DataFlowPipeline; diff --git a/Rdmp.Core/CohortCommitting/Pipeline/Sources/CohortIdentificationConfigurationSource.cs b/Rdmp.Core/CohortCommitting/Pipeline/Sources/CohortIdentificationConfigurationSource.cs index 5c590e3f5c..7f5485a69a 100644 --- a/Rdmp.Core/CohortCommitting/Pipeline/Sources/CohortIdentificationConfigurationSource.cs +++ b/Rdmp.Core/CohortCommitting/Pipeline/Sources/CohortIdentificationConfigurationSource.cs @@ -8,7 +8,6 @@ using System.Data; using System.Linq; using System.Threading; -using System.Threading.Tasks; using Rdmp.Core.CohortCreation; using Rdmp.Core.CohortCreation.Execution; using Rdmp.Core.Curation.Data; diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateHoldoutLookup.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateHoldoutLookup.cs index 4abc88ddae..ded8358da2 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateHoldoutLookup.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandCreateHoldoutLookup.cs @@ -5,7 +5,6 @@ // You should have received a copy of the GNU General Public License along with RDMP. If not, see . using FAnsi.Discovery; -using Rdmp.Core.CohortCommitting.Pipeline; using Rdmp.Core.CommandExecution.AtomicCommands.CatalogueCreationCommands; using Rdmp.Core.Curation.Data.Cohort; using Rdmp.Core.Curation.Data.Pipelines; @@ -17,9 +16,7 @@ using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; using System; -using System.Collections.Generic; using System.Data; -using System.Data.Common; using System.IO; using System.Linq; using System.Text; diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs index 3b8bd1c80c..734a81c431 100644 --- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs +++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandDeleteDataset.cs @@ -1,6 +1,4 @@ - -using NPOI.OpenXmlFormats.Dml.WordProcessing; -using Rdmp.Core.Curation.Data; +using Rdmp.Core.Curation.Data; using System.Linq; namespace Rdmp.Core.CommandExecution.AtomicCommands; diff --git a/Rdmp.Core/CommandLine/DatabaseCreation/NightmareDatasets.cs b/Rdmp.Core/CommandLine/DatabaseCreation/NightmareDatasets.cs index d110842dca..1e334414b9 100644 --- a/Rdmp.Core/CommandLine/DatabaseCreation/NightmareDatasets.cs +++ b/Rdmp.Core/CommandLine/DatabaseCreation/NightmareDatasets.cs @@ -6,7 +6,6 @@ using System; using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; using System.IO; using BadMedicine; using BadMedicine.Datasets; diff --git a/Rdmp.Core/Curation/Data/CommitInProgress.cs b/Rdmp.Core/Curation/Data/CommitInProgress.cs index f5ab14ea97..0496ebc179 100644 --- a/Rdmp.Core/Curation/Data/CommitInProgress.cs +++ b/Rdmp.Core/Curation/Data/CommitInProgress.cs @@ -7,7 +7,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Runtime.InteropServices.ComTypes; using Rdmp.Core.CommandExecution; using Rdmp.Core.MapsDirectlyToDatabaseTable; using Rdmp.Core.Repositories; diff --git a/Rdmp.Core/Curation/Data/Dataset.cs b/Rdmp.Core/Curation/Data/Dataset.cs index 8cb910294d..2120e0dc0f 100644 --- a/Rdmp.Core/Curation/Data/Dataset.cs +++ b/Rdmp.Core/Curation/Data/Dataset.cs @@ -3,18 +3,12 @@ // RDMP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. // RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with RDMP. If not, see .using Amazon.Auth.AccessControlPolicy; -using Rdmp.Core.Icons.IconProvision; + using Rdmp.Core.MapsDirectlyToDatabaseTable.Attributes; using Rdmp.Core.Repositories; -using Rdmp.Core.ReusableLibraryCode.Icons.IconProvision; -using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp; using System; using System.Collections.Generic; using System.Data.Common; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using Rdmp.Core.MapsDirectlyToDatabaseTable; using System.Diagnostics.CodeAnalysis; diff --git a/Rdmp.Core/Curation/Data/IDataset.cs b/Rdmp.Core/Curation/Data/IDataset.cs index 210c537c4f..15e5043454 100644 --- a/Rdmp.Core/Curation/Data/IDataset.cs +++ b/Rdmp.Core/Curation/Data/IDataset.cs @@ -5,11 +5,6 @@ // You should have received a copy of the GNU General Public License along with RDMP. If not, see . using Rdmp.Core.MapsDirectlyToDatabaseTable; using Rdmp.Core.Repositories; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Rdmp.Core.Curation.Data; diff --git a/Rdmp.Core/Curation/Data/LoadModuleAssembly.cs b/Rdmp.Core/Curation/Data/LoadModuleAssembly.cs index f21871b2fc..07c00a752b 100644 --- a/Rdmp.Core/Curation/Data/LoadModuleAssembly.cs +++ b/Rdmp.Core/Curation/Data/LoadModuleAssembly.cs @@ -8,7 +8,6 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using System.Threading; using ICSharpCode.SharpZipLib.Zip; namespace Rdmp.Core.Curation.Data; diff --git a/Rdmp.Core/Curation/Data/Plugin.cs b/Rdmp.Core/Curation/Data/Plugin.cs index 42d4be5dbb..bcfad6d350 100644 --- a/Rdmp.Core/Curation/Data/Plugin.cs +++ b/Rdmp.Core/Curation/Data/Plugin.cs @@ -4,11 +4,6 @@ // RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with RDMP. If not, see . -using System.Data.Common; -using Rdmp.Core.Curation.Data.ImportExport; -using Rdmp.Core.Curation.Data.Serialization; -using Rdmp.Core.MapsDirectlyToDatabaseTable; -using Rdmp.Core.Repositories; using Rdmp.Core.ReusableLibraryCode.Annotations; namespace Rdmp.Core.Curation.Data; diff --git a/Rdmp.Core/DataLoad/Engine/LoadExecution/Components/Runtime/ExecuteSqlBakFileRuntimeTask.cs b/Rdmp.Core/DataLoad/Engine/LoadExecution/Components/Runtime/ExecuteSqlBakFileRuntimeTask.cs index 5bae5b2019..cdc24bd766 100644 --- a/Rdmp.Core/DataLoad/Engine/LoadExecution/Components/Runtime/ExecuteSqlBakFileRuntimeTask.cs +++ b/Rdmp.Core/DataLoad/Engine/LoadExecution/Components/Runtime/ExecuteSqlBakFileRuntimeTask.cs @@ -7,14 +7,11 @@ using System; using System.Data; using System.IO; -using System.Linq; using Microsoft.Data.SqlClient; -using MongoDB.Driver.Core.Servers; using Rdmp.Core.Curation.Data.DataLoad; using Rdmp.Core.DataFlowPipeline; using Rdmp.Core.DataLoad.Engine.Job; using Rdmp.Core.DataLoad.Engine.LoadExecution.Components.Arguments; -using Rdmp.Core.DataLoad.Modules.Mutilators; using Rdmp.Core.ReusableLibraryCode.Checks; using Rdmp.Core.ReusableLibraryCode.Progress; diff --git a/Rdmp.Core/DataLoad/Modules/FTP/FTPDownloader.cs b/Rdmp.Core/DataLoad/Modules/FTP/FTPDownloader.cs index 49ef7489ca..c90631e536 100644 --- a/Rdmp.Core/DataLoad/Modules/FTP/FTPDownloader.cs +++ b/Rdmp.Core/DataLoad/Modules/FTP/FTPDownloader.cs @@ -8,13 +8,10 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.IO; using System.Linq; -using System.Net; using System.Net.Security; using System.Security.Cryptography.X509Certificates; -using System.Text; using System.Text.RegularExpressions; using System.Threading; using FAnsi.Discovery; diff --git a/Rdmp.Core/DataLoad/Modules/FTP/SFTPDownloader.cs b/Rdmp.Core/DataLoad/Modules/FTP/SFTPDownloader.cs index c08736805e..84dcd03765 100644 --- a/Rdmp.Core/DataLoad/Modules/FTP/SFTPDownloader.cs +++ b/Rdmp.Core/DataLoad/Modules/FTP/SFTPDownloader.cs @@ -5,7 +5,6 @@ // You should have received a copy of the GNU General Public License along with RDMP. If not, see . using System; -using System.Diagnostics; using System.IO; using System.Linq; using System.Threading; diff --git a/Rdmp.Core/Dataset/DatasetConfigurationUICommon.cs b/Rdmp.Core/Dataset/DatasetConfigurationUICommon.cs index 383c565883..d51360e1a2 100644 --- a/Rdmp.Core/Dataset/DatasetConfigurationUICommon.cs +++ b/Rdmp.Core/Dataset/DatasetConfigurationUICommon.cs @@ -4,19 +4,7 @@ // RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with RDMP. If not, see . -using System; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Rdmp.Core.CohortCreation.Execution; -using Rdmp.Core.CohortCreation.Execution.Joinables; using Rdmp.Core.CommandExecution; -using Rdmp.Core.Curation.Data; -using Rdmp.Core.Curation.Data.Aggregation; -using Rdmp.Core.Curation.Data.Cohort; -using Rdmp.Core.Curation.Data.Cohort.Joinables; -using Rdmp.Core.MapsDirectlyToDatabaseTable; -using Rdmp.Core.QueryCaching.Aggregation; namespace Rdmp.Core.Dataset; diff --git a/Rdmp.Core/Providers/DatasetChildProvider.cs b/Rdmp.Core/Providers/DatasetChildProvider.cs index f39d338618..897ceff035 100644 --- a/Rdmp.Core/Providers/DatasetChildProvider.cs +++ b/Rdmp.Core/Providers/DatasetChildProvider.cs @@ -5,11 +5,6 @@ // You should have received a copy of the GNU General Public License along with RDMP. If not, see .using Rdmp.Core.Repositories; using Rdmp.Core.Repositories; using Rdmp.Core.ReusableLibraryCode.Checks; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Rdmp.Core.Providers; diff --git a/Rdmp.Core/Providers/Nodes/SingletonNode.cs b/Rdmp.Core/Providers/Nodes/SingletonNode.cs index 3d34567751..22ddbaeda0 100644 --- a/Rdmp.Core/Providers/Nodes/SingletonNode.cs +++ b/Rdmp.Core/Providers/Nodes/SingletonNode.cs @@ -4,9 +4,6 @@ // RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with RDMP. If not, see . -using System; -using Equ; - namespace Rdmp.Core.Providers.Nodes; /// diff --git a/Rdmp.Core/Reports/ExtractionTime/WordDataReleaseFileGenerator.cs b/Rdmp.Core/Reports/ExtractionTime/WordDataReleaseFileGenerator.cs index f608d9a8da..1295ef16f7 100644 --- a/Rdmp.Core/Reports/ExtractionTime/WordDataReleaseFileGenerator.cs +++ b/Rdmp.Core/Reports/ExtractionTime/WordDataReleaseFileGenerator.cs @@ -9,7 +9,6 @@ using System.IO; using System.Linq; using NPOI.XWPF.UserModel; -using Rdmp.Core.Curation.Data; using Rdmp.Core.DataExport.Data; using Rdmp.Core.Repositories; using Rdmp.Core.Repositories.Managers; diff --git a/Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs b/Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs index 89c8ba0212..3826ad7e9b 100644 --- a/Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs +++ b/Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs @@ -11,7 +11,6 @@ using System.Linq; using System.Text; using NPOI.XWPF.UserModel; -using Rdmp.Core.CommandExecution; using Rdmp.Core.Curation.Data; using Rdmp.Core.DataExport.Data; using Rdmp.Core.DataExport.DataExtraction; @@ -19,7 +18,6 @@ using Rdmp.Core.DataExport.DataExtraction.Pipeline.Destinations; using Rdmp.Core.ReusableLibraryCode; using Rdmp.Core.Validation.Constraints; -using static Rdmp.Core.ReusableLibraryCode.Diff; using IFilter = Rdmp.Core.Curation.Data.IFilter; namespace Rdmp.Core.Reports.ExtractionTime; diff --git a/Rdmp.Core/Repositories/MEF.cs b/Rdmp.Core/Repositories/MEF.cs index 00c692bbf6..e174c26e8d 100644 --- a/Rdmp.Core/Repositories/MEF.cs +++ b/Rdmp.Core/Repositories/MEF.cs @@ -10,7 +10,6 @@ using System.Collections.ObjectModel; using System.Diagnostics; using System.Linq; -using System.Reflection; using System.Threading; using Rdmp.Core.Curation.Data; using Rdmp.Core.Repositories.Construction; diff --git a/Rdmp.UI.Tests/UITests.cs b/Rdmp.UI.Tests/UITests.cs index fee5ab9f87..9e53bbc488 100644 --- a/Rdmp.UI.Tests/UITests.cs +++ b/Rdmp.UI.Tests/UITests.cs @@ -12,7 +12,6 @@ using System.Reflection; using System.Text; using System.Windows.Forms; -using MongoDB.Driver; using NUnit.Framework; using Rdmp.Core.CommandExecution.AtomicCommands; using Rdmp.Core.Curation.Data; diff --git a/Rdmp.UI.Tests/UITimeoutAttribute.cs b/Rdmp.UI.Tests/UITimeoutAttribute.cs index ee9529212e..c5cbc7169f 100644 --- a/Rdmp.UI.Tests/UITimeoutAttribute.cs +++ b/Rdmp.UI.Tests/UITimeoutAttribute.cs @@ -9,7 +9,6 @@ using System.Runtime.InteropServices; using System.Text; using System.Threading; -using System.Threading.Tasks; using NUnit.Framework; using NUnit.Framework.Interfaces; using NUnit.Framework.Internal; diff --git a/Rdmp.UI/Collections/DatasetsCollectionUI.cs b/Rdmp.UI/Collections/DatasetsCollectionUI.cs index becf5b4a1f..57ae2d0026 100644 --- a/Rdmp.UI/Collections/DatasetsCollectionUI.cs +++ b/Rdmp.UI/Collections/DatasetsCollectionUI.cs @@ -1,5 +1,4 @@ using Rdmp.Core.CommandExecution.AtomicCommands; -using Rdmp.Core.Curation.Data.Cohort; using Rdmp.Core; using Rdmp.Core.MapsDirectlyToDatabaseTable; using Rdmp.UI.CommandExecution.AtomicCommands; @@ -7,13 +6,7 @@ using Rdmp.UI.Refreshing; using System; using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; using Rdmp.Core.Curation.Data; namespace Rdmp.UI.Collections diff --git a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandCreateNewDatasetUI.cs b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandCreateNewDatasetUI.cs index d6ab1c9c41..79db5b123d 100644 --- a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandCreateNewDatasetUI.cs +++ b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandCreateNewDatasetUI.cs @@ -4,13 +4,9 @@ // RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with RDMP. If not, see . -using System.IO; -using Rdmp.Core.CommandExecution; using Rdmp.Core.CommandExecution.AtomicCommands; -using Rdmp.Core.CommandExecution.AtomicCommands.CatalogueCreationCommands; using Rdmp.UI.ItemActivation; using Rdmp.UI.SimpleDialogs.Datasets; -using Rdmp.UI.SimpleDialogs.SimpleFileImporting; namespace Rdmp.UI.CommandExecution.AtomicCommands; diff --git a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandDeletePlugin.cs b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandDeletePlugin.cs index 117c27b146..f57f67de6d 100644 --- a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandDeletePlugin.cs +++ b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandDeletePlugin.cs @@ -4,9 +4,7 @@ // RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with RDMP. If not, see . -using Rdmp.Core.CommandExecution.AtomicCommands; using Rdmp.Core.Curation.Data; -using Rdmp.Core.Curation.Data.Dashboarding; using Rdmp.Core.Icons.IconProvision; using Rdmp.Core.ReusableLibraryCode.Icons.IconProvision; using Rdmp.UI.ItemActivation; diff --git a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDatasetUI.cs b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDatasetUI.cs index 5ae8668c1b..b1df2deaf9 100644 --- a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDatasetUI.cs +++ b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDatasetUI.cs @@ -4,18 +4,12 @@ // RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with RDMP. If not, see . -using System; -using System.Collections.Generic; -using System.Linq; using Rdmp.Core.CommandExecution; using Rdmp.Core.CommandExecution.AtomicCommands; using Rdmp.Core.Curation.Data; -using Rdmp.Core.Curation.Data.Cohort; using Rdmp.Core.Icons.IconProvision; using Rdmp.Core.ReusableLibraryCode.Icons.IconProvision; -using Rdmp.UI.ExtractionUIs.JoinsAndLookups; using Rdmp.UI.ItemActivation; -using Rdmp.UI.SimpleDialogs; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; diff --git a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataSetUI.cs b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataSetUI.cs index 9fd72daa99..b88be0a297 100644 --- a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataSetUI.cs +++ b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataSetUI.cs @@ -4,18 +4,12 @@ // RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with RDMP. If not, see . -using System; -using System.Collections.Generic; -using System.Linq; using Rdmp.Core.CommandExecution; using Rdmp.Core.CommandExecution.AtomicCommands; using Rdmp.Core.Curation.Data; -using Rdmp.Core.Curation.Data.Cohort; using Rdmp.Core.Icons.IconProvision; using Rdmp.Core.ReusableLibraryCode.Icons.IconProvision; -using Rdmp.UI.ExtractionUIs.JoinsAndLookups; using Rdmp.UI.ItemActivation; -using Rdmp.UI.SimpleDialogs; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; diff --git a/Rdmp.UI/CommandExecution/Proposals/ProposeExecutionWhenTargetIsDataset.cs b/Rdmp.UI/CommandExecution/Proposals/ProposeExecutionWhenTargetIsDataset.cs index dc3459c5b1..a6515911fb 100644 --- a/Rdmp.UI/CommandExecution/Proposals/ProposeExecutionWhenTargetIsDataset.cs +++ b/Rdmp.UI/CommandExecution/Proposals/ProposeExecutionWhenTargetIsDataset.cs @@ -6,10 +6,8 @@ using Rdmp.Core.CommandExecution; using Rdmp.Core.Curation.Data; -using Rdmp.Core.Curation.Data.Cohort; using Rdmp.UI.ItemActivation; using Rdmp.UI.SubComponents; -using System; namespace Rdmp.UI.CommandExecution.Proposals; diff --git a/Rdmp.UI/Menus/DatasetMenu.cs b/Rdmp.UI/Menus/DatasetMenu.cs index 3f2cb77479..8326c6342e 100644 --- a/Rdmp.UI/Menus/DatasetMenu.cs +++ b/Rdmp.UI/Menus/DatasetMenu.cs @@ -5,11 +5,6 @@ // You should have received a copy of the GNU General Public License along with RDMP. If not, see .using Rdmp.Core.Curation.Data; using Rdmp.Core.Curation.Data; using Rdmp.UI.CommandExecution.AtomicCommands; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Rdmp.UI.Menus; /// diff --git a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkageObjectCollection.cs b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkageObjectCollection.cs index e44ff6c8dc..9911e1c867 100644 --- a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkageObjectCollection.cs +++ b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkageObjectCollection.cs @@ -4,11 +4,6 @@ // RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with RDMP. If not, see .using Rdmp.Core.Curation.Data.Dashboarding; using Rdmp.Core.Curation.Data.Dashboarding; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Rdmp.UI.PieCharts; diff --git a/Rdmp.UI/SimpleDialogs/Datasets/CreateNewDatasetUI.cs b/Rdmp.UI/SimpleDialogs/Datasets/CreateNewDatasetUI.cs index f32512a81a..d459db9eae 100644 --- a/Rdmp.UI/SimpleDialogs/Datasets/CreateNewDatasetUI.cs +++ b/Rdmp.UI/SimpleDialogs/Datasets/CreateNewDatasetUI.cs @@ -3,14 +3,6 @@ using Rdmp.UI.ItemActivation; using Rdmp.UI.TestsAndSetup.ServicePropogation; using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; namespace Rdmp.UI.SimpleDialogs.Datasets { diff --git a/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs b/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs index 62cc88122a..deea978f1b 100644 --- a/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs +++ b/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs @@ -1,28 +1,11 @@ -using Rdmp.Core.Curation.Data.Cohort; -using Rdmp.UI.TestsAndSetup.ServicePropogation; -using Rdmp.UI; +using Rdmp.UI.TestsAndSetup.ServicePropogation; using System; -using System.Collections.Generic; using System.ComponentModel; -using System.Data; -using System.Drawing; using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows.Forms; using Rdmp.UI.Refreshing; -using static Azure.Core.HttpHeader; using Rdmp.Core.Dataset; using Rdmp.Core.Curation.Data; -using NPOI.OpenXmlFormats.Dml.Diagram; -using Rdmp.Core.CommandExecution.AtomicCommands.CohortCreationCommands; -using Rdmp.Core.CommandExecution.AtomicCommands; -using Rdmp.Core.Icons.IconProvision; -using Rdmp.Core.ReusableLibraryCode.Icons.IconProvision; -using Rdmp.Core.ReusableLibraryCode.Settings; -using Rdmp.Core; -using Rdmp.UI.Collections; -using Rdmp.UI.CommandExecution.AtomicCommands; using Rdmp.UI.ItemActivation; namespace Rdmp.UI.SubComponents; From 31df213fd2c96618785413565a4e4b0023e671e8 Mon Sep 17 00:00:00 2001 From: jas88 Date: Tue, 5 Dec 2023 10:33:47 -0600 Subject: [PATCH 82/85] Sealed, LINQ, avoid some looped string concat --- Rdmp.Core/Curation/Data/Dataset.cs | 2 +- Rdmp.Core/Curation/Data/IDataset.cs | 1 + .../WordDataReleaseFileGenerator.cs | 18 +++---- .../Reports/ExtractionTime/WordDataWriter.cs | 48 +++++-------------- 4 files changed, 21 insertions(+), 48 deletions(-) diff --git a/Rdmp.Core/Curation/Data/Dataset.cs b/Rdmp.Core/Curation/Data/Dataset.cs index 2120e0dc0f..aac0df9eae 100644 --- a/Rdmp.Core/Curation/Data/Dataset.cs +++ b/Rdmp.Core/Curation/Data/Dataset.cs @@ -16,7 +16,7 @@ namespace Rdmp.Core.Curation.Data; /// -public class Dataset : DatabaseEntity, IDataset, IHasFolder +public sealed class Dataset : DatabaseEntity, IDataset, IHasFolder { private string _name; private string _digitalObjectIdentifier; diff --git a/Rdmp.Core/Curation/Data/IDataset.cs b/Rdmp.Core/Curation/Data/IDataset.cs index 15e5043454..a7853f2994 100644 --- a/Rdmp.Core/Curation/Data/IDataset.cs +++ b/Rdmp.Core/Curation/Data/IDataset.cs @@ -3,6 +3,7 @@ // RDMP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. // RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with RDMP. If not, see . + using Rdmp.Core.MapsDirectlyToDatabaseTable; using Rdmp.Core.Repositories; diff --git a/Rdmp.Core/Reports/ExtractionTime/WordDataReleaseFileGenerator.cs b/Rdmp.Core/Reports/ExtractionTime/WordDataReleaseFileGenerator.cs index 1295ef16f7..0ccb871060 100644 --- a/Rdmp.Core/Reports/ExtractionTime/WordDataReleaseFileGenerator.cs +++ b/Rdmp.Core/Reports/ExtractionTime/WordDataReleaseFileGenerator.cs @@ -12,6 +12,7 @@ using Rdmp.Core.DataExport.Data; using Rdmp.Core.Repositories; using Rdmp.Core.Repositories.Managers; +using Rdmp.Core.ReusableLibraryCode.Annotations; namespace Rdmp.Core.Reports.ExtractionTime; @@ -160,13 +161,10 @@ private void CreateCohortDetailsTable(XWPFDocument document) Cohort.GetCountDistinctFromDatabase(CohortCountTimeoutInSeconds).ToString("N0")); } - private string getDOI(Curation.Data.Dataset ds) + [NotNull] + private string getDOI([NotNull] Curation.Data.Dataset ds) { - if (!string.IsNullOrWhiteSpace(ds.DigitalObjectIdentifier)) - { - return $" (DOI: {ds.DigitalObjectIdentifier})"; - } - return ""; + return !string.IsNullOrWhiteSpace(ds.DigitalObjectIdentifier) ? $" (DOI: {ds.DigitalObjectIdentifier})" : ""; } private void CreateFileSummary(XWPFDocument document) @@ -189,13 +187,9 @@ private void CreateFileSummary(XWPFDocument document) var extractableDataset = _repository.GetObjectByID(result.ExtractableDataSet_ID); SetTableCell(table, tableLine, 0, extractableDataset.ToString()); - var linkedDatasets = extractableDataset.Catalogue.CatalogueItems.Select(c => c.ColumnInfo).Where(ci => ci.Dataset_ID != null).Distinct().Select(ci => ci.Dataset_ID); + var linkedDatasets = extractableDataset.Catalogue.CatalogueItems.Select(static c => c.ColumnInfo).Where(ci => ci.Dataset_ID != null).Distinct().Select(ci => ci.Dataset_ID); var datasets = _repository.CatalogueRepository.GetAllObjects().Where(d => linkedDatasets.Contains(d.ID)).ToList(); - string datasetString = ""; - foreach (var ds in datasets) - { - datasetString += $"{ds.Name} {getDOI(ds)}, {Environment.NewLine}"; - } + var datasetString = string.Join("",datasets.Select(ds=> $"{ds.Name} {getDOI(ds)}, {Environment.NewLine}")); SetTableCell(table, tableLine, 1, result.FiltersUsed); SetTableCell(table, tableLine, 2, filename); SetTableCell(table, tableLine, 3, result.RecordsExtracted.ToString("N0")); diff --git a/Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs b/Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs index 3826ad7e9b..45806e2f09 100644 --- a/Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs +++ b/Rdmp.Core/Reports/ExtractionTime/WordDataWriter.cs @@ -17,6 +17,7 @@ using Rdmp.Core.DataExport.DataExtraction.Pipeline; using Rdmp.Core.DataExport.DataExtraction.Pipeline.Destinations; using Rdmp.Core.ReusableLibraryCode; +using Rdmp.Core.ReusableLibraryCode.Annotations; using Rdmp.Core.Validation.Constraints; using IFilter = Rdmp.Core.Curation.Data.IFilter; @@ -55,17 +56,14 @@ public WordDataWriter(ExtractionPipelineUseCase executer) - private string getDOI(Curation.Data.Dataset ds) + [NotNull] + private static string GetDoi([NotNull] Curation.Data.Dataset ds) { - if (!string.IsNullOrWhiteSpace(ds.DigitalObjectIdentifier)) - { - return $" (DOI: {ds.DigitalObjectIdentifier})"; - } - return ""; + return !string.IsNullOrWhiteSpace(ds.DigitalObjectIdentifier) ? $" (DOI: {ds.DigitalObjectIdentifier})" : ""; } /// - /// Generates a new meta data word file in the extraction directory and populates it with information about the extraction. + /// Generates a new metadata word file in the extraction directory and populates it with information about the extraction. /// It returns the open document as an object so that you can supplement it e.g. with catalogue information /// /// @@ -83,18 +81,8 @@ public void GenerateWordFile() var rowCount = _destination.GeneratesFiles ? 10 : 5; - List foundDatasets = new(); - foreach (var col in Executer.Source.Request.ColumnsToExtract) - { - var colInfo = col.ColumnInfo; - if (colInfo.Dataset_ID > 0) - { - if (!foundDatasets.Contains((int)colInfo.Dataset_ID)) - { - foundDatasets.Add((int)colInfo.Dataset_ID); - } - } - } + var foundDatasets = Executer.Source.Request.ColumnsToExtract.Select(static col => col.ColumnInfo) + .Where(static ci => ci.Dataset_ID > 0).Select(static ci => ci.Dataset_ID.Value).Distinct().ToList(); if (foundDatasets.Count > 0) { rowCount++; @@ -175,23 +163,13 @@ public void GenerateWordFile() if (foundDatasets.Count > 0) { - var datasets = Executer.Source.Request.Catalogue.Repository.GetAllObjects(); - - string datasetString = ""; - int last = foundDatasets.Last(); - foreach (var ds in foundDatasets) - { - var fullDataset = datasets.FirstOrDefault(d => d.ID == ds); - if (fullDataset != null) - { - datasetString += $"{fullDataset.Name}{getDOI(fullDataset)}"; - if(last != ds) - { - datasetString += ", "; - } - } - } + var datasets = Executer.Source.Request.Catalogue.Repository.GetAllObjects().ToList(); + var datasetString = string.Join(", ", + foundDatasets + .Select(ds => datasets.FirstOrDefault(d => d.ID == ds)) + .Where(static d => d != null) + .Select(static fullDataset => $"{fullDataset.Name}{GetDoi(fullDataset)}")); SetTableCell(t, rownum, 0, "Datasets Used"); SetTableCell(t, rownum, 1, datasetString); From 9b1c5a9e9172a6112abff6bcf05d41d4d4412c94 Mon Sep 17 00:00:00 2001 From: jas88 Date: Tue, 5 Dec 2023 10:44:25 -0600 Subject: [PATCH 83/85] Namespaces, var, whitespace --- .../ExecuteCommandDeleteDatasetTest.cs | 47 +++-- ...ecuteCommandLinkCatalogueToDatasetTests.cs | 195 +++++++++--------- ...teCommandLinkCoulmnInfoWithDatasetTests.cs | 187 +++++++++-------- .../CreateHoldoutLookupUI.cs | 2 +- Rdmp.UI/Collections/DatasetsCollectionUI.cs | 153 +++++++------- .../ExecuteCommandLinkCatalogueToDatasetUI.cs | 4 +- ...ExecuteCommandLinkColumnInfoToDataSetUI.cs | 10 +- .../ExecuteCommandOpenExtractionDirectory.cs | 6 +- Rdmp.UI/MainFormUITabs/CatalogueItemUI.cs | 2 +- Rdmp.UI/MainFormUITabs/CatalogueUI.cs | 2 +- .../MainFormUITabs/ExtractionProgressUI.cs | 2 +- .../CatalogueToDatasetLinkagePieChartUI.cs | 2 +- .../Datasets/CreateNewDatasetUI.cs | 45 ++-- .../ConfigureCatalogueExtractabilityUI.cs | 2 +- .../RDMPControlCommonFunctionality.cs | 2 +- 15 files changed, 329 insertions(+), 332 deletions(-) diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs index 5c85e9ed3a..c48f6693ed 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandDeleteDatasetTest.cs @@ -3,31 +3,30 @@ using System; using System.Linq; -namespace Rdmp.Core.Tests.CommandExecution +namespace Rdmp.Core.Tests.CommandExecution; + +internal class ExecuteCommandDeleteDatasetTest: CommandCliTests { - internal class ExecuteCommandDeleteDatasetTest: CommandCliTests - { - [Test] - public void TestDeleteExistingDataset() - { - var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); - Assert.DoesNotThrow(() => cmd.Execute()); - Assert.That(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects(), Has.Length.EqualTo(1)); - var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ds => ds.Name == "dataset").First(); - var delCmd = new ExecuteCommandDeleteDataset(GetMockActivator(), founddataset); - Assert.DoesNotThrow(() => delCmd.Execute()); - Assert.That(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects(), Is.Empty); - } + [Test] + public void TestDeleteExistingDataset() + { + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); + Assert.DoesNotThrow(() => cmd.Execute()); + Assert.That(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects(), Has.Length.EqualTo(1)); + var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ds => ds.Name == "dataset").First(); + var delCmd = new ExecuteCommandDeleteDataset(GetMockActivator(), founddataset); + Assert.DoesNotThrow(() => delCmd.Execute()); + Assert.That(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects(), Is.Empty); + } - [Test] - public void TestDeleteNonExistantDataset() - { - Assert.That(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects(), Is.Empty); - var founddataset = new Core.Curation.Data.Dataset(); - var delCmd = new ExecuteCommandDeleteDataset(GetMockActivator(), founddataset); - Assert.Throws(() => delCmd.Execute()); - Assert.That(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects(), Is.Empty); - } + [Test] + public void TestDeleteNonExistantDataset() + { + Assert.That(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects(), Is.Empty); + var founddataset = new Core.Curation.Data.Dataset(); + var delCmd = new ExecuteCommandDeleteDataset(GetMockActivator(), founddataset); + Assert.Throws(() => delCmd.Execute()); + Assert.That(GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects(), Is.Empty); } -} +} \ No newline at end of file diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs index d702371a43..e9bfe91a91 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs @@ -4,116 +4,115 @@ using Rdmp.Core.CommandExecution.AtomicCommands; using Rdmp.Core.Curation.Data; -namespace Rdmp.Core.Tests.CommandExecution -{ - internal class ExecuteCommandLinkCatalogueToDatasetTests : CommandCliTests - { +namespace Rdmp.Core.Tests.CommandExecution; - [Test] - public void TestLinkCatalogueToDataset() - { - var _cata1 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset1"); - var _cata2 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset2"); - _cata1.SaveToDatabase(); - _cata2.SaveToDatabase(); - var _t1 = new TableInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "T1"); - var _t2 = new TableInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "T2"); - _t1.SaveToDatabase(); - _t2.SaveToDatabase(); - var _c1 = new ColumnInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "test.db", "varchar(10)", _t1); - var _c2 = new ColumnInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "test.db", "int", _t2); - _c1.SaveToDatabase(); - _c2.SaveToDatabase(); - var _ci1 = new CatalogueItem(GetMockActivator().RepositoryLocator.CatalogueRepository, _cata1, "PrivateIdentifierA"); - _ci1.SetColumnInfo(_c1); - var _ci2 = new CatalogueItem(GetMockActivator().RepositoryLocator.CatalogueRepository, _cata2, "PrivateIdentifierB"); - _ci2.SetColumnInfo(_c2); - _ci1.SaveToDatabase(); - _ci2.SaveToDatabase(); +internal class ExecuteCommandLinkCatalogueToDatasetTests : CommandCliTests +{ + [Test] + public void TestLinkCatalogueToDataset() + { + var _cata1 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset1"); + var _cata2 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset2"); + _cata1.SaveToDatabase(); + _cata2.SaveToDatabase(); + var _t1 = new TableInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "T1"); + var _t2 = new TableInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "T2"); + _t1.SaveToDatabase(); + _t2.SaveToDatabase(); + var _c1 = new ColumnInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "test.db", "varchar(10)", _t1); + var _c2 = new ColumnInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "test.db", "int", _t2); + _c1.SaveToDatabase(); + _c2.SaveToDatabase(); + var _ci1 = new CatalogueItem(GetMockActivator().RepositoryLocator.CatalogueRepository, _cata1, "PrivateIdentifierA"); + _ci1.SetColumnInfo(_c1); + var _ci2 = new CatalogueItem(GetMockActivator().RepositoryLocator.CatalogueRepository, _cata2, "PrivateIdentifierB"); + _ci2.SetColumnInfo(_c2); + _ci1.SaveToDatabase(); + _ci2.SaveToDatabase(); - var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); - Assert.DoesNotThrow(() => cmd.Execute()); - var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); - var foundCatalogue = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(c => c.Name == "Dataset1").First(); - var linkCmd = new ExecuteCommandLinkCatalogueToDataset(GetMockActivator(), foundCatalogue, founddataset); - Assert.DoesNotThrow(() => linkCmd.Execute()); - var columInfo = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects(); - foreach (var ci in columInfo) - { - Assert.That(ci.Dataset_ID, Is.EqualTo(founddataset.ID)); - } - founddataset.DeleteInDatabase(); - foundCatalogue.DeleteInDatabase(); - } - [Test] - public void TestLinkCatalogueToDatasetNotAll() + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); + Assert.DoesNotThrow(() => cmd.Execute()); + var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); + var foundCatalogue = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(c => c.Name == "Dataset1").First(); + var linkCmd = new ExecuteCommandLinkCatalogueToDataset(GetMockActivator(), foundCatalogue, founddataset); + Assert.DoesNotThrow(() => linkCmd.Execute()); + var columInfo = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects(); + foreach (var ci in columInfo) { - var _cata1 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset1"); - var _cata2 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset2"); - _cata1.SaveToDatabase(); - _cata2.SaveToDatabase(); - var _t1 = new TableInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "T1"); - var _t2 = new TableInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "T2"); - _t1.SaveToDatabase(); - _t2.SaveToDatabase(); - var _c1 = new ColumnInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "test.db", "varchar(10)", _t1); - var _c2 = new ColumnInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "test.db", "int", _t2); - _c1.SaveToDatabase(); - _c2.SaveToDatabase(); - var _ci1 = new CatalogueItem(GetMockActivator().RepositoryLocator.CatalogueRepository, _cata1, "PrivateIdentifierA"); - _ci1.SetColumnInfo(_c1); - var _ci2 = new CatalogueItem(GetMockActivator().RepositoryLocator.CatalogueRepository, _cata2, "PrivateIdentifierB"); - _ci2.SetColumnInfo(_c2); - _ci1.SaveToDatabase(); - _ci2.SaveToDatabase(); - + Assert.That(ci.Dataset_ID, Is.EqualTo(founddataset.ID)); + } + founddataset.DeleteInDatabase(); + foundCatalogue.DeleteInDatabase(); - var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); - Assert.DoesNotThrow(() => cmd.Execute()); - var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); - var foundCatalogue = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(c => c.Name == "Dataset1").First(); - var linkCmd = new ExecuteCommandLinkCatalogueToDataset(GetMockActivator(), foundCatalogue, founddataset, false); - Assert.DoesNotThrow(() => linkCmd.Execute()); - var columInfo = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ci => _cata1.CatalogueItems.Contains(ci)); - foreach (var ci in columInfo) - { - Assert.That(ci.ColumnInfo.Dataset_ID, Is.EqualTo(founddataset.ID)); - } + } + [Test] + public void TestLinkCatalogueToDatasetNotAll() + { + var _cata1 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset1"); + var _cata2 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset2"); + _cata1.SaveToDatabase(); + _cata2.SaveToDatabase(); + var _t1 = new TableInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "T1"); + var _t2 = new TableInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "T2"); + _t1.SaveToDatabase(); + _t2.SaveToDatabase(); + var _c1 = new ColumnInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "test.db", "varchar(10)", _t1); + var _c2 = new ColumnInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "test.db", "int", _t2); + _c1.SaveToDatabase(); + _c2.SaveToDatabase(); + var _ci1 = new CatalogueItem(GetMockActivator().RepositoryLocator.CatalogueRepository, _cata1, "PrivateIdentifierA"); + _ci1.SetColumnInfo(_c1); + var _ci2 = new CatalogueItem(GetMockActivator().RepositoryLocator.CatalogueRepository, _cata2, "PrivateIdentifierB"); + _ci2.SetColumnInfo(_c2); + _ci1.SaveToDatabase(); + _ci2.SaveToDatabase(); - var columInfo2 = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ci => _cata2.CatalogueItems.Contains(ci)); - foreach (var ci in columInfo2) - { - Assert.That(ci.ColumnInfo.Dataset_ID, Is.Null); - } - } - [Test] - public void TestLinkCatalogueToDatasetBadCatalogue() + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); + Assert.DoesNotThrow(() => cmd.Execute()); + var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); + var foundCatalogue = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(c => c.Name == "Dataset1").First(); + var linkCmd = new ExecuteCommandLinkCatalogueToDataset(GetMockActivator(), foundCatalogue, founddataset, false); + Assert.DoesNotThrow(() => linkCmd.Execute()); + var columInfo = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ci => _cata1.CatalogueItems.Contains(ci)); + foreach (var ci in columInfo) { - var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); - Assert.DoesNotThrow(() => cmd.Execute()); - var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); - var linkCmd = new ExecuteCommandLinkCatalogueToDataset(GetMockActivator(), null, founddataset, false); - Assert.Throws(()=>linkCmd.Execute()); + Assert.That(ci.ColumnInfo.Dataset_ID, Is.EqualTo(founddataset.ID)); } - [Test] - public void TestLinkCatalogueToDatasetBadDataset() + var columInfo2 = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ci => _cata2.CatalogueItems.Contains(ci)); + foreach (var ci in columInfo2) { - var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); - Assert.DoesNotThrow(() => cmd.Execute()); - var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); - var linkCmd = new ExecuteCommandLinkCatalogueToDataset(GetMockActivator(), new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository,"catalogue"), null, false); - Assert.Throws(() => linkCmd.Execute()); + Assert.That(ci.ColumnInfo.Dataset_ID, Is.Null); } - [Test] - public void TestLinkCatalogueToDatasetBadEverything() - { - var linkCmd = new ExecuteCommandLinkCatalogueToDataset(GetMockActivator(), null, null, false); - Assert.Throws(() => linkCmd.Execute()); - } } -} + [Test] + public void TestLinkCatalogueToDatasetBadCatalogue() + { + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); + Assert.DoesNotThrow(() => cmd.Execute()); + var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); + var linkCmd = new ExecuteCommandLinkCatalogueToDataset(GetMockActivator(), null, founddataset, false); + Assert.Throws(()=>linkCmd.Execute()); + } + + [Test] + public void TestLinkCatalogueToDatasetBadDataset() + { + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); + Assert.DoesNotThrow(() => cmd.Execute()); + var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); + var linkCmd = new ExecuteCommandLinkCatalogueToDataset(GetMockActivator(), new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository,"catalogue"), null, false); + Assert.Throws(() => linkCmd.Execute()); + } + + [Test] + public void TestLinkCatalogueToDatasetBadEverything() + { + var linkCmd = new ExecuteCommandLinkCatalogueToDataset(GetMockActivator(), null, null, false); + Assert.Throws(() => linkCmd.Execute()); + } +} \ No newline at end of file diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs index 3c1669b773..2fb4d0a7b9 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs @@ -4,111 +4,110 @@ using Rdmp.Core.CommandExecution.AtomicCommands; using Rdmp.Core.Curation.Data; -namespace Rdmp.Core.Tests.CommandExecution +namespace Rdmp.Core.Tests.CommandExecution; + +internal class ExecuteCommandLinkCoulmnInfoWithDatasetTests: CommandCliTests { - internal class ExecuteCommandLinkCoulmnInfoWithDatasetTests: CommandCliTests + [Test] + public void TestLinkColumnInfoToDataset() { - [Test] - public void TestLinkColumnInfoToDataset() - { - var _cata1 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset1"); - var _cata2 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset2"); - _cata1.SaveToDatabase(); - _cata2.SaveToDatabase(); - var _t1 = new TableInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "T1"); - var _t2 = new TableInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "T2"); - _t1.SaveToDatabase(); - _t2.SaveToDatabase(); - var _c1 = new ColumnInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "test.db", "varchar(10)", _t1); - var _c2 = new ColumnInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "test.db", "int", _t2); - _c1.SaveToDatabase(); - _c2.SaveToDatabase(); - var _ci1 = new CatalogueItem(GetMockActivator().RepositoryLocator.CatalogueRepository, _cata1, "PrivateIdentifierA"); - _ci1.SetColumnInfo(_c1); - var _ci2 = new CatalogueItem(GetMockActivator().RepositoryLocator.CatalogueRepository, _cata2, "PrivateIdentifierB"); - _ci2.SetColumnInfo(_c2); - _ci1.SaveToDatabase(); - _ci2.SaveToDatabase(); + var _cata1 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset1"); + var _cata2 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset2"); + _cata1.SaveToDatabase(); + _cata2.SaveToDatabase(); + var _t1 = new TableInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "T1"); + var _t2 = new TableInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "T2"); + _t1.SaveToDatabase(); + _t2.SaveToDatabase(); + var _c1 = new ColumnInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "test.db", "varchar(10)", _t1); + var _c2 = new ColumnInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "test.db", "int", _t2); + _c1.SaveToDatabase(); + _c2.SaveToDatabase(); + var _ci1 = new CatalogueItem(GetMockActivator().RepositoryLocator.CatalogueRepository, _cata1, "PrivateIdentifierA"); + _ci1.SetColumnInfo(_c1); + var _ci2 = new CatalogueItem(GetMockActivator().RepositoryLocator.CatalogueRepository, _cata2, "PrivateIdentifierB"); + _ci2.SetColumnInfo(_c2); + _ci1.SaveToDatabase(); + _ci2.SaveToDatabase(); - var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); - Assert.DoesNotThrow(() => cmd.Execute()); - var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); - var foundCatalogue = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(c => c.Name == "Dataset1").First(); - var linkCmd = new ExecuteCommandLinkColumnInfoToDataset(GetMockActivator(), _c1, founddataset); - Assert.DoesNotThrow(() => linkCmd.Execute()); - var columInfo = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects(); - foreach (var ci in columInfo) - { - Assert.That(ci.Dataset_ID, Is.EqualTo(founddataset.ID)); - } - } - [Test] - public void TestLinkColumnInfoToDatasetNotAll() + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); + Assert.DoesNotThrow(() => cmd.Execute()); + var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); + var foundCatalogue = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(c => c.Name == "Dataset1").First(); + var linkCmd = new ExecuteCommandLinkColumnInfoToDataset(GetMockActivator(), _c1, founddataset); + Assert.DoesNotThrow(() => linkCmd.Execute()); + var columInfo = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects(); + foreach (var ci in columInfo) { - var _cata1 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset1"); - var _cata2 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset2"); - _cata1.SaveToDatabase(); - _cata2.SaveToDatabase(); - var _t1 = new TableInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "T1"); - var _t2 = new TableInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "T2"); - _t1.SaveToDatabase(); - _t2.SaveToDatabase(); - var _c1 = new ColumnInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "test.db", "varchar(10)", _t1); - var _c2 = new ColumnInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "test.db", "int", _t2); - _c1.SaveToDatabase(); - _c2.SaveToDatabase(); - var _ci1 = new CatalogueItem(GetMockActivator().RepositoryLocator.CatalogueRepository, _cata1, "PrivateIdentifierA"); - _ci1.SetColumnInfo(_c1); - var _ci2 = new CatalogueItem(GetMockActivator().RepositoryLocator.CatalogueRepository, _cata2, "PrivateIdentifierB"); - _ci2.SetColumnInfo(_c2); - _ci1.SaveToDatabase(); - _ci2.SaveToDatabase(); - + Assert.That(ci.Dataset_ID, Is.EqualTo(founddataset.ID)); + } + } + [Test] + public void TestLinkColumnInfoToDatasetNotAll() + { + var _cata1 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset1"); + var _cata2 = new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository, "Dataset2"); + _cata1.SaveToDatabase(); + _cata2.SaveToDatabase(); + var _t1 = new TableInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "T1"); + var _t2 = new TableInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "T2"); + _t1.SaveToDatabase(); + _t2.SaveToDatabase(); + var _c1 = new ColumnInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "test.db", "varchar(10)", _t1); + var _c2 = new ColumnInfo(GetMockActivator().RepositoryLocator.CatalogueRepository, "test.db", "int", _t2); + _c1.SaveToDatabase(); + _c2.SaveToDatabase(); + var _ci1 = new CatalogueItem(GetMockActivator().RepositoryLocator.CatalogueRepository, _cata1, "PrivateIdentifierA"); + _ci1.SetColumnInfo(_c1); + var _ci2 = new CatalogueItem(GetMockActivator().RepositoryLocator.CatalogueRepository, _cata2, "PrivateIdentifierB"); + _ci2.SetColumnInfo(_c2); + _ci1.SaveToDatabase(); + _ci2.SaveToDatabase(); - var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); - Assert.DoesNotThrow(() => cmd.Execute()); - var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); - var foundCatalogue = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(c => c.Name == "Dataset1").First(); - var linkCmd = new ExecuteCommandLinkColumnInfoToDataset(GetMockActivator(), _c1, founddataset, false); - Assert.DoesNotThrow(() => linkCmd.Execute()); - var columInfo = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ci => _cata1.CatalogueItems.Contains(ci)); - foreach (var ci in columInfo) - { - Assert.That(ci.ColumnInfo.Dataset_ID, Is.EqualTo(founddataset.ID)); - } - var columInfo2 = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ci => _cata2.CatalogueItems.Contains(ci)); - foreach (var ci in columInfo2) - { - Assert.That(ci.ColumnInfo.Dataset_ID, Is.Null); - } - } - [Test] - public void TestLinkCatalogueToDatasetBadColumnInfo() + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); + Assert.DoesNotThrow(() => cmd.Execute()); + var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); + var foundCatalogue = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(c => c.Name == "Dataset1").First(); + var linkCmd = new ExecuteCommandLinkColumnInfoToDataset(GetMockActivator(), _c1, founddataset, false); + Assert.DoesNotThrow(() => linkCmd.Execute()); + var columInfo = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ci => _cata1.CatalogueItems.Contains(ci)); + foreach (var ci in columInfo) { - var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); - Assert.DoesNotThrow(() => cmd.Execute()); - var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); - var linkCmd = new ExecuteCommandLinkColumnInfoToDataset(GetMockActivator(), null, founddataset, false); - Assert.Throws(() => linkCmd.Execute()); + Assert.That(ci.ColumnInfo.Dataset_ID, Is.EqualTo(founddataset.ID)); } - [Test] - public void TestLinkColumInfoToDatasetBadDataset() + var columInfo2 = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ci => _cata2.CatalogueItems.Contains(ci)); + foreach (var ci in columInfo2) { - var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); - Assert.DoesNotThrow(() => cmd.Execute()); - var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); - var linkCmd = new ExecuteCommandLinkColumnInfoToDataset(GetMockActivator(), new ColumnInfo(), null, false); - Assert.Throws(() => linkCmd.Execute()); + Assert.That(ci.ColumnInfo.Dataset_ID, Is.Null); } + } + [Test] + public void TestLinkCatalogueToDatasetBadColumnInfo() + { + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); + Assert.DoesNotThrow(() => cmd.Execute()); + var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); + var linkCmd = new ExecuteCommandLinkColumnInfoToDataset(GetMockActivator(), null, founddataset, false); + Assert.Throws(() => linkCmd.Execute()); + } - [Test] - public void TestLinkColumnInfoToDatasetBadEverything() - { - var linkCmd = new ExecuteCommandLinkColumnInfoToDataset(GetMockActivator(), null, null, false); - Assert.Throws(() => linkCmd.Execute()); - } + [Test] + public void TestLinkColumInfoToDatasetBadDataset() + { + var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); + Assert.DoesNotThrow(() => cmd.Execute()); + var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); + var linkCmd = new ExecuteCommandLinkColumnInfoToDataset(GetMockActivator(), new ColumnInfo(), null, false); + Assert.Throws(() => linkCmd.Execute()); + } + + [Test] + public void TestLinkColumnInfoToDatasetBadEverything() + { + var linkCmd = new ExecuteCommandLinkColumnInfoToDataset(GetMockActivator(), null, null, false); + Assert.Throws(() => linkCmd.Execute()); } -} +} \ No newline at end of file diff --git a/Rdmp.UI/CohortUI/CreateHoldoutLookup/CreateHoldoutLookupUI.cs b/Rdmp.UI/CohortUI/CreateHoldoutLookup/CreateHoldoutLookupUI.cs index c9bccf1c81..238d7a3315 100644 --- a/Rdmp.UI/CohortUI/CreateHoldoutLookup/CreateHoldoutLookupUI.cs +++ b/Rdmp.UI/CohortUI/CreateHoldoutLookup/CreateHoldoutLookupUI.cs @@ -73,7 +73,7 @@ private void btnCancel_Click(object sender, EventArgs e) DialogResult = DialogResult.Cancel; Close(); } - + private void CohortHoldoutCreationRequestUI_Load(object sender, EventArgs e) { _target.Check(ragSmiley1); diff --git a/Rdmp.UI/Collections/DatasetsCollectionUI.cs b/Rdmp.UI/Collections/DatasetsCollectionUI.cs index 57ae2d0026..1b8b1f4fd7 100644 --- a/Rdmp.UI/Collections/DatasetsCollectionUI.cs +++ b/Rdmp.UI/Collections/DatasetsCollectionUI.cs @@ -9,102 +9,101 @@ using System.Linq; using Rdmp.Core.Curation.Data; -namespace Rdmp.UI.Collections +namespace Rdmp.UI.Collections; + +public partial class DatasetsCollectionUI : RDMPCollectionUI, ILifetimeSubscriber { - public partial class DatasetsCollectionUI : RDMPCollectionUI, ILifetimeSubscriber + + private Dataset[] _datasets; + private bool _firstTime = true; + + public DatasetsCollectionUI() { + InitializeComponent(); + } + + public override void SetItemActivator(IActivateItems activator) + { + base.SetItemActivator(activator); + + CommonTreeFunctionality.SetUp(RDMPCollection.Datasets, tlvDatasets, Activator, olvName, olvName, + new RDMPCollectionCommonFunctionalitySettings()); + CommonTreeFunctionality.WhitespaceRightClickMenuCommandsGetter = + a => new IAtomicCommand[] + { + new ExecuteCommandCreateNewDatasetUI(Activator) + { OverrideCommandName = "Add New Dataset", Weight = -50.9f } + }; + Activator.RefreshBus.EstablishLifetimeSubscription(this); + tlvDatasets.AddObject(activator.CoreChildProvider.DatasetRootFolder); - private Dataset[] _datasets; - private bool _firstTime = true; + RefreshDatasets(Activator.CoreChildProvider.DatasetRootFolder); - public DatasetsCollectionUI() + if (_firstTime) { - InitializeComponent(); + CommonTreeFunctionality.SetupColumnTracking(olvName, new Guid("f8b0481e-378c-4996-9400-cb039c2efc5c")); + _firstTime = false; } + } - public override void SetItemActivator(IActivateItems activator) + public void RefreshBus_RefreshObject(object sender, RefreshObjectEventArgs e) + { + RefreshDatasets(Activator.CoreChildProvider.DatasetRootFolder); + } + + private void RefreshDatasets(object oRefreshFrom) + { + var rootFolder = Activator.CoreChildProvider.DatasetRootFolder; + if (_datasets != null) { - base.SetItemActivator(activator); - - CommonTreeFunctionality.SetUp(RDMPCollection.Datasets, tlvDatasets, Activator, olvName, olvName, - new RDMPCollectionCommonFunctionalitySettings()); - CommonTreeFunctionality.WhitespaceRightClickMenuCommandsGetter = - a => new IAtomicCommand[] - { - new ExecuteCommandCreateNewDatasetUI(Activator) - { OverrideCommandName = "Add New Dataset", Weight = -50.9f }, - }; - Activator.RefreshBus.EstablishLifetimeSubscription(this); - tlvDatasets.AddObject(activator.CoreChildProvider.DatasetRootFolder); - - RefreshDatasets(Activator.CoreChildProvider.DatasetRootFolder); - - if (_firstTime) + var newCatalogues = CommonTreeFunctionality.CoreChildProvider.AllDatasets.Except(_datasets); + if (newCatalogues.Any()) { - CommonTreeFunctionality.SetupColumnTracking(olvName, new Guid("f8b0481e-378c-4996-9400-cb039c2efc5c")); - _firstTime = false; + oRefreshFrom = rootFolder; //refresh from the root instead + tlvDatasets.RefreshObject(oRefreshFrom); } } - - public void RefreshBus_RefreshObject(object sender, RefreshObjectEventArgs e) + _datasets = CommonTreeFunctionality.CoreChildProvider.AllDatasets; + if (_firstTime || Equals(oRefreshFrom, rootFolder)) { - RefreshDatasets(Activator.CoreChildProvider.DatasetRootFolder); + tlvDatasets.RefreshObject(rootFolder); + tlvDatasets.Expand(rootFolder); + _firstTime = false; } - private void RefreshDatasets(object oRefreshFrom) - { - var rootFolder = Activator.CoreChildProvider.DatasetRootFolder; - if (_datasets != null) - { - var newCatalogues = CommonTreeFunctionality.CoreChildProvider.AllDatasets.Except(_datasets); - if (newCatalogues.Any()) - { - oRefreshFrom = rootFolder; //refresh from the root instead - tlvDatasets.RefreshObject(oRefreshFrom); - } - } - _datasets = CommonTreeFunctionality.CoreChildProvider.AllDatasets; - if (_firstTime || Equals(oRefreshFrom, rootFolder)) - { - tlvDatasets.RefreshObject(rootFolder); - tlvDatasets.Expand(rootFolder); - _firstTime = false; - } - - } + } - /// - /// Returns all root objects in RDMP that match the . Handles unpicking tree collisions e.g. where matches 2 objects with one being the child of the other - /// - /// - /// - /// - public static List FindRootObjects(IActivateItems activator, - Func condition) - { - var datasets = - activator.RepositoryLocator.CatalogueRepository.GetAllObjects(); + /// + /// Returns all root objects in RDMP that match the . Handles unpicking tree collisions e.g. where matches 2 objects with one being the child of the other + /// + /// + /// + /// + public static List FindRootObjects(IActivateItems activator, + Func condition) + { + var datasets = + activator.RepositoryLocator.CatalogueRepository.GetAllObjects(); - var actualRootFavourites = new List(); + var actualRootFavourites = new List(); - foreach (var currentFavourite in datasets) - actualRootFavourites.Add(currentFavourite); + foreach (var currentFavourite in datasets) + actualRootFavourites.Add(currentFavourite); - return actualRootFavourites; - } + return actualRootFavourites; + } - /// - /// Return true if the object should be displayed in this pane - /// - /// - /// - protected virtual bool IncludeObject(IMapsDirectlyToDatabaseTable key) => - Activator.RepositoryLocator.CatalogueRepository.GetAllObjects().Contains(key); + /// + /// Return true if the object should be displayed in this pane + /// + /// + /// + protected virtual bool IncludeObject(IMapsDirectlyToDatabaseTable key) => + Activator.RepositoryLocator.CatalogueRepository.GetAllObjects().Contains(key); - public static bool IsRootObject(IActivateItems activator, object root) => - //never favourite - false; - } -} + public static bool IsRootObject(IActivateItems activator, object root) => + //never favourite + false; +} \ No newline at end of file diff --git a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDatasetUI.cs b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDatasetUI.cs index b1df2deaf9..931976343b 100644 --- a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDatasetUI.cs +++ b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDatasetUI.cs @@ -15,7 +15,7 @@ namespace Rdmp.UI.CommandExecution.AtomicCommands; -public class ExecuteCommandLinkCatalogueToDatasetUI : BasicUICommandExecution, IAtomicCommand +public sealed class ExecuteCommandLinkCatalogueToDatasetUI : BasicUICommandExecution { private readonly Catalogue _catalogue; private Dataset _selectedDataset; @@ -33,7 +33,7 @@ public override string GetCommandHelp() => public override void Execute() { base.Execute(); - Dataset[] datasets = _activateItems.RepositoryLocator.CatalogueRepository.GetAllObjects(); + var datasets = _activateItems.RepositoryLocator.CatalogueRepository.GetAllObjects(); DialogArgs da = new() { WindowTitle = "Link a dataset with this catalogue", diff --git a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataSetUI.cs b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataSetUI.cs index b88be0a297..d59809fc9e 100644 --- a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataSetUI.cs +++ b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkColumnInfoToDataSetUI.cs @@ -8,6 +8,7 @@ using Rdmp.Core.CommandExecution.AtomicCommands; using Rdmp.Core.Curation.Data; using Rdmp.Core.Icons.IconProvision; +using Rdmp.Core.ReusableLibraryCode.Annotations; using Rdmp.Core.ReusableLibraryCode.Icons.IconProvision; using Rdmp.UI.ItemActivation; using SixLabors.ImageSharp; @@ -15,11 +16,11 @@ namespace Rdmp.UI.CommandExecution.AtomicCommands; -public class ExecuteCommandLinkColumnInfoToDataSetUI : BasicUICommandExecution, IAtomicCommand +public sealed class ExecuteCommandLinkColumnInfoToDataSetUI : BasicUICommandExecution { private readonly ColumnInfo _columnInfo; private Dataset _selectedDataset; - private IActivateItems _activateItems; + private readonly IActivateItems _activateItems; public ExecuteCommandLinkColumnInfoToDataSetUI(IActivateItems activator, ColumnInfo columnInfo) : base(activator) { @@ -27,13 +28,14 @@ public ExecuteCommandLinkColumnInfoToDataSetUI(IActivateItems activator, ColumnI _activateItems = activator; } + [NotNull] public override string GetCommandHelp() => "Link this column to an existing dataset"; public override void Execute() { base.Execute(); - Dataset[] datasets = _activateItems.RepositoryLocator.CatalogueRepository.GetAllObjects(); + var datasets = _activateItems.RepositoryLocator.CatalogueRepository.GetAllObjects(); DialogArgs da = new() { WindowTitle = "Link a dataset with this column", @@ -47,6 +49,6 @@ public override void Execute() } - public override Image GetImage(IIconProvider iconProvider) => + public override Image GetImage([NotNull] IIconProvider iconProvider) => iconProvider.GetImage(RDMPConcept.Dataset, OverlayKind.Link); } \ No newline at end of file diff --git a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandOpenExtractionDirectory.cs b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandOpenExtractionDirectory.cs index 5281b48a7c..10936e4cf2 100644 --- a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandOpenExtractionDirectory.cs +++ b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandOpenExtractionDirectory.cs @@ -73,13 +73,13 @@ public ExecuteCommandOpenExtractionDirectory(IActivateItems activator, IExtracti // all datasets have been extracted to disk // but do they have a shared parent dir? - var files = cumulativeExtractionResults.Select(c => new FileInfo(c.DestinationDescription)).ToArray(); + var files = cumulativeExtractionResults.Select(static c => new FileInfo(c.DestinationDescription)).ToArray(); - var parents = files.Select(f => f.Directory?.Parent?.FullName).Where(d => d != null).Distinct() + var parents = files.Select(static f => f.Directory?.Parent?.FullName).Where(static d => d != null).Distinct() .ToArray(); if (parents.Length != 1) - SetImpossible($"Extracted files do not share a common extraction directory"); + SetImpossible("Extracted files do not share a common extraction directory"); else _dir = new DirectoryInfo(parents[0]); } diff --git a/Rdmp.UI/MainFormUITabs/CatalogueItemUI.cs b/Rdmp.UI/MainFormUITabs/CatalogueItemUI.cs index 95943a909c..418fa5875b 100644 --- a/Rdmp.UI/MainFormUITabs/CatalogueItemUI.cs +++ b/Rdmp.UI/MainFormUITabs/CatalogueItemUI.cs @@ -41,7 +41,7 @@ public CatalogueItemUI() AssociatedCollection = RDMPCollection.Catalogue; ci_ddPeriodicity.DataSource = Enum.GetValues(typeof(Catalogue.CataloguePeriodicity)); - + } private bool objectSaverButton1_BeforeSave(DatabaseEntity databaseEntity) diff --git a/Rdmp.UI/MainFormUITabs/CatalogueUI.cs b/Rdmp.UI/MainFormUITabs/CatalogueUI.cs index 3fcca9e4fc..cb054538d7 100644 --- a/Rdmp.UI/MainFormUITabs/CatalogueUI.cs +++ b/Rdmp.UI/MainFormUITabs/CatalogueUI.cs @@ -141,7 +141,7 @@ public override void SetDatabaseObject(IActivateItems activator, Catalogue datab { lbDatasets.Visible = true; lbDatasetslbl.Visible = true; - string finalString = associatedDatasets.Count == 1 ? associatedDatasets[0] : String.Join(", ", associatedDatasets.ToArray(), 0, associatedDatasets.Count - 1) + " and " + associatedDatasets.LastOrDefault(); + var finalString = associatedDatasets.Count == 1 ? associatedDatasets[0] : string.Join(", ", associatedDatasets.ToArray(), 0, associatedDatasets.Count - 1) + " and " + associatedDatasets.LastOrDefault(); lbDatasets.Text = $"This catalogues contains data from the datasets:{finalString}"; } else diff --git a/Rdmp.UI/MainFormUITabs/ExtractionProgressUI.cs b/Rdmp.UI/MainFormUITabs/ExtractionProgressUI.cs index 2396090a7d..b779f9e97c 100644 --- a/Rdmp.UI/MainFormUITabs/ExtractionProgressUI.cs +++ b/Rdmp.UI/MainFormUITabs/ExtractionProgressUI.cs @@ -62,7 +62,7 @@ public override void SetDatabaseObject(IActivateItems activator, ExtractionProgr } else { - lblEvaluationDate.Text = $"(DQE has not been run)"; + lblEvaluationDate.Text = "(DQE has not been run)"; btnFromDQE.Enabled = false; } diff --git a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChartUI.cs b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChartUI.cs index e073bb9be1..ca9bbfdc7c 100644 --- a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChartUI.cs +++ b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChartUI.cs @@ -133,7 +133,7 @@ private void PopulateAsEmptyDescriptionsChart() var countPopulated = 0; var countNotPopulated = 0; foreach (var ci in catalogueItems) - if (ci.ColumnInfo.Dataset_ID is null) + if (ci.ColumnInfo.Dataset_ID is null) countNotPopulated++; else countPopulated++; diff --git a/Rdmp.UI/SimpleDialogs/Datasets/CreateNewDatasetUI.cs b/Rdmp.UI/SimpleDialogs/Datasets/CreateNewDatasetUI.cs index d459db9eae..26f75c30da 100644 --- a/Rdmp.UI/SimpleDialogs/Datasets/CreateNewDatasetUI.cs +++ b/Rdmp.UI/SimpleDialogs/Datasets/CreateNewDatasetUI.cs @@ -4,36 +4,35 @@ using Rdmp.UI.TestsAndSetup.ServicePropogation; using System; -namespace Rdmp.UI.SimpleDialogs.Datasets +namespace Rdmp.UI.SimpleDialogs.Datasets; + +public partial class CreateNewDatasetUI : RDMPForm { - public partial class CreateNewDatasetUI : RDMPForm + private IActivateItems _activator; + public CreateNewDatasetUI(IActivateItems activator, ExecuteCommandCreateNewDatasetUI command) : base(activator) { - private IActivateItems _activator; - public CreateNewDatasetUI(IActivateItems activator, ExecuteCommandCreateNewDatasetUI command) : base(activator) - { - _activator = activator; - InitializeComponent(); + _activator = activator; + InitializeComponent(); - } + } - private void CreateNewDatasetUI_Load(object sender, EventArgs e) - { + private void CreateNewDatasetUI_Load(object sender, EventArgs e) + { - } + } - private void btnCancel_Click(object sender, EventArgs e) - { - Close(); - } + private void btnCancel_Click(object sender, EventArgs e) + { + Close(); + } - private void btnCreate_Click(object sender, EventArgs e) - { + private void btnCreate_Click(object sender, EventArgs e) + { - var cmd = new ExecuteCommandCreateDataset(_activator,tbName.Text,tbDOI.Text,tbSource.Text); - cmd.Execute(); - Close(); - } + var cmd = new ExecuteCommandCreateDataset(_activator,tbName.Text,tbDOI.Text,tbSource.Text); + cmd.Execute(); + Close(); + } - } -} +} \ No newline at end of file diff --git a/Rdmp.UI/SimpleDialogs/ForwardEngineering/ConfigureCatalogueExtractabilityUI.cs b/Rdmp.UI/SimpleDialogs/ForwardEngineering/ConfigureCatalogueExtractabilityUI.cs index 3add8cd365..2eb50687b4 100644 --- a/Rdmp.UI/SimpleDialogs/ForwardEngineering/ConfigureCatalogueExtractabilityUI.cs +++ b/Rdmp.UI/SimpleDialogs/ForwardEngineering/ConfigureCatalogueExtractabilityUI.cs @@ -395,7 +395,7 @@ private void ddCategoriseMany_SelectedIndexChanged(object sender, EventArgs e) var toChangeTo = ddCategoriseMany.SelectedItem; var itemsToChange = filteredObjects.Where(obj => obj.ExtractionInformation is null || !obj.ExtractionInformation.ExtractionCategory.Equals(toChangeTo)).Select(static cp => cp.CatalogueItem.Name).ToArray(); var columnChangeDetails = itemsToChange.Length < 3 - ? new StringBuilder().AppendJoin(", ", itemsToChange[0..^1]) + ? new StringBuilder().AppendJoin(", ", itemsToChange[..^1]) .Append(itemsToChange.Length > 1 ? " and " : "").Append(itemsToChange[^1]).ToString() : $"{(itemsToChange.Length == filteredObjects.Length ? "all " : "")}{itemsToChange.Length} columns"; diff --git a/Rdmp.UI/TestsAndSetup/ServicePropogation/RDMPControlCommonFunctionality.cs b/Rdmp.UI/TestsAndSetup/ServicePropogation/RDMPControlCommonFunctionality.cs index d1bc7f72f9..cdc6e1a213 100644 --- a/Rdmp.UI/TestsAndSetup/ServicePropogation/RDMPControlCommonFunctionality.cs +++ b/Rdmp.UI/TestsAndSetup/ServicePropogation/RDMPControlCommonFunctionality.cs @@ -396,7 +396,7 @@ public void AddToMenu(ToolStripItem menuItem, string underMenu = null) if (!string.IsNullOrWhiteSpace(underMenu)) { - if (!_addToMenuSubmenus.TryGetValue(underMenu, out ToolStripMenuItem stripMenuItem)) + if (!_addToMenuSubmenus.TryGetValue(underMenu, out var stripMenuItem)) { stripMenuItem = new ToolStripMenuItem(underMenu); _addToMenuSubmenus.Add(underMenu, stripMenuItem); From 39759334d71c421e402b0834a54e23fd869636ca Mon Sep 17 00:00:00 2001 From: jas88 Date: Tue, 5 Dec 2023 11:02:45 -0600 Subject: [PATCH 84/85] Unit test fixups - ImpossibleCommandException not Exception now --- .../ExecuteCommandCreateDatasetTests.cs | 5 +++-- ...ecuteCommandLinkCatalogueToDatasetTests.cs | 19 +++++++++--------- .../ExecuteCommandLinkCatalogueToDatasetUI.cs | 16 +++++++-------- .../ProposeExecutionWhenTargetIsDataset.cs | 2 ++ Rdmp.UI/MainFormUITabs/CatalogueItemUI.cs | 5 +++-- Rdmp.UI/MainFormUITabs/CatalogueUI.cs | 20 ++++++------------- 6 files changed, 32 insertions(+), 35 deletions(-) diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandCreateDatasetTests.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandCreateDatasetTests.cs index 9efdbd6f2d..3bc17eb85c 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandCreateDatasetTests.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandCreateDatasetTests.cs @@ -3,6 +3,7 @@ using Rdmp.Core.CommandExecution.AtomicCommands; using System; using System.Linq; +using Rdmp.Core.CommandExecution; namespace Rdmp.Core.Tests.CommandExecution; @@ -18,14 +19,14 @@ public void TestDatasetCreationOKParameters() { public void TestDatasetCreationNoParameters() { var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), null); - Assert.Throws(() => cmd.Execute()); + Assert.Throws(cmd.Execute); } [Test] public void TestDatasetCreationOKExtendedParameters() { var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset2","somedoi","some source"); - Assert.DoesNotThrow(() => cmd.Execute()); + Assert.DoesNotThrow(cmd.Execute); var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ds => ds.Name == "dataset2" && ds.DigitalObjectIdentifier == "somedoi" && ds.Source == "some source").First(); Assert.That(founddataset,Is.Not.Null); } diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs index e9bfe91a91..95da47a552 100644 --- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs +++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCatalogueToDatasetTests.cs @@ -1,6 +1,7 @@ using System; using System.Linq; using NUnit.Framework; +using Rdmp.Core.CommandExecution; using Rdmp.Core.CommandExecution.AtomicCommands; using Rdmp.Core.Curation.Data; @@ -33,11 +34,11 @@ public void TestLinkCatalogueToDataset() var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); - Assert.DoesNotThrow(() => cmd.Execute()); + Assert.DoesNotThrow(cmd.Execute); var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); var foundCatalogue = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(c => c.Name == "Dataset1").First(); var linkCmd = new ExecuteCommandLinkCatalogueToDataset(GetMockActivator(), foundCatalogue, founddataset); - Assert.DoesNotThrow(() => linkCmd.Execute()); + Assert.DoesNotThrow(linkCmd.Execute); var columInfo = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects(); foreach (var ci in columInfo) { @@ -71,11 +72,11 @@ public void TestLinkCatalogueToDatasetNotAll() var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); - Assert.DoesNotThrow(() => cmd.Execute()); + Assert.DoesNotThrow(cmd.Execute); var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); var foundCatalogue = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(c => c.Name == "Dataset1").First(); var linkCmd = new ExecuteCommandLinkCatalogueToDataset(GetMockActivator(), foundCatalogue, founddataset, false); - Assert.DoesNotThrow(() => linkCmd.Execute()); + Assert.DoesNotThrow(linkCmd.Execute); var columInfo = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ci => _cata1.CatalogueItems.Contains(ci)); foreach (var ci in columInfo) { @@ -93,26 +94,26 @@ public void TestLinkCatalogueToDatasetNotAll() public void TestLinkCatalogueToDatasetBadCatalogue() { var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); - Assert.DoesNotThrow(() => cmd.Execute()); + Assert.DoesNotThrow(cmd.Execute); var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); var linkCmd = new ExecuteCommandLinkCatalogueToDataset(GetMockActivator(), null, founddataset, false); - Assert.Throws(()=>linkCmd.Execute()); + Assert.Throws(linkCmd.Execute); } [Test] public void TestLinkCatalogueToDatasetBadDataset() { var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset"); - Assert.DoesNotThrow(() => cmd.Execute()); + Assert.DoesNotThrow(cmd.Execute); var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First(); var linkCmd = new ExecuteCommandLinkCatalogueToDataset(GetMockActivator(), new Catalogue(GetMockActivator().RepositoryLocator.CatalogueRepository,"catalogue"), null, false); - Assert.Throws(() => linkCmd.Execute()); + Assert.Throws(linkCmd.Execute); } [Test] public void TestLinkCatalogueToDatasetBadEverything() { var linkCmd = new ExecuteCommandLinkCatalogueToDataset(GetMockActivator(), null, null, false); - Assert.Throws(() => linkCmd.Execute()); + Assert.Throws(linkCmd.Execute); } } \ No newline at end of file diff --git a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDatasetUI.cs b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDatasetUI.cs index 931976343b..d0b99eb69d 100644 --- a/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDatasetUI.cs +++ b/Rdmp.UI/CommandExecution/AtomicCommands/ExecuteCommandLinkCatalogueToDatasetUI.cs @@ -8,6 +8,7 @@ using Rdmp.Core.CommandExecution.AtomicCommands; using Rdmp.Core.Curation.Data; using Rdmp.Core.Icons.IconProvision; +using Rdmp.Core.ReusableLibraryCode.Annotations; using Rdmp.Core.ReusableLibraryCode.Icons.IconProvision; using Rdmp.UI.ItemActivation; using SixLabors.ImageSharp; @@ -19,7 +20,7 @@ public sealed class ExecuteCommandLinkCatalogueToDatasetUI : BasicUICommandExecu { private readonly Catalogue _catalogue; private Dataset _selectedDataset; - private IActivateItems _activateItems; + private readonly IActivateItems _activateItems; public ExecuteCommandLinkCatalogueToDatasetUI(IActivateItems activator, Catalogue catalogue) : base(activator) { @@ -41,14 +42,13 @@ public override void Execute() "Select the Dataset that this catalogue information came from" }; _selectedDataset = SelectOne(da, datasets); - if (_selectedDataset is not null) - { - var backfill = YesNo("Link all other columns that match the source table?", "Do you want to link this dataset to all other columns that reference the same table as this column?"); - var cmd = new ExecuteCommandLinkCatalogueToDataset(_activateItems, _catalogue, _selectedDataset, backfill); - cmd.Execute(); - } + if (_selectedDataset is null) return; + + var backfill = YesNo("Link all other columns that match the source table?", "Do you want to link this dataset to all other columns that reference the same table as this column?"); + var cmd = new ExecuteCommandLinkCatalogueToDataset(_activateItems, _catalogue, _selectedDataset, backfill); + cmd.Execute(); } - public override Image GetImage(IIconProvider iconProvider) => + public override Image GetImage([NotNull] IIconProvider iconProvider) => iconProvider.GetImage(RDMPConcept.Dataset, OverlayKind.Link); } \ No newline at end of file diff --git a/Rdmp.UI/CommandExecution/Proposals/ProposeExecutionWhenTargetIsDataset.cs b/Rdmp.UI/CommandExecution/Proposals/ProposeExecutionWhenTargetIsDataset.cs index a6515911fb..030ceb12d5 100644 --- a/Rdmp.UI/CommandExecution/Proposals/ProposeExecutionWhenTargetIsDataset.cs +++ b/Rdmp.UI/CommandExecution/Proposals/ProposeExecutionWhenTargetIsDataset.cs @@ -6,6 +6,7 @@ using Rdmp.Core.CommandExecution; using Rdmp.Core.Curation.Data; +using Rdmp.Core.ReusableLibraryCode.Annotations; using Rdmp.UI.ItemActivation; using Rdmp.UI.SubComponents; @@ -27,6 +28,7 @@ public override void Activate(Dataset target) ItemActivator.Activate(target); } + [CanBeNull] public override ICommandExecution ProposeExecution(ICombineToMakeCommand cmd, Dataset target, InsertOption insertOption = InsertOption.Default) => diff --git a/Rdmp.UI/MainFormUITabs/CatalogueItemUI.cs b/Rdmp.UI/MainFormUITabs/CatalogueItemUI.cs index 418fa5875b..983f0b20c5 100644 --- a/Rdmp.UI/MainFormUITabs/CatalogueItemUI.cs +++ b/Rdmp.UI/MainFormUITabs/CatalogueItemUI.cs @@ -69,7 +69,8 @@ public override void SetDatabaseObject(IActivateItems activator, CatalogueItem d { lbDatasetValue.Visible = true; lbDataset.Visible = true; - var dataset = _catalogueItem.CatalogueRepository.GetAllObjects().Where(ds => ds.ID == columnInfoDatasetValue).First(); + var dataset = _catalogueItem.CatalogueRepository.GetAllObjects() + .FirstOrDefault(ds => ds.ID == columnInfoDatasetValue); if (dataset != null) { lbDatasetValue.Text = dataset.Name; @@ -94,7 +95,7 @@ public override void SetDatabaseObject(IActivateItems activator, CatalogueItem d base.SetDatabaseObject(activator, databaseObject); - if (_catalogueItem.ExtractionInformation == null) + if (_catalogueItem?.ExtractionInformation == null) CommonFunctionality.AddToMenu(new ExecuteCommandMakeCatalogueItemExtractable(activator, _catalogueItem), "Make Extractable"); } diff --git a/Rdmp.UI/MainFormUITabs/CatalogueUI.cs b/Rdmp.UI/MainFormUITabs/CatalogueUI.cs index cb054538d7..a2b6884032 100644 --- a/Rdmp.UI/MainFormUITabs/CatalogueUI.cs +++ b/Rdmp.UI/MainFormUITabs/CatalogueUI.cs @@ -123,20 +123,12 @@ public override void SetDatabaseObject(IActivateItems activator, Catalogue datab base.SetDatabaseObject(activator, databaseObject); _catalogue = databaseObject; - var associatedDatasets = new List(); - foreach (var catalogueItem in _catalogue.CatalogueItems) - { - var datasetId = catalogueItem.ColumnInfo.Dataset_ID; - if (datasetId != null) - { - var foundDataset = _catalogue.CatalogueRepository.GetAllObjectsWhere("ID", datasetId).First(); - if (!associatedDatasets.Contains(foundDataset.Name)) - { - associatedDatasets.Add(foundDataset.Name); - } - - } - } + var associatedDatasets = _catalogue.CatalogueItems + .Select(static catalogueItem => catalogueItem.ColumnInfo.Dataset_ID) + .Where(static datasetId => datasetId != null) + .Select(datasetId => + _catalogue.CatalogueRepository.GetAllObjectsWhere("ID", datasetId).First()) + .Select(static ds=>ds.Name).ToList(); if (associatedDatasets.Count > 0) { lbDatasets.Visible = true; From 86f5b42edf105737acfcbb125100f01bde4b13ca Mon Sep 17 00:00:00 2001 From: jas88 Date: Tue, 5 Dec 2023 11:19:33 -0600 Subject: [PATCH 85/85] Fix typo 'datset', add readonly --- .../ProposeExecutionWhenTargetIsDataset.cs | 2 +- .../CatalogueToDatasetLinkagePieChartUI.cs | 56 +++++++++---------- .../Datasets/CreateNewDatasetUI.cs | 9 +-- ....cs => DatasetConfigurationUI.Designer.cs} | 2 +- ...urationUI.cs => DatasetConfigurationUI.cs} | 24 ++++---- ...ionUI.resx => DatasetConfigurationUI.resx} | 0 6 files changed, 44 insertions(+), 49 deletions(-) rename Rdmp.UI/SubComponents/{DatsetConfigurationUI.Designer.cs => DatasetConfigurationUI.Designer.cs} (99%) rename Rdmp.UI/SubComponents/{DatsetConfigurationUI.cs => DatasetConfigurationUI.cs} (62%) rename Rdmp.UI/SubComponents/{DatsetConfigurationUI.resx => DatasetConfigurationUI.resx} (100%) diff --git a/Rdmp.UI/CommandExecution/Proposals/ProposeExecutionWhenTargetIsDataset.cs b/Rdmp.UI/CommandExecution/Proposals/ProposeExecutionWhenTargetIsDataset.cs index 030ceb12d5..7bc681d63e 100644 --- a/Rdmp.UI/CommandExecution/Proposals/ProposeExecutionWhenTargetIsDataset.cs +++ b/Rdmp.UI/CommandExecution/Proposals/ProposeExecutionWhenTargetIsDataset.cs @@ -25,7 +25,7 @@ public ProposeExecutionWhenTargetIsDataset(IActivateItems itemActivator) : base( public override void Activate(Dataset target) { - ItemActivator.Activate(target); + ItemActivator.Activate(target); } [CanBeNull] diff --git a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChartUI.cs b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChartUI.cs index ca9bbfdc7c..e08d7786ae 100644 --- a/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChartUI.cs +++ b/Rdmp.UI/PieCharts/CatalogueToDatasetLinkagePieChartUI.cs @@ -32,21 +32,21 @@ namespace Rdmp.UI.PieCharts; /// public partial class CatalogueToDatasetLinkagePieChartUI : RDMPUserControl, IDashboardableControl { - private ToolStripButton btnSingleCatalogue = new("Single", CatalogueIcons.Catalogue.ImageToBitmap()) + private readonly ToolStripButton _btnSingleCatalogue = new("Single", CatalogueIcons.Catalogue.ImageToBitmap()) { Name = "btnSingleCatalogue" }; - private ToolStripButton btnAllCatalogues = + private readonly ToolStripButton _btnAllCatalogues = new("All", CatalogueIcons.AllCataloguesUsedByLoadMetadataNode.ImageToBitmap()) { Name = "btnAllCatalogues" }; - private ToolStripButton btnRefresh = new("Refresh", FamFamFamIcons.text_list_bullets.ImageToBitmap()) + private readonly ToolStripButton _btnRefresh = new("Refresh", FamFamFamIcons.text_list_bullets.ImageToBitmap()) { Name = "btnRefresh" }; - private ToolStripLabel toolStripLabel1 = new("Type:") { Name = "toolStripLabel1" }; + private readonly ToolStripLabel _toolStripLabel1 = new("Type:") { Name = "toolStripLabel1" }; - private ToolStripButton btnShowLabels = new("Labels", FamFamFamIcons.text_align_left.ImageToBitmap()) + private readonly ToolStripButton _btnShowLabels = new("Labels", FamFamFamIcons.text_align_left.ImageToBitmap()) { Name = "btnShowLabels", CheckOnClick = true }; - private List _flagOptions = new(); + private readonly List _flagOptions = new(); public CatalogueToDatasetLinkagePieChartUI() { @@ -54,10 +54,10 @@ public CatalogueToDatasetLinkagePieChartUI() btnViewDataTable.Image = CatalogueIcons.TableInfo.ImageToBitmap(); - btnAllCatalogues.Click += btnAllCatalogues_Click; - btnSingleCatalogue.Click += btnSingleCatalogue_Click; - btnShowLabels.CheckStateChanged += btnShowLabels_CheckStateChanged; - btnRefresh.Click += btnRefresh_Click; + _btnAllCatalogues.Click += btnAllCatalogues_Click; + _btnSingleCatalogue.Click += btnSingleCatalogue_Click; + _btnShowLabels.CheckStateChanged += btnShowLabels_CheckStateChanged; + _btnRefresh.Click += btnRefresh_Click; //put edit mode on for the designer NotifyEditModeChange(false); @@ -65,7 +65,7 @@ public CatalogueToDatasetLinkagePieChartUI() private void SetupFlags() { - if (!firstTime) + if (!_firstTime) return; AddFlag("Non Extractable Catalogues", c => c.IncludeNonExtractableCatalogues, @@ -84,7 +84,7 @@ private void SetupFlags() (c, r) => c.IncludeInternalCatalogueItems = r); AddFlag("Deprecated Catalogue Items", c => c.IncludeDeprecatedCatalogueItems, (c, r) => c.IncludeDeprecatedCatalogueItems = r); - firstTime = false; + _firstTime = false; } private void AddFlag(string caption, Func getProp, @@ -181,7 +181,7 @@ public void RefreshBus_RefreshObject(object sender, RefreshObjectEventArgs e) } private bool _bLoading; - private bool firstTime = true; + private bool _firstTime = true; public void SetCollection(IActivateItems activator, IPersistableObjectCollection collection) { @@ -190,19 +190,19 @@ public void SetCollection(IActivateItems activator, IPersistableObjectCollection _collection = (GoodBadCataloguePieChartObjectCollection)collection; - if (firstTime) + if (_firstTime) SetupFlags(); - btnAllCatalogues.Checked = !_collection.IsSingleCatalogueMode; - btnSingleCatalogue.Checked = _collection.IsSingleCatalogueMode; - btnShowLabels.Checked = _collection.ShowLabels; + _btnAllCatalogues.Checked = !_collection.IsSingleCatalogueMode; + _btnSingleCatalogue.Checked = _collection.IsSingleCatalogueMode; + _btnShowLabels.Checked = _collection.ShowLabels; - CommonFunctionality.Add(btnAllCatalogues); - CommonFunctionality.Add(toolStripLabel1); - CommonFunctionality.Add(btnAllCatalogues); - CommonFunctionality.Add(btnSingleCatalogue); - CommonFunctionality.Add(btnShowLabels); - CommonFunctionality.Add(btnRefresh); + CommonFunctionality.Add(_btnAllCatalogues); + CommonFunctionality.Add(_toolStripLabel1); + CommonFunctionality.Add(_btnAllCatalogues); + CommonFunctionality.Add(_btnSingleCatalogue); + CommonFunctionality.Add(_btnShowLabels); + CommonFunctionality.Add(_btnRefresh); foreach (var mi in _flagOptions) CommonFunctionality.AddToMenu(mi); @@ -245,8 +245,8 @@ public void NotifyEditModeChange(bool isEditModeOn) private void btnAllCatalogues_Click(object sender, EventArgs e) { - btnAllCatalogues.Checked = true; - btnSingleCatalogue.Checked = false; + _btnAllCatalogues.Checked = true; + _btnSingleCatalogue.Checked = false; _collection.SetAllCataloguesMode(); GenerateChart(); SaveCollectionChanges(); @@ -260,8 +260,8 @@ private void btnSingleCatalogue_Click(object sender, EventArgs e) }, Activator.RepositoryLocator.CatalogueRepository.GetAllObjects(), out var selected)) return; _collection.SetSingleCatalogueMode(selected); - btnAllCatalogues.Checked = false; - btnSingleCatalogue.Checked = true; + _btnAllCatalogues.Checked = false; + _btnSingleCatalogue.Checked = true; SaveCollectionChanges(); GenerateChart(); @@ -282,7 +282,7 @@ private void SaveCollectionChanges() private void btnShowLabels_CheckStateChanged(object sender, EventArgs e) { - _collection.ShowLabels = btnShowLabels.Checked; + _collection.ShowLabels = _btnShowLabels.Checked; chart1.Series[0]["PieLabelStyle"] = _collection.ShowLabels ? "Inside" : "Disabled"; SaveCollectionChanges(); diff --git a/Rdmp.UI/SimpleDialogs/Datasets/CreateNewDatasetUI.cs b/Rdmp.UI/SimpleDialogs/Datasets/CreateNewDatasetUI.cs index 26f75c30da..7972539175 100644 --- a/Rdmp.UI/SimpleDialogs/Datasets/CreateNewDatasetUI.cs +++ b/Rdmp.UI/SimpleDialogs/Datasets/CreateNewDatasetUI.cs @@ -8,17 +8,11 @@ namespace Rdmp.UI.SimpleDialogs.Datasets; public partial class CreateNewDatasetUI : RDMPForm { - private IActivateItems _activator; + private readonly IActivateItems _activator; public CreateNewDatasetUI(IActivateItems activator, ExecuteCommandCreateNewDatasetUI command) : base(activator) { _activator = activator; InitializeComponent(); - - } - - private void CreateNewDatasetUI_Load(object sender, EventArgs e) - { - } private void btnCancel_Click(object sender, EventArgs e) @@ -28,7 +22,6 @@ private void btnCancel_Click(object sender, EventArgs e) private void btnCreate_Click(object sender, EventArgs e) { - var cmd = new ExecuteCommandCreateDataset(_activator,tbName.Text,tbDOI.Text,tbSource.Text); cmd.Execute(); Close(); diff --git a/Rdmp.UI/SubComponents/DatsetConfigurationUI.Designer.cs b/Rdmp.UI/SubComponents/DatasetConfigurationUI.Designer.cs similarity index 99% rename from Rdmp.UI/SubComponents/DatsetConfigurationUI.Designer.cs rename to Rdmp.UI/SubComponents/DatasetConfigurationUI.Designer.cs index 08cfe2f4b6..df11a5de7d 100644 --- a/Rdmp.UI/SubComponents/DatsetConfigurationUI.Designer.cs +++ b/Rdmp.UI/SubComponents/DatasetConfigurationUI.Designer.cs @@ -1,6 +1,6 @@ namespace Rdmp.UI.SubComponents; -partial class DatsetConfigurationUI +partial class DatasetConfigurationUI { /// /// Required designer variable. diff --git a/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs b/Rdmp.UI/SubComponents/DatasetConfigurationUI.cs similarity index 62% rename from Rdmp.UI/SubComponents/DatsetConfigurationUI.cs rename to Rdmp.UI/SubComponents/DatasetConfigurationUI.cs index deea978f1b..1e90f872f6 100644 --- a/Rdmp.UI/SubComponents/DatsetConfigurationUI.cs +++ b/Rdmp.UI/SubComponents/DatasetConfigurationUI.cs @@ -9,23 +9,25 @@ using Rdmp.UI.ItemActivation; namespace Rdmp.UI.SubComponents; -public partial class DatsetConfigurationUI : DatsetConfigurationUI_Design, IRefreshBusSubscriber +public partial class DatasetConfigurationUI : DatsetConfigurationUI_Design, IRefreshBusSubscriber { - DatasetConfigurationUICommon Common; + private readonly DatasetConfigurationUICommon _common; - public DatsetConfigurationUI() + public DatasetConfigurationUI() { InitializeComponent(); - Common = new DatasetConfigurationUICommon(); + _common = new DatasetConfigurationUICommon(); } public override void SetDatabaseObject(IActivateItems activator, Dataset databaseObject) { base.SetDatabaseObject(activator, databaseObject); - Common.Dataset = databaseObject; + _common.Dataset = databaseObject; - var catalogues = databaseObject.CatalogueRepository.GetAllObjectsWhere("Dataset_ID", databaseObject.ID).SelectMany(ci => ci.CatalogueItems).ToList().Select(ci => ci.CatalogueName).Distinct(); - if(catalogues.Count() < 1) + var catalogues = databaseObject.CatalogueRepository + .GetAllObjectsWhere("Dataset_ID", databaseObject.ID).SelectMany(static ci => ci.CatalogueItems) + .Select(static ci => ci.CatalogueName).Distinct().ToList(); + if(catalogues.Count < 1) { lblDatasetUsage.Text = "This dataset is not linked to data yet."; } @@ -35,10 +37,10 @@ public override void SetDatabaseObject(IActivateItems activator, Dataset databas lblDatasetUsage.Text = $"This dataset is used in the following catalogues:{Environment.NewLine}{catalogueString}"; } - Bind(tbName, "Text", "Name", c => c.Name); - Bind(tbDOI, "Text", "DigitalObjectIdentifier", c => c.DigitalObjectIdentifier); - Bind(tbSource, "Text", "Source", c => c.Source); - Bind(tbFolder, "Text", "Folder", c => c.Folder); + Bind(tbName, "Text", "Name", static c => c.Name); + Bind(tbDOI, "Text", "DigitalObjectIdentifier", static c => c.DigitalObjectIdentifier); + Bind(tbSource, "Text", "Source", static c => c.Source); + Bind(tbFolder, "Text", "Folder", static c => c.Folder); var s = GetObjectSaverButton(); s.SetupFor(this, databaseObject, activator); GetObjectSaverButton()?.Enable(false); diff --git a/Rdmp.UI/SubComponents/DatsetConfigurationUI.resx b/Rdmp.UI/SubComponents/DatasetConfigurationUI.resx similarity index 100% rename from Rdmp.UI/SubComponents/DatsetConfigurationUI.resx rename to Rdmp.UI/SubComponents/DatasetConfigurationUI.resx