feat(collection): PostgreSQL 백킹 활성화 (CollectionRepository + TokenCache)
WBS-9.3 - NULL Policy CI Gate / NULL Policy Validation (push) Failing after 7s
Quant Engine CI/CD Pipeline / validate-ui-and-storage (push) Has been skipped
Quant Engine CI/CD Pipeline / validate-core (push) Failing after 13s
Snapshot Admin Deployment / build-and-deploy (push) Failing after 1m21s
Deploy to Production / Build & Deploy to Production (push) Successful in 1m55s

- Program.cs: PlaceholderCollectionRepository/TokenCache/KisApiClient → 실제 구현체로 변경
- 데이터베이스 초기화: EnsureTablesAsync() 호출 (시작 시 테이블 자동 생성)
- kis_tokens, kis_collection_runs, kis_collection_snapshots, kis_collection_errors 테이블
- Dapper 기반 SQL 쿼리 (파라미터화, SQL 주입 방지)
- 인덱스: started_at, ticker, captured_at, run_id
- PlaceholderImplementations.cs 제거

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-06-29 23:32:29 +09:00
parent 4ef7a54ad5
commit 0b503c20af
262 changed files with 2880 additions and 168 deletions
@@ -1,164 +1,2 @@
using QuantEngine.Core.Interfaces;
namespace QuantEngine.Web.Infrastructure;
/// <summary>
/// Placeholder implementations for Collection services.
/// Temporary: to be replaced with actual PostgreSQL implementations.
/// </summary>
public class PlaceholderCollectionRepository : ICollectionRepository
{
private static readonly List<CollectionRunRecord> MockRuns = new();
private static readonly List<CollectionSnapshotRecord> MockSnapshots = new();
private static readonly List<CollectionErrorRecord> MockErrors = new();
public Task SaveRunAsync(CollectionRunRecord run)
{
MockRuns.Add(run);
return Task.CompletedTask;
}
public Task UpdateRunStatusAsync(string runId, string status, string? finishedAt = null, int? totalSnapshots = null, int? totalErrors = null)
{
var run = MockRuns.FirstOrDefault(r => r.RunId == runId);
if (run != null)
{
var idx = MockRuns.IndexOf(run);
MockRuns[idx] = new CollectionRunRecord(runId, status, run.StartedAt, finishedAt, totalSnapshots, totalErrors, DateTime.UtcNow.ToString("o"));
}
return Task.CompletedTask;
}
public Task SaveSnapshotAsync(CollectionSnapshotRecord snapshot)
{
MockSnapshots.Add(snapshot);
return Task.CompletedTask;
}
public Task SaveErrorAsync(CollectionErrorRecord error)
{
MockErrors.Add(error);
return Task.CompletedTask;
}
public Task<List<CollectionRunRecord>> GetRecentRunsAsync(int limit = 20)
{
return Task.FromResult(MockRuns.OrderByDescending(r => r.StartedAt).Take(limit).ToList());
}
public Task<List<CollectionSnapshotRecord>> GetRunSnapshotsAsync(string runId)
{
return Task.FromResult(MockSnapshots.Where(s => s.RunId == runId).ToList());
}
public Task<List<CollectionErrorRecord>> GetRunErrorsAsync(string runId, int limit = 50)
{
return Task.FromResult(MockErrors.Where(e => e.RunId == runId).Take(limit).ToList());
}
public Task<CollectionDashboardStateRecord> GetDashboardStateAsync()
{
var lastRun = MockRuns.OrderByDescending(r => r.StartedAt).FirstOrDefault();
var recentErrors = MockErrors.OrderByDescending(e => e.CreatedAt).Take(5).ToList();
return Task.FromResult(new CollectionDashboardStateRecord(
LastRunId: lastRun?.RunId,
LastRunStatus: lastRun?.Status,
LastFinishedAt: lastRun?.FinishedAt,
TotalSnapshots: MockSnapshots.Count,
TotalErrors: MockErrors.Count,
RecentErrors: recentErrors
));
}
public Task<List<CollectionSnapshotRecord>> GetLatestSnapshotsForTickerAsync(string ticker, int limit = 10)
{
return Task.FromResult(MockSnapshots.Where(s => s.Ticker == ticker).OrderByDescending(s => s.CapturedAt).Take(limit).ToList());
}
}
public class PlaceholderTokenCache : ITokenCache
{
private static readonly Dictionary<string, (string Token, DateTime ExpiresAt)> Cache = new();
public Task<string?> GetCachedTokenAsync(string account)
{
if (Cache.TryGetValue(account, out var entry) && entry.ExpiresAt > DateTime.UtcNow.AddMinutes(10))
{
return Task.FromResult<string?>(entry.Token);
}
return Task.FromResult<string?>(null);
}
public Task SaveTokenAsync(string account, string token, DateTime expiresAt)
{
Cache[account] = (token, expiresAt);
return Task.CompletedTask;
}
public Task ClearExpiredTokensAsync()
{
var expired = Cache.Where(kv => kv.Value.ExpiresAt <= DateTime.UtcNow).Select(kv => kv.Key).ToList();
foreach (var key in expired) Cache.Remove(key);
return Task.CompletedTask;
}
}
public class PlaceholderKisApiClient : IKisApiClient
{
public Task<Dictionary<string, object>> GetCurrentPriceAsync(string code, string account = "mock")
{
return Task.FromResult(new Dictionary<string, object>
{
{ "code", code },
{ "price", 0 },
{ "change", 0 },
{ "changeRate", 0 }
});
}
public Task<Dictionary<string, object>> GetAskingPrice10LevelAsync(string code, string account = "mock")
{
return Task.FromResult(new Dictionary<string, object>
{
{ "code", code },
{ "askLevels", new List<object>() },
{ "bidLevels", new List<object>() }
});
}
public Task<Dictionary<string, object>> GetDailyShortSaleAsync(string code, string startDate, string endDate, string account = "mock")
{
return Task.FromResult(new Dictionary<string, object>
{
{ "code", code },
{ "startDate", startDate },
{ "endDate", endDate },
{ "data", new List<object>() }
});
}
public Task<Dictionary<string, object>> GetDailyItemChartPriceAsync(string code, string startDate, string endDate, string period = "D", string account = "mock")
{
return Task.FromResult(new Dictionary<string, object>
{
{ "code", code },
{ "startDate", startDate },
{ "endDate", endDate },
{ "period", period },
{ "candles", new List<object>() }
});
}
public Task<Dictionary<string, object>> GetInvestorTrendAsync(string code, string account = "mock")
{
return Task.FromResult(new Dictionary<string, object>
{
{ "code", code },
{ "individual", 0 },
{ "foreign", 0 },
{ "institution", 0 }
});
}
}
// Placeholder implementations removed — using PostgreSQL-backed real implementations instead.
// See Program.cs for service registration.
+23 -4
View File
@@ -37,10 +37,10 @@ builder.Services.AddScoped<IPostgresqlHistoryStore, PostgresqlHistoryStore>();
builder.Services.AddScoped<IPostgresqlHistorySnapshotReader, PostgresqlHistorySnapshotReader>();
builder.Services.AddScoped<HistoryIngestionService>();
// Collection Pipeline Services (using placeholder implementations for now)
builder.Services.AddScoped<ICollectionRepository, PlaceholderCollectionRepository>();
builder.Services.AddScoped<ITokenCache, PlaceholderTokenCache>();
builder.Services.AddScoped<IKisApiClient, PlaceholderKisApiClient>();
// Collection Pipeline Services (PostgreSQL-backed implementations)
builder.Services.AddScoped<ICollectionRepository, CollectionRepository>();
builder.Services.AddScoped<ITokenCache, PostgresTokenCache>();
builder.Services.AddScoped<IKisApiClient, KisApiClient>();
// HTTP Client & API Services
builder.Services.AddHttpClient<ApiClient>();
@@ -48,6 +48,25 @@ builder.Services.AddScoped<ApiClient>();
var app = builder.Build();
// Initialize database tables (PostgreSQL-backed repositories)
using (var scope = app.Services.CreateScope())
{
var tokenCache = scope.ServiceProvider.GetRequiredService<ITokenCache>();
var collectionRepo = scope.ServiceProvider.GetRequiredService<ICollectionRepository>();
try
{
// Ensure tables exist on startup
await tokenCache.GetCachedTokenAsync("_init_test_");
await collectionRepo.GetDashboardStateAsync();
Log.Information("Database tables initialized successfully");
}
catch (Exception ex)
{
Log.Warning($"Database initialization warning: {ex.Message}");
}
}
// Enable reverse proxy subpath mapping
app.UsePathBase("/quant");
@@ -0,0 +1,340 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v10.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v10.0": {
"QuantEngine.Web/1.0.0": {
"dependencies": {
"Microsoft.FluentUI.AspNetCore.Components": "5.0.0-rc.4-26177.1",
"Microsoft.FluentUI.AspNetCore.Components.Icons": "5.0.0-rc.4-26177.1",
"QuantEngine.Application": "1.0.0",
"QuantEngine.Core": "1.0.0",
"QuantEngine.Infrastructure": "1.0.0",
"Serilog.AspNetCore": "10.0.0"
},
"runtime": {
"QuantEngine.Web.dll": {}
}
},
"Dapper/2.1.79": {
"runtime": {
"lib/net10.0/Dapper.dll": {
"assemblyVersion": "2.0.0.0",
"fileVersion": "2.1.79.29349"
}
}
},
"Microsoft.Extensions.DependencyModel/10.0.0": {
"runtime": {
"lib/net10.0/Microsoft.Extensions.DependencyModel.dll": {
"assemblyVersion": "10.0.0.0",
"fileVersion": "10.0.25.52411"
}
}
},
"Microsoft.FluentUI.AspNetCore.Components/5.0.0-rc.4-26177.1": {
"runtime": {
"lib/net10.0/Microsoft.FluentUI.AspNetCore.Components.dll": {
"assemblyVersion": "5.0.0.26177",
"fileVersion": "5.0.0.26177"
}
}
},
"Microsoft.FluentUI.AspNetCore.Components.Icons/5.0.0-rc.4-26177.1": {
"dependencies": {
"Microsoft.FluentUI.AspNetCore.Components": "5.0.0-rc.4-26177.1"
},
"runtime": {
"lib/net9.0/Microsoft.FluentUI.AspNetCore.Components.Icons.Color.dll": {
"assemblyVersion": "5.0.0.26177",
"fileVersion": "5.0.0.26177"
},
"lib/net9.0/Microsoft.FluentUI.AspNetCore.Components.Icons.Filled.dll": {
"assemblyVersion": "5.0.0.26177",
"fileVersion": "5.0.0.26177"
},
"lib/net9.0/Microsoft.FluentUI.AspNetCore.Components.Icons.Light.dll": {
"assemblyVersion": "5.0.0.26177",
"fileVersion": "5.0.0.26177"
},
"lib/net9.0/Microsoft.FluentUI.AspNetCore.Components.Icons.Regular.dll": {
"assemblyVersion": "5.0.0.26177",
"fileVersion": "5.0.0.26177"
},
"lib/net9.0/Microsoft.FluentUI.AspNetCore.Components.Icons.dll": {
"assemblyVersion": "5.0.0.26177",
"fileVersion": "5.0.0.26177"
}
}
},
"Npgsql/10.0.3": {
"runtime": {
"lib/net10.0/Npgsql.dll": {
"assemblyVersion": "10.0.3.0",
"fileVersion": "10.0.3.0"
}
}
},
"Serilog/4.3.0": {
"runtime": {
"lib/net9.0/Serilog.dll": {
"assemblyVersion": "4.3.0.0",
"fileVersion": "4.3.0.0"
}
}
},
"Serilog.AspNetCore/10.0.0": {
"dependencies": {
"Serilog": "4.3.0",
"Serilog.Extensions.Hosting": "10.0.0",
"Serilog.Formatting.Compact": "3.0.0",
"Serilog.Settings.Configuration": "10.0.0",
"Serilog.Sinks.Console": "6.1.1",
"Serilog.Sinks.Debug": "3.0.0",
"Serilog.Sinks.File": "7.0.0"
},
"runtime": {
"lib/net10.0/Serilog.AspNetCore.dll": {
"assemblyVersion": "10.0.0.0",
"fileVersion": "10.0.0.0"
}
}
},
"Serilog.Extensions.Hosting/10.0.0": {
"dependencies": {
"Serilog": "4.3.0",
"Serilog.Extensions.Logging": "10.0.0"
},
"runtime": {
"lib/net10.0/Serilog.Extensions.Hosting.dll": {
"assemblyVersion": "10.0.0.0",
"fileVersion": "10.0.0.0"
}
}
},
"Serilog.Extensions.Logging/10.0.0": {
"dependencies": {
"Serilog": "4.3.0"
},
"runtime": {
"lib/net10.0/Serilog.Extensions.Logging.dll": {
"assemblyVersion": "10.0.0.0",
"fileVersion": "10.0.0.0"
}
}
},
"Serilog.Formatting.Compact/3.0.0": {
"dependencies": {
"Serilog": "4.3.0"
},
"runtime": {
"lib/net8.0/Serilog.Formatting.Compact.dll": {
"assemblyVersion": "3.0.0.0",
"fileVersion": "3.0.0.0"
}
}
},
"Serilog.Settings.Configuration/10.0.0": {
"dependencies": {
"Microsoft.Extensions.DependencyModel": "10.0.0",
"Serilog": "4.3.0"
},
"runtime": {
"lib/net10.0/Serilog.Settings.Configuration.dll": {
"assemblyVersion": "10.0.0.0",
"fileVersion": "10.0.0.0"
}
}
},
"Serilog.Sinks.Console/6.1.1": {
"dependencies": {
"Serilog": "4.3.0"
},
"runtime": {
"lib/net8.0/Serilog.Sinks.Console.dll": {
"assemblyVersion": "6.1.1.0",
"fileVersion": "6.1.1.0"
}
}
},
"Serilog.Sinks.Debug/3.0.0": {
"dependencies": {
"Serilog": "4.3.0"
},
"runtime": {
"lib/net8.0/Serilog.Sinks.Debug.dll": {
"assemblyVersion": "3.0.0.0",
"fileVersion": "3.0.0.0"
}
}
},
"Serilog.Sinks.File/7.0.0": {
"dependencies": {
"Serilog": "4.3.0"
},
"runtime": {
"lib/net9.0/Serilog.Sinks.File.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.0.0"
}
}
},
"QuantEngine.Application/1.0.0": {
"dependencies": {
"QuantEngine.Core": "1.0.0"
},
"runtime": {
"QuantEngine.Application.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
},
"QuantEngine.Core/1.0.0": {
"runtime": {
"QuantEngine.Core.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
},
"QuantEngine.Infrastructure/1.0.0": {
"dependencies": {
"Dapper": "2.1.79",
"Npgsql": "10.0.3",
"QuantEngine.Application": "1.0.0",
"QuantEngine.Core": "1.0.0"
},
"runtime": {
"QuantEngine.Infrastructure.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
}
}
},
"libraries": {
"QuantEngine.Web/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Dapper/2.1.79": {
"type": "package",
"serviceable": true,
"sha512": "sha512-8YijbzgTfmqmQOnVNorYM6K++pxqnW3nJ4aC1sRHzxUA2CcuoJ9gsTem3kgBnPRMc38zZHl4Esb6hAezXIEEuw==",
"path": "dapper/2.1.79",
"hashPath": "dapper.2.1.79.nupkg.sha512"
},
"Microsoft.Extensions.DependencyModel/10.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-RFYJR7APio/BiqdQunRq6DB+nDB6nc2qhHr77mlvZ0q0BT8PubMXN7XicmfzCbrDE/dzhBnUKBRXLTcqUiZDGg==",
"path": "microsoft.extensions.dependencymodel/10.0.0",
"hashPath": "microsoft.extensions.dependencymodel.10.0.0.nupkg.sha512"
},
"Microsoft.FluentUI.AspNetCore.Components/5.0.0-rc.4-26177.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-y7k8ib6ar+1l7Rc8IdBe5aLWzFPF09ruazr+nB/GZw1Zefehddt7qXhbQzCCRyV7GCTBY3HvV7ms08ChRaeUfQ==",
"path": "microsoft.fluentui.aspnetcore.components/5.0.0-rc.4-26177.1",
"hashPath": "microsoft.fluentui.aspnetcore.components.5.0.0-rc.4-26177.1.nupkg.sha512"
},
"Microsoft.FluentUI.AspNetCore.Components.Icons/5.0.0-rc.4-26177.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-99ZPWwDcdEL/o6vmtbi7A+TzjpiOE2DxUJD/McesJTIGEZT8Iohh8URJvgpA8SR8W4tB+9wSfqZMXMCuaWi5aA==",
"path": "microsoft.fluentui.aspnetcore.components.icons/5.0.0-rc.4-26177.1",
"hashPath": "microsoft.fluentui.aspnetcore.components.icons.5.0.0-rc.4-26177.1.nupkg.sha512"
},
"Npgsql/10.0.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-7nb5YzXuvWWJxB0J8DiyL3we+X4FOctZrt0fIBnucOIaIevFEEwGQVZKtiu9olXdlNAK1eNgqSral6r/jlhI4w==",
"path": "npgsql/10.0.3",
"hashPath": "npgsql.10.0.3.nupkg.sha512"
},
"Serilog/4.3.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-+cDryFR0GRhsGOnZSKwaDzRRl4MupvJ42FhCE4zhQRVanX0Jpg6WuCBk59OVhVDPmab1bB+nRykAnykYELA9qQ==",
"path": "serilog/4.3.0",
"hashPath": "serilog.4.3.0.nupkg.sha512"
},
"Serilog.AspNetCore/10.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-a/cNa1mY4On1oJlfGG1wAvxjp5g7OEzk/Jf/nm7NF9cWoE7KlZw1GldrifUBWm9oKibHkR7Lg/l5jy3y7ACR8w==",
"path": "serilog.aspnetcore/10.0.0",
"hashPath": "serilog.aspnetcore.10.0.0.nupkg.sha512"
},
"Serilog.Extensions.Hosting/10.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-E7juuIc+gzoGxgzFooFgAV8g9BfiSXNKsUok9NmEpyAXg2odkcPsMa/Yo4axkJRlh0se7mkYQ1GXDaBemR+b6w==",
"path": "serilog.extensions.hosting/10.0.0",
"hashPath": "serilog.extensions.hosting.10.0.0.nupkg.sha512"
},
"Serilog.Extensions.Logging/10.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-vx0kABKl2dWbBhhqAfTOk53/i8aV/5VaT3a6il9gn72Wqs2pM7EK2OB6No6xdqK2IaY6Zf9gdjLuK9BVa2rT+Q==",
"path": "serilog.extensions.logging/10.0.0",
"hashPath": "serilog.extensions.logging.10.0.0.nupkg.sha512"
},
"Serilog.Formatting.Compact/3.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-wQsv14w9cqlfB5FX2MZpNsTawckN4a8dryuNGbebB/3Nh1pXnROHZov3swtu3Nj5oNG7Ba+xdu7Et/ulAUPanQ==",
"path": "serilog.formatting.compact/3.0.0",
"hashPath": "serilog.formatting.compact.3.0.0.nupkg.sha512"
},
"Serilog.Settings.Configuration/10.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-LNq+ibS1sbhTqPV1FIE69/9AJJbfaOhnaqkzcjFy95o+4U+STsta9mi97f1smgXsWYKICDeGUf8xUGzd/52/uA==",
"path": "serilog.settings.configuration/10.0.0",
"hashPath": "serilog.settings.configuration.10.0.0.nupkg.sha512"
},
"Serilog.Sinks.Console/6.1.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-8jbqgjUyZlfCuSTaJk6lOca465OndqOz3KZP6Cryt/IqZYybyBu7GP0fE/AXBzrrQB3EBmQntBFAvMVz1COvAA==",
"path": "serilog.sinks.console/6.1.1",
"hashPath": "serilog.sinks.console.6.1.1.nupkg.sha512"
},
"Serilog.Sinks.Debug/3.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-4BzXcdrgRX7wde9PmHuYd9U6YqycCC28hhpKonK7hx0wb19eiuRj16fPcPSVp0o/Y1ipJuNLYQ00R3q2Zs8FDA==",
"path": "serilog.sinks.debug/3.0.0",
"hashPath": "serilog.sinks.debug.3.0.0.nupkg.sha512"
},
"Serilog.Sinks.File/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-fKL7mXv7qaiNBUC71ssvn/dU0k9t0o45+qm2XgKAlSt19xF+ijjxyA3R6HmCgfKEKwfcfkwWjayuQtRueZFkYw==",
"path": "serilog.sinks.file/7.0.0",
"hashPath": "serilog.sinks.file.7.0.0.nupkg.sha512"
},
"QuantEngine.Application/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"QuantEngine.Core/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"QuantEngine.Infrastructure/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
}
}
}
@@ -0,0 +1,20 @@
{
"runtimeOptions": {
"tfm": "net10.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "10.0.0"
},
{
"name": "Microsoft.AspNetCore.App",
"version": "10.0.0"
}
],
"configProperties": {
"System.GC.Server": true,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false,
"Microsoft.AspNetCore.Components.Endpoints.NavigationManager.DisableThrowNavigationException": true
}
}
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}
@@ -0,0 +1,12 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"DefaultConnection": "Host=127.0.0.1;Database=giteadb;Username=gitea;Password=;Search Path=quantengine;"
}
}
@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v10.0", FrameworkDisplayName = ".NET 10.0")]
@@ -0,0 +1,22 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("QuantEngine.Web")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+4ef7a54ad55182e164ca78e8af21f2a5e214c98f")]
[assembly: System.Reflection.AssemblyProductAttribute("QuantEngine.Web")]
[assembly: System.Reflection.AssemblyTitleAttribute("QuantEngine.Web")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generated by the MSBuild WriteCodeFragment class.
@@ -0,0 +1 @@
f0443d30e9d50393c2e8149d956052058bdbdea2d0f7a54ddf6a7f5030324b14
@@ -0,0 +1,72 @@
is_global = true
build_property.TargetFramework = net10.0
build_property.TargetFrameworkIdentifier = .NETCoreApp
build_property.TargetFrameworkVersion = v10.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb = true
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property.EntryPointFilePath =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = QuantEngine.Web
build_property.RootNamespace = QuantEngine.Web
build_property.ProjectDir = C:\Temp\data_feed\src\dotnet\QuantEngine.Web\
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.RazorLangVersion = 10.0
build_property.SupportLocalizedComponentNames =
build_property.GenerateRazorMetadataSourceChecksumAttributes =
build_property.MSBuildProjectDirectory = C:\Temp\data_feed\src\dotnet\QuantEngine.Web
build_property._RazorSourceGeneratorDebug =
build_property.EffectiveAnalysisLevelStyle = 10.0
build_property.EnableCodeStyleSeverity =
[C:/Temp/data_feed/src/dotnet/QuantEngine.Web/Client/Pages/Collection.razor]
build_metadata.AdditionalFiles.TargetPath = Q2xpZW50XFBhZ2VzXENvbGxlY3Rpb24ucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[C:/Temp/data_feed/src/dotnet/QuantEngine.Web/Client/_Imports.razor]
build_metadata.AdditionalFiles.TargetPath = Q2xpZW50XF9JbXBvcnRzLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[C:/Temp/data_feed/src/dotnet/QuantEngine.Web/Components/App.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xBcHAucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[C:/Temp/data_feed/src/dotnet/QuantEngine.Web/Components/Pages/Dashboard.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xEYXNoYm9hcmQucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[C:/Temp/data_feed/src/dotnet/QuantEngine.Web/Components/Pages/Error.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xFcnJvci5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[C:/Temp/data_feed/src/dotnet/QuantEngine.Web/Components/Pages/NotFound.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xOb3RGb3VuZC5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[C:/Temp/data_feed/src/dotnet/QuantEngine.Web/Components/Pages/Operations.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xQYWdlc1xPcGVyYXRpb25zLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[C:/Temp/data_feed/src/dotnet/QuantEngine.Web/Components/Routes.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xSb3V0ZXMucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[C:/Temp/data_feed/src/dotnet/QuantEngine.Web/Components/_Imports.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xfSW1wb3J0cy5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[C:/Temp/data_feed/src/dotnet/QuantEngine.Web/Components/Layout/MainLayout.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xMYXlvdXRcTWFpbkxheW91dC5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = b-d6y8adeyxc
[C:/Temp/data_feed/src/dotnet/QuantEngine.Web/Components/Layout/NavMenu.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xMYXlvdXRcTmF2TWVudS5yYXpvcg==
build_metadata.AdditionalFiles.CssScope = b-9gr5lv177o
[C:/Temp/data_feed/src/dotnet/QuantEngine.Web/Components/Layout/ReconnectModal.razor]
build_metadata.AdditionalFiles.TargetPath = Q29tcG9uZW50c1xMYXlvdXRcUmVjb25uZWN0TW9kYWwucmF6b3I=
build_metadata.AdditionalFiles.CssScope = b-9dgxcj10me
@@ -0,0 +1 @@
166d6a1fc1ca2d51e6a2788ece085ff1655cc6516563c314fd7b15cb1c7f9ceb
@@ -0,0 +1,84 @@
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\EmbeddedAttribute.cs
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\ValidatableTypeAttribute.cs
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\QuantEngine.Web.csproj.AssemblyReference.cache
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\rpswa.dswa.cache.json
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\QuantEngine.Web.GeneratedMSBuildEditorConfig.editorconfig
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\QuantEngine.Web.AssemblyInfoInputs.cache
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\QuantEngine.Web.AssemblyInfo.cs
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\QuantEngine.Web.csproj.CoreCompileInputs.cache
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\QuantEngine.Web.MvcApplicationPartsAssemblyInfo.cache
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\Dapper.dll
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\Microsoft.Extensions.DependencyModel.dll
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\Microsoft.FluentUI.AspNetCore.Components.dll
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\Microsoft.FluentUI.AspNetCore.Components.Icons.Color.dll
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\Microsoft.FluentUI.AspNetCore.Components.Icons.Filled.dll
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\Microsoft.FluentUI.AspNetCore.Components.Icons.Light.dll
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\Microsoft.FluentUI.AspNetCore.Components.Icons.Regular.dll
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\Microsoft.FluentUI.AspNetCore.Components.Icons.dll
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\Npgsql.dll
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\Serilog.dll
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\Serilog.AspNetCore.dll
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\Serilog.Extensions.Hosting.dll
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\Serilog.Extensions.Logging.dll
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\Serilog.Formatting.Compact.dll
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\Serilog.Settings.Configuration.dll
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\Serilog.Sinks.Console.dll
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\Serilog.Sinks.Debug.dll
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\Serilog.Sinks.File.dll
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\QuantEngine.Application.dll
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\QuantEngine.Core.dll
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\QuantEngine.Infrastructure.dll
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\QuantEngine.Infrastructure.pdb
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\QuantEngine.Application.pdb
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\QuantEngine.Core.pdb
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\rjimswa.dswa.cache.json
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\rjsmrazor.dswa.cache.json
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\rjsmcshtml.dswa.cache.json
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\jsmodules\jsmodules.build.manifest.json
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\scopedcss\Components\Layout\MainLayout.razor.rz.scp.css
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\scopedcss\Components\Layout\NavMenu.razor.rz.scp.css
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\scopedcss\Components\Layout\ReconnectModal.razor.rz.scp.css
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\scopedcss\bundle\QuantEngine.Web.styles.css
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\scopedcss\projectbundle\QuantEngine.Web.bundle.scp.css
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\compressed\klh9ieqob8-{0}-iyd2uar0up-iyd2uar0up.gz
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\compressed\f3i2l0jv30-{0}-iddw5cjyql-iddw5cjyql.gz
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\compressed\6mwvvlkmgj-{0}-s7fspo1leq-s7fspo1leq.gz
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\compressed\h0qxm5u0yy-{0}-qpepyjfzgz-qpepyjfzgz.gz
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\compressed\win2gt64sq-{0}-x8xhhr7jgv-x8xhhr7jgv.gz
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\compressed\ru2nohmkoz-{0}-ghr9dc63gi-ghr9dc63gi.gz
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\compressed\4m8jx7ixl4-{0}-nvqi1h5n7i-nvqi1h5n7i.gz
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\compressed\mm8wr5jb95-{0}-asn2ffubki-asn2ffubki.gz
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\compressed\jq2jihf5fr-{0}-7jrmyk289x-7jrmyk289x.gz
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\compressed\is0nail857-{0}-rdaq2hquit-rdaq2hquit.gz
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\compressed\ib5axksgx0-{0}-o9w0qkfcrf-o9w0qkfcrf.gz
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\compressed\oc0evn85jv-{0}-t1fy3wrmof-t1fy3wrmof.gz
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\compressed\6nn42apl8y-{0}-acio4t06fh-acio4t06fh.gz
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\compressed\kwrall9b0s-{0}-p1atgyms84-p1atgyms84.gz
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\compressed\q2w3mddmwi-{0}-hhus5bms5i-hhus5bms5i.gz
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\compressed\t9yb5ynpxl-{0}-13ja33weya-13ja33weya.gz
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\compressed\bnqbmxev8p-{0}-uhfllo7vmv-uhfllo7vmv.gz
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\compressed\nr5locadir-{0}-ne14ti1q68-ne14ti1q68.gz
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\compressed\dym80g6kqp-{0}-ig5xotzpx5-ig5xotzpx5.gz
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\compressed\ctztv6q6p6-{0}-jdfzv2q2bu-jdfzv2q2bu.gz
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\compressed\b7jn6yc0gz-{0}-xny4mnot63-xny4mnot63.gz
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\compressed\vpvw6nj9ax-{0}-yi314np04p-yi314np04p.gz
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\staticwebassets.build.json
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\staticwebassets.build.json.cache
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\staticwebassets.development.json
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\staticwebassets.build.endpoints.json
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\swae.build.ex.cache
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\QuantEngine.Web.dll
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\refint\QuantEngine.Web.dll
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\QuantEngine.Web.pdb
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\appsettings.Development.json
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\appsettings.json
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\QuantEngine.Web.staticwebassets.runtime.json
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\QuantEngine.Web.staticwebassets.endpoints.json
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\QuantEngine.Web.exe
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\QuantEngine.Web.deps.json
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\QuantEngine.Web.runtimeconfig.json
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\QuantEngine.Web.dll
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\bin\Debug\net10.0\QuantEngine.Web.pdb
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\QuantEng.C85672E0.Up2Date
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\QuantEngine.Web.genruntimeconfig.cache
C:\Temp\data_feed\src\dotnet\QuantEngine.Web\obj\Debug\net10.0\ref\QuantEngine.Web.dll
@@ -0,0 +1 @@
f78c5380dc04b6bce951ebd484d8aad5543d6951999111b3dffeed8a2a8305d3
@@ -0,0 +1,3 @@
[
"_content/Microsoft.FluentUI.AspNetCore.Components/Microsoft.FluentUI.AspNetCore.Components.lib.module.js"
]
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"GlobalPropertiesHash":"ALxWDQhPmdZwUFbyl7L5C8GukPrDDIApUiu7jAGOdAw=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"R7Rea/YQmcweqCbKffD9oUelggfpJQX85r65aYZsas0=","InputHashes":["0VWc3ZwznUVZwzCZ6dFMqKCSZLmOCH9mxrOKQFdQ\u002BI4=","oMx1gHhRahcrGnKdzOPw2mUmR5Dr6T4iMA82Th1ltYc="],"CachedAssets":{},"CachedCopyCandidates":{}}
@@ -0,0 +1 @@
{"GlobalPropertiesHash":"61ZzOkAafDUCzt7x0mEjc+KORTs/Of52hN2aYDIQSWo=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["JTTrBKbjS35ApfJf5RSZHGAVU4t86eB4Z3Dj0Z4ZHHw=","rTMATgH4bAjZoNZ\u002BKRaVF9OxRk9Kn6EBIemE7YzyabI=","hxbowMggSnj8GJZOdMJHHwwDttpxRJIOTdIfn0ut0Ac=","hSLwzYWjyZqvvqAfHnAB6rPotX3eG0Hu8hDe8i5z7xs=","Ve1QW/FmTNllJk3cvvhc6GX9yH8fpHWmRRGHdwsWzSk=","Lnqf\u002BNn8uUZsaje5OQes9m0Q0KwAfchqG1V350Yn6BM=","gutXfyMccv5XisHlHhGJVGZETahysZqJii\u002Bg92M3\u002BdY=","hrXj0bYYvmdlZvAZZUebReLZfF8J/65r\u002B6aq4KtW3IE=","Kx2jIyFuF\u002BWn7fgtHBZ1NAWotqOmDxzgr6dTTh7HDPE=","sccdnyWmjEVIc4E/Wun5yH7NqVHF7c3g\u002B3KDbNw2New=","0nm9KNek3j/oQYUZUWEBhhL0txx1ekRnvnlCKKX0\u002Be8=","opg1Y4oXGX8x\u002BiLqpy9S3XVriqUcRUflY6tvfS0RPrM=","tNOP0eY2IzG88JsO78RhXsM42R7VPpxERLnNyDbauaU=","re4wFqPP/3GgQc83P3HKVcekxgIDYb4wyWk7MAimQDY=","vQcVlD31Fc9FE7Bi2395HnZbsJNtUlPfrATGTUN/0Q8=","yZglLoEA3dZuvvi6ZlKbOhDYJl863V6DuFnfV3jnch8=","m1RQtzMLoQWq6UnuVeiRVXSM2c2Q6/OzZc55uM2i93A=","hiPreQqqr5M81jQh\u002BsyYzu6fPzHbXkO00H\u002BjwFUXmVI=","nj4bTNdXLks/ifVLGyyn0JSdi3PzYDtjcCY1DlyDaUQ=","vQOI1xTEFZObVDsVgjTF2znZABTIHfwG/zTPmKPVBe0=","7elVBzPhnnl25N/3P1W6oFDvEswhk00rPXKO0IH/4LA=","iIFRuJ2xCVeE0DcA8Oph22IHDXbck6gu5A\u002B1O1ZcCxA="],"CachedAssets":{},"CachedCopyCandidates":{}}
@@ -0,0 +1 @@
{"GlobalPropertiesHash":"hb9Mk8Q4BfRLjPFbSBNw4B6QTKNWFUuDQL43Qwq5ZuI=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["JTTrBKbjS35ApfJf5RSZHGAVU4t86eB4Z3Dj0Z4ZHHw=","rTMATgH4bAjZoNZ\u002BKRaVF9OxRk9Kn6EBIemE7YzyabI=","hxbowMggSnj8GJZOdMJHHwwDttpxRJIOTdIfn0ut0Ac=","hSLwzYWjyZqvvqAfHnAB6rPotX3eG0Hu8hDe8i5z7xs=","Ve1QW/FmTNllJk3cvvhc6GX9yH8fpHWmRRGHdwsWzSk=","Lnqf\u002BNn8uUZsaje5OQes9m0Q0KwAfchqG1V350Yn6BM=","gutXfyMccv5XisHlHhGJVGZETahysZqJii\u002Bg92M3\u002BdY=","hrXj0bYYvmdlZvAZZUebReLZfF8J/65r\u002B6aq4KtW3IE=","Kx2jIyFuF\u002BWn7fgtHBZ1NAWotqOmDxzgr6dTTh7HDPE=","sccdnyWmjEVIc4E/Wun5yH7NqVHF7c3g\u002B3KDbNw2New=","0nm9KNek3j/oQYUZUWEBhhL0txx1ekRnvnlCKKX0\u002Be8=","opg1Y4oXGX8x\u002BiLqpy9S3XVriqUcRUflY6tvfS0RPrM=","tNOP0eY2IzG88JsO78RhXsM42R7VPpxERLnNyDbauaU=","re4wFqPP/3GgQc83P3HKVcekxgIDYb4wyWk7MAimQDY=","vQcVlD31Fc9FE7Bi2395HnZbsJNtUlPfrATGTUN/0Q8=","yZglLoEA3dZuvvi6ZlKbOhDYJl863V6DuFnfV3jnch8=","m1RQtzMLoQWq6UnuVeiRVXSM2c2Q6/OzZc55uM2i93A=","hiPreQqqr5M81jQh\u002BsyYzu6fPzHbXkO00H\u002BjwFUXmVI=","nj4bTNdXLks/ifVLGyyn0JSdi3PzYDtjcCY1DlyDaUQ=","vQOI1xTEFZObVDsVgjTF2znZABTIHfwG/zTPmKPVBe0=","7elVBzPhnnl25N/3P1W6oFDvEswhk00rPXKO0IH/4LA=","iIFRuJ2xCVeE0DcA8Oph22IHDXbck6gu5A\u002B1O1ZcCxA="],"CachedAssets":{"vQOI1xTEFZObVDsVgjTF2znZABTIHfwG/zTPmKPVBe0=":{"Identity":"C:\\Temp\\data_feed\\src\\dotnet\\QuantEngine.Web\\Components\\Layout\\ReconnectModal.razor.js","SourceId":"QuantEngine.Web","SourceType":"Discovered","ContentRoot":"C:\\Temp\\data_feed\\src\\dotnet\\QuantEngine.Web\\","BasePath":"/","RelativePath":"Components/Layout/ReconnectModal#[.{fingerprint}]?.razor.js","AssetKind":"All","AssetMode":"All","AssetRole":"Primary","AssetMergeBehavior":null,"AssetMergeSource":"","RelatedAsset":null,"AssetTraitName":null,"AssetTraitValue":null,"Fingerprint":"13ja33weya","Integrity":"4zGYCWZ4pfXdYacNs7XaH1BXGvludoT6JCkX9NZucgI=","CopyToOutputDirectory":"Never","CopyToPublishDirectory":"PreserveNewest","OriginalItemSpec":"Components\\Layout\\ReconnectModal.razor.js","FileLength":2364,"LastWriteTime":"2026-06-29T13:57:48.3610236+00:00"}},"CachedCopyCandidates":{}}
@@ -0,0 +1 @@
{"GlobalPropertiesHash":"sRnjZ123Hmd3VL4RmNf3gURHR16GI5Uk+lQqQ4VvHbs=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["JTTrBKbjS35ApfJf5RSZHGAVU4t86eB4Z3Dj0Z4ZHHw=","rTMATgH4bAjZoNZ\u002BKRaVF9OxRk9Kn6EBIemE7YzyabI=","hxbowMggSnj8GJZOdMJHHwwDttpxRJIOTdIfn0ut0Ac=","hSLwzYWjyZqvvqAfHnAB6rPotX3eG0Hu8hDe8i5z7xs=","Ve1QW/FmTNllJk3cvvhc6GX9yH8fpHWmRRGHdwsWzSk=","Lnqf\u002BNn8uUZsaje5OQes9m0Q0KwAfchqG1V350Yn6BM=","gutXfyMccv5XisHlHhGJVGZETahysZqJii\u002Bg92M3\u002BdY=","hrXj0bYYvmdlZvAZZUebReLZfF8J/65r\u002B6aq4KtW3IE=","Kx2jIyFuF\u002BWn7fgtHBZ1NAWotqOmDxzgr6dTTh7HDPE=","sccdnyWmjEVIc4E/Wun5yH7NqVHF7c3g\u002B3KDbNw2New=","0nm9KNek3j/oQYUZUWEBhhL0txx1ekRnvnlCKKX0\u002Be8=","opg1Y4oXGX8x\u002BiLqpy9S3XVriqUcRUflY6tvfS0RPrM=","tNOP0eY2IzG88JsO78RhXsM42R7VPpxERLnNyDbauaU=","re4wFqPP/3GgQc83P3HKVcekxgIDYb4wyWk7MAimQDY=","vQcVlD31Fc9FE7Bi2395HnZbsJNtUlPfrATGTUN/0Q8=","yZglLoEA3dZuvvi6ZlKbOhDYJl863V6DuFnfV3jnch8="],"CachedAssets":{"JTTrBKbjS35ApfJf5RSZHGAVU4t86eB4Z3Dj0Z4ZHHw=":{"Identity":"C:\\Temp\\data_feed\\src\\dotnet\\QuantEngine.Web\\wwwroot\\app.css","SourceId":"QuantEngine.Web","SourceType":"Discovered","ContentRoot":"C:\\Temp\\data_feed\\src\\dotnet\\QuantEngine.Web\\wwwroot\\","BasePath":"/","RelativePath":"app#[.{fingerprint}]?.css","AssetKind":"All","AssetMode":"All","AssetRole":"Primary","AssetMergeBehavior":null,"AssetMergeSource":"","RelatedAsset":null,"AssetTraitName":null,"AssetTraitValue":null,"Fingerprint":"hhus5bms5i","Integrity":"q\u002BWOaqM0nK\u002BYJc9mffiSnfzZ9cNGTWpp3KaiKimoxBQ=","CopyToOutputDirectory":"Never","CopyToPublishDirectory":"PreserveNewest","OriginalItemSpec":"wwwroot\\app.css","FileLength":6886,"LastWriteTime":"2026-06-29T13:57:48.8780717+00:00"},"rTMATgH4bAjZoNZ\u002BKRaVF9OxRk9Kn6EBIemE7YzyabI=":{"Identity":"C:\\Temp\\data_feed\\src\\dotnet\\QuantEngine.Web\\wwwroot\\favicon.png","SourceId":"QuantEngine.Web","SourceType":"Discovered","ContentRoot":"C:\\Temp\\data_feed\\src\\dotnet\\QuantEngine.Web\\wwwroot\\","BasePath":"/","RelativePath":"favicon#[.{fingerprint}]?.png","AssetKind":"All","AssetMode":"All","AssetRole":"Primary","AssetMergeBehavior":null,"AssetMergeSource":"","RelatedAsset":null,"AssetTraitName":null,"AssetTraitValue":null,"Fingerprint":"ifv42okdf2","Integrity":"4mWsDy3aHl36ZbGt8zByK7Pvd4kRUoNgTYzRnwmPHwg=","CopyToOutputDirectory":"Never","CopyToPublishDirectory":"PreserveNewest","OriginalItemSpec":"wwwroot\\favicon.png","FileLength":1148,"LastWriteTime":"2026-06-29T13:57:48.879071+00:00"}},"CachedCopyCandidates":{}}
@@ -0,0 +1,98 @@
.page[b-d6y8adeyxc] {
position: relative;
display: flex;
flex-direction: column;
}
main[b-d6y8adeyxc] {
flex: 1;
}
.sidebar[b-d6y8adeyxc] {
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
}
.top-row[b-d6y8adeyxc] {
background-color: #f7f7f7;
border-bottom: 1px solid #d6d5d5;
justify-content: flex-end;
height: 3.5rem;
display: flex;
align-items: center;
}
.top-row[b-d6y8adeyxc] a, .top-row[b-d6y8adeyxc] .btn-link {
white-space: nowrap;
margin-left: 1.5rem;
text-decoration: none;
}
.top-row[b-d6y8adeyxc] a:hover, .top-row[b-d6y8adeyxc] .btn-link:hover {
text-decoration: underline;
}
.top-row[b-d6y8adeyxc] a:first-child {
overflow: hidden;
text-overflow: ellipsis;
}
@media (max-width: 640.98px) {
.top-row[b-d6y8adeyxc] {
justify-content: space-between;
}
.top-row[b-d6y8adeyxc] a, .top-row[b-d6y8adeyxc] .btn-link {
margin-left: 0;
}
}
@media (min-width: 641px) {
.page[b-d6y8adeyxc] {
flex-direction: row;
}
.sidebar[b-d6y8adeyxc] {
width: 250px;
height: 100vh;
position: sticky;
top: 0;
}
.top-row[b-d6y8adeyxc] {
position: sticky;
top: 0;
z-index: 1;
}
.top-row.auth[b-d6y8adeyxc] a:first-child {
flex: 1;
text-align: right;
width: 0;
}
.top-row[b-d6y8adeyxc], article[b-d6y8adeyxc] {
padding-left: 2rem !important;
padding-right: 1.5rem !important;
}
}
#blazor-error-ui[b-d6y8adeyxc] {
color-scheme: light only;
background: lightyellow;
bottom: 0;
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
box-sizing: border-box;
display: none;
left: 0;
padding: 0.6rem 1.25rem 0.7rem 1.25rem;
position: fixed;
width: 100%;
z-index: 1000;
}
#blazor-error-ui .dismiss[b-d6y8adeyxc] {
cursor: pointer;
position: absolute;
right: 0.75rem;
top: 0.5rem;
}
@@ -0,0 +1,105 @@
.navbar-toggler[b-9gr5lv177o] {
appearance: none;
cursor: pointer;
width: 3.5rem;
height: 2.5rem;
color: white;
position: absolute;
top: 0.5rem;
right: 1rem;
border: 1px solid rgba(255, 255, 255, 0.1);
background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") no-repeat center/1.75rem rgba(255, 255, 255, 0.1);
}
.navbar-toggler:checked[b-9gr5lv177o] {
background-color: rgba(255, 255, 255, 0.5);
}
.top-row[b-9gr5lv177o] {
min-height: 3.5rem;
background-color: rgba(0,0,0,0.4);
}
.navbar-brand[b-9gr5lv177o] {
font-size: 1.1rem;
}
.bi[b-9gr5lv177o] {
display: inline-block;
position: relative;
width: 1.25rem;
height: 1.25rem;
margin-right: 0.75rem;
top: -1px;
background-size: cover;
}
.bi-house-door-fill-nav-menu[b-9gr5lv177o] {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E");
}
.bi-plus-square-fill-nav-menu[b-9gr5lv177o] {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E");
}
.bi-list-nested-nav-menu[b-9gr5lv177o] {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E");
}
.nav-item[b-9gr5lv177o] {
font-size: 0.9rem;
padding-bottom: 0.5rem;
}
.nav-item:first-of-type[b-9gr5lv177o] {
padding-top: 1rem;
}
.nav-item:last-of-type[b-9gr5lv177o] {
padding-bottom: 1rem;
}
.nav-item[b-9gr5lv177o] .nav-link {
color: #d7d7d7;
background: none;
border: none;
border-radius: 4px;
height: 3rem;
display: flex;
align-items: center;
line-height: 3rem;
width: 100%;
}
.nav-item[b-9gr5lv177o] a.active {
background-color: rgba(255,255,255,0.37);
color: white;
}
.nav-item[b-9gr5lv177o] .nav-link:hover {
background-color: rgba(255,255,255,0.1);
color: white;
}
.nav-scrollable[b-9gr5lv177o] {
display: none;
}
.navbar-toggler:checked ~ .nav-scrollable[b-9gr5lv177o] {
display: block;
}
@media (min-width: 641px) {
.navbar-toggler[b-9gr5lv177o] {
display: none;
}
.nav-scrollable[b-9gr5lv177o] {
/* Never collapse the sidebar for wide screens */
display: block;
/* Allow sidebar to scroll for tall menus */
height: calc(100vh - 3.5rem);
overflow-y: auto;
}
}
@@ -0,0 +1,157 @@
.components-reconnect-first-attempt-visible[b-9dgxcj10me],
.components-reconnect-repeated-attempt-visible[b-9dgxcj10me],
.components-reconnect-failed-visible[b-9dgxcj10me],
.components-pause-visible[b-9dgxcj10me],
.components-resume-failed-visible[b-9dgxcj10me],
.components-rejoining-animation[b-9dgxcj10me] {
display: none;
}
#components-reconnect-modal.components-reconnect-show .components-reconnect-first-attempt-visible[b-9dgxcj10me],
#components-reconnect-modal.components-reconnect-show .components-rejoining-animation[b-9dgxcj10me],
#components-reconnect-modal.components-reconnect-paused .components-pause-visible[b-9dgxcj10me],
#components-reconnect-modal.components-reconnect-resume-failed .components-resume-failed-visible[b-9dgxcj10me],
#components-reconnect-modal.components-reconnect-retrying[b-9dgxcj10me],
#components-reconnect-modal.components-reconnect-retrying .components-reconnect-repeated-attempt-visible[b-9dgxcj10me],
#components-reconnect-modal.components-reconnect-retrying .components-rejoining-animation[b-9dgxcj10me],
#components-reconnect-modal.components-reconnect-failed[b-9dgxcj10me],
#components-reconnect-modal.components-reconnect-failed .components-reconnect-failed-visible[b-9dgxcj10me] {
display: block;
}
#components-reconnect-modal[b-9dgxcj10me] {
background-color: white;
width: 20rem;
margin: 20vh auto;
padding: 2rem;
border: 0;
border-radius: 0.5rem;
box-shadow: 0 3px 6px 2px rgba(0, 0, 0, 0.3);
opacity: 0;
transition: display 0.5s allow-discrete, overlay 0.5s allow-discrete;
animation: components-reconnect-modal-fadeOutOpacity-b-9dgxcj10me 0.5s both;
&[open]
{
animation: components-reconnect-modal-slideUp-b-9dgxcj10me 1.5s cubic-bezier(.05, .89, .25, 1.02) 0.3s, components-reconnect-modal-fadeInOpacity-b-9dgxcj10me 0.5s ease-in-out 0.3s;
animation-fill-mode: both;
}
}
#components-reconnect-modal[b-9dgxcj10me]::backdrop {
background-color: rgba(0, 0, 0, 0.4);
animation: components-reconnect-modal-fadeInOpacity-b-9dgxcj10me 0.5s ease-in-out;
opacity: 1;
}
@keyframes components-reconnect-modal-slideUp-b-9dgxcj10me {
0% {
transform: translateY(30px) scale(0.95);
}
100% {
transform: translateY(0);
}
}
@keyframes components-reconnect-modal-fadeInOpacity-b-9dgxcj10me {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
@keyframes components-reconnect-modal-fadeOutOpacity-b-9dgxcj10me {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
.components-reconnect-container[b-9dgxcj10me] {
display: flex;
flex-direction: column;
align-items: center;
gap: 1rem;
}
#components-reconnect-modal p[b-9dgxcj10me] {
margin: 0;
text-align: center;
}
#components-reconnect-modal button[b-9dgxcj10me] {
border: 0;
background-color: #6b9ed2;
color: white;
padding: 4px 24px;
border-radius: 4px;
}
#components-reconnect-modal button:hover[b-9dgxcj10me] {
background-color: #3b6ea2;
}
#components-reconnect-modal button:active[b-9dgxcj10me] {
background-color: #6b9ed2;
}
.components-rejoining-animation[b-9dgxcj10me] {
position: relative;
width: 80px;
height: 80px;
}
.components-rejoining-animation div[b-9dgxcj10me] {
position: absolute;
border: 3px solid #0087ff;
opacity: 1;
border-radius: 50%;
animation: components-rejoining-animation-b-9dgxcj10me 1.5s cubic-bezier(0, 0.2, 0.8, 1) infinite;
}
.components-rejoining-animation div:nth-child(2)[b-9dgxcj10me] {
animation-delay: -0.5s;
}
@keyframes components-rejoining-animation-b-9dgxcj10me {
0% {
top: 40px;
left: 40px;
width: 0;
height: 0;
opacity: 0;
}
4.9% {
top: 40px;
left: 40px;
width: 0;
height: 0;
opacity: 0;
}
5% {
top: 40px;
left: 40px;
width: 0;
height: 0;
opacity: 1;
}
100% {
top: 0px;
left: 0px;
width: 80px;
height: 80px;
opacity: 0;
}
}
@@ -0,0 +1,365 @@
@import '_content/Microsoft.FluentUI.AspNetCore.Components/Microsoft.FluentUI.AspNetCore.Components.bundle.scp.css';
/* /Components/Layout/MainLayout.razor.rz.scp.css */
.page[b-d6y8adeyxc] {
position: relative;
display: flex;
flex-direction: column;
}
main[b-d6y8adeyxc] {
flex: 1;
}
.sidebar[b-d6y8adeyxc] {
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
}
.top-row[b-d6y8adeyxc] {
background-color: #f7f7f7;
border-bottom: 1px solid #d6d5d5;
justify-content: flex-end;
height: 3.5rem;
display: flex;
align-items: center;
}
.top-row[b-d6y8adeyxc] a, .top-row[b-d6y8adeyxc] .btn-link {
white-space: nowrap;
margin-left: 1.5rem;
text-decoration: none;
}
.top-row[b-d6y8adeyxc] a:hover, .top-row[b-d6y8adeyxc] .btn-link:hover {
text-decoration: underline;
}
.top-row[b-d6y8adeyxc] a:first-child {
overflow: hidden;
text-overflow: ellipsis;
}
@media (max-width: 640.98px) {
.top-row[b-d6y8adeyxc] {
justify-content: space-between;
}
.top-row[b-d6y8adeyxc] a, .top-row[b-d6y8adeyxc] .btn-link {
margin-left: 0;
}
}
@media (min-width: 641px) {
.page[b-d6y8adeyxc] {
flex-direction: row;
}
.sidebar[b-d6y8adeyxc] {
width: 250px;
height: 100vh;
position: sticky;
top: 0;
}
.top-row[b-d6y8adeyxc] {
position: sticky;
top: 0;
z-index: 1;
}
.top-row.auth[b-d6y8adeyxc] a:first-child {
flex: 1;
text-align: right;
width: 0;
}
.top-row[b-d6y8adeyxc], article[b-d6y8adeyxc] {
padding-left: 2rem !important;
padding-right: 1.5rem !important;
}
}
#blazor-error-ui[b-d6y8adeyxc] {
color-scheme: light only;
background: lightyellow;
bottom: 0;
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
box-sizing: border-box;
display: none;
left: 0;
padding: 0.6rem 1.25rem 0.7rem 1.25rem;
position: fixed;
width: 100%;
z-index: 1000;
}
#blazor-error-ui .dismiss[b-d6y8adeyxc] {
cursor: pointer;
position: absolute;
right: 0.75rem;
top: 0.5rem;
}
/* /Components/Layout/NavMenu.razor.rz.scp.css */
.navbar-toggler[b-9gr5lv177o] {
appearance: none;
cursor: pointer;
width: 3.5rem;
height: 2.5rem;
color: white;
position: absolute;
top: 0.5rem;
right: 1rem;
border: 1px solid rgba(255, 255, 255, 0.1);
background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") no-repeat center/1.75rem rgba(255, 255, 255, 0.1);
}
.navbar-toggler:checked[b-9gr5lv177o] {
background-color: rgba(255, 255, 255, 0.5);
}
.top-row[b-9gr5lv177o] {
min-height: 3.5rem;
background-color: rgba(0,0,0,0.4);
}
.navbar-brand[b-9gr5lv177o] {
font-size: 1.1rem;
}
.bi[b-9gr5lv177o] {
display: inline-block;
position: relative;
width: 1.25rem;
height: 1.25rem;
margin-right: 0.75rem;
top: -1px;
background-size: cover;
}
.bi-house-door-fill-nav-menu[b-9gr5lv177o] {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E");
}
.bi-plus-square-fill-nav-menu[b-9gr5lv177o] {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E");
}
.bi-list-nested-nav-menu[b-9gr5lv177o] {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E");
}
.nav-item[b-9gr5lv177o] {
font-size: 0.9rem;
padding-bottom: 0.5rem;
}
.nav-item:first-of-type[b-9gr5lv177o] {
padding-top: 1rem;
}
.nav-item:last-of-type[b-9gr5lv177o] {
padding-bottom: 1rem;
}
.nav-item[b-9gr5lv177o] .nav-link {
color: #d7d7d7;
background: none;
border: none;
border-radius: 4px;
height: 3rem;
display: flex;
align-items: center;
line-height: 3rem;
width: 100%;
}
.nav-item[b-9gr5lv177o] a.active {
background-color: rgba(255,255,255,0.37);
color: white;
}
.nav-item[b-9gr5lv177o] .nav-link:hover {
background-color: rgba(255,255,255,0.1);
color: white;
}
.nav-scrollable[b-9gr5lv177o] {
display: none;
}
.navbar-toggler:checked ~ .nav-scrollable[b-9gr5lv177o] {
display: block;
}
@media (min-width: 641px) {
.navbar-toggler[b-9gr5lv177o] {
display: none;
}
.nav-scrollable[b-9gr5lv177o] {
/* Never collapse the sidebar for wide screens */
display: block;
/* Allow sidebar to scroll for tall menus */
height: calc(100vh - 3.5rem);
overflow-y: auto;
}
}
/* /Components/Layout/ReconnectModal.razor.rz.scp.css */
.components-reconnect-first-attempt-visible[b-9dgxcj10me],
.components-reconnect-repeated-attempt-visible[b-9dgxcj10me],
.components-reconnect-failed-visible[b-9dgxcj10me],
.components-pause-visible[b-9dgxcj10me],
.components-resume-failed-visible[b-9dgxcj10me],
.components-rejoining-animation[b-9dgxcj10me] {
display: none;
}
#components-reconnect-modal.components-reconnect-show .components-reconnect-first-attempt-visible[b-9dgxcj10me],
#components-reconnect-modal.components-reconnect-show .components-rejoining-animation[b-9dgxcj10me],
#components-reconnect-modal.components-reconnect-paused .components-pause-visible[b-9dgxcj10me],
#components-reconnect-modal.components-reconnect-resume-failed .components-resume-failed-visible[b-9dgxcj10me],
#components-reconnect-modal.components-reconnect-retrying[b-9dgxcj10me],
#components-reconnect-modal.components-reconnect-retrying .components-reconnect-repeated-attempt-visible[b-9dgxcj10me],
#components-reconnect-modal.components-reconnect-retrying .components-rejoining-animation[b-9dgxcj10me],
#components-reconnect-modal.components-reconnect-failed[b-9dgxcj10me],
#components-reconnect-modal.components-reconnect-failed .components-reconnect-failed-visible[b-9dgxcj10me] {
display: block;
}
#components-reconnect-modal[b-9dgxcj10me] {
background-color: white;
width: 20rem;
margin: 20vh auto;
padding: 2rem;
border: 0;
border-radius: 0.5rem;
box-shadow: 0 3px 6px 2px rgba(0, 0, 0, 0.3);
opacity: 0;
transition: display 0.5s allow-discrete, overlay 0.5s allow-discrete;
animation: components-reconnect-modal-fadeOutOpacity-b-9dgxcj10me 0.5s both;
&[open]
{
animation: components-reconnect-modal-slideUp-b-9dgxcj10me 1.5s cubic-bezier(.05, .89, .25, 1.02) 0.3s, components-reconnect-modal-fadeInOpacity-b-9dgxcj10me 0.5s ease-in-out 0.3s;
animation-fill-mode: both;
}
}
#components-reconnect-modal[b-9dgxcj10me]::backdrop {
background-color: rgba(0, 0, 0, 0.4);
animation: components-reconnect-modal-fadeInOpacity-b-9dgxcj10me 0.5s ease-in-out;
opacity: 1;
}
@keyframes components-reconnect-modal-slideUp-b-9dgxcj10me {
0% {
transform: translateY(30px) scale(0.95);
}
100% {
transform: translateY(0);
}
}
@keyframes components-reconnect-modal-fadeInOpacity-b-9dgxcj10me {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
@keyframes components-reconnect-modal-fadeOutOpacity-b-9dgxcj10me {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
.components-reconnect-container[b-9dgxcj10me] {
display: flex;
flex-direction: column;
align-items: center;
gap: 1rem;
}
#components-reconnect-modal p[b-9dgxcj10me] {
margin: 0;
text-align: center;
}
#components-reconnect-modal button[b-9dgxcj10me] {
border: 0;
background-color: #6b9ed2;
color: white;
padding: 4px 24px;
border-radius: 4px;
}
#components-reconnect-modal button:hover[b-9dgxcj10me] {
background-color: #3b6ea2;
}
#components-reconnect-modal button:active[b-9dgxcj10me] {
background-color: #6b9ed2;
}
.components-rejoining-animation[b-9dgxcj10me] {
position: relative;
width: 80px;
height: 80px;
}
.components-rejoining-animation div[b-9dgxcj10me] {
position: absolute;
border: 3px solid #0087ff;
opacity: 1;
border-radius: 50%;
animation: components-rejoining-animation-b-9dgxcj10me 1.5s cubic-bezier(0, 0.2, 0.8, 1) infinite;
}
.components-rejoining-animation div:nth-child(2)[b-9dgxcj10me] {
animation-delay: -0.5s;
}
@keyframes components-rejoining-animation-b-9dgxcj10me {
0% {
top: 40px;
left: 40px;
width: 0;
height: 0;
opacity: 0;
}
4.9% {
top: 40px;
left: 40px;
width: 0;
height: 0;
opacity: 0;
}
5% {
top: 40px;
left: 40px;
width: 0;
height: 0;
opacity: 1;
}
100% {
top: 0px;
left: 0px;
width: 80px;
height: 80px;
opacity: 0;
}
}
@@ -0,0 +1,363 @@
/* /Components/Layout/MainLayout.razor.rz.scp.css */
.page[b-d6y8adeyxc] {
position: relative;
display: flex;
flex-direction: column;
}
main[b-d6y8adeyxc] {
flex: 1;
}
.sidebar[b-d6y8adeyxc] {
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
}
.top-row[b-d6y8adeyxc] {
background-color: #f7f7f7;
border-bottom: 1px solid #d6d5d5;
justify-content: flex-end;
height: 3.5rem;
display: flex;
align-items: center;
}
.top-row[b-d6y8adeyxc] a, .top-row[b-d6y8adeyxc] .btn-link {
white-space: nowrap;
margin-left: 1.5rem;
text-decoration: none;
}
.top-row[b-d6y8adeyxc] a:hover, .top-row[b-d6y8adeyxc] .btn-link:hover {
text-decoration: underline;
}
.top-row[b-d6y8adeyxc] a:first-child {
overflow: hidden;
text-overflow: ellipsis;
}
@media (max-width: 640.98px) {
.top-row[b-d6y8adeyxc] {
justify-content: space-between;
}
.top-row[b-d6y8adeyxc] a, .top-row[b-d6y8adeyxc] .btn-link {
margin-left: 0;
}
}
@media (min-width: 641px) {
.page[b-d6y8adeyxc] {
flex-direction: row;
}
.sidebar[b-d6y8adeyxc] {
width: 250px;
height: 100vh;
position: sticky;
top: 0;
}
.top-row[b-d6y8adeyxc] {
position: sticky;
top: 0;
z-index: 1;
}
.top-row.auth[b-d6y8adeyxc] a:first-child {
flex: 1;
text-align: right;
width: 0;
}
.top-row[b-d6y8adeyxc], article[b-d6y8adeyxc] {
padding-left: 2rem !important;
padding-right: 1.5rem !important;
}
}
#blazor-error-ui[b-d6y8adeyxc] {
color-scheme: light only;
background: lightyellow;
bottom: 0;
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
box-sizing: border-box;
display: none;
left: 0;
padding: 0.6rem 1.25rem 0.7rem 1.25rem;
position: fixed;
width: 100%;
z-index: 1000;
}
#blazor-error-ui .dismiss[b-d6y8adeyxc] {
cursor: pointer;
position: absolute;
right: 0.75rem;
top: 0.5rem;
}
/* /Components/Layout/NavMenu.razor.rz.scp.css */
.navbar-toggler[b-9gr5lv177o] {
appearance: none;
cursor: pointer;
width: 3.5rem;
height: 2.5rem;
color: white;
position: absolute;
top: 0.5rem;
right: 1rem;
border: 1px solid rgba(255, 255, 255, 0.1);
background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") no-repeat center/1.75rem rgba(255, 255, 255, 0.1);
}
.navbar-toggler:checked[b-9gr5lv177o] {
background-color: rgba(255, 255, 255, 0.5);
}
.top-row[b-9gr5lv177o] {
min-height: 3.5rem;
background-color: rgba(0,0,0,0.4);
}
.navbar-brand[b-9gr5lv177o] {
font-size: 1.1rem;
}
.bi[b-9gr5lv177o] {
display: inline-block;
position: relative;
width: 1.25rem;
height: 1.25rem;
margin-right: 0.75rem;
top: -1px;
background-size: cover;
}
.bi-house-door-fill-nav-menu[b-9gr5lv177o] {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E");
}
.bi-plus-square-fill-nav-menu[b-9gr5lv177o] {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E");
}
.bi-list-nested-nav-menu[b-9gr5lv177o] {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E");
}
.nav-item[b-9gr5lv177o] {
font-size: 0.9rem;
padding-bottom: 0.5rem;
}
.nav-item:first-of-type[b-9gr5lv177o] {
padding-top: 1rem;
}
.nav-item:last-of-type[b-9gr5lv177o] {
padding-bottom: 1rem;
}
.nav-item[b-9gr5lv177o] .nav-link {
color: #d7d7d7;
background: none;
border: none;
border-radius: 4px;
height: 3rem;
display: flex;
align-items: center;
line-height: 3rem;
width: 100%;
}
.nav-item[b-9gr5lv177o] a.active {
background-color: rgba(255,255,255,0.37);
color: white;
}
.nav-item[b-9gr5lv177o] .nav-link:hover {
background-color: rgba(255,255,255,0.1);
color: white;
}
.nav-scrollable[b-9gr5lv177o] {
display: none;
}
.navbar-toggler:checked ~ .nav-scrollable[b-9gr5lv177o] {
display: block;
}
@media (min-width: 641px) {
.navbar-toggler[b-9gr5lv177o] {
display: none;
}
.nav-scrollable[b-9gr5lv177o] {
/* Never collapse the sidebar for wide screens */
display: block;
/* Allow sidebar to scroll for tall menus */
height: calc(100vh - 3.5rem);
overflow-y: auto;
}
}
/* /Components/Layout/ReconnectModal.razor.rz.scp.css */
.components-reconnect-first-attempt-visible[b-9dgxcj10me],
.components-reconnect-repeated-attempt-visible[b-9dgxcj10me],
.components-reconnect-failed-visible[b-9dgxcj10me],
.components-pause-visible[b-9dgxcj10me],
.components-resume-failed-visible[b-9dgxcj10me],
.components-rejoining-animation[b-9dgxcj10me] {
display: none;
}
#components-reconnect-modal.components-reconnect-show .components-reconnect-first-attempt-visible[b-9dgxcj10me],
#components-reconnect-modal.components-reconnect-show .components-rejoining-animation[b-9dgxcj10me],
#components-reconnect-modal.components-reconnect-paused .components-pause-visible[b-9dgxcj10me],
#components-reconnect-modal.components-reconnect-resume-failed .components-resume-failed-visible[b-9dgxcj10me],
#components-reconnect-modal.components-reconnect-retrying[b-9dgxcj10me],
#components-reconnect-modal.components-reconnect-retrying .components-reconnect-repeated-attempt-visible[b-9dgxcj10me],
#components-reconnect-modal.components-reconnect-retrying .components-rejoining-animation[b-9dgxcj10me],
#components-reconnect-modal.components-reconnect-failed[b-9dgxcj10me],
#components-reconnect-modal.components-reconnect-failed .components-reconnect-failed-visible[b-9dgxcj10me] {
display: block;
}
#components-reconnect-modal[b-9dgxcj10me] {
background-color: white;
width: 20rem;
margin: 20vh auto;
padding: 2rem;
border: 0;
border-radius: 0.5rem;
box-shadow: 0 3px 6px 2px rgba(0, 0, 0, 0.3);
opacity: 0;
transition: display 0.5s allow-discrete, overlay 0.5s allow-discrete;
animation: components-reconnect-modal-fadeOutOpacity-b-9dgxcj10me 0.5s both;
&[open]
{
animation: components-reconnect-modal-slideUp-b-9dgxcj10me 1.5s cubic-bezier(.05, .89, .25, 1.02) 0.3s, components-reconnect-modal-fadeInOpacity-b-9dgxcj10me 0.5s ease-in-out 0.3s;
animation-fill-mode: both;
}
}
#components-reconnect-modal[b-9dgxcj10me]::backdrop {
background-color: rgba(0, 0, 0, 0.4);
animation: components-reconnect-modal-fadeInOpacity-b-9dgxcj10me 0.5s ease-in-out;
opacity: 1;
}
@keyframes components-reconnect-modal-slideUp-b-9dgxcj10me {
0% {
transform: translateY(30px) scale(0.95);
}
100% {
transform: translateY(0);
}
}
@keyframes components-reconnect-modal-fadeInOpacity-b-9dgxcj10me {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
@keyframes components-reconnect-modal-fadeOutOpacity-b-9dgxcj10me {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
.components-reconnect-container[b-9dgxcj10me] {
display: flex;
flex-direction: column;
align-items: center;
gap: 1rem;
}
#components-reconnect-modal p[b-9dgxcj10me] {
margin: 0;
text-align: center;
}
#components-reconnect-modal button[b-9dgxcj10me] {
border: 0;
background-color: #6b9ed2;
color: white;
padding: 4px 24px;
border-radius: 4px;
}
#components-reconnect-modal button:hover[b-9dgxcj10me] {
background-color: #3b6ea2;
}
#components-reconnect-modal button:active[b-9dgxcj10me] {
background-color: #6b9ed2;
}
.components-rejoining-animation[b-9dgxcj10me] {
position: relative;
width: 80px;
height: 80px;
}
.components-rejoining-animation div[b-9dgxcj10me] {
position: absolute;
border: 3px solid #0087ff;
opacity: 1;
border-radius: 50%;
animation: components-rejoining-animation-b-9dgxcj10me 1.5s cubic-bezier(0, 0.2, 0.8, 1) infinite;
}
.components-rejoining-animation div:nth-child(2)[b-9dgxcj10me] {
animation-delay: -0.5s;
}
@keyframes components-rejoining-animation-b-9dgxcj10me {
0% {
top: 40px;
left: 40px;
width: 0;
height: 0;
opacity: 0;
}
4.9% {
top: 40px;
left: 40px;
width: 0;
height: 0;
opacity: 0;
}
5% {
top: 40px;
left: 40px;
width: 0;
height: 0;
opacity: 1;
}
100% {
top: 0px;
left: 0px;
width: 80px;
height: 80px;
opacity: 0;
}
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
nSlgotTW3Hbf965AW9nz1K2fn8llyiBH8/Q14LKRXcE=
File diff suppressed because one or more lines are too long