~ruther/NosSmooth

db866ead1331b95623121520b29ca5d2d640e1e8 — František Boháček 3 years ago bb9a527
feat(data): add skeleton for NosTale data
A Data/NosSmooth.Data.Abstractions/IInfoService.cs => Data/NosSmooth.Data.Abstractions/IInfoService.cs +51 -0
@@ 0,0 1,51 @@
//
//  IInfoService.cs
//
//  Copyright (c) František Boháček. All rights reserved.
//  Licensed under the MIT license. See LICENSE file in the project root for full license information.

using NosSmooth.Data.Abstractions.Infos;
using Remora.Results;

namespace NosSmooth.Data.Abstractions;

/// <summary>
/// Service for retrieving information about NosTale objects.
/// </summary>
public interface IInfoService
{
    /// <summary>
    /// Gets the information about an item.
    /// </summary>
    /// <param name="vnum">The vnum identifier of the item.</param>
    /// <returns>An item info or an error.</returns>
    public Result<IItemInfo> GetItemInfo(long vnum);

    /// <summary>
    /// Gets the information about a map.
    /// </summary>
    /// <param name="vnum">The vnum identifier of the map.</param>
    /// <returns>A map info or an error.</returns>
    public Result<IMapInfo> GetMapInfo(long vnum);

    /// <summary>
    /// Gets the information about a monster.
    /// </summary>
    /// <param name="vnum">The vnum identifier of the monster.</param>
    /// <returns>A monster or an error.</returns>
    public Result<IMonsterInfo> GetMonsterInfo(long vnum);

    /// <summary>
    /// Gets the information about a skill.
    /// </summary>
    /// <param name="vnum">The vnum identifier of the skill.</param>
    /// <returns>A map or an error.</returns>
    public Result<ISkillInfo> GetSkillInfo(long vnum);

    /// <summary>
    /// Gets the information about a card.
    /// </summary>
    /// <param name="vnum">The vnum identifier of the card.</param>
    /// <returns>A card or an error.</returns>
    public Result<ICardInfo> GetCardInfo(long vnum);
}
\ No newline at end of file

A Data/NosSmooth.Data.Abstractions/Infos/ICardInfo.cs => Data/NosSmooth.Data.Abstractions/Infos/ICardInfo.cs +14 -0
@@ 0,0 1,14 @@
//
//  ICardInfo.cs
//
//  Copyright (c) František Boháček. All rights reserved.
//  Licensed under the MIT license. See LICENSE file in the project root for full license information.

namespace NosSmooth.Data.Abstractions.Infos;

/// <summary>
/// The NosTale card information.
/// </summary>
public interface ICardInfo : IVNumInfo
{
}
\ No newline at end of file

A Data/NosSmooth.Data.Abstractions/Infos/IItemInfo.cs => Data/NosSmooth.Data.Abstractions/Infos/IItemInfo.cs +14 -0
@@ 0,0 1,14 @@
//
//  IItemInfo.cs
//
//  Copyright (c) František Boháček. All rights reserved.
//  Licensed under the MIT license. See LICENSE file in the project root for full license information.

namespace NosSmooth.Data.Abstractions.Infos;

/// <summary>
/// The NosTale item information.
/// </summary>
public interface IItemInfo : IVNumInfo
{
}
\ No newline at end of file

A Data/NosSmooth.Data.Abstractions/Infos/IMapInfo.cs => Data/NosSmooth.Data.Abstractions/Infos/IMapInfo.cs +39 -0
@@ 0,0 1,39 @@
//
//  IMapInfo.cs
//
//  Copyright (c) František Boháček. All rights reserved.
//  Licensed under the MIT license. See LICENSE file in the project root for full license information.

namespace NosSmooth.Data.Abstractions.Infos;

/// <summary>
/// The NosTale map information.
/// </summary>
public interface IMapInfo : IVNumInfo
{
    /// <summary>
    /// Gets the width of the grid.
    /// </summary>
    public short Width { get; }

    /// <summary>
    /// Gets the height of the grid.
    /// </summary>
    public short Height { get; }

