From 43436fc49e4aff72a2af9da0f002b85df3ce5270 Mon Sep 17 00:00:00 2001 From: d11n Date: Mon, 17 Apr 2023 04:38:03 +0200 Subject: [PATCH] Remove BTCPayServer.Plugins.Test (#4875) Remove the plugin, which is superseded with the plugin template and move the PluginPacker to the root of th solution (which matches its location in the file system). --- .run/Pack Test Extension.run.xml | 21 -------- BTCPayServer/Properties/launchSettings.json | 6 +-- .../BTCPayServer.Plugins.Test.csproj | 21 -------- .../Controllers/UITestExtensionController.cs | 35 ------------- .../Data/TestPluginData.cs | 14 ------ .../Data/TestPluginDbContext.cs | 46 ------------------ .../Migrations/20201117154419_Init.cs | 37 -------------- .../TestPluginDbContextModelSnapshot.cs | 36 -------------- .../Resources/img/screengrab.png | Bin 34971 -> 0 bytes .../Services/ApplicationPartsLogger.cs | 44 ----------------- .../Services/TestPluginDbContextFactory.cs | 37 -------------- .../Services/TestPluginService.cs | 34 ------------- .../TestExtension.cs | 29 ----------- .../TestPluginMigrationRunner.cs | 44 ----------------- .../Shared/TestExtensionNavExtension.cshtml | 2 - .../Views/UITestExtension/Index.cshtml | 21 -------- .../Views/_ViewImports.cshtml | 1 - btcpayserver.sln | 30 ------------ 18 files changed, 3 insertions(+), 455 deletions(-) delete mode 100644 .run/Pack Test Extension.run.xml delete mode 100644 Plugins/BTCPayServer.Plugins.Test/BTCPayServer.Plugins.Test.csproj delete mode 100644 Plugins/BTCPayServer.Plugins.Test/Controllers/UITestExtensionController.cs delete mode 100644 Plugins/BTCPayServer.Plugins.Test/Data/TestPluginData.cs delete mode 100644 Plugins/BTCPayServer.Plugins.Test/Data/TestPluginDbContext.cs delete mode 100644 Plugins/BTCPayServer.Plugins.Test/Migrations/20201117154419_Init.cs delete mode 100644 Plugins/BTCPayServer.Plugins.Test/Migrations/TestPluginDbContextModelSnapshot.cs delete mode 100644 Plugins/BTCPayServer.Plugins.Test/Resources/img/screengrab.png delete mode 100644 Plugins/BTCPayServer.Plugins.Test/Services/ApplicationPartsLogger.cs delete mode 100644 Plugins/BTCPayServer.Plugins.Test/Services/TestPluginDbContextFactory.cs delete mode 100644 Plugins/BTCPayServer.Plugins.Test/Services/TestPluginService.cs delete mode 100644 Plugins/BTCPayServer.Plugins.Test/TestExtension.cs delete mode 100644 Plugins/BTCPayServer.Plugins.Test/TestPluginMigrationRunner.cs delete mode 100644 Plugins/BTCPayServer.Plugins.Test/Views/Shared/TestExtensionNavExtension.cshtml delete mode 100644 Plugins/BTCPayServer.Plugins.Test/Views/UITestExtension/Index.cshtml delete mode 100644 Plugins/BTCPayServer.Plugins.Test/Views/_ViewImports.cshtml diff --git a/.run/Pack Test Extension.run.xml b/.run/Pack Test Extension.run.xml deleted file mode 100644 index ca96376de..000000000 --- a/.run/Pack Test Extension.run.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - diff --git a/BTCPayServer/Properties/launchSettings.json b/BTCPayServer/Properties/launchSettings.json index deabba81b..477b0b177 100644 --- a/BTCPayServer/Properties/launchSettings.json +++ b/BTCPayServer/Properties/launchSettings.json @@ -27,7 +27,7 @@ "BTCPAY_SOCKSENDPOINT": "localhost:9050", "BTCPAY_UPDATEURL": "", "BTCPAY_DOCKERDEPLOYMENT": "true", - "BTCPAY_RECOMMENDED-PLUGINS": "BTCPayServer.Plugins.Test", + "BTCPAY_RECOMMENDED-PLUGINS": "", "BTCPAY_CHEATMODE": "true", "BTCPAY_EXPLORERPOSTGRES": "User ID=postgres;Include Error Detail=true;Host=127.0.0.1;Port=39372;Database=nbxplorer" }, @@ -64,7 +64,7 @@ "BTCPAY_TORRCFILE": "../BTCPayServer.Tests/TestData/Tor/torrc", "BTCPAY_SOCKSENDPOINT": "localhost:9050", "BTCPAY_DOCKERDEPLOYMENT": "true", - "BTCPAY_RECOMMENDED-PLUGINS": "BTCPayServer.Plugins.Test", + "BTCPAY_RECOMMENDED-PLUGINS": "", "BTCPAY_CHEATMODE": "true", "BTCPAY_EXPLORERPOSTGRES": "User ID=postgres;Include Error Detail=true;Host=127.0.0.1;Port=39372;Database=nbxplorer" }, @@ -103,7 +103,7 @@ "BTCPAY_TORRCFILE": "../BTCPayServer.Tests/TestData/Tor/torrc", "BTCPAY_SOCKSENDPOINT": "localhost:9050", "BTCPAY_DOCKERDEPLOYMENT": "true", - "BTCPAY_RECOMMENDED-PLUGINS": "BTCPayServer.Plugins.Test", + "BTCPAY_RECOMMENDED-PLUGINS": "", "BTCPAY_CHEATMODE": "true", "BTCPAY_EXPLORERPOSTGRES": "User ID=postgres;Include Error Detail=true;Host=127.0.0.1;Port=39372;Database=nbxplorer" }, diff --git a/Plugins/BTCPayServer.Plugins.Test/BTCPayServer.Plugins.Test.csproj b/Plugins/BTCPayServer.Plugins.Test/BTCPayServer.Plugins.Test.csproj deleted file mode 100644 index d0cfd8291..000000000 --- a/Plugins/BTCPayServer.Plugins.Test/BTCPayServer.Plugins.Test.csproj +++ /dev/null @@ -1,21 +0,0 @@ - - - net6.0 - true - false - true - 1.0.0 - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - diff --git a/Plugins/BTCPayServer.Plugins.Test/Controllers/UITestExtensionController.cs b/Plugins/BTCPayServer.Plugins.Test/Controllers/UITestExtensionController.cs deleted file mode 100644 index 4c3fcb349..000000000 --- a/Plugins/BTCPayServer.Plugins.Test/Controllers/UITestExtensionController.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Collections.Generic; -using System.Threading.Tasks; -using BTCPayServer.Plugins.Test.Data; -using BTCPayServer.Plugins.Test.Services; -using Microsoft.AspNetCore.Mvc; - -namespace BTCPayServer.Plugins.Test -{ - [Route("extensions/test")] - public class UITestExtensionController : Controller - { - private readonly TestPluginService _testPluginService; - - public UITestExtensionController(TestPluginService testPluginService) - { - _testPluginService = testPluginService; - } - - // GET - public async Task Index() - { - return View(new TestPluginPageViewModel() - { - Data = await _testPluginService.Get() - }); - } - - - } - - public class TestPluginPageViewModel - { - public List Data { get; set; } - } -} diff --git a/Plugins/BTCPayServer.Plugins.Test/Data/TestPluginData.cs b/Plugins/BTCPayServer.Plugins.Test/Data/TestPluginData.cs deleted file mode 100644 index 776ec80c9..000000000 --- a/Plugins/BTCPayServer.Plugins.Test/Data/TestPluginData.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.ComponentModel.DataAnnotations.Schema; - -namespace BTCPayServer.Plugins.Test.Data -{ - public class TestPluginData - { - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public string Id { get; set; } - public DateTimeOffset Timestamp { get; set; } - - - } -} diff --git a/Plugins/BTCPayServer.Plugins.Test/Data/TestPluginDbContext.cs b/Plugins/BTCPayServer.Plugins.Test/Data/TestPluginDbContext.cs deleted file mode 100644 index 022bbb58e..000000000 --- a/Plugins/BTCPayServer.Plugins.Test/Data/TestPluginDbContext.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using System.Linq; -using BTCPayServer.Plugins.Test.Data; -using Microsoft.EntityFrameworkCore; - -namespace BTCPayServer.Plugins.Test -{ - public class TestPluginDbContext : DbContext - { - private readonly bool _designTime; - - public DbSet TestPluginRecords { get; set; } - - public TestPluginDbContext(DbContextOptions options, bool designTime = false) - : base(options) - { - _designTime = designTime; - } - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - base.OnModelCreating(modelBuilder); - modelBuilder.HasDefaultSchema("BTCPayServer.Plugins.Test"); - if (Database.IsSqlite() && !_designTime) - { - // SQLite does not have proper support for DateTimeOffset via Entity Framework Core, see the limitations - // here: https://docs.microsoft.com/en-us/ef/core/providers/sqlite/limitations#query-limitations - // To work around this, when the Sqlite database provider is used, all model properties of type DateTimeOffset - // use the DateTimeOffsetToBinaryConverter - // Based on: https://github.com/aspnet/EntityFrameworkCore/issues/10784#issuecomment-415769754 - // This only supports millisecond precision, but should be sufficient for most use cases. - foreach (var entityType in modelBuilder.Model.GetEntityTypes()) - { - var properties = entityType.ClrType.GetProperties().Where(p => p.PropertyType == typeof(DateTimeOffset)); - foreach (var property in properties) - { - modelBuilder - .Entity(entityType.Name) - .Property(property.Name) - .HasConversion(new Microsoft.EntityFrameworkCore.Storage.ValueConversion.DateTimeOffsetToBinaryConverter()); - } - } - } - } - } -} diff --git a/Plugins/BTCPayServer.Plugins.Test/Migrations/20201117154419_Init.cs b/Plugins/BTCPayServer.Plugins.Test/Migrations/20201117154419_Init.cs deleted file mode 100644 index 0af1b4cb8..000000000 --- a/Plugins/BTCPayServer.Plugins.Test/Migrations/20201117154419_Init.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; - -namespace BTCPayServer.Plugins.Test.Migrations -{ - [DbContext(typeof(TestPluginDbContext))] - [Migration("20201117154419_Init")] - public partial class Init : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.EnsureSchema( - name: "BTCPayServer.Plugins.Test"); - - migrationBuilder.CreateTable( - name: "TestPluginRecords", - schema: "BTCPayServer.Plugins.Test", - columns: table => new - { - Id = table.Column(nullable: false), - Timestamp = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_TestPluginRecords", x => x.Id); - }); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "TestPluginRecords", - schema: "BTCPayServer.Plugins.Test"); - } - } -} diff --git a/Plugins/BTCPayServer.Plugins.Test/Migrations/TestPluginDbContextModelSnapshot.cs b/Plugins/BTCPayServer.Plugins.Test/Migrations/TestPluginDbContextModelSnapshot.cs deleted file mode 100644 index d96cd7d03..000000000 --- a/Plugins/BTCPayServer.Plugins.Test/Migrations/TestPluginDbContextModelSnapshot.cs +++ /dev/null @@ -1,36 +0,0 @@ -// -using System; -using BTCPayServer.Plugins.Test; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -namespace BTCPayServer.Plugins.Test.Migrations -{ - [DbContext(typeof(TestPluginDbContext))] - partial class TestPluginDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasDefaultSchema("BTCPayServer.Plugins.Test") - .HasAnnotation("ProductVersion", "3.1.10"); - - modelBuilder.Entity("BTCPayServer.Plugins.Test.Data.TestPluginData", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("Timestamp") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.ToTable("TestPluginRecords"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/Plugins/BTCPayServer.Plugins.Test/Resources/img/screengrab.png b/Plugins/BTCPayServer.Plugins.Test/Resources/img/screengrab.png deleted file mode 100644 index bb571a4351d0345bae6e83b88a8cd6bc51b79314..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34971 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 S=#7Cu$UacGpDp#`&Hn-G*bBD+ diff --git a/Plugins/BTCPayServer.Plugins.Test/Services/ApplicationPartsLogger.cs b/Plugins/BTCPayServer.Plugins.Test/Services/ApplicationPartsLogger.cs deleted file mode 100644 index d7bbd57bc..000000000 --- a/Plugins/BTCPayServer.Plugins.Test/Services/ApplicationPartsLogger.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc.ApplicationParts; -using Microsoft.AspNetCore.Mvc.Controllers; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; - -namespace BTCPayServer.Plugins.Test -{ - public class ApplicationPartsLogger : IHostedService - { - private readonly ILogger _logger; - private readonly ApplicationPartManager _partManager; - - public ApplicationPartsLogger(ILogger logger, ApplicationPartManager partManager) - { - _logger = logger; - _partManager = partManager; - } - - public Task StartAsync(CancellationToken cancellationToken) - { - // Get the names of all the application parts. This is the short assembly name for AssemblyParts - var applicationParts = _partManager.ApplicationParts.Select(x => x.Name); - - // Create a controller feature, and populate it from the application parts - var controllerFeature = new ControllerFeature(); - _partManager.PopulateFeature(controllerFeature); - - // Get the names of all of the controllers - var controllers = controllerFeature.Controllers.Select(x => x.Name); - - // Log the application parts and controllers - _logger.LogInformation("Found the following application parts: '{ApplicationParts}' with the following controllers: '{Controllers}'", - string.Join(", ", applicationParts), string.Join(", ", controllers)); - - return Task.CompletedTask; - } - - // Required by the interface - public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask; - } -} diff --git a/Plugins/BTCPayServer.Plugins.Test/Services/TestPluginDbContextFactory.cs b/Plugins/BTCPayServer.Plugins.Test/Services/TestPluginDbContextFactory.cs deleted file mode 100644 index 204f54477..000000000 --- a/Plugins/BTCPayServer.Plugins.Test/Services/TestPluginDbContextFactory.cs +++ /dev/null @@ -1,37 +0,0 @@ -using BTCPayServer.Abstractions.Contracts; -using BTCPayServer.Abstractions.Models; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Design; -using Microsoft.Extensions.Options; - -namespace BTCPayServer.Plugins.Test -{ - - public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory - { - public TestPluginDbContext CreateDbContext(string[] args) - { - - var builder = new DbContextOptionsBuilder(); - - builder.UseSqlite("Data Source=temp.db"); - - return new TestPluginDbContext(builder.Options, true); - } - } - - public class TestPluginDbContextFactory : BaseDbContextFactory - { - public TestPluginDbContextFactory(IOptions options) : base(options, "BTCPayServer.Plugins.Test") - { - } - - public override TestPluginDbContext CreateContext() - { - var builder = new DbContextOptionsBuilder(); - ConfigureBuilder(builder); - return new TestPluginDbContext(builder.Options); - - } - } -} diff --git a/Plugins/BTCPayServer.Plugins.Test/Services/TestPluginService.cs b/Plugins/BTCPayServer.Plugins.Test/Services/TestPluginService.cs deleted file mode 100644 index 84aecd83b..000000000 --- a/Plugins/BTCPayServer.Plugins.Test/Services/TestPluginService.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using BTCPayServer.Plugins.Test.Data; -using Microsoft.EntityFrameworkCore; - -namespace BTCPayServer.Plugins.Test.Services -{ - public class TestPluginService - { - private readonly TestPluginDbContextFactory _testPluginDbContextFactory; - - public TestPluginService(TestPluginDbContextFactory testPluginDbContextFactory) - { - _testPluginDbContextFactory = testPluginDbContextFactory; - } - - public async Task AddTestDataRecord() - { - await using var context = _testPluginDbContextFactory.CreateContext(); - - await context.TestPluginRecords.AddAsync(new TestPluginData() { Timestamp = DateTimeOffset.UtcNow }); - await context.SaveChangesAsync(); - } - - - public async Task> Get() - { - await using var context = _testPluginDbContextFactory.CreateContext(); - - return await context.TestPluginRecords.ToListAsync(); - } - } -} diff --git a/Plugins/BTCPayServer.Plugins.Test/TestExtension.cs b/Plugins/BTCPayServer.Plugins.Test/TestExtension.cs deleted file mode 100644 index 1ee28a06d..000000000 --- a/Plugins/BTCPayServer.Plugins.Test/TestExtension.cs +++ /dev/null @@ -1,29 +0,0 @@ -using BTCPayServer.Abstractions.Contracts; -using BTCPayServer.Abstractions.Models; -using BTCPayServer.Abstractions.Services; -using BTCPayServer.Plugins.Test.Services; -using Microsoft.Extensions.DependencyInjection; - -namespace BTCPayServer.Plugins.Test -{ - public class TestPlugin : BaseBTCPayServerPlugin - { - public override string Identifier { get; } = "BTCPayServer.Plugins.Test"; - public override string Name { get; } = "Test Plugin!"; - public override string Description { get; } = "This is a description of the loaded test extension!"; - - public override void Execute(IServiceCollection services) - { - services.AddSingleton(new UIExtension("TestExtensionNavExtension", "header-nav")); - services.AddHostedService(); - services.AddHostedService(); - services.AddSingleton(); - services.AddSingleton(); - services.AddDbContext((provider, o) => - { - var factory = provider.GetRequiredService(); - factory.ConfigureBuilder(o); - }); - } - } -} diff --git a/Plugins/BTCPayServer.Plugins.Test/TestPluginMigrationRunner.cs b/Plugins/BTCPayServer.Plugins.Test/TestPluginMigrationRunner.cs deleted file mode 100644 index 07f0caaa6..000000000 --- a/Plugins/BTCPayServer.Plugins.Test/TestPluginMigrationRunner.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System.Threading; -using System.Threading.Tasks; -using BTCPayServer.Abstractions.Contracts; -using BTCPayServer.Plugins.Test.Services; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Hosting; - -namespace BTCPayServer.Plugins.Test; - -public class TestPluginMigrationRunner : IHostedService -{ - public class TestPluginDataMigrationHistory - { - public bool UpdatedSomething { get; set; } - } - private readonly TestPluginDbContextFactory _testPluginDbContextFactory; - private readonly ISettingsRepository _settingsRepository; - private readonly TestPluginService _testPluginService; - - public TestPluginMigrationRunner(TestPluginDbContextFactory testPluginDbContextFactory, ISettingsRepository settingsRepository, TestPluginService testPluginService) - { - _testPluginDbContextFactory = testPluginDbContextFactory; - _settingsRepository = settingsRepository; - _testPluginService = testPluginService; - } - public async Task StartAsync(CancellationToken cancellationToken) - { - var settings = await _settingsRepository.GetSettingAsync() ?? - new TestPluginDataMigrationHistory(); - await using var ctx = _testPluginDbContextFactory.CreateContext(); - await ctx.Database.MigrateAsync(cancellationToken: cancellationToken); - if (!settings.UpdatedSomething) - { - await _testPluginService.AddTestDataRecord(); - settings.UpdatedSomething = true; - await _settingsRepository.UpdateSetting(settings); - } - } - - public Task StopAsync(CancellationToken cancellationToken) - { - return Task.CompletedTask; - } -} diff --git a/Plugins/BTCPayServer.Plugins.Test/Views/Shared/TestExtensionNavExtension.cshtml b/Plugins/BTCPayServer.Plugins.Test/Views/Shared/TestExtensionNavExtension.cshtml deleted file mode 100644 index 28fc7a06c..000000000 --- a/Plugins/BTCPayServer.Plugins.Test/Views/Shared/TestExtensionNavExtension.cshtml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/Plugins/BTCPayServer.Plugins.Test/Views/UITestExtension/Index.cshtml b/Plugins/BTCPayServer.Plugins.Test/Views/UITestExtension/Index.cshtml deleted file mode 100644 index 24a7581ad..000000000 --- a/Plugins/BTCPayServer.Plugins.Test/Views/UITestExtension/Index.cshtml +++ /dev/null @@ -1,21 +0,0 @@ -@model BTCPayServer.Plugins.Test.TestPluginPageViewModel - -
-

Challenge Completed!!

- Here is also an image loaded from the plugin
- - - - -
-

Persisted Data

-

The following is data persisted to the configured database but in an isolated DbContext. Every time you start BTCPay Server with this plugin enabled, a timestamp is logged.

-
    - @foreach (var item in Model.Data) - { -
  • @item.Id at @item.Timestamp.ToString("F")
  • - } -
-
-
- diff --git a/Plugins/BTCPayServer.Plugins.Test/Views/_ViewImports.cshtml b/Plugins/BTCPayServer.Plugins.Test/Views/_ViewImports.cshtml deleted file mode 100644 index afa82bbf2..000000000 --- a/Plugins/BTCPayServer.Plugins.Test/Views/_ViewImports.cshtml +++ /dev/null @@ -1 +0,0 @@ -@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers diff --git a/btcpayserver.sln b/btcpayserver.sln index c76f4d441..3ade6449e 100644 --- a/btcpayserver.sln +++ b/btcpayserver.sln @@ -31,10 +31,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BTCPayServer.Client", "BTCP EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BTCPayServer.Abstractions", "BTCPayServer.Abstractions\BTCPayServer.Abstractions.csproj", "{A0D50BB6-FE2C-4671-8693-F7582B66178F}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BTCPayServer.Plugins.Test", "Plugins\BTCPayServer.Plugins.Test\BTCPayServer.Plugins.Test.csproj", "{545AFC8E-7BC2-43D9-84CA-F9468F4FF295}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Plugins", "Plugins", "{1FC7F660-ADF1-4D55-B61A-85C6AB083C33}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BTCPayServer.PluginPacker", "BTCPayServer.PluginPacker\BTCPayServer.PluginPacker.csproj", "{7DC94B25-1CFC-4170-AA41-7BA983E4C0B8}" EndProject Global @@ -221,30 +217,6 @@ Global {A0D50BB6-FE2C-4671-8693-F7582B66178F}.Release|x64.Build.0 = Release|Any CPU {A0D50BB6-FE2C-4671-8693-F7582B66178F}.Release|x86.ActiveCfg = Release|Any CPU {A0D50BB6-FE2C-4671-8693-F7582B66178F}.Release|x86.Build.0 = Release|Any CPU - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295}.Altcoins-Debug|Any CPU.ActiveCfg = Debug|Any CPU - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295}.Altcoins-Debug|Any CPU.Build.0 = Debug|Any CPU - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295}.Altcoins-Debug|x64.ActiveCfg = Debug|Any CPU - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295}.Altcoins-Debug|x64.Build.0 = Debug|Any CPU - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295}.Altcoins-Debug|x86.ActiveCfg = Debug|Any CPU - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295}.Altcoins-Debug|x86.Build.0 = Debug|Any CPU - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295}.Altcoins-Release|Any CPU.ActiveCfg = Debug|Any CPU - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295}.Altcoins-Release|Any CPU.Build.0 = Debug|Any CPU - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295}.Altcoins-Release|x64.ActiveCfg = Debug|Any CPU - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295}.Altcoins-Release|x64.Build.0 = Debug|Any CPU - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295}.Altcoins-Release|x86.ActiveCfg = Debug|Any CPU - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295}.Altcoins-Release|x86.Build.0 = Debug|Any CPU - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295}.Debug|Any CPU.Build.0 = Debug|Any CPU - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295}.Debug|x64.ActiveCfg = Debug|Any CPU - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295}.Debug|x64.Build.0 = Debug|Any CPU - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295}.Debug|x86.ActiveCfg = Debug|Any CPU - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295}.Debug|x86.Build.0 = Debug|Any CPU - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295}.Release|Any CPU.ActiveCfg = Release|Any CPU - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295}.Release|Any CPU.Build.0 = Release|Any CPU - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295}.Release|x64.ActiveCfg = Release|Any CPU - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295}.Release|x64.Build.0 = Release|Any CPU - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295}.Release|x86.ActiveCfg = Release|Any CPU - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295}.Release|x86.Build.0 = Release|Any CPU {7DC94B25-1CFC-4170-AA41-7BA983E4C0B8}.Altcoins-Debug|Any CPU.ActiveCfg = Debug|Any CPU {7DC94B25-1CFC-4170-AA41-7BA983E4C0B8}.Altcoins-Debug|Any CPU.Build.0 = Debug|Any CPU {7DC94B25-1CFC-4170-AA41-7BA983E4C0B8}.Altcoins-Debug|x64.ActiveCfg = Debug|Any CPU @@ -274,8 +246,6 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {545AFC8E-7BC2-43D9-84CA-F9468F4FF295} = {1FC7F660-ADF1-4D55-B61A-85C6AB083C33} - {7DC94B25-1CFC-4170-AA41-7BA983E4C0B8} = {1FC7F660-ADF1-4D55-B61A-85C6AB083C33} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {203A3162-BE45-4721-937D-6804E0E1AFF8}