This is fucking dog shit

This commit is contained in:
Mino 2020-04-25 21:50:11 +09:00
parent 52daf6ada0
commit 54bf6099bf
7 changed files with 281 additions and 268 deletions

View file

@ -1,4 +1,5 @@
using System; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.IO.Pipes; using System.IO.Pipes;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
@ -18,17 +19,18 @@ namespace Dalamud.Bootstrap
m_options = options; m_options = options;
} }
public static void Test() public void Launch(string exePath, IDictionary<string, string> arguments)
{ {
// var options = new GameProcessCreationOptions
} {
ImagePath = exePath,
Arguments = arguments,
CreateSuspended = true
};
public void Launch(string exePath, string? commandLine) using var process = GameProcess.Create(options);
{
commandLine = commandLine ?? "";
// TODO: Inject(process);
//throw new NotImplementedException("TODO");
} }
/// <summary> /// <summary>
@ -62,14 +64,9 @@ namespace Dalamud.Bootstrap
using var process = GameProcess.Open(pid); using var process = GameProcess.Open(pid);
var exePath = process.GetImageFilePath(); var exePath = process.GetImageFilePath();
var argument = process.GetGameArguments(); var argument = process.GetGameArguments();
var encryptedArgument = EncryptArgument(argument.ToString()); var encryptedArgument = EncryptArgument(argument.ToString());

View file

@ -4,6 +4,8 @@ using Dalamud.Bootstrap.OS.Windows.Raw;
using Dalamud.Bootstrap.SqexArg; using Dalamud.Bootstrap.SqexArg;
using Microsoft.Win32.SafeHandles; using Microsoft.Win32.SafeHandles;
using System; using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text; using System.Text;
@ -181,6 +183,11 @@ namespace Dalamud.Bootstrap
} }
} }
private static uint CreateCommandLineKey()
{
return (uint)(Environment.TickCount & 0xFFFF_0000);
}
public static GameProcess Create(GameProcessCreationOptions options) public static GameProcess Create(GameProcessCreationOptions options)
{ {
unsafe unsafe
@ -188,9 +195,17 @@ namespace Dalamud.Bootstrap
SECURITY_ATTRIBUTES processAttr, threadAttr; SECURITY_ATTRIBUTES processAttr, threadAttr;
STARTUPINFOW startupInfo = default; STARTUPINFOW startupInfo = default;
PROCESS_INFORMATION processInfo = default; PROCESS_INFORMATION processInfo = default;
uint creationFlag; uint creationFlag = default;
BuildCommandLine(options); var key = CreateCommandLineKey();
var commandLine = BuildCommandLine(options.Arguments, key);
var currentDirectory = Path.Combine(Directory.GetParent(Path.GetDirectoryName(options.ImagePath)).FullName, "boot"); // this is fucked
var environments = BuildEnvironments(options.Environments);
if (options.CreateSuspended)
{
creationFlag |= (uint)PROCESS_CREATION_FLAGS.CREATE_SUSPENDED;
}
if (!Kernel32.CreateProcessW( if (!Kernel32.CreateProcessW(
options.ImagePath, options.ImagePath,
@ -207,10 +222,23 @@ namespace Dalamud.Bootstrap
{ {
ProcessException.ThrowLastOsError(); ProcessException.ThrowLastOsError();
} }
}
throw new NotImplementedException(); Kernel32.CloseHandle(//////////////////// fucking thread )
return new GameProcess(processInfo.hProcess);
}
}
private static string BuildCommandLine(IDictionary<string, string> arguments, uint key)
{
var builder = new SqexArgBuilder(arguments);
return builder.Build(key);
}
private static byte[] BuildEnvironments(IDictionary<string, string>? environments)
{
} }
/// <summary> /// <summary>
@ -290,7 +318,6 @@ namespace Dalamud.Bootstrap
ReadMemoryExact(address, buffer); ReadMemoryExact(address, buffer);
} }
private IntPtr GetPebAddress() private IntPtr GetPebAddress()
{ {
unsafe unsafe
@ -428,34 +455,6 @@ namespace Dalamud.Bootstrap
return createdTick & 0xFFFF_0000; return createdTick & 0xFFFF_0000;
} }
/// <summary> public uint Id => Kernel32.GetProcessId(m_handle);
/// Reads command-line arguments from the game and decrypts them if necessary.
/// </summary>
/// <returns>
/// Command-line arguments that looks like this:
/// /DEV.TestSID =ABCD /UserPath =C:\Examples
/// </returns>
public ArgumentBuilder GetGameArguments()
{
var processArguments = GetProcessArguments();
// arg[0] is a path to exe(normally), arg[1] is actual stuff.
if (processArguments.Length < 2)
{
throw new ProcessException($"There's only {processArguments.Length} process arguments. It must have at least 2 arguments.");
}
// We're interested in argument that contains session id
var argument = processArguments[1];
// If it's encrypted, we need to decrypt it first
if (EncryptedArgument.TryParse(argument, out var encryptedArgument))
{
var key = GetArgumentEncryptionKey();
argument = encryptedArgument.Decrypt(key);
}
return argument;
}
} }
} }

View file