    /// <summary>
    /// Gets grid data for the given position.
    /// </summary>
    /// <param name="x">The x coordinate.</param>
    /// <param name="y">The y coordinate.</param>
    /// <returns>The grid value.</returns>
    public byte GetData(short x, short y);

    /// <summary>
    /// Gets whether the given position is walkable.
    /// </summary>
    /// <param name="x">The x coordinate.</param>
    /// <param name="y">The y coordinate.</param>
    /// <returns>Whether the position is walkable.</returns>
    public bool IsWalkable(short x, short y);
}
\ No newline at end of file

A Data/NosSmooth.Data.Abstractions/Infos/IMonsterInfo.cs => Data/NosSmooth.Data.Abstractions/Infos/IMonsterInfo.cs +14 -0
@@ 0,0 1,14 @@
//
//  IMonsterInfo.cs
//
//  Copyright (c) František Boháček. All rights reserved.
//  Licensed under the MIT license. See LICENSE file in the project root for full license information.

namespace NosSmooth.Data.Abstractions.Infos;

/// <summary>
/// The NosTale monster information.
/// </summary>
public interface IMonsterInfo : IVNumInfo
{
}
\ No newline at end of file

A Data/NosSmooth.Data.Abstractions/Infos/ISkillInfo.cs => Data/NosSmooth.Data.Abstractions/Infos/ISkillInfo.cs +14 -0
@@ 0,0 1,14 @@
//
//  ISkillInfo.cs
//
//  Copyright (c) František Boháček. All rights reserved.
//  Licensed under the MIT license. See LICENSE file in the project root for full license information.

namespace NosSmooth.Data.Abstractions.Infos;

/// <summary>
/// The NosTale skill information.
/// </summary>
public interface ISkillInfo
{
}
\ No newline at end of file

A Data/NosSmooth.Data.Abstractions/Infos/IVNumInfo.cs => Data/NosSmooth.Data.Abstractions/Infos/IVNumInfo.cs +18 -0
@@ 0,0 1,18 @@
//
//  IVNumInfo.cs
//
//  Copyright (c) František Boháček. All rights reserved.
//  Licensed under the MIT license. See LICENSE file in the project root for full license information.

namespace NosSmooth.Data.Abstractions.Infos;

/// <summary>
/// A NosTale info with a vnum key.
/// </summary>
public interface IVNumInfo
{
    /// <summary>
    /// Gets the VNum of the info entry.
    /// </summary>
    public long VNum { get; }
}
\ No newline at end of file

A Data/NosSmooth.Data.Abstractions/Language/ILanguageService.cs => Data/NosSmooth.Data.Abstractions/Language/ILanguageService.cs +29 -0
@@ 0,0 1,29 @@
//
//  ILanguageService.cs
//
//  Copyright (c) František Boháček. All rights reserved.
//  Licensed under the MIT license. See LICENSE file in the project root for full license information.

using Remora.Results;

namespace NosSmooth.Data.Abstractions.Language;

/// <summary>
/// Service for translating NosTale strings.
/// </summary>
public interface ILanguageService
{
    /// <summary>
    /// Gets or sets the current language.
    /// </summary>
    public Language CurrentLanguage { get; set; }

    /// <summary>
    /// Gets the translation of the given key.
    /// </summary>
    /// <param name="root">The root type of the key.</param>
    /// <param name="key">The key to translate.</param>
    /// <param name="language">The language, <see cref="CurrentLanguage"/> will be used if null.</param>
    /// <returns>The translated string or an error.</returns>
    public Result<string> GetTranslation(TranslationRoot root, LanguageKey key, Language? language = default);
}
\ No newline at end of file

A Data/NosSmooth.Data.Abstractions/Language/Language.cs => Data/NosSmooth.Data.Abstractions/Language/Language.cs +58 -0
@@ 0,0 1,58 @@
//
//  Language.cs
//
//  Copyright (c) František Boháček. All rights reserved.
//  Licensed under the MIT license. See LICENSE file in the project root for full license information.

namespace NosSmooth.Data.Abstractions.Language;

