Browse Source

Steam Identity Provider

Krzysztof Krysiński 3 months ago
parent
commit
57e9797fe9
29 changed files with 469 additions and 85 deletions
  1. 1 1
      src/ChunkyImageLibVis/ChunkyImageLibVis.csproj
  2. 17 11
      src/Directory.Build.props
  3. 1 1
      src/PixiEditor.AnimationRenderer.FFmpeg/PixiEditor.AnimationRenderer.FFmpeg.csproj
  4. 1 1
      src/PixiEditor.ChangeableDocument/PixiEditor.ChangeableDocument.csproj
  5. 14 8
      src/PixiEditor.IdentityProvider.PixiAuth/PixiAuthIdentityProvider.cs
  6. 8 2
      src/PixiEditor.IdentityProvider.PixiAuth/PixiUser.cs
  7. 6 1
      src/PixiEditor.IdentityProvider/IIdentityProvider.cs
  8. 1 1
      src/PixiEditor.IdentityProvider/IUser.cs
  9. 13 0
      src/PixiEditor.IdentityProvider/ProductData.cs
  10. 2 0
      src/PixiEditor.Linux/PixiEditor.Linux.csproj
  11. 2 0
      src/PixiEditor.MacOs/PixiEditor.MacOs.csproj
  12. 15 7
      src/PixiEditor.OperatingSystem/SecureStorage.cs
  13. 3 0
      src/PixiEditor.PixiAuth/Models/Product.cs
  14. 6 0
      src/PixiEditor.Platform.MSStore/MSAdditionalContentProvider.cs
  15. 1 1
      src/PixiEditor.Platform.MSStore/MicrosoftStorePlatform.cs
  16. 10 1
      src/PixiEditor.Platform.Standalone/StandaloneAdditionalContentProvider.cs
  17. 1 1
      src/PixiEditor.Platform.Standalone/StandalonePlatform.cs
  18. 1 0
      src/PixiEditor.Platform.Steam/PixiEditor.Platform.Steam.csproj
  19. 112 14
      src/PixiEditor.Platform.Steam/SteamAdditionalContentProvider.cs
  20. 74 3
      src/PixiEditor.Platform.Steam/SteamIdentityProvider.cs
  21. 4 1
      src/PixiEditor.Platform.Steam/SteamPlatform.cs
  22. 12 0
      src/PixiEditor.Platform.Steam/SteamUser.cs
  23. 1 0
      src/PixiEditor.Platform/IAdditionalContentProvider.cs
  24. 111 6
      src/PixiEditor.sln
  25. 4 3
      src/PixiEditor/Data/Localization/Languages/en.json
  26. 12 6
      src/PixiEditor/PixiEditor.csproj
  27. 21 7
      src/PixiEditor/ViewModels/SubViewModels/UserViewModel.cs
  28. 9 4
      src/PixiEditor/Views/Auth/LoginForm.axaml
  29. 6 5
      src/PixiEditor/Views/Auth/LoginPopup.axaml

+ 1 - 1
src/ChunkyImageLibVis/ChunkyImageLibVis.csproj

@@ -5,7 +5,7 @@
     <TargetFramework>net8.0-windows</TargetFramework>
     <TargetFramework>net8.0-windows</TargetFramework>
     <Nullable>enable</Nullable>
     <Nullable>enable</Nullable>
     <UseWPF>true</UseWPF>
     <UseWPF>true</UseWPF>
-    <Configurations>Debug;Release;Steam;DevRelease</Configurations>
+    <Configurations>Debug;Release;Steam;DevRelease;DebugSteam</Configurations>
     <Platforms>AnyCPU;x64;x86</Platforms>
     <Platforms>AnyCPU;x64;x86</Platforms>
   </PropertyGroup>
   </PropertyGroup>
 
 

+ 17 - 11
src/Directory.Build.props

@@ -1,14 +1,14 @@
 <Project>
 <Project>
-    <PropertyGroup>
-        <CodeAnalysisRuleSet>../Custom.ruleset</CodeAnalysisRuleSet>
-		    <AvaloniaVersion>11.2.7</AvaloniaVersion>
-    </PropertyGroup>
-    <ItemGroup>
-        <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" />
-    </ItemGroup>
-    <ItemGroup>
-        <AdditionalFiles Include="$(SolutionDir)/stylecop.json" />
-    </ItemGroup>
+  <PropertyGroup>
+    <CodeAnalysisRuleSet>../Custom.ruleset</CodeAnalysisRuleSet>
+    <AvaloniaVersion>11.2.7</AvaloniaVersion>
+  </PropertyGroup>
+  <ItemGroup>
+    <PackageReference Include="StyleCop.Analyzers" Version="1.1.118"/>
+  </ItemGroup>
+  <ItemGroup>
+    <AdditionalFiles Include="$(SolutionDir)/stylecop.json"/>
+  </ItemGroup>
 
 
   <PropertyGroup Condition="$([MSBuild]::IsOsPlatform('Windows')) AND '$(Platform)' == 'x64'">
   <PropertyGroup Condition="$([MSBuild]::IsOsPlatform('Windows')) AND '$(Platform)' == 'x64'">
     <RuntimeIdentifier>win-x64</RuntimeIdentifier>
     <RuntimeIdentifier>win-x64</RuntimeIdentifier>
@@ -63,6 +63,12 @@
     <DefineConstants>DEBUG;TRACE</DefineConstants>
     <DefineConstants>DEBUG;TRACE</DefineConstants>
   </PropertyGroup>
   </PropertyGroup>
 
 
+  <PropertyGroup Condition="'$(Configuration)'=='DebugSteam'">
+    <DefineConstants>TRACE;DEBUG;STEAM</DefineConstants>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+  </PropertyGroup>
+
   <PropertyGroup Condition="'$(Configuration)'=='Steam'">
   <PropertyGroup Condition="'$(Configuration)'=='Steam'">
     <DefineConstants>TRACE;RELEASE;STEAM</DefineConstants>
     <DefineConstants>TRACE;RELEASE;STEAM</DefineConstants>
     <Optimize>True</Optimize>
     <Optimize>True</Optimize>
@@ -107,5 +113,5 @@
   <PropertyGroup Condition="'$(RuntimeIdentifier)'=='osx-arm64'">
   <PropertyGroup Condition="'$(RuntimeIdentifier)'=='osx-arm64'">
     <DefineConstants>$(DefineConstants);MACOS</DefineConstants>
     <DefineConstants>$(DefineConstants);MACOS</DefineConstants>
   </PropertyGroup>
   </PropertyGroup>
-  
+
 </Project>
 </Project>

+ 1 - 1
src/PixiEditor.AnimationRenderer.FFmpeg/PixiEditor.AnimationRenderer.FFmpeg.csproj

@@ -4,7 +4,7 @@
     <TargetFramework>net8.0</TargetFramework>
     <TargetFramework>net8.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
     <Nullable>enable</Nullable>
-    <Configurations>Release;Debug</Configurations>
+    <Configurations>Release;Debug;DebugSteam</Configurations>
     <Platforms>arm64;x64</Platforms>
     <Platforms>arm64;x64</Platforms>
     <RuntimeIdentifiers>win-x64;win-arm64;osx-x64;osx-arm64;linux-x64;linux-arm64</RuntimeIdentifiers>
     <RuntimeIdentifiers>win-x64;win-arm64;osx-x64;osx-arm64;linux-x64;linux-arm64</RuntimeIdentifiers>
   </PropertyGroup>
   </PropertyGroup>

+ 1 - 1
src/PixiEditor.ChangeableDocument/PixiEditor.ChangeableDocument.csproj

@@ -6,7 +6,7 @@
     <Nullable>enable</Nullable>
     <Nullable>enable</Nullable>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>
     <RuntimeIdentifiers>win-x86;win-x64</RuntimeIdentifiers>
-    <Configurations>Debug;Release;Steam;DevRelease;DevSteam</Configurations>
+    <Configurations>Debug;Release;Steam;DevRelease;DevSteam;DebugSteam</Configurations>
     <Platforms>AnyCPU;x64</Platforms>
     <Platforms>AnyCPU;x64</Platforms>
   </PropertyGroup>
   </PropertyGroup>
 
 

+ 14 - 8
src/PixiEditor.IdentityProvider.PixiAuth/PixiAuthIdentityProvider.cs

@@ -1,5 +1,4 @@
-using System.Collections.ObjectModel;
-using PixiEditor.OperatingSystem;
+using PixiEditor.OperatingSystem;
 using PixiEditor.PixiAuth;
 using PixiEditor.PixiAuth;
 using PixiEditor.PixiAuth.Exceptions;
 using PixiEditor.PixiAuth.Exceptions;
 using PixiEditor.PixiAuth.Utils;
 using PixiEditor.PixiAuth.Utils;
@@ -8,14 +7,17 @@ namespace PixiEditor.IdentityProvider.PixiAuth;
 
 
 public class PixiAuthIdentityProvider : IIdentityProvider
 public class PixiAuthIdentityProvider : IIdentityProvider
 {
 {
+    public string ProviderName { get; } = "PixiAuth";
+    public bool AllowsLogout { get; } = true;
     public bool ApiValid => apiValid;
     public bool ApiValid => apiValid;
     private bool apiValid = true;
     private bool apiValid = true;
     public PixiAuthClient PixiAuthClient { get; }
     public PixiAuthClient PixiAuthClient { get; }
     public PixiUser User { get; private set; }
     public PixiUser User { get; private set; }
     public bool IsLoggedIn => User?.IsLoggedIn ?? false;
     public bool IsLoggedIn => User?.IsLoggedIn ?? false;
+    public Uri? EditProfileUrl { get; } = new Uri("https://gravatar.com/connect");
 
 
     public event Action<string, object>? OnError;
     public event Action<string, object>? OnError;
-    public event Action<List<string>>? OwnedProductsUpdated;
+    public event Action<List<ProductData>>? OwnedProductsUpdated;
     public event Action<string>? UsernameUpdated;
     public event Action<string>? UsernameUpdated;
     public event Action<PixiUser>? LoginRequestSuccessful;
     public event Action<PixiUser>? LoginRequestSuccessful;
     public event Action<double>? LoginTimeout;
     public event Action<double>? LoginTimeout;
@@ -34,7 +36,10 @@ public class PixiAuthIdentityProvider : IIdentityProvider
             Console.WriteLine($"Invalid api URL format: {e.Message}");
             Console.WriteLine($"Invalid api URL format: {e.Message}");
             apiValid = false;
             apiValid = false;
         }
         }
+    }
 
 
+    public void Initialize()
+    {
         User = SecureStorage.GetValue<PixiUser>("UserData", null);
         User = SecureStorage.GetValue<PixiUser>("UserData", null);
         Task.Run(async () =>
         Task.Run(async () =>
         {
         {
@@ -44,6 +49,7 @@ public class PixiAuthIdentityProvider : IIdentityProvider
         });
         });
     }
     }
 
 
+
     public async Task RequestLogin(string email)
     public async Task RequestLogin(string email)
     {
     {
         if (!apiValid) return;
         if (!apiValid) return;
@@ -206,9 +212,9 @@ public class PixiAuthIdentityProvider : IIdentityProvider
             var products = await PixiAuthClient.GetOwnedProducts(User.SessionToken);
             var products = await PixiAuthClient.GetOwnedProducts(User.SessionToken);
             if (products != null)
             if (products != null)
             {
             {
-                User.OwnedProducts = products.Where(x => x.IsDlc && x.Target == "PixiEditor")
-                    .Select(x => x.ProductId).ToList();
-                OwnedProductsUpdated?.Invoke(new List<string>(User.OwnedProducts));
+                User.OwnedProducts = products.Where(x => x is { IsDlc: true, Target: "PixiEditor" })
+                    .Select(x => new ProductData(x.ProductId, x.ProductName)).ToList();
+                OwnedProductsUpdated?.Invoke(new List<ProductData>(User.OwnedProducts));
             }
             }
         }
         }
         catch (Exception e)
         catch (Exception e)
@@ -247,8 +253,8 @@ public class PixiAuthIdentityProvider : IIdentityProvider
                 if (products != null)
                 if (products != null)
                 {
                 {
                     User.OwnedProducts = products.Where(x => x.IsDlc && x.Target == "PixiEditor")
                     User.OwnedProducts = products.Where(x => x.IsDlc && x.Target == "PixiEditor")
-                        .Select(x => x.ProductId).ToList();
-                    OwnedProductsUpdated?.Invoke(new List<string>(User.OwnedProducts));
+                        .Select(x => new ProductData(x.ProductId, x.ProductName)).ToList();
+                    OwnedProductsUpdated?.Invoke(new List<ProductData>(User.OwnedProducts));
                 }
                 }
 
 
                 Task.Run(async () =>
                 Task.Run(async () =>

+ 8 - 2
src/PixiEditor.IdentityProvider.PixiAuth/PixiUser.cs

@@ -1,19 +1,25 @@
-namespace PixiEditor.IdentityProvider.PixiAuth;
+using System.Text.Json.Serialization;
+
+namespace PixiEditor.IdentityProvider.PixiAuth;
 
 
 [Serializable]
 [Serializable]
 public class PixiUser : IUser
 public class PixiUser : IUser
 {
 {
     public string Username { get; set; }
     public string Username { get; set; }
 
 
+    [JsonIgnore]
     public string? AvatarUrl =>
     public string? AvatarUrl =>
         EmailHash != null ? $"https://www.gravatar.com/avatar/{EmailHash}?s=100&d=initials" : null;
         EmailHash != null ? $"https://www.gravatar.com/avatar/{EmailHash}?s=100&d=initials" : null;
 
 
     public string EmailHash { get; set; } = string.Empty;
     public string EmailHash { get; set; } = string.Empty;
-    public List<string> OwnedProducts { get; set; }
+    public List<ProductData> OwnedProducts { get; set; }
     public Guid? SessionId { get; set; }
     public Guid? SessionId { get; set; }
     public string? SessionToken { get; set; } = string.Empty;
     public string? SessionToken { get; set; } = string.Empty;
     public DateTime? SessionExpirationDate { get; set; }
     public DateTime? SessionExpirationDate { get; set; }
 
 
+    [JsonIgnore]
     public bool IsLoggedIn => this is { SessionId: not null } && !string.IsNullOrEmpty(SessionToken);
     public bool IsLoggedIn => this is { SessionId: not null } && !string.IsNullOrEmpty(SessionToken);
+
+    [JsonIgnore]
     public bool IsWaitingForActivation => this is { SessionId: not null } && string.IsNullOrEmpty(SessionToken);
     public bool IsWaitingForActivation => this is { SessionId: not null } && string.IsNullOrEmpty(SessionToken);
 }
 }

+ 6 - 1
src/PixiEditor.IdentityProvider/IIdentityProvider.cs

@@ -2,10 +2,15 @@
 
 
 public interface IIdentityProvider
 public interface IIdentityProvider
 {
 {
+    public bool AllowsLogout { get; }
+    public string ProviderName { get; }
     public IUser User { get; }
     public IUser User { get; }
     public bool IsLoggedIn { get; }
     public bool IsLoggedIn { get; }
+    public Uri? EditProfileUrl { get; }
 
 
     public event Action<string, object> OnError;
     public event Action<string, object> OnError;
-    public event Action<List<string>> OwnedProductsUpdated;
+    public event Action<List<ProductData>> OwnedProductsUpdated;
     public event Action<string> UsernameUpdated;
     public event Action<string> UsernameUpdated;
+
+    public void Initialize();
 }
 }

+ 1 - 1
src/PixiEditor.IdentityProvider/IUser.cs

@@ -4,6 +4,6 @@ public interface IUser
 {
 {
     public string Username { get; }
     public string Username { get; }
     public string? AvatarUrl { get; }
     public string? AvatarUrl { get; }
-    public List<string> OwnedProducts { get; }
+    public List<ProductData> OwnedProducts { get; }
     public bool IsLoggedIn { get; }
     public bool IsLoggedIn { get; }
 }
 }

+ 13 - 0
src/PixiEditor.IdentityProvider/ProductData.cs

@@ -0,0 +1,13 @@
+namespace PixiEditor.IdentityProvider;
+
+public record ProductData
+{
+    public string Id { get; set; }
+    public string DisplayName { get; set; }
+
+    public ProductData(string id, string displayName)
+    {
+        Id = id;
+        DisplayName = displayName;
+    }
+}

+ 2 - 0
src/PixiEditor.Linux/PixiEditor.Linux.csproj

@@ -4,6 +4,8 @@
         <TargetFramework>net8.0</TargetFramework>
         <TargetFramework>net8.0</TargetFramework>
         <ImplicitUsings>enable</ImplicitUsings>
         <ImplicitUsings>enable</ImplicitUsings>
         <Nullable>enable</Nullable>
         <Nullable>enable</Nullable>
+        <Configurations>Debug;Release;DebugSteam</Configurations>
+        <Platforms>AnyCPU;x64</Platforms>
     </PropertyGroup>
     </PropertyGroup>
 
 
     <ItemGroup>
     <ItemGroup>

+ 2 - 0
src/PixiEditor.MacOs/PixiEditor.MacOs.csproj

@@ -4,6 +4,8 @@
         <TargetFramework>net8.0</TargetFramework>
         <TargetFramework>net8.0</TargetFramework>
         <ImplicitUsings>enable</ImplicitUsings>
         <ImplicitUsings>enable</ImplicitUsings>
         <Nullable>enable</Nullable>
         <Nullable>enable</Nullable>
+        <Configurations>Debug;Release;DebugSteam</Configurations>
+        <Platforms>AnyCPU;x64</Platforms>
     </PropertyGroup>
     </PropertyGroup>
 
 
     <ItemGroup>
     <ItemGroup>

+ 15 - 7
src/PixiEditor.OperatingSystem/SecureStorage.cs

@@ -87,16 +87,24 @@ public static class SecureStorage
             byte[] decryptedData = IOperatingSystem.Current.Encryptor.Decrypt(current);
             byte[] decryptedData = IOperatingSystem.Current.Encryptor.Decrypt(current);
 
 
             string existingValue = Encoding.UTF8.GetString(decryptedData);
             string existingValue = Encoding.UTF8.GetString(decryptedData);
-            Dictionary<string, object>? data = JsonSerializer.Deserialize<Dictionary<string, object>>(existingValue);
-            if (data != null && data.TryGetValue(key, out object value))
+            try
             {
             {
-                if (value is JsonElement jsonElement)
+                Dictionary<string, object>?
+                    data = JsonSerializer.Deserialize<Dictionary<string, object>>(existingValue);
+                if (data != null && data.TryGetValue(key, out object value))
                 {
                 {
-                    string jsonString = jsonElement.GetRawText();
-                    return JsonSerializer.Deserialize<T>(jsonString);
-                }
+                    if (value is JsonElement jsonElement)
+                    {
+                        string jsonString = jsonElement.GetRawText();
+                        return JsonSerializer.Deserialize<T>(jsonString);
+                    }
 
 
-                return (T)value;
+                    return (T)value;
+                }
+            }
+            catch (JsonException)
+            {
+               return defaultValue;
             }
             }
         }
         }
 
 