@ -8,7 +8,7 @@ namespace Dalamud.Bootstrap
{ {
public string ImagePath { get; set; } = null!; public string ImagePath { get; set; } = null!;
public IList<string>? Arguments { get; set; } public IDictionary<string, string> Arguments { get; set; }
public IDictionary<string, string>? Environments { get; set; } public IDictionary<string, string>? Environments { get; set; }

View file

@ -3,18 +3,18 @@ using System.Text;
namespace Dalamud.Bootstrap.SqexArg namespace Dalamud.Bootstrap.SqexArg
{ {
public sealed class ArgumentBuilder public sealed class SqexArgBuilder
{ {
private readonly Dictionary<string, string> m_dict; private readonly IDictionary<string, string> m_dict;
public ArgumentBuilder() public SqexArgBuilder()
{ {
m_dict = new Dictionary<string, string>(); m_dict = new Dictionary<string, string>();
} }
public ArgumentBuilder(IEnumerable<KeyValuePair<string, string>> collection) public SqexArgBuilder(IDictionary<string, string> collection)
{ {
m_dict = new Dictionary<string, string>(collection); m_dict = collection;
} }
/// <summary> /// <summary>
@ -22,19 +22,21 @@ namespace Dalamud.Bootstrap.SqexArg
/// </summary> /// </summary>
/// <param name="argument"></param> /// <param name="argument"></param>
/// <returns></returns> /// <returns></returns>
public static ArgumentBuilder Parse(string argument) public static SqexArgBuilder Parse(string argument)
{ {
return new ArgumentBuilder(ArgumentParser.Parse(argument)); var arguments = new Dictionary<string, string>(SqexArgumentParser.Parse(argument)); // uhhh
return new SqexArgBuilder(arguments);
} }
public ArgumentBuilder Add(string key, string value) public SqexArgBuilder Add(string key, string value)
{ {
m_dict.Add(key, value); m_dict.Add(key, value);
return this; return this;
} }
public ArgumentBuilder Clear() public SqexArgBuilder Clear()
{ {
m_dict.Clear(); m_dict.Clear();
@ -43,9 +45,9 @@ namespace Dalamud.Bootstrap.SqexArg
public bool ContainsKey(string key) => m_dict.ContainsKey(key); public bool ContainsKey(string key) => m_dict.ContainsKey(key);
public bool ContainsValue(string value) => m_dict.ContainsValue(value); //public bool ContainsValue(string value) => m_dict.ContainsValue(value);
public ArgumentBuilder Remove(string key) public SqexArgBuilder Remove(string key)
{ {
m_dict.Remove(key); m_dict.Remove(key);
@ -54,17 +56,7 @@ namespace Dalamud.Bootstrap.SqexArg
public bool TryRemove(string key) => m_dict.Remove(key); public bool TryRemove(string key) => m_dict.Remove(key);
private static void Write(StringBuilder buffer, string key, string value)
{
var escapedKey = EscapeValue(key);
var escapedvalue = EscapeValue(value);
// TODO: (from chat)
// This line, the = in your version has a space before it
// If you're sending the arguments in plaintext, game doesn't like the space there
// (But I think it needs to be there in crypted args)
buffer.Append($" /{escapedKey} ={escapedvalue}"); // TODO: thanks SE
}
private static string EscapeValue(string value) private static string EscapeValue(string value)
{ {
@ -72,16 +64,37 @@ namespace Dalamud.Bootstrap.SqexArg
return value.Replace(" ", " "); return value.Replace(" ", " ");
} }
public override string ToString() private string BuildRawString()
{ {
// This is not exposed because (from chat):
// This line, the = in your version has a space before it
// If you're sending the arguments in plaintext, game doesn't like the space there
// (But I think it needs to be there in crypted args)
var buffer = new StringBuilder(300); var buffer = new StringBuilder(300);
foreach (var kv in m_dict) foreach (var kv in m_dict)
{ {
Write(buffer, kv.Key, kv.Value); WriteKeyValue(buffer, kv.Key, kv.Value);
} }
return buffer.ToString(); return buffer.ToString();
} }
private static void WriteKeyValue(StringBuilder buffer, string key, string value)
{
var escapedKey = EscapeValue(key);
var escapedvalue = EscapeValue(value);
buffer.Append($" /{escapedKey} ={escapedvalue}");
}
public string Build(uint key)
{
var plainText = BuildRawString();
var enc = new SqexEncryptedArgument(plainText, key);
return enc.Build();
}
} }
} }

View file

@ -6,7 +6,7 @@ using static Pidgin.Parser<char>;
namespace Dalamud.Bootstrap.SqexArg namespace Dalamud.Bootstrap.SqexArg
{ {
public static class ArgumentParser public static class SqexArgumentParser
{ {
private static readonly Parser<char, string> KeyMarkerNoEscape = String(" "); private static readonly Parser<char, string> KeyMarkerNoEscape = String(" ");

View file

@ -8,7 +8,7 @@ using Dalamud.Bootstrap.Crypto;
namespace Dalamud.Bootstrap.SqexArg namespace Dalamud.Bootstrap.SqexArg
{ {
internal sealed class EncryptedArgument internal sealed class SqexEncryptedArgument
{ {
private static readonly char[] ChecksumTable = private static readonly char[] ChecksumTable =
{ {
@ -32,7 +32,7 @@ namespace Dalamud.Bootstrap.SqexArg
/// </summary> /// </summary>
/// <param name="encodedData">A string that is already encrypted and encoded to url-safe variant of base64.</param> /// <param name="encodedData">A string that is already encrypted and encoded to url-safe variant of base64.</param>
/// <param name="checksum">A checksum that is used to validate the encryption key.</param> /// <param name="checksum">A checksum that is used to validate the encryption key.</param>
private EncryptedArgument(string encodedData, char checksum) private SqexEncryptedArgument(string encodedData, char checksum)
{ {
Data = encodedData; Data = encodedData;
Checksum = checksum; Checksum = checksum;
@ -43,7 +43,7 @@ namespace Dalamud.Bootstrap.SqexArg
/// </summary> /// </summary>
/// <param name="plainText">A data that is not encrypted.</param> /// <param name="plainText">A data that is not encrypted.</param>
/// <param name="key">A key that is used to encrypt the data.</param> /// <param name="key">A key that is used to encrypt the data.</param>
public EncryptedArgument(string plainText, uint key) public SqexEncryptedArgument(string plainText, uint key)
{ {
Span<byte> keyBytes = stackalloc byte[8]; Span<byte> keyBytes = stackalloc byte[8];
CreateKey(key, keyBytes); CreateKey(key, keyBytes);
@ -157,7 +157,7 @@ namespace Dalamud.Bootstrap.SqexArg
/// </summary> /// </summary>
/// <param name="argument">An argument that is encrypted and usually starts with //**sqex0003 and ends with **//</param> /// <param name="argument">An argument that is encrypted and usually starts with //**sqex0003 and ends with **//</param>
/// <returns>Returns true if successful, false otherwise.</returns> /// <returns>Returns true if successful, false otherwise.</returns>
public static bool TryParse(string argument, out EncryptedArgument output) public static bool TryParse(string argument, out SqexEncryptedArgument output)
{ {
if (!Extract(argument, out var data, out var checksum)) if (!Extract(argument, out var data, out var checksum))
{ {
@ -165,7 +165,7 @@ namespace Dalamud.Bootstrap.SqexArg
return false; return false;
} }
output = new EncryptedArgument(data, checksum); output = new SqexEncryptedArgument(data, checksum);
return true; return true;
} }
@ -196,7 +196,7 @@ namespace Dalamud.Bootstrap.SqexArg
return true; return true;
} }
public override string ToString() => $"//**sqex0003{Data}{Checksum}**//"; public string Build() => $"//**sqex0003{Data}{Checksum}**//";
/// <summary> /// <summary>
/// Formats a key. /// Formats a key.

View file

@ -1,188 +1,192 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16 # Visual Studio Version 16
VisualStudioVersion = 16.0.29215.179 VisualStudioVersion = 16.0.29215.179
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dalamud", "Dalamud\Dalamud.csproj", "{B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dalamud", "Dalamud\Dalamud.csproj", "{B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dalamud.Injector", "Dalamud.Injector\Dalamud.Injector.csproj", "{5B832F73-5F54-4ADC-870F-D0095EF72C9A}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dalamud.Injector", "Dalamud.Injector\Dalamud.Injector.csproj", "{5B832F73-5F54-4ADC-870F-D0095EF72C9A}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "lib", "lib", "{E9868930-4223-4D57-8F31-84E580E4B24B}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "lib", "lib", "{E9868930-4223-4D57-8F31-84E580E4B24B}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CoreHook", "CoreHook", "{CE78D902-02B5-4C7B-A46A-D44BD2F4C622}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CoreHook", "CoreHook", "{CE78D902-02B5-4C7B-A46A-D44BD2F4C622}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CoreHook", "lib\CoreHook\src\CoreHook\CoreHook.csproj", "{441EE8F0-AD8E-479B-9F68-12D157F080AF}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CoreHook", "lib\CoreHook\src\CoreHook\CoreHook.csproj", "{441EE8F0-AD8E-479B-9F68-12D157F080AF}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CoreHook.BinaryInjection", "lib\CoreHook\src\CoreHook.BinaryInjection\CoreHook.BinaryInjection.csproj", "{91CB76FC-8E4B-4B4C-B5AD-D681866A2188}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CoreHook.BinaryInjection", "lib\CoreHook\src\CoreHook.BinaryInjection\CoreHook.BinaryInjection.csproj", "{91CB76FC-8E4B-4B4C-B5AD-D681866A2188}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CoreHook.DependencyModel", "lib\CoreHook\src\CoreHook.DependencyModel\CoreHook.DependencyModel.csproj", "{1155DC7F-22F5-4217-A03C-D0E603C27698}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CoreHook.DependencyModel", "lib\CoreHook\src\CoreHook.DependencyModel\CoreHook.DependencyModel.csproj", "{1155DC7F-22F5-4217-A03C-D0E603C27698}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CoreHook.CoreLoad", "lib\CoreHook\src\CoreHook.CoreLoad\CoreHook.CoreLoad.csproj", "{A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CoreHook.CoreLoad", "lib\CoreHook\src\CoreHook.CoreLoad\CoreHook.CoreLoad.csproj", "{A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CoreHook.IPC", "lib\CoreHook\src\CoreHook.IPC\CoreHook.IPC.csproj", "{B585D1B1-63D8-454E-B76E-F1E0D550DCE7}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CoreHook.IPC", "lib\CoreHook\src\CoreHook.IPC\CoreHook.IPC.csproj", "{B585D1B1-63D8-454E-B76E-F1E0D550DCE7}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CoreHook.Memory", "lib\CoreHook\src\CoreHook.Memory\CoreHook.Memory.csproj", "{ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CoreHook.Memory", "lib\CoreHook\src\CoreHook.Memory\CoreHook.Memory.csproj", "{ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dalamud.Bootstrap", "Dalamud.Bootstrap\Dalamud.Bootstrap.csproj", "{19032128-E336-460F-B6E4-EAF6055589E5}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dalamud.Bootstrap", "Dalamud.Bootstrap\Dalamud.Bootstrap.csproj", "{19032128-E336-460F-B6E4-EAF6055589E5}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dalamud.Testing", "Dalamud.Testing\Dalamud.Testing.csproj", "{0A99A6B3-12E2-4197-A6F3-9211B6D4D824}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dalamud.Testing", "Dalamud.Testing\Dalamud.Testing.csproj", "{0A99A6B3-12E2-4197-A6F3-9211B6D4D824}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Build", "Build\Build.csproj", "{A6BB70E8-7F14-410F-A296-1B4495F6F069}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Build", "Build\Build.csproj", "{A6BB70E8-7F14-410F-A296-1B4495F6F069}"
EndProject EndProject
Global Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Bootstrap", "Bootstrap", "{9EBA28F0-EAF8-4E5B-9FD6-D4758B07D040}"
GlobalSection(SolutionConfigurationPlatforms) = preSolution EndProject
Debug|Any CPU = Debug|Any CPU Global
Debug|x64 = Debug|x64 GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x86 = Debug|x86 Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU Debug|x64 = Debug|x64
Release|x64 = Release|x64 Debug|x86 = Debug|x86
Release|x86 = Release|x86 Release|Any CPU = Release|Any CPU
EndGlobalSection Release|x64 = Release|x64
GlobalSection(ProjectConfigurationPlatforms) = postSolution Release|x86 = Release|x86
{B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU EndGlobalSection
{B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}.Debug|Any CPU.Build.0 = Debug|Any CPU GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}.Debug|x64.ActiveCfg = Debug|Any CPU {B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}.Debug|x64.Build.0 = Debug|Any CPU {B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}.Debug|x86.ActiveCfg = Debug|Any CPU {B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}.Debug|x64.ActiveCfg = Debug|Any CPU
{B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}.Debug|x86.Build.0 = Debug|Any CPU {B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}.Debug|x64.Build.0 = Debug|Any CPU
{B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}.Release|Any CPU.ActiveCfg = Release|Any CPU {B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}.Debug|x86.ActiveCfg = Debug|Any CPU
{B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}.Release|Any CPU.Build.0 = Release|Any CPU {B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}.Debug|x86.Build.0 = Debug|Any CPU
{B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}.Release|x64.ActiveCfg = Release|Any CPU {B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}.Release|x64.Build.0 = Release|Any CPU {B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}.Release|Any CPU.Build.0 = Release|Any CPU
{B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}.Release|x86.ActiveCfg = Release|Any CPU {B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}.Release|x64.ActiveCfg = Release|Any CPU
{B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}.Release|x86.Build.0 = Release|Any CPU {B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}.Release|x64.Build.0 = Release|Any CPU
{5B832F73-5F54-4ADC-870F-D0095EF72C9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}.Release|x86.ActiveCfg = Release|Any CPU
{5B832F73-5F54-4ADC-870F-D0095EF72C9A}.Debug|Any CPU.Build.0 = Debug|Any CPU {B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}.Release|x86.Build.0 = Release|Any CPU
{5B832F73-5F54-4ADC-870F-D0095EF72C9A}.Debug|x64.ActiveCfg = Debug|Any CPU {5B832F73-5F54-4ADC-870F-D0095EF72C9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5B832F73-5F54-4ADC-870F-D0095EF72C9A}.Debug|x64.Build.0 = Debug|Any CPU {5B832F73-5F54-4ADC-870F-D0095EF72C9A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5B832F73-5F54-4ADC-870F-D0095EF72C9A}.Debug|x86.ActiveCfg = Debug|Any CPU {5B832F73-5F54-4ADC-870F-D0095EF72C9A}.Debug|x64.ActiveCfg = Debug|Any CPU
{5B832F73-5F54-4ADC-870F-D0095EF72C9A}.Debug|x86.Build.0 = Debug|Any CPU {5B832F73-5F54-4ADC-870F-D0095EF72C9A}.Debug|x64.Build.0 = Debug|Any CPU
{5B832F73-5F54-4ADC-870F-D0095EF72C9A}.Release|Any CPU.ActiveCfg = Release|Any CPU {5B832F73-5F54-4ADC-870F-D0095EF72C9A}.Debug|x86.ActiveCfg = Debug|Any CPU
{5B832F73-5F54-4ADC-870F-D0095EF72C9A}.Release|Any CPU.Build.0 = Release|Any CPU {5B832F73-5F54-4ADC-870F-D0095EF72C9A}.Debug|x86.Build.0 = Debug|Any CPU
{5B832F73-5F54-4ADC-870F-D0095EF72C9A}.Release|x64.ActiveCfg = Release|Any CPU {5B832F73-5F54-4ADC-870F-D0095EF72C9A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5B832F73-5F54-4ADC-870F-D0095EF72C9A}.Release|x64.Build.0 = Release|Any CPU {5B832F73-5F54-4ADC-870F-D0095EF72C9A}.Release|Any CPU.Build.0 = Release|Any CPU
{5B832F73-5F54-4ADC-870F-D0095EF72C9A}.Release|x86.ActiveCfg = Release|Any CPU {5B832F73-5F54-4ADC-870F-D0095EF72C9A}.Release|x64.ActiveCfg = Release|Any CPU
{5B832F73-5F54-4ADC-870F-D0095EF72C9A}.Release|x86.Build.0 = Release|Any CPU {5B832F73-5F54-4ADC-870F-D0095EF72C9A}.Release|x64.Build.0 = Release|Any CPU
{441EE8F0-AD8E-479B-9F68-12D157F080AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5B832F73-5F54-4ADC-870F-D0095EF72C9A}.Release|x86.ActiveCfg = Release|Any CPU
{441EE8F0-AD8E-479B-9F68-12D157F080AF}.Debug|Any CPU.Build.0 = Debug|Any CPU {5B832F73-5F54-4ADC-870F-D0095EF72C9A}.Release|x86.Build.0 = Release|Any CPU
{441EE8F0-AD8E-479B-9F68-12D157F080AF}.Debug|x64.ActiveCfg = Debug|Any CPU {441EE8F0-AD8E-479B-9F68-12D157F080AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{441EE8F0-AD8E-479B-9F68-12D157F080AF}.Debug|x64.Build.0 = Debug|Any CPU {441EE8F0-AD8E-479B-9F68-12D157F080AF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{441EE8F0-AD8E-479B-9F68-12D157F080AF}.Debug|x86.ActiveCfg = Debug|Any CPU {441EE8F0-AD8E-479B-9F68-12D157F080AF}.Debug|x64.ActiveCfg = Debug|Any CPU
{441EE8F0-AD8E-479B-9F68-12D157F080AF}.Debug|x86.Build.0 = Debug|Any CPU {441EE8F0-AD8E-479B-9F68-12D157F080AF}.Debug|x64.Build.0 = Debug|Any CPU
{441EE8F0-AD8E-479B-9F68-12D157F080AF}.Release|Any CPU.ActiveCfg = Release|Any CPU {441EE8F0-AD8E-479B-9F68-12D157F080AF}.Debug|x86.ActiveCfg = Debug|Any CPU
{441EE8F0-AD8E-479B-9F68-12D157F080AF}.Release|Any CPU.Build.0 = Release|Any CPU {441EE8F0-AD8E-479B-9F68-12D157F080AF}.Debug|x86.Build.0 = Debug|Any CPU
{441EE8F0-AD8E-479B-9F68-12D157F080AF}.Release|x64.ActiveCfg = Release|Any CPU {441EE8F0-AD8E-479B-9F68-12D157F080AF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{441EE8F0-AD8E-479B-9F68-12D157F080AF}.Release|x64.Build.0 = Release|Any CPU {441EE8F0-AD8E-479B-9F68-12D157F080AF}.Release|Any CPU.Build.0 = Release|Any CPU
{441EE8F0-AD8E-479B-9F68-12D157F080AF}.Release|x86.ActiveCfg = Release|Any CPU {441EE8F0-AD8E-479B-9F68-12D157F080AF}.Release|x64.ActiveCfg = Release|Any CPU
{441EE8F0-AD8E-479B-9F68-12D157F080AF}.Release|x86.Build.0 = Release|Any CPU {441EE8F0-AD8E-479B-9F68-12D157F080AF}.Release|x64.Build.0 = Release|Any CPU
{91CB76FC-8E4B-4B4C-B5AD-D681866A2188}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {441EE8F0-AD8E-479B-9F68-12D157F080AF}.Release|x86.ActiveCfg = Release|Any CPU
{91CB76FC-8E4B-4B4C-B5AD-D681866A2188}.Debug|Any CPU.Build.0 = Debug|Any CPU {441EE8F0-AD8E-479B-9F68-12D157F080AF}.Release|x86.Build.0 = Release|Any CPU
{91CB76FC-8E4B-4B4C-B5AD-D681866A2188}.Debug|x64.ActiveCfg = Debug|Any CPU {91CB76FC-8E4B-4B4C-B5AD-D681866A2188}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{91CB76FC-8E4B-4B4C-B5AD-D681866A2188}.Debug|x64.Build.0 = Debug|Any CPU {91CB76FC-8E4B-4B4C-B5AD-D681866A2188}.Debug|Any CPU.Build.0 = Debug|Any CPU
{91CB76FC-8E4B-4B4C-B5AD-D681866A2188}.Debug|x86.ActiveCfg = Debug|Any CPU {91CB76FC-8E4B-4B4C-B5AD-D681866A2188}.Debug|x64.ActiveCfg = Debug|Any CPU
{91CB76FC-8E4B-4B4C-B5AD-D681866A2188}.Debug|x86.Build.0 = Debug|Any CPU {91CB76FC-8E4B-4B4C-B5AD-D681866A2188}.Debug|x64.Build.0 = Debug|Any CPU
{91CB76FC-8E4B-4B4C-B5AD-D681866A2188}.Release|Any CPU.ActiveCfg = Release|Any CPU {91CB76FC-8E4B-4B4C-B5AD-D681866A2188}.Debug|x86.ActiveCfg = Debug|Any CPU
{91CB76FC-8E4B-4B4C-B5AD-D681866A2188}.Release|Any CPU.Build.0 = Release|Any CPU {91CB76FC-8E4B-4B4C-B5AD-D681866A2188}.Debug|x86.Build.0 = Debug|Any CPU
{91CB76FC-8E4B-4B4C-B5AD-D681866A2188}.Release|x64.ActiveCfg = Release|Any CPU {91CB76FC-8E4B-4B4C-B5AD-D681866A2188}.Release|Any CPU.ActiveCfg = Release|Any CPU
{91CB76FC-8E4B-4B4C-B5AD-D681866A2188}.Release|x64.Build.0 = Release|Any CPU {91CB76FC-8E4B-4B4C-B5AD-D681866A2188}.Release|Any CPU.Build.0 = Release|Any CPU
{91CB76FC-8E4B-4B4C-B5AD-D681866A2188}.Release|x86.ActiveCfg = Release|Any CPU {91CB76FC-8E4B-4B4C-B5AD-D681866A2188}.Release|x64.ActiveCfg = Release|Any CPU
{91CB76FC-8E4B-4B4C-B5AD-D681866A2188}.Release|x86.Build.0 = Release|Any CPU {91CB76FC-8E4B-4B4C-B5AD-D681866A2188}.Release|x64.Build.0 = Release|Any CPU
{1155DC7F-22F5-4217-A03C-D0E603C27698}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {91CB76FC-8E4B-4B4C-B5AD-D681866A2188}.Release|x86.ActiveCfg = Release|Any CPU
{1155DC7F-22F5-4217-A03C-D0E603C27698}.Debug|Any CPU.Build.0 = Debug|Any CPU {91CB76FC-8E4B-4B4C-B5AD-D681866A2188}.Release|x86.Build.0 = Release|Any CPU
{1155DC7F-22F5-4217-A03C-D0E603C27698}.Debug|x64.ActiveCfg = Debug|Any CPU {1155DC7F-22F5-4217-A03C-D0E603C27698}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1155DC7F-22F5-4217-A03C-D0E603C27698}.Debug|x64.Build.0 = Debug|Any CPU {1155DC7F-22F5-4217-A03C-D0E603C27698}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1155DC7F-22F5-4217-A03C-D0E603C27698}.Debug|x86.ActiveCfg = Debug|Any CPU {1155DC7F-22F5-4217-A03C-D0E603C27698}.Debug|x64.ActiveCfg = Debug|Any CPU
{1155DC7F-22F5-4217-A03C-D0E603C27698}.Debug|x86.Build.0 = Debug|Any CPU {1155DC7F-22F5-4217-A03C-D0E603C27698}.Debug|x64.Build.0 = Debug|Any CPU
{1155DC7F-22F5-4217-A03C-D0E603C27698}.Release|Any CPU.ActiveCfg = Release|Any CPU {1155DC7F-22F5-4217-A03C-D0E603C27698}.Debug|x86.ActiveCfg = Debug|Any CPU
{1155DC7F-22F5-4217-A03C-D0E603C27698}.Release|Any CPU.Build.0 = Release|Any CPU {1155DC7F-22F5-4217-A03C-D0E603C27698}.Debug|x86.Build.0 = Debug|Any CPU
{1155DC7F-22F5-4217-A03C-D0E603C27698}.Release|x64.ActiveCfg = Release|Any CPU {1155DC7F-22F5-4217-A03C-D0E603C27698}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1155DC7F-22F5-4217-A03C-D0E603C27698}.Release|x64.Build.0 = Release|Any CPU {1155DC7F-22F5-4217-A03C-D0E603C27698}.Release|Any CPU.Build.0 = Release|Any CPU
{1155DC7F-22F5-4217-A03C-D0E603C27698}.Release|x86.ActiveCfg = Release|Any CPU {1155DC7F-22F5-4217-A03C-D0E603C27698}.Release|x64.ActiveCfg = Release|Any CPU
{1155DC7F-22F5-4217-A03C-D0E603C27698}.Release|x86.Build.0 = Release|Any CPU {1155DC7F-22F5-4217-A03C-D0E603C27698}.Release|x64.Build.0 = Release|Any CPU
{A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1155DC7F-22F5-4217-A03C-D0E603C27698}.Release|x86.ActiveCfg = Release|Any CPU
{A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}.Debug|Any CPU.Build.0 = Debug|Any CPU {1155DC7F-22F5-4217-A03C-D0E603C27698}.Release|x86.Build.0 = Release|Any CPU
{A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}.Debug|x64.ActiveCfg = Debug|Any CPU {A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}.Debug|x64.Build.0 = Debug|Any CPU {A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}.Debug|x86.ActiveCfg = Debug|Any CPU {A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}.Debug|x64.ActiveCfg = Debug|Any CPU
{A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}.Debug|x86.Build.0 = Debug|Any CPU {A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}.Debug|x64.Build.0 = Debug|Any CPU
{A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}.Release|Any CPU.ActiveCfg = Release|Any CPU {A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}.Debug|x86.ActiveCfg = Debug|Any CPU
{A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}.Release|Any CPU.Build.0 = Release|Any CPU {A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}.Debug|x86.Build.0 = Debug|Any CPU
{A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}.Release|x64.ActiveCfg = Release|Any CPU {A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}.Release|x64.Build.0 = Release|Any CPU {A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}.Release|Any CPU.Build.0 = Release|Any CPU
{A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}.Release|x86.ActiveCfg = Release|Any CPU {A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}.Release|x64.ActiveCfg = Release|Any CPU
{A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}.Release|x86.Build.0 = Release|Any CPU {A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}.Release|x64.Build.0 = Release|Any CPU
{B585D1B1-63D8-454E-B76E-F1E0D550DCE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}.Release|x86.ActiveCfg = Release|Any CPU
{B585D1B1-63D8-454E-B76E-F1E0D550DCE7}.Debug|Any CPU.Build.0 = Debug|Any CPU {A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8}.Release|x86.Build.0 = Release|Any CPU
{B585D1B1-63D8-454E-B76E-F1E0D550DCE7}.Debug|x64.ActiveCfg = Debug|Any CPU {B585D1B1-63D8-454E-B76E-F1E0D550DCE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B585D1B1-63D8-454E-B76E-F1E0D550DCE7}.Debug|x64.Build.0 = Debug|Any CPU {B585D1B1-63D8-454E-B76E-F1E0D550DCE7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B585D1B1-63D8-454E-B76E-F1E0D550DCE7}.Debug|x86.ActiveCfg = Debug|Any CPU {B585D1B1-63D8-454E-B76E-F1E0D550DCE7}.Debug|x64.ActiveCfg = Debug|Any CPU
{B585D1B1-63D8-454E-B76E-F1E0D550DCE7}.Debug|x86.Build.0 = Debug|Any CPU {B585D1B1-63D8-454E-B76E-F1E0D550DCE7}.Debug|x64.Build.0 = Debug|Any CPU
{B585D1B1-63D8-454E-B76E-F1E0D550DCE7}.Release|Any CPU.ActiveCfg = Release|Any CPU {B585D1B1-63D8-454E-B76E-F1E0D550DCE7}.Debug|x86.ActiveCfg = Debug|Any CPU
{B585D1B1-63D8-454E-B76E-F1E0D550DCE7}.Release|Any CPU.Build.0 = Release|Any CPU {B585D1B1-63D8-454E-B76E-F1E0D550DCE7}.Debug|x86.Build.0 = Debug|Any CPU
{B585D1B1-63D8-454E-B76E-F1E0D550DCE7}.Release|x64.ActiveCfg = Release|Any CPU {B585D1B1-63D8-454E-B76E-F1E0D550DCE7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B585D1B1-63D8-454E-B76E-F1E0D550DCE7}.Release|x64.Build.0 = Release|Any CPU {B585D1B1-63D8-454E-B76E-F1E0D550DCE7}.Release|Any CPU.Build.0 = Release|Any CPU
{B585D1B1-63D8-454E-B76E-F1E0D550DCE7}.Release|x86.ActiveCfg = Release|Any CPU {B585D1B1-63D8-454E-B76E-F1E0D550DCE7}.Release|x64.ActiveCfg = Release|Any CPU
{B585D1B1-63D8-454E-B76E-F1E0D550DCE7}.Release|x86.Build.0 = Release|Any CPU {B585D1B1-63D8-454E-B76E-F1E0D550DCE7}.Release|x64.Build.0 = Release|Any CPU
{ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B585D1B1-63D8-454E-B76E-F1E0D550DCE7}.Release|x86.ActiveCfg = Release|Any CPU
{ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}.Debug|Any CPU.Build.0 = Debug|Any CPU {B585D1B1-63D8-454E-B76E-F1E0D550DCE7}.Release|x86.Build.0 = Release|Any CPU
{ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}.Debug|x64.ActiveCfg = Debug|Any CPU {ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}.Debug|x64.Build.0 = Debug|Any CPU {ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}.Debug|x86.ActiveCfg = Debug|Any CPU {ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}.Debug|x64.ActiveCfg = Debug|Any CPU
{ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}.Debug|x86.Build.0 = Debug|Any CPU {ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}.Debug|x64.Build.0 = Debug|Any CPU
{ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}.Release|Any CPU.ActiveCfg = Release|Any CPU {ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}.Debug|x86.ActiveCfg = Debug|Any CPU
{ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}.Release|Any CPU.Build.0 = Release|Any CPU {ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}.Debug|x86.Build.0 = Debug|Any CPU
{ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}.Release|x64.ActiveCfg = Release|Any CPU {ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}.Release|x64.Build.0 = Release|Any CPU {ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}.Release|Any CPU.Build.0 = Release|Any CPU
{ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}.Release|x86.ActiveCfg = Release|Any CPU {ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}.Release|x64.ActiveCfg = Release|Any CPU
{ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}.Release|x86.Build.0 = Release|Any CPU {ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}.Release|x64.Build.0 = Release|Any CPU
{19032128-E336-460F-B6E4-EAF6055589E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}.Release|x86.ActiveCfg = Release|Any CPU
{19032128-E336-460F-B6E4-EAF6055589E5}.Debug|Any CPU.Build.0 = Debug|Any CPU {ED4FFE13-5F83-42B9-8847-E7C4D7A988E8}.Release|x86.Build.0 = Release|Any CPU
{19032128-E336-460F-B6E4-EAF6055589E5}.Debug|x64.ActiveCfg = Debug|Any CPU {19032128-E336-460F-B6E4-EAF6055589E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{19032128-E336-460F-B6E4-EAF6055589E5}.Debug|x64.Build.0 = Debug|Any CPU {19032128-E336-460F-B6E4-EAF6055589E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{19032128-E336-460F-B6E4-EAF6055589E5}.Debug|x86.ActiveCfg = Debug|Any CPU {19032128-E336-460F-B6E4-EAF6055589E5}.Debug|x64.ActiveCfg = Debug|Any CPU
{19032128-E336-460F-B6E4-EAF6055589E5}.Debug|x86.Build.0 = Debug|Any CPU {19032128-E336-460F-B6E4-EAF6055589E5}.Debug|x64.Build.0 = Debug|Any CPU
{19032128-E336-460F-B6E4-EAF6055589E5}.Release|Any CPU.ActiveCfg = Release|Any CPU {19032128-E336-460F-B6E4-EAF6055589E5}.Debug|x86.ActiveCfg = Debug|Any CPU
{19032128-E336-460F-B6E4-EAF6055589E5}.Release|Any CPU.Build.0 = Release|Any CPU {19032128-E336-460F-B6E4-EAF6055589E5}.Debug|x86.Build.0 = Debug|Any CPU
{19032128-E336-460F-B6E4-EAF6055589E5}.Release|x64.ActiveCfg = Release|Any CPU {19032128-E336-460F-B6E4-EAF6055589E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{19032128-E336-460F-B6E4-EAF6055589E5}.Release|x64.Build.0 = Release|Any CPU {19032128-E336-460F-B6E4-EAF6055589E5}.Release|Any CPU.Build.0 = Release|Any CPU
{19032128-E336-460F-B6E4-EAF6055589E5}.Release|x86.ActiveCfg = Release|Any CPU {19032128-E336-460F-B6E4-EAF6055589E5}.Release|x64.ActiveCfg = Release|Any CPU
{19032128-E336-460F-B6E4-EAF6055589E5}.Release|x86.Build.0 = Release|Any CPU {19032128-E336-460F-B6E4-EAF6055589E5}.Release|x64.Build.0 = Release|Any CPU
{0A99A6B3-12E2-4197-A6F3-9211B6D4D824}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {19032128-E336-460F-B6E4-EAF6055589E5}.Release|x86.ActiveCfg = Release|Any CPU
{0A99A6B3-12E2-4197-A6F3-9211B6D4D824}.Debug|Any CPU.Build.0 = Debug|Any CPU {19032128-E336-460F-B6E4-EAF6055589E5}.Release|x86.Build.0 = Release|Any CPU
{0A99A6B3-12E2-4197-A6F3-9211B6D4D824}.Debug|x64.ActiveCfg = Debug|Any CPU {0A99A6B3-12E2-4197-A6F3-9211B6D4D824}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0A99A6B3-12E2-4197-A6F3-9211B6D4D824}.Debug|x64.Build.0 = Debug|Any CPU {0A99A6B3-12E2-4197-A6F3-9211B6D4D824}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0A99A6B3-12E2-4197-A6F3-9211B6D4D824}.Debug|x86.ActiveCfg = Debug|Any CPU {0A99A6B3-12E2-4197-A6F3-9211B6D4D824}.Debug|x64.ActiveCfg = Debug|Any CPU
{0A99A6B3-12E2-4197-A6F3-9211B6D4D824}.Debug|x86.Build.0 = Debug|Any CPU {0A99A6B3-12E2-4197-A6F3-9211B6D4D824}.Debug|x64.Build.0 = Debug|Any CPU
{0A99A6B3-12E2-4197-A6F3-9211B6D4D824}.Release|Any CPU.ActiveCfg = Release|Any CPU {0A99A6B3-12E2-4197-A6F3-9211B6D4D824}.Debug|x86.ActiveCfg = Debug|Any CPU
{0A99A6B3-12E2-4197-A6F3-9211B6D4D824}.Release|Any CPU.Build.0 = Release|Any CPU {0A99A6B3-12E2-4197-A6F3-9211B6D4D824}.Debug|x86.Build.0 = Debug|Any CPU
{0A99A6B3-12E2-4197-A6F3-9211B6D4D824}.Release|x64.ActiveCfg = Release|Any CPU {0A99A6B3-12E2-4197-A6F3-9211B6D4D824}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0A99A6B3-12E2-4197-A6F3-9211B6D4D824}.Release|x64.Build.0 = Release|Any CPU {0A99A6B3-12E2-4197-A6F3-9211B6D4D824}.Release|Any CPU.Build.0 = Release|Any CPU
{0A99A6B3-12E2-4197-A6F3-9211B6D4D824}.Release|x86.ActiveCfg = Release|Any CPU {0A99A6B3-12E2-4197-A6F3-9211B6D4D824}.Release|x64.ActiveCfg = Release|Any CPU
{0A99A6B3-12E2-4197-A6F3-9211B6D4D824}.Release|x86.Build.0 = Release|Any CPU {0A99A6B3-12E2-4197-A6F3-9211B6D4D824}.Release|x64.Build.0 = Release|Any CPU
{A6BB70E8-7F14-410F-A296-1B4495F6F069}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0A99A6B3-12E2-4197-A6F3-9211B6D4D824}.Release|x86.ActiveCfg = Release|Any CPU
{A6BB70E8-7F14-410F-A296-1B4495F6F069}.Debug|x64.ActiveCfg = Debug|Any CPU {0A99A6B3-12E2-4197-A6F3-9211B6D4D824}.Release|x86.Build.0 = Release|Any CPU
{A6BB70E8-7F14-410F-A296-1B4495F6F069}.Debug|x64.Build.0 = Debug|Any CPU {A6BB70E8-7F14-410F-A296-1B4495F6F069}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A6BB70E8-7F14-410F-A296-1B4495F6F069}.Debug|x86.ActiveCfg = Debug|Any CPU {A6BB70E8-7F14-410F-A296-1B4495F6F069}.Debug|x64.ActiveCfg = Debug|Any CPU
{A6BB70E8-7F14-410F-A296-1B4495F6F069}.Debug|x86.Build.0 = Debug|Any CPU {A6BB70E8-7F14-410F-A296-1B4495F6F069}.Debug|x64.Build.0 = Debug|Any CPU
{A6BB70E8-7F14-410F-A296-1B4495F6F069}.Release|Any CPU.ActiveCfg = Release|Any CPU {A6BB70E8-7F14-410F-A296-1B4495F6F069}.Debug|x86.ActiveCfg = Debug|Any CPU
{A6BB70E8-7F14-410F-A296-1B4495F6F069}.Release|x64.ActiveCfg = Release|Any CPU {A6BB70E8-7F14-410F-A296-1B4495F6F069}.Debug|x86.Build.0 = Debug|Any CPU
{A6BB70E8-7F14-410F-A296-1B4495F6F069}.Release|x64.Build.0 = Release|Any CPU {A6BB70E8-7F14-410F-A296-1B4495F6F069}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A6BB70E8-7F14-410F-A296-1B4495F6F069}.Release|x86.ActiveCfg = Release|Any CPU {A6BB70E8-7F14-410F-A296-1B4495F6F069}.Release|x64.ActiveCfg = Release|Any CPU
{A6BB70E8-7F14-410F-A296-1B4495F6F069}.Release|x86.Build.0 = Release|Any CPU {A6BB70E8-7F14-410F-A296-1B4495F6F069}.Release|x64.Build.0 = Release|Any CPU
EndGlobalSection {A6BB70E8-7F14-410F-A296-1B4495F6F069}.Release|x86.ActiveCfg = Release|Any CPU
GlobalSection(SolutionProperties) = preSolution {A6BB70E8-7F14-410F-A296-1B4495F6F069}.Release|x86.Build.0 = Release|Any CPU
HideSolutionNode = FALSE EndGlobalSection
EndGlobalSection GlobalSection(SolutionProperties) = preSolution
GlobalSection(NestedProjects) = preSolution HideSolutionNode = FALSE
{CE78D902-02B5-4C7B-A46A-D44BD2F4C622} = {E9868930-4223-4D57-8F31-84E580E4B24B} EndGlobalSection
{441EE8F0-AD8E-479B-9F68-12D157F080AF} = {CE78D902-02B5-4C7B-A46A-D44BD2F4C622} GlobalSection(NestedProjects) = preSolution
{91CB76FC-8E4B-4B4C-B5AD-D681866A2188} = {CE78D902-02B5-4C7B-A46A-D44BD2F4C622} {5B832F73-5F54-4ADC-870F-D0095EF72C9A} = {9EBA28F0-EAF8-4E5B-9FD6-D4758B07D040}
{1155DC7F-22F5-4217-A03C-D0E603C27698} = {CE78D902-02B5-4C7B-A46A-D44BD2F4C622} {CE78D902-02B5-4C7B-A46A-D44BD2F4C622} = {E9868930-4223-4D57-8F31-84E580E4B24B}
{A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8} = {CE78D902-02B5-4C7B-A46A-D44BD2F4C622} {441EE8F0-AD8E-479B-9F68-12D157F080AF} = {CE78D902-02B5-4C7B-A46A-D44BD2F4C622}
{B585D1B1-63D8-454E-B76E-F1E0D550DCE7} = {CE78D902-02B5-4C7B-A46A-D44BD2F4C622} {91CB76FC-8E4B-4B4C-B5AD-D681866A2188} = {CE78D902-02B5-4C7B-A46A-D44BD2F4C622}
{ED4FFE13-5F83-42B9-8847-E7C4D7A988E8} = {CE78D902-02B5-4C7B-A46A-D44BD2F4C622} {1155DC7F-22F5-4217-A03C-D0E603C27698} = {CE78D902-02B5-4C7B-A46A-D44BD2F4C622}
EndGlobalSection {A1BC1DFD-AAE0-4221-A972-46CEBE4FCBF8} = {CE78D902-02B5-4C7B-A46A-D44BD2F4C622}
GlobalSection(ExtensibilityGlobals) = postSolution {B585D1B1-63D8-454E-B76E-F1E0D550DCE7} = {CE78D902-02B5-4C7B-A46A-D44BD2F4C622}
SolutionGuid = {79B65AC9-C940-410E-AB61-7EA7E12C7599} {ED4FFE13-5F83-42B9-8847-E7C4D7A988E8} = {CE78D902-02B5-4C7B-A46A-D44BD2F4C622}
EndGlobalSection {19032128-E336-460F-B6E4-EAF6055589E5} = {9EBA28F0-EAF8-4E5B-9FD6-D4758B07D040}
EndGlobal EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {79B65AC9-C940-410E-AB61-7EA7E12C7599}
EndGlobalSection
EndGlobal