From be76d78dcfd19459d2dfda2a34cc2bfe398c36be Mon Sep 17 00:00:00 2001 From: s2quake Date: Wed, 28 Aug 2024 10:51:25 +0900 Subject: [PATCH] feat: Add swagger and explorer(GQL) --- Libplanet.sln | 396 +++++++++--------- .../Explorer/BlockChainContext.cs | 38 ++ .../Explorer/ExplorerExtensions.cs | 35 ++ .../Explorer/ExplorerOptions.cs | 13 + .../Libplanet.Node.Executable.csproj | 5 + sdk/node/Libplanet.Node.Executable/Program.cs | 45 +- .../Protos/blockchain.proto | 2 +- .../Protos/schema.proto | 2 +- ...cService.cs => BlockChainGrpcServiceV1.cs} | 4 +- ...aGrpcService.cs => SchemaGrpcServiceV1.cs} | 2 +- .../appsettings-schema.json | 15 + .../appsettings.Development.json | 5 +- .../LibplanetServicesExtensions.cs | 40 +- .../Libplanet.Node/Options/IEnabledOptions.cs | 6 + .../Libplanet.Node/Options/SoloOptions.cs | 2 +- .../Libplanet.Node/Options/SwarmOptions.cs | 2 +- .../Options/ValidatorOptions.cs | 2 +- .../Libplanet.Node/Services/ISwarmService.cs | 4 + .../Libplanet.Node/Services/SwarmService.cs | 2 + 19 files changed, 387 insertions(+), 233 deletions(-) create mode 100644 sdk/node/Libplanet.Node.Executable/Explorer/BlockChainContext.cs create mode 100644 sdk/node/Libplanet.Node.Executable/Explorer/ExplorerExtensions.cs create mode 100644 sdk/node/Libplanet.Node.Executable/Explorer/ExplorerOptions.cs rename sdk/node/Libplanet.Node.Executable/Services/{BlockChainGrpcService.cs => BlockChainGrpcServiceV1.cs} (94%) rename sdk/node/Libplanet.Node.Executable/Services/{SchemaGrpcService.cs => SchemaGrpcServiceV1.cs} (97%) create mode 100644 sdk/node/Libplanet.Node/Options/IEnabledOptions.cs diff --git a/Libplanet.sln b/Libplanet.sln index 30d960e0b0f..6727a518cad 100644 --- a/Libplanet.sln +++ b/Libplanet.sln @@ -86,12 +86,12 @@ Global Debug|Any CPU = Debug|Any CPU Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 ReleaseMono|Any CPU = ReleaseMono|Any CPU ReleaseMono|x64 = ReleaseMono|x64 ReleaseMono|x86 = ReleaseMono|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {4F5DB8F5-D0F4-454C-95A7-87F53E5D5E36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -100,603 +100,603 @@ Global {4F5DB8F5-D0F4-454C-95A7-87F53E5D5E36}.Debug|x64.Build.0 = Debug|Any CPU {4F5DB8F5-D0F4-454C-95A7-87F53E5D5E36}.Debug|x86.ActiveCfg = Debug|Any CPU {4F5DB8F5-D0F4-454C-95A7-87F53E5D5E36}.Debug|x86.Build.0 = Debug|Any CPU - {4F5DB8F5-D0F4-454C-95A7-87F53E5D5E36}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4F5DB8F5-D0F4-454C-95A7-87F53E5D5E36}.Release|Any CPU.Build.0 = Release|Any CPU - {4F5DB8F5-D0F4-454C-95A7-87F53E5D5E36}.Release|x64.ActiveCfg = Release|Any CPU - {4F5DB8F5-D0F4-454C-95A7-87F53E5D5E36}.Release|x64.Build.0 = Release|Any CPU - {4F5DB8F5-D0F4-454C-95A7-87F53E5D5E36}.Release|x86.ActiveCfg = Release|Any CPU - {4F5DB8F5-D0F4-454C-95A7-87F53E5D5E36}.Release|x86.Build.0 = Release|Any CPU {4F5DB8F5-D0F4-454C-95A7-87F53E5D5E36}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU {4F5DB8F5-D0F4-454C-95A7-87F53E5D5E36}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU {4F5DB8F5-D0F4-454C-95A7-87F53E5D5E36}.ReleaseMono|x64.ActiveCfg = Release|Any CPU {4F5DB8F5-D0F4-454C-95A7-87F53E5D5E36}.ReleaseMono|x64.Build.0 = Release|Any CPU {4F5DB8F5-D0F4-454C-95A7-87F53E5D5E36}.ReleaseMono|x86.ActiveCfg = Release|Any CPU {4F5DB8F5-D0F4-454C-95A7-87F53E5D5E36}.ReleaseMono|x86.Build.0 = Release|Any CPU + {4F5DB8F5-D0F4-454C-95A7-87F53E5D5E36}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4F5DB8F5-D0F4-454C-95A7-87F53E5D5E36}.Release|Any CPU.Build.0 = Release|Any CPU + {4F5DB8F5-D0F4-454C-95A7-87F53E5D5E36}.Release|x64.ActiveCfg = Release|Any CPU + {4F5DB8F5-D0F4-454C-95A7-87F53E5D5E36}.Release|x64.Build.0 = Release|Any CPU + {4F5DB8F5-D0F4-454C-95A7-87F53E5D5E36}.Release|x86.ActiveCfg = Release|Any CPU + {4F5DB8F5-D0F4-454C-95A7-87F53E5D5E36}.Release|x86.Build.0 = Release|Any CPU {5C2B23E2-C286-412D-ADE1-F6796B7083DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5C2B23E2-C286-412D-ADE1-F6796B7083DE}.Debug|Any CPU.Build.0 = Debug|Any CPU {5C2B23E2-C286-412D-ADE1-F6796B7083DE}.Debug|x64.ActiveCfg = Debug|Any CPU {5C2B23E2-C286-412D-ADE1-F6796B7083DE}.Debug|x64.Build.0 = Debug|Any CPU {5C2B23E2-C286-412D-ADE1-F6796B7083DE}.Debug|x86.ActiveCfg = Debug|Any CPU {5C2B23E2-C286-412D-ADE1-F6796B7083DE}.Debug|x86.Build.0 = Debug|Any CPU - {5C2B23E2-C286-412D-ADE1-F6796B7083DE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5C2B23E2-C286-412D-ADE1-F6796B7083DE}.Release|Any CPU.Build.0 = Release|Any CPU - {5C2B23E2-C286-412D-ADE1-F6796B7083DE}.Release|x64.ActiveCfg = Release|Any CPU - {5C2B23E2-C286-412D-ADE1-F6796B7083DE}.Release|x64.Build.0 = Release|Any CPU - {5C2B23E2-C286-412D-ADE1-F6796B7083DE}.Release|x86.ActiveCfg = Release|Any CPU - {5C2B23E2-C286-412D-ADE1-F6796B7083DE}.Release|x86.Build.0 = Release|Any CPU {5C2B23E2-C286-412D-ADE1-F6796B7083DE}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU {5C2B23E2-C286-412D-ADE1-F6796B7083DE}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU {5C2B23E2-C286-412D-ADE1-F6796B7083DE}.ReleaseMono|x64.ActiveCfg = Release|Any CPU {5C2B23E2-C286-412D-ADE1-F6796B7083DE}.ReleaseMono|x64.Build.0 = Release|Any CPU {5C2B23E2-C286-412D-ADE1-F6796B7083DE}.ReleaseMono|x86.ActiveCfg = Release|Any CPU {5C2B23E2-C286-412D-ADE1-F6796B7083DE}.ReleaseMono|x86.Build.0 = Release|Any CPU + {5C2B23E2-C286-412D-ADE1-F6796B7083DE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5C2B23E2-C286-412D-ADE1-F6796B7083DE}.Release|Any CPU.Build.0 = Release|Any CPU + {5C2B23E2-C286-412D-ADE1-F6796B7083DE}.Release|x64.ActiveCfg = Release|Any CPU + {5C2B23E2-C286-412D-ADE1-F6796B7083DE}.Release|x64.Build.0 = Release|Any CPU + {5C2B23E2-C286-412D-ADE1-F6796B7083DE}.Release|x86.ActiveCfg = Release|Any CPU + {5C2B23E2-C286-412D-ADE1-F6796B7083DE}.Release|x86.Build.0 = Release|Any CPU {50E14C9A-3C2F-4A51-971F-6143952D0F1C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {50E14C9A-3C2F-4A51-971F-6143952D0F1C}.Debug|Any CPU.Build.0 = Debug|Any CPU {50E14C9A-3C2F-4A51-971F-6143952D0F1C}.Debug|x64.ActiveCfg = Debug|Any CPU {50E14C9A-3C2F-4A51-971F-6143952D0F1C}.Debug|x64.Build.0 = Debug|Any CPU {50E14C9A-3C2F-4A51-971F-6143952D0F1C}.Debug|x86.ActiveCfg = Debug|Any CPU {50E14C9A-3C2F-4A51-971F-6143952D0F1C}.Debug|x86.Build.0 = Debug|Any CPU - {50E14C9A-3C2F-4A51-971F-6143952D0F1C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {50E14C9A-3C2F-4A51-971F-6143952D0F1C}.Release|Any CPU.Build.0 = Release|Any CPU - {50E14C9A-3C2F-4A51-971F-6143952D0F1C}.Release|x64.ActiveCfg = Release|Any CPU - {50E14C9A-3C2F-4A51-971F-6143952D0F1C}.Release|x64.Build.0 = Release|Any CPU - {50E14C9A-3C2F-4A51-971F-6143952D0F1C}.Release|x86.ActiveCfg = Release|Any CPU - {50E14C9A-3C2F-4A51-971F-6143952D0F1C}.Release|x86.Build.0 = Release|Any CPU {50E14C9A-3C2F-4A51-971F-6143952D0F1C}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU {50E14C9A-3C2F-4A51-971F-6143952D0F1C}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU {50E14C9A-3C2F-4A51-971F-6143952D0F1C}.ReleaseMono|x64.ActiveCfg = Release|Any CPU {50E14C9A-3C2F-4A51-971F-6143952D0F1C}.ReleaseMono|x64.Build.0 = Release|Any CPU {50E14C9A-3C2F-4A51-971F-6143952D0F1C}.ReleaseMono|x86.ActiveCfg = Release|Any CPU {50E14C9A-3C2F-4A51-971F-6143952D0F1C}.ReleaseMono|x86.Build.0 = Release|Any CPU + {50E14C9A-3C2F-4A51-971F-6143952D0F1C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {50E14C9A-3C2F-4A51-971F-6143952D0F1C}.Release|Any CPU.Build.0 = Release|Any CPU + {50E14C9A-3C2F-4A51-971F-6143952D0F1C}.Release|x64.ActiveCfg = Release|Any CPU + {50E14C9A-3C2F-4A51-971F-6143952D0F1C}.Release|x64.Build.0 = Release|Any CPU + {50E14C9A-3C2F-4A51-971F-6143952D0F1C}.Release|x86.ActiveCfg = Release|Any CPU + {50E14C9A-3C2F-4A51-971F-6143952D0F1C}.Release|x86.Build.0 = Release|Any CPU {3BA7D9BE-EBBF-432E-9880-0E2D2C17FCF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3BA7D9BE-EBBF-432E-9880-0E2D2C17FCF8}.Debug|Any CPU.Build.0 = Debug|Any CPU {3BA7D9BE-EBBF-432E-9880-0E2D2C17FCF8}.Debug|x64.ActiveCfg = Debug|Any CPU {3BA7D9BE-EBBF-432E-9880-0E2D2C17FCF8}.Debug|x64.Build.0 = Debug|Any CPU {3BA7D9BE-EBBF-432E-9880-0E2D2C17FCF8}.Debug|x86.ActiveCfg = Debug|Any CPU {3BA7D9BE-EBBF-432E-9880-0E2D2C17FCF8}.Debug|x86.Build.0 = Debug|Any CPU - {3BA7D9BE-EBBF-432E-9880-0E2D2C17FCF8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3BA7D9BE-EBBF-432E-9880-0E2D2C17FCF8}.Release|Any CPU.Build.0 = Release|Any CPU - {3BA7D9BE-EBBF-432E-9880-0E2D2C17FCF8}.Release|x64.ActiveCfg = Release|Any CPU - {3BA7D9BE-EBBF-432E-9880-0E2D2C17FCF8}.Release|x64.Build.0 = Release|Any CPU - {3BA7D9BE-EBBF-432E-9880-0E2D2C17FCF8}.Release|x86.ActiveCfg = Release|Any CPU - {3BA7D9BE-EBBF-432E-9880-0E2D2C17FCF8}.Release|x86.Build.0 = Release|Any CPU {3BA7D9BE-EBBF-432E-9880-0E2D2C17FCF8}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU {3BA7D9BE-EBBF-432E-9880-0E2D2C17FCF8}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU {3BA7D9BE-EBBF-432E-9880-0E2D2C17FCF8}.ReleaseMono|x64.ActiveCfg = Release|Any CPU {3BA7D9BE-EBBF-432E-9880-0E2D2C17FCF8}.ReleaseMono|x64.Build.0 = Release|Any CPU {3BA7D9BE-EBBF-432E-9880-0E2D2C17FCF8}.ReleaseMono|x86.ActiveCfg = Release|Any CPU {3BA7D9BE-EBBF-432E-9880-0E2D2C17FCF8}.ReleaseMono|x86.Build.0 = Release|Any CPU + {3BA7D9BE-EBBF-432E-9880-0E2D2C17FCF8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3BA7D9BE-EBBF-432E-9880-0E2D2C17FCF8}.Release|Any CPU.Build.0 = Release|Any CPU + {3BA7D9BE-EBBF-432E-9880-0E2D2C17FCF8}.Release|x64.ActiveCfg = Release|Any CPU + {3BA7D9BE-EBBF-432E-9880-0E2D2C17FCF8}.Release|x64.Build.0 = Release|Any CPU + {3BA7D9BE-EBBF-432E-9880-0E2D2C17FCF8}.Release|x86.ActiveCfg = Release|Any CPU + {3BA7D9BE-EBBF-432E-9880-0E2D2C17FCF8}.Release|x86.Build.0 = Release|Any CPU {E010FB5E-0D68-4AF7-B632-5DB6B902F158}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E010FB5E-0D68-4AF7-B632-5DB6B902F158}.Debug|Any CPU.Build.0 = Debug|Any CPU {E010FB5E-0D68-4AF7-B632-5DB6B902F158}.Debug|x64.ActiveCfg = Debug|Any CPU {E010FB5E-0D68-4AF7-B632-5DB6B902F158}.Debug|x64.Build.0 = Debug|Any CPU {E010FB5E-0D68-4AF7-B632-5DB6B902F158}.Debug|x86.ActiveCfg = Debug|Any CPU {E010FB5E-0D68-4AF7-B632-5DB6B902F158}.Debug|x86.Build.0 = Debug|Any CPU - {E010FB5E-0D68-4AF7-B632-5DB6B902F158}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E010FB5E-0D68-4AF7-B632-5DB6B902F158}.Release|Any CPU.Build.0 = Release|Any CPU - {E010FB5E-0D68-4AF7-B632-5DB6B902F158}.Release|x64.ActiveCfg = Release|Any CPU - {E010FB5E-0D68-4AF7-B632-5DB6B902F158}.Release|x64.Build.0 = Release|Any CPU - {E010FB5E-0D68-4AF7-B632-5DB6B902F158}.Release|x86.ActiveCfg = Release|Any CPU - {E010FB5E-0D68-4AF7-B632-5DB6B902F158}.Release|x86.Build.0 = Release|Any CPU {E010FB5E-0D68-4AF7-B632-5DB6B902F158}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU {E010FB5E-0D68-4AF7-B632-5DB6B902F158}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU {E010FB5E-0D68-4AF7-B632-5DB6B902F158}.ReleaseMono|x64.ActiveCfg = Release|Any CPU {E010FB5E-0D68-4AF7-B632-5DB6B902F158}.ReleaseMono|x64.Build.0 = Release|Any CPU {E010FB5E-0D68-4AF7-B632-5DB6B902F158}.ReleaseMono|x86.ActiveCfg = Release|Any CPU {E010FB5E-0D68-4AF7-B632-5DB6B902F158}.ReleaseMono|x86.Build.0 = Release|Any CPU + {E010FB5E-0D68-4AF7-B632-5DB6B902F158}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E010FB5E-0D68-4AF7-B632-5DB6B902F158}.Release|Any CPU.Build.0 = Release|Any CPU + {E010FB5E-0D68-4AF7-B632-5DB6B902F158}.Release|x64.ActiveCfg = Release|Any CPU + {E010FB5E-0D68-4AF7-B632-5DB6B902F158}.Release|x64.Build.0 = Release|Any CPU + {E010FB5E-0D68-4AF7-B632-5DB6B902F158}.Release|x86.ActiveCfg = Release|Any CPU + {E010FB5E-0D68-4AF7-B632-5DB6B902F158}.Release|x86.Build.0 = Release|Any CPU {A5DE942D-912D-4012-8493-1E958E5445F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A5DE942D-912D-4012-8493-1E958E5445F4}.Debug|Any CPU.Build.0 = Debug|Any CPU {A5DE942D-912D-4012-8493-1E958E5445F4}.Debug|x64.ActiveCfg = Debug|Any CPU {A5DE942D-912D-4012-8493-1E958E5445F4}.Debug|x64.Build.0 = Debug|Any CPU {A5DE942D-912D-4012-8493-1E958E5445F4}.Debug|x86.ActiveCfg = Debug|Any CPU {A5DE942D-912D-4012-8493-1E958E5445F4}.Debug|x86.Build.0 = Debug|Any CPU - {A5DE942D-912D-4012-8493-1E958E5445F4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A5DE942D-912D-4012-8493-1E958E5445F4}.Release|Any CPU.Build.0 = Release|Any CPU - {A5DE942D-912D-4012-8493-1E958E5445F4}.Release|x64.ActiveCfg = Release|Any CPU - {A5DE942D-912D-4012-8493-1E958E5445F4}.Release|x64.Build.0 = Release|Any CPU - {A5DE942D-912D-4012-8493-1E958E5445F4}.Release|x86.ActiveCfg = Release|Any CPU - {A5DE942D-912D-4012-8493-1E958E5445F4}.Release|x86.Build.0 = Release|Any CPU {A5DE942D-912D-4012-8493-1E958E5445F4}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU {A5DE942D-912D-4012-8493-1E958E5445F4}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU {A5DE942D-912D-4012-8493-1E958E5445F4}.ReleaseMono|x64.ActiveCfg = Release|Any CPU {A5DE942D-912D-4012-8493-1E958E5445F4}.ReleaseMono|x64.Build.0 = Release|Any CPU {A5DE942D-912D-4012-8493-1E958E5445F4}.ReleaseMono|x86.ActiveCfg = Release|Any CPU {A5DE942D-912D-4012-8493-1E958E5445F4}.ReleaseMono|x86.Build.0 = Release|Any CPU + {A5DE942D-912D-4012-8493-1E958E5445F4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A5DE942D-912D-4012-8493-1E958E5445F4}.Release|Any CPU.Build.0 = Release|Any CPU + {A5DE942D-912D-4012-8493-1E958E5445F4}.Release|x64.ActiveCfg = Release|Any CPU + {A5DE942D-912D-4012-8493-1E958E5445F4}.Release|x64.Build.0 = Release|Any CPU + {A5DE942D-912D-4012-8493-1E958E5445F4}.Release|x86.ActiveCfg = Release|Any CPU + {A5DE942D-912D-4012-8493-1E958E5445F4}.Release|x86.Build.0 = Release|Any CPU {ADCBBAC0-0A87-45B7-BD31-314F136F74D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {ADCBBAC0-0A87-45B7-BD31-314F136F74D4}.Debug|Any CPU.Build.0 = Debug|Any CPU {ADCBBAC0-0A87-45B7-BD31-314F136F74D4}.Debug|x64.ActiveCfg = Debug|Any CPU {ADCBBAC0-0A87-45B7-BD31-314F136F74D4}.Debug|x64.Build.0 = Debug|Any CPU {ADCBBAC0-0A87-45B7-BD31-314F136F74D4}.Debug|x86.ActiveCfg = Debug|Any CPU {ADCBBAC0-0A87-45B7-BD31-314F136F74D4}.Debug|x86.Build.0 = Debug|Any CPU - {ADCBBAC0-0A87-45B7-BD31-314F136F74D4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ADCBBAC0-0A87-45B7-BD31-314F136F74D4}.Release|Any CPU.Build.0 = Release|Any CPU - {ADCBBAC0-0A87-45B7-BD31-314F136F74D4}.Release|x64.ActiveCfg = Release|Any CPU - {ADCBBAC0-0A87-45B7-BD31-314F136F74D4}.Release|x64.Build.0 = Release|Any CPU - {ADCBBAC0-0A87-45B7-BD31-314F136F74D4}.Release|x86.ActiveCfg = Release|Any CPU - {ADCBBAC0-0A87-45B7-BD31-314F136F74D4}.Release|x86.Build.0 = Release|Any CPU {ADCBBAC0-0A87-45B7-BD31-314F136F74D4}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU {ADCBBAC0-0A87-45B7-BD31-314F136F74D4}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU {ADCBBAC0-0A87-45B7-BD31-314F136F74D4}.ReleaseMono|x64.ActiveCfg = Release|Any CPU {ADCBBAC0-0A87-45B7-BD31-314F136F74D4}.ReleaseMono|x64.Build.0 = Release|Any CPU {ADCBBAC0-0A87-45B7-BD31-314F136F74D4}.ReleaseMono|x86.ActiveCfg = Release|Any CPU {ADCBBAC0-0A87-45B7-BD31-314F136F74D4}.ReleaseMono|x86.Build.0 = Release|Any CPU + {ADCBBAC0-0A87-45B7-BD31-314F136F74D4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ADCBBAC0-0A87-45B7-BD31-314F136F74D4}.Release|Any CPU.Build.0 = Release|Any CPU + {ADCBBAC0-0A87-45B7-BD31-314F136F74D4}.Release|x64.ActiveCfg = Release|Any CPU + {ADCBBAC0-0A87-45B7-BD31-314F136F74D4}.Release|x64.Build.0 = Release|Any CPU + {ADCBBAC0-0A87-45B7-BD31-314F136F74D4}.Release|x86.ActiveCfg = Release|Any CPU + {ADCBBAC0-0A87-45B7-BD31-314F136F74D4}.Release|x86.Build.0 = Release|Any CPU {A216C2F0-A9A6-4D7F-BF65-127EB80EA6A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A216C2F0-A9A6-4D7F-BF65-127EB80EA6A7}.Debug|Any CPU.Build.0 = Debug|Any CPU {A216C2F0-A9A6-4D7F-BF65-127EB80EA6A7}.Debug|x64.ActiveCfg = Debug|Any CPU {A216C2F0-A9A6-4D7F-BF65-127EB80EA6A7}.Debug|x64.Build.0 = Debug|Any CPU {A216C2F0-A9A6-4D7F-BF65-127EB80EA6A7}.Debug|x86.ActiveCfg = Debug|Any CPU {A216C2F0-A9A6-4D7F-BF65-127EB80EA6A7}.Debug|x86.Build.0 = Debug|Any CPU - {A216C2F0-A9A6-4D7F-BF65-127EB80EA6A7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A216C2F0-A9A6-4D7F-BF65-127EB80EA6A7}.Release|Any CPU.Build.0 = Release|Any CPU - {A216C2F0-A9A6-4D7F-BF65-127EB80EA6A7}.Release|x64.ActiveCfg = Release|Any CPU - {A216C2F0-A9A6-4D7F-BF65-127EB80EA6A7}.Release|x64.Build.0 = Release|Any CPU - {A216C2F0-A9A6-4D7F-BF65-127EB80EA6A7}.Release|x86.ActiveCfg = Release|Any CPU - {A216C2F0-A9A6-4D7F-BF65-127EB80EA6A7}.Release|x86.Build.0 = Release|Any CPU {A216C2F0-A9A6-4D7F-BF65-127EB80EA6A7}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU {A216C2F0-A9A6-4D7F-BF65-127EB80EA6A7}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU {A216C2F0-A9A6-4D7F-BF65-127EB80EA6A7}.ReleaseMono|x64.ActiveCfg = Release|Any CPU {A216C2F0-A9A6-4D7F-BF65-127EB80EA6A7}.ReleaseMono|x64.Build.0 = Release|Any CPU {A216C2F0-A9A6-4D7F-BF65-127EB80EA6A7}.ReleaseMono|x86.ActiveCfg = Release|Any CPU {A216C2F0-A9A6-4D7F-BF65-127EB80EA6A7}.ReleaseMono|x86.Build.0 = Release|Any CPU + {A216C2F0-A9A6-4D7F-BF65-127EB80EA6A7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A216C2F0-A9A6-4D7F-BF65-127EB80EA6A7}.Release|Any CPU.Build.0 = Release|Any CPU + {A216C2F0-A9A6-4D7F-BF65-127EB80EA6A7}.Release|x64.ActiveCfg = Release|Any CPU + {A216C2F0-A9A6-4D7F-BF65-127EB80EA6A7}.Release|x64.Build.0 = Release|Any CPU + {A216C2F0-A9A6-4D7F-BF65-127EB80EA6A7}.Release|x86.ActiveCfg = Release|Any CPU + {A216C2F0-A9A6-4D7F-BF65-127EB80EA6A7}.Release|x86.Build.0 = Release|Any CPU {5CEE1B93-3936-4E32-A414-522DCDCA26BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5CEE1B93-3936-4E32-A414-522DCDCA26BB}.Debug|Any CPU.Build.0 = Debug|Any CPU {5CEE1B93-3936-4E32-A414-522DCDCA26BB}.Debug|x64.ActiveCfg = Debug|Any CPU {5CEE1B93-3936-4E32-A414-522DCDCA26BB}.Debug|x64.Build.0 = Debug|Any CPU {5CEE1B93-3936-4E32-A414-522DCDCA26BB}.Debug|x86.ActiveCfg = Debug|Any CPU {5CEE1B93-3936-4E32-A414-522DCDCA26BB}.Debug|x86.Build.0 = Debug|Any CPU - {5CEE1B93-3936-4E32-A414-522DCDCA26BB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5CEE1B93-3936-4E32-A414-522DCDCA26BB}.Release|Any CPU.Build.0 = Release|Any CPU - {5CEE1B93-3936-4E32-A414-522DCDCA26BB}.Release|x64.ActiveCfg = Release|Any CPU - {5CEE1B93-3936-4E32-A414-522DCDCA26BB}.Release|x64.Build.0 = Release|Any CPU - {5CEE1B93-3936-4E32-A414-522DCDCA26BB}.Release|x86.ActiveCfg = Release|Any CPU - {5CEE1B93-3936-4E32-A414-522DCDCA26BB}.Release|x86.Build.0 = Release|Any CPU {5CEE1B93-3936-4E32-A414-522DCDCA26BB}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU {5CEE1B93-3936-4E32-A414-522DCDCA26BB}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU {5CEE1B93-3936-4E32-A414-522DCDCA26BB}.ReleaseMono|x64.ActiveCfg = Release|Any CPU {5CEE1B93-3936-4E32-A414-522DCDCA26BB}.ReleaseMono|x64.Build.0 = Release|Any CPU {5CEE1B93-3936-4E32-A414-522DCDCA26BB}.ReleaseMono|x86.ActiveCfg = Release|Any CPU {5CEE1B93-3936-4E32-A414-522DCDCA26BB}.ReleaseMono|x86.Build.0 = Release|Any CPU + {5CEE1B93-3936-4E32-A414-522DCDCA26BB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5CEE1B93-3936-4E32-A414-522DCDCA26BB}.Release|Any CPU.Build.0 = Release|Any CPU + {5CEE1B93-3936-4E32-A414-522DCDCA26BB}.Release|x64.ActiveCfg = Release|Any CPU + {5CEE1B93-3936-4E32-A414-522DCDCA26BB}.Release|x64.Build.0 = Release|Any CPU + {5CEE1B93-3936-4E32-A414-522DCDCA26BB}.Release|x86.ActiveCfg = Release|Any CPU + {5CEE1B93-3936-4E32-A414-522DCDCA26BB}.Release|x86.Build.0 = Release|Any CPU {B48782B9-6FA9-4D18-8564-1849FF4CF40E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B48782B9-6FA9-4D18-8564-1849FF4CF40E}.Debug|Any CPU.Build.0 = Debug|Any CPU {B48782B9-6FA9-4D18-8564-1849FF4CF40E}.Debug|x64.ActiveCfg = Debug|Any CPU {B48782B9-6FA9-4D18-8564-1849FF4CF40E}.Debug|x64.Build.0 = Debug|Any CPU {B48782B9-6FA9-4D18-8564-1849FF4CF40E}.Debug|x86.ActiveCfg = Debug|Any CPU {B48782B9-6FA9-4D18-8564-1849FF4CF40E}.Debug|x86.Build.0 = Debug|Any CPU - {B48782B9-6FA9-4D18-8564-1849FF4CF40E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B48782B9-6FA9-4D18-8564-1849FF4CF40E}.Release|Any CPU.Build.0 = Release|Any CPU - {B48782B9-6FA9-4D18-8564-1849FF4CF40E}.Release|x64.ActiveCfg = Release|Any CPU - {B48782B9-6FA9-4D18-8564-1849FF4CF40E}.Release|x64.Build.0 = Release|Any CPU - {B48782B9-6FA9-4D18-8564-1849FF4CF40E}.Release|x86.ActiveCfg = Release|Any CPU - {B48782B9-6FA9-4D18-8564-1849FF4CF40E}.Release|x86.Build.0 = Release|Any CPU {B48782B9-6FA9-4D18-8564-1849FF4CF40E}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU {B48782B9-6FA9-4D18-8564-1849FF4CF40E}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU {B48782B9-6FA9-4D18-8564-1849FF4CF40E}.ReleaseMono|x64.ActiveCfg = Release|Any CPU {B48782B9-6FA9-4D18-8564-1849FF4CF40E}.ReleaseMono|x64.Build.0 = Release|Any CPU {B48782B9-6FA9-4D18-8564-1849FF4CF40E}.ReleaseMono|x86.ActiveCfg = Release|Any CPU {B48782B9-6FA9-4D18-8564-1849FF4CF40E}.ReleaseMono|x86.Build.0 = Release|Any CPU + {B48782B9-6FA9-4D18-8564-1849FF4CF40E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B48782B9-6FA9-4D18-8564-1849FF4CF40E}.Release|Any CPU.Build.0 = Release|Any CPU + {B48782B9-6FA9-4D18-8564-1849FF4CF40E}.Release|x64.ActiveCfg = Release|Any CPU + {B48782B9-6FA9-4D18-8564-1849FF4CF40E}.Release|x64.Build.0 = Release|Any CPU + {B48782B9-6FA9-4D18-8564-1849FF4CF40E}.Release|x86.ActiveCfg = Release|Any CPU + {B48782B9-6FA9-4D18-8564-1849FF4CF40E}.Release|x86.Build.0 = Release|Any CPU {B41C8F1C-5BD2-43B9-A3CC-FC03DFE04E23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B41C8F1C-5BD2-43B9-A3CC-FC03DFE04E23}.Debug|Any CPU.Build.0 = Debug|Any CPU {B41C8F1C-5BD2-43B9-A3CC-FC03DFE04E23}.Debug|x64.ActiveCfg = Debug|Any CPU {B41C8F1C-5BD2-43B9-A3CC-FC03DFE04E23}.Debug|x64.Build.0 = Debug|Any CPU {B41C8F1C-5BD2-43B9-A3CC-FC03DFE04E23}.Debug|x86.ActiveCfg = Debug|Any CPU {B41C8F1C-5BD2-43B9-A3CC-FC03DFE04E23}.Debug|x86.Build.0 = Debug|Any CPU + {B41C8F1C-5BD2-43B9-A3CC-FC03DFE04E23}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU + {B41C8F1C-5BD2-43B9-A3CC-FC03DFE04E23}.ReleaseMono|x64.ActiveCfg = Release|Any CPU + {B41C8F1C-5BD2-43B9-A3CC-FC03DFE04E23}.ReleaseMono|x86.ActiveCfg = Release|Any CPU {B41C8F1C-5BD2-43B9-A3CC-FC03DFE04E23}.Release|Any CPU.ActiveCfg = Release|Any CPU {B41C8F1C-5BD2-43B9-A3CC-FC03DFE04E23}.Release|Any CPU.Build.0 = Release|Any CPU {B41C8F1C-5BD2-43B9-A3CC-FC03DFE04E23}.Release|x64.ActiveCfg = Release|Any CPU {B41C8F1C-5BD2-43B9-A3CC-FC03DFE04E23}.Release|x64.Build.0 = Release|Any CPU {B41C8F1C-5BD2-43B9-A3CC-FC03DFE04E23}.Release|x86.ActiveCfg = Release|Any CPU {B41C8F1C-5BD2-43B9-A3CC-FC03DFE04E23}.Release|x86.Build.0 = Release|Any CPU - {B41C8F1C-5BD2-43B9-A3CC-FC03DFE04E23}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU - {B41C8F1C-5BD2-43B9-A3CC-FC03DFE04E23}.ReleaseMono|x64.ActiveCfg = Release|Any CPU - {B41C8F1C-5BD2-43B9-A3CC-FC03DFE04E23}.ReleaseMono|x86.ActiveCfg = Release|Any CPU {BEDBC0F8-AD0A-44C3-9A53-C8EC4E631AF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BEDBC0F8-AD0A-44C3-9A53-C8EC4E631AF4}.Debug|Any CPU.Build.0 = Debug|Any CPU {BEDBC0F8-AD0A-44C3-9A53-C8EC4E631AF4}.Debug|x64.ActiveCfg = Debug|Any CPU {BEDBC0F8-AD0A-44C3-9A53-C8EC4E631AF4}.Debug|x64.Build.0 = Debug|Any CPU {BEDBC0F8-AD0A-44C3-9A53-C8EC4E631AF4}.Debug|x86.ActiveCfg = Debug|Any CPU {BEDBC0F8-AD0A-44C3-9A53-C8EC4E631AF4}.Debug|x86.Build.0 = Debug|Any CPU + {BEDBC0F8-AD0A-44C3-9A53-C8EC4E631AF4}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU + {BEDBC0F8-AD0A-44C3-9A53-C8EC4E631AF4}.ReleaseMono|x64.ActiveCfg = Release|Any CPU + {BEDBC0F8-AD0A-44C3-9A53-C8EC4E631AF4}.ReleaseMono|x86.ActiveCfg = Release|Any CPU {BEDBC0F8-AD0A-44C3-9A53-C8EC4E631AF4}.Release|Any CPU.ActiveCfg = Release|Any CPU {BEDBC0F8-AD0A-44C3-9A53-C8EC4E631AF4}.Release|Any CPU.Build.0 = Release|Any CPU {BEDBC0F8-AD0A-44C3-9A53-C8EC4E631AF4}.Release|x64.ActiveCfg = Release|Any CPU {BEDBC0F8-AD0A-44C3-9A53-C8EC4E631AF4}.Release|x64.Build.0 = Release|Any CPU {BEDBC0F8-AD0A-44C3-9A53-C8EC4E631AF4}.Release|x86.ActiveCfg = Release|Any CPU {BEDBC0F8-AD0A-44C3-9A53-C8EC4E631AF4}.Release|x86.Build.0 = Release|Any CPU - {BEDBC0F8-AD0A-44C3-9A53-C8EC4E631AF4}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU - {BEDBC0F8-AD0A-44C3-9A53-C8EC4E631AF4}.ReleaseMono|x64.ActiveCfg = Release|Any CPU - {BEDBC0F8-AD0A-44C3-9A53-C8EC4E631AF4}.ReleaseMono|x86.ActiveCfg = Release|Any CPU {48A7AC8E-2CB5-403B-8A18-11F493079619}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {48A7AC8E-2CB5-403B-8A18-11F493079619}.Debug|Any CPU.Build.0 = Debug|Any CPU {48A7AC8E-2CB5-403B-8A18-11F493079619}.Debug|x64.ActiveCfg = Debug|Any CPU {48A7AC8E-2CB5-403B-8A18-11F493079619}.Debug|x64.Build.0 = Debug|Any CPU {48A7AC8E-2CB5-403B-8A18-11F493079619}.Debug|x86.ActiveCfg = Debug|Any CPU {48A7AC8E-2CB5-403B-8A18-11F493079619}.Debug|x86.Build.0 = Debug|Any CPU + {48A7AC8E-2CB5-403B-8A18-11F493079619}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU + {48A7AC8E-2CB5-403B-8A18-11F493079619}.ReleaseMono|x64.ActiveCfg = Release|Any CPU + {48A7AC8E-2CB5-403B-8A18-11F493079619}.ReleaseMono|x86.ActiveCfg = Release|Any CPU {48A7AC8E-2CB5-403B-8A18-11F493079619}.Release|Any CPU.ActiveCfg = Release|Any CPU {48A7AC8E-2CB5-403B-8A18-11F493079619}.Release|Any CPU.Build.0 = Release|Any CPU {48A7AC8E-2CB5-403B-8A18-11F493079619}.Release|x64.ActiveCfg = Release|Any CPU {48A7AC8E-2CB5-403B-8A18-11F493079619}.Release|x64.Build.0 = Release|Any CPU {48A7AC8E-2CB5-403B-8A18-11F493079619}.Release|x86.ActiveCfg = Release|Any CPU {48A7AC8E-2CB5-403B-8A18-11F493079619}.Release|x86.Build.0 = Release|Any CPU - {48A7AC8E-2CB5-403B-8A18-11F493079619}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU - {48A7AC8E-2CB5-403B-8A18-11F493079619}.ReleaseMono|x64.ActiveCfg = Release|Any CPU - {48A7AC8E-2CB5-403B-8A18-11F493079619}.ReleaseMono|x86.ActiveCfg = Release|Any CPU {B3170309-55AB-462C-9100-D77107799E82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B3170309-55AB-462C-9100-D77107799E82}.Debug|Any CPU.Build.0 = Debug|Any CPU {B3170309-55AB-462C-9100-D77107799E82}.Debug|x64.ActiveCfg = Debug|Any CPU {B3170309-55AB-462C-9100-D77107799E82}.Debug|x64.Build.0 = Debug|Any CPU {B3170309-55AB-462C-9100-D77107799E82}.Debug|x86.ActiveCfg = Debug|Any CPU {B3170309-55AB-462C-9100-D77107799E82}.Debug|x86.Build.0 = Debug|Any CPU - {B3170309-55AB-462C-9100-D77107799E82}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B3170309-55AB-462C-9100-D77107799E82}.Release|Any CPU.Build.0 = Release|Any CPU - {B3170309-55AB-462C-9100-D77107799E82}.Release|x64.ActiveCfg = Release|Any CPU - {B3170309-55AB-462C-9100-D77107799E82}.Release|x64.Build.0 = Release|Any CPU - {B3170309-55AB-462C-9100-D77107799E82}.Release|x86.ActiveCfg = Release|Any CPU - {B3170309-55AB-462C-9100-D77107799E82}.Release|x86.Build.0 = Release|Any CPU {B3170309-55AB-462C-9100-D77107799E82}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU {B3170309-55AB-462C-9100-D77107799E82}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU {B3170309-55AB-462C-9100-D77107799E82}.ReleaseMono|x64.ActiveCfg = Release|Any CPU {B3170309-55AB-462C-9100-D77107799E82}.ReleaseMono|x64.Build.0 = Release|Any CPU {B3170309-55AB-462C-9100-D77107799E82}.ReleaseMono|x86.ActiveCfg = Release|Any CPU {B3170309-55AB-462C-9100-D77107799E82}.ReleaseMono|x86.Build.0 = Release|Any CPU + {B3170309-55AB-462C-9100-D77107799E82}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B3170309-55AB-462C-9100-D77107799E82}.Release|Any CPU.Build.0 = Release|Any CPU + {B3170309-55AB-462C-9100-D77107799E82}.Release|x64.ActiveCfg = Release|Any CPU + {B3170309-55AB-462C-9100-D77107799E82}.Release|x64.Build.0 = Release|Any CPU + {B3170309-55AB-462C-9100-D77107799E82}.Release|x86.ActiveCfg = Release|Any CPU + {B3170309-55AB-462C-9100-D77107799E82}.Release|x86.Build.0 = Release|Any CPU {A43E44E5-F9C1-44BD-A593-419EC113117B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A43E44E5-F9C1-44BD-A593-419EC113117B}.Debug|Any CPU.Build.0 = Debug|Any CPU {A43E44E5-F9C1-44BD-A593-419EC113117B}.Debug|x64.ActiveCfg = Debug|Any CPU {A43E44E5-F9C1-44BD-A593-419EC113117B}.Debug|x64.Build.0 = Debug|Any CPU {A43E44E5-F9C1-44BD-A593-419EC113117B}.Debug|x86.ActiveCfg = Debug|Any CPU {A43E44E5-F9C1-44BD-A593-419EC113117B}.Debug|x86.Build.0 = Debug|Any CPU - {A43E44E5-F9C1-44BD-A593-419EC113117B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A43E44E5-F9C1-44BD-A593-419EC113117B}.Release|Any CPU.Build.0 = Release|Any CPU - {A43E44E5-F9C1-44BD-A593-419EC113117B}.Release|x64.ActiveCfg = Release|Any CPU - {A43E44E5-F9C1-44BD-A593-419EC113117B}.Release|x64.Build.0 = Release|Any CPU - {A43E44E5-F9C1-44BD-A593-419EC113117B}.Release|x86.ActiveCfg = Release|Any CPU - {A43E44E5-F9C1-44BD-A593-419EC113117B}.Release|x86.Build.0 = Release|Any CPU {A43E44E5-F9C1-44BD-A593-419EC113117B}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU {A43E44E5-F9C1-44BD-A593-419EC113117B}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU {A43E44E5-F9C1-44BD-A593-419EC113117B}.ReleaseMono|x64.ActiveCfg = Release|Any CPU {A43E44E5-F9C1-44BD-A593-419EC113117B}.ReleaseMono|x64.Build.0 = Release|Any CPU {A43E44E5-F9C1-44BD-A593-419EC113117B}.ReleaseMono|x86.ActiveCfg = Release|Any CPU {A43E44E5-F9C1-44BD-A593-419EC113117B}.ReleaseMono|x86.Build.0 = Release|Any CPU + {A43E44E5-F9C1-44BD-A593-419EC113117B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A43E44E5-F9C1-44BD-A593-419EC113117B}.Release|Any CPU.Build.0 = Release|Any CPU + {A43E44E5-F9C1-44BD-A593-419EC113117B}.Release|x64.ActiveCfg = Release|Any CPU + {A43E44E5-F9C1-44BD-A593-419EC113117B}.Release|x64.Build.0 = Release|Any CPU + {A43E44E5-F9C1-44BD-A593-419EC113117B}.Release|x86.ActiveCfg = Release|Any CPU + {A43E44E5-F9C1-44BD-A593-419EC113117B}.Release|x86.Build.0 = Release|Any CPU {2E17A091-DC29-41FB-ABC8-767BD75FFB07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2E17A091-DC29-41FB-ABC8-767BD75FFB07}.Debug|Any CPU.Build.0 = Debug|Any CPU {2E17A091-DC29-41FB-ABC8-767BD75FFB07}.Debug|x64.ActiveCfg = Debug|Any CPU {2E17A091-DC29-41FB-ABC8-767BD75FFB07}.Debug|x64.Build.0 = Debug|Any CPU {2E17A091-DC29-41FB-ABC8-767BD75FFB07}.Debug|x86.ActiveCfg = Debug|Any CPU {2E17A091-DC29-41FB-ABC8-767BD75FFB07}.Debug|x86.Build.0 = Debug|Any CPU - {2E17A091-DC29-41FB-ABC8-767BD75FFB07}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2E17A091-DC29-41FB-ABC8-767BD75FFB07}.Release|Any CPU.Build.0 = Release|Any CPU - {2E17A091-DC29-41FB-ABC8-767BD75FFB07}.Release|x64.ActiveCfg = Release|Any CPU - {2E17A091-DC29-41FB-ABC8-767BD75FFB07}.Release|x64.Build.0 = Release|Any CPU - {2E17A091-DC29-41FB-ABC8-767BD75FFB07}.Release|x86.ActiveCfg = Release|Any CPU - {2E17A091-DC29-41FB-ABC8-767BD75FFB07}.Release|x86.Build.0 = Release|Any CPU {2E17A091-DC29-41FB-ABC8-767BD75FFB07}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU {2E17A091-DC29-41FB-ABC8-767BD75FFB07}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU {2E17A091-DC29-41FB-ABC8-767BD75FFB07}.ReleaseMono|x64.ActiveCfg = Release|Any CPU {2E17A091-DC29-41FB-ABC8-767BD75FFB07}.ReleaseMono|x64.Build.0 = Release|Any CPU {2E17A091-DC29-41FB-ABC8-767BD75FFB07}.ReleaseMono|x86.ActiveCfg = Release|Any CPU {2E17A091-DC29-41FB-ABC8-767BD75FFB07}.ReleaseMono|x86.Build.0 = Release|Any CPU + {2E17A091-DC29-41FB-ABC8-767BD75FFB07}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2E17A091-DC29-41FB-ABC8-767BD75FFB07}.Release|Any CPU.Build.0 = Release|Any CPU + {2E17A091-DC29-41FB-ABC8-767BD75FFB07}.Release|x64.ActiveCfg = Release|Any CPU + {2E17A091-DC29-41FB-ABC8-767BD75FFB07}.Release|x64.Build.0 = Release|Any CPU + {2E17A091-DC29-41FB-ABC8-767BD75FFB07}.Release|x86.ActiveCfg = Release|Any CPU + {2E17A091-DC29-41FB-ABC8-767BD75FFB07}.Release|x86.Build.0 = Release|Any CPU {6D7A63C9-16AB-4B7E-B9C0-0956E1E02610}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6D7A63C9-16AB-4B7E-B9C0-0956E1E02610}.Debug|Any CPU.Build.0 = Debug|Any CPU {6D7A63C9-16AB-4B7E-B9C0-0956E1E02610}.Debug|x64.ActiveCfg = Debug|Any CPU {6D7A63C9-16AB-4B7E-B9C0-0956E1E02610}.Debug|x64.Build.0 = Debug|Any CPU {6D7A63C9-16AB-4B7E-B9C0-0956E1E02610}.Debug|x86.ActiveCfg = Debug|Any CPU {6D7A63C9-16AB-4B7E-B9C0-0956E1E02610}.Debug|x86.Build.0 = Debug|Any CPU - {6D7A63C9-16AB-4B7E-B9C0-0956E1E02610}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6D7A63C9-16AB-4B7E-B9C0-0956E1E02610}.Release|Any CPU.Build.0 = Release|Any CPU - {6D7A63C9-16AB-4B7E-B9C0-0956E1E02610}.Release|x64.ActiveCfg = Release|Any CPU - {6D7A63C9-16AB-4B7E-B9C0-0956E1E02610}.Release|x64.Build.0 = Release|Any CPU - {6D7A63C9-16AB-4B7E-B9C0-0956E1E02610}.Release|x86.ActiveCfg = Release|Any CPU - {6D7A63C9-16AB-4B7E-B9C0-0956E1E02610}.Release|x86.Build.0 = Release|Any CPU {6D7A63C9-16AB-4B7E-B9C0-0956E1E02610}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU {6D7A63C9-16AB-4B7E-B9C0-0956E1E02610}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU {6D7A63C9-16AB-4B7E-B9C0-0956E1E02610}.ReleaseMono|x64.ActiveCfg = Release|Any CPU {6D7A63C9-16AB-4B7E-B9C0-0956E1E02610}.ReleaseMono|x64.Build.0 = Release|Any CPU {6D7A63C9-16AB-4B7E-B9C0-0956E1E02610}.ReleaseMono|x86.ActiveCfg = Release|Any CPU {6D7A63C9-16AB-4B7E-B9C0-0956E1E02610}.ReleaseMono|x86.Build.0 = Release|Any CPU + {6D7A63C9-16AB-4B7E-B9C0-0956E1E02610}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6D7A63C9-16AB-4B7E-B9C0-0956E1E02610}.Release|Any CPU.Build.0 = Release|Any CPU + {6D7A63C9-16AB-4B7E-B9C0-0956E1E02610}.Release|x64.ActiveCfg = Release|Any CPU + {6D7A63C9-16AB-4B7E-B9C0-0956E1E02610}.Release|x64.Build.0 = Release|Any CPU + {6D7A63C9-16AB-4B7E-B9C0-0956E1E02610}.Release|x86.ActiveCfg = Release|Any CPU + {6D7A63C9-16AB-4B7E-B9C0-0956E1E02610}.Release|x86.Build.0 = Release|Any CPU {9F88C871-CB37-4A88-BACF-540AC253C202}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9F88C871-CB37-4A88-BACF-540AC253C202}.Debug|Any CPU.Build.0 = Debug|Any CPU {9F88C871-CB37-4A88-BACF-540AC253C202}.Debug|x64.ActiveCfg = Debug|Any CPU {9F88C871-CB37-4A88-BACF-540AC253C202}.Debug|x64.Build.0 = Debug|Any CPU {9F88C871-CB37-4A88-BACF-540AC253C202}.Debug|x86.ActiveCfg = Debug|Any CPU {9F88C871-CB37-4A88-BACF-540AC253C202}.Debug|x86.Build.0 = Debug|Any CPU - {9F88C871-CB37-4A88-BACF-540AC253C202}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9F88C871-CB37-4A88-BACF-540AC253C202}.Release|Any CPU.Build.0 = Release|Any CPU - {9F88C871-CB37-4A88-BACF-540AC253C202}.Release|x64.ActiveCfg = Release|Any CPU - {9F88C871-CB37-4A88-BACF-540AC253C202}.Release|x64.Build.0 = Release|Any CPU - {9F88C871-CB37-4A88-BACF-540AC253C202}.Release|x86.ActiveCfg = Release|Any CPU - {9F88C871-CB37-4A88-BACF-540AC253C202}.Release|x86.Build.0 = Release|Any CPU {9F88C871-CB37-4A88-BACF-540AC253C202}.ReleaseMono|Any CPU.ActiveCfg = Debug|Any CPU {9F88C871-CB37-4A88-BACF-540AC253C202}.ReleaseMono|Any CPU.Build.0 = Debug|Any CPU {9F88C871-CB37-4A88-BACF-540AC253C202}.ReleaseMono|x64.ActiveCfg = Debug|Any CPU {9F88C871-CB37-4A88-BACF-540AC253C202}.ReleaseMono|x64.Build.0 = Debug|Any CPU {9F88C871-CB37-4A88-BACF-540AC253C202}.ReleaseMono|x86.ActiveCfg = Debug|Any CPU {9F88C871-CB37-4A88-BACF-540AC253C202}.ReleaseMono|x86.Build.0 = Debug|Any CPU + {9F88C871-CB37-4A88-BACF-540AC253C202}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9F88C871-CB37-4A88-BACF-540AC253C202}.Release|Any CPU.Build.0 = Release|Any CPU + {9F88C871-CB37-4A88-BACF-540AC253C202}.Release|x64.ActiveCfg = Release|Any CPU + {9F88C871-CB37-4A88-BACF-540AC253C202}.Release|x64.Build.0 = Release|Any CPU + {9F88C871-CB37-4A88-BACF-540AC253C202}.Release|x86.ActiveCfg = Release|Any CPU + {9F88C871-CB37-4A88-BACF-540AC253C202}.Release|x86.Build.0 = Release|Any CPU {B1A38DDE-5534-4625-A3F2-A585BA7A1198}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B1A38DDE-5534-4625-A3F2-A585BA7A1198}.Debug|Any CPU.Build.0 = Debug|Any CPU {B1A38DDE-5534-4625-A3F2-A585BA7A1198}.Debug|x64.ActiveCfg = Debug|Any CPU {B1A38DDE-5534-4625-A3F2-A585BA7A1198}.Debug|x64.Build.0 = Debug|Any CPU {B1A38DDE-5534-4625-A3F2-A585BA7A1198}.Debug|x86.ActiveCfg = Debug|Any CPU {B1A38DDE-5534-4625-A3F2-A585BA7A1198}.Debug|x86.Build.0 = Debug|Any CPU - {B1A38DDE-5534-4625-A3F2-A585BA7A1198}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B1A38DDE-5534-4625-A3F2-A585BA7A1198}.Release|Any CPU.Build.0 = Release|Any CPU - {B1A38DDE-5534-4625-A3F2-A585BA7A1198}.Release|x64.ActiveCfg = Release|Any CPU - {B1A38DDE-5534-4625-A3F2-A585BA7A1198}.Release|x64.Build.0 = Release|Any CPU - {B1A38DDE-5534-4625-A3F2-A585BA7A1198}.Release|x86.ActiveCfg = Release|Any CPU - {B1A38DDE-5534-4625-A3F2-A585BA7A1198}.Release|x86.Build.0 = Release|Any CPU {B1A38DDE-5534-4625-A3F2-A585BA7A1198}.ReleaseMono|Any CPU.ActiveCfg = Debug|Any CPU {B1A38DDE-5534-4625-A3F2-A585BA7A1198}.ReleaseMono|Any CPU.Build.0 = Debug|Any CPU {B1A38DDE-5534-4625-A3F2-A585BA7A1198}.ReleaseMono|x64.ActiveCfg = Debug|Any CPU {B1A38DDE-5534-4625-A3F2-A585BA7A1198}.ReleaseMono|x64.Build.0 = Debug|Any CPU {B1A38DDE-5534-4625-A3F2-A585BA7A1198}.ReleaseMono|x86.ActiveCfg = Debug|Any CPU {B1A38DDE-5534-4625-A3F2-A585BA7A1198}.ReleaseMono|x86.Build.0 = Debug|Any CPU + {B1A38DDE-5534-4625-A3F2-A585BA7A1198}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B1A38DDE-5534-4625-A3F2-A585BA7A1198}.Release|Any CPU.Build.0 = Release|Any CPU + {B1A38DDE-5534-4625-A3F2-A585BA7A1198}.Release|x64.ActiveCfg = Release|Any CPU + {B1A38DDE-5534-4625-A3F2-A585BA7A1198}.Release|x64.Build.0 = Release|Any CPU + {B1A38DDE-5534-4625-A3F2-A585BA7A1198}.Release|x86.ActiveCfg = Release|Any CPU + {B1A38DDE-5534-4625-A3F2-A585BA7A1198}.Release|x86.Build.0 = Release|Any CPU {8698E0C2-1A82-43E6-8A26-3D9A825CF574}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8698E0C2-1A82-43E6-8A26-3D9A825CF574}.Debug|Any CPU.Build.0 = Debug|Any CPU {8698E0C2-1A82-43E6-8A26-3D9A825CF574}.Debug|x64.ActiveCfg = Debug|Any CPU {8698E0C2-1A82-43E6-8A26-3D9A825CF574}.Debug|x64.Build.0 = Debug|Any CPU {8698E0C2-1A82-43E6-8A26-3D9A825CF574}.Debug|x86.ActiveCfg = Debug|Any CPU {8698E0C2-1A82-43E6-8A26-3D9A825CF574}.Debug|x86.Build.0 = Debug|Any CPU - {8698E0C2-1A82-43E6-8A26-3D9A825CF574}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8698E0C2-1A82-43E6-8A26-3D9A825CF574}.Release|Any CPU.Build.0 = Release|Any CPU - {8698E0C2-1A82-43E6-8A26-3D9A825CF574}.Release|x64.ActiveCfg = Release|Any CPU - {8698E0C2-1A82-43E6-8A26-3D9A825CF574}.Release|x64.Build.0 = Release|Any CPU - {8698E0C2-1A82-43E6-8A26-3D9A825CF574}.Release|x86.ActiveCfg = Release|Any CPU - {8698E0C2-1A82-43E6-8A26-3D9A825CF574}.Release|x86.Build.0 = Release|Any CPU {8698E0C2-1A82-43E6-8A26-3D9A825CF574}.ReleaseMono|Any CPU.ActiveCfg = Debug|Any CPU {8698E0C2-1A82-43E6-8A26-3D9A825CF574}.ReleaseMono|Any CPU.Build.0 = Debug|Any CPU {8698E0C2-1A82-43E6-8A26-3D9A825CF574}.ReleaseMono|x64.ActiveCfg = Debug|Any CPU {8698E0C2-1A82-43E6-8A26-3D9A825CF574}.ReleaseMono|x64.Build.0 = Debug|Any CPU {8698E0C2-1A82-43E6-8A26-3D9A825CF574}.ReleaseMono|x86.ActiveCfg = Debug|Any CPU {8698E0C2-1A82-43E6-8A26-3D9A825CF574}.ReleaseMono|x86.Build.0 = Debug|Any CPU + {8698E0C2-1A82-43E6-8A26-3D9A825CF574}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8698E0C2-1A82-43E6-8A26-3D9A825CF574}.Release|Any CPU.Build.0 = Release|Any CPU + {8698E0C2-1A82-43E6-8A26-3D9A825CF574}.Release|x64.ActiveCfg = Release|Any CPU + {8698E0C2-1A82-43E6-8A26-3D9A825CF574}.Release|x64.Build.0 = Release|Any CPU + {8698E0C2-1A82-43E6-8A26-3D9A825CF574}.Release|x86.ActiveCfg = Release|Any CPU + {8698E0C2-1A82-43E6-8A26-3D9A825CF574}.Release|x86.Build.0 = Release|Any CPU {F782BC86-9CE6-4F69-8F77-710A399CB54F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F782BC86-9CE6-4F69-8F77-710A399CB54F}.Debug|Any CPU.Build.0 = Debug|Any CPU {F782BC86-9CE6-4F69-8F77-710A399CB54F}.Debug|x64.ActiveCfg = Debug|Any CPU {F782BC86-9CE6-4F69-8F77-710A399CB54F}.Debug|x64.Build.0 = Debug|Any CPU {F782BC86-9CE6-4F69-8F77-710A399CB54F}.Debug|x86.ActiveCfg = Debug|Any CPU {F782BC86-9CE6-4F69-8F77-710A399CB54F}.Debug|x86.Build.0 = Debug|Any CPU - {F782BC86-9CE6-4F69-8F77-710A399CB54F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F782BC86-9CE6-4F69-8F77-710A399CB54F}.Release|Any CPU.Build.0 = Release|Any CPU - {F782BC86-9CE6-4F69-8F77-710A399CB54F}.Release|x64.ActiveCfg = Release|Any CPU - {F782BC86-9CE6-4F69-8F77-710A399CB54F}.Release|x64.Build.0 = Release|Any CPU - {F782BC86-9CE6-4F69-8F77-710A399CB54F}.Release|x86.ActiveCfg = Release|Any CPU - {F782BC86-9CE6-4F69-8F77-710A399CB54F}.Release|x86.Build.0 = Release|Any CPU {F782BC86-9CE6-4F69-8F77-710A399CB54F}.ReleaseMono|Any CPU.ActiveCfg = Debug|Any CPU {F782BC86-9CE6-4F69-8F77-710A399CB54F}.ReleaseMono|Any CPU.Build.0 = Debug|Any CPU {F782BC86-9CE6-4F69-8F77-710A399CB54F}.ReleaseMono|x64.ActiveCfg = Debug|Any CPU {F782BC86-9CE6-4F69-8F77-710A399CB54F}.ReleaseMono|x64.Build.0 = Debug|Any CPU {F782BC86-9CE6-4F69-8F77-710A399CB54F}.ReleaseMono|x86.ActiveCfg = Debug|Any CPU {F782BC86-9CE6-4F69-8F77-710A399CB54F}.ReleaseMono|x86.Build.0 = Debug|Any CPU + {F782BC86-9CE6-4F69-8F77-710A399CB54F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F782BC86-9CE6-4F69-8F77-710A399CB54F}.Release|Any CPU.Build.0 = Release|Any CPU + {F782BC86-9CE6-4F69-8F77-710A399CB54F}.Release|x64.ActiveCfg = Release|Any CPU + {F782BC86-9CE6-4F69-8F77-710A399CB54F}.Release|x64.Build.0 = Release|Any CPU + {F782BC86-9CE6-4F69-8F77-710A399CB54F}.Release|x86.ActiveCfg = Release|Any CPU + {F782BC86-9CE6-4F69-8F77-710A399CB54F}.Release|x86.Build.0 = Release|Any CPU {763BAD3E-3244-4E8F-8182-2BF35774262A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {763BAD3E-3244-4E8F-8182-2BF35774262A}.Debug|Any CPU.Build.0 = Debug|Any CPU {763BAD3E-3244-4E8F-8182-2BF35774262A}.Debug|x64.ActiveCfg = Debug|Any CPU {763BAD3E-3244-4E8F-8182-2BF35774262A}.Debug|x64.Build.0 = Debug|Any CPU {763BAD3E-3244-4E8F-8182-2BF35774262A}.Debug|x86.ActiveCfg = Debug|Any CPU {763BAD3E-3244-4E8F-8182-2BF35774262A}.Debug|x86.Build.0 = Debug|Any CPU - {763BAD3E-3244-4E8F-8182-2BF35774262A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {763BAD3E-3244-4E8F-8182-2BF35774262A}.Release|Any CPU.Build.0 = Release|Any CPU - {763BAD3E-3244-4E8F-8182-2BF35774262A}.Release|x64.ActiveCfg = Release|Any CPU - {763BAD3E-3244-4E8F-8182-2BF35774262A}.Release|x64.Build.0 = Release|Any CPU - {763BAD3E-3244-4E8F-8182-2BF35774262A}.Release|x86.ActiveCfg = Release|Any CPU - {763BAD3E-3244-4E8F-8182-2BF35774262A}.Release|x86.Build.0 = Release|Any CPU {763BAD3E-3244-4E8F-8182-2BF35774262A}.ReleaseMono|Any CPU.ActiveCfg = Debug|Any CPU {763BAD3E-3244-4E8F-8182-2BF35774262A}.ReleaseMono|Any CPU.Build.0 = Debug|Any CPU {763BAD3E-3244-4E8F-8182-2BF35774262A}.ReleaseMono|x64.ActiveCfg = Debug|Any CPU {763BAD3E-3244-4E8F-8182-2BF35774262A}.ReleaseMono|x64.Build.0 = Debug|Any CPU {763BAD3E-3244-4E8F-8182-2BF35774262A}.ReleaseMono|x86.ActiveCfg = Debug|Any CPU {763BAD3E-3244-4E8F-8182-2BF35774262A}.ReleaseMono|x86.Build.0 = Debug|Any CPU + {763BAD3E-3244-4E8F-8182-2BF35774262A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {763BAD3E-3244-4E8F-8182-2BF35774262A}.Release|Any CPU.Build.0 = Release|Any CPU + {763BAD3E-3244-4E8F-8182-2BF35774262A}.Release|x64.ActiveCfg = Release|Any CPU + {763BAD3E-3244-4E8F-8182-2BF35774262A}.Release|x64.Build.0 = Release|Any CPU + {763BAD3E-3244-4E8F-8182-2BF35774262A}.Release|x86.ActiveCfg = Release|Any CPU + {763BAD3E-3244-4E8F-8182-2BF35774262A}.Release|x86.Build.0 = Release|Any CPU {2BC01C4C-288B-4768-BAD0-9BC441D82505}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2BC01C4C-288B-4768-BAD0-9BC441D82505}.Debug|Any CPU.Build.0 = Debug|Any CPU {2BC01C4C-288B-4768-BAD0-9BC441D82505}.Debug|x64.ActiveCfg = Debug|Any CPU {2BC01C4C-288B-4768-BAD0-9BC441D82505}.Debug|x64.Build.0 = Debug|Any CPU {2BC01C4C-288B-4768-BAD0-9BC441D82505}.Debug|x86.ActiveCfg = Debug|Any CPU {2BC01C4C-288B-4768-BAD0-9BC441D82505}.Debug|x86.Build.0 = Debug|Any CPU - {2BC01C4C-288B-4768-BAD0-9BC441D82505}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2BC01C4C-288B-4768-BAD0-9BC441D82505}.Release|Any CPU.Build.0 = Release|Any CPU - {2BC01C4C-288B-4768-BAD0-9BC441D82505}.Release|x64.ActiveCfg = Release|Any CPU - {2BC01C4C-288B-4768-BAD0-9BC441D82505}.Release|x64.Build.0 = Release|Any CPU - {2BC01C4C-288B-4768-BAD0-9BC441D82505}.Release|x86.ActiveCfg = Release|Any CPU - {2BC01C4C-288B-4768-BAD0-9BC441D82505}.Release|x86.Build.0 = Release|Any CPU {2BC01C4C-288B-4768-BAD0-9BC441D82505}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU {2BC01C4C-288B-4768-BAD0-9BC441D82505}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU {2BC01C4C-288B-4768-BAD0-9BC441D82505}.ReleaseMono|x64.ActiveCfg = Release|Any CPU {2BC01C4C-288B-4768-BAD0-9BC441D82505}.ReleaseMono|x64.Build.0 = Release|Any CPU {2BC01C4C-288B-4768-BAD0-9BC441D82505}.ReleaseMono|x86.ActiveCfg = Release|Any CPU {2BC01C4C-288B-4768-BAD0-9BC441D82505}.ReleaseMono|x86.Build.0 = Release|Any CPU + {2BC01C4C-288B-4768-BAD0-9BC441D82505}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2BC01C4C-288B-4768-BAD0-9BC441D82505}.Release|Any CPU.Build.0 = Release|Any CPU + {2BC01C4C-288B-4768-BAD0-9BC441D82505}.Release|x64.ActiveCfg = Release|Any CPU + {2BC01C4C-288B-4768-BAD0-9BC441D82505}.Release|x64.Build.0 = Release|Any CPU + {2BC01C4C-288B-4768-BAD0-9BC441D82505}.Release|x86.ActiveCfg = Release|Any CPU + {2BC01C4C-288B-4768-BAD0-9BC441D82505}.Release|x86.Build.0 = Release|Any CPU {DDD598B2-005F-4CB2-B26B-A40CC0F9DE8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DDD598B2-005F-4CB2-B26B-A40CC0F9DE8E}.Debug|Any CPU.Build.0 = Debug|Any CPU {DDD598B2-005F-4CB2-B26B-A40CC0F9DE8E}.Debug|x64.ActiveCfg = Debug|Any CPU {DDD598B2-005F-4CB2-B26B-A40CC0F9DE8E}.Debug|x64.Build.0 = Debug|Any CPU {DDD598B2-005F-4CB2-B26B-A40CC0F9DE8E}.Debug|x86.ActiveCfg = Debug|Any CPU {DDD598B2-005F-4CB2-B26B-A40CC0F9DE8E}.Debug|x86.Build.0 = Debug|Any CPU - {DDD598B2-005F-4CB2-B26B-A40CC0F9DE8E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DDD598B2-005F-4CB2-B26B-A40CC0F9DE8E}.Release|Any CPU.Build.0 = Release|Any CPU - {DDD598B2-005F-4CB2-B26B-A40CC0F9DE8E}.Release|x64.ActiveCfg = Release|Any CPU - {DDD598B2-005F-4CB2-B26B-A40CC0F9DE8E}.Release|x64.Build.0 = Release|Any CPU - {DDD598B2-005F-4CB2-B26B-A40CC0F9DE8E}.Release|x86.ActiveCfg = Release|Any CPU - {DDD598B2-005F-4CB2-B26B-A40CC0F9DE8E}.Release|x86.Build.0 = Release|Any CPU {DDD598B2-005F-4CB2-B26B-A40CC0F9DE8E}.ReleaseMono|Any CPU.ActiveCfg = Debug|Any CPU {DDD598B2-005F-4CB2-B26B-A40CC0F9DE8E}.ReleaseMono|Any CPU.Build.0 = Debug|Any CPU {DDD598B2-005F-4CB2-B26B-A40CC0F9DE8E}.ReleaseMono|x64.ActiveCfg = Debug|Any CPU {DDD598B2-005F-4CB2-B26B-A40CC0F9DE8E}.ReleaseMono|x64.Build.0 = Debug|Any CPU {DDD598B2-005F-4CB2-B26B-A40CC0F9DE8E}.ReleaseMono|x86.ActiveCfg = Debug|Any CPU {DDD598B2-005F-4CB2-B26B-A40CC0F9DE8E}.ReleaseMono|x86.Build.0 = Debug|Any CPU + {DDD598B2-005F-4CB2-B26B-A40CC0F9DE8E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DDD598B2-005F-4CB2-B26B-A40CC0F9DE8E}.Release|Any CPU.Build.0 = Release|Any CPU + {DDD598B2-005F-4CB2-B26B-A40CC0F9DE8E}.Release|x64.ActiveCfg = Release|Any CPU + {DDD598B2-005F-4CB2-B26B-A40CC0F9DE8E}.Release|x64.Build.0 = Release|Any CPU + {DDD598B2-005F-4CB2-B26B-A40CC0F9DE8E}.Release|x86.ActiveCfg = Release|Any CPU + {DDD598B2-005F-4CB2-B26B-A40CC0F9DE8E}.Release|x86.Build.0 = Release|Any CPU {5B2BF317-7315-431F-A854-488CD541F42E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5B2BF317-7315-431F-A854-488CD541F42E}.Debug|Any CPU.Build.0 = Debug|Any CPU {5B2BF317-7315-431F-A854-488CD541F42E}.Debug|x64.ActiveCfg = Debug|Any CPU {5B2BF317-7315-431F-A854-488CD541F42E}.Debug|x64.Build.0 = Debug|Any CPU {5B2BF317-7315-431F-A854-488CD541F42E}.Debug|x86.ActiveCfg = Debug|Any CPU {5B2BF317-7315-431F-A854-488CD541F42E}.Debug|x86.Build.0 = Debug|Any CPU - {5B2BF317-7315-431F-A854-488CD541F42E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5B2BF317-7315-431F-A854-488CD541F42E}.Release|Any CPU.Build.0 = Release|Any CPU - {5B2BF317-7315-431F-A854-488CD541F42E}.Release|x64.ActiveCfg = Release|Any CPU - {5B2BF317-7315-431F-A854-488CD541F42E}.Release|x64.Build.0 = Release|Any CPU - {5B2BF317-7315-431F-A854-488CD541F42E}.Release|x86.ActiveCfg = Release|Any CPU - {5B2BF317-7315-431F-A854-488CD541F42E}.Release|x86.Build.0 = Release|Any CPU {5B2BF317-7315-431F-A854-488CD541F42E}.ReleaseMono|Any CPU.ActiveCfg = Debug|Any CPU {5B2BF317-7315-431F-A854-488CD541F42E}.ReleaseMono|Any CPU.Build.0 = Debug|Any CPU {5B2BF317-7315-431F-A854-488CD541F42E}.ReleaseMono|x64.ActiveCfg = Debug|Any CPU {5B2BF317-7315-431F-A854-488CD541F42E}.ReleaseMono|x64.Build.0 = Debug|Any CPU {5B2BF317-7315-431F-A854-488CD541F42E}.ReleaseMono|x86.ActiveCfg = Debug|Any CPU {5B2BF317-7315-431F-A854-488CD541F42E}.ReleaseMono|x86.Build.0 = Debug|Any CPU + {5B2BF317-7315-431F-A854-488CD541F42E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5B2BF317-7315-431F-A854-488CD541F42E}.Release|Any CPU.Build.0 = Release|Any CPU + {5B2BF317-7315-431F-A854-488CD541F42E}.Release|x64.ActiveCfg = Release|Any CPU + {5B2BF317-7315-431F-A854-488CD541F42E}.Release|x64.Build.0 = Release|Any CPU + {5B2BF317-7315-431F-A854-488CD541F42E}.Release|x86.ActiveCfg = Release|Any CPU + {5B2BF317-7315-431F-A854-488CD541F42E}.Release|x86.Build.0 = Release|Any CPU {896946A7-35AB-40D0-972C-CED7A448B97A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {896946A7-35AB-40D0-972C-CED7A448B97A}.Debug|Any CPU.Build.0 = Debug|Any CPU {896946A7-35AB-40D0-972C-CED7A448B97A}.Debug|x64.ActiveCfg = Debug|Any CPU {896946A7-35AB-40D0-972C-CED7A448B97A}.Debug|x64.Build.0 = Debug|Any CPU {896946A7-35AB-40D0-972C-CED7A448B97A}.Debug|x86.ActiveCfg = Debug|Any CPU {896946A7-35AB-40D0-972C-CED7A448B97A}.Debug|x86.Build.0 = Debug|Any CPU - {896946A7-35AB-40D0-972C-CED7A448B97A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {896946A7-35AB-40D0-972C-CED7A448B97A}.Release|Any CPU.Build.0 = Release|Any CPU - {896946A7-35AB-40D0-972C-CED7A448B97A}.Release|x64.ActiveCfg = Release|Any CPU - {896946A7-35AB-40D0-972C-CED7A448B97A}.Release|x64.Build.0 = Release|Any CPU - {896946A7-35AB-40D0-972C-CED7A448B97A}.Release|x86.ActiveCfg = Release|Any CPU - {896946A7-35AB-40D0-972C-CED7A448B97A}.Release|x86.Build.0 = Release|Any CPU {896946A7-35AB-40D0-972C-CED7A448B97A}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU {896946A7-35AB-40D0-972C-CED7A448B97A}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU {896946A7-35AB-40D0-972C-CED7A448B97A}.ReleaseMono|x64.ActiveCfg = Release|Any CPU {896946A7-35AB-40D0-972C-CED7A448B97A}.ReleaseMono|x64.Build.0 = Release|Any CPU {896946A7-35AB-40D0-972C-CED7A448B97A}.ReleaseMono|x86.ActiveCfg = Release|Any CPU {896946A7-35AB-40D0-972C-CED7A448B97A}.ReleaseMono|x86.Build.0 = Release|Any CPU + {896946A7-35AB-40D0-972C-CED7A448B97A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {896946A7-35AB-40D0-972C-CED7A448B97A}.Release|Any CPU.Build.0 = Release|Any CPU + {896946A7-35AB-40D0-972C-CED7A448B97A}.Release|x64.ActiveCfg = Release|Any CPU + {896946A7-35AB-40D0-972C-CED7A448B97A}.Release|x64.Build.0 = Release|Any CPU + {896946A7-35AB-40D0-972C-CED7A448B97A}.Release|x86.ActiveCfg = Release|Any CPU + {896946A7-35AB-40D0-972C-CED7A448B97A}.Release|x86.Build.0 = Release|Any CPU {C7EFF544-391C-488F-A747-2663AFEED250}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C7EFF544-391C-488F-A747-2663AFEED250}.Debug|Any CPU.Build.0 = Debug|Any CPU {C7EFF544-391C-488F-A747-2663AFEED250}.Debug|x64.ActiveCfg = Debug|Any CPU {C7EFF544-391C-488F-A747-2663AFEED250}.Debug|x64.Build.0 = Debug|Any CPU {C7EFF544-391C-488F-A747-2663AFEED250}.Debug|x86.ActiveCfg = Debug|Any CPU {C7EFF544-391C-488F-A747-2663AFEED250}.Debug|x86.Build.0 = Debug|Any CPU - {C7EFF544-391C-488F-A747-2663AFEED250}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C7EFF544-391C-488F-A747-2663AFEED250}.Release|Any CPU.Build.0 = Release|Any CPU - {C7EFF544-391C-488F-A747-2663AFEED250}.Release|x64.ActiveCfg = Release|Any CPU - {C7EFF544-391C-488F-A747-2663AFEED250}.Release|x64.Build.0 = Release|Any CPU - {C7EFF544-391C-488F-A747-2663AFEED250}.Release|x86.ActiveCfg = Release|Any CPU - {C7EFF544-391C-488F-A747-2663AFEED250}.Release|x86.Build.0 = Release|Any CPU {C7EFF544-391C-488F-A747-2663AFEED250}.ReleaseMono|Any CPU.ActiveCfg = Release|Any CPU {C7EFF544-391C-488F-A747-2663AFEED250}.ReleaseMono|Any CPU.Build.0 = Release|Any CPU {C7EFF544-391C-488F-A747-2663AFEED250}.ReleaseMono|x64.ActiveCfg = Release|Any CPU {C7EFF544-391C-488F-A747-2663AFEED250}.ReleaseMono|x64.Build.0 = Release|Any CPU {C7EFF544-391C-488F-A747-2663AFEED250}.ReleaseMono|x86.ActiveCfg = Release|Any CPU {C7EFF544-391C-488F-A747-2663AFEED250}.ReleaseMono|x86.Build.0 = Release|Any CPU + {C7EFF544-391C-488F-A747-2663AFEED250}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C7EFF544-391C-488F-A747-2663AFEED250}.Release|Any CPU.Build.0 = Release|Any CPU + {C7EFF544-391C-488F-A747-2663AFEED250}.Release|x64.ActiveCfg = Release|Any CPU + {C7EFF544-391C-488F-A747-2663AFEED250}.Release|x64.Build.0 = Release|Any CPU + {C7EFF544-391C-488F-A747-2663AFEED250}.Release|x86.ActiveCfg = Release|Any CPU + {C7EFF544-391C-488F-A747-2663AFEED250}.Release|x86.Build.0 = Release|Any CPU {CF31204A-12CF-43C0-9054-B9AF98EC83BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CF31204A-12CF-43C0-9054-B9AF98EC83BD}.Debug|Any CPU.Build.0 = Debug|Any CPU {CF31204A-12CF-43C0-9054-B9AF98EC83BD}.Debug|x64.ActiveCfg = Debug|Any CPU {CF31204A-12CF-43C0-9054-B9AF98EC83BD}.Debug|x64.Build.0 = Debug|Any CPU {CF31204A-12CF-43C0-9054-B9AF98EC83BD}.Debug|x86.ActiveCfg = Debug|Any CPU {CF31204A-12CF-43C0-9054-B9AF98EC83BD}.Debug|x86.Build.0 = Debug|Any CPU - {CF31204A-12CF-43C0-9054-B9AF98EC83BD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CF31204A-12CF-43C0-9054-B9AF98EC83BD}.Release|Any CPU.Build.0 = Release|Any CPU - {CF31204A-12CF-43C0-9054-B9AF98EC83BD}.Release|x64.ActiveCfg = Release|Any CPU - {CF31204A-12CF-43C0-9054-B9AF98EC83BD}.Release|x64.Build.0 = Release|Any CPU - {CF31204A-12CF-43C0-9054-B9AF98EC83BD}.Release|x86.ActiveCfg = Release|Any CPU - {CF31204A-12CF-43C0-9054-B9AF98EC83BD}.Release|x86.Build.0 = Release|Any CPU {CF31204A-12CF-43C0-9054-B9AF98EC83BD}.ReleaseMono|Any CPU.ActiveCfg = Debug|Any CPU {CF31204A-12CF-43C0-9054-B9AF98EC83BD}.ReleaseMono|Any CPU.Build.0 = Debug|Any CPU {CF31204A-12CF-43C0-9054-B9AF98EC83BD}.ReleaseMono|x64.ActiveCfg = Debug|Any CPU {CF31204A-12CF-43C0-9054-B9AF98EC83BD}.ReleaseMono|x64.Build.0 = Debug|Any CPU {CF31204A-12CF-43C0-9054-B9AF98EC83BD}.ReleaseMono|x86.ActiveCfg = Debug|Any CPU {CF31204A-12CF-43C0-9054-B9AF98EC83BD}.ReleaseMono|x86.Build.0 = Debug|Any CPU + {CF31204A-12CF-43C0-9054-B9AF98EC83BD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CF31204A-12CF-43C0-9054-B9AF98EC83BD}.Release|Any CPU.Build.0 = Release|Any CPU + {CF31204A-12CF-43C0-9054-B9AF98EC83BD}.Release|x64.ActiveCfg = Release|Any CPU + {CF31204A-12CF-43C0-9054-B9AF98EC83BD}.Release|x64.Build.0 = Release|Any CPU + {CF31204A-12CF-43C0-9054-B9AF98EC83BD}.Release|x86.ActiveCfg = Release|Any CPU + {CF31204A-12CF-43C0-9054-B9AF98EC83BD}.Release|x86.Build.0 = Release|Any CPU {97F29346-636E-4BCA-B33D-6D0DB26A5AA6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {97F29346-636E-4BCA-B33D-6D0DB26A5AA6}.Debug|Any CPU.Build.0 = Debug|Any CPU {97F29346-636E-4BCA-B33D-6D0DB26A5AA6}.Debug|x64.ActiveCfg = Debug|Any CPU {97F29346-636E-4BCA-B33D-6D0DB26A5AA6}.Debug|x64.Build.0 = Debug|Any CPU {97F29346-636E-4BCA-B33D-6D0DB26A5AA6}.Debug|x86.ActiveCfg = Debug|Any CPU {97F29346-636E-4BCA-B33D-6D0DB26A5AA6}.Debug|x86.Build.0 = Debug|Any CPU - {97F29346-636E-4BCA-B33D-6D0DB26A5AA6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {97F29346-636E-4BCA-B33D-6D0DB26A5AA6}.Release|Any CPU.Build.0 = Release|Any CPU - {97F29346-636E-4BCA-B33D-6D0DB26A5AA6}.Release|x64.ActiveCfg = Release|Any CPU - {97F29346-636E-4BCA-B33D-6D0DB26A5AA6}.Release|x64.Build.0 = Release|Any CPU - {97F29346-636E-4BCA-B33D-6D0DB26A5AA6}.Release|x86.ActiveCfg = Release|Any CPU - {97F29346-636E-4BCA-B33D-6D0DB26A5AA6}.Release|x86.Build.0 = Release|Any CPU {97F29346-636E-4BCA-B33D-6D0DB26A5AA6}.ReleaseMono|Any CPU.ActiveCfg = Debug|Any CPU {97F29346-636E-4BCA-B33D-6D0DB26A5AA6}.ReleaseMono|Any CPU.Build.0 = Debug|Any CPU {97F29346-636E-4BCA-B33D-6D0DB26A5AA6}.ReleaseMono|x64.ActiveCfg = Debug|Any CPU {97F29346-636E-4BCA-B33D-6D0DB26A5AA6}.ReleaseMono|x64.Build.0 = Debug|Any CPU {97F29346-636E-4BCA-B33D-6D0DB26A5AA6}.ReleaseMono|x86.ActiveCfg = Debug|Any CPU {97F29346-636E-4BCA-B33D-6D0DB26A5AA6}.ReleaseMono|x86.Build.0 = Debug|Any CPU + {97F29346-636E-4BCA-B33D-6D0DB26A5AA6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {97F29346-636E-4BCA-B33D-6D0DB26A5AA6}.Release|Any CPU.Build.0 = Release|Any CPU + {97F29346-636E-4BCA-B33D-6D0DB26A5AA6}.Release|x64.ActiveCfg = Release|Any CPU + {97F29346-636E-4BCA-B33D-6D0DB26A5AA6}.Release|x64.Build.0 = Release|Any CPU + {97F29346-636E-4BCA-B33D-6D0DB26A5AA6}.Release|x86.ActiveCfg = Release|Any CPU + {97F29346-636E-4BCA-B33D-6D0DB26A5AA6}.Release|x86.Build.0 = Release|Any CPU {46C1A70D-D1DE-4173-A8C0-00F680F026E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {46C1A70D-D1DE-4173-A8C0-00F680F026E3}.Debug|Any CPU.Build.0 = Debug|Any CPU {46C1A70D-D1DE-4173-A8C0-00F680F026E3}.Debug|x64.ActiveCfg = Debug|Any CPU {46C1A70D-D1DE-4173-A8C0-00F680F026E3}.Debug|x64.Build.0 = Debug|Any CPU {46C1A70D-D1DE-4173-A8C0-00F680F026E3}.Debug|x86.ActiveCfg = Debug|Any CPU {46C1A70D-D1DE-4173-A8C0-00F680F026E3}.Debug|x86.Build.0 = Debug|Any CPU - {46C1A70D-D1DE-4173-A8C0-00F680F026E3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {46C1A70D-D1DE-4173-A8C0-00F680F026E3}.Release|Any CPU.Build.0 = Release|Any CPU - {46C1A70D-D1DE-4173-A8C0-00F680F026E3}.Release|x64.ActiveCfg = Release|Any CPU - {46C1A70D-D1DE-4173-A8C0-00F680F026E3}.Release|x64.Build.0 = Release|Any CPU - {46C1A70D-D1DE-4173-A8C0-00F680F026E3}.Release|x86.ActiveCfg = Release|Any CPU - {46C1A70D-D1DE-4173-A8C0-00F680F026E3}.Release|x86.Build.0 = Release|Any CPU {46C1A70D-D1DE-4173-A8C0-00F680F026E3}.ReleaseMono|Any CPU.ActiveCfg = Debug|Any CPU {46C1A70D-D1DE-4173-A8C0-00F680F026E3}.ReleaseMono|Any CPU.Build.0 = Debug|Any CPU {46C1A70D-D1DE-4173-A8C0-00F680F026E3}.ReleaseMono|x64.ActiveCfg = Debug|Any CPU {46C1A70D-D1DE-4173-A8C0-00F680F026E3}.ReleaseMono|x64.Build.0 = Debug|Any CPU {46C1A70D-D1DE-4173-A8C0-00F680F026E3}.ReleaseMono|x86.ActiveCfg = Debug|Any CPU {46C1A70D-D1DE-4173-A8C0-00F680F026E3}.ReleaseMono|x86.Build.0 = Debug|Any CPU + {46C1A70D-D1DE-4173-A8C0-00F680F026E3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {46C1A70D-D1DE-4173-A8C0-00F680F026E3}.Release|Any CPU.Build.0 = Release|Any CPU + {46C1A70D-D1DE-4173-A8C0-00F680F026E3}.Release|x64.ActiveCfg = Release|Any CPU + {46C1A70D-D1DE-4173-A8C0-00F680F026E3}.Release|x64.Build.0 = Release|Any CPU + {46C1A70D-D1DE-4173-A8C0-00F680F026E3}.Release|x86.ActiveCfg = Release|Any CPU + {46C1A70D-D1DE-4173-A8C0-00F680F026E3}.Release|x86.Build.0 = Release|Any CPU {2CBD3BE8-9DBF-483D-8E38-88E9DBC86D91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2CBD3BE8-9DBF-483D-8E38-88E9DBC86D91}.Debug|Any CPU.Build.0 = Debug|Any CPU {2CBD3BE8-9DBF-483D-8E38-88E9DBC86D91}.Debug|x64.ActiveCfg = Debug|Any CPU {2CBD3BE8-9DBF-483D-8E38-88E9DBC86D91}.Debug|x64.Build.0 = Debug|Any CPU {2CBD3BE8-9DBF-483D-8E38-88E9DBC86D91}.Debug|x86.ActiveCfg = Debug|Any CPU {2CBD3BE8-9DBF-483D-8E38-88E9DBC86D91}.Debug|x86.Build.0 = Debug|Any CPU - {2CBD3BE8-9DBF-483D-8E38-88E9DBC86D91}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2CBD3BE8-9DBF-483D-8E38-88E9DBC86D91}.Release|Any CPU.Build.0 = Release|Any CPU - {2CBD3BE8-9DBF-483D-8E38-88E9DBC86D91}.Release|x64.ActiveCfg = Release|Any CPU - {2CBD3BE8-9DBF-483D-8E38-88E9DBC86D91}.Release|x64.Build.0 = Release|Any CPU - {2CBD3BE8-9DBF-483D-8E38-88E9DBC86D91}.Release|x86.ActiveCfg = Release|Any CPU - {2CBD3BE8-9DBF-483D-8E38-88E9DBC86D91}.Release|x86.Build.0 = Release|Any CPU {2CBD3BE8-9DBF-483D-8E38-88E9DBC86D91}.ReleaseMono|Any CPU.ActiveCfg = Debug|Any CPU {2CBD3BE8-9DBF-483D-8E38-88E9DBC86D91}.ReleaseMono|Any CPU.Build.0 = Debug|Any CPU {2CBD3BE8-9DBF-483D-8E38-88E9DBC86D91}.ReleaseMono|x64.ActiveCfg = Debug|Any CPU {2CBD3BE8-9DBF-483D-8E38-88E9DBC86D91}.ReleaseMono|x64.Build.0 = Debug|Any CPU {2CBD3BE8-9DBF-483D-8E38-88E9DBC86D91}.ReleaseMono|x86.ActiveCfg = Debug|Any CPU {2CBD3BE8-9DBF-483D-8E38-88E9DBC86D91}.ReleaseMono|x86.Build.0 = Debug|Any CPU + {2CBD3BE8-9DBF-483D-8E38-88E9DBC86D91}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2CBD3BE8-9DBF-483D-8E38-88E9DBC86D91}.Release|Any CPU.Build.0 = Release|Any CPU + {2CBD3BE8-9DBF-483D-8E38-88E9DBC86D91}.Release|x64.ActiveCfg = Release|Any CPU + {2CBD3BE8-9DBF-483D-8E38-88E9DBC86D91}.Release|x64.Build.0 = Release|Any CPU + {2CBD3BE8-9DBF-483D-8E38-88E9DBC86D91}.Release|x86.ActiveCfg = Release|Any CPU + {2CBD3BE8-9DBF-483D-8E38-88E9DBC86D91}.Release|x86.Build.0 = Release|Any CPU {704BA731-9C70-4CBE-A607-1A2E1FB73753}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {704BA731-9C70-4CBE-A607-1A2E1FB73753}.Debug|Any CPU.Build.0 = Debug|Any CPU {704BA731-9C70-4CBE-A607-1A2E1FB73753}.Debug|x64.ActiveCfg = Debug|Any CPU {704BA731-9C70-4CBE-A607-1A2E1FB73753}.Debug|x64.Build.0 = Debug|Any CPU {704BA731-9C70-4CBE-A607-1A2E1FB73753}.Debug|x86.ActiveCfg = Debug|Any CPU {704BA731-9C70-4CBE-A607-1A2E1FB73753}.Debug|x86.Build.0 = Debug|Any CPU - {704BA731-9C70-4CBE-A607-1A2E1FB73753}.Release|Any CPU.ActiveCfg = Release|Any CPU - {704BA731-9C70-4CBE-A607-1A2E1FB73753}.Release|Any CPU.Build.0 = Release|Any CPU - {704BA731-9C70-4CBE-A607-1A2E1FB73753}.Release|x64.ActiveCfg = Release|Any CPU - {704BA731-9C70-4CBE-A607-1A2E1FB73753}.Release|x64.Build.0 = Release|Any CPU - {704BA731-9C70-4CBE-A607-1A2E1FB73753}.Release|x86.ActiveCfg = Release|Any CPU - {704BA731-9C70-4CBE-A607-1A2E1FB73753}.Release|x86.Build.0 = Release|Any CPU {704BA731-9C70-4CBE-A607-1A2E1FB73753}.ReleaseMono|Any CPU.ActiveCfg = Debug|Any CPU {704BA731-9C70-4CBE-A607-1A2E1FB73753}.ReleaseMono|Any CPU.Build.0 = Debug|Any CPU {704BA731-9C70-4CBE-A607-1A2E1FB73753}.ReleaseMono|x64.ActiveCfg = Debug|Any CPU {704BA731-9C70-4CBE-A607-1A2E1FB73753}.ReleaseMono|x64.Build.0 = Debug|Any CPU {704BA731-9C70-4CBE-A607-1A2E1FB73753}.ReleaseMono|x86.ActiveCfg = Debug|Any CPU {704BA731-9C70-4CBE-A607-1A2E1FB73753}.ReleaseMono|x86.Build.0 = Debug|Any CPU + {704BA731-9C70-4CBE-A607-1A2E1FB73753}.Release|Any CPU.ActiveCfg = Release|Any CPU + {704BA731-9C70-4CBE-A607-1A2E1FB73753}.Release|Any CPU.Build.0 = Release|Any CPU + {704BA731-9C70-4CBE-A607-1A2E1FB73753}.Release|x64.ActiveCfg = Release|Any CPU + {704BA731-9C70-4CBE-A607-1A2E1FB73753}.Release|x64.Build.0 = Release|Any CPU + {704BA731-9C70-4CBE-A607-1A2E1FB73753}.Release|x86.ActiveCfg = Release|Any CPU + {704BA731-9C70-4CBE-A607-1A2E1FB73753}.Release|x86.Build.0 = Release|Any CPU {A0EAD8F0-B7A3-4112-9F3F-2D9922A500BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A0EAD8F0-B7A3-4112-9F3F-2D9922A500BA}.Debug|Any CPU.Build.0 = Debug|Any CPU {A0EAD8F0-B7A3-4112-9F3F-2D9922A500BA}.Debug|x64.ActiveCfg = Debug|Any CPU {A0EAD8F0-B7A3-4112-9F3F-2D9922A500BA}.Debug|x64.Build.0 = Debug|Any CPU {A0EAD8F0-B7A3-4112-9F3F-2D9922A500BA}.Debug|x86.ActiveCfg = Debug|Any CPU {A0EAD8F0-B7A3-4112-9F3F-2D9922A500BA}.Debug|x86.Build.0 = Debug|Any CPU - {A0EAD8F0-B7A3-4112-9F3F-2D9922A500BA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A0EAD8F0-B7A3-4112-9F3F-2D9922A500BA}.Release|Any CPU.Build.0 = Release|Any CPU - {A0EAD8F0-B7A3-4112-9F3F-2D9922A500BA}.Release|x64.ActiveCfg = Release|Any CPU - {A0EAD8F0-B7A3-4112-9F3F-2D9922A500BA}.Release|x64.Build.0 = Release|Any CPU - {A0EAD8F0-B7A3-4112-9F3F-2D9922A500BA}.Release|x86.ActiveCfg = Release|Any CPU - {A0EAD8F0-B7A3-4112-9F3F-2D9922A500BA}.Release|x86.Build.0 = Release|Any CPU {A0EAD8F0-B7A3-4112-9F3F-2D9922A500BA}.ReleaseMono|Any CPU.ActiveCfg = Debug|Any CPU {A0EAD8F0-B7A3-4112-9F3F-2D9922A500BA}.ReleaseMono|Any CPU.Build.0 = Debug|Any CPU {A0EAD8F0-B7A3-4112-9F3F-2D9922A500BA}.ReleaseMono|x64.ActiveCfg = Debug|Any CPU {A0EAD8F0-B7A3-4112-9F3F-2D9922A500BA}.ReleaseMono|x64.Build.0 = Debug|Any CPU {A0EAD8F0-B7A3-4112-9F3F-2D9922A500BA}.ReleaseMono|x86.ActiveCfg = Debug|Any CPU {A0EAD8F0-B7A3-4112-9F3F-2D9922A500BA}.ReleaseMono|x86.Build.0 = Debug|Any CPU + {A0EAD8F0-B7A3-4112-9F3F-2D9922A500BA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A0EAD8F0-B7A3-4112-9F3F-2D9922A500BA}.Release|Any CPU.Build.0 = Release|Any CPU + {A0EAD8F0-B7A3-4112-9F3F-2D9922A500BA}.Release|x64.ActiveCfg = Release|Any CPU + {A0EAD8F0-B7A3-4112-9F3F-2D9922A500BA}.Release|x64.Build.0 = Release|Any CPU + {A0EAD8F0-B7A3-4112-9F3F-2D9922A500BA}.Release|x86.ActiveCfg = Release|Any CPU + {A0EAD8F0-B7A3-4112-9F3F-2D9922A500BA}.Release|x86.Build.0 = Release|Any CPU {C050C5F0-8A40-4CB1-9715-A55EBF94FBF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C050C5F0-8A40-4CB1-9715-A55EBF94FBF2}.Debug|Any CPU.Build.0 = Debug|Any CPU {C050C5F0-8A40-4CB1-9715-A55EBF94FBF2}.Debug|x64.ActiveCfg = Debug|Any CPU {C050C5F0-8A40-4CB1-9715-A55EBF94FBF2}.Debug|x64.Build.0 = Debug|Any CPU {C050C5F0-8A40-4CB1-9715-A55EBF94FBF2}.Debug|x86.ActiveCfg = Debug|Any CPU {C050C5F0-8A40-4CB1-9715-A55EBF94FBF2}.Debug|x86.Build.0 = Debug|Any CPU - {C050C5F0-8A40-4CB1-9715-A55EBF94FBF2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C050C5F0-8A40-4CB1-9715-A55EBF94FBF2}.Release|Any CPU.Build.0 = Release|Any CPU - {C050C5F0-8A40-4CB1-9715-A55EBF94FBF2}.Release|x64.ActiveCfg = Release|Any CPU - {C050C5F0-8A40-4CB1-9715-A55EBF94FBF2}.Release|x64.Build.0 = Release|Any CPU - {C050C5F0-8A40-4CB1-9715-A55EBF94FBF2}.Release|x86.ActiveCfg = Release|Any CPU - {C050C5F0-8A40-4CB1-9715-A55EBF94FBF2}.Release|x86.Build.0 = Release|Any CPU {C050C5F0-8A40-4CB1-9715-A55EBF94FBF2}.ReleaseMono|Any CPU.ActiveCfg = Debug|Any CPU {C050C5F0-8A40-4CB1-9715-A55EBF94FBF2}.ReleaseMono|Any CPU.Build.0 = Debug|Any CPU {C050C5F0-8A40-4CB1-9715-A55EBF94FBF2}.ReleaseMono|x64.ActiveCfg = Debug|Any CPU {C050C5F0-8A40-4CB1-9715-A55EBF94FBF2}.ReleaseMono|x64.Build.0 = Debug|Any CPU {C050C5F0-8A40-4CB1-9715-A55EBF94FBF2}.ReleaseMono|x86.ActiveCfg = Debug|Any CPU {C050C5F0-8A40-4CB1-9715-A55EBF94FBF2}.ReleaseMono|x86.Build.0 = Debug|Any CPU + {C050C5F0-8A40-4CB1-9715-A55EBF94FBF2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C050C5F0-8A40-4CB1-9715-A55EBF94FBF2}.Release|Any CPU.Build.0 = Release|Any CPU + {C050C5F0-8A40-4CB1-9715-A55EBF94FBF2}.Release|x64.ActiveCfg = Release|Any CPU + {C050C5F0-8A40-4CB1-9715-A55EBF94FBF2}.Release|x64.Build.0 = Release|Any CPU + {C050C5F0-8A40-4CB1-9715-A55EBF94FBF2}.Release|x86.ActiveCfg = Release|Any CPU + {C050C5F0-8A40-4CB1-9715-A55EBF94FBF2}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/sdk/node/Libplanet.Node.Executable/Explorer/BlockChainContext.cs b/sdk/node/Libplanet.Node.Executable/Explorer/BlockChainContext.cs new file mode 100644 index 00000000000..7923448a4b1 --- /dev/null +++ b/sdk/node/Libplanet.Node.Executable/Explorer/BlockChainContext.cs @@ -0,0 +1,38 @@ +using System.Reflection; +using Libplanet.Explorer.Indexing; +using Libplanet.Explorer.Interfaces; +using Libplanet.Net; +using Libplanet.Node.Services; +using Libplanet.Store; + +namespace Libplanet.Node.API.Explorer; + +internal sealed class BlockChainContext( + IBlockChainService blockChainService, ISwarmService swarmService) : IBlockChainContext +{ + public bool Preloaded => false; + + public Blockchain.BlockChain BlockChain => blockChainService.BlockChain; + +#pragma warning disable S3011 // Reflection should not be used to increase accessibility ... + public IStore Store + { + get + { + var bindingFlags = BindingFlags.NonPublic | BindingFlags.Instance; + var propertyInfo = typeof(BlockChain).GetProperty("Store", bindingFlags) ?? + throw new InvalidOperationException("Store property not found."); + if (propertyInfo.GetValue(BlockChain) is IStore store) + { + return store; + } + + throw new InvalidOperationException("Store property is not IStore."); + } + } +#pragma warning restore S3011 + + public Swarm Swarm => swarmService.Swarm; + + public IBlockChainIndex Index => throw new NotSupportedException(); +} diff --git a/sdk/node/Libplanet.Node.Executable/Explorer/ExplorerExtensions.cs b/sdk/node/Libplanet.Node.Executable/Explorer/ExplorerExtensions.cs new file mode 100644 index 00000000000..20bc3bc5b08 --- /dev/null +++ b/sdk/node/Libplanet.Node.Executable/Explorer/ExplorerExtensions.cs @@ -0,0 +1,35 @@ +using Libplanet.Explorer; +using Libplanet.Node.Extensions; + +namespace Libplanet.Node.API.Explorer; + +public static class ExplorerExtensions +{ + public static IServiceCollection AddNodeExplorer( + this IServiceCollection services) + { + var serviceProvider = services.BuildServiceProvider(); + + services.AddSingleton(); + services.AddSingleton>(); + serviceProvider = services.BuildServiceProvider(); + var startUp + = serviceProvider.GetRequiredService>(); + startUp.ConfigureServices(services); + + return services; + } + + public static IApplicationBuilder UseNodeExplorer(this IApplicationBuilder builder) + { + var serviceProvider = builder.ApplicationServices; + var environment = serviceProvider.GetRequiredService(); + var startUp = serviceProvider.GetService>(); + startUp?.Configure(builder, environment); + + return builder; + } + + public static bool IsExplorerEnabled(this IHostApplicationBuilder builder) + => builder.Configuration.IsOptionsEnabled(ExplorerOptions.Position); +} diff --git a/sdk/node/Libplanet.Node.Executable/Explorer/ExplorerOptions.cs b/sdk/node/Libplanet.Node.Executable/Explorer/ExplorerOptions.cs new file mode 100644 index 00000000000..f09b95a6832 --- /dev/null +++ b/sdk/node/Libplanet.Node.Executable/Explorer/ExplorerOptions.cs @@ -0,0 +1,13 @@ +using System.ComponentModel; +using Libplanet.Node.Options; + +namespace Libplanet.Node.API.Explorer; + +[Options(Position)] +public sealed class ExplorerOptions : OptionsBase, IEnabledOptions +{ + public const string Position = "Explorer"; + + [DefaultValue(true)] + public bool IsEnabled { get; set; } = true; +} diff --git a/sdk/node/Libplanet.Node.Executable/Libplanet.Node.Executable.csproj b/sdk/node/Libplanet.Node.Executable/Libplanet.Node.Executable.csproj index 111f562660f..b5d9a52806a 100644 --- a/sdk/node/Libplanet.Node.Executable/Libplanet.Node.Executable.csproj +++ b/sdk/node/Libplanet.Node.Executable/Libplanet.Node.Executable.csproj @@ -12,6 +12,10 @@ + + + + @@ -21,6 +25,7 @@ + diff --git a/sdk/node/Libplanet.Node.Executable/Program.cs b/sdk/node/Libplanet.Node.Executable/Program.cs index 2d95e1c6fb1..fa3c5761fc4 100644 --- a/sdk/node/Libplanet.Node.Executable/Program.cs +++ b/sdk/node/Libplanet.Node.Executable/Program.cs @@ -1,13 +1,10 @@ +using Libplanet.Node.API.Explorer; using Libplanet.Node.API.Services; using Libplanet.Node.Extensions; -using Libplanet.Node.Options.Schema; using Microsoft.AspNetCore.Server.Kestrel.Core; -SynchronizationContext.SetSynchronizationContext(new()); var builder = WebApplication.CreateBuilder(args); - builder.Logging.AddConsole(); - if (builder.Environment.IsDevelopment()) { builder.WebHost.ConfigureKestrel(options => @@ -15,34 +12,48 @@ // Setup a HTTP/2 endpoint without TLS. options.ListenLocalhost(5259, o => o.Protocols = HttpProtocols.Http1AndHttp2); + options.ListenLocalhost(5260, o => o.Protocols = + HttpProtocols.Http2); }); -} -// Additional configuration is required to successfully run gRPC on macOS. -// For instructions on how to configure Kestrel and gRPC clients on macOS, -// visit https://go.microsoft.com/fwlink/?linkid=2099682 + builder.Services.AddEndpointsApiExplorer(); + builder.Services.AddSwaggerGen(); + builder.Services.AddAuthorization(); + builder.Services.AddAuthentication("Bearer").AddJwtBearer(); +} -// Add services to the container. builder.Services.AddGrpc(); builder.Services.AddGrpcReflection(); -var libplanetBuilder = builder.Services.AddLibplanetNode(builder.Configuration); +builder.Services.AddLibplanetNode(builder.Configuration); + +if (builder.IsExplorerEnabled()) +{ + builder.Services.AddNodeExplorer(); +} -var app = builder.Build(); var handlerMessage = """ Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909 """; -var schema = await OptionsSchemaBuilder.GetSchemaAsync(default); +using var app = builder.Build(); -// Configure the HTTP request pipeline. -app.MapGrpcService(); -app.MapGrpcService(); +app.MapGrpcService(); +app.MapGrpcService(); app.MapGet("/", () => handlerMessage); -app.MapGet("/schema", () => schema); - if (builder.Environment.IsDevelopment()) { app.MapGrpcReflectionService().AllowAnonymous(); + + app.UseSwagger(); + app.UseSwaggerUI(); +} + +app.MapSchemaBuilder("/v1/schema"); +app.MapGet("/schema", context => Task.Run(() => context.Response.Redirect("/v1/schema"))); + +if (builder.IsExplorerEnabled()) +{ + app.UseNodeExplorer(); } await app.RunAsync(); diff --git a/sdk/node/Libplanet.Node.Executable/Protos/blockchain.proto b/sdk/node/Libplanet.Node.Executable/Protos/blockchain.proto index e06008761d4..08d868c9f77 100644 --- a/sdk/node/Libplanet.Node.Executable/Protos/blockchain.proto +++ b/sdk/node/Libplanet.Node.Executable/Protos/blockchain.proto @@ -2,7 +2,7 @@ syntax = "proto3"; option csharp_namespace = "Libplanet.Node.API"; -package node; +package node.blockchain.v1; service BlockChain { rpc GetGenesisBlock (GetGenesisBlockRequest) returns (GetGenesisBlockReply); diff --git a/sdk/node/Libplanet.Node.Executable/Protos/schema.proto b/sdk/node/Libplanet.Node.Executable/Protos/schema.proto index eafa253e856..71f35cfeadc 100644 --- a/sdk/node/Libplanet.Node.Executable/Protos/schema.proto +++ b/sdk/node/Libplanet.Node.Executable/Protos/schema.proto @@ -2,7 +2,7 @@ syntax = "proto3"; option csharp_namespace = "Libplanet.Node.API"; -package node; +package node.schema.v1; service Schema { rpc GetList(GetListRequest) returns (GetListReply); diff --git a/sdk/node/Libplanet.Node.Executable/Services/BlockChainGrpcService.cs b/sdk/node/Libplanet.Node.Executable/Services/BlockChainGrpcServiceV1.cs similarity index 94% rename from sdk/node/Libplanet.Node.Executable/Services/BlockChainGrpcService.cs rename to sdk/node/Libplanet.Node.Executable/Services/BlockChainGrpcServiceV1.cs index 0b7fbbf935d..878926ce3c6 100644 --- a/sdk/node/Libplanet.Node.Executable/Services/BlockChainGrpcService.cs +++ b/sdk/node/Libplanet.Node.Executable/Services/BlockChainGrpcServiceV1.cs @@ -5,9 +5,7 @@ namespace Libplanet.Node.API.Services; -public class BlockChainGrpcService( - IReadChainService blockChain) - : BlockChain.BlockChainBase +public class BlockChainGrpcServiceV1(IReadChainService blockChain) : BlockChain.BlockChainBase { private readonly IReadChainService _blockChain = blockChain; diff --git a/sdk/node/Libplanet.Node.Executable/Services/SchemaGrpcService.cs b/sdk/node/Libplanet.Node.Executable/Services/SchemaGrpcServiceV1.cs similarity index 97% rename from sdk/node/Libplanet.Node.Executable/Services/SchemaGrpcService.cs rename to sdk/node/Libplanet.Node.Executable/Services/SchemaGrpcServiceV1.cs index aad9b9d80a9..c7439cb4da0 100644 --- a/sdk/node/Libplanet.Node.Executable/Services/SchemaGrpcService.cs +++ b/sdk/node/Libplanet.Node.Executable/Services/SchemaGrpcServiceV1.cs @@ -4,7 +4,7 @@ namespace Libplanet.Node.API.Services; -public class SchemaGrpcService : Schema.SchemaBase +internal sealed class SchemaGrpcServiceV1 : Schema.SchemaBase { private string[]? _list; private string? _schema; diff --git a/sdk/node/Libplanet.Node.Executable/appsettings-schema.json b/sdk/node/Libplanet.Node.Executable/appsettings-schema.json index e62d01685bd..a0422688bb6 100644 --- a/sdk/node/Libplanet.Node.Executable/appsettings-schema.json +++ b/sdk/node/Libplanet.Node.Executable/appsettings-schema.json @@ -1084,6 +1084,17 @@ } } }, + "Explorer": { + "title": "ExplorerOptions", + "type": "object", + "additionalProperties": false, + "properties": { + "IsEnabled": { + "type": "boolean", + "default": true + } + } + }, "Genesis": { "title": "GenesisOptions", "type": "object", @@ -1218,6 +1229,10 @@ { "type": "object", "properties": { + "Explorer": { + "description": "Type 'ExplorerOptions' does not have a description.", + "$ref": "#/definitions/Explorer" + }, "Genesis": { "description": "Options for the genesis block.", "$ref": "#/definitions/Genesis" diff --git a/sdk/node/Libplanet.Node.Executable/appsettings.Development.json b/sdk/node/Libplanet.Node.Executable/appsettings.Development.json index 8b59c49d98e..950ce4fefbc 100644 --- a/sdk/node/Libplanet.Node.Executable/appsettings.Development.json +++ b/sdk/node/Libplanet.Node.Executable/appsettings.Development.json @@ -8,7 +8,7 @@ }, "Kestrel": { "EndpointDefaults": { - "Protocols": "Http1AndHttp2" + "Protocols": "Http2" } }, "Swarm": { @@ -16,5 +16,8 @@ }, "Validator": { "IsEnabled": true + }, + "Explorer": { + "IsEnabled": true } } diff --git a/sdk/node/Libplanet.Node.Extensions/LibplanetServicesExtensions.cs b/sdk/node/Libplanet.Node.Extensions/LibplanetServicesExtensions.cs index e6097fd520e..6d8917db8c2 100644 --- a/sdk/node/Libplanet.Node.Extensions/LibplanetServicesExtensions.cs +++ b/sdk/node/Libplanet.Node.Extensions/LibplanetServicesExtensions.cs @@ -1,7 +1,8 @@ -using Libplanet.Blockchain; using Libplanet.Node.Extensions.NodeBuilder; using Libplanet.Node.Options; +using Libplanet.Node.Options.Schema; using Libplanet.Node.Services; +using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; @@ -43,27 +44,50 @@ public static ILibplanetNodeBuilder AddLibplanetNode( services.AddSingleton(); services.AddSingleton(); - var serviceProvider = services.BuildServiceProvider(); - var soloOptions = serviceProvider.GetRequiredService>(); - var swarmOptions = serviceProvider.GetRequiredService>(); - var validatorOptions = serviceProvider.GetRequiredService>(); var nodeBuilder = new LibplanetNodeBuilder(services); - if (soloOptions.Value.IsEnabled) + if (configuration.IsOptionsEnabled(SoloOptions.Position)) { nodeBuilder.WithSolo(); } - if (swarmOptions.Value.IsEnabled) + if (configuration.IsOptionsEnabled(SwarmOptions.Position)) { nodeBuilder.WithSwarm(); } - if (validatorOptions.Value.IsEnabled) + if (configuration.IsOptionsEnabled(ValidatorOptions.Position)) { nodeBuilder.WithValidator(); } return nodeBuilder; } + + public static IApplicationBuilder MapSchemaBuilder(this IApplicationBuilder app, string pattern) + { + app.UseRouting(); + app.UseEndpoints(endPoint => + { + string? schema = null; + endPoint.MapGet(pattern, async () => + { + schema ??= await OptionsSchemaBuilder.GetSchemaAsync(default); + return schema; + }); + }); + + return app; + } + + public static bool IsOptionsEnabled( + this IConfiguration configuration, string name) + => configuration.GetValue($"{name}:IsEnabled"); + + public static bool IsOptionsEnabled( + this IConfiguration configuration, string name, string propertyName) + { + var key = $"{name}:{propertyName}"; + return configuration.GetValue(key); + } } diff --git a/sdk/node/Libplanet.Node/Options/IEnabledOptions.cs b/sdk/node/Libplanet.Node/Options/IEnabledOptions.cs new file mode 100644 index 00000000000..7b1328fe1ed --- /dev/null +++ b/sdk/node/Libplanet.Node/Options/IEnabledOptions.cs @@ -0,0 +1,6 @@ +namespace Libplanet.Node.Options; + +public interface IEnabledOptions +{ + bool IsEnabled { get; } +} diff --git a/sdk/node/Libplanet.Node/Options/SoloOptions.cs b/sdk/node/Libplanet.Node/Options/SoloOptions.cs index f275a276de0..85ac33c3017 100644 --- a/sdk/node/Libplanet.Node/Options/SoloOptions.cs +++ b/sdk/node/Libplanet.Node/Options/SoloOptions.cs @@ -4,7 +4,7 @@ namespace Libplanet.Node.Options; [Options(Position)] -public class SoloOptions : OptionsBase +public class SoloOptions : OptionsBase, IEnabledOptions { public const string Position = "Solo"; diff --git a/sdk/node/Libplanet.Node/Options/SwarmOptions.cs b/sdk/node/Libplanet.Node/Options/SwarmOptions.cs index 9f78121e738..1d1ef9f0334 100644 --- a/sdk/node/Libplanet.Node/Options/SwarmOptions.cs +++ b/sdk/node/Libplanet.Node/Options/SwarmOptions.cs @@ -4,7 +4,7 @@ namespace Libplanet.Node.Options; [Options(Position)] -public sealed class SwarmOptions : OptionsBase +public sealed class SwarmOptions : OptionsBase, IEnabledOptions { public const string Position = "Swarm"; diff --git a/sdk/node/Libplanet.Node/Options/ValidatorOptions.cs b/sdk/node/Libplanet.Node/Options/ValidatorOptions.cs index e203cca786f..bbf3f6b5903 100644 --- a/sdk/node/Libplanet.Node/Options/ValidatorOptions.cs +++ b/sdk/node/Libplanet.Node/Options/ValidatorOptions.cs @@ -4,7 +4,7 @@ namespace Libplanet.Node.Options; [Options(Position)] -public sealed class ValidatorOptions : OptionsBase +public sealed class ValidatorOptions : OptionsBase, IEnabledOptions { public const string Position = "Validator"; diff --git a/sdk/node/Libplanet.Node/Services/ISwarmService.cs b/sdk/node/Libplanet.Node/Services/ISwarmService.cs index fc2fbc1a0c2..6b47eafa44a 100644 --- a/sdk/node/Libplanet.Node/Services/ISwarmService.cs +++ b/sdk/node/Libplanet.Node/Services/ISwarmService.cs @@ -1,3 +1,5 @@ +using Libplanet.Net; + namespace Libplanet.Node.Services; public interface ISwarmService @@ -5,4 +7,6 @@ public interface ISwarmService public event EventHandler? Started; public event EventHandler? Stopped; + + Swarm Swarm { get; } } diff --git a/sdk/node/Libplanet.Node/Services/SwarmService.cs b/sdk/node/Libplanet.Node/Services/SwarmService.cs index 63980869acd..93990c45948 100644 --- a/sdk/node/Libplanet.Node/Services/SwarmService.cs +++ b/sdk/node/Libplanet.Node/Services/SwarmService.cs @@ -33,6 +33,8 @@ internal sealed class SwarmService( public bool IsRunning => _swarm is not null; + public Swarm Swarm => _swarm ?? throw new InvalidOperationException("Node is not running."); + public async Task StartAsync(CancellationToken cancellationToken) { if (_swarm is not null)