+ 3 - 0
src/PixiEditor.PixiAuth/Models/Product.cs

@@ -8,6 +8,9 @@ public class Product
     [JsonPropertyName("productId")]
     [JsonPropertyName("productId")]
     public string ProductId { get; set; } = string.Empty;
     public string ProductId { get; set; } = string.Empty;
 
 
+    [JsonPropertyName("productName")]
+    public string ProductName { get; set; } = string.Empty;
+
     [JsonPropertyName("isDlc")]
     [JsonPropertyName("isDlc")]
     public bool IsDlc { get; set; }
     public bool IsDlc { get; set; }
 
 

+ 6 - 0
src/PixiEditor.Platform.MSStore/MSAdditionalContentProvider.cs

@@ -16,6 +16,12 @@ public sealed class MSAdditionalContentProvider : IAdditionalContentProvider
         ExtensionsPath = extensionsPath;
         ExtensionsPath = extensionsPath;
     }
     }
 
 
+    public bool IsInstalled(string productId)
+    {
+        var filePath = Path.Combine(ExtensionsPath, $"{productId}.pixiext");
+        return File.Exists(filePath);
+    }
+
     public async Task<string?> InstallContent(string productId)
     public async Task<string?> InstallContent(string productId)
     {
     {
         if (!IdentityProvider.ApiValid) return null;
         if (!IdentityProvider.ApiValid) return null;

+ 1 - 1
src/PixiEditor.Platform.MSStore/MicrosoftStorePlatform.cs

@@ -17,12 +17,12 @@ public sealed class MicrosoftStorePlatform : IPlatform
 
 
     public bool PerformHandshake()
     public bool PerformHandshake()
     {
     {
+        IdentityProvider?.Initialize();
         return true;
         return true;
     }
     }
 
 
     public void Update()
     public void Update()
     {
     {
-
     }
     }
 
 
     public IAdditionalContentProvider? AdditionalContentProvider { get; }
     public IAdditionalContentProvider? AdditionalContentProvider { get; }

+ 10 - 1
src/PixiEditor.Platform.Standalone/StandaloneAdditionalContentProvider.cs

@@ -12,6 +12,7 @@ public sealed class StandaloneAdditionalContentProvider : IAdditionalContentProv
     public PixiAuthIdentityProvider IdentityProvider { get; }
     public PixiAuthIdentityProvider IdentityProvider { get; }
 
 
     public event Action<string, object>? OnError;
     public event Action<string, object>? OnError;
+
     public StandaloneAdditionalContentProvider(string extensionsPath, PixiAuthIdentityProvider identityProvider)
     public StandaloneAdditionalContentProvider(string extensionsPath, PixiAuthIdentityProvider identityProvider)
     {
     {
         IdentityProvider = identityProvider;
         IdentityProvider = identityProvider;
@@ -59,6 +60,14 @@ public sealed class StandaloneAdditionalContentProvider : IAdditionalContentProv
         return null;
         return null;
     }
     }
 
 
+    public bool IsInstalled(string productId)
+    {
+        if (string.IsNullOrEmpty(productId)) return false;
+
+        string filePath = Path.Combine(ExtensionsPath, $"{productId}.pixiext");
+        return File.Exists(filePath);
+    }
+
     public bool IsContentOwned(string product)
     public bool IsContentOwned(string product)
     {
     {
         if (!PlatformHasContent(product)) return false;
         if (!PlatformHasContent(product)) return false;
@@ -68,7 +77,7 @@ public sealed class StandaloneAdditionalContentProvider : IAdditionalContentProv
             return false;
             return false;
         }
         }
 
 
-        return IdentityProvider.User.OwnedProducts.Contains(product, StringComparer.OrdinalIgnoreCase);
+        return IdentityProvider.User.OwnedProducts.Any(x => x.Id.Equals(product, StringComparison.OrdinalIgnoreCase));
     }
     }
 
 
     public bool PlatformHasContent(string product)
     public bool PlatformHasContent(string product)

+ 1 - 1
src/PixiEditor.Platform.Standalone/StandalonePlatform.cs

@@ -21,11 +21,11 @@ public sealed class StandalonePlatform : IPlatform
 
 
     public bool PerformHandshake()
     public bool PerformHandshake()
     {
     {
+        IdentityProvider?.Initialize();
         return true;
         return true;
     }
     }
 
 
     public void Update()
     public void Update()
     {
     {
-
     }
     }
 }
 }

+ 1 - 0
src/PixiEditor.Platform.Steam/PixiEditor.Platform.Steam.csproj

@@ -11,6 +11,7 @@
   </ItemGroup>
   </ItemGroup>
 
 
   <ItemGroup>
   <ItemGroup>
+    <PackageReference Include="SkiaSharp" Version="3.116.1" />
     <PackageReference Include="Steamworks.NET" Version="2024.8.0" />
     <PackageReference Include="Steamworks.NET" Version="2024.8.0" />
   </ItemGroup>
   </ItemGroup>
 
 

+ 112 - 14
src/PixiEditor.Platform.Steam/SteamAdditionalContentProvider.cs

@@ -1,20 +1,33 @@
-using Steamworks;
+using System.Reflection;
+using Steamworks;
 
 
 namespace PixiEditor.Platform.Steam;
 namespace PixiEditor.Platform.Steam;
 
 
 public sealed class SteamAdditionalContentProvider : IAdditionalContentProvider
 public sealed class SteamAdditionalContentProvider : IAdditionalContentProvider
 {
 {
-    private Dictionary<string, AppId_t> productIds = new()
-    {
-        { "PixiEditor.FoundersPack", new AppId_t(2435860) }
-    };
+    Dictionary<string, AppId_t> dlcMap = new() { { "pixieditor.founderspack", new AppId_t(2435860) }, };
 
 
     public bool IsContentOwned(string product)
     public bool IsContentOwned(string product)
     {
     {
-        if(!SteamAPI.IsSteamRunning()) return false;
-        if(!PlatformHasContent(product)) return false;
+        if (!SteamAPI.IsSteamRunning()) return false;
+        if (string.IsNullOrEmpty(product)) return false;
+        if (!PlatformHasContent(product)) return false;
+
+        AppId_t appId = new AppId_t(0);
+        if (dlcMap.TryGetValue(product, out var value))
+        {
+            appId = value;
+        }
+        else if (!uint.TryParse(product, out uint id))
+        {
+            OnError?.Invoke("INVALID_PRODUCT_ID", product);
+            return false;
+        }
+        else
+        {
+            appId = new AppId_t(id);
+        }
 
 
-        AppId_t appId = productIds[product];
         bool installed = SteamApps.BIsDlcInstalled(appId);
         bool installed = SteamApps.BIsDlcInstalled(appId);
         return installed;
         return installed;
     }
     }
@@ -24,19 +37,104 @@ public sealed class SteamAdditionalContentProvider : IAdditionalContentProvider
         if (!SteamAPI.IsSteamRunning()) return null;
         if (!SteamAPI.IsSteamRunning()) return null;
         if (!PlatformHasContent(productId)) return null;
         if (!PlatformHasContent(productId)) return null;
 
 
-        AppId_t appId = productIds[productId];
+        AppId_t appId = new AppId_t(0);
+        if (dlcMap.TryGetValue(productId, out var value))
+        {
+            appId = value;
+        }
+        else if (!uint.TryParse(productId, out uint id))
+        {
+            OnError?.Invoke("INVALID_PRODUCT_ID", productId);
+            return null;
+        }
+        else
+        {
+            appId = new AppId_t(id);
+        }
+
+        if (SteamApps.BIsDlcInstalled(appId))
+        {
+            OnError?.Invoke("ALREADY_INSTALLED", productId);
+            return null;
+        }
+
+        SteamApps.GetAppInstallDir(new AppId_t(2218560), out string appInstallDir, 260);
+
+#if DEBUG
+        appInstallDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
+#endif
+
+        string extensionsDir = Path.Combine(appInstallDir, "Extensions");
+
+        string[] activeExtensions = Directory.GetFiles(extensionsDir, "*.pixiext");
+
         SteamApps.InstallDLC(appId);
         SteamApps.InstallDLC(appId);
 
 
-        // Steam does not provide a way to check if the installation was successful
-        // so we will just return the product ID
-        // TODO: Implement properly
-        return productId;
+        while (!SteamApps.BIsDlcInstalled(appId))
+        {
+            await Task.Delay(500);
+        }
+
+        string[] installedExtensions = Directory.GetFiles(extensionsDir, "*.pixiext");
+
+        string[] newExtensions = installedExtensions.Except(activeExtensions).ToArray();
+
+        if (newExtensions.Length == 0)
+        {
+            OnError?.Invoke("UNABLE_TO_FIND_EXTENSION", productId);
+            return null;
+        }
+
+        string extensionPath = newExtensions[0];
+
+        return extensionPath;
     }
     }
 
 
     public bool PlatformHasContent(string product)
     public bool PlatformHasContent(string product)
     {
     {
-        return productIds.ContainsKey(product);
+        if (dlcMap.ContainsKey(product))
+        {
+            return true;
+        }
+
+        bool isValid = uint.TryParse(product, out uint id);
+        if (!isValid)
+        {
+            return false;
+        }
+
+        AppId_t appId = new AppId_t(id);
+        int dlcs = SteamApps.GetDLCCount();
+        for (int i = 0; i < dlcs; i++)
+        {
+            SteamApps.BGetDLCDataByIndex(i, out AppId_t dlcId, out bool available, out string name, 128);
+            if (appId == dlcId)
+            {
+                return true;
+            }
+        }
+
+        return false;
     }
     }
 
 
     public event Action<string, object>? OnError;
     public event Action<string, object>? OnError;
+
+    public bool IsInstalled(string productId)
+    {
+        AppId_t appId = new AppId_t(0);
+        if (dlcMap.TryGetValue(productId, out var value))
+        {
+            appId = value;
+        }
+        else if (!uint.TryParse(productId, out uint id))
+        {
+            return false;
+        }
+        else
+        {
+            appId = new AppId_t(id);
+        }
+
+        return SteamApps.BIsDlcInstalled(appId);
+    }
 }
 }

+ 74 - 3
src/PixiEditor.Platform.Steam/SteamIdentityProvider.cs

@@ -1,12 +1,83 @@
+using System.Runtime.InteropServices;
 using PixiEditor.IdentityProvider;
 using PixiEditor.IdentityProvider;
+using SkiaSharp;
+using Steamworks;
 
 
 namespace PixiEditor.Platform.Steam;
 namespace PixiEditor.Platform.Steam;
 
 
 public class SteamIdentityProvider : IIdentityProvider
 public class SteamIdentityProvider : IIdentityProvider
 {
 {
-    public IUser User { get; } // TODO: Implement
-    public bool IsLoggedIn { get; }
+    public bool AllowsLogout { get; } = false;
+    public string ProviderName { get; } = "Steam";
+    public IUser User { get; private set; }
+    public bool IsLoggedIn { get; private set; }
+    public Uri? EditProfileUrl { get; } = new Uri("https://store.steampowered.com/login/");
     public event Action<string, object>? OnError;
     public event Action<string, object>? OnError;
-    public event Action<List<string>>? OwnedProductsUpdated;
+    public event Action<List<ProductData>>? OwnedProductsUpdated;
     public event Action<string>? UsernameUpdated;
     public event Action<string>? UsernameUpdated;
+
+    public void Initialize()
+    {
+        string username = SteamFriends.GetPersonaName();
+        var id = Steamworks.SteamUser.GetSteamID();
+        string avatar = GetAvatar(id);
+        var ownedContent = GetOwnedDlcs();
+        var user = new SteamUser()
+        {
+            Username = username, AvatarUrl = avatar, Id = id.m_SteamID, IsLoggedIn = true,
+            OwnedProducts = ownedContent,
+        };
+
+        User = user;
+        IsLoggedIn = true;
+    }
+
+    private static string GetAvatar(CSteamID id)
+    {
+        int avatar = SteamFriends.GetLargeFriendAvatar(id);
+
+        string cache = Path.Combine(Path.GetTempPath(), "PixiEditor", $"SteamAvatar_{id.m_SteamID}.png");
+
+        bool cacheExists = File.Exists(cache);
+
+        if (cacheExists)
+        {
+            return cache;
+        }
+
+        if (avatar != 0)
+        {
+            SteamUtils.GetImageSize(avatar, out uint width, out uint height);
+            byte[] image = new byte[width * height * 4];
+            bool gotImage = SteamUtils.GetImageRGBA(avatar, image, image.Length);
+            if (gotImage)
+            {
+                using SKBitmap bitmap = new SKBitmap((int)width, (int)height);
+                var allocated = GCHandle.Alloc(image, GCHandleType.Pinned);
+                var info = new SKImageInfo((int)width, (int)height, SKColorType.Rgba8888, SKAlphaType.Premul);
+                bitmap.InstallPixels(info, allocated.AddrOfPinnedObject(), bitmap.RowBytes, delegate { allocated.Free(); }, null);
+                using FileStream stream = new FileStream(cache, FileMode.Create);
+                bitmap.Encode(SKEncodedImageFormat.Png, 100).SaveTo(stream);
+            }
+        }
+
+        return cache;
+    }
+
+    private static List<ProductData> GetOwnedDlcs()
+    {
+        int dlcCount = SteamApps.GetDLCCount();
+
+        List<ProductData> ownedDlcs = new List<ProductData>();
+        for (int i = 0; i < dlcCount; i++)
+        {
+            bool success = SteamApps.BGetDLCDataByIndex(i, out AppId_t appId, out bool available, out string name, 128);
+            if (success && available)
+            {
+                ownedDlcs.Add(new ProductData(appId.m_AppId.ToString(), name));
+            }
+        }
+
+        return ownedDlcs;
+    }
 }
 }

+ 4 - 1
src/PixiEditor.Platform.Steam/SteamPlatform.cs

