From 81bfbce196c9670705715b0153481c6b39f64778 Mon Sep 17 00:00:00 2001 From: eble_lars Date: Wed, 2 Nov 2022 21:48:57 +0100 Subject: [PATCH] Update to .NET 6. Fixes #195 Switch from DDrag to CDrag. Fixes #196, #197 Fix loading indicator Fix crash when offsets not yet updated --- LCUSharp/LCUSharp.csproj | 10 +- LeagueBroadcast.Common/Data/DTO/Champion.cs | 29 +- .../Data/DTO/SummonerSpell.cs | 21 +- LeagueBroadcast.Common/Data/RIOT/ItemData.cs | 38 +- LeagueBroadcast.Common/Http/FileDownloader.cs | 36 +- LeagueBroadcast.Common/Http/RestRequester.cs | 51 +- .../LeagueBroadcast.Common.csproj | 11 +- LeagueBroadcast.Common/Utils/StringVersion.cs | 213 ++- .../FarsightController.cs | 2 +- .../LeagueBroadcast.Farsight.csproj | 10 +- .../LeagueBroadcast.Trinket.csproj | 10 +- LeagueBroadcast.Update/GitHubReleaseInfo.cs | 14 +- .../GitHubRemoteEndpoint.cs | 25 +- .../LeagueBroadcast.Update.csproj | 10 +- .../ChampSelect/StateInfo/Converter.cs | 4 +- .../Common/Controllers/AppUpdateController.cs | 2 +- .../Common/Controllers/ConfigController.cs | 10 +- .../Common/Data/Config/ComponentConfig.cs | 29 +- .../Common/Data/Provider/DataDragon.cs | 615 ++++---- .../Ingame/Data/Config/FarsightConfig.cs | 57 +- LeagueBroadcast/Ingame/State/State.cs | 3 +- LeagueBroadcast/LeagueBroadcast.csproj | 18 +- .../MVVM/ViewModel/StartupViewModel.cs | 29 +- Overlays/ingame/package-lock.json | 1338 ++++++++++------- Overlays/ingame/src/variables.ts | 2 +- 25 files changed, 1502 insertions(+), 1085 deletions(-) diff --git a/LCUSharp/LCUSharp.csproj b/LCUSharp/LCUSharp.csproj index 5515d33..09e6399 100644 --- a/LCUSharp/LCUSharp.csproj +++ b/LCUSharp/LCUSharp.csproj @@ -1,11 +1,19 @@  - netcoreapp3.1 + net6.0 1.4.17.0 1.4.17.21326 + + embedded + + + + embedded + + diff --git a/LeagueBroadcast.Common/Data/DTO/Champion.cs b/LeagueBroadcast.Common/Data/DTO/Champion.cs index 77f9a2e..1e48af8 100644 --- a/LeagueBroadcast.Common/Data/DTO/Champion.cs +++ b/LeagueBroadcast.Common/Data/DTO/Champion.cs @@ -1,13 +1,12 @@ using System; using System.Collections.Generic; using System.Text; +using System.Text.Json.Serialization; namespace LeagueBroadcast.Common.Data.DTO { public class Champion { - public static List Champions = new(); - public string id; public int key; public string name; @@ -16,4 +15,30 @@ public class Champion public string loadingImg; public string squareImg; } + + public class CDragonChampion + { + public static HashSet All { get; set; } = new(); + + [JsonPropertyName("id")] + public int ID { get; set; } = 0; + + [JsonPropertyName("alias")] + public string Alias { get; set; } = ""; + + [JsonPropertyName("name")] + public string Name { get; set; } = ""; + + [JsonPropertyName("splashImg")] + public string? SplashImg { get; set; } + + [JsonPropertyName("splashCenteredImg")] + public string? SplashCenteredImg { get; set; } + + [JsonPropertyName("loadingImg")] + public string? LoadingImg { get; set; } + + [JsonPropertyName("squareImg")] + public string? SquareImg { get; set; } + } } diff --git a/LeagueBroadcast.Common/Data/DTO/SummonerSpell.cs b/LeagueBroadcast.Common/Data/DTO/SummonerSpell.cs index aa82303..fb09c0b 100644 --- a/LeagueBroadcast.Common/Data/DTO/SummonerSpell.cs +++ b/LeagueBroadcast.Common/Data/DTO/SummonerSpell.cs @@ -1,15 +1,26 @@  using System.Collections.Generic; +using System.Text.Json.Serialization; namespace LeagueBroadcast.Common.Data.DTO { public class SummonerSpell { - public static List SummonerSpells = new(); + public static HashSet All { get; set; } = new(); - public string id; - public int key; - public string name; - public string icon; + [JsonPropertyName("id")] + public int ID { get; set; } = -1; + + [JsonPropertyName("key")] + public int Key => ID; + + [JsonPropertyName("name")] + public string Name { get; set; } = ""; + + [JsonPropertyName("icon")] + public string Icon => IconPath; + + [JsonPropertyName("iconPath")] + public string IconPath { get; set; } = ""; } } diff --git a/LeagueBroadcast.Common/Data/RIOT/ItemData.cs b/LeagueBroadcast.Common/Data/RIOT/ItemData.cs index cb4f7d2..a45b1ee 100644 --- a/LeagueBroadcast.Common/Data/RIOT/ItemData.cs +++ b/LeagueBroadcast.Common/Data/RIOT/ItemData.cs @@ -1,13 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Text; +using System.Collections.Generic; +using System.Text.Json.Serialization; namespace LeagueBroadcast.Common.Data.RIOT { public class ItemData { - public static List Items = new(); - public int itemID; public ItemCost gold; public int specialRecipe; @@ -20,3 +17,34 @@ public ItemData(int itemID) } } } + + +public class CDragonItem +{ + + public static HashSet All { get; set; } = new(); + + public static HashSet Full { get; set; } = new(); + + + [JsonPropertyName("id")] + public int ID { get; set; } = -1; + + [JsonPropertyName("name")] + public string Name { get; set; } = ""; + + [JsonPropertyName("from")] + public List Components { get; set; } = new(); + + [JsonPropertyName("price")] + public int Price { get; set; } = 0; + + [JsonPropertyName("priceTotal")] + public int PriceTotal { get; set; } = 0; + + [JsonPropertyName("specialRecipe")] + public int SpecialRecipe { get; set; } = 0; + + [JsonPropertyName("iconPath")] + public string IconPath { get; set; } = ""; +} diff --git a/LeagueBroadcast.Common/Http/FileDownloader.cs b/LeagueBroadcast.Common/Http/FileDownloader.cs index 0803d5f..01bf9e8 100644 --- a/LeagueBroadcast.Common/Http/FileDownloader.cs +++ b/LeagueBroadcast.Common/Http/FileDownloader.cs @@ -1,17 +1,16 @@ using System; using System.IO; using System.Net; +using System.Net.Http; +using System.Threading; using System.Threading.Tasks; namespace LeagueBroadcast.Update.Http { - //https://github.com/Johannes-Schneider/GoldDiff/blob/master/GoldDiff.Shared/Http/FileDownloader.cs + //Adapted from https://github.com/Johannes-Schneider/GoldDiff/blob/master/GoldDiff.Shared/Http/FileDownloader.cs public class FileDownloader { -#nullable enable - public event EventHandler? DownloadProgressChanged; - - public async Task DownloadAsync(string? remoteUrl, string? filePath) + public static async Task DownloadAsync(string? remoteUrl, string? filePath, IProgress? progress = null, CancellationToken cancellationToken = default) { if (string.IsNullOrEmpty(remoteUrl)) { @@ -23,10 +22,10 @@ public async Task DownloadAsync(string? remoteUrl, string? filePath) throw new ArgumentNullException(nameof(filePath)); } - var fileDirectory = Path.GetDirectoryName(filePath); + string? fileDirectory = Path.GetDirectoryName(filePath); if (!Directory.Exists(fileDirectory)) { - Directory.CreateDirectory(fileDirectory!); + _ = Directory.CreateDirectory(fileDirectory!); } if (File.Exists(filePath)) @@ -34,26 +33,11 @@ public async Task DownloadAsync(string? remoteUrl, string? filePath) File.Delete(filePath!); } - using var webClient = new WebClient(); - var downloadStartTime = DateTime.Now; - webClient.DownloadProgressChanged += (_, args) => - { - if (DownloadProgressChanged == null) - { - return; - } - - var elapsedTime = DateTime.Now - downloadStartTime; - var progress = args.BytesReceived / (double)args.TotalBytesToReceive; - var bytesPerSecond = args.BytesReceived / elapsedTime.TotalSeconds; - var estimatedRemainingTime = TimeSpan.FromSeconds((args.TotalBytesToReceive - args.BytesReceived) / bytesPerSecond); - DownloadProgressChanged.Invoke(this, new DownloadProgressEventArguments(progress, - bytesPerSecond / (1024.0d * 1024.0d), - estimatedRemainingTime)); - }; - await webClient.DownloadFileTaskAsync(remoteUrl!, filePath!); + using HttpClient httpClient = new(); + httpClient.Timeout = TimeSpan.FromMinutes(5); + using FileStream file = new(filePath, FileMode.Create, FileAccess.Write, FileShare.None); + return await httpClient.DownloadAsync(remoteUrl, file, progress, cancellationToken); } } -#nullable disable } diff --git a/LeagueBroadcast.Common/Http/RestRequester.cs b/LeagueBroadcast.Common/Http/RestRequester.cs index 5c54d59..03540ca 100644 --- a/LeagueBroadcast.Common/Http/RestRequester.cs +++ b/LeagueBroadcast.Common/Http/RestRequester.cs @@ -1,9 +1,9 @@ -using LeagueBroadcast.Common; -using Newtonsoft.Json; -using System; -using System.Net.Http; +using System; using System.Net.Http.Headers; +using System.Net.Http; using System.Threading.Tasks; +using System.Text.Json; +using LeagueBroadcast.Common; namespace LeagueBroadcast.Update.Http { @@ -14,7 +14,19 @@ public class RestRequester : IDisposable private HttpClient Client { get; } - public RestRequester(TimeSpan requestTimeout, HttpClientHandler? clientHandler = null) + private static RestRequester? _instance; + private static RestRequester Instance => GetInstance(); + + private static RestRequester GetInstance() + { + if (_instance == null) + { + _instance = new RestRequester(TimeSpan.FromMilliseconds(500), null); + } + return _instance; + } + + private RestRequester(TimeSpan requestTimeout, HttpClientHandler? clientHandler = null) { Client = new HttpClient(clientHandler ?? new HttpClientHandler()) { @@ -27,18 +39,37 @@ public RestRequester(TimeSpan requestTimeout, HttpClientHandler? clientHandler = }; } - public async Task GetAsync(string url) + public static async Task GetAsync(string url) { try { - var response = await Client.GetAsync(url).ConfigureAwait(false); + var response = await Instance.Client.GetAsync(url); if (!response.IsSuccessStatusCode) { Log.Warn($"Request to {url} ({nameof(TResultType)} = {typeof(TResultType).Name}) returned status code {response.StatusCode}."); - return default!; + return default; + } + var json = await response.Content.ReadAsStringAsync(); + return JsonSerializer.Deserialize(json)!; + } + catch (TaskCanceledException) + { + Log.Warn($"Request to {url} caused a {nameof(TaskCanceledException)}. This is usually an indicator for a timeout."); + return default; + } + } + + public static async Task GetRaw(string url) + { + try + { + HttpResponseMessage? response = await Instance.Client.GetAsync(url).ConfigureAwait(false); + if (!response.IsSuccessStatusCode) + { + Log.Warn($"Request to {url} returned status code {response.StatusCode}."); + throw new HttpRequestException(response.StatusCode + ""); } - var json = await response.Content.ReadAsStringAsync().ConfigureAwait(false); - return JsonConvert.DeserializeObject(json); + return await response.Content.ReadAsStringAsync().ConfigureAwait(false); } catch (TaskCanceledException) { diff --git a/LeagueBroadcast.Common/LeagueBroadcast.Common.csproj b/LeagueBroadcast.Common/LeagueBroadcast.Common.csproj index 07b5f69..e8519e2 100644 --- a/LeagueBroadcast.Common/LeagueBroadcast.Common.csproj +++ b/LeagueBroadcast.Common/LeagueBroadcast.Common.csproj @@ -1,15 +1,24 @@  - netcoreapp3.1 + net6.0 1.4.23.0 1.4.23.21326 latest + + embedded + + + + embedded + + + diff --git a/LeagueBroadcast.Common/Utils/StringVersion.cs b/LeagueBroadcast.Common/Utils/StringVersion.cs index fc554cb..6402107 100644 --- a/LeagueBroadcast.Common/Utils/StringVersion.cs +++ b/LeagueBroadcast.Common/Utils/StringVersion.cs @@ -1,25 +1,46 @@ using System; +using System.Diagnostics; +using System.IO; using System.Linq; -using Newtonsoft.Json; +using System.Net.Http; +using System.Net; +using System.Reflection; +using System.Text.Json; +using System.Text.Json.Serialization; +using System.Threading.Tasks; +using System.Threading; namespace LeagueBroadcast.Common.Utils { - //https://github.com/Johannes-Schneider/GoldDiff/blob/master/GoldDiff.Shared/Utility/StringVersion.cs + //Adapted from https://github.com/Johannes-Schneider/GoldDiff/blob/master/GoldDiff.Shared/Utility/StringVersion.cs + [JsonConverter(typeof(StringVersionConverter))] public sealed class StringVersion : IEquatable { private const string ComponentSeparator = "."; - [JsonProperty] + [JsonInclude] private int[] Components { get; } - public static StringVersion Zero => new StringVersion(0); + public static StringVersion Zero => new(0); + + public static StringVersion CallingAppVersion => new(Parse(Assembly.GetCallingAssembly().GetName().Version!.ToString()).Components.Take(3).ToArray()); + + public static StringVersion FullCallingAppVersion => Parse(Assembly.GetCallingAssembly().GetName().Version!.ToString()); + + public static StringVersion AppVersion => GetSimpleLocalVersion(); + + + public int Major => Components[0]; + public int Minor => Components[1]; + public int Patch => Components[2]; + #nullable enable public static bool TryParse(string? input, out StringVersion? version) { try { - var components = input?.Split(new[] { ComponentSeparator }, StringSplitOptions.None) ?? throw new ArgumentNullException(nameof(input)); - version = new StringVersion(components.Select(component => Convert.ToInt32(component)).ToArray()); + string[]? components = input?.Split(new[] { ComponentSeparator }, StringSplitOptions.None) ?? throw new ArgumentNullException(nameof(input)); + version = new StringVersion(components.Where(c => Microsoft.VisualBasic.Information.IsNumeric(c)).Select(component => Convert.ToInt32(component)).ToArray()); return true; } catch @@ -29,6 +50,11 @@ public static bool TryParse(string? input, out StringVersion? version) } } + public static StringVersion Parse(string? input) + { + return !TryParse(input, out StringVersion? version) ? Zero : version ?? Zero; + } + public StringVersion(params int[]? components) { if (components == null) @@ -54,6 +80,17 @@ public override string ToString() return string.Join(ComponentSeparator, Components); } + public string ToString(int count) + { + return string.Join(ComponentSeparator, Components.SubArray(0, count)); + } + + + private static StringVersion GetSimpleLocalVersion() + { + return new((Parse(FileVersionInfo.GetVersionInfo("LeagueBroadcast.exe").FileVersion!) ?? Zero).Components.Take(3).ToArray()); + } + #region IEquatable public override bool Equals(object? obj) @@ -63,7 +100,7 @@ public override bool Equals(object? obj) public bool Equals(StringVersion? other) { - if (ReferenceEquals(other, null)) + if (other is null) { return false; } @@ -97,12 +134,12 @@ public override int GetHashCode() public static bool operator >(StringVersion? a, StringVersion? b) { - if (ReferenceEquals(a, null)) + if (a is null) { throw new ArgumentNullException(nameof(a)); } - if (ReferenceEquals(b, null)) + if (b is null) { throw new ArgumentNullException(nameof(b)); } @@ -128,12 +165,12 @@ public override int GetHashCode() public static bool operator >=(StringVersion? a, StringVersion? b) { - if (ReferenceEquals(a, null)) + if (a is null) { throw new ArgumentNullException(nameof(a)); } - if (ReferenceEquals(b, null)) + if (b is null) { throw new ArgumentNullException(nameof(b)); } @@ -159,12 +196,12 @@ public override int GetHashCode() public static bool operator <(StringVersion? a, StringVersion? b) { - if (ReferenceEquals(a, null)) + if (a is null) { throw new ArgumentNullException(nameof(a)); } - if (ReferenceEquals(b, null)) + if (b is null) { throw new ArgumentNullException(nameof(b)); } @@ -190,12 +227,12 @@ public override int GetHashCode() public static bool operator <=(StringVersion? a, StringVersion? b) { - if (ReferenceEquals(a, null)) + if (a is null) { throw new ArgumentNullException(nameof(a)); } - if (ReferenceEquals(b, null)) + if (b is null) { throw new ArgumentNullException(nameof(b)); } @@ -219,7 +256,153 @@ public override int GetHashCode() return true; } + public static StringVersion operator +(StringVersion? a, StringVersion? b) + { + if (a is null) + { + throw new ArgumentNullException(nameof(a)); + } + + if (b is null) + { + throw new ArgumentNullException(nameof(b)); + } + + int[] outComponents = new int[Math.Max(a.Components.Length, b.Components.Length)]; + for (var componentIndex = 0; componentIndex < outComponents.Length; ++componentIndex) + { + outComponents[componentIndex] = a.Components.ElementAtOrDefault(componentIndex) + b.Components.ElementAtOrDefault(componentIndex); + } + + return new(outComponents); + } + + public static StringVersion operator -(StringVersion? a, StringVersion? b) + { + if (a is null) + { + throw new ArgumentNullException(nameof(a)); + } + + if (b is null) + { + throw new ArgumentNullException(nameof(b)); + } + + int[] outComponents = new int[Math.Max(a.Components.Length, b.Components.Length)]; + for (var componentIndex = 0; componentIndex < outComponents.Length; ++componentIndex) + { + outComponents[componentIndex] = a.Components.ElementAtOrDefault(componentIndex) - b.Components.ElementAtOrDefault(componentIndex); + } + + return new(outComponents); + } + #endregion } #nullable disable + + public class StringVersionConverter : JsonConverter + { + public override StringVersion Read(ref Utf8JsonReader reader, + Type typeToConvert, + JsonSerializerOptions options) + { + return StringVersion.TryParse(reader.GetString(), out var version) ? version : StringVersion.Zero; + } + + public override void Write(Utf8JsonWriter writer, + StringVersion value, + JsonSerializerOptions options) + { + writer.WriteStringValue(value.ToString()); + } + } +} + + +//temp put it in here +public static class TemporaryExtensions +{ + public static T[] SubArray(this T[] array, int offset, int length) + { + T[] result = new T[length]; + Array.Copy(array, offset, result, 0, length); + return result; + } + + public static void Empty(this DirectoryInfo directory) + { + foreach (FileInfo file in directory.EnumerateFiles()) + { + file.Delete(); + } + + foreach (DirectoryInfo subDirectory in directory.EnumerateDirectories()) + { + subDirectory.Delete(true); + } + } + + public static async Task DownloadAsync(this HttpClient client, string requestUri, Stream destination, IProgress? progress = null, CancellationToken cancellationToken = default) + { + // Get the http headers first to examine the content length + using HttpResponseMessage response = await client.GetAsync(requestUri, HttpCompletionOption.ResponseHeadersRead, cancellationToken); + long? contentLength = response.Content.Headers.ContentLength; + + using Stream? download = await response.Content.ReadAsStreamAsync(); + + // Ignore progress reporting when no progress reporter was + // passed or when the content length is unknown + if (progress == null || !contentLength.HasValue) + { + await download.CopyToAsync(destination, cancellationToken); + return response.StatusCode; + } + + // Convert absolute progress (bytes downloaded) into relative progress (0% - 100%) + Progress? relativeProgress = new(totalBytes => progress.Report((float)totalBytes / contentLength.Value)); + // Use extension method to report progress while downloading + await download.CopyToAsync(destination, 81920, relativeProgress, cancellationToken); + progress.Report(1); + return response.StatusCode; + } + + public static async Task CopyToAsync(this Stream source, Stream destination, int bufferSize, IProgress? progress = null, CancellationToken cancellationToken = default) + { + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + if (!source.CanRead) + { + throw new ArgumentException("Has to be readable", nameof(source)); + } + + if (destination == null) + { + throw new ArgumentNullException(nameof(destination)); + } + + if (!destination.CanWrite) + { + throw new ArgumentException("Has to be writable", nameof(destination)); + } + + if (bufferSize < 0) + { + throw new ArgumentOutOfRangeException(nameof(bufferSize)); + } + + byte[] buffer = new byte[bufferSize]; + long totalBytesRead = 0; + int bytesRead; + while ((bytesRead = await source.ReadAsync(buffer, cancellationToken).ConfigureAwait(false)) != 0) + { + await destination.WriteAsync(buffer.AsMemory(0, bytesRead), cancellationToken).ConfigureAwait(false); + totalBytesRead += bytesRead; + progress?.Report(totalBytesRead); + } + } } diff --git a/LeagueBroadcast.Farsight/FarsightController.cs b/LeagueBroadcast.Farsight/FarsightController.cs index d9d0c38..7a07188 100644 --- a/LeagueBroadcast.Farsight/FarsightController.cs +++ b/LeagueBroadcast.Farsight/FarsightController.cs @@ -35,7 +35,7 @@ public FarsightController() { if (!ShouldRun) return; - Champions = Champion.Champions.Select(c => c.id).ToList(); + Champions = CDragonChampion.All.Select(c => c.Alias).ToList(); Log.Info($"Farsight loaded. Found {Champions.Count} Champ names"); } diff --git a/LeagueBroadcast.Farsight/LeagueBroadcast.Farsight.csproj b/LeagueBroadcast.Farsight/LeagueBroadcast.Farsight.csproj index 100a890..0276867 100644 --- a/LeagueBroadcast.Farsight/LeagueBroadcast.Farsight.csproj +++ b/LeagueBroadcast.Farsight/LeagueBroadcast.Farsight.csproj @@ -1,13 +1,21 @@  - netcoreapp3.1 + net6.0 latest 1.4.34.0 1.4.34.21326 Library + + embedded + + + + embedded + + diff --git a/LeagueBroadcast.Trinket/LeagueBroadcast.Trinket.csproj b/LeagueBroadcast.Trinket/LeagueBroadcast.Trinket.csproj index aa56e93..e98086e 100644 --- a/LeagueBroadcast.Trinket/LeagueBroadcast.Trinket.csproj +++ b/LeagueBroadcast.Trinket/LeagueBroadcast.Trinket.csproj @@ -1,10 +1,18 @@  - netcoreapp3.1 + net6.0 1.4.16.0 1.4.16.21326 Library + + embedded + + + + embedded + + diff --git a/LeagueBroadcast.Update/GitHubReleaseInfo.cs b/LeagueBroadcast.Update/GitHubReleaseInfo.cs index 9cc5071..58b1677 100644 --- a/LeagueBroadcast.Update/GitHubReleaseInfo.cs +++ b/LeagueBroadcast.Update/GitHubReleaseInfo.cs @@ -1,16 +1,16 @@ -using Newtonsoft.Json; +using System.Text.Json.Serialization; namespace LeagueBroadcast.Update { public sealed class GitHubReleaseInfo { - [JsonProperty("tag_name")] - public string Version { get; set; } + [JsonPropertyName("tag_name")] + public string Version { get; set; } = ""; - [JsonProperty("html_url")] - public string Url { get; set; } + [JsonPropertyName("html_url")] + public string Url { get; set; } = ""; - [JsonProperty("assets")] - public GitHubReleaseAsset[] Assets { get; set; } + [JsonPropertyName("assets")] + public GitHubReleaseAsset[] Assets { get; set; } = new GitHubReleaseAsset[0]; } } diff --git a/LeagueBroadcast.Update/GitHubRemoteEndpoint.cs b/LeagueBroadcast.Update/GitHubRemoteEndpoint.cs index b20ea31..313c0fa 100644 --- a/LeagueBroadcast.Update/GitHubRemoteEndpoint.cs +++ b/LeagueBroadcast.Update/GitHubRemoteEndpoint.cs @@ -1,33 +1,18 @@ -using LeagueBroadcast.Update.Http; -using System; -using System.Collections.Generic; -using System.Text; +using LeagueBroadcast.Common; +using LeagueBroadcast.Update.Http; using System.Threading.Tasks; namespace LeagueBroadcast.Update { public class GitHubRemoteEndpoint { - private static TimeSpan RequestTimeout { get; } = TimeSpan.FromSeconds(2); private const string ReleaseUrl = @"https://api.github.com/repos/{0}/releases/latest"; - private static GitHubRemoteEndpoint? _instance; - - public static GitHubRemoteEndpoint Instance - { - get => _instance ??= new GitHubRemoteEndpoint(); - } - - private RestRequester Requester { get; } - - private GitHubRemoteEndpoint() - { - Requester = new RestRequester(RequestTimeout); - } #nullable enable - public async Task GetLatestReleaseAsync(string repositoryName) + public static async Task GetLatestReleaseAsync(string repositoryName) { - return await Requester.GetAsync(string.Format(ReleaseUrl, repositoryName)); + string releaseLocation = string.Format(ReleaseUrl, repositoryName); + return await RestRequester.GetAsync(releaseLocation); } #nullable disable } diff --git a/LeagueBroadcast.Update/LeagueBroadcast.Update.csproj b/LeagueBroadcast.Update/LeagueBroadcast.Update.csproj index 5eacc64..252e32d 100644 --- a/LeagueBroadcast.Update/LeagueBroadcast.Update.csproj +++ b/LeagueBroadcast.Update/LeagueBroadcast.Update.csproj @@ -1,11 +1,19 @@  - netcoreapp3.1 + net6.0 1.4.22.0 1.4.22.21326 + + embedded + + + + embedded + + diff --git a/LeagueBroadcast/ChampSelect/StateInfo/Converter.cs b/LeagueBroadcast/ChampSelect/StateInfo/Converter.cs index d9919fd..0152dd9 100644 --- a/LeagueBroadcast/ChampSelect/StateInfo/Converter.cs +++ b/LeagueBroadcast/ChampSelect/StateInfo/Converter.cs @@ -21,9 +21,9 @@ public static Team ConvertTeam(ConversionInput kwargs) var pick = new Pick(cell.cellId); var spell1 = DataDragon.Instance.GetSummonerById(cell.spell1Id); - pick.spell1 = new SummonerSpell() { id = cell.spell1Id + "", icon = spell1 != null ? spell1.icon : "" }; + pick.spell1 = new SummonerSpell() { ID = cell.spell1Id , IconPath = spell1 != null ? spell1.Icon : "" }; var spell2 = DataDragon.Instance.GetSummonerById(cell.spell2Id); - pick.spell2 = new SummonerSpell() { id = cell.spell2Id + "", icon = spell2 != null ? spell2.icon : "" }; + pick.spell2 = new SummonerSpell() { ID = cell.spell2Id , IconPath = spell2 != null ? spell2.Icon : "" }; var champion = DataDragon.Instance.GetChampionById(cell.championId); pick.champion = champion; diff --git a/LeagueBroadcast/Common/Controllers/AppUpdateController.cs b/LeagueBroadcast/Common/Controllers/AppUpdateController.cs index 0483d00..3b25c16 100644 --- a/LeagueBroadcast/Common/Controllers/AppUpdateController.cs +++ b/LeagueBroadcast/Common/Controllers/AppUpdateController.cs @@ -27,7 +27,7 @@ public static async Task Update(StartupViewModel ctx) Log.Info("[Update] Checking for Updates"); ctx.Status = "Checking for Updates"; - var latestRelease = await GitHubRemoteEndpoint.Instance.GetLatestReleaseAsync(config.UpdateRepositoryName); + var latestRelease = await GitHubRemoteEndpoint.GetLatestReleaseAsync(config.UpdateRepositoryName); if (latestRelease == null) { diff --git a/LeagueBroadcast/Common/Controllers/ConfigController.cs b/LeagueBroadcast/Common/Controllers/ConfigController.cs index 677533a..a1f3644 100644 --- a/LeagueBroadcast/Common/Controllers/ConfigController.cs +++ b/LeagueBroadcast/Common/Controllers/ConfigController.cs @@ -1,4 +1,5 @@ using LeagueBroadcast.Common.Data.Config; +using LeagueBroadcast.Farsight; using LeagueBroadcast.Ingame.Data.Config; using LeagueBroadcast.Ingame.Data.Frontend; using System; @@ -38,9 +39,9 @@ public ConfigController() var controller = JSONConfigProvider.Instance; + controller.ReadConfig(Component); controller.ReadConfig(PickBan); controller.ReadConfig(Ingame); - controller.ReadConfig(Component); if(PickBan.FileVersion == null || Component.FileVersion == null || Ingame.FileVersion == null) { @@ -75,13 +76,16 @@ public ConfigController() public static void LoadOffsetConfig() { JSONConfigProvider.Instance.ReadConfig(Farsight); - if(Farsight.FileVersion == null) + if(Farsight.FileVersion == null || !FarsightController.ShouldRun ) { Log.Warn("Could not load Offsets"); - var result = MessageBox.Show("Failed to load offsets. Manually download or write Config/Farsight.json. Check github for current file version.", "LeagueBroadcast", MessageBoxButton.OK, MessageBoxImage.Error); + var result = MessageBox.Show("Failed to load offsets. Manually download or write Config/Farsight.json. Check github for current file version. Ingame will not work properly!", "LeagueBroadcast", MessageBoxButton.OK, MessageBoxImage.Error); + + /* Application.Current.Dispatcher.Invoke((Action)delegate { Application.Current.Shutdown(); }); + */ } FarsightWatcher = new("Farsight.json", Farsight); diff --git a/LeagueBroadcast/Common/Data/Config/ComponentConfig.cs b/LeagueBroadcast/Common/Data/Config/ComponentConfig.cs index 2340723..7e45329 100644 --- a/LeagueBroadcast/Common/Data/Config/ComponentConfig.cs +++ b/LeagueBroadcast/Common/Data/Config/ComponentConfig.cs @@ -18,7 +18,7 @@ class ComponentConfig : JSONConfig public override string FileVersion { get => _fileVersion; set => _fileVersion = value; } [JsonIgnore] - public static new string CurrentVersion => "1.3"; + public static new string CurrentVersion => "1.4"; public DataDragonConfig DataDragon; @@ -62,10 +62,11 @@ private ComponentConfig CreateDefault() DataDragon = new DataDragonConfig() { MinimumGoldCost = 2000, - Region = "euw", + Region = "global", Locale = "en_US", Patch = "latest", - CDN = "https://ddragon.leagueoflegends.com/cdn" + CDN = "https://ddragon.leagueoflegends.com/cdn", + CDragonRaw = "https://raw.communitydragon.org" }, PickBan = new PickBanConfig() { @@ -195,7 +196,7 @@ public override bool UpdateConfigVersion(string oldVersion, string oldValues) return true; } - //1.2 to Current + //1.2 to 1.3 if (oldVersion.Equals("1.2")) { Task t = new(async () => @@ -217,6 +218,25 @@ public override bool UpdateConfigVersion(string oldVersion, string oldValues) t.Start(); return true; } + + + if(oldVersion.Equals("1.3")) + { + Task t = new(async () => + { + await Task.Delay(100); + //1.3 to 1.4 + + FileVersion = CurrentVersion; + + DataDragon.Region = "global"; + DataDragon.CDragonRaw = "https://raw.communitydragon.org"; + + JSONConfigProvider.Instance.WriteConfig(this); + Info($"Updated Component config from v1.3 to v{CurrentVersion}"); + }); + t.Start(); + } return true; } @@ -240,6 +260,7 @@ public class DataDragonConfig public string Region; public string Locale; public string CDN; + public string CDragonRaw; public string Patch; } diff --git a/LeagueBroadcast/Common/Data/Provider/DataDragon.cs b/LeagueBroadcast/Common/Data/Provider/DataDragon.cs index b384194..1599b1b 100644 --- a/LeagueBroadcast/Common/Data/Provider/DataDragon.cs +++ b/LeagueBroadcast/Common/Data/Provider/DataDragon.cs @@ -12,9 +12,35 @@ using LeagueBroadcast.Common.Data.DTO; using LeagueBroadcast.Common.Data.RIOT; using System.Threading; +using Swan.Logging; +using LeagueBroadcast.Common.Utils; +using LeagueBroadcast.ChampSelect.Data.DTO; +using LeagueBroadcast.Update.Http; +using System.Text.Json; +using LeagueBroadcast.Common.Data.Config; +using System.Collections.Concurrent; +using System.Diagnostics; namespace LeagueBroadcast.Common.Data.Provider { + public class FileLoadProgressEventArgs + { + public string FileName { get; set; } = ""; + + public string Task { get; set; } = ""; + public int Completed { get; set; } + public int Total { get; set; } + + + public FileLoadProgressEventArgs(string fileName, string task, int completed, int total) + { + FileName = fileName; + Task = task; + Completed = completed; + Total = total; + } + } + class DataDragon : ObservableObject { public static readonly string currentDir = Directory.GetCurrentDirectory(); @@ -24,30 +50,24 @@ class DataDragon : ObservableObject public static GameVersion version; - public List FullIDs; - public static EventHandler FinishLoading, StartLoading; + private static TaskCompletionSource? _downloadComplete; - public static EventHandler FileDownloadComplete; - public static int ToDownload; + private static int _toDownload, _downloaded; + private static int IncrementToDownload() => Interlocked.Increment(ref _toDownload); + private static int IncrementToDownload(int count) => Interlocked.Add(ref _toDownload, count); + private static int IncrementDownloaded() => Interlocked.Increment(ref _downloaded); + private static int IncrementDownloaded(int count) => Interlocked.Add(ref _downloaded, count); - public static void IncrementToDownload() - { - Interlocked.Increment(ref ToDownload); - } - - public static void IncrementToDownload(int val) - { - Interlocked.Add(ref ToDownload, val); - } + public static EventHandler FinishLoading, StartLoading; + public static EventHandler? FileDownloadComplete { get; set; } - private StartupViewModel _startupContext = (StartupViewModel) BroadcastController.Instance.Startup.DataContext; - private int maxTasks = 0; - private int progress = 0; + private StartupViewModel _startupContext = (StartupViewModel)BroadcastController.Instance.Startup.DataContext; public struct GameVersion { + public StringVersion localVersion; public string Version; public string Champion; public string Item; @@ -73,9 +93,9 @@ private static DataDragon GetInstance() private DataDragon() { - - Log.Info("DataDragon Provider Init"); - _startupContext.Status = "DataDragon Init"; + + Log.Info("[CDrag] CommunityDragon Provider Init"); + _startupContext.Status = "CommunityDragon Init"; version = new GameVersion { Version = ConfigController.Component.DataDragon.Patch, @@ -83,464 +103,345 @@ private DataDragon() }; - FullIDs = new List(); StartLoading?.Invoke(this, EventArgs.Empty); if (version.Version == "latest") { - Log.Info("Getting latest versions from dataDragon"); - new Task(() => { - InitLatest(); + Log.Info("[CDrag] Getting latest versions"); + + new Task(async () => + { + await GetLatestGameVersion(); + await Init(); }).Start(); } else { + Log.Info($"Using version from configuration: {version.Version}"); version.Champion = version.Version; version.Item = version.Version; version.Summoner = version.Version; new Task(() => { Init(); }).Start(); - } - } - private async void InitLatest() - { - _startupContext.Status = "Retrieving latest patch info"; - Log.Info("Retrieving latest patch info"); - dynamic riotVersion = JsonConvert.DeserializeObject(await DataDragonUtils.GetAsync($"https://ddragon.leagueoflegends.com/realms/{ConfigController.Component.DataDragon.Region}.json")); - version.CDN = riotVersion.cdn; - version.Champion = riotVersion.n.champion; - version.Item = riotVersion.n.item; - version.Summoner = riotVersion.n.summoner; - - var oldPatch = ConfigController.PickBan.frontend.patch; - ConfigController.PickBan.frontend.patch = version.Champion; - if (oldPatch != version.Champion) - { - Log.Info($"New patch {version.Champion} detected"); - ConfigController.UpdateConfigFile(ConfigController.PickBan); - } - - Init(); - } - private async void Init() - { - Log.Info($"Champion: {version.Champion}, Item: {version.Item}, CDN: {version.CDN}"); - - Champion.Champions = new List(JsonConvert.DeserializeObject(await DataDragonUtils.GetAsync($"{version.CDN}/{version.Champion}/data/{ConfigController.Component.DataDragon.Locale}/champion.json")).data.ToObject>().Values); - Log.Info($"Loaded {Champion.Champions.Count} champions"); - - SummonerSpell.SummonerSpells = new List(JsonConvert.DeserializeObject(await DataDragonUtils.GetAsync($"{version.CDN}/{version.Item}/data/{ConfigController.Component.DataDragon.Locale}/summoner.json")).data.ToObject>().Values); - Log.Info($"Loaded {SummonerSpell.SummonerSpells.Count} summoner spells"); + Log.Info($"[CDrag] Using version from configuration: {version.Version}"); - List> rawItemData = new List>(JsonConvert.DeserializeObject(await DataDragonUtils.GetAsync($"{version.CDN}/{version.Item}/data/{ConfigController.Component.DataDragon.Locale}/item.json")).data.ToObject>()); - Log.Info($"Detected {rawItemData.Count} items"); - - rawItemData.ForEach(kvPair => { - ItemData itemData = kvPair.Value; - itemData.itemID = kvPair.Key; - if (itemData.gold.total >= ConfigController.Component.DataDragon.MinimumGoldCost || itemData.specialRecipe != 0) + new Task(async () => { - ItemData.Items.Add(itemData); - FullIDs.Add(itemData.itemID); - } - }); + if (!StringVersion.TryParse(version.Version, out StringVersion? requestedPatch)) + { + "[CDrag] Could not read requested game version. Falling back to latest".Warn(); + await GetLatestGameVersion(); + } + await Init(); + }).Start(); + } + } - Log.Info($"Loaded {ItemData.Items.Count} full items"); - //Download all needed champion, item, and summoner spell data - await CheckLocalCache(); + private static async Task GetLatestGameVersion() + { + GetInstance()._startupContext.Status = "Retrieving latest patch info"; + Log.Info("[CDrag] Retrieving latest patch info"); - FinishLoading.Invoke(this, EventArgs.Empty); + string? rawCDragVersionResponse = JsonDocument.Parse(await RestRequester.GetRaw($"{ConfigController.Component.DataDragon.CDragonRaw}/latest/content-metadata.json")).RootElement.GetProperty("version").GetString(); + if (rawCDragVersionResponse is null) + { + Log.Warn($"[CDrag] Could not get latest CDragon version. Falling back to latest DDrag version"); + using JsonDocument response = JsonDocument.Parse(await RestRequester.GetRaw($"https://ddragon.leagueoflegends.com/realms/{ConfigController.Component.DataDragon.Region}.json"), new JsonDocumentOptions { AllowTrailingCommas = true, CommentHandling = JsonCommentHandling.Skip }); + rawCDragVersionResponse = response.RootElement.GetProperty("n").GetProperty("champion").ToString(); + } + StringVersion localVersion = StringVersion.Parse(rawCDragVersionResponse.Split("+")[0]); + version.localVersion = localVersion; + version.CDN = localVersion.ToString(); + version.Champion = localVersion.ToString(); + version.Item = localVersion.ToString(); + version.Summoner = localVersion.ToString(); - } + Log.Info($"[CDrag] Using live patch {version.CDN} on platform {ConfigController.Component.DataDragon.Region}"); + Log.Info($"{localVersion.ToString(2)}, {GetLatestLocalPatch().ToString(2)}"); - public Champion GetChampionById(int champID) - { - var champData = Champion.Champions.Find(c => c.key == champID); - if (champData != null) + if (StringVersion.Parse(localVersion.ToString(2)) > StringVersion.Parse(GetLatestLocalPatch().ToString(2))) { - DataDragonUtils.ExtendChampionLocal(champData, version); + Log.Info($"[CDrag] New patch {version.CDN} detected"); } - - return champData; } - public SummonerSpell GetSummonerById(int summonerID) + + private static StringVersion GetLatestLocalPatch() { - var summonerData = SummonerSpell.SummonerSpells.Find(s => s.key == summonerID); - if (summonerData != null) + string patchDir = Path.Combine(currentDir, "Cache"); + if (Directory.Exists(patchDir)) { - DataDragonUtils.ExtendSummonerLocal(summonerData, version); + $"Found cache folder".Debug(); + return Directory.GetDirectories(patchDir).Select(Path.GetFileName).Where(dir => dir!.Count(c => c == '.') == 2).Select(dir => StringVersion.Parse(dir)).Max() ?? StringVersion.Zero; } - return summonerData; + return new(0, 0, 0); } - public ItemData GetItemById(int itemID) + private static async Task Init() { - var itemData = ItemData.Items.Find(i => i.itemID == itemID); - if (itemData != null) - { - DataDragonUtils.ExtendItemLocal(itemData, version); - } - return itemData; + CDragonChampion.All = (await RestRequester.GetAsync>($"{ConfigController.Component.DataDragon.CDragonRaw}/{version.localVersion.ToString(2)}/plugins/rcp-be-lol-game-data/{ConfigController.Component.DataDragon.Region}/default/v1/champion-summary.json")).Where(c => c.ID > 0).ToHashSet(); + Log.Info($"[CDrag] Loaded {CDragonChampion.All.Count} champions"); + + SummonerSpell.All = await RestRequester.GetAsync>($"{ConfigController.Component.DataDragon.CDragonRaw}/{version.localVersion.ToString(2)}/plugins/rcp-be-lol-game-data/{ConfigController.Component.DataDragon.Region}/default/v1/summoner-spells.json"); + Log.Info($"[CDrag] Loaded {SummonerSpell.All.Count} summoner spells"); + + CDragonItem.All = await RestRequester.GetAsync>($"{ConfigController.Component.DataDragon.CDragonRaw}/{version.localVersion.ToString(2)}/plugins/rcp-be-lol-game-data/{ConfigController.Component.DataDragon.Region}/default/v1/items.json"); + Log.Info($"[CDrag] Loaded {CDragonItem.All.Count} items"); + + CDragonItem.Full = CDragonItem.All.Where(item => item.PriceTotal > ConfigController.Component.DataDragon.MinimumGoldCost).ToHashSet(); + Log.Info($"[CDrag] Loaded {CDragonItem.Full.Count} full items"); + + bool result = await VerifyLocalCache(version.localVersion); + + FinishLoading?.Invoke(null, EventArgs.Empty); } - public async Task CheckLocalCache() + private static async Task VerifyLocalCache(StringVersion currentPatch) { - _startupContext.Status = "Checking Cache"; - Log.Info("Checking Local Cache"); + GetInstance()._startupContext.Status = "Verifying local cache"; - int total = 0; - FileDownloadComplete += (s, e) => { - Interlocked.Increment(ref total); - }; - - var patch = version.Champion; - var dlTasks = new List(); + _downloadComplete = new TaskCompletionSource(); - string path = currentDir; - string cache = path + "/Cache"; - string patchFolder = cache + "/" + ((string)patch); + currentPatch = StringVersion.Parse($"{currentPatch.ToString(2)}.1"); + string cache = currentDir + "/Cache"; + string patchFolder = cache + $"/{currentPatch}"; string champ = patchFolder + "/champion"; string item = patchFolder + "/item"; string spell = patchFolder + "/spell"; - maxTasks = Champion.Champions.Count * 4 + ItemData.Items.Count + SummonerSpell.SummonerSpells.Count; + _ = Directory.CreateDirectory(cache); + _ = Directory.CreateDirectory(patchFolder); + _ = Directory.CreateDirectory(champ); + _ = Directory.CreateDirectory(item); + _ = Directory.CreateDirectory(spell); - if (!Directory.Exists(cache)) + GetInstance()._startupContext.Status = "Yeeting old caches onto Dominion"; + Directory.EnumerateDirectories(cache).Where(d => StringVersion.TryParse(d.Split("/")[^1].Split("\\")[^1], out StringVersion? dirVersion) && dirVersion < currentPatch).ToList().ForEach(dir => { - Directory.CreateDirectory(cache); - } + new DirectoryInfo(dir).Empty(); + Directory.Delete(dir); + Log.Info($"Removed Patch Cache {dir}"); + }); - if (!Directory.Exists(patchFolder)) - { - //Delete old patch folders - Log.Info("Current Patch cache not detected, removing old Patch data"); - _startupContext.Status = "Yeeting old patch onto Dominion map"; + ConcurrentBag failedDownloads = new(); + int toCache = IncrementToDownload(CDragonChampion.All.Count * 4 + CDragonItem.All.Count + SummonerSpell.All.Count); - List dirs = new List(Directory.EnumerateDirectories(cache).Where(d => !d.Contains("TeamIcons"))); + Stopwatch s = new(); + s.Start(); - dirs.ForEach(dir => { - new DirectoryInfo(dir).Empty(); - Directory.Delete(dir); - Log.Info($"Removed Patch Cache {dir}"); - }); + await DownloadMissingChampionCache(champ, failedDownloads); + DownloadMissingItemCache(item, failedDownloads); + DownloadMissingSummonerSpellCache(spell, failedDownloads); - Directory.CreateDirectory(patchFolder); - } - else - { - Log.Info($"Cache {patchFolder} exists already"); - if(Directory.GetFiles(champ).Length < Champion.Champions.Count * 4) - { - DownloadMissingChampionCache(champ); - } - if(Directory.GetFiles(item).Length < ItemData.Items.Count) - { - DownloadMissingItemCache(item); - } - if(Directory.GetFiles(spell).Length < SummonerSpell.SummonerSpells.Count) - { - DownloadMissingSummonerSpellCache(spell); - } - return true; - } - - if (!Directory.Exists(champ)) - { - Directory.CreateDirectory(champ); - } - - if (!Directory.Exists(item)) - { - Directory.CreateDirectory(item); - } + s.Stop(); + $"[CDrag] Verified local cache in {s.ElapsedMilliseconds}ms".Debug(); - if (!Directory.Exists(spell)) + if (_toDownload == toCache) { - Directory.CreateDirectory(spell); + Log.Info("Local cache up to date"); + return true; } - Log.Info("Starting download process. This could take a while"); - - DownloadFullItemCache(item); - DownloadFullChampionCache(champ); - DownloadFullSummonerSpellCache(spell); - - _startupContext.UpdateDDragonProgress(0, dlTasks.Count); - - Log.Info($"Downloading {dlTasks.Count} assets from datadragon!"); - + Log.Info($"[CDrag] Downloaded {_toDownload} assets from CommunityDragon"); - _startupContext.Status = $"Downloaded 0/{ToDownload} Images"; - - while (total < ToDownload) + if (_downloaded == _toDownload) { - _startupContext.UpdateDDragonProgress(total, dlTasks.Count); - _startupContext.Status = $"Downloaded {total}/{ToDownload} Images"; + _ = _downloadComplete.TrySetResult(failedDownloads.IsEmpty); } - Log.Info("DataDragon download finished"); - _startupContext.Status = "DataDragon cache downloaded"; - return true; + bool updateResult = await _downloadComplete.Task; + Log.Info($"[CDrag] Downloaded missing assets"); + return updateResult; } - private void DownloadFullChampionCache(string destUri) + private static async Task DownloadMissingChampionCache(string location, ConcurrentBag failedDownloads) { - Log.Info($"Downloading Champion Cache of {Champion.Champions.Count * 4} images"); - Champion.Champions.ForEach(findChampion => { - DownloadChampionToCache(destUri, findChampion); - }); - } + Log.Info("[CDrag] Verifying Champion Assets"); - private void DownloadMissingChampionCache(string destUri) - { - Champion.Champions.ForEach(champ => + foreach (CDragonChampion champ in CDragonChampion.All) { - _startupContext.Status = $"Checking {champ} cache"; - DataDragonUtils.ExtendChampion(champ, version); - if (!File.Exists($"{destUri}/{champ.id}_loading.png")) - { - DataDragonUtils.DownloadFile(champ.loadingImg, $"{destUri}/{champ.id}_loading.png"); - IncrementToDownload(); - } - else - { - _startupContext.UpdateDDragonProgress(progress++, maxTasks); - } + //Check if all files for the champ exist + bool loadingExists = File.Exists($"{location}/{champ.Alias}_loading.png"); + bool splashExists = File.Exists($"{location}/{champ.Alias}_splash.png"); + bool centeredSplashExists = File.Exists($"{location}/{champ.Alias}_centered_splash.png"); + bool squareExists = File.Exists($"{location}/{champ.Alias}_square.png"); - if (!File.Exists($"{destUri}/{champ.id}_splash.png")) - { - DataDragonUtils.DownloadFile(champ.splashImg, $"{destUri}/{champ.id}_splash.png"); - IncrementToDownload(); - } - else + if (loadingExists && splashExists && centeredSplashExists && squareExists) { - _startupContext.UpdateDDragonProgress(progress++, maxTasks); + ExtendChampionLocal(champ, version.localVersion); + FileDownloadComplete?.Invoke(null, new FileLoadProgressEventArgs(champ.Alias, "Verified", IncrementDownloaded(4), _toDownload)); + continue; } - if (!File.Exists($"{destUri}/{champ.id}_centered_splash.png")) + //Get champ data if not all files exist + await ExtendChampion(champ, version.localVersion.ToString(2)); + + //Get missing files + if (!loadingExists) { - DataDragonUtils.DownloadFile(champ.splashCenteredImg, $"{destUri}/{champ.id}_centered_splash.png"); - IncrementToDownload(); + DownloadAsset(champ.LoadingImg!, $"{location}/{champ.Alias}_loading.png", $"{champ.Alias}_loading.png", failedDownloads); } - else + + if (!splashExists) { - _startupContext.UpdateDDragonProgress(progress++, maxTasks); + DownloadAsset(champ.SplashImg!, $"{location}/{champ.Alias}_splash.png", $"{champ.Alias}_splash.png", failedDownloads); } - if (!File.Exists($"{destUri}/{champ.id}_square.png")) + if (!centeredSplashExists) { - DataDragonUtils.DownloadFile(champ.squareImg, $"{destUri}/{champ.id}_square.png"); - IncrementToDownload(); + DownloadAsset(champ.SplashCenteredImg!, $"{location}/{champ.Alias}_centered_splash.png", $"{champ.Alias}_centered_splash.png", failedDownloads); } - else + + if (!squareExists) { - _startupContext.UpdateDDragonProgress(progress++, maxTasks); + DownloadAsset(champ.SquareImg!, $"{location}/{champ.Alias}_square.png", $"{champ.Alias}_square.png", failedDownloads); } - }); - } - private void DownloadChampionToCache(string destUri, Champion champ) - { - DataDragonUtils.ExtendChampion(champ, version); - DataDragonUtils.DownloadFile(champ.loadingImg, $"{destUri}/{champ.id}_loading.png"); - DataDragonUtils.DownloadFile(champ.splashImg, $"{destUri}/{champ.id}_splash.png"); - DataDragonUtils.DownloadFile(champ.splashCenteredImg, $"{destUri}/{champ.id}_centered_splash.png"); - DataDragonUtils.DownloadFile(champ.squareImg, $"{destUri}/{champ.id}_square.png"); - IncrementToDownload(4); - } + ExtendChampionLocal(champ, version.localVersion); - private void DownloadFullItemCache(string destUri) - { - Log.Info($"Downloading Item Cache of {ItemData.Items.Count} images"); - ItemData.Items.ForEach(findItem => - { - DownloadItemToCache(destUri, findItem); - }); - } + FileDownloadComplete?.Invoke(null, new FileLoadProgressEventArgs(champ.Alias, "Verified", IncrementDownloaded(4), _toDownload)); + }; - private void DownloadMissingItemCache(string destUri) - { - ItemData.Items.ForEach(item => { - _startupContext.Status = $"Checking {item} cache"; - if (!File.Exists($"{destUri}/{item.itemID}.png")) - { - DownloadItemToCache(destUri, item); - } - else - { - _startupContext.UpdateDDragonProgress(progress++, maxTasks); - } - }); + Log.Info($"[CDrag] Verified all champion assets"); } - private void DownloadItemToCache(string destUri, ItemData item) - { - DataDragonUtils.ExtendItem(item, version); - DataDragonUtils.DownloadFile(item.sprite, $"{destUri}/{item.itemID}.png"); - IncrementToDownload(); - } - - private void DownloadFullSummonerSpellCache(string destUri) - { - Log.Info($"Downloading Summoner Spell Cache of {SummonerSpell.SummonerSpells.Count} images"); - SummonerSpell.SummonerSpells.ForEach(findSummoner => { - DownloadSummonerSpellToCache(destUri, findSummoner); - }); - } - private void DownloadMissingSummonerSpellCache(string destUri) + private static void DownloadMissingItemCache(string location, ConcurrentBag failedDownloads) { - SummonerSpell.SummonerSpells.ForEach(spell => + Log.Info("[CDrag] Verifying Item Assets"); + + string stringVersion = version.localVersion.ToString(2); + foreach (CDragonItem item in CDragonItem.All) { - _startupContext.Status = $"Checking {spell} cache"; - if (!File.Exists($"{destUri}/{spell.id}.png")) - { - DownloadSummonerSpellToCache(destUri, spell); - } - else + if (!File.Exists($"{location}/{item.ID}.png")) { - _startupContext.UpdateDDragonProgress(progress++, maxTasks); + DownloadAsset($"{ConfigController.Component.DataDragon.CDragonRaw}/{stringVersion}/plugins/rcp-be-lol-game-data/{ConfigController.Component.DataDragon.Region}/default/assets/items/icons2d/{item.IconPath.Split("/")[^1].ToLower()}", $"{location}/{item.ID}.png", $"{item.ID}.png", failedDownloads); } - }); - } - - private void DownloadSummonerSpellToCache(string destUri, SummonerSpell spell) - { - DataDragonUtils.ExtendSummoner(spell, version); - DataDragonUtils.DownloadFile(spell.icon, $"{destUri}/{spell.id}.png"); - IncrementToDownload(); - } - } - - static class DataDragonUtils - { - public static void Empty(this DirectoryInfo directory) - { - foreach (FileInfo file in directory.EnumerateFiles()) - { - file.Delete(); - } - - foreach (DirectoryInfo subDirectory in directory.EnumerateDirectories()) - { - subDirectory.Delete(true); - } + ExtendItemLocal(item, version.localVersion); + FileDownloadComplete?.Invoke(null, new FileLoadProgressEventArgs(item.Name, "Verified", IncrementDownloaded(), _toDownload)); + }; } - public static string CombinePaths(params string[] paths) + private static void DownloadMissingSummonerSpellCache(string location, ConcurrentBag failedDownloads) { - if (paths == null) + Log.Info("[CDrag] Verifying Summoner Spell Assets"); + string stringVersion = version.localVersion.ToString(2); + foreach (SummonerSpell spell in SummonerSpell.All) { - throw new ArgumentNullException("paths"); - } - string final = ""; - paths.ToList().ForEach(part => final += $"/{part}"); - return final; + if (!File.Exists($"{location}/{spell.ID}.png")) + { + DownloadAsset($"{ConfigController.Component.DataDragon.CDragonRaw}/{stringVersion}/plugins/rcp-be-lol-game-data/{ConfigController.Component.DataDragon.Region}/default/data/spells/icons2d/{spell.IconPath.Split("/")[^1].ToLower()}", $"{location}/{spell.ID}.png", $"{spell.ID}.png", failedDownloads); + } + ExtendSummonerLocal(spell, version.localVersion); + FileDownloadComplete?.Invoke(null, new FileLoadProgressEventArgs(spell.Name, "Verified", IncrementDownloaded(), _toDownload)); + }; } - public static void DownloadFile(string uri, string path) + private static void DownloadAsset(string remote, string local, string fileName, ConcurrentBag failedDownloads) { - using var client = new WebClient(); - client.Headers.Add("accept", "*/*"); - - client.DownloadDataCompleted += (sender, eventArgs) => + _ = IncrementToDownload(); + $"Downloading {fileName} from {remote}".Debug(); + Task t = Task.Run(async () => { - try + System.Net.HttpStatusCode res = await FileDownloader.DownloadAsync(remote, local); + if (res == System.Net.HttpStatusCode.OK) { - byte[] fileData = eventArgs.Result; - using FileStream fileStream = new FileStream(path, FileMode.Create); - fileStream.Write(fileData, 0, fileData.Length); - client.Dispose(); - Log.Verbose($"{uri} downloaded"); - FileDownloadComplete.Invoke(null, EventArgs.Empty); - } catch(Exception e) + $"{fileName} downloaded".Debug(); + } + else { - Log.Warn($"Could not download {uri}\n{eventArgs.Error.Message}"); - FileDownloadComplete.Invoke(null, EventArgs.Empty); + failedDownloads.Add(new string[] { remote, fileName }); + $"Download {fileName} from {remote} to {local} failed: {res}".Debug(); } + FileDownloadComplete?.Invoke(null, new FileLoadProgressEventArgs(fileName, "Downloaded", IncrementDownloaded(), _toDownload)); - }; - try - { - Log.Verbose($"Downloading {uri}"); - client.DownloadDataAsync(new Uri(uri)); - } catch(Exception e) - { - Log.Warn($"Download error: {e.Message}"); - } + if (_downloaded >= _toDownload) + { + _ = _downloadComplete!.TrySetResult(true); + } + }); } - public static async Task GetAsync(string uri) + #region ObjectExtension + public static async Task ExtendChampion(CDragonChampion champion, string version) { - HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); - request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; - request.Method = "GET"; - request.Timeout = 2000; - try - { - Log.Verbose($"Downloading {uri}"); - using HttpWebResponse response = (HttpWebResponse) await request.GetResponseAsync(); - - if (response.StatusCode == HttpStatusCode.NotFound) - { - Log.Warn($"Could not download {uri}: {response.StatusCode}"); - return ""; - } - using Stream stream = response.GetResponseStream(); - using StreamReader reader = new StreamReader(stream); - Log.Verbose($"{uri} downloaded"); - return await reader.ReadToEndAsync(); - } catch(Exception e) - { - Log.Warn($"Could not download {uri}: {e.Message}"); - return ""; - } - + using JsonDocument response = JsonDocument.Parse(await RestRequester.GetRaw($"{ConfigController.Component.DataDragon.CDragonRaw}/{version}/plugins/rcp-be-lol-game-data/{ConfigController.Component.DataDragon.Region}/default/v1/champions/{champion.ID}.json"), new JsonDocumentOptions { AllowTrailingCommas = true, CommentHandling = JsonCommentHandling.Skip }); + JsonElement root = response.RootElement; + JsonElement defaultSkin = root.GetProperty("skins").EnumerateArray().Single(skin => $"{skin.GetProperty("id").GetInt32()}" == $"{champion.ID}000"); + + champion.SplashImg = $"{ConfigController.Component.DataDragon.CDragonRaw}/{version}/plugins/rcp-be-lol-game-data/{ConfigController.Component.DataDragon.Region}/default/v1/champion-splashes/uncentered/{champion.ID}/{(defaultSkin.GetProperty("uncenteredSplashPath").GetString() ?? "").Split("/")[^1]}"; + champion.SplashCenteredImg = $"{ConfigController.Component.DataDragon.CDragonRaw}/{version}/plugins/rcp-be-lol-game-data/{ConfigController.Component.DataDragon.Region}/default/v1/champion-splashes/{champion.ID}/{(defaultSkin.GetProperty("splashPath").GetString() ?? "").Split("/")[^1]}"; + champion.SquareImg = $"{ConfigController.Component.DataDragon.CDragonRaw}/{version}/plugins/rcp-be-lol-game-data/{ConfigController.Component.DataDragon.Region}/default/v1/champion-icons/{(root.GetProperty("squarePortraitPath").GetString() ?? "").Split("/")[^1]}"; + champion.LoadingImg = $"{ConfigController.Component.DataDragon.CDragonRaw}/{version}/plugins/rcp-be-lol-game-data/{ConfigController.Component.DataDragon.Region}/default/assets/characters/{champion.Alias.ToLower()}/skins/base/{(defaultSkin.GetProperty("loadScreenPath").GetString() ?? "").Split("/")[^1].ToLower()}"; } - public static void ExtendChampion(Champion champion, GameVersion version) + public static void ExtendChampionLocal(CDragonChampion champion, StringVersion version) { - champion.splashImg = $"{version.CDN}/img/champion/splash/{champion.id}_0.jpg"; - champion.splashCenteredImg = $"https://cdn.communitydragon.org/{version.Version}/champion/{champion.id}/splash-art/centered"; - champion.squareImg = $"{version.GetVersionCDN()}/img/champion/{ champion.id}.png"; - champion.loadingImg = $"{version.CDN}/img/champion/loading/{champion.id}_0.jpg"; + string championPath = $"cache/{version.ToString(2)}.1/champion"; + champion.SplashImg = $"{championPath}/{champion.Alias}_splash.jpg"; + champion.SplashCenteredImg = $"{championPath}/{champion.Alias}_centered_splash.png"; + champion.SquareImg = $"{championPath}/{champion.Alias}_square.png"; + champion.LoadingImg = $"{championPath}/{champion.Alias}_loading.png"; } - public static void ExtendChampionLocal(Champion champion, GameVersion version) + public static void ExtendSummonerLocal(SummonerSpell summoner, StringVersion version) { - string championPath = CombinePaths("cache", version.Champion, "champion"); - champion.splashImg = $"{championPath}/{ champion.id}_splash.jpg"; - champion.splashCenteredImg = $"{championPath}/{champion.id}_centered_splash.png"; - champion.squareImg = $"{championPath}/{ champion.id}_square.png"; - champion.loadingImg = $"{championPath}/{ champion.id}_loading.png"; + summoner.IconPath = Path.Combine("cache", $"{version.ToString(2)}.1", "spell", $"{summoner.Name}.png"); } - public static void ExtendSummoner(SummonerSpell summoner, GameVersion version) + public static void ExtendItemLocal(CDragonItem item, StringVersion version) { - summoner.icon = $"{version.GetVersionCDN()}/img/spell/{summoner.id}.png"; + item.IconPath = Path.Combine("cache", $"{version.ToString(2)}.1", "item", item.ID + ".png"); } - public static void ExtendSummonerLocal(SummonerSpell summoner, GameVersion version) + #endregion + + + public Champion GetChampionById(int champID) { - summoner.icon = CombinePaths("cache", version.Item, "spell", $"{summoner.id}.png"); + var champData = CDragonChampion.All.SingleOrDefault(c => c.ID == champID); + if (champData is null) + return new Champion(); + return new Champion() + { + id = champData.Alias, + key = champData.ID, + name = champData.Name, + loadingImg = champData.LoadingImg, + splashCenteredImg = champData.SplashCenteredImg, + splashImg = champData.SplashImg, + squareImg = champData.SquareImg + }; } - public static void ExtendItem(ItemData item, GameVersion version) + public SummonerSpell GetSummonerById(int summonerID) { - item.sprite = $"{version.GetVersionCDN()}/img/item/{item.itemID}.png"; + return SummonerSpell.All.SingleOrDefault(s => s.ID == summonerID); } - public static void ExtendItemLocal(ItemData item, GameVersion version) + public ItemData GetItemById(int itemID) { - item.sprite = CombinePaths("cache", version.Item, "item", item.itemID + ".png"); + var itemData = CDragonItem.All.SingleOrDefault(i => i.ID == itemID); + + return new ItemData(itemData.ID) + { + itemID = itemData.ID, + name = itemData.Name, + specialRecipe = itemData.SpecialRecipe, + sprite = itemData.IconPath, + gold = new ItemCost() + { + sell = 0, + total = itemData.PriceTotal + } + }; } } } \ No newline at end of file diff --git a/LeagueBroadcast/Ingame/Data/Config/FarsightConfig.cs b/LeagueBroadcast/Ingame/Data/Config/FarsightConfig.cs index 6ddeb02..7a9b56e 100644 --- a/LeagueBroadcast/Ingame/Data/Config/FarsightConfig.cs +++ b/LeagueBroadcast/Ingame/Data/Config/FarsightConfig.cs @@ -3,8 +3,10 @@ using LeagueBroadcast.Common.Data.Config; using LeagueBroadcast.Common.Data.Provider; using LeagueBroadcast.Farsight; +using LeagueBroadcast.Update.Http; using Newtonsoft.Json; using System; +using System.Net.Http; using System.Threading.Tasks; namespace LeagueBroadcast.Ingame.Data.Config @@ -43,39 +45,20 @@ public async Task CreateDefault(FarsightConfig cfg = null, strin var offsetUri = $"{ConfigController.Component.App.OffsetRepository}{ConfigController.Component.App.OffsetPrefix}{remoteVersion}.json"; Log.Info($"Fetching new offsets from {offsetUri}"); - string res = await DataDragonUtils.GetAsync(offsetUri); - Log.Info($"Received updated offsets"); - - if(res == "") + try { - //Check if an older patch exists. If so, use that one - Log.Info("New Offsets not yet online. Checking to make sure if new patch should already be used"); - var versionComponents = DataDragon.version.Champion.Split('.'); - int patch = Int32.Parse(versionComponents[1]); - if (cfg != null && - patch - 1 == Int32.Parse(cfg.GameVersion.Substring(3, 2).Replace(".", ""))) - { - Log.Info("Night before patch. Using old offsets"); - return cfg; - } - - //We do not have a local version available. Incase this has been started for the first time on a tuesday before a patch, get old offsets - //This is in theory a moot point since this means LeagueBroadcast will stop working in a couple of hours, but its better than not working - if(DateTime.Now.Hour < 24 && DateTime.Now.DayOfWeek <= DayOfWeek.Wednesday && patch >= 0 && DateTime.Now.DayOfWeek >= DayOfWeek.Tuesday) - { - Log.Warn("Local offsets not found and future patch detected. Using previous patch data"); - return CreateDefault(null, $"{versionComponents[0]}.{patch - 1}.{versionComponents[2]}").Result; - } + string res = await RestRequester.GetRaw(offsetUri); + Log.Info($"Received updated offsets"); - //Its not before a patch and offsets could not be found. This means that its probably Wednesday after a patch - //Disable memory component of LeagueBroadcast. It's better than crashing :) + var remote = JsonConvert.DeserializeObject(res); + Log.Info($"Offsets found. Updating values for game version {remote.GameVersion}"); + return remote; + } catch(HttpRequestException) + { Log.Warn("Could not fetch updated Offsets! Are they not uploaded yet? Either provide your own, change the source, or wait for an update"); FarsightController.ShouldRun = false; return new FarsightConfig(); } - var remote = JsonConvert.DeserializeObject(res); - Log.Info($"Offsets found. Updating values for game version {remote.GameVersion}"); - return remote; } public override string GETJson() @@ -85,20 +68,20 @@ public override string GETJson() public override void RevertToDefault() { - var def = CreateDefault().Result; - this.FileVersion = "1.0"; - this.GameVersion = def.GameVersion; - this.GameOffsets = def.GameOffsets; - this.ObjectOffsets = def.ObjectOffsets; + var def = CreateDefault().Result; + this.FileVersion = "1.0"; + this.GameVersion = def.GameVersion; + this.GameOffsets = def.GameOffsets; + this.ObjectOffsets = def.ObjectOffsets; } private void UpdateGameVersion(FarsightConfig oldVersion) { - var def = CreateDefault(oldVersion).Result; - this.FileVersion = "1.0"; - this.GameVersion = def.GameVersion; - this.GameOffsets = def.GameOffsets; - this.ObjectOffsets = def.ObjectOffsets; + var def = CreateDefault(oldVersion).Result; + this.FileVersion = "1.0"; + this.GameVersion = def.GameVersion; + this.GameOffsets = def.GameOffsets; + this.ObjectOffsets = def.ObjectOffsets; } public override bool UpdateConfigVersion(string oldVersion, string oldValues) diff --git a/LeagueBroadcast/Ingame/State/State.cs b/LeagueBroadcast/Ingame/State/State.cs index 43d6d11..0550c12 100644 --- a/LeagueBroadcast/Ingame/State/State.cs +++ b/LeagueBroadcast/Ingame/State/State.cs @@ -1,6 +1,7 @@ using LeagueBroadcast.Common; using LeagueBroadcast.Common.Controllers; using LeagueBroadcast.Common.Data.Provider; +using LeagueBroadcast.Common.Data.RIOT; using LeagueBroadcast.Farsight; using LeagueBroadcast.Farsight.Object; using LeagueBroadcast.Ingame.Data.LBH; @@ -143,7 +144,7 @@ public void UpdateTeams(List PlayerData, Snapshot gameSnap) //New item Events var newItems = newP.items.ToList().Where(i => !p.items.ToList().Any(l => i.itemID == l.itemID)); - newItems = newItems.Where(i => DataDragon.Instance.FullIDs.Contains(i.itemID)); + newItems = newItems.Where(i => CDragonItem.Full.Select(item => item.ID).Contains(i.itemID)); newItems.ToList().ForEach(newI => controller.OnItemCompleted(new ItemCompletedEventArgs(p.id, DataDragon.Instance.GetItemById(newI.itemID)))); diff --git a/LeagueBroadcast/LeagueBroadcast.csproj b/LeagueBroadcast/LeagueBroadcast.csproj index 85e38bc..b0221c3 100644 --- a/LeagueBroadcast/LeagueBroadcast.csproj +++ b/LeagueBroadcast/LeagueBroadcast.csproj @@ -2,7 +2,7 @@ WinExe - netcoreapp3.1 + net6.0-windows latest true Assets\Icons\BlueEssence.ico @@ -15,11 +15,19 @@ https://github.com/floh22/LeagueBroadcast Git BE_icon.png - 1.4.106.0 - 1.4.106.21326 + 1.5.24.0 + 1.5.24.0 OnBuildSuccess + + embedded + + + + embedded + + @@ -79,9 +87,9 @@ - + - + diff --git a/LeagueBroadcast/MVVM/ViewModel/StartupViewModel.cs b/LeagueBroadcast/MVVM/ViewModel/StartupViewModel.cs index 4e776b2..cc22003 100644 --- a/LeagueBroadcast/MVVM/ViewModel/StartupViewModel.cs +++ b/LeagueBroadcast/MVVM/ViewModel/StartupViewModel.cs @@ -1,10 +1,9 @@ using LeagueBroadcast.Common.Controllers; +using LeagueBroadcast.Common.Data.Provider; using LeagueBroadcast.MVVM.Core; -using LeagueBroadcast.MVVM.View; using LeagueBroadcast.OperatingSystem; using System; -using System.Collections.Generic; -using System.Text; +using System.Windows; namespace LeagueBroadcast.MVVM.ViewModel { @@ -48,7 +47,7 @@ public string UpdateText public StartupViewModel() { - + DataDragon.FileDownloadComplete += (s, e) => UpdateCacheDownloadProgress(e); } public void UpdateLoadProgress(LoadStatus loadStatus, int progress = 100) @@ -59,12 +58,26 @@ public void UpdateLoadProgress(LoadStatus loadStatus, int progress = 100) LoadingBarWidth = (int)(LoadProgress / 100 * 380); } - public void UpdateDDragonProgress(double completed, double total) + public void UpdateCacheDownloadProgress(FileLoadProgressEventArgs e) { - LoadProgress = (int)LoadStatus.DDragonStart + (completed / total) * 0.75; - LoadingBarWidth = (int)((LoadProgress / 100) * 380); + LoadProgress = (double)LoadStatus.DDragonStart + ((double)e.Completed / (double)e.Total * ((double)LoadStatus.DDragonStart.Next() - (double)LoadStatus.DDragonStart)); + try + { + Application.Current.Dispatcher.Invoke(() => + { + if (Application.Current.MainWindow is null) + return; + LoadingBarWidth = (int)(LoadProgress / 100 * Application.Current.MainWindow.ActualWidth); + }); + } + catch + { + //Cant update. Ignored + } + Status = $"{e.Task} {e.Completed}/{e.Total} Assets: {e.FileName}"; } - } + +} public enum LoadStatus { diff --git a/Overlays/ingame/package-lock.json b/Overlays/ingame/package-lock.json index 201fced..d3944d2 100644 --- a/Overlays/ingame/package-lock.json +++ b/Overlays/ingame/package-lock.json @@ -26,33 +26,33 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.15.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -83,9 +83,9 @@ } }, "node_modules/@nodelib/fs.walk": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", - "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", @@ -96,33 +96,33 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, "node_modules/@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", "dev": true }, "node_modules/@types/webfontloader": { - "version": "1.6.32", - "resolved": "https://registry.npmjs.org/@types/webfontloader/-/webfontloader-1.6.32.tgz", - "integrity": "sha512-l83V/2iHvBTIlKUM1+UlabS/Jd65HVfKmqS+zPhwDlgldPtd5ujPDt0Y1es19xLWcN8NC3wwSTd71Qxbst+Kpw==" + "version": "1.6.33", + "resolved": "https://registry.npmjs.org/@types/webfontloader/-/webfontloader-1.6.33.tgz", + "integrity": "sha512-2oOYQp0UBo/+NFsxdlF9ZwS1rq1q/wGnLsZMN7X+/xArRZoLPQhOGecesaRYJ2uhHyJ53TgitDORu2IV47FhHw==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.27.0.tgz", - "integrity": "sha512-DsLqxeUfLVNp3AO7PC3JyaddmEHTtI9qTSAs+RB6ja27QvIM0TA8Cizn1qcS6vOu+WDLFJzkwkgweiyFhssDdQ==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", + "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "4.27.0", - "@typescript-eslint/scope-manager": "4.27.0", + "@typescript-eslint/experimental-utils": "4.33.0", + "@typescript-eslint/scope-manager": "4.33.0", "debug": "^4.3.1", "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.21", + "ignore": "^5.1.8", "regexpp": "^3.1.0", "semver": "^7.3.5", "tsutils": "^3.21.0" @@ -145,15 +145,15 @@ } }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.27.0.tgz", - "integrity": "sha512-n5NlbnmzT2MXlyT+Y0Jf0gsmAQzCnQSWXKy4RGSXVStjDvS5we9IWbh7qRVKdGcxT0WYlgcCYUK/HRg7xFhvjQ==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", + "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.27.0", - "@typescript-eslint/types": "4.27.0", - "@typescript-eslint/typescript-estree": "4.27.0", + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -169,14 +169,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.27.0.tgz", - "integrity": "sha512-XpbxL+M+gClmJcJ5kHnUpBGmlGdgNvy6cehgR6ufyxkEJMGP25tZKCaKyC0W/JVpuhU3VU1RBn7SYUPKSMqQvQ==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", + "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "4.27.0", - "@typescript-eslint/types": "4.27.0", - "@typescript-eslint/typescript-estree": "4.27.0", + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", "debug": "^4.3.1" }, "engines": { @@ -196,13 +196,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.27.0.tgz", - "integrity": "sha512-DY73jK6SEH6UDdzc6maF19AHQJBFVRf6fgAXHPXCGEmpqD4vYgPEzqpFz1lf/daSbOcMpPPj9tyXXDPW2XReAw==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", + "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.27.0", - "@typescript-eslint/visitor-keys": "4.27.0" + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0" }, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" @@ -213,9 +213,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.27.0.tgz", - "integrity": "sha512-I4ps3SCPFCKclRcvnsVA/7sWzh7naaM/b4pBO2hVxnM3wrU51Lveybdw5WoIktU/V4KfXrTt94V9b065b/0+wA==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", "dev": true, "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" @@ -226,13 +226,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.27.0.tgz", - "integrity": "sha512-KH03GUsUj41sRLLEy2JHstnezgpS5VNhrJouRdmh6yNdQ+yl8w5LrSwBkExM+jWwCJa7Ct2c8yl8NdtNRyQO6g==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", + "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.27.0", - "@typescript-eslint/visitor-keys": "4.27.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", "debug": "^4.3.1", "globby": "^11.0.3", "is-glob": "^4.0.1", @@ -253,12 +253,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.27.0.tgz", - "integrity": "sha512-es0GRYNZp0ieckZ938cEANfEhsfHrzuLrePukLKtY3/KPXcq1Xd555Mno9/GOgXhKzn0QfkDLVgqWO3dGY80bg==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.27.0", + "@typescript-eslint/types": "4.33.0", "eslint-visitor-keys": "^2.0.0" }, "engines": { @@ -269,15 +269,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", @@ -291,9 +282,9 @@ } }, "node_modules/acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -431,16 +422,16 @@ } }, "node_modules/browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", "dev": true, "dependencies": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" }, "bin": { "browserslist": "cli.js" @@ -453,6 +444,12 @@ "url": "https://opencollective.com/browserslist" } }, + "node_modules/browserslist/node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -512,9 +509,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001239", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001239.tgz", - "integrity": "sha512-cyBkXJDMeI4wthy8xJ2FvDU6+0dtcZSJW3voUF8+e9f1bBeuvyZfc3PNbkOETyhbR+dGCPzn9E7MA3iwzusOhQ==", + "version": "1.0.30001292", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001292.tgz", + "integrity": "sha512-jnT4Tq0Q4ma+6nncYQVe7d73kmDmE9C3OGTx3MvW7lBM/eY1S1DZTMBON7dqV481RhNiS5OxD7k9JQvmDOTirw==", "dev": true, "funding": { "type": "opencollective", @@ -577,13 +574,13 @@ } }, "node_modules/color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", - "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", "dev": true, "dependencies": { - "color-convert": "^1.9.1", - "color-string": "^1.5.4" + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, "node_modules/color-convert": { @@ -602,21 +599,15 @@ "dev": true }, "node_modules/color-string": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", - "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", + "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", "dev": true, "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, - "node_modules/colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -867,9 +858,9 @@ "dev": true }, "node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -884,9 +875,9 @@ } }, "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "node_modules/define-properties": { @@ -976,9 +967,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.3.752", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.752.tgz", - "integrity": "sha512-2Tg+7jSl3oPxgsBsWKh5H83QazTkmWG/cnNwJplmyZc7KcN61+I10oUgaXSVk/NwfvN3BdkKDR4FYuRBQQ2v0A==", + "version": "1.4.27", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.27.tgz", + "integrity": "sha512-uZ95szi3zUbzRDx1zx/xnsCG+2xgZyy57pDOeaeO4r8zx5Dqe8Jv1ti8cunvBwJHVI5LzPuw8umKwZb3WKYxSQ==", "dev": true }, "node_modules/emoji-regex": { @@ -1006,22 +997,26 @@ } }, "node_modules/es-abstract": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", - "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.3", - "is-string": "^1.0.6", - "object-inspect": "^1.10.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", @@ -1155,7 +1150,7 @@ "eslint": ">=5" } }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "node_modules/eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", @@ -1164,15 +1159,6 @@ "node": ">=10" } }, - "node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/eslint/node_modules/eslint-utils": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", @@ -1185,6 +1171,24 @@ "node": ">=6" } }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/eslint/node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -1242,6 +1246,15 @@ "node": ">=6.0.0" } }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -1268,9 +1281,9 @@ } }, "node_modules/esquery/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { "node": ">=4.0" @@ -1289,9 +1302,9 @@ } }, "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { "node": ">=4.0" @@ -1341,17 +1354,16 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" }, "engines": { "node": ">=8" @@ -1370,9 +1382,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -1469,10 +1481,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -1536,15 +1564,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby/node_modules/ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1587,6 +1606,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hex-color-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", @@ -1618,14 +1652,19 @@ } }, "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, "engines": { "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, "node_modules/import-fresh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", @@ -1695,9 +1734,9 @@ } }, "node_modules/inquirer/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { "node": ">=8" @@ -1719,9 +1758,9 @@ } }, "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -1762,12 +1801,12 @@ } }, "node_modules/inquirer/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" @@ -1785,6 +1824,20 @@ "node": ">=8" } }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/is-absolute-url": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", @@ -1801,21 +1854,25 @@ "dev": true }, "node_modules/is-bigint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", - "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-boolean-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", - "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -1825,9 +1882,9 @@ } }, "node_modules/is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", "dev": true, "engines": { "node": ">= 0.4" @@ -1851,10 +1908,13 @@ } }, "node_modules/is-date-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", - "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -1890,9 +1950,9 @@ } }, "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { "is-extglob": "^2.1.1" @@ -1902,9 +1962,9 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, "engines": { "node": ">= 0.4" @@ -1923,10 +1983,13 @@ } }, "node_modules/is-number-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", - "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -1944,13 +2007,13 @@ } }, "node_modules/is-regex": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", - "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -1965,11 +2028,23 @@ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-string": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", - "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -1992,6 +2067,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2048,6 +2135,22 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "dependencies": { + "lie": "3.1.1" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -2175,9 +2278,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "1.1.73", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", - "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", "dev": true }, "node_modules/normalize-url": { @@ -2199,9 +2302,9 @@ } }, "node_modules/object-inspect": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", - "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2235,14 +2338,14 @@ } }, "node_modules/object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", + "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" + "es-abstract": "^1.19.1" }, "engines": { "node": ">= 0.8" @@ -2252,14 +2355,14 @@ } }, "node_modules/object.values": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", - "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.2" + "es-abstract": "^1.19.1" }, "engines": { "node": ">= 0.4" @@ -2422,11 +2525,12 @@ } }, "node_modules/phaser3-rex-plugins": { - "version": "1.1.53", - "resolved": "https://registry.npmjs.org/phaser3-rex-plugins/-/phaser3-rex-plugins-1.1.53.tgz", - "integrity": "sha512-uZZ8KkmHZmCsFAcYKLHfywgz/p/CE70qPwrKaHxyxnTocFbBvaoP3qwppq9P6fIrOAwh5mREtDO5UXtkt1TqWg==", + "version": "1.1.64", + "resolved": "https://registry.npmjs.org/phaser3-rex-plugins/-/phaser3-rex-plugins-1.1.64.tgz", + "integrity": "sha512-wQA9VUXsBjipo/8IZzHlDpRkdMTGEZBzyrtl8XFj1oQdVz/PvGMlt+dYa+RhIHXqLB/YgdDDef5m0ZXT3BtpkQ==", "dependencies": { "eventemitter3": "^3.1.2", + "localforage": "^1.10.0", "lokijs": "^1.5.12", "papaparse": "^5.3.1", "webfontloader": "^1.6.28" @@ -2447,6 +2551,12 @@ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" }, + "node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "node_modules/picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -2460,14 +2570,13 @@ } }, "node_modules/postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", "dev": true, "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "picocolors": "^0.2.1", + "source-map": "^0.6.1" }, "engines": { "node": ">=6.0.0" @@ -2952,9 +3061,9 @@ "dev": true }, "node_modules/postcss-selector-parser": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", - "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz", + "integrity": "sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -2999,23 +3108,11 @@ } }, "node_modules/postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "node_modules/postcss/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -3241,10 +3338,24 @@ "node": ">=0.10.0" } }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", "dev": true }, "node_modules/simple-swizzle": { @@ -3316,109 +3427,109 @@ "dev": true }, "node_modules/ste-core": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/ste-core/-/ste-core-2.1.7.tgz", - "integrity": "sha512-WKONzH+i8NOZ2MKdjrBgz8Wi3B6609EVd7eVsk9Ow1oN/Yp7q6+ZkRvmZjbZ12kTMZpQ19+Sbd8m0ro1QR/6PA==", + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/ste-core/-/ste-core-2.1.14.tgz", + "integrity": "sha512-CLGwNzApXX/ZHwZDYtJOCuvaVQFftK9/5i8bY3OIHu7KpAwnqerHoT0WDvdWITpwXoc3R+Nxi7F09Jf6VbZswA==", "engines": { "node": ">=4.2.4" } }, "node_modules/ste-events": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/ste-events/-/ste-events-2.1.7.tgz", - "integrity": "sha512-1ClWHp23MTa66GoJzExrRfAbQgSNeLHr9iXAxa5Y71p1Q23r81Rjx16qNB6xmJoUAb2uXscxq3L+0P9rbW6nXQ==", + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/ste-events/-/ste-events-2.1.14.tgz", + "integrity": "sha512-gLncKvQk28VyFfnLcK/5MbYDAZKjdgYdz3w0pDSDp6iLgrYdg7/rlt45OfNmk24S6Dwj/Swetp9lTSSxTHsLZw==", "dependencies": { - "ste-core": "^2.1.7" + "ste-core": "^2.1.14" }, "engines": { "node": ">=4.2.4" } }, "node_modules/ste-promise-events": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/ste-promise-events/-/ste-promise-events-2.1.7.tgz", - "integrity": "sha512-QocGOwMm9vVb114wl1BZ/N6oJLRgrP1vevTX598zJFDnHSG/YOKBJnkL+5/j13HUWUCC4G9RZBV8i/+/F1LyDg==", + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/ste-promise-events/-/ste-promise-events-2.1.14.tgz", + "integrity": "sha512-dTPOHZuhMOOaLv1CBQhdFz2h8ZiS2Nyq2cU6BVzqaNQy6g/xzVMT3RvyZQSHyGcCYb00/a/rRQIWB9hKqEqLrA==", "dependencies": { - "ste-core": "^2.1.7" + "ste-core": "^2.1.14" }, "engines": { "node": ">=4.2.4" } }, "node_modules/ste-promise-signals": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/ste-promise-signals/-/ste-promise-signals-2.1.7.tgz", - "integrity": "sha512-FcT4bqFbZsdixhUUF5EFq+wo6H1PQNbGS49TWCK3GW2RVGD/q1XvDxA7eecXLvUo3XOfsYw5DB6+mbHe7S5Sbg==", + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/ste-promise-signals/-/ste-promise-signals-2.1.14.tgz", + "integrity": "sha512-0D7nvkc46/BSdXR5iIKJME3sijQXqftHkXO4plaNlhV0KRk0UQKTc5klTo7ZaH9tG6fAGc0FEdpMgbNUWe6Fmg==", "dependencies": { - "ste-core": "^2.1.7" + "ste-core": "^2.1.14" }, "engines": { "node": ">=4.2.4" } }, "node_modules/ste-promise-simple-events": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/ste-promise-simple-events/-/ste-promise-simple-events-2.1.7.tgz", - "integrity": "sha512-VyFozy7v2qPApsDbqI/IdAQAdYcvLoI/nDALgTe3IJm/766eW3mY0xI9c6MiqSOAbabnBn2Dji3xqP+tDM2r+Q==", + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/ste-promise-simple-events/-/ste-promise-simple-events-2.1.14.tgz", + "integrity": "sha512-WVdVFZ7KOaFFzv+s7i1jbgM4ez7JSK1hK+PcSIf1LDb70rRRk5VVgQftF/0EUJGBF/NWr18Sc7WTej7zBTMYPw==", "dependencies": { - "ste-core": "^2.1.7" + "ste-core": "^2.1.14" }, "engines": { "node": ">=4.2.4" } }, "node_modules/ste-signals": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/ste-signals/-/ste-signals-2.1.7.tgz", - "integrity": "sha512-uslaMR5pZcETiEv4/o79XbtnYBuV9quma2PPpEtvnBtbqUhVi9uRXLwoDzWcgJ3HPHxjofFCKhUj0c/qpl52DQ==", + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/ste-signals/-/ste-signals-2.1.14.tgz", + "integrity": "sha512-4t+6kXuRrrX8f8Ip2qT/QdKqS0qt1XGjspMTtotjUb2WYE4WJucMcRbvKUssATJ64RjLm6H3owPB2Prlrz4Pgw==", "dependencies": { - "ste-core": "^2.1.7" + "ste-core": "^2.1.14" }, "engines": { "node": ">=4.2.4" } }, "node_modules/ste-simple-events": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/ste-simple-events/-/ste-simple-events-2.1.7.tgz", - "integrity": "sha512-EjqheM37U4xuaOVI7l1LOxOEbFIrrYYL4oB7TFIGQkTkGaZ4h3RkjRZ+ROKwkpmPWS8LauNx7tiwsFi7FN9aRw==", + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/ste-simple-events/-/ste-simple-events-2.1.14.tgz", + "integrity": "sha512-UDctgMWsUwkce+UqE2/HUxDpGNBbk0ww05l+OFDqU8S+jJUZYQ1rvYAmF5sBowJdd9tV4u+Zdrmp+EbshqaN5g==", "dependencies": { - "ste-core": "^2.1.7" + "ste-core": "^2.1.14" }, "engines": { "node": ">=4.2.4" } }, "node_modules/string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" @@ -3475,17 +3586,17 @@ } }, "node_modules/strongly-typed-events": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/strongly-typed-events/-/strongly-typed-events-2.1.7.tgz", - "integrity": "sha512-3ezbxXBtTFZgnwNvtA74zvRUMCU2kDKci2mFrbcvek1uLrxYdPcD/eqJHd62nxMNjVBIfdMFYsO1pIvAiBER5w==", + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/strongly-typed-events/-/strongly-typed-events-2.1.14.tgz", + "integrity": "sha512-1ReJOWVi73eD2HzLMjr5tG7KWnJggh10iw0pPu/O91ek3H9SYauTaZwo8yN3yTKPz1Zg7nwmiNNF1xkSiRs5rg==", "dependencies": { - "ste-core": "^2.1.7", - "ste-events": "^2.1.7", - "ste-promise-events": "^2.1.7", - "ste-promise-signals": "^2.1.7", - "ste-promise-simple-events": "^2.1.7", - "ste-signals": "^2.1.7", - "ste-simple-events": "^2.1.7" + "ste-core": "^2.1.14", + "ste-events": "^2.1.14", + "ste-promise-events": "^2.1.14", + "ste-promise-signals": "^2.1.14", + "ste-promise-simple-events": "^2.1.14", + "ste-signals": "^2.1.14", + "ste-simple-events": "^2.1.14" }, "engines": { "node": ">=4.2.4" @@ -3535,6 +3646,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", "dev": true, "dependencies": { "chalk": "^2.4.1", @@ -3687,9 +3799,9 @@ } }, "node_modules/typescript": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", - "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", + "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -3860,27 +3972,27 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", "dev": true, "requires": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.16.0" } }, "@babel/helper-validator-identifier": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", - "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", "dev": true }, "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.15.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } @@ -3902,9 +4014,9 @@ "dev": true }, "@nodelib/fs.walk": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz", - "integrity": "sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "requires": { "@nodelib/fs.scandir": "2.1.5", @@ -3912,88 +4024,88 @@ } }, "@types/json-schema": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", - "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, "@types/q": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", - "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", "dev": true }, "@types/webfontloader": { - "version": "1.6.32", - "resolved": "https://registry.npmjs.org/@types/webfontloader/-/webfontloader-1.6.32.tgz", - "integrity": "sha512-l83V/2iHvBTIlKUM1+UlabS/Jd65HVfKmqS+zPhwDlgldPtd5ujPDt0Y1es19xLWcN8NC3wwSTd71Qxbst+Kpw==" + "version": "1.6.33", + "resolved": "https://registry.npmjs.org/@types/webfontloader/-/webfontloader-1.6.33.tgz", + "integrity": "sha512-2oOYQp0UBo/+NFsxdlF9ZwS1rq1q/wGnLsZMN7X+/xArRZoLPQhOGecesaRYJ2uhHyJ53TgitDORu2IV47FhHw==" }, "@typescript-eslint/eslint-plugin": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.27.0.tgz", - "integrity": "sha512-DsLqxeUfLVNp3AO7PC3JyaddmEHTtI9qTSAs+RB6ja27QvIM0TA8Cizn1qcS6vOu+WDLFJzkwkgweiyFhssDdQ==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", + "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.27.0", - "@typescript-eslint/scope-manager": "4.27.0", + "@typescript-eslint/experimental-utils": "4.33.0", + "@typescript-eslint/scope-manager": "4.33.0", "debug": "^4.3.1", "functional-red-black-tree": "^1.0.1", - "lodash": "^4.17.21", + "ignore": "^5.1.8", "regexpp": "^3.1.0", "semver": "^7.3.5", "tsutils": "^3.21.0" } }, "@typescript-eslint/experimental-utils": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.27.0.tgz", - "integrity": "sha512-n5NlbnmzT2MXlyT+Y0Jf0gsmAQzCnQSWXKy4RGSXVStjDvS5we9IWbh7qRVKdGcxT0WYlgcCYUK/HRg7xFhvjQ==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", + "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", "dev": true, "requires": { "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.27.0", - "@typescript-eslint/types": "4.27.0", - "@typescript-eslint/typescript-estree": "4.27.0", + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, "@typescript-eslint/parser": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.27.0.tgz", - "integrity": "sha512-XpbxL+M+gClmJcJ5kHnUpBGmlGdgNvy6cehgR6ufyxkEJMGP25tZKCaKyC0W/JVpuhU3VU1RBn7SYUPKSMqQvQ==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", + "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.27.0", - "@typescript-eslint/types": "4.27.0", - "@typescript-eslint/typescript-estree": "4.27.0", + "@typescript-eslint/scope-manager": "4.33.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/typescript-estree": "4.33.0", "debug": "^4.3.1" } }, "@typescript-eslint/scope-manager": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.27.0.tgz", - "integrity": "sha512-DY73jK6SEH6UDdzc6maF19AHQJBFVRf6fgAXHPXCGEmpqD4vYgPEzqpFz1lf/daSbOcMpPPj9tyXXDPW2XReAw==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", + "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", "dev": true, "requires": { - "@typescript-eslint/types": "4.27.0", - "@typescript-eslint/visitor-keys": "4.27.0" + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0" } }, "@typescript-eslint/types": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.27.0.tgz", - "integrity": "sha512-I4ps3SCPFCKclRcvnsVA/7sWzh7naaM/b4pBO2hVxnM3wrU51Lveybdw5WoIktU/V4KfXrTt94V9b065b/0+wA==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", + "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.27.0.tgz", - "integrity": "sha512-KH03GUsUj41sRLLEy2JHstnezgpS5VNhrJouRdmh6yNdQ+yl8w5LrSwBkExM+jWwCJa7Ct2c8yl8NdtNRyQO6g==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", + "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", "dev": true, "requires": { - "@typescript-eslint/types": "4.27.0", - "@typescript-eslint/visitor-keys": "4.27.0", + "@typescript-eslint/types": "4.33.0", + "@typescript-eslint/visitor-keys": "4.33.0", "debug": "^4.3.1", "globby": "^11.0.3", "is-glob": "^4.0.1", @@ -4002,21 +4114,13 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.27.0.tgz", - "integrity": "sha512-es0GRYNZp0ieckZ938cEANfEhsfHrzuLrePukLKtY3/KPXcq1Xd555Mno9/GOgXhKzn0QfkDLVgqWO3dGY80bg==", + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", + "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", "dev": true, "requires": { - "@typescript-eslint/types": "4.27.0", + "@typescript-eslint/types": "4.33.0", "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } } }, "acorn": { @@ -4026,9 +4130,9 @@ "dev": true }, "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "requires": {} }, @@ -4135,16 +4239,24 @@ } }, "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + }, + "dependencies": { + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + } } }, "call-bind": { @@ -4194,9 +4306,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001239", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001239.tgz", - "integrity": "sha512-cyBkXJDMeI4wthy8xJ2FvDU6+0dtcZSJW3voUF8+e9f1bBeuvyZfc3PNbkOETyhbR+dGCPzn9E7MA3iwzusOhQ==", + "version": "1.0.30001292", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001292.tgz", + "integrity": "sha512-jnT4Tq0Q4ma+6nncYQVe7d73kmDmE9C3OGTx3MvW7lBM/eY1S1DZTMBON7dqV481RhNiS5OxD7k9JQvmDOTirw==", "dev": true }, "chalk": { @@ -4243,13 +4355,13 @@ } }, "color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", - "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", "dev": true, "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.4" + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, "color-convert": { @@ -4268,21 +4380,15 @@ "dev": true }, "color-string": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz", - "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", + "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", "dev": true, "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -4483,18 +4589,18 @@ } }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" } }, "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "define-properties": { @@ -4568,9 +4674,9 @@ } }, "electron-to-chromium": { - "version": "1.3.752", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.752.tgz", - "integrity": "sha512-2Tg+7jSl3oPxgsBsWKh5H83QazTkmWG/cnNwJplmyZc7KcN61+I10oUgaXSVk/NwfvN3BdkKDR4FYuRBQQ2v0A==", + "version": "1.4.27", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.27.tgz", + "integrity": "sha512-uZ95szi3zUbzRDx1zx/xnsCG+2xgZyy57pDOeaeO4r8zx5Dqe8Jv1ti8cunvBwJHVI5LzPuw8umKwZb3WKYxSQ==", "dev": true }, "emoji-regex": { @@ -4595,22 +4701,26 @@ } }, "es-abstract": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", - "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", "dev": true, "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-symbols": "^1.0.2", - "is-callable": "^1.2.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.3", - "is-string": "^1.0.6", - "object-inspect": "^1.10.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", "object-keys": "^1.1.1", "object.assign": "^4.1.2", "string.prototype.trimend": "^1.0.4", @@ -4695,6 +4805,18 @@ "eslint-visitor-keys": "^1.1.0" } }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -4742,20 +4864,12 @@ "dev": true, "requires": { "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } } }, "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true }, "espree": { @@ -4767,6 +4881,14 @@ "acorn": "^7.1.1", "acorn-jsx": "^5.2.0", "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } } }, "esprima": { @@ -4785,9 +4907,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -4802,9 +4924,9 @@ }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -4844,17 +4966,16 @@ "dev": true }, "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" } }, "fast-json-stable-stringify": { @@ -4870,9 +4991,9 @@ "dev": true }, "fastq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", - "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -4951,10 +5072,20 @@ "has-symbols": "^1.0.1" } }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -4995,14 +5126,6 @@ "ignore": "^5.1.4", "merge2": "^1.3.0", "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - } } }, "has": { @@ -5032,6 +5155,15 @@ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "hex-color-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", @@ -5060,11 +5192,16 @@ } }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, "import-fresh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", @@ -5125,9 +5262,9 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { @@ -5140,9 +5277,9 @@ } }, "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -5171,12 +5308,12 @@ "dev": true }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } }, "supports-color": { @@ -5190,6 +5327,17 @@ } } }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, "is-absolute-url": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", @@ -5203,24 +5351,28 @@ "dev": true }, "is-bigint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", - "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", - "dev": true + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } }, "is-boolean-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", - "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "requires": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, "is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", "dev": true }, "is-color-stop": { @@ -5238,10 +5390,13 @@ } }, "is-date-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", - "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", - "dev": true + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-directory": { "version": "0.3.1", @@ -5262,18 +5417,18 @@ "dev": true }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" } }, "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true }, "is-number": { @@ -5283,10 +5438,13 @@ "dev": true }, "is-number-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", - "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", - "dev": true + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-obj": { "version": "2.0.0", @@ -5295,13 +5453,13 @@ "dev": true }, "is-regex": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", - "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" + "has-tostringtag": "^1.0.0" } }, "is-resolvable": { @@ -5310,12 +5468,21 @@ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, - "is-string": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", - "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", "dev": true }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-symbol": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", @@ -5325,6 +5492,15 @@ "has-symbols": "^1.0.2" } }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -5375,6 +5551,22 @@ "type-check": "~0.3.2" } }, + "lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", + "requires": { + "immediate": "~3.0.5" + } + }, + "localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "requires": { + "lie": "3.1.1" + } + }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -5484,9 +5676,9 @@ "dev": true }, "node-releases": { - "version": "1.1.73", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", - "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", "dev": true }, "normalize-url": { @@ -5505,9 +5697,9 @@ } }, "object-inspect": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", - "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", "dev": true }, "object-keys": { @@ -5529,25 +5721,25 @@ } }, "object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", + "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" + "es-abstract": "^1.19.1" } }, "object.values": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", - "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.18.2" + "es-abstract": "^1.19.1" } }, "once": { @@ -5676,11 +5868,12 @@ } }, "phaser3-rex-plugins": { - "version": "1.1.53", - "resolved": "https://registry.npmjs.org/phaser3-rex-plugins/-/phaser3-rex-plugins-1.1.53.tgz", - "integrity": "sha512-uZZ8KkmHZmCsFAcYKLHfywgz/p/CE70qPwrKaHxyxnTocFbBvaoP3qwppq9P6fIrOAwh5mREtDO5UXtkt1TqWg==", + "version": "1.1.64", + "resolved": "https://registry.npmjs.org/phaser3-rex-plugins/-/phaser3-rex-plugins-1.1.64.tgz", + "integrity": "sha512-wQA9VUXsBjipo/8IZzHlDpRkdMTGEZBzyrtl8XFj1oQdVz/PvGMlt+dYa+RhIHXqLB/YgdDDef5m0ZXT3BtpkQ==", "requires": { "eventemitter3": "^3.1.2", + "localforage": "^1.10.0", "lokijs": "^1.5.12", "papaparse": "^5.3.1", "webfontloader": "^1.6.28" @@ -5703,6 +5896,12 @@ "phaser": "*" } }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, "picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -5710,25 +5909,13 @@ "dev": true }, "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "picocolors": "^0.2.1", + "source-map": "^0.6.1" } }, "postcss-calc": { @@ -6164,9 +6351,9 @@ } }, "postcss-selector-parser": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", - "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz", + "integrity": "sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -6204,9 +6391,9 @@ } }, "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, "prelude-ls": { @@ -6353,10 +6540,21 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", "dev": true }, "simple-swizzle": { @@ -6420,82 +6618,82 @@ "dev": true }, "ste-core": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/ste-core/-/ste-core-2.1.7.tgz", - "integrity": "sha512-WKONzH+i8NOZ2MKdjrBgz8Wi3B6609EVd7eVsk9Ow1oN/Yp7q6+ZkRvmZjbZ12kTMZpQ19+Sbd8m0ro1QR/6PA==" + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/ste-core/-/ste-core-2.1.14.tgz", + "integrity": "sha512-CLGwNzApXX/ZHwZDYtJOCuvaVQFftK9/5i8bY3OIHu7KpAwnqerHoT0WDvdWITpwXoc3R+Nxi7F09Jf6VbZswA==" }, "ste-events": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/ste-events/-/ste-events-2.1.7.tgz", - "integrity": "sha512-1ClWHp23MTa66GoJzExrRfAbQgSNeLHr9iXAxa5Y71p1Q23r81Rjx16qNB6xmJoUAb2uXscxq3L+0P9rbW6nXQ==", + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/ste-events/-/ste-events-2.1.14.tgz", + "integrity": "sha512-gLncKvQk28VyFfnLcK/5MbYDAZKjdgYdz3w0pDSDp6iLgrYdg7/rlt45OfNmk24S6Dwj/Swetp9lTSSxTHsLZw==", "requires": { - "ste-core": "^2.1.7" + "ste-core": "^2.1.14" } }, "ste-promise-events": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/ste-promise-events/-/ste-promise-events-2.1.7.tgz", - "integrity": "sha512-QocGOwMm9vVb114wl1BZ/N6oJLRgrP1vevTX598zJFDnHSG/YOKBJnkL+5/j13HUWUCC4G9RZBV8i/+/F1LyDg==", + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/ste-promise-events/-/ste-promise-events-2.1.14.tgz", + "integrity": "sha512-dTPOHZuhMOOaLv1CBQhdFz2h8ZiS2Nyq2cU6BVzqaNQy6g/xzVMT3RvyZQSHyGcCYb00/a/rRQIWB9hKqEqLrA==", "requires": { - "ste-core": "^2.1.7" + "ste-core": "^2.1.14" } }, "ste-promise-signals": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/ste-promise-signals/-/ste-promise-signals-2.1.7.tgz", - "integrity": "sha512-FcT4bqFbZsdixhUUF5EFq+wo6H1PQNbGS49TWCK3GW2RVGD/q1XvDxA7eecXLvUo3XOfsYw5DB6+mbHe7S5Sbg==", + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/ste-promise-signals/-/ste-promise-signals-2.1.14.tgz", + "integrity": "sha512-0D7nvkc46/BSdXR5iIKJME3sijQXqftHkXO4plaNlhV0KRk0UQKTc5klTo7ZaH9tG6fAGc0FEdpMgbNUWe6Fmg==", "requires": { - "ste-core": "^2.1.7" + "ste-core": "^2.1.14" } }, "ste-promise-simple-events": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/ste-promise-simple-events/-/ste-promise-simple-events-2.1.7.tgz", - "integrity": "sha512-VyFozy7v2qPApsDbqI/IdAQAdYcvLoI/nDALgTe3IJm/766eW3mY0xI9c6MiqSOAbabnBn2Dji3xqP+tDM2r+Q==", + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/ste-promise-simple-events/-/ste-promise-simple-events-2.1.14.tgz", + "integrity": "sha512-WVdVFZ7KOaFFzv+s7i1jbgM4ez7JSK1hK+PcSIf1LDb70rRRk5VVgQftF/0EUJGBF/NWr18Sc7WTej7zBTMYPw==", "requires": { - "ste-core": "^2.1.7" + "ste-core": "^2.1.14" } }, "ste-signals": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/ste-signals/-/ste-signals-2.1.7.tgz", - "integrity": "sha512-uslaMR5pZcETiEv4/o79XbtnYBuV9quma2PPpEtvnBtbqUhVi9uRXLwoDzWcgJ3HPHxjofFCKhUj0c/qpl52DQ==", + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/ste-signals/-/ste-signals-2.1.14.tgz", + "integrity": "sha512-4t+6kXuRrrX8f8Ip2qT/QdKqS0qt1XGjspMTtotjUb2WYE4WJucMcRbvKUssATJ64RjLm6H3owPB2Prlrz4Pgw==", "requires": { - "ste-core": "^2.1.7" + "ste-core": "^2.1.14" } }, "ste-simple-events": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/ste-simple-events/-/ste-simple-events-2.1.7.tgz", - "integrity": "sha512-EjqheM37U4xuaOVI7l1LOxOEbFIrrYYL4oB7TFIGQkTkGaZ4h3RkjRZ+ROKwkpmPWS8LauNx7tiwsFi7FN9aRw==", + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/ste-simple-events/-/ste-simple-events-2.1.14.tgz", + "integrity": "sha512-UDctgMWsUwkce+UqE2/HUxDpGNBbk0ww05l+OFDqU8S+jJUZYQ1rvYAmF5sBowJdd9tV4u+Zdrmp+EbshqaN5g==", "requires": { - "ste-core": "^2.1.7" + "ste-core": "^2.1.14" } }, "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } } } @@ -6536,17 +6734,17 @@ "dev": true }, "strongly-typed-events": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/strongly-typed-events/-/strongly-typed-events-2.1.7.tgz", - "integrity": "sha512-3ezbxXBtTFZgnwNvtA74zvRUMCU2kDKci2mFrbcvek1uLrxYdPcD/eqJHd62nxMNjVBIfdMFYsO1pIvAiBER5w==", + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/strongly-typed-events/-/strongly-typed-events-2.1.14.tgz", + "integrity": "sha512-1ReJOWVi73eD2HzLMjr5tG7KWnJggh10iw0pPu/O91ek3H9SYauTaZwo8yN3yTKPz1Zg7nwmiNNF1xkSiRs5rg==", "requires": { - "ste-core": "^2.1.7", - "ste-events": "^2.1.7", - "ste-promise-events": "^2.1.7", - "ste-promise-signals": "^2.1.7", - "ste-promise-simple-events": "^2.1.7", - "ste-signals": "^2.1.7", - "ste-simple-events": "^2.1.7" + "ste-core": "^2.1.14", + "ste-events": "^2.1.14", + "ste-promise-events": "^2.1.14", + "ste-promise-signals": "^2.1.14", + "ste-promise-simple-events": "^2.1.14", + "ste-signals": "^2.1.14", + "ste-simple-events": "^2.1.14" } }, "stylehacks": { @@ -6707,9 +6905,9 @@ "dev": true }, "typescript": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", - "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", + "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", "dev": true }, "unbox-primitive": { diff --git a/Overlays/ingame/src/variables.ts b/Overlays/ingame/src/variables.ts index 4ce925f..df6f6bb 100644 --- a/Overlays/ingame/src/variables.ts +++ b/Overlays/ingame/src/variables.ts @@ -4,7 +4,7 @@ export default class variables { static backendUrl: string = "localhost"; static backendPort: string = '9001'; - static backendWsLoc: string = 'api' + static backendWsLoc: string = 'ingame' static backendFileLoc: string = 'cache'; static useSSL: boolean = false;