/// <summary>
/// Languages supported by NosTale.
/// </summary>
public enum Language
{
    /// <summary>
    /// English language.
    /// </summary>
    En,

    /// <summary>
    /// German language.
    /// </summary>
    De,

    /// <summary>
    /// French language.
    /// </summary>
    Fr,

    /// <summary>
    /// Italian language.
    /// </summary>
    It,

    /// <summary>
    /// Polish language.
    /// </summary>
    Pl,

    /// <summary>
    /// Spanish language.
    /// </summary>
    Es,

    /// <summary>
    /// Russian language.
    /// </summary>
    Ru,

    /// <summary>
    /// Czech language.
    /// </summary>
    Cs,

    /// <summary>
    /// Turkish language.
    /// </summary>
    Tr
}
\ No newline at end of file

A Data/NosSmooth.Data.Abstractions/Language/LanguageKey.cs => Data/NosSmooth.Data.Abstractions/Language/LanguageKey.cs +36 -0
@@ 0,0 1,36 @@
//
//  LanguageKey.cs
//
//  Copyright (c) František Boháček. All rights reserved.
//  Licensed under the MIT license. See LICENSE file in the project root for full license information.

namespace NosSmooth.Data.Abstractions.Language;

/// <summary>
/// Key for language translation.
/// </summary>
public struct LanguageKey
{
    /// <summary>
    /// Initializes a new instance of the <see cref="LanguageKey"/> struct.
    /// </summary>
    /// <param name="key">The key num.</param>
    public LanguageKey(long key)
        : this($"zts{key}e")
    {
    }

    /// <summary>
    /// Initializes a new instance of the <see cref="LanguageKey"/> struct.
    /// </summary>
    /// <param name="key">The key.</param>
    public LanguageKey(string key)
    {
        Key = key;
    }

    /// <summary>
    /// Gets the key.
    /// </summary>
    public string Key { get; }
}
\ No newline at end of file

A Data/NosSmooth.Data.Abstractions/Language/LanguageServiceOptions.cs => Data/NosSmooth.Data.Abstractions/Language/LanguageServiceOptions.cs +18 -0
@@ 0,0 1,18 @@
//
//  LanguageServiceOptions.cs
//
//  Copyright (c) František Boháček. All rights reserved.
//  Licensed under the MIT license. See LICENSE file in the project root for full license information.

namespace NosSmooth.Data.Abstractions.Language;

/// <summary>
/// Options for <see cref="ILanguageService"/>.
/// </summary>
public class LanguageServiceOptions
{
    /// <summary>
    /// Get or sets the default language.
    /// </summary>
    public Language Language { get; set; } = Language.En;
}
\ No newline at end of file

A Data/NosSmooth.Data.Abstractions/Language/TranslationRoot.cs => Data/NosSmooth.Data.Abstractions/Language/TranslationRoot.cs +38 -0
@@ 0,0 1,38 @@
//
//  TranslationRoot.cs
//
//  Copyright (c) František Boháček. All rights reserved.
//  Licensed under the MIT license. See LICENSE file in the project root for full license information.

namespace NosSmooth.Data.Abstractions.Language;

/// <summary>
/// Root type of a translation.
/// </summary>
public enum TranslationRoot
{
    /// <summary>
    /// The translation is for a card.
    /// </summary>
    Card,

    /// <summary>
    /// The translation is for an item.
    /// </summary>
    Item,

    /// <summary>
    /// The translation is for a monster.
    /// </summary>
    Monster,

    /// <summary>
    /// The translation for a skill.
    /// </summary>
    Skill,

    /// <summary>
    /// The translation for a map.
    /// </summary>
    Map
}
\ No newline at end of file

A Data/NosSmooth.Data.Abstractions/NosSmooth.Data.Abstractions.csproj => Data/NosSmooth.Data.Abstractions/NosSmooth.Data.Abstractions.csproj +13 -0
@@ 0,0 1,13 @@
<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFramework>net6.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
    </PropertyGroup>

    <ItemGroup>
      <PackageReference Include="Remora.Results" Version="7.1.0" />
    </ItemGroup>