@@ -13,7 +13,10 @@ public class SteamPlatform : IPlatform
     {
     {
         try
         try
         {
         {
-            SteamAPI.Init();
+            bool initialized = SteamAPI.Init();
+            if (!initialized) return false;
+
+            IdentityProvider?.Initialize();
             return true;
             return true;
         }
         }
         catch
         catch

+ 12 - 0
src/PixiEditor.Platform.Steam/SteamUser.cs

@@ -0,0 +1,12 @@
+using PixiEditor.IdentityProvider;
+
+namespace PixiEditor.Platform.Steam;
+
+public class SteamUser : IUser
+{
+    public ulong Id { get; set; }
+    public string Username { get; set; }
+    public string? AvatarUrl { get; set; }
+    public List<ProductData> OwnedProducts { get; set; }
+    public bool IsLoggedIn { get; set; }
+}

+ 1 - 0
src/PixiEditor.Platform/IAdditionalContentProvider.cs

@@ -7,4 +7,5 @@ public interface IAdditionalContentProvider
     public bool PlatformHasContent(string productId);
     public bool PlatformHasContent(string productId);
 
 
     public event Action<string, object> OnError;
     public event Action<string, object> OnError;
+    public bool IsInstalled(string productId);
 }
 }

+ 111 - 6
src/PixiEditor.sln

@@ -160,6 +160,7 @@ Global
 		Release|ARM64 = Release|ARM64
 		Release|ARM64 = Release|ARM64
 		Steam|x64 = Steam|x64
 		Steam|x64 = Steam|x64
 		Steam|ARM64 = Steam|ARM64
 		Steam|ARM64 = Steam|ARM64
+		DebugSteam|x64 = DebugSteam|x64
 	EndGlobalSection
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
 		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -174,6 +175,8 @@ Global
 		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.DevRelease|x64.Build.0 = Debug|Any CPU
 		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.DevRelease|x64.Build.0 = Debug|Any CPU
 		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.Release|ARM64.Build.0 = Release|Any CPU
 		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.Release|ARM64.Build.0 = Release|Any CPU
+		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{80BB2920-3DC0-406C-9E2B-30B08D5CC7A8}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{6A9DA760-1E47-414C-B8E8-3B4927F18131}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{6A9DA760-1E47-414C-B8E8-3B4927F18131}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{6A9DA760-1E47-414C-B8E8-3B4927F18131}.Debug|x64.Build.0 = Debug|Any CPU
 		{6A9DA760-1E47-414C-B8E8-3B4927F18131}.Debug|x64.Build.0 = Debug|Any CPU
 		{6A9DA760-1E47-414C-B8E8-3B4927F18131}.MSIX Debug|x64.ActiveCfg = Debug|Any CPU
 		{6A9DA760-1E47-414C-B8E8-3B4927F18131}.MSIX Debug|x64.ActiveCfg = Debug|Any CPU
@@ -192,6 +195,8 @@ Global
 		{6A9DA760-1E47-414C-B8E8-3B4927F18131}.DevSteam|x64.Build.0 = Release|Any CPU
 		{6A9DA760-1E47-414C-B8E8-3B4927F18131}.DevSteam|x64.Build.0 = Release|Any CPU
 		{6A9DA760-1E47-414C-B8E8-3B4927F18131}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{6A9DA760-1E47-414C-B8E8-3B4927F18131}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{6A9DA760-1E47-414C-B8E8-3B4927F18131}.Release|ARM64.Build.0 = Release|Any CPU
 		{6A9DA760-1E47-414C-B8E8-3B4927F18131}.Release|ARM64.Build.0 = Release|Any CPU
+		{6A9DA760-1E47-414C-B8E8-3B4927F18131}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{6A9DA760-1E47-414C-B8E8-3B4927F18131}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{510ED47C-2455-4DCE-A561-1074725E1236}.Debug|x64.ActiveCfg = Debug|x64
 		{510ED47C-2455-4DCE-A561-1074725E1236}.Debug|x64.ActiveCfg = Debug|x64
 		{510ED47C-2455-4DCE-A561-1074725E1236}.Debug|x64.Build.0 = Debug|x64
 		{510ED47C-2455-4DCE-A561-1074725E1236}.Debug|x64.Build.0 = Debug|x64
 		{510ED47C-2455-4DCE-A561-1074725E1236}.DevRelease|x64.ActiveCfg = DevRelease|x64
 		{510ED47C-2455-4DCE-A561-1074725E1236}.DevRelease|x64.ActiveCfg = DevRelease|x64
@@ -204,6 +209,8 @@ Global
 		{510ED47C-2455-4DCE-A561-1074725E1236}.Release|x64.Build.0 = Release|x64
 		{510ED47C-2455-4DCE-A561-1074725E1236}.Release|x64.Build.0 = Release|x64
 		{510ED47C-2455-4DCE-A561-1074725E1236}.Steam|x64.ActiveCfg = Steam|x64
 		{510ED47C-2455-4DCE-A561-1074725E1236}.Steam|x64.ActiveCfg = Steam|x64
 		{510ED47C-2455-4DCE-A561-1074725E1236}.Steam|x64.Build.0 = Steam|x64
 		{510ED47C-2455-4DCE-A561-1074725E1236}.Steam|x64.Build.0 = Steam|x64
+		{510ED47C-2455-4DCE-A561-1074725E1236}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{510ED47C-2455-4DCE-A561-1074725E1236}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{294FD171-9536-474C-A679-83F0266275FB}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{294FD171-9536-474C-A679-83F0266275FB}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{294FD171-9536-474C-A679-83F0266275FB}.Debug|x64.Build.0 = Debug|Any CPU
 		{294FD171-9536-474C-A679-83F0266275FB}.Debug|x64.Build.0 = Debug|Any CPU
 		{294FD171-9536-474C-A679-83F0266275FB}.DevRelease|x64.ActiveCfg = DevRelease|Any CPU
 		{294FD171-9536-474C-A679-83F0266275FB}.DevRelease|x64.ActiveCfg = DevRelease|Any CPU
@@ -222,24 +229,22 @@ Global
 		{294FD171-9536-474C-A679-83F0266275FB}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{294FD171-9536-474C-A679-83F0266275FB}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{294FD171-9536-474C-A679-83F0266275FB}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{294FD171-9536-474C-A679-83F0266275FB}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{294FD171-9536-474C-A679-83F0266275FB}.Release|ARM64.Build.0 = Release|Any CPU
 		{294FD171-9536-474C-A679-83F0266275FB}.Release|ARM64.Build.0 = Release|Any CPU
+		{294FD171-9536-474C-A679-83F0266275FB}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{294FD171-9536-474C-A679-83F0266275FB}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{758DF7DF-A8B1-4409-B79A-018E542B7251}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{758DF7DF-A8B1-4409-B79A-018E542B7251}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{758DF7DF-A8B1-4409-B79A-018E542B7251}.Debug|x64.Build.0 = Debug|Any CPU
 		{758DF7DF-A8B1-4409-B79A-018E542B7251}.Debug|x64.Build.0 = Debug|Any CPU
-		{758DF7DF-A8B1-4409-B79A-018E542B7251}.DevRelease|x64.ActiveCfg = DevRelease|Any CPU
-		{758DF7DF-A8B1-4409-B79A-018E542B7251}.DevRelease|x64.Build.0 = DevRelease|Any CPU
 		{758DF7DF-A8B1-4409-B79A-018E542B7251}.MSIX Debug|x64.ActiveCfg = Debug|Any CPU
 		{758DF7DF-A8B1-4409-B79A-018E542B7251}.MSIX Debug|x64.ActiveCfg = Debug|Any CPU
 		{758DF7DF-A8B1-4409-B79A-018E542B7251}.MSIX Debug|x64.Build.0 = Debug|Any CPU
 		{758DF7DF-A8B1-4409-B79A-018E542B7251}.MSIX Debug|x64.Build.0 = Debug|Any CPU
 		{758DF7DF-A8B1-4409-B79A-018E542B7251}.MSIX|x64.ActiveCfg = Debug|Any CPU
 		{758DF7DF-A8B1-4409-B79A-018E542B7251}.MSIX|x64.ActiveCfg = Debug|Any CPU
 		{758DF7DF-A8B1-4409-B79A-018E542B7251}.MSIX|x64.Build.0 = Debug|Any CPU
 		{758DF7DF-A8B1-4409-B79A-018E542B7251}.MSIX|x64.Build.0 = Debug|Any CPU
 		{758DF7DF-A8B1-4409-B79A-018E542B7251}.Release|x64.ActiveCfg = Release|Any CPU
 		{758DF7DF-A8B1-4409-B79A-018E542B7251}.Release|x64.ActiveCfg = Release|Any CPU
 		{758DF7DF-A8B1-4409-B79A-018E542B7251}.Release|x64.Build.0 = Release|Any CPU
 		{758DF7DF-A8B1-4409-B79A-018E542B7251}.Release|x64.Build.0 = Release|Any CPU
-		{758DF7DF-A8B1-4409-B79A-018E542B7251}.Steam|x64.ActiveCfg = Steam|Any CPU
-		{758DF7DF-A8B1-4409-B79A-018E542B7251}.Steam|x64.Build.0 = Steam|Any CPU
 		{758DF7DF-A8B1-4409-B79A-018E542B7251}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{758DF7DF-A8B1-4409-B79A-018E542B7251}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{758DF7DF-A8B1-4409-B79A-018E542B7251}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{758DF7DF-A8B1-4409-B79A-018E542B7251}.Debug|ARM64.Build.0 = Debug|Any CPU
-		{758DF7DF-A8B1-4409-B79A-018E542B7251}.DevSteam|x64.ActiveCfg = DevRelease|Any CPU
-		{758DF7DF-A8B1-4409-B79A-018E542B7251}.DevSteam|x64.Build.0 = DevRelease|Any CPU
 		{758DF7DF-A8B1-4409-B79A-018E542B7251}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{758DF7DF-A8B1-4409-B79A-018E542B7251}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{758DF7DF-A8B1-4409-B79A-018E542B7251}.Release|ARM64.Build.0 = Release|Any CPU
 		{758DF7DF-A8B1-4409-B79A-018E542B7251}.Release|ARM64.Build.0 = Release|Any CPU
+		{758DF7DF-A8B1-4409-B79A-018E542B7251}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{758DF7DF-A8B1-4409-B79A-018E542B7251}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{69DD5830-C682-49FB-B1A5-D2A506EEA06B}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{69DD5830-C682-49FB-B1A5-D2A506EEA06B}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{69DD5830-C682-49FB-B1A5-D2A506EEA06B}.Debug|x64.Build.0 = Debug|Any CPU
 		{69DD5830-C682-49FB-B1A5-D2A506EEA06B}.Debug|x64.Build.0 = Debug|Any CPU
 		{69DD5830-C682-49FB-B1A5-D2A506EEA06B}.MSIX Debug|x64.ActiveCfg = Debug|Any CPU
 		{69DD5830-C682-49FB-B1A5-D2A506EEA06B}.MSIX Debug|x64.ActiveCfg = Debug|Any CPU
@@ -258,6 +263,8 @@ Global
 		{69DD5830-C682-49FB-B1A5-D2A506EEA06B}.DevSteam|x64.Build.0 = Release|Any CPU
 		{69DD5830-C682-49FB-B1A5-D2A506EEA06B}.DevSteam|x64.Build.0 = Release|Any CPU
 		{69DD5830-C682-49FB-B1A5-D2A506EEA06B}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{69DD5830-C682-49FB-B1A5-D2A506EEA06B}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{69DD5830-C682-49FB-B1A5-D2A506EEA06B}.Release|ARM64.Build.0 = Release|Any CPU
 		{69DD5830-C682-49FB-B1A5-D2A506EEA06B}.Release|ARM64.Build.0 = Release|Any CPU
+		{69DD5830-C682-49FB-B1A5-D2A506EEA06B}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{69DD5830-C682-49FB-B1A5-D2A506EEA06B}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{1DC5B4C4-6902-4659-AE7E-17FDA0403DEB}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{1DC5B4C4-6902-4659-AE7E-17FDA0403DEB}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{1DC5B4C4-6902-4659-AE7E-17FDA0403DEB}.Debug|x64.Build.0 = Debug|Any CPU
 		{1DC5B4C4-6902-4659-AE7E-17FDA0403DEB}.Debug|x64.Build.0 = Debug|Any CPU
 		{1DC5B4C4-6902-4659-AE7E-17FDA0403DEB}.MSIX Debug|x64.ActiveCfg = Debug|Any CPU
 		{1DC5B4C4-6902-4659-AE7E-17FDA0403DEB}.MSIX Debug|x64.ActiveCfg = Debug|Any CPU
@@ -276,6 +283,8 @@ Global
 		{1DC5B4C4-6902-4659-AE7E-17FDA0403DEB}.DevSteam|x64.Build.0 = Release|Any CPU
 		{1DC5B4C4-6902-4659-AE7E-17FDA0403DEB}.DevSteam|x64.Build.0 = Release|Any CPU
 		{1DC5B4C4-6902-4659-AE7E-17FDA0403DEB}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{1DC5B4C4-6902-4659-AE7E-17FDA0403DEB}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{1DC5B4C4-6902-4659-AE7E-17FDA0403DEB}.Release|ARM64.Build.0 = Release|Any CPU
 		{1DC5B4C4-6902-4659-AE7E-17FDA0403DEB}.Release|ARM64.Build.0 = Release|Any CPU
+		{1DC5B4C4-6902-4659-AE7E-17FDA0403DEB}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{1DC5B4C4-6902-4659-AE7E-17FDA0403DEB}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{9BCD0764-9C16-4A2A-B153-C676FEF38887}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{9BCD0764-9C16-4A2A-B153-C676FEF38887}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{9BCD0764-9C16-4A2A-B153-C676FEF38887}.Debug|x64.Build.0 = Debug|Any CPU
 		{9BCD0764-9C16-4A2A-B153-C676FEF38887}.Debug|x64.Build.0 = Debug|Any CPU
 		{9BCD0764-9C16-4A2A-B153-C676FEF38887}.DevRelease|x64.ActiveCfg = Debug|Any CPU
 		{9BCD0764-9C16-4A2A-B153-C676FEF38887}.DevRelease|x64.ActiveCfg = Debug|Any CPU
@@ -294,6 +303,8 @@ Global
 		{9BCD0764-9C16-4A2A-B153-C676FEF38887}.DevSteam|x64.Build.0 = Release|Any CPU
 		{9BCD0764-9C16-4A2A-B153-C676FEF38887}.DevSteam|x64.Build.0 = Release|Any CPU
 		{9BCD0764-9C16-4A2A-B153-C676FEF38887}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{9BCD0764-9C16-4A2A-B153-C676FEF38887}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{9BCD0764-9C16-4A2A-B153-C676FEF38887}.Release|ARM64.Build.0 = Release|Any CPU
 		{9BCD0764-9C16-4A2A-B153-C676FEF38887}.Release|ARM64.Build.0 = Release|Any CPU
+		{9BCD0764-9C16-4A2A-B153-C676FEF38887}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{9BCD0764-9C16-4A2A-B153-C676FEF38887}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{2BDEB8C6-F22D-43EA-A309-B3387A803689}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{2BDEB8C6-F22D-43EA-A309-B3387A803689}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{2BDEB8C6-F22D-43EA-A309-B3387A803689}.Debug|x64.Build.0 = Debug|Any CPU
 		{2BDEB8C6-F22D-43EA-A309-B3387A803689}.Debug|x64.Build.0 = Debug|Any CPU
 		{2BDEB8C6-F22D-43EA-A309-B3387A803689}.DevRelease|x64.ActiveCfg = Debug|Any CPU
 		{2BDEB8C6-F22D-43EA-A309-B3387A803689}.DevRelease|x64.ActiveCfg = Debug|Any CPU
@@ -312,6 +323,8 @@ Global
 		{2BDEB8C6-F22D-43EA-A309-B3387A803689}.DevSteam|x64.Build.0 = Release|Any CPU
 		{2BDEB8C6-F22D-43EA-A309-B3387A803689}.DevSteam|x64.Build.0 = Release|Any CPU
 		{2BDEB8C6-F22D-43EA-A309-B3387A803689}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{2BDEB8C6-F22D-43EA-A309-B3387A803689}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{2BDEB8C6-F22D-43EA-A309-B3387A803689}.Release|ARM64.Build.0 = Release|Any CPU
 		{2BDEB8C6-F22D-43EA-A309-B3387A803689}.Release|ARM64.Build.0 = Release|Any CPU
