From 2c5b82d9a22984bdd884dddc13c719b6b99a7d85 Mon Sep 17 00:00:00 2001 From: ArdenHide Date: Wed, 19 Nov 2025 16:45:22 +0300 Subject: [PATCH 1/5] init --- README.md | 2 +- .../FailureOnlyLoggingHandler.cs | 22 ++++++++++++++++ .../HttpClientFactory.cs | 17 +++++++++++++ .../IHttpClientFactory.cs | 8 ++++++ .../Poolz.Finance.CSharp.Http.csproj | 9 +++++++ .../Poolz.Finance.CSharp.Http.sln | 25 +++++++++++++++++++ 6 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 src/Poolz.Finance.CSharp.Http/FailureOnlyLoggingHandler.cs create mode 100644 src/Poolz.Finance.CSharp.Http/HttpClientFactory.cs create mode 100644 src/Poolz.Finance.CSharp.Http/IHttpClientFactory.cs create mode 100644 src/Poolz.Finance.CSharp.Http/Poolz.Finance.CSharp.Http.csproj create mode 100644 src/Poolz.Finance.CSharp.Http/Poolz.Finance.CSharp.Http.sln diff --git a/README.md b/README.md index 2ba2321..936acd7 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# Poolz.Finance.CSharp.LibTemplate +# Poolz.Finance.CSharp.Http diff --git a/src/Poolz.Finance.CSharp.Http/FailureOnlyLoggingHandler.cs b/src/Poolz.Finance.CSharp.Http/FailureOnlyLoggingHandler.cs new file mode 100644 index 0000000..65c8f17 --- /dev/null +++ b/src/Poolz.Finance.CSharp.Http/FailureOnlyLoggingHandler.cs @@ -0,0 +1,22 @@ +namespace Poolz.Finance.CSharp.Http; + +public class FailureOnlyLoggingHandler(HttpMessageHandler innerHandler) : DelegatingHandler(innerHandler) +{ + protected override async Task SendAsync(HttpRequestMessage req, CancellationToken ct) + { + try + { + var response = await base.SendAsync(req, ct); + response.EnsureSuccessStatusCode(); + return response; + } + catch (HttpRequestException exception) + { + throw new HttpRequestException( + $"HTTP request failed. METHOD: {req.Method}. URL: {req.RequestUri}", + exception, + exception.StatusCode + ); + } + } +} \ No newline at end of file diff --git a/src/Poolz.Finance.CSharp.Http/HttpClientFactory.cs b/src/Poolz.Finance.CSharp.Http/HttpClientFactory.cs new file mode 100644 index 0000000..a62840b --- /dev/null +++ b/src/Poolz.Finance.CSharp.Http/HttpClientFactory.cs @@ -0,0 +1,17 @@ +using System.Net.Http.Headers; + +namespace Poolz.Finance.CSharp.Http; + +public class HttpClientFactory : IHttpClientFactory +{ + public HttpClient Create(string url, Action? configureHeaders = null) + { + var client = new HttpClient(new FailureOnlyLoggingHandler(new HttpClientHandler())) + { + BaseAddress = new Uri(url) + }; + + configureHeaders?.Invoke(client.DefaultRequestHeaders); + return client; + } +} \ No newline at end of file diff --git a/src/Poolz.Finance.CSharp.Http/IHttpClientFactory.cs b/src/Poolz.Finance.CSharp.Http/IHttpClientFactory.cs new file mode 100644 index 0000000..bb4ded9 --- /dev/null +++ b/src/Poolz.Finance.CSharp.Http/IHttpClientFactory.cs @@ -0,0 +1,8 @@ +using System.Net.Http.Headers; + +namespace Poolz.Finance.CSharp.Http; + +public interface IHttpClientFactory +{ + public HttpClient Create(string url, Action? configure = null); +} \ No newline at end of file diff --git a/src/Poolz.Finance.CSharp.Http/Poolz.Finance.CSharp.Http.csproj b/src/Poolz.Finance.CSharp.Http/Poolz.Finance.CSharp.Http.csproj new file mode 100644 index 0000000..20ebbe3 --- /dev/null +++ b/src/Poolz.Finance.CSharp.Http/Poolz.Finance.CSharp.Http.csproj @@ -0,0 +1,9 @@ + + + + net8.0 + enable + enable + + + diff --git a/src/Poolz.Finance.CSharp.Http/Poolz.Finance.CSharp.Http.sln b/src/Poolz.Finance.CSharp.Http/Poolz.Finance.CSharp.Http.sln new file mode 100644 index 0000000..2ce5b2e --- /dev/null +++ b/src/Poolz.Finance.CSharp.Http/Poolz.Finance.CSharp.Http.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.13.35828.75 d17.13 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Poolz.Finance.CSharp.Http", "Poolz.Finance.CSharp.Http.csproj", "{257A6C6B-915B-4D98-A250-6F2F12E89D98}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {257A6C6B-915B-4D98-A250-6F2F12E89D98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {257A6C6B-915B-4D98-A250-6F2F12E89D98}.Debug|Any CPU.Build.0 = Debug|Any CPU + {257A6C6B-915B-4D98-A250-6F2F12E89D98}.Release|Any CPU.ActiveCfg = Release|Any CPU + {257A6C6B-915B-4D98-A250-6F2F12E89D98}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {AF2F8BF3-0CF6-467C-944A-792A7D687E3C} + EndGlobalSection +EndGlobal From 2364542b783e32c20f760242c29beff1d3298b8b Mon Sep 17 00:00:00 2001 From: ArdenHide Date: Wed, 19 Nov 2025 16:56:46 +0300 Subject: [PATCH 2/5] - update README --- README.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/README.md b/README.md index 936acd7..f65029c 100644 --- a/README.md +++ b/README.md @@ -1 +1,25 @@ # Poolz.Finance.CSharp.Http + +Poolz.Finance.CSharp.Http is a lightweight .NET 8 library that centralizes the creation of `HttpClient` instances for Poolz Finance services. +It wraps the default `HttpClientHandler` with a custom `FailureOnlyLoggingHandler` that surfaces detailed information when requests fail while keeping successful responses silent. + +## Getting started + +```csharp +using Poolz.Finance.CSharp.Http; + +var factory = new HttpClientFactory(); +var client = factory.Create( + url: "https://api.poolz.finance", + configureHeaders: headers => + { + headers.Add("Authorization", "Bearer "); + headers.Add("User-Agent", "Poolz-SDK-Demo/1.0"); + }); + +var response = await client.GetAsync("/v1/pools"); +var content = await response.Content.ReadAsStringAsync(); +``` + +If the request fails, `FailureOnlyLoggingHandler` rethrows an exception that includes the HTTP method and URL so that you immediately know which call needs attention. + From 11e2b6f03f0c361f99ee8e02ec657b7d63da2e49 Mon Sep 17 00:00:00 2001 From: ArdenHide Date: Wed, 19 Nov 2025 17:03:59 +0300 Subject: [PATCH 3/5] - add tests --- .../Poolz.Finance.CSharp.Http.sln | 14 ++++++ .../FailureOnlyLoggingHandlerTests.cs | 46 +++++++++++++++++++ .../HttpClientFactoryTests.cs | 22 +++++++++ .../Poolz.Finance.CSharp.Http.Tests.csproj | 31 +++++++++++++ 4 files changed, 113 insertions(+) create mode 100644 tests/Poolz.Finance.CSharp.Http.Tests/FailureOnlyLoggingHandlerTests.cs create mode 100644 tests/Poolz.Finance.CSharp.Http.Tests/HttpClientFactoryTests.cs create mode 100644 tests/Poolz.Finance.CSharp.Http.Tests/Poolz.Finance.CSharp.Http.Tests.csproj diff --git a/src/Poolz.Finance.CSharp.Http/Poolz.Finance.CSharp.Http.sln b/src/Poolz.Finance.CSharp.Http/Poolz.Finance.CSharp.Http.sln index 2ce5b2e..90ba66c 100644 --- a/src/Poolz.Finance.CSharp.Http/Poolz.Finance.CSharp.Http.sln +++ b/src/Poolz.Finance.CSharp.Http/Poolz.Finance.CSharp.Http.sln @@ -5,6 +5,12 @@ VisualStudioVersion = 17.13.35828.75 d17.13 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Poolz.Finance.CSharp.Http", "Poolz.Finance.CSharp.Http.csproj", "{257A6C6B-915B-4D98-A250-6F2F12E89D98}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{C43445A2-69BB-48F5-8D8B-45F82D29028D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Poolz.Finance.CSharp.Http.Tests", "..\..\tests\Poolz.Finance.CSharp.Http.Tests\Poolz.Finance.CSharp.Http.Tests.csproj", "{91F0D4AA-D794-4EF2-98B4-3A9274295BD0}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -15,10 +21,18 @@ Global {257A6C6B-915B-4D98-A250-6F2F12E89D98}.Debug|Any CPU.Build.0 = Debug|Any CPU {257A6C6B-915B-4D98-A250-6F2F12E89D98}.Release|Any CPU.ActiveCfg = Release|Any CPU {257A6C6B-915B-4D98-A250-6F2F12E89D98}.Release|Any CPU.Build.0 = Release|Any CPU + {91F0D4AA-D794-4EF2-98B4-3A9274295BD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {91F0D4AA-D794-4EF2-98B4-3A9274295BD0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {91F0D4AA-D794-4EF2-98B4-3A9274295BD0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {91F0D4AA-D794-4EF2-98B4-3A9274295BD0}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {257A6C6B-915B-4D98-A250-6F2F12E89D98} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {91F0D4AA-D794-4EF2-98B4-3A9274295BD0} = {C43445A2-69BB-48F5-8D8B-45F82D29028D} + EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {AF2F8BF3-0CF6-467C-944A-792A7D687E3C} EndGlobalSection diff --git a/tests/Poolz.Finance.CSharp.Http.Tests/FailureOnlyLoggingHandlerTests.cs b/tests/Poolz.Finance.CSharp.Http.Tests/FailureOnlyLoggingHandlerTests.cs new file mode 100644 index 0000000..e0b0240 --- /dev/null +++ b/tests/Poolz.Finance.CSharp.Http.Tests/FailureOnlyLoggingHandlerTests.cs @@ -0,0 +1,46 @@ +using Xunit; +using System.Net; + +namespace Poolz.Finance.CSharp.Http.Tests; + +public class FailureOnlyLoggingHandlerTests +{ + [Fact] + public async Task SendAsync_ReturnsResponse_WhenStatusIsSuccessful() + { + using var handler = new FailureOnlyLoggingHandler(new StubHandler((_, _) => + Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)))); + using var invoker = new HttpMessageInvoker(handler); + using var request = new HttpRequestMessage(HttpMethod.Get, "https://poolz.finance/success"); + + var response = await invoker.SendAsync(request, CancellationToken.None); + + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } + + [Fact] + public async Task SendAsync_ThrowsHttpRequestExceptionWithContext_WhenStatusIsFailure() + { + using var handler = new FailureOnlyLoggingHandler(new StubHandler((_, _) => + Task.FromResult(new HttpResponseMessage(HttpStatusCode.BadRequest)))); + using var invoker = new HttpMessageInvoker(handler); + using var request = new HttpRequestMessage(HttpMethod.Post, "https://poolz.finance/failure"); + + var exception = await Assert.ThrowsAsync(() => invoker.SendAsync(request, CancellationToken.None)); + + Assert.Equal(HttpStatusCode.BadRequest, exception.StatusCode); + Assert.NotNull(exception.InnerException); + Assert.Contains("METHOD: POST", exception.Message); + Assert.Contains("URL: https://poolz.finance/failure", exception.Message); + } + + private sealed class StubHandler( + Func> responseFactory) + : HttpMessageHandler + { + protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) + { + return responseFactory(request, cancellationToken); + } + } +} \ No newline at end of file diff --git a/tests/Poolz.Finance.CSharp.Http.Tests/HttpClientFactoryTests.cs b/tests/Poolz.Finance.CSharp.Http.Tests/HttpClientFactoryTests.cs new file mode 100644 index 0000000..bd65906 --- /dev/null +++ b/tests/Poolz.Finance.CSharp.Http.Tests/HttpClientFactoryTests.cs @@ -0,0 +1,22 @@ +using Xunit; + +namespace Poolz.Finance.CSharp.Http.Tests; + +public class HttpClientFactoryTests +{ + [Fact] + public void Create_ConfiguresBaseAddressAndHeaders() + { + var factory = new HttpClientFactory(); + var expectedBaseAddress = new Uri("https://api.poolz.finance/"); + + using var client = factory.Create(expectedBaseAddress.ToString(), headers => + { + headers.Add("X-Test", "42"); + }); + + Assert.Equal(expectedBaseAddress, client.BaseAddress); + Assert.True(client.DefaultRequestHeaders.Contains("X-Test")); + Assert.Equal("42", client.DefaultRequestHeaders.GetValues("X-Test").Single()); + } +} \ No newline at end of file diff --git a/tests/Poolz.Finance.CSharp.Http.Tests/Poolz.Finance.CSharp.Http.Tests.csproj b/tests/Poolz.Finance.CSharp.Http.Tests/Poolz.Finance.CSharp.Http.Tests.csproj new file mode 100644 index 0000000..a349d7f --- /dev/null +++ b/tests/Poolz.Finance.CSharp.Http.Tests/Poolz.Finance.CSharp.Http.Tests.csproj @@ -0,0 +1,31 @@ + + + + net8.0 + enable + enable + Poolz.Finance.CSharp.Http.Tests + Poolz.Finance.CSharp.Http.Tests + false + true + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + From 810c03d8dfc45d9430bf0d513d110a5f196fe184 Mon Sep 17 00:00:00 2001 From: ArdenHide Date: Wed, 19 Nov 2025 17:12:08 +0300 Subject: [PATCH 4/5] - move sln --- ...arp.Http.sln => Poolz.Finance.CSharp.Http.sln | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) rename src/Poolz.Finance.CSharp.Http/Poolz.Finance.CSharp.Http.sln => Poolz.Finance.CSharp.Http.sln (77%) diff --git a/src/Poolz.Finance.CSharp.Http/Poolz.Finance.CSharp.Http.sln b/Poolz.Finance.CSharp.Http.sln similarity index 77% rename from src/Poolz.Finance.CSharp.Http/Poolz.Finance.CSharp.Http.sln rename to Poolz.Finance.CSharp.Http.sln index 90ba66c..19b6f82 100644 --- a/src/Poolz.Finance.CSharp.Http/Poolz.Finance.CSharp.Http.sln +++ b/Poolz.Finance.CSharp.Http.sln @@ -1,37 +1,37 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 -VisualStudioVersion = 17.13.35828.75 d17.13 +VisualStudioVersion = 17.13.35828.75 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Poolz.Finance.CSharp.Http", "Poolz.Finance.CSharp.Http.csproj", "{257A6C6B-915B-4D98-A250-6F2F12E89D98}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{C43445A2-69BB-48F5-8D8B-45F82D29028D}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Poolz.Finance.CSharp.Http.Tests", "..\..\tests\Poolz.Finance.CSharp.Http.Tests\Poolz.Finance.CSharp.Http.Tests.csproj", "{91F0D4AA-D794-4EF2-98B4-3A9274295BD0}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Poolz.Finance.CSharp.Http", "src\Poolz.Finance.CSharp.Http\Poolz.Finance.CSharp.Http.csproj", "{6EAF7CF1-0D92-218F-D1AC-37BD1E926245}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {257A6C6B-915B-4D98-A250-6F2F12E89D98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {257A6C6B-915B-4D98-A250-6F2F12E89D98}.Debug|Any CPU.Build.0 = Debug|Any CPU - {257A6C6B-915B-4D98-A250-6F2F12E89D98}.Release|Any CPU.ActiveCfg = Release|Any CPU - {257A6C6B-915B-4D98-A250-6F2F12E89D98}.Release|Any CPU.Build.0 = Release|Any CPU {91F0D4AA-D794-4EF2-98B4-3A9274295BD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {91F0D4AA-D794-4EF2-98B4-3A9274295BD0}.Debug|Any CPU.Build.0 = Debug|Any CPU {91F0D4AA-D794-4EF2-98B4-3A9274295BD0}.Release|Any CPU.ActiveCfg = Release|Any CPU {91F0D4AA-D794-4EF2-98B4-3A9274295BD0}.Release|Any CPU.Build.0 = Release|Any CPU + {6EAF7CF1-0D92-218F-D1AC-37BD1E926245}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6EAF7CF1-0D92-218F-D1AC-37BD1E926245}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6EAF7CF1-0D92-218F-D1AC-37BD1E926245}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6EAF7CF1-0D92-218F-D1AC-37BD1E926245}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {257A6C6B-915B-4D98-A250-6F2F12E89D98} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} {91F0D4AA-D794-4EF2-98B4-3A9274295BD0} = {C43445A2-69BB-48F5-8D8B-45F82D29028D} + {6EAF7CF1-0D92-218F-D1AC-37BD1E926245} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {AF2F8BF3-0CF6-467C-944A-792A7D687E3C} From 9b153eba7a0ef9539a89d882aa1ff09ef7fd9651 Mon Sep 17 00:00:00 2001 From: ArdenHide Date: Wed, 19 Nov 2025 17:15:38 +0300 Subject: [PATCH 5/5] - update sln --- Poolz.Finance.CSharp.Http.sln | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Poolz.Finance.CSharp.Http.sln b/Poolz.Finance.CSharp.Http.sln index 19b6f82..d4946c7 100644 --- a/Poolz.Finance.CSharp.Http.sln +++ b/Poolz.Finance.CSharp.Http.sln @@ -7,31 +7,31 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{02EA681E-C7D EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{C43445A2-69BB-48F5-8D8B-45F82D29028D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Poolz.Finance.CSharp.Http.Tests", "..\..\tests\Poolz.Finance.CSharp.Http.Tests\Poolz.Finance.CSharp.Http.Tests.csproj", "{91F0D4AA-D794-4EF2-98B4-3A9274295BD0}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Poolz.Finance.CSharp.Http", "src\Poolz.Finance.CSharp.Http\Poolz.Finance.CSharp.Http.csproj", "{6EAF7CF1-0D92-218F-D1AC-37BD1E926245}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Poolz.Finance.CSharp.Http.Tests", "tests\Poolz.Finance.CSharp.Http.Tests\Poolz.Finance.CSharp.Http.Tests.csproj", "{7B8DC796-734F-C107-EB88-001D0D01E09F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {91F0D4AA-D794-4EF2-98B4-3A9274295BD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {91F0D4AA-D794-4EF2-98B4-3A9274295BD0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {91F0D4AA-D794-4EF2-98B4-3A9274295BD0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {91F0D4AA-D794-4EF2-98B4-3A9274295BD0}.Release|Any CPU.Build.0 = Release|Any CPU {6EAF7CF1-0D92-218F-D1AC-37BD1E926245}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6EAF7CF1-0D92-218F-D1AC-37BD1E926245}.Debug|Any CPU.Build.0 = Debug|Any CPU {6EAF7CF1-0D92-218F-D1AC-37BD1E926245}.Release|Any CPU.ActiveCfg = Release|Any CPU {6EAF7CF1-0D92-218F-D1AC-37BD1E926245}.Release|Any CPU.Build.0 = Release|Any CPU + {7B8DC796-734F-C107-EB88-001D0D01E09F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7B8DC796-734F-C107-EB88-001D0D01E09F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7B8DC796-734F-C107-EB88-001D0D01E09F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7B8DC796-734F-C107-EB88-001D0D01E09F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {91F0D4AA-D794-4EF2-98B4-3A9274295BD0} = {C43445A2-69BB-48F5-8D8B-45F82D29028D} {6EAF7CF1-0D92-218F-D1AC-37BD1E926245} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {7B8DC796-734F-C107-EB88-001D0D01E09F} = {C43445A2-69BB-48F5-8D8B-45F82D29028D} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {AF2F8BF3-0CF6-467C-944A-792A7D687E3C}