fix: 빌드 경고 정리 (미사용 변수, 중복 using 제거)
This commit is contained in:
@@ -0,0 +1,179 @@
|
||||
@page "/collection"
|
||||
@using QuantEngine.Web.Services
|
||||
@inject ApiClient ApiClient
|
||||
@inject ILogger<Collection> Logger
|
||||
|
||||
<PageTitle>QuantEngine - Collection</PageTitle>
|
||||
|
||||
<h1 style="margin: 0 0 8px 0; font-size: 28px; font-weight: 600;">Data Collection</h1>
|
||||
<p style="margin: 0 0 16px 0; color: var(--neutral-foreground-2); font-size: 14px;">
|
||||
KIS API data collection dashboard. Monitor runs, snapshots, and error trends.
|
||||
</p>
|
||||
|
||||
<!-- Controls -->
|
||||
<FluentStack Orientation="Orientation.Horizontal" HorizontalGap="8" Style="margin-bottom: 16px;">
|
||||
<FluentButton Appearance="ButtonAppearance.Primary" OnClick="@StartCollectionAsync" Disabled="@IsProcessing">
|
||||
@if (IsProcessing) { <span>Running...</span> } else { <span>Start Collection</span> }
|
||||
</FluentButton>
|
||||
<FluentButton Appearance="ButtonAppearance.Default" OnClick="@RefreshAsync" Disabled="@IsProcessing">
|
||||
Refresh
|
||||
</FluentButton>
|
||||
</FluentStack>
|
||||
|
||||
<!-- Loading skeleton -->
|
||||
@if (IsLoading)
|
||||
{
|
||||
<FluentStack Orientation="Orientation.Vertical" VerticalGap="16">
|
||||
<FluentSkeleton Width="100%" Height="60px" />
|
||||
<FluentSkeleton Width="100%" Height="200px" />
|
||||
</FluentStack>
|
||||
}
|
||||
else if (DashboardState != null)
|
||||
{
|
||||
<!-- Summary Cards -->
|
||||
<FluentStack Orientation="Orientation.Horizontal" HorizontalGap="16" Wrap="true" Style="margin-bottom: 16px;">
|
||||
<FluentCard Style="flex: 1; min-width: 150px;">
|
||||
<div style="padding: 16px;">
|
||||
<p style="margin: 0 0 8px 0; color: var(--neutral-foreground-2); font-size: 12px; font-weight: 500;">Last Run</p>
|
||||
<h3 style="margin: 0; font-size: 18px; font-weight: 600;">@(DashboardState.LastRunStatus ?? "N/A")</h3>
|
||||
<p style="margin: 8px 0 0 0; color: var(--neutral-foreground-3); font-size: 12px;">@(DashboardState.LastFinishedAt ?? "Not finished")</p>
|
||||
</div>
|
||||
</FluentCard>
|
||||
<FluentCard Style="flex: 1; min-width: 150px;">
|
||||
<div style="padding: 16px;">
|
||||
<p style="margin: 0 0 8px 0; color: var(--neutral-foreground-2); font-size: 12px; font-weight: 500;">Total Snapshots</p>
|
||||
<h3 style="margin: 0; font-size: 18px; font-weight: 600;">@DashboardState.TotalSnapshots</h3>
|
||||
</div>
|
||||
</FluentCard>
|
||||
<FluentCard Style="flex: 1; min-width: 150px;">
|
||||
<div style="padding: 16px;">
|
||||
<p style="margin: 0 0 8px 0; color: var(--neutral-foreground-2); font-size: 12px; font-weight: 500;">Total Errors</p>
|
||||
<h3 style="margin: 0; font-size: 18px; font-weight: 600;">@DashboardState.TotalErrors</h3>
|
||||
</div>
|
||||
</FluentCard>
|
||||
</FluentStack>
|
||||
|
||||
<!-- Recent Errors -->
|
||||
@if (DashboardState.RecentErrors.Count > 0)
|
||||
{
|
||||
<FluentCard Style="margin-bottom: 16px;">
|
||||
<div style="padding: 16px;">
|
||||
<h3 style="margin: 0 0 12px 0; font-size: 16px; font-weight: 600;">Recent Errors</h3>
|
||||
<table style="width: 100%; border-collapse: collapse;">
|
||||
<thead style="background: var(--neutral-subtle);">
|
||||
<tr>
|
||||
<th style="padding: 8px; text-align: left; border-bottom: 1px solid var(--neutral-divider-rest);">Source</th>
|
||||
<th style="padding: 8px; text-align: left; border-bottom: 1px solid var(--neutral-divider-rest);">Kind</th>
|
||||
<th style="padding: 8px; text-align: left; border-bottom: 1px solid var(--neutral-divider-rest);">Ticker</th>
|
||||
<th style="padding: 8px; text-align: left; border-bottom: 1px solid var(--neutral-divider-rest);">Message</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var error in DashboardState.RecentErrors)
|
||||
{
|
||||
<tr>
|
||||
<td style="padding: 8px; border-bottom: 1px solid var(--neutral-stroke-divider-rest);">@error.SourceName</td>
|
||||
<td style="padding: 8px; border-bottom: 1px solid var(--neutral-stroke-divider-rest);">@error.ErrorKind</td>
|
||||
<td style="padding: 8px; border-bottom: 1px solid var(--neutral-stroke-divider-rest);">@error.Ticker</td>
|
||||
<td style="padding: 8px; border-bottom: 1px solid var(--neutral-stroke-divider-rest);">@error.ErrorMessage</td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</FluentCard>
|
||||
}
|
||||
|
||||
<!-- Recent Runs -->
|
||||
@if (RecentRuns != null && RecentRuns.Count > 0)
|
||||
{
|
||||
<FluentCard>
|
||||
<div style="padding: 16px;">
|
||||
<h3 style="margin: 0 0 12px 0; font-size: 16px; font-weight: 600;">Recent Runs</h3>
|
||||
<table style="width: 100%; border-collapse: collapse;">
|
||||
<thead style="background: var(--neutral-subtle);">
|
||||
<tr>
|
||||
<th style="padding: 8px; text-align: left; border-bottom: 1px solid var(--neutral-divider-rest);">Run ID</th>
|
||||
<th style="padding: 8px; text-align: left; border-bottom: 1px solid var(--neutral-divider-rest);">Status</th>
|
||||
<th style="padding: 8px; text-align: left; border-bottom: 1px solid var(--neutral-divider-rest);">Started</th>
|
||||
<th style="padding: 8px; text-align: left; border-bottom: 1px solid var(--neutral-divider-rest);">Finished</th>
|
||||
<th style="padding: 8px; text-align: left; border-bottom: 1px solid var(--neutral-divider-rest);">Snapshots</th>
|
||||
<th style="padding: 8px; text-align: left; border-bottom: 1px solid var(--neutral-divider-rest);">Errors</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var run in RecentRuns)
|
||||
{
|
||||
<tr>
|
||||
<td style="padding: 8px; border-bottom: 1px solid var(--neutral-stroke-divider-rest); font-family: monospace; font-size: 12px;">@run.RunId</td>
|
||||
<td style="padding: 8px; border-bottom: 1px solid var(--neutral-stroke-divider-rest);">@run.Status</td>
|
||||
<td style="padding: 8px; border-bottom: 1px solid var(--neutral-stroke-divider-rest); font-size: 12px;">@run.StartedAt</td>
|
||||
<td style="padding: 8px; border-bottom: 1px solid var(--neutral-stroke-divider-rest); font-size: 12px;">@run.FinishedAt</td>
|
||||
<td style="padding: 8px; border-bottom: 1px solid var(--neutral-stroke-divider-rest);">@run.TotalSnapshots</td>
|
||||
<td style="padding: 8px; border-bottom: 1px solid var(--neutral-stroke-divider-rest);">@run.TotalErrors</td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</FluentCard>
|
||||
}
|
||||
}
|
||||
|
||||
@code {
|
||||
private CollectionDashboardStateDto? DashboardState;
|
||||
private List<CollectionRunDto>? RecentRuns;
|
||||
private bool IsLoading = true;
|
||||
private bool IsProcessing = false;
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
await LoadDashboardStateAsync();
|
||||
}
|
||||
|
||||
private async Task LoadDashboardStateAsync()
|
||||
{
|
||||
IsLoading = true;
|
||||
try
|
||||
{
|
||||
DashboardState = await ApiClient.GetCollectionStateAsync();
|
||||
|
||||
var runsResponse = await ApiClient.GetCollectionRunsAsync(10);
|
||||
RecentRuns = runsResponse?.Runs ?? new();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.LogError(ex, "Error loading dashboard");
|
||||
}
|
||||
finally
|
||||
{
|
||||
IsLoading = false;
|
||||
}
|
||||
}
|
||||
|
||||
private async Task StartCollectionAsync()
|
||||
{
|
||||
IsProcessing = true;
|
||||
try
|
||||
{
|
||||
var result = await ApiClient.StartCollectionRunAsync();
|
||||
if (result != null)
|
||||
{
|
||||
await LoadDashboardStateAsync();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.LogError(ex, "Error starting collection");
|
||||
}
|
||||
finally
|
||||
{
|
||||
IsProcessing = false;
|
||||
}
|
||||
}
|
||||
|
||||
private async Task RefreshAsync()
|
||||
{
|
||||
await LoadDashboardStateAsync();
|
||||
}
|
||||
}
|
||||
@@ -12,4 +12,3 @@
|
||||
@using QuantEngine.Web.Components
|
||||
@using QuantEngine.Web.Components.Layout
|
||||
@using QuantEngine.Web.Services
|
||||
@using QuantEngine.Web.Services
|
||||
|
||||
@@ -0,0 +1,216 @@
|
||||
using System.Net.Http.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
using QuantEngine.Core.Interfaces;
|
||||
|
||||
namespace QuantEngine.Web.Services;
|
||||
|
||||
public class ApiClient
|
||||
{
|
||||
private readonly HttpClient _http;
|
||||
private readonly ILogger<ApiClient> _logger;
|
||||
private string BaseUrl { get; set; }
|
||||
|
||||
public ApiClient(HttpClient http, ILogger<ApiClient> logger)
|
||||
{
|
||||
_http = http;
|
||||
_logger = logger;
|
||||
BaseUrl = "http://localhost:5001"; // Default for Blazor Server
|
||||
}
|
||||
|
||||
// Collection API Methods
|
||||
|
||||
public async Task<CollectionDashboardStateDto?> GetCollectionStateAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
return await _http.GetFromJsonAsync<CollectionDashboardStateDto>($"{BaseUrl}/api/collection/state");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error fetching collection state");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<CollectionRunsResponse?> GetCollectionRunsAsync(int limit = 20)
|
||||
{
|
||||
try
|
||||
{
|
||||
return await _http.GetFromJsonAsync<CollectionRunsResponse>($"{BaseUrl}/api/collection/runs?limit={limit}");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error fetching collection runs");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<CollectionRunSnapshotsResponse?> GetCollectionSnapshotsAsync(string runId)
|
||||
{
|
||||
try
|
||||
{
|
||||
return await _http.GetFromJsonAsync<CollectionRunSnapshotsResponse>($"{BaseUrl}/api/collection/runs/{runId}/snapshots");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, $"Error fetching snapshots for run {runId}");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<CollectionRunErrorsResponse?> GetCollectionErrorsAsync(string runId, int limit = 50)
|
||||
{
|
||||
try
|
||||
{
|
||||
return await _http.GetFromJsonAsync<CollectionRunErrorsResponse>($"{BaseUrl}/api/collection/runs/{runId}/errors?limit={limit}");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, $"Error fetching errors for run {runId}");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<CollectionRunStartResponse?> StartCollectionRunAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
var response = await _http.PostAsJsonAsync($"{BaseUrl}/api/collection/run", new { });
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
return await response.Content.ReadFromJsonAsync<CollectionRunStartResponse>();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error starting collection run");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// DTOs
|
||||
|
||||
public class CollectionDashboardStateDto
|
||||
{
|
||||
[JsonPropertyName("lastRunId")]
|
||||
public string? LastRunId { get; set; }
|
||||
|
||||
[JsonPropertyName("lastRunStatus")]
|
||||
public string? LastRunStatus { get; set; }
|
||||
|
||||
[JsonPropertyName("lastFinishedAt")]
|
||||
public string? LastFinishedAt { get; set; }
|
||||
|
||||
[JsonPropertyName("totalSnapshots")]
|
||||
public int TotalSnapshots { get; set; }
|
||||
|
||||
[JsonPropertyName("totalErrors")]
|
||||
public int TotalErrors { get; set; }
|
||||
|
||||
[JsonPropertyName("recentErrors")]
|
||||
public List<CollectionErrorDto> RecentErrors { get; set; } = new();
|
||||
}
|
||||
|
||||
public class CollectionRunDto
|
||||
{
|
||||
[JsonPropertyName("runId")]
|
||||
public string RunId { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("status")]
|
||||
public string Status { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("startedAt")]
|
||||
public string StartedAt { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("finishedAt")]
|
||||
public string? FinishedAt { get; set; }
|
||||
|
||||
[JsonPropertyName("totalSnapshots")]
|
||||
public int? TotalSnapshots { get; set; }
|
||||
|
||||
[JsonPropertyName("totalErrors")]
|
||||
public int? TotalErrors { get; set; }
|
||||
}
|
||||
|
||||
public class CollectionSnapshotDto
|
||||
{
|
||||
[JsonPropertyName("runId")]
|
||||
public string RunId { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("datasetName")]
|
||||
public string DatasetName { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("ticker")]
|
||||
public string Ticker { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("sourceName")]
|
||||
public string SourceName { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("capturedAt")]
|
||||
public string CapturedAt { get; set; } = "";
|
||||
}
|
||||
|
||||
public class CollectionErrorDto
|
||||
{
|
||||
[JsonPropertyName("runId")]
|
||||
public string RunId { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("sourceName")]
|
||||
public string SourceName { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("errorKind")]
|
||||
public string ErrorKind { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("errorMessage")]
|
||||
public string ErrorMessage { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("ticker")]
|
||||
public string Ticker { get; set; } = "";
|
||||
}
|
||||
|
||||
public class CollectionRunsResponse
|
||||
{
|
||||
[JsonPropertyName("runs")]
|
||||
public List<CollectionRunDto> Runs { get; set; } = new();
|
||||
|
||||
[JsonPropertyName("count")]
|
||||
public int Count { get; set; }
|
||||
}
|
||||
|
||||
public class CollectionRunSnapshotsResponse
|
||||
{
|
||||
[JsonPropertyName("runId")]
|
||||
public string RunId { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("snapshots")]
|
||||
public List<CollectionSnapshotDto> Snapshots { get; set; } = new();
|
||||
|
||||
[JsonPropertyName("count")]
|
||||
public int Count { get; set; }
|
||||
}
|
||||
|
||||
public class CollectionRunErrorsResponse
|
||||
{
|
||||
[JsonPropertyName("runId")]
|
||||
public string RunId { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("errors")]
|
||||
public List<CollectionErrorDto> Errors { get; set; } = new();
|
||||
|
||||
[JsonPropertyName("count")]
|
||||
public int Count { get; set; }
|
||||
}
|
||||
|
||||
public class CollectionRunStartResponse
|
||||
{
|
||||
[JsonPropertyName("runId")]
|
||||
public string RunId { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("status")]
|
||||
public string Status { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("startedAt")]
|
||||
public string StartedAt { get; set; } = "";
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -13,7 +13,7 @@ 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+aad4788e8430ad7244d0628047aaf40d0590ef95")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+e7e7d1470d5dc4a958da105e9b89e4d291e0e404")]
|
||||
[assembly: System.Reflection.AssemblyProductAttribute("QuantEngine.Web")]
|
||||
[assembly: System.Reflection.AssemblyTitleAttribute("QuantEngine.Web")]
|
||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
f65fdbf5ae13b230002b1911966d3803d46022cf6234aa717189fff95ad3d9d1
|
||||
bad5c7aa3a10ed623a291da4069db1fcdc8306037aadba3178e61b4c4b729968
|
||||
|
||||
+8
@@ -23,6 +23,14 @@ 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 =
|
||||
|
||||
BIN
Binary file not shown.
+1
-1
@@ -1 +1 @@
|
||||
0e1d6e7f1c84fdbf2e852a7227f82a6008223f92775fb884340ae9e6fac59f0f
|
||||
166d6a1fc1ca2d51e6a2788ece085ff1655cc6516563c314fd7b15cb1c7f9ceb
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
{"GlobalPropertiesHash":"61ZzOkAafDUCzt7x0mEjc+KORTs/Of52hN2aYDIQSWo=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["JTTrBKbjS35ApfJf5RSZHGAVU4t86eB4Z3Dj0Z4ZHHw=","rTMATgH4bAjZoNZ\u002BKRaVF9OxRk9Kn6EBIemE7YzyabI=","hxbowMggSnj8GJZOdMJHHwwDttpxRJIOTdIfn0ut0Ac=","hSLwzYWjyZqvvqAfHnAB6rPotX3eG0Hu8hDe8i5z7xs=","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=","/fjr/20ykorSUoc\u002BNr88YUutwXt205KL3aG5hglcfpI="],"CachedAssets":{},"CachedCopyCandidates":{}}
|
||||
{"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=","HDtDJ\u002B0WeFQOmX9x35CcP9M\u002BCthxE2T5\u002B5j32C0HgkQ="],"CachedAssets":{},"CachedCopyCandidates":{}}
|
||||
@@ -1 +1 @@
|
||||
{"GlobalPropertiesHash":"hb9Mk8Q4BfRLjPFbSBNw4B6QTKNWFUuDQL43Qwq5ZuI=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["JTTrBKbjS35ApfJf5RSZHGAVU4t86eB4Z3Dj0Z4ZHHw=","rTMATgH4bAjZoNZ\u002BKRaVF9OxRk9Kn6EBIemE7YzyabI=","hxbowMggSnj8GJZOdMJHHwwDttpxRJIOTdIfn0ut0Ac=","hSLwzYWjyZqvvqAfHnAB6rPotX3eG0Hu8hDe8i5z7xs=","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=","/fjr/20ykorSUoc\u002BNr88YUutwXt205KL3aG5hglcfpI="],"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":{}}
|
||||
{"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=","HDtDJ\u002B0WeFQOmX9x35CcP9M\u002BCthxE2T5\u002B5j32C0HgkQ="],"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":{}}
|
||||
@@ -1 +1 @@
|
||||
{"GlobalPropertiesHash":"sRnjZ123Hmd3VL4RmNf3gURHR16GI5Uk+lQqQ4VvHbs=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["JTTrBKbjS35ApfJf5RSZHGAVU4t86eB4Z3Dj0Z4ZHHw=","rTMATgH4bAjZoNZ\u002BKRaVF9OxRk9Kn6EBIemE7YzyabI=","hxbowMggSnj8GJZOdMJHHwwDttpxRJIOTdIfn0ut0Ac=","hSLwzYWjyZqvvqAfHnAB6rPotX3eG0Hu8hDe8i5z7xs=","gutXfyMccv5XisHlHhGJVGZETahysZqJii\u002Bg92M3\u002BdY=","hrXj0bYYvmdlZvAZZUebReLZfF8J/65r\u002B6aq4KtW3IE=","Kx2jIyFuF\u002BWn7fgtHBZ1NAWotqOmDxzgr6dTTh7HDPE=","sccdnyWmjEVIc4E/Wun5yH7NqVHF7c3g\u002B3KDbNw2New=","0nm9KNek3j/oQYUZUWEBhhL0txx1ekRnvnlCKKX0\u002Be8=","opg1Y4oXGX8x\u002BiLqpy9S3XVriqUcRUflY6tvfS0RPrM=","tNOP0eY2IzG88JsO78RhXsM42R7VPpxERLnNyDbauaU=","re4wFqPP/3GgQc83P3HKVcekxgIDYb4wyWk7MAimQDY=","vQcVlD31Fc9FE7Bi2395HnZbsJNtUlPfrATGTUN/0Q8=","yZglLoEA3dZuvvi6ZlKbOhDYJl863V6DuFnfV3jnch8="],"CachedAssets":{"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"},"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"}},"CachedCopyCandidates":{}}
|
||||
{"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":{"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"},"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"}},"CachedCopyCandidates":{}}
|
||||
Reference in New Issue
Block a user