+		{2BDEB8C6-F22D-43EA-A309-B3387A803689}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{2BDEB8C6-F22D-43EA-A309-B3387A803689}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{8EF48E6C-8219-4EE2-87C6-5176D8D092E6}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{8EF48E6C-8219-4EE2-87C6-5176D8D092E6}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{8EF48E6C-8219-4EE2-87C6-5176D8D092E6}.Debug|x64.Build.0 = Debug|Any CPU
 		{8EF48E6C-8219-4EE2-87C6-5176D8D092E6}.Debug|x64.Build.0 = Debug|Any CPU
 		{8EF48E6C-8219-4EE2-87C6-5176D8D092E6}.DevRelease|x64.ActiveCfg = Debug|Any CPU
 		{8EF48E6C-8219-4EE2-87C6-5176D8D092E6}.DevRelease|x64.ActiveCfg = Debug|Any CPU
@@ -326,6 +339,7 @@ Global
 		{8EF48E6C-8219-4EE2-87C6-5176D8D092E6}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{8EF48E6C-8219-4EE2-87C6-5176D8D092E6}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{8EF48E6C-8219-4EE2-87C6-5176D8D092E6}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{8EF48E6C-8219-4EE2-87C6-5176D8D092E6}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{8EF48E6C-8219-4EE2-87C6-5176D8D092E6}.DevSteam|x64.ActiveCfg = Release|Any CPU
 		{8EF48E6C-8219-4EE2-87C6-5176D8D092E6}.DevSteam|x64.ActiveCfg = Release|Any CPU
+		{8EF48E6C-8219-4EE2-87C6-5176D8D092E6}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
 		{7A12C96B-8B5C-45E1-9EF6-0B1DA7F270DE}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{7A12C96B-8B5C-45E1-9EF6-0B1DA7F270DE}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{7A12C96B-8B5C-45E1-9EF6-0B1DA7F270DE}.Debug|x64.Build.0 = Debug|Any CPU
 		{7A12C96B-8B5C-45E1-9EF6-0B1DA7F270DE}.Debug|x64.Build.0 = Debug|Any CPU
 		{7A12C96B-8B5C-45E1-9EF6-0B1DA7F270DE}.DevRelease|x64.ActiveCfg = Debug|Any CPU
 		{7A12C96B-8B5C-45E1-9EF6-0B1DA7F270DE}.DevRelease|x64.ActiveCfg = Debug|Any CPU
@@ -341,6 +355,7 @@ Global
 		{7A12C96B-8B5C-45E1-9EF6-0B1DA7F270DE}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{7A12C96B-8B5C-45E1-9EF6-0B1DA7F270DE}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{7A12C96B-8B5C-45E1-9EF6-0B1DA7F270DE}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{7A12C96B-8B5C-45E1-9EF6-0B1DA7F270DE}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{7A12C96B-8B5C-45E1-9EF6-0B1DA7F270DE}.Release|ARM64.Build.0 = Release|Any CPU
 		{7A12C96B-8B5C-45E1-9EF6-0B1DA7F270DE}.Release|ARM64.Build.0 = Release|Any CPU
+		{7A12C96B-8B5C-45E1-9EF6-0B1DA7F270DE}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
 		{1249EE2B-EB0D-411C-B311-53A7A22B7743}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{1249EE2B-EB0D-411C-B311-53A7A22B7743}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{1249EE2B-EB0D-411C-B311-53A7A22B7743}.Debug|x64.Build.0 = Debug|Any CPU
 		{1249EE2B-EB0D-411C-B311-53A7A22B7743}.Debug|x64.Build.0 = Debug|Any CPU
 		{1249EE2B-EB0D-411C-B311-53A7A22B7743}.DevRelease|x64.ActiveCfg = Debug|Any CPU
 		{1249EE2B-EB0D-411C-B311-53A7A22B7743}.DevRelease|x64.ActiveCfg = Debug|Any CPU
@@ -359,6 +374,8 @@ Global
 		{1249EE2B-EB0D-411C-B311-53A7A22B7743}.DevSteam|x64.Build.0 = Release|Any CPU
 		{1249EE2B-EB0D-411C-B311-53A7A22B7743}.DevSteam|x64.Build.0 = Release|Any CPU
 		{1249EE2B-EB0D-411C-B311-53A7A22B7743}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{1249EE2B-EB0D-411C-B311-53A7A22B7743}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{1249EE2B-EB0D-411C-B311-53A7A22B7743}.Release|ARM64.Build.0 = Release|Any CPU
 		{1249EE2B-EB0D-411C-B311-53A7A22B7743}.Release|ARM64.Build.0 = Release|Any CPU
+		{1249EE2B-EB0D-411C-B311-53A7A22B7743}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{1249EE2B-EB0D-411C-B311-53A7A22B7743}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{FA98BFA6-2E83-41C6-9102-76875B261F51}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{FA98BFA6-2E83-41C6-9102-76875B261F51}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{FA98BFA6-2E83-41C6-9102-76875B261F51}.Debug|x64.Build.0 = Debug|Any CPU
 		{FA98BFA6-2E83-41C6-9102-76875B261F51}.Debug|x64.Build.0 = Debug|Any CPU
 		{FA98BFA6-2E83-41C6-9102-76875B261F51}.DevRelease|x64.ActiveCfg = Debug|Any CPU
 		{FA98BFA6-2E83-41C6-9102-76875B261F51}.DevRelease|x64.ActiveCfg = Debug|Any CPU
@@ -377,6 +394,8 @@ Global
 		{FA98BFA6-2E83-41C6-9102-76875B261F51}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{FA98BFA6-2E83-41C6-9102-76875B261F51}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{FA98BFA6-2E83-41C6-9102-76875B261F51}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{FA98BFA6-2E83-41C6-9102-76875B261F51}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{FA98BFA6-2E83-41C6-9102-76875B261F51}.Release|ARM64.Build.0 = Release|Any CPU
 		{FA98BFA6-2E83-41C6-9102-76875B261F51}.Release|ARM64.Build.0 = Release|Any CPU
+		{FA98BFA6-2E83-41C6-9102-76875B261F51}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{FA98BFA6-2E83-41C6-9102-76875B261F51}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{16519035-0FF4-456F-B3F0-0ACA16E6920C}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{16519035-0FF4-456F-B3F0-0ACA16E6920C}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{16519035-0FF4-456F-B3F0-0ACA16E6920C}.Debug|x64.Build.0 = Debug|Any CPU
 		{16519035-0FF4-456F-B3F0-0ACA16E6920C}.Debug|x64.Build.0 = Debug|Any CPU
 		{16519035-0FF4-456F-B3F0-0ACA16E6920C}.DevRelease|x64.ActiveCfg = Debug|Any CPU
 		{16519035-0FF4-456F-B3F0-0ACA16E6920C}.DevRelease|x64.ActiveCfg = Debug|Any CPU
@@ -395,6 +414,8 @@ Global
 		{16519035-0FF4-456F-B3F0-0ACA16E6920C}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{16519035-0FF4-456F-B3F0-0ACA16E6920C}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{16519035-0FF4-456F-B3F0-0ACA16E6920C}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{16519035-0FF4-456F-B3F0-0ACA16E6920C}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{16519035-0FF4-456F-B3F0-0ACA16E6920C}.Release|ARM64.Build.0 = Release|Any CPU
 		{16519035-0FF4-456F-B3F0-0ACA16E6920C}.Release|ARM64.Build.0 = Release|Any CPU
+		{16519035-0FF4-456F-B3F0-0ACA16E6920C}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{16519035-0FF4-456F-B3F0-0ACA16E6920C}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{3DF64622-87E3-4870-B694-05D565251BB9}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{3DF64622-87E3-4870-B694-05D565251BB9}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{3DF64622-87E3-4870-B694-05D565251BB9}.Debug|x64.Build.0 = Debug|Any CPU
 		{3DF64622-87E3-4870-B694-05D565251BB9}.Debug|x64.Build.0 = Debug|Any CPU
 		{3DF64622-87E3-4870-B694-05D565251BB9}.DevRelease|x64.ActiveCfg = Debug|Any CPU
 		{3DF64622-87E3-4870-B694-05D565251BB9}.DevRelease|x64.ActiveCfg = Debug|Any CPU
@@ -411,6 +432,8 @@ Global
 		{3DF64622-87E3-4870-B694-05D565251BB9}.Steam|x64.Build.0 = Release|Any CPU
 		{3DF64622-87E3-4870-B694-05D565251BB9}.Steam|x64.Build.0 = Release|Any CPU
 		{3DF64622-87E3-4870-B694-05D565251BB9}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{3DF64622-87E3-4870-B694-05D565251BB9}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{3DF64622-87E3-4870-B694-05D565251BB9}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{3DF64622-87E3-4870-B694-05D565251BB9}.Debug|ARM64.Build.0 = Debug|Any CPU
+		{3DF64622-87E3-4870-B694-05D565251BB9}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{3DF64622-87E3-4870-B694-05D565251BB9}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{19704B2E-5EED-47CA-9258-89F246F50F19}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{19704B2E-5EED-47CA-9258-89F246F50F19}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{19704B2E-5EED-47CA-9258-89F246F50F19}.Debug|x64.Build.0 = Debug|Any CPU
 		{19704B2E-5EED-47CA-9258-89F246F50F19}.Debug|x64.Build.0 = Debug|Any CPU
 		{19704B2E-5EED-47CA-9258-89F246F50F19}.DevRelease|x64.ActiveCfg = Release|Any CPU
 		{19704B2E-5EED-47CA-9258-89F246F50F19}.DevRelease|x64.ActiveCfg = Release|Any CPU
@@ -427,6 +450,8 @@ Global
 		{19704B2E-5EED-47CA-9258-89F246F50F19}.Steam|x64.Build.0 = Release|Any CPU
 		{19704B2E-5EED-47CA-9258-89F246F50F19}.Steam|x64.Build.0 = Release|Any CPU
 		{19704B2E-5EED-47CA-9258-89F246F50F19}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{19704B2E-5EED-47CA-9258-89F246F50F19}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{19704B2E-5EED-47CA-9258-89F246F50F19}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{19704B2E-5EED-47CA-9258-89F246F50F19}.Debug|ARM64.Build.0 = Debug|Any CPU
+		{19704B2E-5EED-47CA-9258-89F246F50F19}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{19704B2E-5EED-47CA-9258-89F246F50F19}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{8F4FFC91-BE9F-4476-A372-FBD952865F15}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{8F4FFC91-BE9F-4476-A372-FBD952865F15}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{8F4FFC91-BE9F-4476-A372-FBD952865F15}.Debug|x64.Build.0 = Debug|Any CPU
 		{8F4FFC91-BE9F-4476-A372-FBD952865F15}.Debug|x64.Build.0 = Debug|Any CPU
 		{8F4FFC91-BE9F-4476-A372-FBD952865F15}.DevRelease|x64.ActiveCfg = Release|Any CPU
 		{8F4FFC91-BE9F-4476-A372-FBD952865F15}.DevRelease|x64.ActiveCfg = Release|Any CPU
@@ -445,6 +470,8 @@ Global
 		{8F4FFC91-BE9F-4476-A372-FBD952865F15}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{8F4FFC91-BE9F-4476-A372-FBD952865F15}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{8F4FFC91-BE9F-4476-A372-FBD952865F15}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{8F4FFC91-BE9F-4476-A372-FBD952865F15}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{8F4FFC91-BE9F-4476-A372-FBD952865F15}.Release|ARM64.Build.0 = Release|Any CPU
 		{8F4FFC91-BE9F-4476-A372-FBD952865F15}.Release|ARM64.Build.0 = Release|Any CPU
+		{8F4FFC91-BE9F-4476-A372-FBD952865F15}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{8F4FFC91-BE9F-4476-A372-FBD952865F15}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{71907779-F1D1-4AA6-BA11-E990DB089841}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{71907779-F1D1-4AA6-BA11-E990DB089841}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{71907779-F1D1-4AA6-BA11-E990DB089841}.Debug|x64.Build.0 = Debug|Any CPU
 		{71907779-F1D1-4AA6-BA11-E990DB089841}.Debug|x64.Build.0 = Debug|Any CPU
 		{71907779-F1D1-4AA6-BA11-E990DB089841}.DevRelease|x64.ActiveCfg = Debug|Any CPU
 		{71907779-F1D1-4AA6-BA11-E990DB089841}.DevRelease|x64.ActiveCfg = Debug|Any CPU
@@ -461,6 +488,8 @@ Global
 		{71907779-F1D1-4AA6-BA11-E990DB089841}.Steam|x64.Build.0 = Release|Any CPU
 		{71907779-F1D1-4AA6-BA11-E990DB089841}.Steam|x64.Build.0 = Release|Any CPU
 		{71907779-F1D1-4AA6-BA11-E990DB089841}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{71907779-F1D1-4AA6-BA11-E990DB089841}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{71907779-F1D1-4AA6-BA11-E990DB089841}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{71907779-F1D1-4AA6-BA11-E990DB089841}.Debug|ARM64.Build.0 = Debug|Any CPU
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{71907779-F1D1-4AA6-BA11-E990DB089841}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{B30622ED-9177-4930-8E64-2B2352D4D8DC}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{B30622ED-9177-4930-8E64-2B2352D4D8DC}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{B30622ED-9177-4930-8E64-2B2352D4D8DC}.Debug|x64.Build.0 = Debug|Any CPU
 		{B30622ED-9177-4930-8E64-2B2352D4D8DC}.Debug|x64.Build.0 = Debug|Any CPU
 		{B30622ED-9177-4930-8E64-2B2352D4D8DC}.DevRelease|x64.ActiveCfg = Debug|Any CPU
 		{B30622ED-9177-4930-8E64-2B2352D4D8DC}.DevRelease|x64.ActiveCfg = Debug|Any CPU
@@ -479,6 +508,8 @@ Global
 		{B30622ED-9177-4930-8E64-2B2352D4D8DC}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{B30622ED-9177-4930-8E64-2B2352D4D8DC}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{B30622ED-9177-4930-8E64-2B2352D4D8DC}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{B30622ED-9177-4930-8E64-2B2352D4D8DC}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{B30622ED-9177-4930-8E64-2B2352D4D8DC}.Release|ARM64.Build.0 = Release|Any CPU
 		{B30622ED-9177-4930-8E64-2B2352D4D8DC}.Release|ARM64.Build.0 = Release|Any CPU
+		{B30622ED-9177-4930-8E64-2B2352D4D8DC}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{B30622ED-9177-4930-8E64-2B2352D4D8DC}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{43C03D0E-EF50-4225-A268-CB9B8E0E8622}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{43C03D0E-EF50-4225-A268-CB9B8E0E8622}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{43C03D0E-EF50-4225-A268-CB9B8E0E8622}.Debug|x64.Build.0 = Debug|Any CPU
 		{43C03D0E-EF50-4225-A268-CB9B8E0E8622}.Debug|x64.Build.0 = Debug|Any CPU
 		{43C03D0E-EF50-4225-A268-CB9B8E0E8622}.DevRelease|x64.ActiveCfg = Debug|Any CPU
 		{43C03D0E-EF50-4225-A268-CB9B8E0E8622}.DevRelease|x64.ActiveCfg = Debug|Any CPU
@@ -497,6 +528,8 @@ Global
 		{43C03D0E-EF50-4225-A268-CB9B8E0E8622}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{43C03D0E-EF50-4225-A268-CB9B8E0E8622}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{43C03D0E-EF50-4225-A268-CB9B8E0E8622}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{43C03D0E-EF50-4225-A268-CB9B8E0E8622}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{43C03D0E-EF50-4225-A268-CB9B8E0E8622}.Release|ARM64.Build.0 = Release|Any CPU
 		{43C03D0E-EF50-4225-A268-CB9B8E0E8622}.Release|ARM64.Build.0 = Release|Any CPU
+		{43C03D0E-EF50-4225-A268-CB9B8E0E8622}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{43C03D0E-EF50-4225-A268-CB9B8E0E8622}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{5848FCF1-E127-4CE3-8A25-F37032819F8D}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{5848FCF1-E127-4CE3-8A25-F37032819F8D}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{5848FCF1-E127-4CE3-8A25-F37032819F8D}.Debug|x64.Build.0 = Debug|Any CPU
 		{5848FCF1-E127-4CE3-8A25-F37032819F8D}.Debug|x64.Build.0 = Debug|Any CPU
 		{5848FCF1-E127-4CE3-8A25-F37032819F8D}.DevRelease|x64.ActiveCfg = Debug|Any CPU
 		{5848FCF1-E127-4CE3-8A25-F37032819F8D}.DevRelease|x64.ActiveCfg = Debug|Any CPU