</Project>

A Data/NosSmooth.Data.CLI/NosSmooth.Data.CLI.csproj => Data/NosSmooth.Data.CLI/NosSmooth.Data.CLI.csproj +10 -0
@@ 0,0 1,10 @@
<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFramework>net6.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
        <OutputType>Exe</OutputType>
    </PropertyGroup>

</Project>

A Data/NosSmooth.Data.Database/NosSmooth.Data.Database.csproj => Data/NosSmooth.Data.Database/NosSmooth.Data.Database.csproj +9 -0
@@ 0,0 1,9 @@
<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFramework>net6.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
    </PropertyGroup>

</Project>

A Data/NosSmooth.Data.NOSFiles/NosSmooth.Data.NOSFiles.csproj => Data/NosSmooth.Data.NOSFiles/NosSmooth.Data.NOSFiles.csproj +14 -0
@@ 0,0 1,14 @@
<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFramework>net6.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
    </PropertyGroup>

    <ItemGroup>
      <Folder Include="Dat" />
      <Folder Include="Nos" />
    </ItemGroup>

</Project>

M NosSmooth.sln => NosSmooth.sln +77 -0
@@ 28,6 28,18 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NosSmooth.Packets", "Packet
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NosSmooth.PacketSerializer.Abstractions", "Packets\NosSmooth.PacketSerializer.Abstractions\NosSmooth.PacketSerializer.Abstractions.csproj", "{CF03BCEA-EB5B-427F-8576-7DA7EB869BDC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NosSmooth.ChatCommands", "Local\NosSmooth.ChatCommands\NosSmooth.ChatCommands.csproj", "{7DC7FC22-EFA6-4EB0-8E75-99F746E50F6E}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Data", "Data", "{1C785A74-19B9-42D2-93B1-F4EC9D6A8CFD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NosSmooth.Data.Abstractions", "Data\NosSmooth.Data.Abstractions\NosSmooth.Data.Abstractions.csproj", "{7901F7FF-FB76-4A4C-8DCA-F74543624130}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NosSmooth.Data.Database", "Data\NosSmooth.Data.Database\NosSmooth.Data.Database.csproj", "{C4114AC1-72E8-46DA-9B4B-A4C942004492}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NosSmooth.Data.NOSFiles", "Data\NosSmooth.Data.NOSFiles\NosSmooth.Data.NOSFiles.csproj", "{4820B9B7-00E6-4E0C-B93A-83BB98C1EE99}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NosSmooth.Data.CLI", "Data\NosSmooth.Data.CLI\NosSmooth.Data.CLI.csproj", "{F1884ADF-6412-4E9B-81FD-357DC5761ADF}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		Debug|Any CPU = Debug|Any CPU


@@ 122,6 134,66 @@ Global
		{CF03BCEA-EB5B-427F-8576-7DA7EB869BDC}.Release|x64.Build.0 = Release|Any CPU
		{CF03BCEA-EB5B-427F-8576-7DA7EB869BDC}.Release|x86.ActiveCfg = Release|Any CPU
		{CF03BCEA-EB5B-427F-8576-7DA7EB869BDC}.Release|x86.Build.0 = Release|Any CPU
		{7DC7FC22-EFA6-4EB0-8E75-99F746E50F6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{7DC7FC22-EFA6-4EB0-8E75-99F746E50F6E}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{7DC7FC22-EFA6-4EB0-8E75-99F746E50F6E}.Debug|x64.ActiveCfg = Debug|Any CPU
		{7DC7FC22-EFA6-4EB0-8E75-99F746E50F6E}.Debug|x64.Build.0 = Debug|Any CPU
		{7DC7FC22-EFA6-4EB0-8E75-99F746E50F6E}.Debug|x86.ActiveCfg = Debug|Any CPU
		{7DC7FC22-EFA6-4EB0-8E75-99F746E50F6E}.Debug|x86.Build.0 = Debug|Any CPU
		{7DC7FC22-EFA6-4EB0-8E75-99F746E50F6E}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{7DC7FC22-EFA6-4EB0-8E75-99F746E50F6E}.Release|Any CPU.Build.0 = Release|Any CPU
		{7DC7FC22-EFA6-4EB0-8E75-99F746E50F6E}.Release|x64.ActiveCfg = Release|Any CPU
		{7DC7FC22-EFA6-4EB0-8E75-99F746E50F6E}.Release|x64.Build.0 = Release|Any CPU
		{7DC7FC22-EFA6-4EB0-8E75-99F746E50F6E}.Release|x86.ActiveCfg = Release|Any CPU
		{7DC7FC22-EFA6-4EB0-8E75-99F746E50F6E}.Release|x86.Build.0 = Release|Any CPU
		{7901F7FF-FB76-4A4C-8DCA-F74543624130}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{7901F7FF-FB76-4A4C-8DCA-F74543624130}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{7901F7FF-FB76-4A4C-8DCA-F74543624130}.Debug|x64.ActiveCfg = Debug|Any CPU
		{7901F7FF-FB76-4A4C-8DCA-F74543624130}.Debug|x64.Build.0 = Debug|Any CPU
		{7901F7FF-FB76-4A4C-8DCA-F74543624130}.Debug|x86.ActiveCfg = Debug|Any CPU
		{7901F7FF-FB76-4A4C-8DCA-F74543624130}.Debug|x86.Build.0 = Debug|Any CPU
		{7901F7FF-FB76-4A4C-8DCA-F74543624130}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{7901F7FF-FB76-4A4C-8DCA-F74543624130}.Release|Any CPU.Build.0 = Release|Any CPU
		{7901F7FF-FB76-4A4C-8DCA-F74543624130}.Release|x64.ActiveCfg = Release|Any CPU
		{7901F7FF-FB76-4A4C-8DCA-F74543624130}.Release|x64.Build.0 = Release|Any CPU
		{7901F7FF-FB76-4A4C-8DCA-F74543624130}.Release|x86.ActiveCfg = Release|Any CPU
		{7901F7FF-FB76-4A4C-8DCA-F74543624130}.Release|x86.Build.0 = Release|Any CPU
		{C4114AC1-72E8-46DA-9B4B-A4C942004492}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{C4114AC1-72E8-46DA-9B4B-A4C942004492}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{C4114AC1-72E8-46DA-9B4B-A4C942004492}.Debug|x64.ActiveCfg = Debug|Any CPU
		{C4114AC1-72E8-46DA-9B4B-A4C942004492}.Debug|x64.Build.0 = Debug|Any CPU
		{C4114AC1-72E8-46DA-9B4B-A4C942004492}.Debug|x86.ActiveCfg = Debug|Any CPU
		{C4114AC1-72E8-46DA-9B4B-A4C942004492}.Debug|x86.Build.0 = Debug|Any CPU
		{C4114AC1-72E8-46DA-9B4B-A4C942004492}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{C4114AC1-72E8-46DA-9B4B-A4C942004492}.Release|Any CPU.Build.0 = Release|Any CPU
		{C4114AC1-72E8-46DA-9B4B-A4C942004492}.Release|x64.ActiveCfg = Release|Any CPU
		{C4114AC1-72E8-46DA-9B4B-A4C942004492}.Release|x64.Build.0 = Release|Any CPU
		{C4114AC1-72E8-46DA-9B4B-A4C942004492}.Release|x86.ActiveCfg = Release|Any CPU
		{C4114AC1-72E8-46DA-9B4B-A4C942004492}.Release|x86.Build.0 = Release|Any CPU
		{4820B9B7-00E6-4E0C-B93A-83BB98C1EE99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{4820B9B7-00E6-4E0C-B93A-83BB98C1EE99}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{4820B9B7-00E6-4E0C-B93A-83BB98C1EE99}.Debug|x64.ActiveCfg = Debug|Any CPU
		{4820B9B7-00E6-4E0C-B93A-83BB98C1EE99}.Debug|x64.Build.0 = Debug|Any CPU
		{4820B9B7-00E6-4E0C-B93A-83BB98C1EE99}.Debug|x86.ActiveCfg = Debug|Any CPU
		{4820B9B7-00E6-4E0C-B93A-83BB98C1EE99}.Debug|x86.Build.0 = Debug|Any CPU
		{4820B9B7-00E6-4E0C-B93A-83BB98C1EE99}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{4820B9B7-00E6-4E0C-B93A-83BB98C1EE99}.Release|Any CPU.Build.0 = Release|Any CPU
		{4820B9B7-00E6-4E0C-B93A-83BB98C1EE99}.Release|x64.ActiveCfg = Release|Any CPU
		{4820B9B7-00E6-4E0C-B93A-83BB98C1EE99}.Release|x64.Build.0 = Release|Any CPU
		{4820B9B7-00E6-4E0C-B93A-83BB98C1EE99}.Release|x86.ActiveCfg = Release|Any CPU
		{4820B9B7-00E6-4E0C-B93A-83BB98C1EE99}.Release|x86.Build.0 = Release|Any CPU
		{F1884ADF-6412-4E9B-81FD-357DC5761ADF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{F1884ADF-6412-4E9B-81FD-357DC5761ADF}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{F1884ADF-6412-4E9B-81FD-357DC5761ADF}.Debug|x64.ActiveCfg = Debug|Any CPU
		{F1884ADF-6412-4E9B-81FD-357DC5761ADF}.Debug|x64.Build.0 = Debug|Any CPU
		{F1884ADF-6412-4E9B-81FD-357DC5761ADF}.Debug|x86.ActiveCfg = Debug|Any CPU
		{F1884ADF-6412-4E9B-81FD-357DC5761ADF}.Debug|x86.Build.0 = Debug|Any CPU
		{F1884ADF-6412-4E9B-81FD-357DC5761ADF}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{F1884ADF-6412-4E9B-81FD-357DC5761ADF}.Release|Any CPU.Build.0 = Release|Any CPU
		{F1884ADF-6412-4E9B-81FD-357DC5761ADF}.Release|x64.ActiveCfg = Release|Any CPU
		{F1884ADF-6412-4E9B-81FD-357DC5761ADF}.Release|x64.Build.0 = Release|Any CPU
		{F1884ADF-6412-4E9B-81FD-357DC5761ADF}.Release|x86.ActiveCfg = Release|Any CPU
		{F1884ADF-6412-4E9B-81FD-357DC5761ADF}.Release|x86.Build.0 = Release|Any CPU
	EndGlobalSection
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE


@@ 134,6 206,11 @@ Global
		{C4DAFD83-C6DC-4597-AA1F-BA2F3ABB612C} = {54A49AC2-55B3-4156-8023-41C56719EBB5}
		{86B4ED0C-CD28-4C6C-B58E-B4B1F7AAD683} = {54A49AC2-55B3-4156-8023-41C56719EBB5}
		{CF03BCEA-EB5B-427F-8576-7DA7EB869BDC} = {54A49AC2-55B3-4156-8023-41C56719EBB5}
		{7DC7FC22-EFA6-4EB0-8E75-99F746E50F6E} = {6078AE6E-7CD0-48E4-84E0-EB164D8881DA}
		{7901F7FF-FB76-4A4C-8DCA-F74543624130} = {1C785A74-19B9-42D2-93B1-F4EC9D6A8CFD}
		{C4114AC1-72E8-46DA-9B4B-A4C942004492} = {1C785A74-19B9-42D2-93B1-F4EC9D6A8CFD}
		{4820B9B7-00E6-4E0C-B93A-83BB98C1EE99} = {1C785A74-19B9-42D2-93B1-F4EC9D6A8CFD}
		{F1884ADF-6412-4E9B-81FD-357DC5761ADF} = {1C785A74-19B9-42D2-93B1-F4EC9D6A8CFD}
	EndGlobalSection
	GlobalSection(ExtensibilityGlobals) = postSolution
		SolutionGuid = {C5F46653-4DEC-429B-8580-4ED18ED9B4CA}

Do not follow this link