@@ -515,6 +548,8 @@ Global
 		{5848FCF1-E127-4CE3-8A25-F37032819F8D}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{5848FCF1-E127-4CE3-8A25-F37032819F8D}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{5848FCF1-E127-4CE3-8A25-F37032819F8D}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{5848FCF1-E127-4CE3-8A25-F37032819F8D}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{5848FCF1-E127-4CE3-8A25-F37032819F8D}.Release|ARM64.Build.0 = Release|Any CPU
 		{5848FCF1-E127-4CE3-8A25-F37032819F8D}.Release|ARM64.Build.0 = Release|Any CPU
+		{5848FCF1-E127-4CE3-8A25-F37032819F8D}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{5848FCF1-E127-4CE3-8A25-F37032819F8D}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{5E8F82CF-F48A-40B2-99E3-9BBB8725866A}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{5E8F82CF-F48A-40B2-99E3-9BBB8725866A}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{5E8F82CF-F48A-40B2-99E3-9BBB8725866A}.Debug|x64.Build.0 = Debug|Any CPU
 		{5E8F82CF-F48A-40B2-99E3-9BBB8725866A}.Debug|x64.Build.0 = Debug|Any CPU
 		{5E8F82CF-F48A-40B2-99E3-9BBB8725866A}.DevRelease|x64.ActiveCfg = Debug|Any CPU
 		{5E8F82CF-F48A-40B2-99E3-9BBB8725866A}.DevRelease|x64.ActiveCfg = Debug|Any CPU
@@ -533,6 +568,8 @@ Global
 		{5E8F82CF-F48A-40B2-99E3-9BBB8725866A}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{5E8F82CF-F48A-40B2-99E3-9BBB8725866A}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{5E8F82CF-F48A-40B2-99E3-9BBB8725866A}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{5E8F82CF-F48A-40B2-99E3-9BBB8725866A}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{5E8F82CF-F48A-40B2-99E3-9BBB8725866A}.Release|ARM64.Build.0 = Release|Any CPU
 		{5E8F82CF-F48A-40B2-99E3-9BBB8725866A}.Release|ARM64.Build.0 = Release|Any CPU
+		{5E8F82CF-F48A-40B2-99E3-9BBB8725866A}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{5E8F82CF-F48A-40B2-99E3-9BBB8725866A}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{9FCCD0CF-FF76-4638-A712-803EFBBC641F}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{9FCCD0CF-FF76-4638-A712-803EFBBC641F}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{9FCCD0CF-FF76-4638-A712-803EFBBC641F}.Debug|x64.Build.0 = Debug|Any CPU
 		{9FCCD0CF-FF76-4638-A712-803EFBBC641F}.Debug|x64.Build.0 = Debug|Any CPU
 		{9FCCD0CF-FF76-4638-A712-803EFBBC641F}.DevRelease|x64.ActiveCfg = Debug|Any CPU
 		{9FCCD0CF-FF76-4638-A712-803EFBBC641F}.DevRelease|x64.ActiveCfg = Debug|Any CPU
@@ -551,6 +588,8 @@ Global
 		{9FCCD0CF-FF76-4638-A712-803EFBBC641F}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{9FCCD0CF-FF76-4638-A712-803EFBBC641F}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{9FCCD0CF-FF76-4638-A712-803EFBBC641F}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{9FCCD0CF-FF76-4638-A712-803EFBBC641F}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{9FCCD0CF-FF76-4638-A712-803EFBBC641F}.Release|ARM64.Build.0 = Release|Any CPU
 		{9FCCD0CF-FF76-4638-A712-803EFBBC641F}.Release|ARM64.Build.0 = Release|Any CPU
+		{9FCCD0CF-FF76-4638-A712-803EFBBC641F}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{9FCCD0CF-FF76-4638-A712-803EFBBC641F}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{DA3AF3CC-43B2-4871-BDEC-CBE9222A8269}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{DA3AF3CC-43B2-4871-BDEC-CBE9222A8269}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{DA3AF3CC-43B2-4871-BDEC-CBE9222A8269}.Debug|x64.Build.0 = Debug|Any CPU
 		{DA3AF3CC-43B2-4871-BDEC-CBE9222A8269}.Debug|x64.Build.0 = Debug|Any CPU
 		{DA3AF3CC-43B2-4871-BDEC-CBE9222A8269}.DevRelease|x64.ActiveCfg = Debug|Any CPU
 		{DA3AF3CC-43B2-4871-BDEC-CBE9222A8269}.DevRelease|x64.ActiveCfg = Debug|Any CPU
@@ -567,6 +606,8 @@ Global
 		{DA3AF3CC-43B2-4871-BDEC-CBE9222A8269}.Steam|x64.Build.0 = Release|Any CPU
 		{DA3AF3CC-43B2-4871-BDEC-CBE9222A8269}.Steam|x64.Build.0 = Release|Any CPU
 		{DA3AF3CC-43B2-4871-BDEC-CBE9222A8269}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{DA3AF3CC-43B2-4871-BDEC-CBE9222A8269}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{DA3AF3CC-43B2-4871-BDEC-CBE9222A8269}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{DA3AF3CC-43B2-4871-BDEC-CBE9222A8269}.Debug|ARM64.Build.0 = Debug|Any CPU
+		{DA3AF3CC-43B2-4871-BDEC-CBE9222A8269}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{DA3AF3CC-43B2-4871-BDEC-CBE9222A8269}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{E46F2824-3CDA-40CB-AA57-8A4387E6B188}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{E46F2824-3CDA-40CB-AA57-8A4387E6B188}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{E46F2824-3CDA-40CB-AA57-8A4387E6B188}.Debug|x64.Build.0 = Debug|Any CPU
 		{E46F2824-3CDA-40CB-AA57-8A4387E6B188}.Debug|x64.Build.0 = Debug|Any CPU
 		{E46F2824-3CDA-40CB-AA57-8A4387E6B188}.DevRelease|x64.ActiveCfg = Debug|Any CPU
 		{E46F2824-3CDA-40CB-AA57-8A4387E6B188}.DevRelease|x64.ActiveCfg = Debug|Any CPU
@@ -585,6 +626,8 @@ Global
 		{E46F2824-3CDA-40CB-AA57-8A4387E6B188}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{E46F2824-3CDA-40CB-AA57-8A4387E6B188}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{E46F2824-3CDA-40CB-AA57-8A4387E6B188}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{E46F2824-3CDA-40CB-AA57-8A4387E6B188}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{E46F2824-3CDA-40CB-AA57-8A4387E6B188}.Release|ARM64.Build.0 = Release|Any CPU
 		{E46F2824-3CDA-40CB-AA57-8A4387E6B188}.Release|ARM64.Build.0 = Release|Any CPU
+		{E46F2824-3CDA-40CB-AA57-8A4387E6B188}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{E46F2824-3CDA-40CB-AA57-8A4387E6B188}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Debug|x64.Build.0 = Debug|Any CPU
 		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Debug|x64.Build.0 = Debug|Any CPU
 		{AE200ADC-9E85-4275-A373-E975CD6D518C}.DevRelease|x64.ActiveCfg = Debug|Any CPU
 		{AE200ADC-9E85-4275-A373-E975CD6D518C}.DevRelease|x64.ActiveCfg = Debug|Any CPU
@@ -600,6 +643,8 @@ Global
 		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Steam|x64.ActiveCfg = Release|Any CPU
 		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Steam|x64.ActiveCfg = Release|Any CPU
 		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Steam|x64.Build.0 = Release|Any CPU
 		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Steam|x64.Build.0 = Release|Any CPU
 		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{AE200ADC-9E85-4275-A373-E975CD6D518C}.Release|ARM64.ActiveCfg = Release|Any CPU
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{AE200ADC-9E85-4275-A373-E975CD6D518C}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{F2E992CA-12E3-49F3-B16F-2CEF5B191493}.Debug|x64.ActiveCfg = Debug|x64
 		{F2E992CA-12E3-49F3-B16F-2CEF5B191493}.Debug|x64.ActiveCfg = Debug|x64
 		{F2E992CA-12E3-49F3-B16F-2CEF5B191493}.Debug|x64.Build.0 = Debug|x64
 		{F2E992CA-12E3-49F3-B16F-2CEF5B191493}.Debug|x64.Build.0 = Debug|x64
 		{F2E992CA-12E3-49F3-B16F-2CEF5B191493}.Steam|x64.ActiveCfg = Steam|x64
 		{F2E992CA-12E3-49F3-B16F-2CEF5B191493}.Steam|x64.ActiveCfg = Steam|x64
@@ -614,6 +659,8 @@ Global
 		{F2E992CA-12E3-49F3-B16F-2CEF5B191493}.DevSteam|x64.Build.0 = DevSteam|x64
 		{F2E992CA-12E3-49F3-B16F-2CEF5B191493}.DevSteam|x64.Build.0 = DevSteam|x64
 		{F2E992CA-12E3-49F3-B16F-2CEF5B191493}.Release|ARM64.ActiveCfg = Release|arm64
 		{F2E992CA-12E3-49F3-B16F-2CEF5B191493}.Release|ARM64.ActiveCfg = Release|arm64
 		{F2E992CA-12E3-49F3-B16F-2CEF5B191493}.Release|ARM64.Build.0 = Release|arm64
 		{F2E992CA-12E3-49F3-B16F-2CEF5B191493}.Release|ARM64.Build.0 = Release|arm64
+		{F2E992CA-12E3-49F3-B16F-2CEF5B191493}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{F2E992CA-12E3-49F3-B16F-2CEF5B191493}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{D72E70F3-BF37-432F-B78B-5B247C873852}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{D72E70F3-BF37-432F-B78B-5B247C873852}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{D72E70F3-BF37-432F-B78B-5B247C873852}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{D72E70F3-BF37-432F-B78B-5B247C873852}.Debug|ARM64.Build.0 = Debug|Any CPU
 		{D72E70F3-BF37-432F-B78B-5B247C873852}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{D72E70F3-BF37-432F-B78B-5B247C873852}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -642,6 +689,8 @@ Global
 		{D72E70F3-BF37-432F-B78B-5B247C873852}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{D72E70F3-BF37-432F-B78B-5B247C873852}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{D72E70F3-BF37-432F-B78B-5B247C873852}.Steam|x64.ActiveCfg = Release|Any CPU
 		{D72E70F3-BF37-432F-B78B-5B247C873852}.Steam|x64.ActiveCfg = Release|Any CPU
 		{D72E70F3-BF37-432F-B78B-5B247C873852}.Steam|x64.Build.0 = Release|Any CPU
 		{D72E70F3-BF37-432F-B78B-5B247C873852}.Steam|x64.Build.0 = Release|Any CPU
+		{D72E70F3-BF37-432F-B78B-5B247C873852}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{D72E70F3-BF37-432F-B78B-5B247C873852}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{9B552A44-9587-4410-8673-254B31E2E4F7}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{9B552A44-9587-4410-8673-254B31E2E4F7}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{9B552A44-9587-4410-8673-254B31E2E4F7}.Debug|x64.Build.0 = Debug|Any CPU
 		{9B552A44-9587-4410-8673-254B31E2E4F7}.Debug|x64.Build.0 = Debug|Any CPU
 		{9B552A44-9587-4410-8673-254B31E2E4F7}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{9B552A44-9587-4410-8673-254B31E2E4F7}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -670,6 +719,8 @@ Global
 		{9B552A44-9587-4410-8673-254B31E2E4F7}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{9B552A44-9587-4410-8673-254B31E2E4F7}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{9B552A44-9587-4410-8673-254B31E2E4F7}.Steam|x64.ActiveCfg = Release|Any CPU
 		{9B552A44-9587-4410-8673-254B31E2E4F7}.Steam|x64.ActiveCfg = Release|Any CPU
 		{9B552A44-9587-4410-8673-254B31E2E4F7}.Steam|x64.Build.0 = Release|Any CPU
 		{9B552A44-9587-4410-8673-254B31E2E4F7}.Steam|x64.Build.0 = Release|Any CPU
+		{9B552A44-9587-4410-8673-254B31E2E4F7}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{9B552A44-9587-4410-8673-254B31E2E4F7}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{E92E7B0E-C24B-4087-9DD9-AD10DA3BE80A}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{E92E7B0E-C24B-4087-9DD9-AD10DA3BE80A}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{E92E7B0E-C24B-4087-9DD9-AD10DA3BE80A}.Debug|x64.Build.0 = Debug|Any CPU
 		{E92E7B0E-C24B-4087-9DD9-AD10DA3BE80A}.Debug|x64.Build.0 = Debug|Any CPU
 		{E92E7B0E-C24B-4087-9DD9-AD10DA3BE80A}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{E92E7B0E-C24B-4087-9DD9-AD10DA3BE80A}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -698,6 +749,8 @@ Global
 		{E92E7B0E-C24B-4087-9DD9-AD10DA3BE80A}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{E92E7B0E-C24B-4087-9DD9-AD10DA3BE80A}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{E92E7B0E-C24B-4087-9DD9-AD10DA3BE80A}.Steam|x64.ActiveCfg = Release|Any CPU
 		{E92E7B0E-C24B-4087-9DD9-AD10DA3BE80A}.Steam|x64.ActiveCfg = Release|Any CPU
 		{E92E7B0E-C24B-4087-9DD9-AD10DA3BE80A}.Steam|x64.Build.0 = Release|Any CPU
 		{E92E7B0E-C24B-4087-9DD9-AD10DA3BE80A}.Steam|x64.Build.0 = Release|Any CPU
+		{E92E7B0E-C24B-4087-9DD9-AD10DA3BE80A}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{E92E7B0E-C24B-4087-9DD9-AD10DA3BE80A}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{059904E2-9ACC-41E6-B78D-F0BC03CA9D78}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{059904E2-9ACC-41E6-B78D-F0BC03CA9D78}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{059904E2-9ACC-41E6-B78D-F0BC03CA9D78}.Debug|x64.Build.0 = Debug|Any CPU
 		{059904E2-9ACC-41E6-B78D-F0BC03CA9D78}.Debug|x64.Build.0 = Debug|Any CPU
 		{059904E2-9ACC-41E6-B78D-F0BC03CA9D78}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{059904E2-9ACC-41E6-B78D-F0BC03CA9D78}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -726,6 +779,8 @@ Global
 		{059904E2-9ACC-41E6-B78D-F0BC03CA9D78}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{059904E2-9ACC-41E6-B78D-F0BC03CA9D78}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{059904E2-9ACC-41E6-B78D-F0BC03CA9D78}.Steam|x64.ActiveCfg = Release|Any CPU
 		{059904E2-9ACC-41E6-B78D-F0BC03CA9D78}.Steam|x64.ActiveCfg = Release|Any CPU
 		{059904E2-9ACC-41E6-B78D-F0BC03CA9D78}.Steam|x64.Build.0 = Release|Any CPU
 		{059904E2-9ACC-41E6-B78D-F0BC03CA9D78}.Steam|x64.Build.0 = Release|Any CPU
+		{059904E2-9ACC-41E6-B78D-F0BC03CA9D78}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{059904E2-9ACC-41E6-B78D-F0BC03CA9D78}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{2B4A9926-0532-4C59-9289-37775A7499A4}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{2B4A9926-0532-4C59-9289-37775A7499A4}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{2B4A9926-0532-4C59-9289-37775A7499A4}.Debug|x64.Build.0 = Debug|Any CPU
 		{2B4A9926-0532-4C59-9289-37775A7499A4}.Debug|x64.Build.0 = Debug|Any CPU
 		{2B4A9926-0532-4C59-9289-37775A7499A4}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{2B4A9926-0532-4C59-9289-37775A7499A4}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -754,6 +809,8 @@ Global
 		{2B4A9926-0532-4C59-9289-37775A7499A4}.Steam|x64.Build.0 = Debug|Any CPU
 		{2B4A9926-0532-4C59-9289-37775A7499A4}.Steam|x64.Build.0 = Debug|Any CPU
 		{2B4A9926-0532-4C59-9289-37775A7499A4}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{2B4A9926-0532-4C59-9289-37775A7499A4}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{2B4A9926-0532-4C59-9289-37775A7499A4}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{2B4A9926-0532-4C59-9289-37775A7499A4}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{2B4A9926-0532-4C59-9289-37775A7499A4}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{2B4A9926-0532-4C59-9289-37775A7499A4}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{47BC7BC5-C070-49F4-8C8C-542DEDFC78B5}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{47BC7BC5-C070-49F4-8C8C-542DEDFC78B5}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{47BC7BC5-C070-49F4-8C8C-542DEDFC78B5}.Debug|x64.Build.0 = Debug|Any CPU
 		{47BC7BC5-C070-49F4-8C8C-542DEDFC78B5}.Debug|x64.Build.0 = Debug|Any CPU
 		{47BC7BC5-C070-49F4-8C8C-542DEDFC78B5}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{47BC7BC5-C070-49F4-8C8C-542DEDFC78B5}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -782,6 +839,8 @@ Global
 		{47BC7BC5-C070-49F4-8C8C-542DEDFC78B5}.Steam|x64.Build.0 = Debug|Any CPU
 		{47BC7BC5-C070-49F4-8C8C-542DEDFC78B5}.Steam|x64.Build.0 = Debug|Any CPU
 		{47BC7BC5-C070-49F4-8C8C-542DEDFC78B5}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{47BC7BC5-C070-49F4-8C8C-542DEDFC78B5}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{47BC7BC5-C070-49F4-8C8C-542DEDFC78B5}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{47BC7BC5-C070-49F4-8C8C-542DEDFC78B5}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{47BC7BC5-C070-49F4-8C8C-542DEDFC78B5}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{47BC7BC5-C070-49F4-8C8C-542DEDFC78B5}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{1CCCA0DF-C0D4-4482-B15D-BB9702726C04}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{1CCCA0DF-C0D4-4482-B15D-BB9702726C04}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{1CCCA0DF-C0D4-4482-B15D-BB9702726C04}.Debug|x64.Build.0 = Debug|Any CPU
 		{1CCCA0DF-C0D4-4482-B15D-BB9702726C04}.Debug|x64.Build.0 = Debug|Any CPU
 		{1CCCA0DF-C0D4-4482-B15D-BB9702726C04}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{1CCCA0DF-C0D4-4482-B15D-BB9702726C04}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -810,6 +869,8 @@ Global
 		{1CCCA0DF-C0D4-4482-B15D-BB9702726C04}.Steam|x64.Build.0 = Debug|Any CPU
 		{1CCCA0DF-C0D4-4482-B15D-BB9702726C04}.Steam|x64.Build.0 = Debug|Any CPU
 		{1CCCA0DF-C0D4-4482-B15D-BB9702726C04}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{1CCCA0DF-C0D4-4482-B15D-BB9702726C04}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{1CCCA0DF-C0D4-4482-B15D-BB9702726C04}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{1CCCA0DF-C0D4-4482-B15D-BB9702726C04}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{1CCCA0DF-C0D4-4482-B15D-BB9702726C04}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{1CCCA0DF-C0D4-4482-B15D-BB9702726C04}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{0D3DE5D1-D984-407D-B2A6-7945F011B636}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{0D3DE5D1-D984-407D-B2A6-7945F011B636}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{0D3DE5D1-D984-407D-B2A6-7945F011B636}.Debug|x64.Build.0 = Debug|Any CPU
 		{0D3DE5D1-D984-407D-B2A6-7945F011B636}.Debug|x64.Build.0 = Debug|Any CPU
 		{0D3DE5D1-D984-407D-B2A6-7945F011B636}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{0D3DE5D1-D984-407D-B2A6-7945F011B636}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -838,6 +899,8 @@ Global
 		{0D3DE5D1-D984-407D-B2A6-7945F011B636}.Steam|x64.Build.0 = Debug|Any CPU
 		{0D3DE5D1-D984-407D-B2A6-7945F011B636}.Steam|x64.Build.0 = Debug|Any CPU
 		{0D3DE5D1-D984-407D-B2A6-7945F011B636}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{0D3DE5D1-D984-407D-B2A6-7945F011B636}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{0D3DE5D1-D984-407D-B2A6-7945F011B636}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{0D3DE5D1-D984-407D-B2A6-7945F011B636}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{0D3DE5D1-D984-407D-B2A6-7945F011B636}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{0D3DE5D1-D984-407D-B2A6-7945F011B636}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.Debug|x64.Build.0 = Debug|Any CPU
 		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.Debug|x64.Build.0 = Debug|Any CPU
 		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -848,6 +911,8 @@ Global
 		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.Release|x64.Build.0 = Release|Any CPU
 		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.Release|x64.Build.0 = Release|Any CPU
 		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.Release|ARM64.ActiveCfg = Release|Any CPU
 		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.Release|ARM64.Build.0 = Release|Any CPU
 		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.Release|ARM64.Build.0 = Release|Any CPU
+		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{41B40602-2E8C-4B76-9BDB-B9FDE686ACCE}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{786E1F87-4A10-493E-88BD-3F2461DBFCA0}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{786E1F87-4A10-493E-88BD-3F2461DBFCA0}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{786E1F87-4A10-493E-88BD-3F2461DBFCA0}.Debug|x64.Build.0 = Debug|Any CPU
 		{786E1F87-4A10-493E-88BD-3F2461DBFCA0}.Debug|x64.Build.0 = Debug|Any CPU
 		{786E1F87-4A10-493E-88BD-3F2461DBFCA0}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{786E1F87-4A10-493E-88BD-3F2461DBFCA0}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -876,6 +941,8 @@ Global
 		{786E1F87-4A10-493E-88BD-3F2461DBFCA0}.Steam|x64.Build.0 = Debug|Any CPU
 		{786E1F87-4A10-493E-88BD-3F2461DBFCA0}.Steam|x64.Build.0 = Debug|Any CPU
 		{786E1F87-4A10-493E-88BD-3F2461DBFCA0}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{786E1F87-4A10-493E-88BD-3F2461DBFCA0}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{786E1F87-4A10-493E-88BD-3F2461DBFCA0}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{786E1F87-4A10-493E-88BD-3F2461DBFCA0}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{786E1F87-4A10-493E-88BD-3F2461DBFCA0}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{786E1F87-4A10-493E-88BD-3F2461DBFCA0}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{CD863C88-72E3-40F4-9AAE-5696BBB4460C}.Debug|ARM64.ActiveCfg = Release|arm64
 		{CD863C88-72E3-40F4-9AAE-5696BBB4460C}.Debug|ARM64.ActiveCfg = Release|arm64
 		{CD863C88-72E3-40F4-9AAE-5696BBB4460C}.Debug|ARM64.Build.0 = Release|arm64
 		{CD863C88-72E3-40F4-9AAE-5696BBB4460C}.Debug|ARM64.Build.0 = Release|arm64
 		{CD863C88-72E3-40F4-9AAE-5696BBB4460C}.Debug|x64.ActiveCfg = Debug|x64
 		{CD863C88-72E3-40F4-9AAE-5696BBB4460C}.Debug|x64.ActiveCfg = Debug|x64
@@ -904,6 +971,8 @@ Global
 		{CD863C88-72E3-40F4-9AAE-5696BBB4460C}.Steam|x64.Build.0 = Release|x64
 		{CD863C88-72E3-40F4-9AAE-5696BBB4460C}.Steam|x64.Build.0 = Release|x64
 		{CD863C88-72E3-40F4-9AAE-5696BBB4460C}.DevSteam|x64.ActiveCfg = Release|x64
 		{CD863C88-72E3-40F4-9AAE-5696BBB4460C}.DevSteam|x64.ActiveCfg = Release|x64
 		{CD863C88-72E3-40F4-9AAE-5696BBB4460C}.DevSteam|x64.Build.0 = Release|x64
 		{CD863C88-72E3-40F4-9AAE-5696BBB4460C}.DevSteam|x64.Build.0 = Release|x64
+		{CD863C88-72E3-40F4-9AAE-5696BBB4460C}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{CD863C88-72E3-40F4-9AAE-5696BBB4460C}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{8064811C-6A34-456E-A3F2-D77395009A29}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{8064811C-6A34-456E-A3F2-D77395009A29}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{8064811C-6A34-456E-A3F2-D77395009A29}.Debug|x64.Build.0 = Debug|Any CPU
 		{8064811C-6A34-456E-A3F2-D77395009A29}.Debug|x64.Build.0 = Debug|Any CPU
 		{8064811C-6A34-456E-A3F2-D77395009A29}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{8064811C-6A34-456E-A3F2-D77395009A29}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -932,6 +1001,8 @@ Global
 		{8064811C-6A34-456E-A3F2-D77395009A29}.Steam|x64.Build.0 = Debug|Any CPU
 		{8064811C-6A34-456E-A3F2-D77395009A29}.Steam|x64.Build.0 = Debug|Any CPU
 		{8064811C-6A34-456E-A3F2-D77395009A29}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{8064811C-6A34-456E-A3F2-D77395009A29}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{8064811C-6A34-456E-A3F2-D77395009A29}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{8064811C-6A34-456E-A3F2-D77395009A29}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{8064811C-6A34-456E-A3F2-D77395009A29}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{8064811C-6A34-456E-A3F2-D77395009A29}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{95D13D61-FBE6-4E10-9716-EDD749D0AEFC}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{95D13D61-FBE6-4E10-9716-EDD749D0AEFC}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{95D13D61-FBE6-4E10-9716-EDD749D0AEFC}.Debug|x64.Build.0 = Debug|Any CPU
 		{95D13D61-FBE6-4E10-9716-EDD749D0AEFC}.Debug|x64.Build.0 = Debug|Any CPU
 		{95D13D61-FBE6-4E10-9716-EDD749D0AEFC}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{95D13D61-FBE6-4E10-9716-EDD749D0AEFC}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -960,6 +1031,8 @@ Global
 		{95D13D61-FBE6-4E10-9716-EDD749D0AEFC}.Steam|x64.Build.0 = Debug|Any CPU
 		{95D13D61-FBE6-4E10-9716-EDD749D0AEFC}.Steam|x64.Build.0 = Debug|Any CPU
 		{95D13D61-FBE6-4E10-9716-EDD749D0AEFC}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{95D13D61-FBE6-4E10-9716-EDD749D0AEFC}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{95D13D61-FBE6-4E10-9716-EDD749D0AEFC}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{95D13D61-FBE6-4E10-9716-EDD749D0AEFC}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{95D13D61-FBE6-4E10-9716-EDD749D0AEFC}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{95D13D61-FBE6-4E10-9716-EDD749D0AEFC}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{52D94AD9-889A-4E80-861B-1DDE7E226F30}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{52D94AD9-889A-4E80-861B-1DDE7E226F30}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{52D94AD9-889A-4E80-861B-1DDE7E226F30}.Debug|x64.Build.0 = Debug|Any CPU
 		{52D94AD9-889A-4E80-861B-1DDE7E226F30}.Debug|x64.Build.0 = Debug|Any CPU
 		{52D94AD9-889A-4E80-861B-1DDE7E226F30}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{52D94AD9-889A-4E80-861B-1DDE7E226F30}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -988,6 +1061,8 @@ Global
 		{52D94AD9-889A-4E80-861B-1DDE7E226F30}.Steam|x64.Build.0 = Debug|Any CPU
 		{52D94AD9-889A-4E80-861B-1DDE7E226F30}.Steam|x64.Build.0 = Debug|Any CPU
 		{52D94AD9-889A-4E80-861B-1DDE7E226F30}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{52D94AD9-889A-4E80-861B-1DDE7E226F30}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{52D94AD9-889A-4E80-861B-1DDE7E226F30}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{52D94AD9-889A-4E80-861B-1DDE7E226F30}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{52D94AD9-889A-4E80-861B-1DDE7E226F30}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{52D94AD9-889A-4E80-861B-1DDE7E226F30}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{381734AE-F811-4544-AF85-49D8C0ABE1AE}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{381734AE-F811-4544-AF85-49D8C0ABE1AE}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{381734AE-F811-4544-AF85-49D8C0ABE1AE}.Debug|x64.Build.0 = Debug|Any CPU
 		{381734AE-F811-4544-AF85-49D8C0ABE1AE}.Debug|x64.Build.0 = Debug|Any CPU
 		{381734AE-F811-4544-AF85-49D8C0ABE1AE}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{381734AE-F811-4544-AF85-49D8C0ABE1AE}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -1016,6 +1091,8 @@ Global
 		{381734AE-F811-4544-AF85-49D8C0ABE1AE}.Steam|x64.Build.0 = Debug|Any CPU
 		{381734AE-F811-4544-AF85-49D8C0ABE1AE}.Steam|x64.Build.0 = Debug|Any CPU
 		{381734AE-F811-4544-AF85-49D8C0ABE1AE}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{381734AE-F811-4544-AF85-49D8C0ABE1AE}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{381734AE-F811-4544-AF85-49D8C0ABE1AE}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{381734AE-F811-4544-AF85-49D8C0ABE1AE}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{381734AE-F811-4544-AF85-49D8C0ABE1AE}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{381734AE-F811-4544-AF85-49D8C0ABE1AE}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{467EDEB3-6004-46B8-8448-2F5C4F131D75}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{467EDEB3-6004-46B8-8448-2F5C4F131D75}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{467EDEB3-6004-46B8-8448-2F5C4F131D75}.Debug|x64.Build.0 = Debug|Any CPU
 		{467EDEB3-6004-46B8-8448-2F5C4F131D75}.Debug|x64.Build.0 = Debug|Any CPU
 		{467EDEB3-6004-46B8-8448-2F5C4F131D75}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{467EDEB3-6004-46B8-8448-2F5C4F131D75}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -1044,6 +1121,8 @@ Global
 		{467EDEB3-6004-46B8-8448-2F5C4F131D75}.Steam|x64.Build.0 = Debug|Any CPU
 		{467EDEB3-6004-46B8-8448-2F5C4F131D75}.Steam|x64.Build.0 = Debug|Any CPU
 		{467EDEB3-6004-46B8-8448-2F5C4F131D75}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{467EDEB3-6004-46B8-8448-2F5C4F131D75}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{467EDEB3-6004-46B8-8448-2F5C4F131D75}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{467EDEB3-6004-46B8-8448-2F5C4F131D75}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{467EDEB3-6004-46B8-8448-2F5C4F131D75}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{467EDEB3-6004-46B8-8448-2F5C4F131D75}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{21152CEE-F9D7-452F-9FF5-B15FF80F2CED}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{21152CEE-F9D7-452F-9FF5-B15FF80F2CED}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{21152CEE-F9D7-452F-9FF5-B15FF80F2CED}.Debug|x64.Build.0 = Debug|Any CPU
 		{21152CEE-F9D7-452F-9FF5-B15FF80F2CED}.Debug|x64.Build.0 = Debug|Any CPU
 		{21152CEE-F9D7-452F-9FF5-B15FF80F2CED}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{21152CEE-F9D7-452F-9FF5-B15FF80F2CED}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -1072,6 +1151,8 @@ Global
 		{21152CEE-F9D7-452F-9FF5-B15FF80F2CED}.Steam|x64.Build.0 = Debug|Any CPU
 		{21152CEE-F9D7-452F-9FF5-B15FF80F2CED}.Steam|x64.Build.0 = Debug|Any CPU
 		{21152CEE-F9D7-452F-9FF5-B15FF80F2CED}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{21152CEE-F9D7-452F-9FF5-B15FF80F2CED}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{21152CEE-F9D7-452F-9FF5-B15FF80F2CED}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{21152CEE-F9D7-452F-9FF5-B15FF80F2CED}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{21152CEE-F9D7-452F-9FF5-B15FF80F2CED}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{21152CEE-F9D7-452F-9FF5-B15FF80F2CED}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{1346AE27-CCC8-4BC6-A52D-05B6A657ACD2}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{1346AE27-CCC8-4BC6-A52D-05B6A657ACD2}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{1346AE27-CCC8-4BC6-A52D-05B6A657ACD2}.Debug|x64.Build.0 = Debug|Any CPU
 		{1346AE27-CCC8-4BC6-A52D-05B6A657ACD2}.Debug|x64.Build.0 = Debug|Any CPU
 		{1346AE27-CCC8-4BC6-A52D-05B6A657ACD2}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{1346AE27-CCC8-4BC6-A52D-05B6A657ACD2}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -1100,6 +1181,8 @@ Global
 		{1346AE27-CCC8-4BC6-A52D-05B6A657ACD2}.Steam|x64.Build.0 = Debug|Any CPU
 		{1346AE27-CCC8-4BC6-A52D-05B6A657ACD2}.Steam|x64.Build.0 = Debug|Any CPU
 		{1346AE27-CCC8-4BC6-A52D-05B6A657ACD2}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{1346AE27-CCC8-4BC6-A52D-05B6A657ACD2}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{1346AE27-CCC8-4BC6-A52D-05B6A657ACD2}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{1346AE27-CCC8-4BC6-A52D-05B6A657ACD2}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{1346AE27-CCC8-4BC6-A52D-05B6A657ACD2}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{1346AE27-CCC8-4BC6-A52D-05B6A657ACD2}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{6D79C3E3-E31F-43B4-B173-3E6959230923}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{6D79C3E3-E31F-43B4-B173-3E6959230923}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{6D79C3E3-E31F-43B4-B173-3E6959230923}.Debug|x64.Build.0 = Debug|Any CPU
 		{6D79C3E3-E31F-43B4-B173-3E6959230923}.Debug|x64.Build.0 = Debug|Any CPU
 		{6D79C3E3-E31F-43B4-B173-3E6959230923}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{6D79C3E3-E31F-43B4-B173-3E6959230923}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -1128,6 +1211,8 @@ Global
 		{6D79C3E3-E31F-43B4-B173-3E6959230923}.Steam|x64.Build.0 = Debug|Any CPU
 		{6D79C3E3-E31F-43B4-B173-3E6959230923}.Steam|x64.Build.0 = Debug|Any CPU
 		{6D79C3E3-E31F-43B4-B173-3E6959230923}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{6D79C3E3-E31F-43B4-B173-3E6959230923}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{6D79C3E3-E31F-43B4-B173-3E6959230923}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{6D79C3E3-E31F-43B4-B173-3E6959230923}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{6D79C3E3-E31F-43B4-B173-3E6959230923}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{6D79C3E3-E31F-43B4-B173-3E6959230923}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{843F55B4-987B-45A9-BDBD-1A0A86CB883E}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{843F55B4-987B-45A9-BDBD-1A0A86CB883E}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{843F55B4-987B-45A9-BDBD-1A0A86CB883E}.Debug|x64.Build.0 = Debug|Any CPU
 		{843F55B4-987B-45A9-BDBD-1A0A86CB883E}.Debug|x64.Build.0 = Debug|Any CPU
 		{843F55B4-987B-45A9-BDBD-1A0A86CB883E}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{843F55B4-987B-45A9-BDBD-1A0A86CB883E}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -1156,6 +1241,8 @@ Global
 		{843F55B4-987B-45A9-BDBD-1A0A86CB883E}.Steam|x64.Build.0 = Debug|Any CPU
 		{843F55B4-987B-45A9-BDBD-1A0A86CB883E}.Steam|x64.Build.0 = Debug|Any CPU
 		{843F55B4-987B-45A9-BDBD-1A0A86CB883E}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{843F55B4-987B-45A9-BDBD-1A0A86CB883E}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{843F55B4-987B-45A9-BDBD-1A0A86CB883E}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{843F55B4-987B-45A9-BDBD-1A0A86CB883E}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{843F55B4-987B-45A9-BDBD-1A0A86CB883E}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{843F55B4-987B-45A9-BDBD-1A0A86CB883E}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{7BD495CA-2EB5-4ABC-BDDB-0E1765C40C19}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{7BD495CA-2EB5-4ABC-BDDB-0E1765C40C19}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{7BD495CA-2EB5-4ABC-BDDB-0E1765C40C19}.Debug|x64.Build.0 = Debug|Any CPU
 		{7BD495CA-2EB5-4ABC-BDDB-0E1765C40C19}.Debug|x64.Build.0 = Debug|Any CPU
 		{7BD495CA-2EB5-4ABC-BDDB-0E1765C40C19}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{7BD495CA-2EB5-4ABC-BDDB-0E1765C40C19}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -1184,6 +1271,8 @@ Global
 		{7BD495CA-2EB5-4ABC-BDDB-0E1765C40C19}.Steam|x64.Build.0 = Debug|Any CPU
 		{7BD495CA-2EB5-4ABC-BDDB-0E1765C40C19}.Steam|x64.Build.0 = Debug|Any CPU
 		{7BD495CA-2EB5-4ABC-BDDB-0E1765C40C19}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{7BD495CA-2EB5-4ABC-BDDB-0E1765C40C19}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{7BD495CA-2EB5-4ABC-BDDB-0E1765C40C19}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{7BD495CA-2EB5-4ABC-BDDB-0E1765C40C19}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{7BD495CA-2EB5-4ABC-BDDB-0E1765C40C19}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{7BD495CA-2EB5-4ABC-BDDB-0E1765C40C19}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{FA293BD3-2D99-47BA-8C4F-53F4997CE99C}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{FA293BD3-2D99-47BA-8C4F-53F4997CE99C}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{FA293BD3-2D99-47BA-8C4F-53F4997CE99C}.Debug|x64.Build.0 = Debug|Any CPU
 		{FA293BD3-2D99-47BA-8C4F-53F4997CE99C}.Debug|x64.Build.0 = Debug|Any CPU
 		{FA293BD3-2D99-47BA-8C4F-53F4997CE99C}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{FA293BD3-2D99-47BA-8C4F-53F4997CE99C}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -1212,6 +1301,8 @@ Global
 		{FA293BD3-2D99-47BA-8C4F-53F4997CE99C}.Steam|x64.Build.0 = Debug|Any CPU
 		{FA293BD3-2D99-47BA-8C4F-53F4997CE99C}.Steam|x64.Build.0 = Debug|Any CPU
 		{FA293BD3-2D99-47BA-8C4F-53F4997CE99C}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{FA293BD3-2D99-47BA-8C4F-53F4997CE99C}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{FA293BD3-2D99-47BA-8C4F-53F4997CE99C}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{FA293BD3-2D99-47BA-8C4F-53F4997CE99C}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{FA293BD3-2D99-47BA-8C4F-53F4997CE99C}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{FA293BD3-2D99-47BA-8C4F-53F4997CE99C}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{9CD22D8F-3F37-44F8-B106-7C1E02016F82}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{9CD22D8F-3F37-44F8-B106-7C1E02016F82}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{9CD22D8F-3F37-44F8-B106-7C1E02016F82}.Debug|x64.Build.0 = Debug|Any CPU
 		{9CD22D8F-3F37-44F8-B106-7C1E02016F82}.Debug|x64.Build.0 = Debug|Any CPU
 		{9CD22D8F-3F37-44F8-B106-7C1E02016F82}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{9CD22D8F-3F37-44F8-B106-7C1E02016F82}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -1240,6 +1331,8 @@ Global
 		{9CD22D8F-3F37-44F8-B106-7C1E02016F82}.Steam|x64.Build.0 = Debug|Any CPU
 		{9CD22D8F-3F37-44F8-B106-7C1E02016F82}.Steam|x64.Build.0 = Debug|Any CPU
 		{9CD22D8F-3F37-44F8-B106-7C1E02016F82}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{9CD22D8F-3F37-44F8-B106-7C1E02016F82}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{9CD22D8F-3F37-44F8-B106-7C1E02016F82}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{9CD22D8F-3F37-44F8-B106-7C1E02016F82}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{9CD22D8F-3F37-44F8-B106-7C1E02016F82}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{9CD22D8F-3F37-44F8-B106-7C1E02016F82}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{0258658B-78D5-4790-AF27-94B065DF529C}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{0258658B-78D5-4790-AF27-94B065DF529C}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{0258658B-78D5-4790-AF27-94B065DF529C}.Debug|x64.Build.0 = Debug|Any CPU
 		{0258658B-78D5-4790-AF27-94B065DF529C}.Debug|x64.Build.0 = Debug|Any CPU
 		{0258658B-78D5-4790-AF27-94B065DF529C}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{0258658B-78D5-4790-AF27-94B065DF529C}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -1268,6 +1361,8 @@ Global
 		{0258658B-78D5-4790-AF27-94B065DF529C}.Steam|x64.Build.0 = Debug|Any CPU
 		{0258658B-78D5-4790-AF27-94B065DF529C}.Steam|x64.Build.0 = Debug|Any CPU
 		{0258658B-78D5-4790-AF27-94B065DF529C}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{0258658B-78D5-4790-AF27-94B065DF529C}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{0258658B-78D5-4790-AF27-94B065DF529C}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{0258658B-78D5-4790-AF27-94B065DF529C}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{0258658B-78D5-4790-AF27-94B065DF529C}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{0258658B-78D5-4790-AF27-94B065DF529C}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{885A99AB-86F0-4D8E-A989-FB0000C1662D}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{885A99AB-86F0-4D8E-A989-FB0000C1662D}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{885A99AB-86F0-4D8E-A989-FB0000C1662D}.Debug|x64.Build.0 = Debug|Any CPU
 		{885A99AB-86F0-4D8E-A989-FB0000C1662D}.Debug|x64.Build.0 = Debug|Any CPU
 		{885A99AB-86F0-4D8E-A989-FB0000C1662D}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{885A99AB-86F0-4D8E-A989-FB0000C1662D}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -1296,6 +1391,8 @@ Global
 		{885A99AB-86F0-4D8E-A989-FB0000C1662D}.Steam|x64.Build.0 = Debug|Any CPU
 		{885A99AB-86F0-4D8E-A989-FB0000C1662D}.Steam|x64.Build.0 = Debug|Any CPU
 		{885A99AB-86F0-4D8E-A989-FB0000C1662D}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{885A99AB-86F0-4D8E-A989-FB0000C1662D}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{885A99AB-86F0-4D8E-A989-FB0000C1662D}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{885A99AB-86F0-4D8E-A989-FB0000C1662D}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{885A99AB-86F0-4D8E-A989-FB0000C1662D}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{885A99AB-86F0-4D8E-A989-FB0000C1662D}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{ED673353-3433-4FCB-9199-0F8DE0968F52}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{ED673353-3433-4FCB-9199-0F8DE0968F52}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{ED673353-3433-4FCB-9199-0F8DE0968F52}.Debug|x64.Build.0 = Debug|Any CPU
 		{ED673353-3433-4FCB-9199-0F8DE0968F52}.Debug|x64.Build.0 = Debug|Any CPU
 		{ED673353-3433-4FCB-9199-0F8DE0968F52}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{ED673353-3433-4FCB-9199-0F8DE0968F52}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -1324,6 +1421,8 @@ Global
 		{ED673353-3433-4FCB-9199-0F8DE0968F52}.Steam|x64.Build.0 = Debug|Any CPU
 		{ED673353-3433-4FCB-9199-0F8DE0968F52}.Steam|x64.Build.0 = Debug|Any CPU
 		{ED673353-3433-4FCB-9199-0F8DE0968F52}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{ED673353-3433-4FCB-9199-0F8DE0968F52}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{ED673353-3433-4FCB-9199-0F8DE0968F52}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{ED673353-3433-4FCB-9199-0F8DE0968F52}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{ED673353-3433-4FCB-9199-0F8DE0968F52}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{ED673353-3433-4FCB-9199-0F8DE0968F52}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{7EE8ED1A-000A-4583-BDBF-EA8B90314CFE}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{7EE8ED1A-000A-4583-BDBF-EA8B90314CFE}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{7EE8ED1A-000A-4583-BDBF-EA8B90314CFE}.Debug|x64.Build.0 = Debug|Any CPU
 		{7EE8ED1A-000A-4583-BDBF-EA8B90314CFE}.Debug|x64.Build.0 = Debug|Any CPU
 		{7EE8ED1A-000A-4583-BDBF-EA8B90314CFE}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{7EE8ED1A-000A-4583-BDBF-EA8B90314CFE}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -1352,6 +1451,8 @@ Global
 		{7EE8ED1A-000A-4583-BDBF-EA8B90314CFE}.Steam|x64.Build.0 = Debug|Any CPU
 		{7EE8ED1A-000A-4583-BDBF-EA8B90314CFE}.Steam|x64.Build.0 = Debug|Any CPU
 		{7EE8ED1A-000A-4583-BDBF-EA8B90314CFE}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{7EE8ED1A-000A-4583-BDBF-EA8B90314CFE}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{7EE8ED1A-000A-4583-BDBF-EA8B90314CFE}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{7EE8ED1A-000A-4583-BDBF-EA8B90314CFE}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{7EE8ED1A-000A-4583-BDBF-EA8B90314CFE}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{7EE8ED1A-000A-4583-BDBF-EA8B90314CFE}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{9AC42CC4-F6A3-4652-951B-17CE4DFC5CC1}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{9AC42CC4-F6A3-4652-951B-17CE4DFC5CC1}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{9AC42CC4-F6A3-4652-951B-17CE4DFC5CC1}.Debug|x64.Build.0 = Debug|Any CPU
 		{9AC42CC4-F6A3-4652-951B-17CE4DFC5CC1}.Debug|x64.Build.0 = Debug|Any CPU
 		{9AC42CC4-F6A3-4652-951B-17CE4DFC5CC1}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{9AC42CC4-F6A3-4652-951B-17CE4DFC5CC1}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -1380,6 +1481,8 @@ Global
 		{9AC42CC4-F6A3-4652-951B-17CE4DFC5CC1}.Steam|x64.Build.0 = Debug|Any CPU
 		{9AC42CC4-F6A3-4652-951B-17CE4DFC5CC1}.Steam|x64.Build.0 = Debug|Any CPU
 		{9AC42CC4-F6A3-4652-951B-17CE4DFC5CC1}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{9AC42CC4-F6A3-4652-951B-17CE4DFC5CC1}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{9AC42CC4-F6A3-4652-951B-17CE4DFC5CC1}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{9AC42CC4-F6A3-4652-951B-17CE4DFC5CC1}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{9AC42CC4-F6A3-4652-951B-17CE4DFC5CC1}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{9AC42CC4-F6A3-4652-951B-17CE4DFC5CC1}.DebugSteam|x64.Build.0 = DebugSteam|x64
 		{E93941F3-0476-44DA-80BE-CE8F4776297C}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{E93941F3-0476-44DA-80BE-CE8F4776297C}.Debug|x64.ActiveCfg = Debug|Any CPU
 		{E93941F3-0476-44DA-80BE-CE8F4776297C}.Debug|x64.Build.0 = Debug|Any CPU
 		{E93941F3-0476-44DA-80BE-CE8F4776297C}.Debug|x64.Build.0 = Debug|Any CPU
 		{E93941F3-0476-44DA-80BE-CE8F4776297C}.Debug|ARM64.ActiveCfg = Debug|Any CPU
 		{E93941F3-0476-44DA-80BE-CE8F4776297C}.Debug|ARM64.ActiveCfg = Debug|Any CPU
@@ -1408,6 +1511,8 @@ Global
 		{E93941F3-0476-44DA-80BE-CE8F4776297C}.Steam|x64.Build.0 = Debug|Any CPU
 		{E93941F3-0476-44DA-80BE-CE8F4776297C}.Steam|x64.Build.0 = Debug|Any CPU
 		{E93941F3-0476-44DA-80BE-CE8F4776297C}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{E93941F3-0476-44DA-80BE-CE8F4776297C}.Steam|ARM64.ActiveCfg = Debug|Any CPU
 		{E93941F3-0476-44DA-80BE-CE8F4776297C}.Steam|ARM64.Build.0 = Debug|Any CPU
 		{E93941F3-0476-44DA-80BE-CE8F4776297C}.Steam|ARM64.Build.0 = Debug|Any CPU
+		{E93941F3-0476-44DA-80BE-CE8F4776297C}.DebugSteam|x64.ActiveCfg = DebugSteam|x64
+		{E93941F3-0476-44DA-80BE-CE8F4776297C}.DebugSteam|x64.Build.0 = DebugSteam|x64
 	EndGlobalSection
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 		HideSolutionNode = FALSE

+ 4 - 3
src/PixiEditor/Data/Localization/Languages/en.json

@@ -1036,14 +1036,13 @@
   "FAIL_LOAD_USER_DATA": "Failed to load saved user data",
   "FAIL_LOAD_USER_DATA": "Failed to load saved user data",
   "LOGOUT": "Logout",
   "LOGOUT": "Logout",
   "LOGGED_IN_AS": "Hello",
   "LOGGED_IN_AS": "Hello",
-  "AVATAR_INFO": "Profile taken from Gravatar.\nEdit at gravatar.com",
   "EMAIL_SENT": "Email sent! Check your inbox.",
   "EMAIL_SENT": "Email sent! Check your inbox.",
   "RESEND_ACTIVATION": "Resend",
   "RESEND_ACTIVATION": "Resend",
   "INVALID_TOKEN": "Session is invalid or expired. Please log in again.",
   "INVALID_TOKEN": "Session is invalid or expired. Please log in again.",
   "ENTER_EMAIL": "Enter your email",
   "ENTER_EMAIL": "Enter your email",
   "LOGIN_LINK": "Send Login Link",
   "LOGIN_LINK": "Send Login Link",
   "LOGIN_LINK_INFO": "We'll email you a secure link to log in. No password needed.",
   "LOGIN_LINK_INFO": "We'll email you a secure link to log in. No password needed.",
-  "ACCOUNT_WINDOW_TITLE": "Founder's Account",
+  "ACCOUNT_WINDOW_TITLE": "Account",
   "CONNECTION_TIMEOUT": "Connection timed out. Please try again.",
   "CONNECTION_TIMEOUT": "Connection timed out. Please try again.",
   "OPEN_ACCOUNT_WINDOW": "Manage Account",
   "OPEN_ACCOUNT_WINDOW": "Manage Account",
   "AUTO_SCALE_BACKGROUND": "Auto scale background",
   "AUTO_SCALE_BACKGROUND": "Auto scale background",
@@ -1055,5 +1054,7 @@
   "RESET": "Reset",
   "RESET": "Reset",
   "INSTALL": "Install",
   "INSTALL": "Install",
   "MANAGE_ACCOUNT": "Manage",
   "MANAGE_ACCOUNT": "Manage",
-  "OWNED_PRODUCTS": "Owned Content"
+  "OWNED_PRODUCTS": "Owned Content",
+  "INSTALLED": "Installed",
+  "ACCOUNT_PROVIDER_INFO": "Account handled by"
 }
 }

+ 12 - 6
src/PixiEditor/PixiEditor.csproj

@@ -12,7 +12,7 @@
     <PackageIcon>icon.ico</PackageIcon>
     <PackageIcon>icon.ico</PackageIcon>
     <ApplicationIcon>..\icon.ico</ApplicationIcon>
     <ApplicationIcon>..\icon.ico</ApplicationIcon>
     <Authors>Krzysztof Krysiński, Egor Mozgovoy, CPK, Contributors</Authors>
     <Authors>Krzysztof Krysiński, Egor Mozgovoy, CPK, Contributors</Authors>
-    <Configurations>Debug;Release;MSIX;MSIX Debug;Steam;DevRelease;DevSteam</Configurations>
+    <Configurations>Debug;Release;MSIX;MSIX Debug;Steam;DevRelease;DevSteam;DebugSteam</Configurations>
     <Platforms>x64;arm64</Platforms>
     <Platforms>x64;arm64</Platforms>
     <RuntimeIdentifiers>win-x64;win-arm64;linux-x64;linux-arm64;osx-x64;osx-arm64</RuntimeIdentifiers>
     <RuntimeIdentifiers>win-x64;win-arm64;linux-x64;linux-arm64;osx-x64;osx-arm64</RuntimeIdentifiers>
     <ImplicitUsings>true</ImplicitUsings>
     <ImplicitUsings>true</ImplicitUsings>
@@ -51,6 +51,11 @@
   <ItemGroup Condition="'$(Configuration)' == 'DevSteam'">
   <ItemGroup Condition="'$(Configuration)' == 'DevSteam'">
     <ProjectReference Include="..\PixiEditor.Platform.Steam\PixiEditor.Platform.Steam.csproj"/>
     <ProjectReference Include="..\PixiEditor.Platform.Steam\PixiEditor.Platform.Steam.csproj"/>
   </ItemGroup>
   </ItemGroup>
+  
+  <ItemGroup Condition="'$(Configuration)' == 'DebugSteam'">
+    <ProjectReference Include="..\PixiEditor.Platform.Steam\PixiEditor.Platform.Steam.csproj"/>
+  </ItemGroup>
+
 
 
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
   <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
     <ProjectReference Include="..\PixiEditor.Platform.Standalone\PixiEditor.Platform.Standalone.csproj"/>
     <ProjectReference Include="..\PixiEditor.Platform.Standalone\PixiEditor.Platform.Standalone.csproj"/>
@@ -92,6 +97,7 @@
     <PackageReference Include="Avalonia.Svg.Skia" Version="11.2.0.2"/>
     <PackageReference Include="Avalonia.Svg.Skia" Version="11.2.0.2"/>
     <!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
     <!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
     <PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="$(AvaloniaVersion)"/>
     <PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="$(AvaloniaVersion)"/>
+    <PackageReference Condition="'$(Configuration)' == 'DebugSteam'" Include="Avalonia.Diagnostics" Version="$(AvaloniaVersion)"/>
     <PackageReference Include="ByteSize" Version="2.1.2"/>
     <PackageReference Include="ByteSize" Version="2.1.2"/>
     <PackageReference Include="CLSEncoderDecoder" Version="1.0.0"/>
     <PackageReference Include="CLSEncoderDecoder" Version="1.0.0"/>
     <PackageReference Include="CommunityToolkit.Mvvm" Version="8.3.2"/>
     <PackageReference Include="CommunityToolkit.Mvvm" Version="8.3.2"/>
@@ -103,13 +109,13 @@
   </ItemGroup>
   </ItemGroup>
 
 
   <ItemGroup>
   <ItemGroup>
-    <ProjectReference Include="..\ColorPicker\src\ColorPicker.AvaloniaUI\ColorPicker.AvaloniaUI.csproj" />
+    <ProjectReference Include="..\ColorPicker\src\ColorPicker.AvaloniaUI\ColorPicker.AvaloniaUI.csproj"/>
     <ProjectReference Include="..\Drawie\src\Drawie.Interop.Avalonia\Drawie.Interop.Avalonia.csproj"/>
     <ProjectReference Include="..\Drawie\src\Drawie.Interop.Avalonia\Drawie.Interop.Avalonia.csproj"/>
     <ProjectReference Include="..\Drawie\src\Drawie.Interop.Avalonia.Core\Drawie.Interop.Avalonia.Core.csproj"/>
     <ProjectReference Include="..\Drawie\src\Drawie.Interop.Avalonia.Core\Drawie.Interop.Avalonia.Core.csproj"/>
     <ProjectReference Include="..\PixiDocks\src\PixiDocks.Avalonia\PixiDocks.Avalonia.csproj"/>
     <ProjectReference Include="..\PixiDocks\src\PixiDocks.Avalonia\PixiDocks.Avalonia.csproj"/>
-    <ProjectReference Include="..\PixiEditor.IdentityProvider.PixiAuth\PixiEditor.IdentityProvider.PixiAuth.csproj" />
-    <ProjectReference Include="..\PixiEditor.IdentityProvider\PixiEditor.IdentityProvider.csproj" />
-    <ProjectReference Include="..\PixiEditor.PixiAuth\PixiEditor.PixiAuth.csproj" />
+    <ProjectReference Include="..\PixiEditor.IdentityProvider.PixiAuth\PixiEditor.IdentityProvider.PixiAuth.csproj"/>
+    <ProjectReference Include="..\PixiEditor.IdentityProvider\PixiEditor.IdentityProvider.csproj"/>
+    <ProjectReference Include="..\PixiEditor.PixiAuth\PixiEditor.PixiAuth.csproj"/>
     <ProjectReference Include="..\PixiEditor.SVG\PixiEditor.SVG.csproj"/>
     <ProjectReference Include="..\PixiEditor.SVG\PixiEditor.SVG.csproj"/>
     <ProjectReference Include="..\PixiParser\src\PixiParser.Skia\PixiParser.Skia.csproj"/>
     <ProjectReference Include="..\PixiParser\src\PixiParser.Skia\PixiParser.Skia.csproj"/>
     <ProjectReference Include="..\PixiParser\src\PixiParser\PixiParser.csproj"/>
     <ProjectReference Include="..\PixiParser\src\PixiParser\PixiParser.csproj"/>
@@ -158,7 +164,7 @@
 
 
   <ItemGroup>
   <ItemGroup>
     <Folder Include="Extensions\"/>
     <Folder Include="Extensions\"/>
-    <Folder Include="Models\User\" />
+    <Folder Include="Models\User\"/>
   </ItemGroup>
   </ItemGroup>
 
 
 </Project>
 </Project>

+ 21 - 7
src/PixiEditor/ViewModels/SubViewModels/UserViewModel.cs

@@ -67,7 +67,8 @@ internal class UserViewModel : SubViewModel<ViewModelMain>
         }
         }
     }
     }
 
 
-    public ObservableCollection<string> OwnedProducts => new(IdentityProvider?.User?.OwnedProducts ?? new List<string>());
+    public ObservableCollection<ProductData> OwnedProducts =>
+        new(IdentityProvider?.User?.OwnedProducts ?? new List<ProductData>());
 
 
     private string currentEmail = string.Empty;
     private string currentEmail = string.Empty;
 
 
@@ -94,7 +95,7 @@ internal class UserViewModel : SubViewModel<ViewModelMain>
         RequestLoginCommand = new AsyncRelayCommand<string>(RequestLogin, CanRequestLogin);
         RequestLoginCommand = new AsyncRelayCommand<string>(RequestLogin, CanRequestLogin);
         TryValidateSessionCommand = new AsyncRelayCommand(TryValidateSession);
         TryValidateSessionCommand = new AsyncRelayCommand(TryValidateSession);
         ResendActivationCommand = new AsyncRelayCommand<string>(ResendActivation, CanResendActivation);
         ResendActivationCommand = new AsyncRelayCommand<string>(ResendActivation, CanResendActivation);
-        InstallContentCommand = new AsyncRelayCommand<string>(InstallContent);
+        InstallContentCommand = new AsyncRelayCommand<string>(InstallContent, CanInstallContent);
         LogoutCommand = new AsyncRelayCommand(Logout);
         LogoutCommand = new AsyncRelayCommand(Logout);
 
 
         IdentityProvider.OnError += OnError;
         IdentityProvider.OnError += OnError;
@@ -114,7 +115,7 @@ internal class UserViewModel : SubViewModel<ViewModelMain>
         NotifyProperties();
         NotifyProperties();
     }
     }
 
 
-    private void IdentityProviderOnOwnedProductsUpdated(List<string> products)
+    private void IdentityProviderOnOwnedProductsUpdated(List<ProductData> products)
     {
     {
         NotifyProperties();
         NotifyProperties();
     }
     }
@@ -258,14 +259,26 @@ internal class UserViewModel : SubViewModel<ViewModelMain>
         }
         }
     }
     }
 
 
-    public async Task InstallContent(string productId)
+    public bool CanInstallContent(string productId)
     {
     {
-        LastError = null;
-        if (IdentityProvider is not PixiAuthIdentityProvider pixiAuthIdentityProvider)
+        return !IsInstalled(productId);
+    }
+
+    private bool IsInstalled(string productId)
+    {
+        if (AdditionalContentProvider.IsInstalled(productId))
         {
         {
-            return;
+            return true;
         }
         }
 
 
+        return Owner.ExtensionsSubViewModel.ExtensionLoader.LoadedExtensions.Any(x =>
+            x.Metadata.UniqueName == productId);
+    }
+
+    public async Task InstallContent(string productId)
+    {
+        LastError = null;
+
         if (string.IsNullOrEmpty(productId))
         if (string.IsNullOrEmpty(productId))
         {
         {
             return;
             return;
@@ -300,6 +313,7 @@ internal class UserViewModel : SubViewModel<ViewModelMain>
     private void NotifyProperties()
     private void NotifyProperties()
     {
     {
         OnPropertyChanged(nameof(User));
         OnPropertyChanged(nameof(User));
+        OnPropertyChanged(nameof(Username));
         OnPropertyChanged(nameof(NotLoggedIn));
         OnPropertyChanged(nameof(NotLoggedIn));
         OnPropertyChanged(nameof(WaitingForActivation));
         OnPropertyChanged(nameof(WaitingForActivation));
         OnPropertyChanged(nameof(IsLoggedIn));
         OnPropertyChanged(nameof(IsLoggedIn));

+ 9 - 4
src/PixiEditor/Views/Auth/LoginForm.axaml

@@ -65,23 +65,28 @@
             </Panel>
             </Panel>
             <TextBlock Text="✕" IsVisible="{Binding !!LastError}" TextWrapping="Wrap"
             <TextBlock Text="✕" IsVisible="{Binding !!LastError}" TextWrapping="Wrap"
                        Foreground="{DynamicResource ErrorOnDarkBrush}">
                        Foreground="{DynamicResource ErrorOnDarkBrush}">
-                <Run Text=""/>
+                <Run Text="" />
                 <Run ui:Translator.LocalizedString="{Binding LastError}" />
                 <Run ui:Translator.LocalizedString="{Binding LastError}" />
             </TextBlock>
             </TextBlock>
         </StackPanel>
         </StackPanel>
         <StackPanel IsVisible="{Binding IsLoggedIn}" Margin="5" Spacing="12" Orientation="Vertical">
         <StackPanel IsVisible="{Binding IsLoggedIn}" Margin="5" Spacing="12" Orientation="Vertical">
             <Border ClipToBounds="True" Width="100" Height="100" CornerRadius="100">
             <Border ClipToBounds="True" Width="100" Height="100" CornerRadius="100">
-                <HyperlinkButton NavigateUri="https://gravatar.com/connect" Cursor="Hand"
-                                 ui:Translator.TooltipKey="AVATAR_INFO">
+                <HyperlinkButton NavigateUri="{Binding IdentityProvider.EditProfileUrl}"
+                                 ToolTip.Tip="{Binding IdentityProvider.EditProfileUrl}"
+                                 Cursor="Hand">
                     <Image asyncImageLoader:ImageLoader.Source="{Binding AvatarUrl}" />
                     <Image asyncImageLoader:ImageLoader.Source="{Binding AvatarUrl}" />
                 </HyperlinkButton>
                 </HyperlinkButton>
             </Border>
             </Border>
+            <TextBlock HorizontalAlignment="Center" Classes="subtext">
+                <Run Text="{ui:Translate Key=ACCOUNT_PROVIDER_INFO}" />
+                <Run Text="{Binding IdentityProvider.ProviderName}" />
+            </TextBlock>
             <TextBlock HorizontalAlignment="Center" FontSize="{DynamicResource FontSizeNormal}"
             <TextBlock HorizontalAlignment="Center" FontSize="{DynamicResource FontSizeNormal}"
                        ui:Translator.Key="LOGGED_IN_AS">
                        ui:Translator.Key="LOGGED_IN_AS">
                 <Run Text="" />
                 <Run Text="" />
                 <Run Text="{Binding Username}" />
                 <Run Text="{Binding Username}" />
             </TextBlock>
             </TextBlock>
-            <Button
+            <Button IsVisible="{Binding IdentityProvider.AllowsLogout}"
                 Content="{ui:Translate Key=LOGOUT}"
                 Content="{ui:Translate Key=LOGOUT}"
                 Command="{Binding LogoutCommand}" />
                 Command="{Binding LogoutCommand}" />
         </StackPanel>
         </StackPanel>

+ 6 - 5
src/PixiEditor/Views/Auth/LoginPopup.axaml

@@ -25,11 +25,12 @@
             <ItemsControl.ItemTemplate>
             <ItemsControl.ItemTemplate>
                 <DataTemplate>
                 <DataTemplate>
                     <StackPanel Orientation="Vertical" Spacing="5">
                     <StackPanel Orientation="Vertical" Spacing="5">
-                        <TextBlock Text="{Binding }" />
-                    <Button
-                        Content="{ui:Translate Key=INSTALL}"
-                        Command="{Binding DataContext.InstallContentCommand, RelativeSource={RelativeSource AncestorType=auth:LoginPopup, Mode=FindAncestor}}"
-                        CommandParameter="{Binding}"/>
+                        <TextBlock Text="{Binding DisplayName}" />
+                        <Button
+                            Command="{Binding DataContext.InstallContentCommand, RelativeSource={RelativeSource AncestorType=auth:LoginPopup, Mode=FindAncestor}}"
+                            CommandParameter="{Binding Id}">
+                            <TextBlock Text="{ui:Translate Key=INSTALL}" />
+                        </Button>
                     </StackPanel>
                     </StackPanel>
                 </DataTemplate>
                 </DataTemplate>
             </ItemsControl.ItemTemplate>
             </ItemsControl.ItemTemplate>