From 56af787e57ef328ce6def8e1bb3e92ce3dc92477 Mon Sep 17 00:00:00 2001 From: sam Date: Mon, 28 Oct 2024 14:57:05 +0100 Subject: [PATCH 01/57] fix: don't specify duplicate key_roles in guild repository, let PK API service read strings as numbers --- Catalogger.Backend/Database/DatabaseMigrator.cs | 6 ++++-- Catalogger.Backend/Database/Repositories/GuildRepository.cs | 2 +- Catalogger.Backend/Services/PluralkitApiService.cs | 2 ++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Catalogger.Backend/Database/DatabaseMigrator.cs b/Catalogger.Backend/Database/DatabaseMigrator.cs index 76a0dbc..98cc00a 100644 --- a/Catalogger.Backend/Database/DatabaseMigrator.cs +++ b/Catalogger.Backend/Database/DatabaseMigrator.cs @@ -65,9 +65,11 @@ public class DatabaseMigrator(ILogger logger, IClock clock, DatabaseConnection c await tx.CommitAsync(); } - private async Task ExecuteMigration(DbTransaction tx, string migrationName) + private async Task ExecuteMigration(DbTransaction tx, string migrationName, bool up = true) { - var query = await GetResource($"{RootPath}.Migrations.{migrationName}.up.sql"); + var query = await GetResource( + $"{RootPath}.Migrations.{migrationName}.{(up ? "up" : "down")}.sql" + ); // Run the migration await conn.ExecuteAsync(query, transaction: tx); diff --git a/Catalogger.Backend/Database/Repositories/GuildRepository.cs b/Catalogger.Backend/Database/Repositories/GuildRepository.cs index de62b1d..74a4462 100644 --- a/Catalogger.Backend/Database/Repositories/GuildRepository.cs +++ b/Catalogger.Backend/Database/Repositories/GuildRepository.cs @@ -51,7 +51,7 @@ public class GuildRepository(ILogger logger, DatabaseConnection conn) public async Task AddGuildAsync(ulong id) => await conn.ExecuteAsync( """ - insert into guilds (id, key_roles, banned_systems, key_roles, channels) + insert into guilds (id, key_roles, banned_systems, channels) values (@Id, array[]::bigint[], array[]::text[], array[]::bigint[], @Channels) on conflict do nothing """, diff --git a/Catalogger.Backend/Services/PluralkitApiService.cs b/Catalogger.Backend/Services/PluralkitApiService.cs index 5dd0f0b..113374d 100644 --- a/Catalogger.Backend/Services/PluralkitApiService.cs +++ b/Catalogger.Backend/Services/PluralkitApiService.cs @@ -15,6 +15,7 @@ using System.Net; using System.Text.Json; +using System.Text.Json.Serialization; using System.Threading.RateLimiting; using Humanizer; using NodaTime; @@ -34,6 +35,7 @@ public class PluralkitApiService(ILogger logger) private readonly JsonSerializerOptions _jsonOptions = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower, + NumberHandling = JsonNumberHandling.AllowReadingFromString, }.ConfigureForNodaTime( new NodaJsonSettings { From b56a71e10517ce788359b411dcc7880b60892d37 Mon Sep 17 00:00:00 2001 From: sam Date: Mon, 28 Oct 2024 16:25:42 +0100 Subject: [PATCH 02/57] feat: watchlist commands --- .../Bot/Commands/WatchlistCommands.cs | 133 ++++++++++++++++++ .../Members/GuildMemberAddResponder.cs | 2 +- .../Repositories/WatchlistRepository.cs | 33 ++++- Catalogger.Backend/Program.cs | 1 + 4 files changed, 167 insertions(+), 2 deletions(-) create mode 100644 Catalogger.Backend/Bot/Commands/WatchlistCommands.cs diff --git a/Catalogger.Backend/Bot/Commands/WatchlistCommands.cs b/Catalogger.Backend/Bot/Commands/WatchlistCommands.cs new file mode 100644 index 0000000..dc05f96 --- /dev/null +++ b/Catalogger.Backend/Bot/Commands/WatchlistCommands.cs @@ -0,0 +1,133 @@ +// Copyright (C) 2021-present sam (starshines.gay) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +using System.ComponentModel; +using Catalogger.Backend.Cache; +using Catalogger.Backend.Cache.InMemoryCache; +using Catalogger.Backend.Database.Models; +using Catalogger.Backend.Database.Repositories; +using Catalogger.Backend.Extensions; +using Remora.Commands.Attributes; +using Remora.Commands.Groups; +using Remora.Discord.API; +using Remora.Discord.API.Abstractions.Objects; +using Remora.Discord.API.Objects; +using Remora.Discord.Commands.Attributes; +using Remora.Discord.Commands.Feedback.Services; +using Remora.Discord.Commands.Services; +using Remora.Discord.Pagination.Extensions; +using Remora.Rest.Core; +using IResult = Remora.Results.IResult; + +namespace Catalogger.Backend.Bot.Commands; + +[Group("watchlist")] +[Description("Commands for managing the server's watchlist.")] +[DiscordDefaultMemberPermissions(DiscordPermission.ManageGuild)] +public class WatchlistCommands( + WatchlistRepository watchlistRepository, + GuildCache guildCache, + IMemberCache memberCache, + UserCache userCache, + ContextInjectionService contextInjectionService, + FeedbackService feedbackService +) : CommandGroup +{ + [Command("add")] + [Description("Add a user to the watchlist.")] + public async Task AddAsync(IUser user, string reason) + { + var (userId, guildId) = contextInjectionService.GetUserAndGuild(); + + var entry = await watchlistRepository.CreateEntryAsync(guildId, user.ID, userId, reason); + return await feedbackService.ReplyAsync( + $"Added {user.PrettyFormat()} to this server's watchlist, with the following reason:\n>>> {entry.Reason}" + ); + } + + [Command("remove")] + [Description("Remove a user from the watchlist.")] + public async Task RemoveAsync(IUser user) + { + var (userId, guildId) = contextInjectionService.GetUserAndGuild(); + if (!await watchlistRepository.RemoveEntryAsync(guildId, user.ID)) + { + return await feedbackService.ReplyAsync( + $"{user.PrettyFormat()} is not on the watchlist, so you can't remove them from it." + ); + } + + return await feedbackService.ReplyAsync( + $"Removed {user.PrettyFormat()} from the watchlist!" + ); + } + + [Command("show")] + [Description("Show the current watchlist.")] + public async Task ShowAsync() + { + var (userId, guildId) = contextInjectionService.GetUserAndGuild(); + if (!guildCache.TryGet(guildId, out var guild)) + throw new CataloggerError("Guild was not cached"); + + var watchlist = await watchlistRepository.GetGuildWatchlistAsync(guildId); + if (watchlist.Count == 0) + return await feedbackService.ReplyAsync( + "There are no entries on the watchlist right now." + ); + + var fields = new List(); + foreach (var entry in watchlist) + fields.Add(await GenerateWatchlistEntryFieldAsync(guildId, entry)); + + return await feedbackService.SendContextualPaginatedMessageAsync( + userId, + DiscordUtils.PaginateFields( + fields, + title: $"Watchlist for {guild.Name} ({fields.Count})", + fieldsPerPage: 5 + ) + ); + } + + private async Task GenerateWatchlistEntryFieldAsync( + Snowflake guildId, + Watchlist entry + ) + { + var user = await TryGetUserAsync(guildId, DiscordSnowflake.New(entry.UserId)); + var fieldName = user != null ? user.Tag() : $"unknown user {entry.UserId}"; + + var moderator = await TryGetUserAsync(guildId, DiscordSnowflake.New(entry.ModeratorId)); + var modName = + moderator != null + ? moderator.PrettyFormat() + : $"*(unknown user {entry.ModeratorId})* <@{entry.ModeratorId}>"; + + return new EmbedField( + Name: fieldName, + Value: $""" + **Moderator:** {modName} + **Added:** + **Reason:** + >>> {entry.Reason} + """ + ); + } + + private async Task TryGetUserAsync(Snowflake guildId, Snowflake userId) => + (await memberCache.TryGetAsync(guildId, userId))?.User.Value + ?? await userCache.GetUserAsync(userId); +} diff --git a/Catalogger.Backend/Bot/Responders/Members/GuildMemberAddResponder.cs b/Catalogger.Backend/Bot/Responders/Members/GuildMemberAddResponder.cs index 5ea725a..855affd 100644 --- a/Catalogger.Backend/Bot/Responders/Members/GuildMemberAddResponder.cs +++ b/Catalogger.Backend/Bot/Responders/Members/GuildMemberAddResponder.cs @@ -156,7 +156,7 @@ public class GuildMemberAddResponder( ); } - var watchlist = await watchlistRepository.GetWatchlistEntryAsync(member.GuildID, user.ID); + var watchlist = await watchlistRepository.GetEntryAsync(member.GuildID, user.ID); if (watchlist != null) { var moderator = await userCache.GetUserAsync( diff --git a/Catalogger.Backend/Database/Repositories/WatchlistRepository.cs b/Catalogger.Backend/Database/Repositories/WatchlistRepository.cs index 8177f78..ce6bacd 100644 --- a/Catalogger.Backend/Database/Repositories/WatchlistRepository.cs +++ b/Catalogger.Backend/Database/Repositories/WatchlistRepository.cs @@ -33,12 +33,43 @@ public class WatchlistRepository(ILogger logger, DatabaseConnection conn) ) ).ToList(); - public async Task GetWatchlistEntryAsync(Snowflake guildId, Snowflake userId) => + public async Task GetEntryAsync(Snowflake guildId, Snowflake userId) => await conn.QueryFirstOrDefaultAsync( "select * from watchlists where guild_id = @GuildId and user_id = @UserId", new { GuildId = guildId.Value, UserId = userId.Value } ); + public async Task CreateEntryAsync( + Snowflake guildId, + Snowflake userId, + Snowflake moderatorId, + string reason + ) => + await conn.QueryFirstAsync( + """ + insert into watchlists (guild_id, user_id, added_at, moderator_id, reason) + values (@GuildId, @UserId, now(), @ModeratorId, @Reason) + on conflict (guild_id, user_id) do update + set moderator_id = @ModeratorId, added_at = now(), reason = @Reason + returning * + """, + new + { + GuildId = guildId.Value, + UserId = userId.Value, + ModeratorId = moderatorId.Value, + Reason = reason, + } + ); + + public async Task RemoveEntryAsync(Snowflake guildId, Snowflake userId) => + ( + await conn.ExecuteAsync( + "delete from watchlists where guild_id = @GuildId and user_id = @UserId", + new { GuildId = guildId.Value, UserId = userId.Value } + ) + ) != 0; + public void Dispose() { conn.Dispose(); diff --git a/Catalogger.Backend/Program.cs b/Catalogger.Backend/Program.cs index 27710e0..8516224 100644 --- a/Catalogger.Backend/Program.cs +++ b/Catalogger.Backend/Program.cs @@ -93,6 +93,7 @@ builder .WithCommandGroup() .WithCommandGroup() .WithCommandGroup() + .WithCommandGroup() // End command tree .Finish() .AddPagination() From a50a8567dd0176d213378aa3aa0298f2539c4262 Mon Sep 17 00:00:00 2001 From: sam Date: Mon, 28 Oct 2024 23:42:57 +0100 Subject: [PATCH 03/57] feat: import messages from go version --- .../Database/DatabaseConnection.cs | 1 + .../Database/DatabaseMigrator.cs | 61 +- Catalogger.Backend/Database/DatabasePool.cs | 8 +- Catalogger.Backend/Database/Models/Guild.cs | 3 - Catalogger.Backend/Database/Models/Message.cs | 5 - .../Extensions/StartupExtensions.cs | 2 +- Catalogger.GoImporter/GuildImport.cs | 94 ++- Catalogger.GoImporter/MessageImport.cs | 114 +++ Catalogger.GoImporter/Models.cs | 20 + Catalogger.GoImporter/Program.cs | 39 +- go-exporter/crypt.go | 57 ++ go-exporter/go.mod | 43 +- go-exporter/go.sum | 668 ------------------ go-exporter/main.go | 10 + go-exporter/message.go | 147 ++++ 15 files changed, 503 insertions(+), 769 deletions(-) create mode 100644 Catalogger.GoImporter/MessageImport.cs create mode 100644 go-exporter/crypt.go create mode 100644 go-exporter/message.go diff --git a/Catalogger.Backend/Database/DatabaseConnection.cs b/Catalogger.Backend/Database/DatabaseConnection.cs index 61d2a7e..0c44667 100644 --- a/Catalogger.Backend/Database/DatabaseConnection.cs +++ b/Catalogger.Backend/Database/DatabaseConnection.cs @@ -25,6 +25,7 @@ public class DatabaseConnection(Guid id, ILogger logger, NpgsqlConnection inner) IDisposable { public Guid ConnectionId => id; + public NpgsqlConnection Inner => inner; private readonly ILogger _logger = logger.ForContext(); private readonly DateTimeOffset _openTime = DateTimeOffset.UtcNow; diff --git a/Catalogger.Backend/Database/DatabaseMigrator.cs b/Catalogger.Backend/Database/DatabaseMigrator.cs index 98cc00a..80e68c6 100644 --- a/Catalogger.Backend/Database/DatabaseMigrator.cs +++ b/Catalogger.Backend/Database/DatabaseMigrator.cs @@ -19,6 +19,9 @@ using NodaTime; namespace Catalogger.Backend.Database; +/// +/// Manages database migrations. +/// public class DatabaseMigrator(ILogger logger, IClock clock, DatabaseConnection conn) : IDisposable, IAsyncDisposable @@ -26,7 +29,10 @@ public class DatabaseMigrator(ILogger logger, IClock clock, DatabaseConnection c private const string RootPath = "Catalogger.Backend.Database"; private static readonly int MigrationsPathLength = $"{RootPath}.Migrations.".Length; - public async Task Migrate() + /// + /// Migrates the database to the latest version. + /// + public async Task MigrateUp() { var migrations = GetMigrationNames().ToArray(); logger.Debug("Getting current database migration"); @@ -65,6 +71,43 @@ public class DatabaseMigrator(ILogger logger, IClock clock, DatabaseConnection c await tx.CommitAsync(); } + /// + /// Migrates the database to a previous version. + /// + /// The number of migrations to revert. If higher than the number of applied migrations, + /// reverts the database to a clean slate. + public async Task MigrateDown(int count = 1) + { + await using var tx = await conn.BeginTransactionAsync(); + + var migrationCount = 0; + var totalStartTime = clock.GetCurrentInstant(); + for (var i = count; i > 0; i--) + { + var migration = await GetCurrentMigration(); + if (migration == null) + { + logger.Information( + "More down migrations requested than were in the database, finishing early" + ); + break; + } + + logger.Debug("Reverting migration {Migration}", migration); + var startTime = clock.GetCurrentInstant(); + await ExecuteMigration(tx, migration.MigrationName, up: false); + var took = clock.GetCurrentInstant() - startTime; + logger.Debug("Reverted migration {Migration} in {Took}", migration, took); + migrationCount++; + } + + var totalTook = clock.GetCurrentInstant() - totalStartTime; + logger.Information("Reverted {Count} migrations in {Took}", migrationCount, totalTook); + + // Finally, commit the transaction + await tx.CommitAsync(); + } + private async Task ExecuteMigration(DbTransaction tx, string migrationName, bool up = true) { var query = await GetResource( @@ -73,11 +116,17 @@ public class DatabaseMigrator(ILogger logger, IClock clock, DatabaseConnection c // Run the migration await conn.ExecuteAsync(query, transaction: tx); - // Store that we ran the migration - await conn.ExecuteAsync( - "INSERT INTO migrations (migration_name, applied_at) VALUES (@MigrationName, @AppliedAt)", - new { MigrationName = migrationName, AppliedAt = clock.GetCurrentInstant() } - ); + // Store that we ran the migration (or reverted it) + if (up) + await conn.ExecuteAsync( + "INSERT INTO migrations (migration_name, applied_at) VALUES (@MigrationName, now())", + new { MigrationName = migrationName } + ); + else + await conn.ExecuteAsync( + "DELETE FROM migrations WHERE migration_name = @MigrationName", + new { MigrationName = migrationName } + ); } /// Returns the current migration. If no migrations have been applied, returns null diff --git a/Catalogger.Backend/Database/DatabasePool.cs b/Catalogger.Backend/Database/DatabasePool.cs index 82072f8..3677ae3 100644 --- a/Catalogger.Backend/Database/DatabasePool.cs +++ b/Catalogger.Backend/Database/DatabasePool.cs @@ -148,19 +148,17 @@ public class DatabasePool Array.ConvertAll((long[])value, i => (ulong)i); } - public class JsonTypeHandler : SqlMapper.TypeHandler + private class JsonTypeHandler : SqlMapper.TypeHandler { public override T Parse(object value) { - string json = (string)value; + var json = (string)value; return JsonSerializer.Deserialize(json) ?? throw new CataloggerError("JsonTypeHandler returned null"); } - public override void SetValue(IDbDataParameter parameter, T? value) - { + public override void SetValue(IDbDataParameter parameter, T? value) => parameter.Value = JsonSerializer.Serialize(value); - } } } diff --git a/Catalogger.Backend/Database/Models/Guild.cs b/Catalogger.Backend/Database/Models/Guild.cs index 9ac8042..e27ea1b 100644 --- a/Catalogger.Backend/Database/Models/Guild.cs +++ b/Catalogger.Backend/Database/Models/Guild.cs @@ -13,7 +13,6 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -using System.ComponentModel.DataAnnotations.Schema; using Catalogger.Backend.Extensions; using Catalogger.Backend.Services; using Remora.Rest.Core; @@ -22,10 +21,8 @@ namespace Catalogger.Backend.Database.Models; public class Guild { - [DatabaseGenerated(DatabaseGeneratedOption.None)] public required ulong Id { get; init; } - [Column(TypeName = "jsonb")] public ChannelConfig Channels { get; init; } = new(); public string[] BannedSystems { get; set; } = []; public ulong[] KeyRoles { get; set; } = []; diff --git a/Catalogger.Backend/Database/Models/Message.cs b/Catalogger.Backend/Database/Models/Message.cs index 2bbb658..81e94b1 100644 --- a/Catalogger.Backend/Database/Models/Message.cs +++ b/Catalogger.Backend/Database/Models/Message.cs @@ -13,13 +13,10 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -using System.ComponentModel.DataAnnotations.Schema; - namespace Catalogger.Backend.Database.Models; public class Message { - [DatabaseGenerated(DatabaseGeneratedOption.None)] public required ulong Id { get; init; } public ulong? OriginalId { get; set; } @@ -38,5 +35,3 @@ public class Message public int AttachmentSize { get; set; } = 0; } - -public record IgnoredMessage([property: DatabaseGenerated(DatabaseGeneratedOption.None)] ulong Id); diff --git a/Catalogger.Backend/Extensions/StartupExtensions.cs b/Catalogger.Backend/Extensions/StartupExtensions.cs index 176d821..4690dab 100644 --- a/Catalogger.Backend/Extensions/StartupExtensions.cs +++ b/Catalogger.Backend/Extensions/StartupExtensions.cs @@ -197,7 +197,7 @@ public static class StartupExtensions DatabasePool.ConfigureDapper(); await using var migrator = scope.ServiceProvider.GetRequiredService(); - await migrator.Migrate(); + await migrator.MigrateUp(); var config = scope.ServiceProvider.GetRequiredService(); var slashService = scope.ServiceProvider.GetRequiredService(); diff --git a/Catalogger.GoImporter/GuildImport.cs b/Catalogger.GoImporter/GuildImport.cs index 3238fdd..a578430 100644 --- a/Catalogger.GoImporter/GuildImport.cs +++ b/Catalogger.GoImporter/GuildImport.cs @@ -13,10 +13,12 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . +using System.Data.Common; using System.Diagnostics; using System.Text.Json; using Catalogger.Backend.Database; using Catalogger.Backend.Database.Models; +using Dapper; using NodaTime.Extensions; using Serilog; @@ -24,7 +26,7 @@ namespace Catalogger.GoImporter; public static class GuildImport { - public static async Task DoImportAsync(DatabaseContext db, string filename) + public static async Task DoImportAsync(DatabaseConnection conn, string filename) { var rawData = await File.OpenText(filename).ReadToEndAsync(); var data = JsonSerializer.Deserialize(rawData, Program.JsonOptions); @@ -37,16 +39,15 @@ public static class GuildImport var watch = new Stopwatch(); watch.Start(); - await using var tx = await db.Database.BeginTransactionAsync(); + await using var tx = await conn.BeginTransactionAsync(); foreach (var g in data.Guilds) - ImportGuild(db, g); + await ImportGuildAsync(conn, tx, g); foreach (var i in data.Invites) - ImportInvite(db, i); + await ImportInviteAsync(conn, tx, i); foreach (var w in data.Watchlist) - ImportWatchlistEntry(db, w); + await ImportWatchlistEntryAsync(conn, tx, w); - await db.SaveChangesAsync(); await tx.CommitAsync(); Log.Information( @@ -55,7 +56,11 @@ public static class GuildImport ); } - private static void ImportGuild(DatabaseContext db, GoGuild guild) + private static async Task ImportGuildAsync( + DatabaseConnection conn, + DbTransaction tx, + GoGuild guild + ) { var channels = new Guild.ChannelConfig { @@ -90,38 +95,61 @@ public static class GuildImport if (ulong.TryParse(key, out var fromId) && ulong.TryParse(value, out var toId)) channels.Redirects[fromId] = toId; - var dbGuild = new Guild - { - Id = guild.Id, - BannedSystems = guild.BannedSystems, - KeyRoles = guild.KeyRoles, - Channels = channels, - }; - - db.Guilds.Add(dbGuild); + await conn.ExecuteAsync( + """ + insert into guilds (id, channels, banned_systems, key_roles) + values (@Id, @Channels::jsonb, @BannedSystems, @KeyRoles) + """, + new + { + guild.Id, + Channels = channels, + guild.BannedSystems, + guild.KeyRoles, + }, + tx + ); } - private static void ImportInvite(DatabaseContext db, GoInvite invite) + private static async Task ImportInviteAsync( + DatabaseConnection conn, + DbTransaction tx, + GoInvite invite + ) { - var dbInvite = new Invite - { - GuildId = invite.GuildId, - Code = invite.Code, - Name = invite.Name, - }; - db.Invites.Add(dbInvite); + await conn.ExecuteAsync( + "insert into invites (code, guild_id, name) values (@Code, @GuildId, @Name)", + new + { + invite.GuildId, + invite.Code, + invite.Name, + }, + tx + ); } - private static void ImportWatchlistEntry(DatabaseContext db, GoWatchlistEntry watchlistEntry) + private static async Task ImportWatchlistEntryAsync( + DatabaseConnection conn, + DbTransaction tx, + GoWatchlistEntry watchlistEntry + ) { - var dbWatchlist = new Watchlist - { - GuildId = watchlistEntry.GuildId, - UserId = watchlistEntry.UserId, - ModeratorId = watchlistEntry.ModeratorId, - AddedAt = watchlistEntry.AddedAt, - Reason = watchlistEntry.Reason, - }; + await conn.ExecuteAsync( + """ + insert into watchlists (guild_id, user_id, added_at, moderator_id, reason) + values (@GuildId, @UserId, @AddedAt, @ModeratorId, @Reason) + """, + new + { + watchlistEntry.GuildId, + watchlistEntry.UserId, + watchlistEntry.AddedAt, + watchlistEntry.ModeratorId, + watchlistEntry.Reason, + }, + tx + ); } private static ulong TryParse(this Dictionary dict, string key) => diff --git a/Catalogger.GoImporter/MessageImport.cs b/Catalogger.GoImporter/MessageImport.cs new file mode 100644 index 0000000..6a5d2e1 --- /dev/null +++ b/Catalogger.GoImporter/MessageImport.cs @@ -0,0 +1,114 @@ +// Copyright (C) 2021-present sam (starshines.gay) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +using System.Text.Json; +using Catalogger.Backend; +using Catalogger.Backend.Database; +using Catalogger.Backend.Database.Repositories; +using Dapper; +using NpgsqlTypes; +using Serilog; + +namespace Catalogger.GoImporter; + +public class MessageImport +{ + public static async Task DoImportAsync(Config config, DatabaseConnection conn, string dirname) + { + var encryptionService = new EncryptionService(config); + + var files = Directory.GetFiles(dirname); + var ignoredFile = files.First(n => n[dirname.Length..] == "ignored.json"); + var messageFiles = files.Where(n => n != ignoredFile).Order(); + + var ignoredMessages = await ParseFileAsync(ignoredFile); + await using ( + var writer = await conn.Inner.BeginBinaryImportAsync( + "COPY ignored_messages (id) FROM STDIN (FORMAT BINARY)" + ) + ) + { + foreach (var id in ignoredMessages) + { + await writer.StartRowAsync(); + await writer.WriteAsync((long)id, NpgsqlDbType.Bigint); + } + + await writer.CompleteAsync(); + } + + await using var tx = await conn.BeginTransactionAsync(); + + // Metadata isn't convertible, sadly, so just generate a dummy one. + var metadata = encryptionService.Encrypt( + JsonSerializer.Serialize( + new MessageRepository.Metadata(IsWebhook: false, Attachments: []) + ) + ); + + foreach (var filename in messageFiles) + { + var messages = await ParseFileAsync>(filename); + + Log.Debug( + "Starting import of message file, starting with {FirstMessageId}, ending with {LastMessageId}", + messages.First().Id, + messages.Last().Id + ); + + foreach (var msg in messages) + { + await conn.ExecuteAsync( + """ + insert into messages (id, original_id, user_id, channel_id, guild_id, member, system, username, content, metadata, attachment_size) + values (@Id, @OriginalId, @UserId, @ChannelId, @GuildId, @Member, @System, @Username, @Content, @Metadata, 0) + on conflict do nothing + """, + new + { + msg.Id, + OriginalId = (ulong?)(msg.Member != null ? msg.Id : null), + msg.UserId, + msg.ChannelId, + msg.GuildId, + msg.Member, + msg.System, + Content = await Task.Run(() => encryptionService.Encrypt(msg.Content)), + Username = await Task.Run(() => encryptionService.Encrypt(msg.Username)), + Metadata = metadata, + }, + tx + ); + } + + Log.Debug( + "Finished importing message file ending with {LastMessageId}", + messages.Last().Id + ); + } + + await tx.CommitAsync(); + + Log.Debug("Finished importing files!"); + } + + private static async Task ParseFileAsync(string filename) + { + var rawData = await File.OpenText(filename).ReadToEndAsync(); + return JsonSerializer.Deserialize(rawData, Program.JsonOptions) + ?? throw new CataloggerError("Message file deserialized as null"); + ; + } +} diff --git a/Catalogger.GoImporter/Models.cs b/Catalogger.GoImporter/Models.cs index acbd2fa..0b6dce8 100644 --- a/Catalogger.GoImporter/Models.cs +++ b/Catalogger.GoImporter/Models.cs @@ -14,6 +14,7 @@ // along with this program. If not, see . using NodaTime; +using Remora.Discord.API.Objects; using J = System.Text.Json.Serialization.JsonPropertyNameAttribute; // ReSharper disable NotAccessedPositionalProperty.Global @@ -45,3 +46,22 @@ public record GuildsExport( List Invites, List Watchlist ); + +public record GoMessage( + [property: J("MsgID")] ulong Id, + [property: J("UserID")] ulong UserId, + [property: J("ChannelID")] ulong ChannelId, + [property: J("ServerID")] ulong GuildId, + string Content, + string Username, + string? Member, + string? System, + GoMetadata? Metadata +); + +public record GoMetadata( + [property: J("UserID")] ulong? UserId, + string? Username, + string? Avatar, + EmbedField[]? Embeds +); diff --git a/Catalogger.GoImporter/Program.cs b/Catalogger.GoImporter/Program.cs index 1a8bc0f..a34f08a 100644 --- a/Catalogger.GoImporter/Program.cs +++ b/Catalogger.GoImporter/Program.cs @@ -1,10 +1,10 @@ // See https://aka.ms/new-console-template for more information using System.Text.Json; +using System.Text.Json.Serialization; using Catalogger.Backend; using Catalogger.Backend.Database; using Catalogger.Backend.Extensions; -using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using NodaTime; using NodaTime.Serialization.SystemTextJson; @@ -17,13 +17,15 @@ namespace Catalogger.GoImporter; internal class Program { - public static JsonSerializerOptions JsonOptions = - new JsonSerializerOptions().ConfigureForNodaTime( - new NodaJsonSettings - { - InstantConverter = new NodaPatternConverter(InstantPattern.ExtendedIso), - } - ); + public static readonly JsonSerializerOptions JsonOptions = new JsonSerializerOptions + { + NumberHandling = JsonNumberHandling.AllowReadingFromString, + }.ConfigureForNodaTime( + new NodaJsonSettings + { + InstantConverter = new NodaPatternConverter(InstantPattern.ExtendedIso), + } + ); public static async Task Main(string[] args) { @@ -41,8 +43,18 @@ internal class Program return; } - var db = new DatabaseContext(config, null); - await db.Database.MigrateAsync(); + var db = new DatabasePool(config, Log.Logger, null); + DatabasePool.ConfigureDapper(); + if (Environment.GetEnvironmentVariable("MIGRATE") == "true") + { + var migrator = new DatabaseMigrator( + Log.Logger, + SystemClock.Instance, + await db.AcquireAsync() + ); + + await migrator.MigrateUp(); + } var type = args[0].ToLowerInvariant(); var file = args[1]; @@ -50,7 +62,12 @@ internal class Program if (type == "guilds") { Log.Information("Importing guilds from {File}", file); - await GuildImport.DoImportAsync(db, file); + await GuildImport.DoImportAsync(await db.AcquireAsync(), file); + } + else if (type == "messages") + { + Log.Information("Importing messages from {Path}", file); + await MessageImport.DoImportAsync(config, await db.AcquireAsync(), file); } } } diff --git a/go-exporter/crypt.go b/go-exporter/crypt.go new file mode 100644 index 0000000..2c7464d --- /dev/null +++ b/go-exporter/crypt.go @@ -0,0 +1,57 @@ +package main + +import ( + "crypto/aes" + "crypto/cipher" + "crypto/rand" + "errors" + "io" +) + +// Encrypt encrypts data using 256-bit AES-GCM. This both hides the content of +// the data and provides a check that it hasn't been altered. Output takes the +// form nonce|ciphertext|tag where '|' indicates concatenation. +func Encrypt(plaintext []byte, key [32]byte) (ciphertext []byte, err error) { + block, err := aes.NewCipher(key[:]) + if err != nil { + return nil, err + } + + gcm, err := cipher.NewGCM(block) + if err != nil { + return nil, err + } + + nonce := make([]byte, gcm.NonceSize()) + _, err = io.ReadFull(rand.Reader, nonce) + if err != nil { + return nil, err + } + + return gcm.Seal(nonce, nonce, plaintext, nil), nil +} + +// Decrypt decrypts data using 256-bit AES-GCM. This both hides the content of +// the data and provides a check that it hasn't been altered. Expects input +// form nonce|ciphertext|tag where '|' indicates concatenation. +func Decrypt(ciphertext []byte, key [32]byte) (plaintext []byte, err error) { + block, err := aes.NewCipher(key[:]) + if err != nil { + return nil, err + } + + gcm, err := cipher.NewGCM(block) + if err != nil { + return nil, err + } + + if len(ciphertext) < gcm.NonceSize() { + return nil, errors.New("malformed ciphertext") + } + + return gcm.Open(nil, + ciphertext[:gcm.NonceSize()], + ciphertext[gcm.NonceSize():], + nil, + ) +} diff --git a/go-exporter/go.mod b/go-exporter/go.mod index fa69e9f..928a6aa 100644 --- a/go-exporter/go.mod +++ b/go-exporter/go.mod @@ -2,23 +2,13 @@ module codeberg.org/starshine/catalogger/go-exporter go 1.23.2 -require github.com/starshine-sys/catalogger v0.0.0-20241024200124-ab45ee73696f +require ( + github.com/diamondburned/arikawa/v3 v3.3.1-0.20230608010326-2b0395ab12a6 + github.com/georgysavva/scany v1.0.0 + github.com/jackc/pgx/v4 v4.16.1 +) require ( - emperror.dev/errors v0.8.0 // indirect - github.com/Masterminds/squirrel v1.5.0 // indirect - github.com/ReneKroon/ttlcache/v2 v2.1.0 // indirect - github.com/deepmap/oapi-codegen v1.8.2 // indirect - github.com/diamondburned/arikawa/v3 v3.3.1-0.20230608010326-2b0395ab12a6 // indirect - github.com/georgysavva/scany v1.0.0 // indirect - github.com/getsentry/sentry-go v0.13.0 // indirect - github.com/go-gorp/gorp/v3 v3.0.2 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/gorilla/schema v1.2.0 // indirect - github.com/gorilla/websocket v1.4.2 // indirect - github.com/influxdata/influxdb-client-go/v2 v2.9.1 // indirect - github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgconn v1.12.1 // indirect github.com/jackc/pgio v1.0.0 // indirect @@ -26,30 +16,9 @@ require ( github.com/jackc/pgproto3/v2 v2.3.0 // indirect github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect github.com/jackc/pgtype v1.11.0 // indirect - github.com/jackc/pgx/v4 v4.16.1 // indirect github.com/jackc/puddle v1.2.1 // indirect - github.com/joho/godotenv v1.4.0 // indirect - github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect - github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect - github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/rubenv/sql-migrate v1.1.2 // indirect - github.com/shirou/gopsutil/v3 v3.22.6 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/starshine-sys/bcr v0.21.1-0.20220205193809-aa85130f923e // indirect - github.com/starshine-sys/pkgo/v2 v2.0.2 // indirect - github.com/starshine-sys/snowflake/v2 v2.0.0 // indirect - github.com/tklauser/go-sysconf v0.3.10 // indirect - github.com/tklauser/numcpus v0.4.0 // indirect - github.com/yusufpapurcu/wmi v1.2.2 // indirect - go.uber.org/atomic v1.7.0 // indirect - go.uber.org/multierr v1.6.0 // indirect - go.uber.org/zap v1.21.0 // indirect + github.com/stretchr/testify v1.7.5 // indirect golang.org/x/crypto v0.1.0 // indirect - golang.org/x/net v0.1.0 // indirect - golang.org/x/sys v0.1.0 // indirect golang.org/x/text v0.4.0 // indirect - golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/go-exporter/go.sum b/go-exporter/go.sum index 2a49304..0724b55 100644 --- a/go-exporter/go.sum +++ b/go-exporter/go.sum @@ -1,244 +1,31 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -emperror.dev/errors v0.8.0 h1:4lycVEx0sdJkwDUfQ9pdu6SR0x7rgympt5f4+ok8jDk= -emperror.dev/errors v0.8.0/go.mod h1:YcRvLPh626Ubn2xqtoprejnA5nFha+TJ+2vew48kWuE= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Masterminds/squirrel v1.5.0 h1:JukIZisrUXadA9pl3rMkjhiamxiB0cXiu+HGp/Y8cY8= -github.com/Masterminds/squirrel v1.5.0/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= -github.com/ReneKroon/ttlcache/v2 v2.1.0 h1:5GQZXf7Pl68S4O/Mps4kAXQ+ObEqwHskC8WKT77mHiQ= -github.com/ReneKroon/ttlcache/v2 v2.1.0/go.mod h1:0E5EIhFJrGmcn/niHrqnnvQHvihj+DdPzJlOEzBS3o4= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/cockroach-go/v2 v2.2.0 h1:/5znzg5n373N/3ESjHF5SMLxiW4RKB05Ql//KWfeTFs= github.com/cockroachdb/cockroach-go/v2 v2.2.0/go.mod h1:u3MiKYGupPPjkn3ozknpMUpxPaNLTFWAya419/zv6eI= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU= -github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= -github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/diamondburned/arikawa/v3 v3.0.0-rc.4.0.20220129113810-3fe7fbc24b83/go.mod h1:5jBSNnp82Z/EhsKa6Wk9FsOqSxfVkNZDTDBPOj47LpY= github.com/diamondburned/arikawa/v3 v3.3.1-0.20230608010326-2b0395ab12a6 h1:96f78R3EDiXRvAA0lWRL8iBeTiHNdQBxEH2cd3fXO90= github.com/diamondburned/arikawa/v3 v3.3.1-0.20230608010326-2b0395ab12a6/go.mod h1:+ifmDonP/JdBiUOzZmVReEjPTHDUSkyqqRRmjSf9NE8= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/georgysavva/scany v1.0.0 h1:9ar4458sgkWehk8bRsEe128FQV3pVKxdN4ytmCK6BEY= github.com/georgysavva/scany v1.0.0/go.mod h1:q8QyrfXjmBk9iJD00igd4lbkAKEXAH/zIYoZ0z/Wan4= -github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= -github.com/getsentry/sentry-go v0.13.0 h1:20dgTiUSfxRB/EhMPtxcL9ZEbM1ZdR+W/7f7NWD+xWo= -github.com/getsentry/sentry-go v0.13.0/go.mod h1:EOsfu5ZdvKPfeHYV6pTVQnsjfp30+XA7//UooKNumH0= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= -github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gorp/gorp/v3 v3.0.2 h1:ULqJXIekoqMx29FI5ekXXFoH1dT2Vc8UhnRzBg+Emz4= -github.com/go-gorp/gorp/v3 v3.0.2/go.mod h1:BJ3q1ejpV8cVALtcXvXaXyTOlMmJhWDxTmncaR6rwBY= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gobuffalo/logger v1.0.6 h1:nnZNpxYo0zx+Aj9RfMPBm+x9zAU2OayFh/xrAWi34HU= -github.com/gobuffalo/logger v1.0.6/go.mod h1:J31TBEHR1QLV2683OXTAItYIg8pv2JMHnF/quuAbMjs= -github.com/gobuffalo/packd v1.0.1 h1:U2wXfRr4E9DH8IdsDLlRFwTZTK7hLfq9qT/QHXGVe/0= -github.com/gobuffalo/packd v1.0.1/go.mod h1:PP2POP3p3RXGz7Jh6eYEf93S7vA2za6xM7QT85L4+VY= -github.com/gobuffalo/packr/v2 v2.8.3 h1:xE1yzvnO56cUC0sTpKR3DIbxZgB54AftTFMhB2XEWlY= -github.com/gobuffalo/packr/v2 v2.8.3/go.mod h1:0SahksCVcx4IMnigTjiFuyldmTrdTctXsOdiU5KwbKc= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godror/godror v0.24.2/go.mod h1:wZv/9vPiUib6tkoDl+AZ/QLf5YZgMravZ7jxH2eQWAE= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/schema v1.2.0 h1:YufUaxZYCKGFuAq3c96BOhjgd5nmXiOY9NGzF247Tsc= github.com/gorilla/schema v1.2.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb-client-go/v2 v2.9.1 h1:5kbH226fmmiV0MMTs7a8L7/ECCKdJWBi1QZNNv4/TkI= -github.com/influxdata/influxdb-client-go/v2 v2.9.1/go.mod h1:x7Jo5UHHl+w8wu8UnGiNobDDHygojXwJX4mx7rXGKMk= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= -github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -305,33 +92,13 @@ github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dv github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmoiron/sqlx v1.3.1/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= -github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= -github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw= -github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kortschak/utter v1.0.1/go.mod h1:vSmSjbyrlKjjsL71193LmzBOKgwePk9DH6uFaWHIInc= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw= -github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o= -github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk= -github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -339,108 +106,31 @@ github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/markbates/errx v1.1.0 h1:QDFeR+UP95dO12JgW+tgi2UVfo0V8YBHiUIOaeBPiEI= -github.com/markbates/errx v1.1.0/go.mod h1:PLa46Oex9KNbVDZhKel8v1OT7hD5JZ2eI7AHhA0wswc= -github.com/markbates/oncer v1.0.0 h1:E83IaVAHygyndzPimgUYJjbshhDTALZyXxvk9FOlQRY= -github.com/markbates/oncer v1.0.0/go.mod h1:Z59JA581E9GP6w96jai+TGqafHPW+cPfRxz2aSZ0mcI= -github.com/markbates/safe v1.0.1 h1:yjZkbvRM6IzKj9tlu/zMJLS0n/V351OZWRnF3QfaUxI= -github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= -github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-oci8 v0.1.1/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.2/go.mod h1:6iaV0fGdElS6dPBx0EApTxHrcWvmJphyh2n8YBLPPZ4= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/poy/onpar v0.0.0-20190519213022-ee068f8ea4d1 h1:oL4IBbcqwhhNWh31bjOX8C/OCy0zs9906d/VUru+bqg= -github.com/poy/onpar v0.0.0-20190519213022-ee068f8ea4d1/go.mod h1:nSbFQvMj97ZyhFRSJYtut+msi4sOY6zJDGCdSc+/rZU= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= -github.com/rubenv/sql-migrate v1.1.2 h1:9M6oj4e//owVVHYrFISmY9LBRw6gzkCNmD9MV36tZeQ= -github.com/rubenv/sql-migrate v1.1.2/go.mod h1:/7TZymwxN8VWumcIxw1jjHEcR1djpdkMHQPT4FWdnbQ= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil/v3 v3.22.6 h1:FnHOFOh+cYAM0C30P+zysPISzlknLC5Z1G4EAElznfQ= -github.com/shirou/gopsutil/v3 v3.22.6/go.mod h1:EdIubSnZhbAvBS1yJ7Xi+AShB/hxwLHOMz4MCYz7yMs= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/starshine-sys/bcr v0.21.1-0.20220205193809-aa85130f923e h1:q07ZCwtjml6GJxpnv3h55nXCHoBgRn2OO8gMbTH2jfo= -github.com/starshine-sys/bcr v0.21.1-0.20220205193809-aa85130f923e/go.mod h1:FfQ21dpzRgLQvBcXI17JicZkE1osEcYIl8QdZ5rE0HE= -github.com/starshine-sys/catalogger v0.0.0-20241024200124-ab45ee73696f h1:N7sg87omI9ffhVmFIwpiIRlQGegz96KuakaIruTBmPE= -github.com/starshine-sys/catalogger v0.0.0-20241024200124-ab45ee73696f/go.mod h1:4ObGSpblMEhm2qtN/vZ4Y6yj/iSw4lZPb/BanbLKAAY= -github.com/starshine-sys/pkgo/v2 v2.0.2 h1:6NcXFgaHtq3IF4IAIVPkjopQbiVmFhi3GuVDLnVLX/s= -github.com/starshine-sys/pkgo/v2 v2.0.2/go.mod h1:P13mUJ7fo3l0LqRuF8aqrCMz7msQNNF0zgaWnHSx1y0= -github.com/starshine-sys/snowflake/v2 v2.0.0 h1:rVDUw1tXe1nDcGTMMAU5RzU+mX4O9IDEEs9lds7BYtI= -github.com/starshine-sys/snowflake/v2 v2.0.0/go.mod h1:6E5AYqTPb9DL7bp24tcbTLx0/thTcAmyLgscZIP7tzw= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -450,243 +140,65 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.5 h1:s5PTfem8p8EbKQOctVV53k6jCJt3UX4IEJzwh+C324Q= github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tklauser/go-sysconf v0.3.10 h1:IJ1AZGZRWbY8T5Vfk04D9WOA5WSejdflXxP03OUqALw= -github.com/tklauser/go-sysconf v0.3.10/go.mod h1:C8XykCvCb+Gn0oNCWPIlcb0RuglQTYaQ2hGm7jmxEFk= -github.com/tklauser/numcpus v0.4.0 h1:E53Dm1HjH1/R2/aoCtXtPgzmElmn51aOkhCFSuZq//o= -github.com/tklauser/numcpus v0.4.0/go.mod h1:1+UI3pD8NW14VMwdgJNJ1ESk2UnwhAnz5hMwiKKqXCQ= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= -github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= -github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= -go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= -go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211001092434-39dca1131b70/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= @@ -694,11 +206,8 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0 h1:g6Z6vPFA9dYBAF7DWcH6sCcOntplXsDKcliusYijMlw= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -707,73 +216,16 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -781,136 +233,16 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/postgres v1.0.8/go.mod h1:4eOzrI1MUfm6ObJU/UcmbXyiHSs8jSwH95G5P5dxcAg= gorm.io/gorm v1.20.12/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= gorm.io/gorm v1.21.4/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/go-exporter/main.go b/go-exporter/main.go index e7292d3..ed74c43 100644 --- a/go-exporter/main.go +++ b/go-exporter/main.go @@ -4,14 +4,17 @@ import ( "context" "log" "os" + "strconv" "github.com/jackc/pgx/v4/pgxpool" ) var conn *pgxpool.Pool var ctx = context.Background() +var aesKey [32]byte func main() { + copy(aesKey[:], []byte(os.Getenv("AES_KEY"))) dsn := os.Getenv("DATABASE_URL") pool, err := pgxpool.Connect(ctx, dsn) @@ -24,4 +27,11 @@ func main() { if err != nil { log.Fatalf("error exporting guilds: %v\n", err) } + + if ok, _ := strconv.ParseBool(os.Getenv("EXPORT_MESSAGES")); ok { + err = exportMessages() + if err != nil { + log.Fatalf("error exporting messages: %v\n", err) + } + } } diff --git a/go-exporter/message.go b/go-exporter/message.go new file mode 100644 index 0000000..33904b4 --- /dev/null +++ b/go-exporter/message.go @@ -0,0 +1,147 @@ +package main + +import ( + "encoding/hex" + "encoding/json" + "fmt" + "log" + "os" + "time" + + "github.com/diamondburned/arikawa/v3/discord" + "github.com/georgysavva/scany/pgxscan" +) + +func exportMessages() error { + dirname := fmt.Sprintf("messages-%v.json", time.Now().Unix()) + err := os.Mkdir(dirname, 0o755) + if err != nil { + return fmt.Errorf("creating output directory: %w", err) + } + + var ignoredMessages []int64 + err = conn.QueryRow(ctx, "select array_agg(id) from ignored_messages").Scan(&ignoredMessages) + if err != nil { + return fmt.Errorf("querying ignored messages: %w", err) + } + + b, err := json.Marshal(ignoredMessages) + if err != nil { + return fmt.Errorf("marshaling ignored messages: %w", err) + } + + err = os.WriteFile(dirname+"/ignored.json", b, 0o755) + if err != nil { + return fmt.Errorf("writing ignored messages: %w", err) + } + + cursor := discord.Snowflake(0) + for { + start := time.Now() + + messages, err := getMessages(cursor) + if err != nil { + return fmt.Errorf("querying messages after %v: %w", cursor, err) + } + + b, err := json.Marshal(messages) + if err != nil { + return fmt.Errorf("marshaling ignored messages: %w", err) + } + + cursor = discord.Snowflake(messages[len(messages)-1].MsgID) + + filename := fmt.Sprintf("messages-%v-%v.json", messages[0].MsgID, cursor) + + err = os.WriteFile(dirname+"/"+filename, b, 0o755) + if err != nil { + return fmt.Errorf("writing messages: %w", err) + } + + end := time.Now() + + log.Printf("Exported %v messages (starting at %v) in %v\n\n", len(messages), messages[0].MsgID, end.Sub(start)) + log.Printf("Current cursor: %v\n\n", cursor) + + if len(messages) < pageSize { + break + } + } + + return nil +} + +// Message is a single message +type Message struct { + MsgID discord.MessageID + UserID discord.UserID + ChannelID discord.ChannelID + ServerID discord.GuildID + + Content string + Username string + + // These are only filled if the message was proxied by PluralKit + Member *string + System *string + + Metadata *Metadata `db:"-"` + RawMetadata *[]byte `db:"metadata" json:"-"` +} + +// Metadata is optional message metadata +type Metadata struct { + UserID *discord.UserID `json:"user_id,omitempty"` + Username string `json:"username,omitempty"` + Avatar string `json:"avatar,omitempty"` + Embeds []discord.Embed `json:"embeds,omitempty"` +} + +const pageSize = 10000 + +func getMessages(after discord.Snowflake) (ms []Message, err error) { + err = pgxscan.Select(ctx, conn, &ms, "select * from messages where msg_id > $1 order by msg_id asc limit $2", after, pageSize) + if err != nil { + return nil, err + } + + for i, m := range ms { + b, err := hex.DecodeString(m.Content) + if err != nil { + return nil, err + } + + out, err := Decrypt(b, aesKey) + if err != nil { + return nil, err + } + + ms[i].Content = string(out) + + b, err = hex.DecodeString(m.Username) + if err != nil { + return nil, err + } + + out, err = Decrypt(b, aesKey) + if err != nil { + return nil, err + } + + ms[i].Username = string(out) + + if m.RawMetadata != nil { + b, err := Decrypt(*m.RawMetadata, aesKey) + if err == nil { + var md Metadata + err = json.Unmarshal(b, &md) + if err != nil { + return ms, err + } + ms[i].Metadata = &md + } + } + } + + return ms, nil +} From b52df95b65a0106a591f59b2cdf92560d6541a27 Mon Sep 17 00:00:00 2001 From: sam Date: Tue, 29 Oct 2024 00:06:39 +0100 Subject: [PATCH 04/57] feat: ignore user commands --- .../Middleware/AuthenticationMiddleware.cs | 4 +- .../Bot/Commands/IgnoreUserCommands.cs | 117 ++++++++++++++++++ Catalogger.Backend/Bot/DiscordUtils.cs | 24 ++++ Catalogger.Backend/Program.cs | 1 + 4 files changed, 143 insertions(+), 3 deletions(-) create mode 100644 Catalogger.Backend/Bot/Commands/IgnoreUserCommands.cs diff --git a/Catalogger.Backend/Api/Middleware/AuthenticationMiddleware.cs b/Catalogger.Backend/Api/Middleware/AuthenticationMiddleware.cs index 47447dc..5d2c888 100644 --- a/Catalogger.Backend/Api/Middleware/AuthenticationMiddleware.cs +++ b/Catalogger.Backend/Api/Middleware/AuthenticationMiddleware.cs @@ -16,12 +16,10 @@ using System.Net; using Catalogger.Backend.Database.Models; using Catalogger.Backend.Database.Repositories; -using NodaTime; namespace Catalogger.Backend.Api.Middleware; -public class AuthenticationMiddleware(ApiTokenRepository tokenRepository, IClock clock) - : IMiddleware +public class AuthenticationMiddleware(ApiTokenRepository tokenRepository) : IMiddleware { public async Task InvokeAsync(HttpContext ctx, RequestDelegate next) { diff --git a/Catalogger.Backend/Bot/Commands/IgnoreUserCommands.cs b/Catalogger.Backend/Bot/Commands/IgnoreUserCommands.cs new file mode 100644 index 0000000..2474031 --- /dev/null +++ b/Catalogger.Backend/Bot/Commands/IgnoreUserCommands.cs @@ -0,0 +1,117 @@ +// Copyright (C) 2021-present sam (starshines.gay) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +using System.ComponentModel; +using Catalogger.Backend.Cache; +using Catalogger.Backend.Cache.InMemoryCache; +using Catalogger.Backend.Database.Repositories; +using Catalogger.Backend.Extensions; +using Remora.Commands.Attributes; +using Remora.Commands.Groups; +using Remora.Discord.API; +using Remora.Discord.API.Abstractions.Objects; +using Remora.Discord.Commands.Feedback.Services; +using Remora.Discord.Commands.Services; +using Remora.Discord.Pagination.Extensions; +using Remora.Rest.Core; +using IResult = Remora.Results.IResult; + +namespace Catalogger.Backend.Bot.Commands; + +[Group("ignored-users")] +[Description("Manage users ignored for logging.")] +public class IgnoreUserCommands( + GuildRepository guildRepository, + GuildCache guildCache, + IMemberCache memberCache, + UserCache userCache, + ContextInjectionService contextInjection, + FeedbackService feedbackService +) : CommandGroup +{ + [Command("add")] + [Description("Add a user to the list of ignored users.")] + public async Task AddIgnoredUserAsync([Description("The user to ignore")] IUser user) + { + var (_, guildId) = contextInjection.GetUserAndGuild(); + var guildConfig = await guildRepository.GetAsync(guildId); + + if (guildConfig.Channels.IgnoredUsers.Contains(user.ID.Value)) + return await feedbackService.ReplyAsync( + "That user is already being ignored.", + isEphemeral: true + ); + + guildConfig.Channels.IgnoredUsers.Add(user.ID.Value); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig.Channels); + + return await feedbackService.ReplyAsync( + $"Successfully added {user.PrettyFormat()} to the list of ignored users." + ); + } + + [Command("remove")] + [Description("Remove a user from the list of ignored users.")] + public async Task RemoveIgnoredUserAsync( + [Description("The user to stop ignoring")] IUser user + ) + { + var (_, guildId) = contextInjection.GetUserAndGuild(); + var guildConfig = await guildRepository.GetAsync(guildId); + + if (!guildConfig.Channels.IgnoredUsers.Contains(user.ID.Value)) + return await feedbackService.ReplyAsync( + "That user is already not ignored.", + isEphemeral: true + ); + + guildConfig.Channels.IgnoredUsers.Remove(user.ID.Value); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig.Channels); + + return await feedbackService.ReplyAsync( + $"Successfully removed {user.PrettyFormat()} from the list of ignored users." + ); + } + + [Command("list")] + [Description("List currently ignored users.")] + public async Task ListIgnoredUsersAsync() + { + var (userId, guildId) = contextInjection.GetUserAndGuild(); + if (!guildCache.TryGet(guildId, out var guild)) + throw new CataloggerError("Guild was not cached"); + + var guildConfig = await guildRepository.GetAsync(guildId); + + if (guildConfig.Channels.IgnoredUsers.Count == 0) + return await feedbackService.ReplyAsync("No users are being ignored right now."); + + var users = new List(); + foreach (var id in guildConfig.Channels.IgnoredUsers) + { + var user = await TryGetUserAsync(guildId, DiscordSnowflake.New(id)); + users.Add(user?.PrettyFormat() ?? $"*(unknown user {id})* <@{id}>"); + } + + return await feedbackService.SendContextualPaginatedMessageAsync( + userId, + DiscordUtils.PaginateStrings(users, $"Ignored users for {guild.Name} ({users.Count})") + ); + } + + private async Task TryGetUserAsync(Snowflake guildId, Snowflake userId) => + (await memberCache.TryGetAsync(guildId, userId))?.User.Value + ?? await userCache.GetUserAsync(userId); +} diff --git a/Catalogger.Backend/Bot/DiscordUtils.cs b/Catalogger.Backend/Bot/DiscordUtils.cs index 8e0a867..b6512d1 100644 --- a/Catalogger.Backend/Bot/DiscordUtils.cs +++ b/Catalogger.Backend/Bot/DiscordUtils.cs @@ -44,4 +44,28 @@ public static class DiscordUtils description, new Embed(Title: title, Colour: Purple) ); + + public static List PaginateStrings( + IEnumerable strings, + Optional title = default, + int stringsPerPage = 20 + ) + { + var pages = strings.ToArray().Split(stringsPerPage); + return pages + .Select(p => new Embed( + Title: title, + Colour: Purple, + Description: string.Join("\n", p.Select((row, i) => $"{i + 1}. {row}")) + )) + .ToList(); + } + + private static IEnumerable> Split(this T[] arr, int size) + { + for (var i = 0; i < arr.Length / size + 1; i++) + { + yield return arr.Skip(i * size).Take(size); + } + } } diff --git a/Catalogger.Backend/Program.cs b/Catalogger.Backend/Program.cs index 8516224..45d9904 100644 --- a/Catalogger.Backend/Program.cs +++ b/Catalogger.Backend/Program.cs @@ -94,6 +94,7 @@ builder .WithCommandGroup() .WithCommandGroup() .WithCommandGroup() + .WithCommandGroup() // End command tree .Finish() .AddPagination() From 65d286389d50c9c2a8ae63884b70c922ce550844 Mon Sep 17 00:00:00 2001 From: sam Date: Tue, 29 Oct 2024 14:19:18 +0100 Subject: [PATCH 05/57] feat(dashboard): add key roles --- .../Api/GuildsController.Ignores.cs | 39 +++++++ Catalogger.Backend/Api/GuildsController.cs | 21 +++- Catalogger.Frontend/src/lib/api.ts | 9 ++ .../dash/[guildId]/key-roles/+page.svelte | 105 +++++++++++++++++- 4 files changed, 170 insertions(+), 4 deletions(-) diff --git a/Catalogger.Backend/Api/GuildsController.Ignores.cs b/Catalogger.Backend/Api/GuildsController.Ignores.cs index ea9e647..f9cc106 100644 --- a/Catalogger.Backend/Api/GuildsController.Ignores.cs +++ b/Catalogger.Backend/Api/GuildsController.Ignores.cs @@ -13,6 +13,8 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . +using System.Net; +using Catalogger.Backend.Api.Middleware; using Microsoft.AspNetCore.Mvc; using Remora.Discord.API; using Remora.Discord.API.Abstractions.Objects; @@ -104,4 +106,41 @@ public partial class GuildsController return NoContent(); } + + [HttpPut("key-roles/{roleId}")] + public async Task AddKeyRoleAsync(string id, ulong roleId) + { + var (guildId, _) = await ParseGuildAsync(id); + var guildConfig = await guildRepository.GetAsync(guildId); + + if (roleCache.GuildRoles(guildId).All(r => r.ID.Value != roleId)) + throw new ApiError(HttpStatusCode.BadRequest, ErrorCode.BadRequest, "Role not found"); + + if (guildConfig.KeyRoles.Contains(roleId)) + throw new ApiError( + HttpStatusCode.BadRequest, + ErrorCode.BadRequest, + "Role is already a key role" + ); + + await guildRepository.AddKeyRoleAsync(guildId, DiscordSnowflake.New(roleId)); + return NoContent(); + } + + [HttpDelete("key-roles/{roleId}")] + public async Task RemoveKeyRoleAsync(string id, ulong roleId) + { + var (guildId, _) = await ParseGuildAsync(id); + var guildConfig = await guildRepository.GetAsync(guildId); + + if (!guildConfig.KeyRoles.Contains(roleId)) + throw new ApiError( + HttpStatusCode.BadRequest, + ErrorCode.BadRequest, + "Role is already not a key role" + ); + + await guildRepository.RemoveKeyRoleAsync(guildId, DiscordSnowflake.New(roleId)); + return NoContent(); + } } diff --git a/Catalogger.Backend/Api/GuildsController.cs b/Catalogger.Backend/Api/GuildsController.cs index 560456f..e1a52b0 100644 --- a/Catalogger.Backend/Api/GuildsController.cs +++ b/Catalogger.Backend/Api/GuildsController.cs @@ -19,6 +19,7 @@ using Catalogger.Backend.Cache; using Catalogger.Backend.Cache.InMemoryCache; using Catalogger.Backend.Database; using Catalogger.Backend.Database.Repositories; +using Catalogger.Backend.Extensions; using Catalogger.Backend.Services; using Microsoft.AspNetCore.Mvc; using Remora.Discord.API; @@ -91,6 +92,16 @@ public partial class GuildsController( .Select(ToChannel) )); + var roles = roleCache + .GuildRoles(guildId) + .OrderByDescending(r => r.Position) + .Select(r => new GuildRole( + r.ID.ToString(), + r.Name, + r.Position, + r.Colour.ToPrettyString() + )); + return Ok( new GuildResponse( guild.Id, @@ -98,7 +109,9 @@ public partial class GuildsController( guild.IconUrl, categories, channelsWithoutCategories, - guildConfig.Channels + roles, + guildConfig.Channels, + guildConfig.KeyRoles ) ); } @@ -122,13 +135,17 @@ public partial class GuildsController( string IconUrl, IEnumerable Categories, IEnumerable ChannelsWithoutCategory, - Database.Models.Guild.ChannelConfig Config + IEnumerable Roles, + Database.Models.Guild.ChannelConfig Config, + ulong[] KeyRoles ); private record GuildCategory(string Id, string Name, IEnumerable Channels); private record GuildChannel(string Id, string Name, bool CanLogTo, bool CanRedirectFrom); + private record GuildRole(string Id, string Name, int Position, string Colour); + [Authorize] [HttpPatch] [ProducesResponseType(statusCode: StatusCodes.Status200OK)] diff --git a/Catalogger.Frontend/src/lib/api.ts b/Catalogger.Frontend/src/lib/api.ts index 9db5318..a52aa7c 100644 --- a/Catalogger.Frontend/src/lib/api.ts +++ b/Catalogger.Frontend/src/lib/api.ts @@ -77,7 +77,9 @@ export type FullGuild = { icon_url: string; categories: GuildCategory[]; channels_without_category: GuildChannel[]; + roles: GuildRole[]; config: GuildConfig; + key_roles: string[]; }; export type GuildCategory = { @@ -93,6 +95,13 @@ export type GuildChannel = { can_redirect_from: boolean; }; +export type GuildRole = { + id: string; + name: string; + position: string; + colour: string; +}; + export type CurrentUser = { user: User; guilds: PartialGuild[]; diff --git a/Catalogger.Frontend/src/routes/dash/[guildId]/key-roles/+page.svelte b/Catalogger.Frontend/src/routes/dash/[guildId]/key-roles/+page.svelte index 6f940a6..dea7dfa 100644 --- a/Catalogger.Frontend/src/routes/dash/[guildId]/key-roles/+page.svelte +++ b/Catalogger.Frontend/src/routes/dash/[guildId]/key-roles/+page.svelte @@ -1,7 +1,108 @@

Key roles

-

This page is still under construction!

+

+ Key roles are logged separately from other roles, and also log who added + or removed the role. Useful for moderator roles. +

+ +
+ + +
+ +
+ +
+ +
+

Current key roles

+ + + {#each keyRoles as r (r.id)} + + + + {r.name} + + + + {/each} + +
From be8bc9b199e273dffc1ec0722bb7bb1d55f054ae Mon Sep 17 00:00:00 2001 From: sam Date: Tue, 29 Oct 2024 14:50:48 +0100 Subject: [PATCH 06/57] feat(dashboard): favicon --- Catalogger.Frontend/static/favicon.png | Bin 1571 -> 15487 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Catalogger.Frontend/static/favicon.png b/Catalogger.Frontend/static/favicon.png index 825b9e65af7c104cfb07089bb28659393b4f2097..6fcf9e700f61e93c646b18436ee4417d2ea594c1 100644 GIT binary patch literal 15487 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 Uux+ON`@3N!Id$0@nRlW83$#+KF8}}l delta 1565 zcmV+&2IBeuc%uxE8Gi%-003z>sXzb#00DDSM?wIu&K&6g00rGiL_t(|+U;H2ZR7!U+OIJ=AN-Q1gX#-xrWp&w_y z@)MXta?U)dS;xZ{pUV3+C2Y|J*@|1M^0HtEVPlk0_Dnt!KkXPkj3F58)>t5Za} zPWJ{u@{+FYBDs9nh1rO^E}w?y3qK3y$v6W}E>;PzkLJZ-7I9{iTo&xYYz=0W7yFQ0 z3euH%Gf^X8~_%M2E@)E5I?D7}a-=qr6=Kbg0qzZl!-c71tD&bia zsL=c?H44};bAPx?JP;+}<#6b63Ike{Fuo!?M{yEffez;|p!PfsuaC)>h>-AdbnwN1 z3g*1LowNjT5?+lFVd#9$!8Z9HA|$*6dQ8EHLu}U|obW6f2%uGv?vr=KNq7YYa2Roj z;|zooo<)lf=&2yxM@e`kM$CmCR#x>gI>I|*Ubr({5P#L)3xr2NyarBd`46Es|9}oU z=;TZAptAhHqfZbXeFiql%jXG?M@uk)^71VlreHvW90nF8jvjPq1ew|Ng)G0Exc5yk zaTecY1^i8)ok)27$s1jqSJ{`6t`veD9l{$?!+aqvBpkoP4B7`ax|h)*muPf46>ijz zKTmk0M}L|_!l3UBrfa?E{^*tH5}{9o=OeyqBH@)VFtID({Qf&kfrAb3DXK4-rRNmD z-~VRP-WM>zlB2;$7(o^LUy;sExKy89tX5Y6W-IT>NIN^>V*fY^C7}S?0Ct44!^wxo zVTsHjc>xN_+2N(eh+a1>W}fER{}CmOf*erj=6{5;XVF3BogH3uNl+?wxmgJ>()KCo z-}j`mqc8SBQvoV_pQHFCJYBxcQ1hG406lEb!fSLGPy82$lDGhh3Me5Wfbt3)J+g#0 z`~oag70^IJJA1`o3{*n)oDiTDP?Hq{-m2K;k1C*0s~FTos}!Mt&?vCsDhBNJa&|FO zC4XQl3-n~gKt{{of8GzUkWmU110IgI0DLxRIM>0US|TsM=L|@F0Bun8U!cRB7-2ap zz=y-7*UxOxz@Z0)@QM)9wSGki1AZ38ceG7Q72z5`i;i=J`ILzL@iUO?SBBG-0cQuo z+an4TsLy-g-+vjPe+`bX;s2dai14j32f@AJ%cKRt1jz?@ zL#U|&2Rk|USm`^&cIlJY7yzm-Xlmfy=y#0!&4E~S2*vpR^W#>)>m%0>%$Ld>rvQHc zgX^}zMo*T3P=I1AAa`^0Vt7;r6+mTFgaT;$FRP(MgCn~Cq(yy_v^Y<*&}9MTv43|y zb0`w1avZ=5-)r0x#c{elh8MoqxYmsYw8!6hGR<|nMCB;ZkqhN}jawKZA3#zd-|@wl z%5vR|P`dIciwGr4YLb}mHhfXd12i5(?YhG?J<}b)E1(l6`}HS@N90Uxh$q4BBJ%9s0V3F?CAJ{hTd#*tf+ur-W9MOURF-@B77_-OshsY}6OXRY=5%C^* z26z?l)1=$bz30!so5tfABdSYzO+H=CpV~aaUefmjvfZ3Ttu9W&W3Iu6ROlh0MFA5h z;my}8lB0tAV-Rvc2Zs_CCVyVS^YIEviJkC##wQ4gpYZ1D8M^Avr<`+(Zr}qtfwth% z2+uEH?AbkbnS|%(7o6=Ny=21k<^*@Ogy#pl%$~27@civTy1&uy#(g>o?nW2?n^|0E zyBqv=uQes9e3Pu6&CmlZ=^Q%cGi~> P00000NkvXXu0mjfrEB-k From 8ae4ba722a700f741c47f454670421c0199cb7cc Mon Sep 17 00:00:00 2001 From: sam Date: Tue, 29 Oct 2024 15:24:32 +0100 Subject: [PATCH 07/57] fix: don't use Task.WhenAll() in message responders, it breaks ignoring them for some reason --- .../Messages/MessageCreateResponder.cs | 44 +++++++++++-------- Catalogger.Backend/Catalogger.Backend.csproj | 4 -- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/Catalogger.Backend/Bot/Responders/Messages/MessageCreateResponder.cs b/Catalogger.Backend/Bot/Responders/Messages/MessageCreateResponder.cs index cc45edc..47cf10c 100644 --- a/Catalogger.Backend/Bot/Responders/Messages/MessageCreateResponder.cs +++ b/Catalogger.Backend/Bot/Responders/Messages/MessageCreateResponder.cs @@ -148,16 +148,20 @@ public partial class PkMessageHandler(ILogger logger, IServiceProvider services) await using var messageRepository = scope.ServiceProvider.GetRequiredService(); - await Task.WhenAll( - messageRepository.SetProxiedMessageDataAsync( - msgId, - originalId, - authorId, - systemId: match.Groups[1].Value, - memberId: match.Groups[2].Value - ), - messageRepository.IgnoreMessageAsync(originalId) + _logger.Debug( + "Setting proxy data for {MessageId} and ignoring {OriginalId}", + msgId, + originalId ); + + await messageRepository.SetProxiedMessageDataAsync( + msgId, + originalId, + authorId, + systemId: match.Groups[1].Value, + memberId: match.Groups[2].Value + ); + await messageRepository.IgnoreMessageAsync(originalId); } public async Task HandleProxiedMessageAsync(ulong msgId) @@ -189,15 +193,19 @@ public partial class PkMessageHandler(ILogger logger, IServiceProvider services) return; } - await Task.WhenAll( - messageRepository.SetProxiedMessageDataAsync( - msgId, - pkMessage.Original, - pkMessage.Sender, - pkMessage.System?.Id, - pkMessage.Member?.Id - ), - messageRepository.IgnoreMessageAsync(pkMessage.Original) + _logger.Debug( + "Setting proxy data for {MessageId} and ignoring {OriginalId}", + msgId, + pkMessage.Original ); + + await messageRepository.SetProxiedMessageDataAsync( + msgId, + pkMessage.Original, + pkMessage.Sender, + pkMessage.System?.Id, + pkMessage.Member?.Id + ); + await messageRepository.IgnoreMessageAsync(pkMessage.Original); } } diff --git a/Catalogger.Backend/Catalogger.Backend.csproj b/Catalogger.Backend/Catalogger.Backend.csproj index 436899d..b6fd02c 100644 --- a/Catalogger.Backend/Catalogger.Backend.csproj +++ b/Catalogger.Backend/Catalogger.Backend.csproj @@ -37,8 +37,4 @@ - - - - From 735c71b6f75f4233dc7272d35835dbe5e571240d Mon Sep 17 00:00:00 2001 From: sam Date: Tue, 29 Oct 2024 15:34:17 +0100 Subject: [PATCH 08/57] fix typo --- .../Bot/Responders/Members/GuildMemberUpdateResponder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Catalogger.Backend/Bot/Responders/Members/GuildMemberUpdateResponder.cs b/Catalogger.Backend/Bot/Responders/Members/GuildMemberUpdateResponder.cs index 4a6e6b8..2440b83 100644 --- a/Catalogger.Backend/Bot/Responders/Members/GuildMemberUpdateResponder.cs +++ b/Catalogger.Backend/Bot/Responders/Members/GuildMemberUpdateResponder.cs @@ -332,7 +332,7 @@ public class GuildMemberUpdateResponder( }) ); - keyRoleUpdate.AddField("Added", value); + keyRoleUpdate.AddField("Removed", value); } } From 225c162603f7e9043787166eea078304c68b41d5 Mon Sep 17 00:00:00 2001 From: sam Date: Tue, 29 Oct 2024 15:51:41 +0100 Subject: [PATCH 09/57] fix: fix invite renaming --- Catalogger.Backend/Database/Repositories/InviteRepository.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Catalogger.Backend/Database/Repositories/InviteRepository.cs b/Catalogger.Backend/Database/Repositories/InviteRepository.cs index 9ea7382..da88e6a 100644 --- a/Catalogger.Backend/Database/Repositories/InviteRepository.cs +++ b/Catalogger.Backend/Database/Repositories/InviteRepository.cs @@ -37,7 +37,7 @@ public class InviteRepository(ILogger logger, DatabaseConnection conn) await conn.ExecuteAsync( """ insert into invites (code, guild_id, name) values - (@Code, @GuildId, @Name) on conflict (code, guild_id) do update set name = @Name + (@Code, @GuildId, @Name) on conflict (code) do update set name = @Name """, new { From 87b3281c8d72b041681d92dc09eb8814c65aa38f Mon Sep 17 00:00:00 2001 From: sam Date: Tue, 29 Oct 2024 17:23:43 +0100 Subject: [PATCH 10/57] feat(dashboard): screenshots and text showcasing some unique features --- .../Members/GuildMemberAddResponder.cs | 2 +- Catalogger.Frontend/src/routes/+page.svelte | 58 ++++++++++++++++++ Catalogger.Frontend/src/routes/Message.svelte | 2 +- .../src/routes/Screenshot.svelte | 32 ++++++++++ .../static/previews/ban-dark.webp | Bin 0 -> 48856 bytes .../static/previews/ban-light.webp | Bin 0 -> 50304 bytes .../previews/configure-channels-dark.webp | Bin 0 -> 140792 bytes .../previews/configure-channels-light.webp | Bin 0 -> 149932 bytes .../static/previews/delete-dark.webp | Bin 0 -> 42386 bytes .../static/previews/delete-light.webp | Bin 0 -> 45266 bytes .../static/previews/edit-dark.webp | Bin 0 -> 47618 bytes .../static/previews/edit-light.webp | Bin 0 -> 50180 bytes .../static/previews/join-dark.webp | Bin 0 -> 79604 bytes .../static/previews/join-light.webp | Bin 0 -> 80934 bytes .../static/previews/keyroles-dark.webp | Bin 0 -> 32904 bytes .../static/previews/keyroles-light.webp | Bin 0 -> 35182 bytes 16 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 Catalogger.Frontend/src/routes/Screenshot.svelte create mode 100644 Catalogger.Frontend/static/previews/ban-dark.webp create mode 100644 Catalogger.Frontend/static/previews/ban-light.webp create mode 100644 Catalogger.Frontend/static/previews/configure-channels-dark.webp create mode 100644 Catalogger.Frontend/static/previews/configure-channels-light.webp create mode 100644 Catalogger.Frontend/static/previews/delete-dark.webp create mode 100644 Catalogger.Frontend/static/previews/delete-light.webp create mode 100644 Catalogger.Frontend/static/previews/edit-dark.webp create mode 100644 Catalogger.Frontend/static/previews/edit-light.webp create mode 100644 Catalogger.Frontend/static/previews/join-dark.webp create mode 100644 Catalogger.Frontend/static/previews/join-light.webp create mode 100644 Catalogger.Frontend/static/previews/keyroles-dark.webp create mode 100644 Catalogger.Frontend/static/previews/keyroles-light.webp diff --git a/Catalogger.Backend/Bot/Responders/Members/GuildMemberAddResponder.cs b/Catalogger.Backend/Bot/Responders/Members/GuildMemberAddResponder.cs index 855affd..b873efe 100644 --- a/Catalogger.Backend/Bot/Responders/Members/GuildMemberAddResponder.cs +++ b/Catalogger.Backend/Bot/Responders/Members/GuildMemberAddResponder.cs @@ -126,7 +126,7 @@ public class GuildMemberAddResponder( goto afterInvite; } - var inviteName = inviteRepository.GetInviteNameAsync(member.GuildID, usedInvite.Code); + var inviteName = await inviteRepository.GetInviteNameAsync(member.GuildID, usedInvite.Code); var inviteDescription = $""" **Code:** {usedInvite.Code} diff --git a/Catalogger.Frontend/src/routes/+page.svelte b/Catalogger.Frontend/src/routes/+page.svelte index f0bed2a..8d3fa9f 100644 --- a/Catalogger.Frontend/src/routes/+page.svelte +++ b/Catalogger.Frontend/src/routes/+page.svelte @@ -4,6 +4,7 @@ import type { PageData } from "./$types"; import { Button, ButtonGroup } from "@sveltestrap/sveltestrap"; import Message from "./Message.svelte"; + import Screenshot from "./Screenshot.svelte"; export let data: PageData; @@ -68,3 +69,60 @@ {:else}

No news right now.

{/each} + +
+ +
+ + Catalogger will ignore the deleted messages caused by proxying, while adding + extra data to the proxied messages themselves. + + + You can easily configure Catalogger with its slash commands, or with the + dashboard (you're there right now!) + + + When banning a user, Catalogger will warn you if they have a linked + PluralKit system, and notify you if another account linked to the same + system joins. + + + When members join your server, Catalogger will list the invite they used, + their PluralKit system, and whether their system has been banned before. You + can also add users to a watchlist, and Catalogger will send a warning when + they join. + + + Catalogger can log edited messages too, and ignore the pk;edit + messages that made the edits. Of course, this also shows the system + and member that sent the message. + + + Catalogger can log your server's most important roles separately, and will + show who gave or removed the roles in addition to the target. + +
diff --git a/Catalogger.Frontend/src/routes/Message.svelte b/Catalogger.Frontend/src/routes/Message.svelte index e07170f..0122f57 100644 --- a/Catalogger.Frontend/src/routes/Message.svelte +++ b/Catalogger.Frontend/src/routes/Message.svelte @@ -21,7 +21,7 @@ : null; - + {@html content} diff --git a/Catalogger.Frontend/src/routes/Screenshot.svelte b/Catalogger.Frontend/src/routes/Screenshot.svelte new file mode 100644 index 0000000..623dac1 --- /dev/null +++ b/Catalogger.Frontend/src/routes/Screenshot.svelte @@ -0,0 +1,32 @@ + + +
+ + + + + + + + {title} + + + +
diff --git a/Catalogger.Frontend/static/previews/ban-dark.webp b/Catalogger.Frontend/static/previews/ban-dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..2659a5107f8a92175f776c736facbe06e81fcf48 GIT binary patch literal 48856 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 C09R-L literal 0 HcmV?d00001 diff --git a/Catalogger.Frontend/static/previews/configure-channels-light.webp b/Catalogger.Frontend/static/previews/configure-channels-light.webp new file mode 100644 index 0000000000000000000000000000000000000000..97032fc8a6aed0af815f20460ddcf384ece683d0 GIT binary patch literal 149932 zcmc$FbzB_F()Qx+1cJK+cXvo|cM0z965QP#LU0cnoZtk4Yl6GGB)IIiB07SIL_kQ5bFC_n<8 z0+0%t-O)X-WT>v})4}b|E0x%dDIoS&ks|^NkTI=aWVn`z!X5Gw~d{QYybdoF3|bCk-eic007Ab(v!J4+ds(~ zAQ{sU)IgAI{Un?Hl>MG$!=G}}k1{GsqM$M*001nafq|nL0DxEr(i6KHnSts-oCe8E zw#F8=p#DRGWC0r+J7bV629l{kW$Z!nQ~g|qf2zmqPqKl5;jcOk49tGXKl=i@6ZBv) z3nzPP1CJjkPv-zJfCaz_U=Oec7yy2$f4}_y|9A!n{k;7?he5+Sk?_as{H;k%DA5p4 z=SEH@pfLgfIw?SN#o7h*&VGETK>rcV9VL`N$LFB;wrOQ2{Y$nrl#~BmZ}H>qpJmKl zBvgOb8##%B-sexfleMzs@3OIhnDpM^WM5^#+b0>9=}ZtWw4#$5E5-qA(r zS6@tQ#YKKEZ|eB!*EsyPDt@%z+(Po#z0T$;62F%>GWetYCbq(V)aj)0t8K<6VlRI$ zZ(^(ZtH1WnBEOzxZ~bGf{&<#&wfHZ+ldJNtdz~Fse(CL<6@HDOrGeDbI{a}jKm=d{ zumvarhymgN82}6Dj~&1SkZ?9}2dyChK-A9O!_mUb+?iO|-rm}TSkl&rfsUAkiG>XS zc(Nf+WdMM0ia%@v7}oF~I=dXu(z*ZuAmaYe8KwdNjiI1N&;6kz&jtWcf&hSq9wQe= z*B{jZAfFCUAnSwzvQ9VvLI4?n8bA+f8wY?FAOv^`kOIg9Q~;U)U4Rk59AE=*1h@gb z0RDgwKqMdzkPOHGWCQX6C4dS*Euazb5zqzb0}KJi0bc+MfK|X2-~ez6xCGpRfq}t* zA%S6l;eZi=QGn5cv4C-b34px>lL1o#(*)B8GXt{)a{==L3j~VjE19n*f^wTLaqzI|sW3hX6+e#{?$;rvzsN=K>c7mj+h>e+_O1?g0J7geZhOgcgJ;gd>CxL@#XL<>Ye z#1zCT#395DBs3%jBrzmCBrl`{q$;ElqywZ6WE5luWC>&gWH00toPR6W!us4q}kP?ylq&{)t^(45c`(3;Se(4Npy&{@z`(4Ei| z&>PSfFfcGUFtjlIF!C@4FwQU`FzGPwVLD(YVYXndVG&@7U|C>a!D_+U!Un*mz?Q+b z!%o8Pz}~^3!coBSz{$fI!+F5P!WF=^z>UFe!QH{5!BfHW!>hns!u!Lg!B@h6f?tIH zhJb)TiolJah+u)>hmeL)jqn*^4dDh69gzl66j2A!1u+J(7_k#^4)Gfj5)vhn5Rw*> zGg1svDN+y8GSW3N1~LP(B(gEGFLEYw1M(#DF$x?C1&T0=F3KB}6qFArViN|TgS;B?HrNLFi zb;Es!`w90D4-=0U&j>F9uNH3}9~_?sUkTq6KOcV>|AK&!K%BsyAf2Fx;E)iDP>9fy zFp038aE}OsNPx(KD2b?pXrK5Qu`sbUaT;+i@hJ&Di3EuYNiNAK$sH*bsVZpzX%*=b z89W&mnJHNkSvT1!IT5)mxfgjk`8)+21s8=mMJh!<#T6wLr8;FOWh3P-)pIIIsy9^S zREyL|)PmFw)Opm?FQ8v=y|8+b^GhCQl z3S3cKpShv9MYw&rKXTvjaPTn6Uzxose|0L(F77GbDFG!REfFsBv~qXD#a<~E!8WHD6K4=A-yg` zBjYI3A`31nC7UR_C`Tb@E7vFwke8HClwVSyQgBdcRfJYlP|Q@^R$^B2QtDU6P}Wl} zQ@&IYQHfPqP^DINQSDYkQPWW?Rl8CbQ%_J|)nL@{))>;n)wIxT(t^=a(<;)s(0-|% zti7eft`nm3^)=ON_tyiuxVqN5ZF(qr26`X#q4d@D%k=LJj9k{wPRr5%f$z?@z?H92E~z}m12wM($e znyY|ort7tvn%f6=G8x3a- zPY-{LFpe0EWQt6QypJ-98jNO+PKyS{n8u98a>TxigO0O}`x-A8Uy^{9@Frm+Q8uw5 zi8v`D>3gzX@<0k(N_HxIs!Qr>noL?#I(d3r`hA9Z#+OWy%&NEeZ^PeSWf^Bpz7u*^ znN5%#nSGmMku#esp4*T|nU|6eo$s2zU7%LbU&vKhT7+8^S@ckBTfADLRMK0@Sz20# zUlv;qUhY!9_g?4yc!gL+Qzd<6ZWUHlWHq4LrFy?czvgSLbZz$st`C)U6m@UwG3p~4 zz#2RnP8-b|SDQ4OCYq(1yIXi$>RTCFi$9Wl%xrts7TXTr9@Gx(c++vwY2SI+W!AOP zt=GNKqtP?ntJpjGN&3_0zE^!c{lfhnpZPz39N-yf9^@Kq9O4*i7-k=?A7LMpk8s{Ewnc$mfpA?+zni8Apo0gm&`Xcvb;;ZV{*%_Ug)mh`&-8t*Ivw7F~y9K{R zsKtmS)TNYV{N=or7b{h(9II_>Vr#?e%IgaoMjHp4PMh~zLEA{%DLX_vrMoPtG5NL1UXz&9IK!E;(o01OQ0S001aK^`qzj z016;)Nrf8#&dU1h`{Nc67XINoJe|Nz008c}pmHxK&ip_=#D9K%`V}DE@9qBYBd9m5 ztRV38Uq_JlMqJAQ4uUA~Szt6muXe1`;Ba&W8-n=4aY6YvEWTdpKrlc+v5(9>e}v#2nARQOaZPumR|vZz*(Y; zj^ma3l>;9+Jqu!C=y`G=mIB>*g)wlIp8mM zQP9NK%D4GZ`;%S~P!`zwfPJ@O?3?WU@qzP7{#*8yZ}0v5!_@=Ijqi8gZyhzaj5jkU zD<{4qkHsuho0%JwGJ&@|2^JZ)z z+Z&h-EPv#j?wIl&^!*CNdHirCcnEVdc9nha^U=2pxCVr{0!}i1%RUF%2>^gOz&PN> zWBwydPwchcgW!^H>%+no(yi~E{3GxXxZ)M=EB5#R%)Gz4jrBPJ0`CM+9>4hlfmuM{ zR{0eQ5cn9Mo66iC9&!2kyC_#FqZ0v>!D4gtBqKsrdS$HF+n1a5>=P%6VINasabY7# z`LR2Xb^2}@{Xu2E>p?U-;qA7=IBs)Jcp+~M+vQyo45h8SJmm$|7`f`yoi`UTvApvT z>*dn=;5T>2$^zki2tiPC8uN<&9EI#SOiSsA6yA#SU^ih4>kX;5rKU>dP>dOCiJNC= zB_qRp)VN#I1hRj`2;mmFXjo!FLid5GZ%;!;&r!t=l0c3&T{5iz&w9%DC|*4pPKaOx z=NDj|XB;b&6i&+{q+$f7M)wPvgP-3ZiSOwaFW7A^iZp59%>_9SMwBToqRdOXQs6yr zA%F>^ZpA2J`yJa!+kHd zR(&^}D(_%j18nV+SWM$GkIv<6KFoBJ87~cNwuw~R#VzdxNUX5BetU?>HeWZ1*$A_*@AX zw_cqKCrV;PRRR?ev01mN7s#S#XoKI{Dst0k9yAJ36)gc%FH;aFWHzfGH&c#UYe;*s zDQ_?g<|L$u7ejM}L}5<+v~u!)b?o2YX@gm(5%Tf{UZ6`Vhfp#Z_p0~7*EMmcE~cLM z-GhW`3OmP9uWyMKzLO^|vdHid<=^RYP5tl0`14@?@yzULuuo~y)f2}R_QTe2`^97o zt>?PTq|{x9c4!5`G9z?kW*(bREeo*8}5(Q5sZx$Lissm*UhEDy#lhZEcM0r%ATg&E<)q5 zKn<$0a*AF)G0CMfxx}d4ka3|>q*w|HTi?WYX>XHnQBaZcLQ(vUV4yb4>@d&K86%ZCImeagtZDpTcD$k~vBz_uFF1Cs)MiADLP=`_?~U`_WaI zClme|Z8f@gLywIiEHe_7aCc1!u|!>VK5I!)(#CB(-AHS zMgiBDnHr01gtNa4&7b@B$9(!_mtN1)&z0}qKG3cGIC$36GkCGHg8YK$CBQ8Zi8At*EUS`aZ6M_3#Nn!nnpDFGWsGlB=|^5mjI>VkQlO zV9}rL>(6c7h=^W9Dm>)-&CL?Q=Pq!?h>5e6|6z>(YK%~N$o|HFb3bld zC_L`<+F3DP7AG0q2r8PPlf_oEX_ixZvoh$T)NUYiU}WJ|U@Nw;7O3*uSVYqnMGqD8pCz9DJ0lY$z@ zFEqOvmdgGncCr(t+g=3#qE4>L6?LTPt+vR`88SZUz7G701L7jvK~I4zW8+}FXkwoz zn$@H#N%D@1^~Ftsf_0eox^enkaV0`0T;w$pm0D?<1AOW>?i$>=Lb2^khl9swIhRUe zC5n{elFESs+<~#KBrPy6KvWloa}Hv2hn}?e>U;=$(KPU1>0Xe@8pPcZysl$e4me z0k}ExSG43~cbB2`w(6D+;4dp@FBH$t9baBwxICZU5R){bgb9jk%Hi0&dQlL16D7h6 z?96z+ZPyQrALn3KUfJV8^-hA#cUr}i0D>@7J@A-VzCa71)bAWPYH`~n?vdDNbo)lR zi-)o#{4gA4npgpgX%PN{6qM*6yWDS`Gxv_k`EdIL3I1}sC$pr;*|j3YM3yvD-H2v| zmpIOD_GGF|W&m3M7aDM*N2!^{@|F3C4gO;?{HVLYMh?um_@BW=UozcaLye!+WlPyG zagm3czTY>bKWI0AMr|@VHlcnz8#ld-Vila?iIH_Ip;7IUs$q4aC?eXm`=*D> zCKwaQqD1x1=aVXVqB5+YA`_zZ$M5ko zDtG*Vk#|Zq_*G@*#EgpQ*}$d`E^QP2)YYG`#ea=+ve78hGk_xXjuDG$Y(l{u`c|IZ z(%a`4oZl5v zM>KVCXZA{m7i`f06P9$|iWAM87%;o7vwf&4@@}O&` zo<{YhlUesPAJQ-@sERi(5!9H-xRkl`45fs{UZohT!Z&sPvYHz#)Z#HUgIux`2$qCw zY{Sn!@VckRZcUQ9RXeMCirJ`uVbF8exv0Q_W?M{)BV?doIh#dt_4Ty5^LIXIO#ZnsO`(?tp||DCC;5EuZIo#huCw;(Oh-F5ElD(3 z;aSs#e^@Qe+70dB|8ce4pCD$N_-EP{)0v}OSi8!W(l2>B$UvIY3 zc}v-bZA(gWv@LdKyfHi*r^j4{Z=pd_L#f+N{(*h!ja`}p%`^66#T$632)h3I29=kt zCHs2QG3ec?EMjUbtqI_kxNZI9wKqNlQ>Il7HGtF>S2!J zIhWT>BO9PT%LvO2=9P37hPRBa#f$x*mC`WY6KU++qt1uFM?1u%8tC#uyxaHFDBdU0 z?3F96w>=FJq=jSnreE9bM5Mi9(ba&~uCl2762+vbz9)v*-=7&as43KU znTER@!z4^c-$uzUPP)3jnkdB-+is6dwS<{}nX`R}a-oACYH<|dLa{#^jK9qYH*!|U?rL%el# zT5DrqK>$^dd*=6uH+7q;)?s>tzf3Ib&dEI<_Ke-)pigRV(5`p^Z?|n*yP%LmBR^^$ zM1vSl4!Npe`HBguUjC13_iM`ERI|UV@6*DK0EX%r@-`Gayt!*>EBDqs;0ep~?w)38 zXo5utp#%dC*B!=sCjZz+*$gvS+cI&|Nng)O1aYin{72@Ntg{hlcXZgh$?Rswbjl08 z`jtdagk_D%?NKBG4HEUN%Xlg>a-^jl^etai?h(atx<2F9S4a(R5f{!@ z=8}H_Stw**o8@s@6ps@ZywW(N?YPaA2{0v1`6BRo$L@+@$HgXr&4=#-*NI&2!DS-2+LSBHIGUnR74&ONxW(N(tlU~#X}G#vlhpA zMQJNIqCCD;d!ByHdpsh4|sZFionn(3N)PbJ4Y*|QoT80R zdJRJ;fSsJ2AopZ*0CnUqp~O#%>W?;eNrHZL=pE`_3>u&3e7`~A7e6jn?=%ir(%&tg z{6JYgq;7x3JNz~|)sDP4q)ETMU5<4-bD_;J6r5!Jihg+3m*&Pm@|A4x%skUP0I3&^ z2ThQtw4kwb=84$2344A{{Mf5 zT3TvOdUJAWHW1q{2HC|p)<~oA?z~HS0LjjG{fxni6!r-kQEgo2+-QUlp?7 zylAAww^ts8@R1dU;K3Mn3jsCGNF;x;;0?!6faJ^a=SoG;)vG3BnO_G?xYBbPm!UCx z#5|q}WujS8jeg~aCjNtW>(|)G$rBDr@XMPC8%dTPj$7T zPp7V!f43z`R}r7=F~Fy`*c4paqv9o71(RbA0~ZsD{C;ahxU;m0cd6$CNQ1xahC+GS z{QY4lZPdDr4)a^8u^!lJ$heglA$O)29y8O5VuielG{3Mi&cK7_k*$NuQ#W-Q7}g6a?UMVwKZY z1Zp;aA{vIG zAO$0g7-*3(?t<=DbeJYZ(_J&d-e!}b343h^1b z4KbSe-iCX^x66xj3p-_H>osb)klp^Ax=zh2t>>saA|bz|tFo*67M%S`d|3%0LAWR3xjaFLP>wDi*GA;P z3PK(#0Xs7yH<}(kKYAlZG&7S0rU4YpVd-}m^K@b2KEc=|6hc0=H zL+OnwEr8wm1KUC0n7haEdSQrE zTY`*^qWXk1ALv>rhDG!MduuzkTW%BPHmx+^X7Iar4U<940cp=)`dwuaorBimzq{nP zP_cb5=`Sw`5cF)EjPqyk?AD)i?xI{>EmBK+#fS_tcsT6JaHhxG?(? zMSI;ZkeYBUgRKQ67+m&#WwHp&(~7rFo6Ou7`$Eyu-9`=~0RwQ2YhrLDJmC(Z3w(LT zKEGj%{`5dqQKge=evv&Og*w9W!R(sa@~b#Rsi<|&-EExtNIz#H!g_+cgQJ3sE$2%U zbDNM7LOv|o$e!$q*Ngk9o7m}Rw`5`ZUof(8sE#;W;?Y7K*DF44^4>&zS&Y~E7HShe z3|q!Y`Z}~9_JmV?|mC zZ*RSu`C?ZIoNBvlq}#-+fSLtmYrfOkHyEq)n61?8iP`>}odEJy#SGQ)j4OFvCfq;e zVCQ8-;#HUqGTED0)q`$M_#2&L_Fh24T7yBpN$y;a%I5(!V9*q5CqF{znjT6PP;ELi z=LOap3|UVby*Ja*sb-V^5b%zt|Jm*KG|GMz60=O9;{>U$ZlT|fIYOVto0l<&crzXJ zx~+C8Y_hXs_3iQPpPEcN`91l>g!C$uN=b*I2Gh>B$0MqQTHKN;&kDeH1I#yM$gJta z-f?zO!`pJW49BWxK=eJtju%U)BwWF(M<$&i+iuUpm^a)!-}# z0%4&EqGz4O!d8u<+hxZ8wUm;Nn2ep(wc9^%j{20D0e5ZXj_+UjD`*RAyKQK{$U9|Pcu1W*t#Ss?~cNH4l@#^4G@1d&7CSBI>z}Pmpy0) zI0oz$h)*2ZM2s%C%;y`$ORUhiz%4KT_>qK^-W{DX&5aSEsFZMgB6I@#+~vF|+i-^( z7m3rkcK&|*+i~wYT5>S!RZ)LI^~lK)O6F!R`<*#LZ=F$&sAeVZ>=VHO3?6gPR^sAC zHB8*uM4ksPz$SC=8af$JKzPhtiHhSTtzmH=DTud$w+qM4Sw$2eojoR*xq2crc^*+) z|C;Cf!Hl>ktUtGnlEXt0mxyJD(e!VDp(g1hZO*OYrJ_yk=|vd8)9oDYK#pl~^%2!J$6qbzvlkVdm02dOVHJ&g_BRGuu7n zi`KyX>VO?3NcYt>t4IzOV{FrfLxu*a0KR0q7rCDodQO3($*2P~FiiJiKatyCQ@0fh zxbgzoQ+WQPoYk0epHEsXmOPk0@HrG_aB3V$V>z_><;zLPgxtvNUbRw=KGd{FF5+IN zi<^&ac!G(wNGWb8C_XVr|AyAM(eVBtv|2j1P1osF0jE!1+C*T!f)hU z`{;_k&th6iJ!m|RFe4xc9wcgyNwcRcIRDArvMH7#m24S-njs%vvMMcFuL6gMS+r23 zQ6rwP`3u3wAzJu@x68BuvE3I?E~ELQbeqCu@JM&0{^v6RP68hD$fwfY&&&>H(UwtePIug zgsE3Jr*Vy2Xj-52;|UVtl1vctkW|i{x<#)d>|LllF%raA8l>PKIa?i(5u5G^+CER% zuQIE=<}4J{>&7+#0i+*D{8tp^S9JFTUG2*Pir6dEE@PN03_+YVOWN9Rf@-hrZ>>9Q z>3m*{N<5OQXiKILK`M9jjt|8jK@#DJ%2okFkH+Ud6oUs2nJz??1YCa4vng!j!A&jt zv@>jV&6<=g6_WS(Y&X*2Os1}ahv}6Mh~j#&-naeHf_S9si(UFP*Bf8k+>f2Q$U?+j zV;W-=OYnW+`qM`xBkY{2APk7B^5Gw%9pK(~QKITJ{5LL{k_E3)DAeU$D z@YD9E0Ahm4((?9vw3V{wA8~8r=W@QqH+$H#@7p=NoymXxu3&9$Fjoa?$SDTm@$39C^@8FU@d)ji^?iNm838l(xd$W8SmY>%L9t#ZDS7Ec{t#%zwbR| zbI*rlb?;MW$|E;+Wf;^v}}h29CN+PWoo7I zB0$k89C5aPip9QJc@xLET>}8UEs$$Zcnv=xu36;BPHF&K3)p@T+`lmrKC`mu_a(2T z8g4|H-YfFp>nIbgweZ{>k?tjQJ0uj;cItF0QpEUL??5NQ=DZj{vk+m(`;3JQKrw1@ z7vfWBmvMYtrY|B7L1Sn^CC}4cyB<|tZIy5j8z5%TZWUVkT+Zy`!z_AGCG1ce{Q;gr zk5MSPT%Ww*9rHyn1Rnz_&M|dtWf>>w#G8D&3>~hGNn-YbxrPZh1T2yc zRZacb()Me0^u{LKVkz}?q~}`n%EMpdH@}D9O4nl~A}NFHl`%V-KA5&}ESZNSQunB- z8oU;Dxvap%Alp+ zIs9nk0ChCv#7;OjzM^(0Qr1ar$z6lp1y@a<Y88Xj-twr%AxnU|Dg5;d>7jEW;GPpM86bkK!>xqK&hu?RzQ(7G_`vh)jeOfXhv7W z$5f(SK_HoZDGWI3`+d(_e03PIM6ERD%R$3t0Jlm0{`lL+V zEm$yV3T9FoZ@viTG|qk#f2mRG*)@F49kG=E$<+NDHLZOi2zvipSkMYx7_*y{?;bn7 zXd}azE=XlPwl-tqbAfpFJc;F2U@Lger)N>ex1{4Njz%q`Ep2vF33# zyOQ#&_o7}==S@gA&*sYH%-UmM%#*nfd&FY=K=3u>Rmy^d&*etb(Ce~yRfxH&7vdd( zmE0`JP!u(2t?2JJe2sX_P687hFhZ!Rt6 zhW*7z2Ar`b0*bCfM!&nu3-s0j4mxKjX5?`6$J!F9-oubWf=!G#0&@*P4Hs_omJxm= zhr8pNE2Dl~&7fO0?{{zor!S)FNVhta%gZnEv1K>}H{G(;N2d%bpbGV>i;(nCf;_6n zLMsk7DcP-va*y60Qiw8eD2lJwAUR)qBZ=6UXe3;E%LaKl(_w-EZJ)(u+G}}WuA#!N;M8cN`i=ve+_n@z1s;eTlmhvM#>^H2nrU*h9M>jtmKk|)Jf`3Tt~IP zQoiT%{UYrXsMz_+_r!_)bwqh6Z31S1VCRIX*RwnE_f=f;+zg50x3n_Qm@>td*~WC` z>zn)rO8(94`UNSVD%aM)AlF|mW;5Yoh=%JZ--h+5-aZ=NDy31NP5ic3p2=TV)hVGS zwIoz|Jm+*M);$#IiF_?M%Z67*5MNhDqjb&i)3zL+NYfv9jdkiRoNv1GR1sX->+wy? zq0`GIsVYxzzroq?ed`qL%YMFf@(sj!G5XJ(2LHo;?Ae=S?JVKY|9s{}bgoC+tz+kM z@3B!Zlyh9mZyR`1dh&)y(^tU9Iz#l~!a%(5t{-2;d3F6Bg?v^K(|q10#k!K`cQK$3 zK>&|zMw@*2T+u(SS6M(?9~8adobWt?Yx{fBsy%#QHzHPFc-g!dM)MQChrEAUxx_@sA${i^2FiJJ` z^_?H_ipsLt?b6X5C$92h_K=8^&x-djwIL)Q^HNW(%IYc$VI*f%8oYO0aCPPULMpQ+SU(~y`?$fW2NOz-qXmS_2=g0>`|y-vX>WyL8wPlDy)8=8Vmi7&sOUcr zcE9_r=~cy>^p4uvfbkRAmo_bs#d?- zQUdC+9z+V-*Ntcff#tOX<2cCRr*xn}L^7_u;@5EltVg%#C{D3YrK;8tYX3f;fcZ1yKY#BLeRbhXlN!L$9D*|z?I{o~quil51+|2oEeQ0{eZq!RqcTe#byE7BON zm#xdjK6Yz-evRbtrrtML5ak_ej>m zs~briCe1zLg!aj&Urhp=3h=nTtc=ojXL!+SD?l)u@-l1#_=ng7tbFR8<<<9{T^NlJ zMpoNgj-M#7Q{jTRppWJxXT==&A0X+*6hYah+4dEDo5iO8_~j5C?0sLk4~vldfay8WA~%cri2`WH?JRf6yW&qAU-7LeYqMh0Vb*TR>0gDdFu5%F)4q?LV~fC zjEXDdzL_JIr~f?dGRy1aU5q`|z-L!fx2sl5u1+v3b}3MTdznmDgi*Zcg(oS2ZDa_s z>r`=|EK>Ef$n7lrxAauuws8mN7)@d3sbSXwoOhUSN|qx?G9Wu~HQmEf6F;V#E)nQk zqww7JG+H^=&f=OF>&GLS>(U*%TSo}nam>JG4kk#+m4t6ZGws3v=N+mwokZielH#^P zu{X8lv0NX+850wFX6ER zR_>fGj@QPBFzD#5N^##C%C96T?bmo+H|yz8D9!zMy9j9OpqktxCSkWSe{ym_KCl=D zA3h_WLlJ@W;)W53F>3py>S1NqB;3@WyCu1=F6FcO;Li_B$?B|Y4%(Ky(krkUvR#EWc{?Yh1oh0gqw^i=X-AmG z>#{O@Lq^X6(pISa_qc8nUnB2az2EcTK4(DV28BRJL<8O#G`VT;4qKFVT)x7V7q#s+ zbztfv{!}^|!D+mkH5;N%%f{}gdpzNy8&UA^x-0tVXq=?H%hDy14dbpk-%Ix#&<-8k z_Sj)m)}P$y#X7VlgKlBge7fcO6ioYl`~7didrQ+(#yVmc41Qg@ko_$|j%4+f;*H*e zWg6Zc7@tRIVil|Dj-N~uVHs(ry z;$a+$h8}PY>@=}Utw7EqdZ3Im?UBc~2=(BXHmjFPi`rAX1BD?n2>Q*E(|M{jLj1Fr zZ}Vw9ZUbFMfOW|j4d7~D%Fz9ow)tZe{8#083bkxEDr5JSxc!j_>rE0LGcFBcccJdV z?&lsda$a^1uDHEb8h;kRuM62r{h;{Cltxr+pht!BAMzq@si@*e;>40Do@NpV2>J12 z_E+21zHrXeLeKdS8M5c1d-#)?k(ZKhJ&*jRkMm{A29y&MK*CqIyZPgufXmA`q;vwm z`5AHh{>Lo^4daNfp4+V*2fZb~1E2qWLFezAN@;L1PXf+)p7Q$tMAkhd{c7)QXVgCg z&UFl5f4`SR@e1gXh+t4qcOITmx(DMPSf-&^W=j~((O8#cui99nJ|A> zojU-`EU!0QcjTsE?6>s)r4o$}8uu6oafj*I{F#j|ZNuf3nDuwVAD!dzc10Ar?_}Fw zLNyT<8P>T;$|r%%rnziaJ4rs{ru}xY3*P!(V}ZJAY%FUX$+$G=N6cO(9`S#B`^!;k zLPIN_LO$w-67M9Sn}2aViqh?_Dplt&4%RI~YT(6O@BHDT9j0j*tdEPY2f3k!mD3Hk z95_jKur&l*qk=N)$e_Pjdy{%nSF>w?oT<5{kK7XT_<%$K#-73yTh41b8UgwgbQAo- z*k|Q0lTsooGyq-IE9SOdpg)^~2TNaxTlS=4ofZ{5FHNGn?zQ`=&D6u#-Q ztrog<=4V9ew8^qJ=qq8H$ha2SuW13}K!iZ4%}#&&V2SKG9B!PnzY`GaPs>+c9iMsV zSD|OT^iXP8l$w}-q!MXV?)&sI{*`rSB$ZNw-F0+IcXt^7w2vxCPVqOFs(){mB5*KD(G?Z@0|4On`Lb^guV@=%k>(lWSV zWVXP~Uo{`a4LfuU(;s0dr&)SKbv{4EdR8>jQhN*I4q#D%AD{-1QtDZB$QiFC)}qns ziTVL@87p3Z@LgrDNQAS9ueE8!s%vT1DWeuEVpTZX@zEhJauM(PBCDC2RJF|qv#gDU z`ATI+9<__DRS&|XVV2Rz>Ebu&C_8@YI8XB^C3JTGFY~E?BJN3!pisyxn50f9rk3=m zQ%_c~rT9J!8XJL?NjZK#x>JG%bvvA4Z+#AdBiqhCJBBz%PnI*xr7Dif85+{AQDU&O zU?R2a+?g11w?&Et9mUr?V*r=-eSylEq=57{!QDz+r|j9;8z4u)hD9VjC1`oK0B6`N zGT?)Nz3Axi)CUe2mYG~Ex*XFbUN0pcwCp!GNr9jQt#(*2KcX)b#9?*n5jA#v9ng_o zTF+tOwIT9SzcFDjB^b`4oy};aD!dOf(`K?BF=ZH}n@|=}Qn8IL@9hWH4jXB!2s5U| z`qgR#i4jT#6AQPdPO@TG*sOsvjw$PhwIVI@4h56fCc$s{7#sDlgK=_t5fSCB>WoQN zpK)ZBLRUnPJ91*Ll-jDkT1O&1@BHE1{2SSLkhBa@g6m-5?6bt}NluV=)15ZrmuXsT z>nN{Jot1z*MJ%#f;8R zjC9PZeVRR>-;i{(0;0A_aaJEH{OAm#u-|^4Cnt{zE5nnvoK51;9=!MR+JADR$%P<# zPvoHzoLYv6#w5Cqu!u#&iTLrAFy25_~M;+bh@o(+3{8JvFY8@ z?mu|Rv%lZ8&gsCmdk#ur=n#?Qr*1CSr}vyhB|!N7Hw$=WlwvCxntCh8Wm^G|1&x>-WSK_aG7zKUcwFMJ;H$?P!o&-Bl`UG)vqj0F&dL(*P^5Gm9*|rN}+0B7^tdVfqL* zP0tD``ShZ4_k-}cgtp(&o*q3R#s7prUbAQ$9&ClE(rq5g` zFX3x9Zi>Y)cJVYlKq!B58O0NfeB{UphbVkKRJK;sY~ez~rJBVJM62&eN_)#oDJBuzirqW1iV z>9>g9pFJM74&r7H&4u^aOmK_t8ajyVKPz@5)8WC=YJJT^%4ugozp#puK$A0d#=lpa z|Mo57a{Tg3rPdV1JC7B=P-+ux%P@*oxz&2@H)+8$&-=Mv5%t!#+oZrn+0M<56jFX& z$Pk)-xOAkB?slv0AS8+}YeAKDm{Sc83*@^sFL}pQV9!T}TUY_ev_hahJffwtf~k|A zIeGZ{LZJi9?FL%{>>CA-$&nar;N4qJVf!66r?f!!z<5l!6hubI8RnD9pz(KeBGrUe z2sVpzOIRxm*qq+QQQAjzl6525vc7dAd1A>`37%PF!e1gE-jzy}88;A;=Tc;hUS7Ar8qGRlzQZj;)bS2}H zg*&l>)Sa>749pG;-{O?#UR59@5+EM@F6?Q$G!F-@NOAN!=`iMh-H`UWosZjMUxKf$ z(}_@dbleb!s>=zF9XP%Zov$Q@IT|KqWGwM5y+6HMReU$Ez=_j{oL|#^0X-Bj!~Oxw zrvK6gmAF40zNz^R;pB{kEyp>|vTq#dia0f&o7|+4jw>UMQ#YDN?gg(%+)0gIA+dUQ zT-}uN9PE{`h0vbqA}d4J!S%2+Iy2WyX27n(k0|)O9*qsa7i3;?#3w%zOV`&3u?`7w|M z#ECEbVF7vZ0o7aY6YEJjmm_1=rp03Y4L!Yt_8b;@V)_Aej1udv#eZ^TXsPt7Ix%?r ze_AMOnpY+BYMF!w!p^P~P5kEyDN!F&Y$2h(jf=xaj>tNDZmu&@lvYL!<*z&^ysvl5 zApn8Bma|rf**8c*VjNCX{tSdC`d!;*?uRJ>eUu|wfuQi)@7yLBGxZuDCiy6W@ZBVI z$du4PQc59)7KD?3e1qhR9SW=bA)~>n_mPGEODC?1$F%Ux>dhzjzS!@{nw5NICWV~W z&M?O+g%7D}zav80kGi3AmNeAgw(>|AHTLdgl{UWg%Q6-syJgm=_uq&QkA4r`4V_6? zx9vX~Ap;iV?10pAf}|-Woq0Oxq}4b7;$7Bsif3?$&($k~qjK$s$%d_l*0tRv24R(* z4>AJ~4=5dyBa3<-MP%xv@P&?kvftQuze?UvcT6&hMtqc{&drR>CQ^#V;O3ZH4wK4t z#euNyO5&VXzS_suIibtO9u$b-6dA)$t#+N`^0-oX7WAj^F*olr*N9ipgvoTkMOJe3 zd+WTt_p9y1s`a0IXdiqQg5tGnC!3Co$~Ui-LuQKtnTPIXhTx`ql+9B|L-+}^t8}!A zV(ZsX&52^N-q&rVG-I;~qvGcenHugqi%vrM)--%^0An6^t}$;@p+=#1u5eo<$H28w z4$(1GnY^8Ot9y{6hRBx}VgLEW`!EP{gD%NBp;>u25^sTk9e&!1)CFrS;Udi2_4>J4 zWO@p<4c6-YZf7D5nJ{*&3G75XbH|;w*7t?yzHDg*gYNkpXIX8rE}NF6QBh3 z90&Cu1ZMZ?Fk{wWu(|Vwy0M9b8hHW~@^C&5;TX$3 z%W0PJ5agv@(J+q8ygOLV8Z2&GdepnX>*2tuYIK4`c;i56ehd?_|Hs!mM%U79U8Av+ z9ox2T+qP|+JI+paY}@vZZQHi(+{ zdA5Dm73Hsr@jNk$!bw^5pmNpArtO@UC{i@WwJ0XK92lx)0kCeJcVMKeETY8{(NGgg zs+LsT;v96M3#k9v&PM2rI9sr*$$PJM+%-Z4Z^SwJB$P?p&b? z%UgaJ|01N{aQx4*zekcsz+;^FmBwhwTnJeFz0P@8c0fZfuLM3a@aAvgJ}v&8_!sT` z7gaQ;HuPl8r@EQ$T$KDSqrJysVuLlG`HQ}7lEGk3b5nOBFg{IKX}hTLBB zV^9;c?S7DXVI4G%&8Q$pAJL=ie{S4|!GM+zn03o{%FHB;HxF^HXVf0x>DSME-m%=J z{O&k2Xda24Qfyq9H8uQ9tzO&$^pYI2N{3;xQYp1%P<0}tH|*mHl@$t>{m48-gczJZ z(i|(~cl4l*S&7Rg!n%CO5Yna1F=(C5atT7(!eDd*;RZPsC#bxCOJ{!>=rd#QY>@}H z7^{b6t$Esyh$QHq$ZwmIx-odw{oUK7i*OydQ5IOo;H>n5H(|gzBk6Q!DG$o(U2JYQL4ZEtu$qrO`F$=Le+#VD4jCt@OGw# zWwR!PBC$Mxb_nm;K#I|bK;vjSFqDiq6oqLi5kEXH=E@kI&mV(=-B@T7z=b<|Rk#!$ zntoX)^?*!#o3_s(CpLBs6%75{h`;6&1M)Kk z{}hCUM9H^$cIi&!vekIY&bDfQX_Ao7Sc?zkx4mNhQrKkQklyUs_j^ZXlb1)a<8mK& zqLyLeUuh`1;#D{pHWG~so_muWf_8SZSfqZsv47px0-MS|7=6}%*Q z09+X({?Q}qZ92%ZAK^(i?DHb_fC~)ik6x1(i|FUICIq29Dih zWf#JVVn=3L6z6A&q0Pc-qyy6cZcfpk=5pt7_Q$VY{!#L{bYahI=qo{I#~L@NQbaQI z=j1Dw&#L?0w}p;W(e@|~GfBS3n%!bL$3!6&&+u@uVw2^i5UvXC>s^Y%*3@aBS?5Q| z9e`~*&np(j39mM|!c*RQm{}62Ju21>^^3 z9><1Hm5Go=&rE@&(C4VDXV6~_3|JdDm^}(Z?!lGx9q$~0m!RGA`)dBb8tuOl0mSEe zX?xq*g2QEuv^2RD1eAk>YjrBceRz$(n3^hzFS_lN?1I?Iqc1#~w)CW#S_)TM7y_wi z649RO%1Fh7&tz!n9zUDdVNGec`(_lhxhi@;Q--oX4UegcQg`f%3-eFLc1th`F^Him ztv%vsdmc*beE5Pe*~7{KB{eClHC6zNdRxxR9I~3)(O4%2d*>|4KmP!iJTV$TEuCi4 zZ$;`d**7N>$O&JreJ8K||MuDdBBU;eJewDpHZGBe-yP#2$yZ#(fd@0d{iW8VN4 z%(BY4m`Ayk-5iL?;ve6NtlvCrkxgvAxU;W<%%o7Ldtd5$A0Ag6B+|S8me677L z&63sMcQSX)znLEh*EgO@Pk`swf}8D=IXsdWvO2p{oDU;@->aQ-v|!&S8EVX`6BvX6 zn-Ak77I+M)8K=mOqK2`6Doc%fAK)zJ$V*}>Z*f4ByQpC2_S06v#;iQ5#Pn^-o&{Wv z+3`{xcOCITA#osih`6v7RtwjW!pN0e5+WeEU%Omm7=T+9Qnf3yP~F_xq}6A!Gm;utY?fN{WmU5 zev$lnzNVZWtYGkSBFVn^-^>4IzyL@$`I_01i?RZ_xC#?tOwxRTSnGai5aJGqk2Q#9 zTYEI-lcnb>%CKNn62-3byjIatrjMVuC&y=cjYeBz-=s5L3}{pX34Br(V)mkJ12m_X z)z7BeK2N*rX(*qREEOCIoZiRH$aX304*h-;y|X{|jmE{DTRk!|M33pqKr0UHV1Lcz z$k;{d<-?O1`;m(2-64}9$5$<08wFI)k8zH5{fqK%?Ab~aU8n`#Hv3G7%GW}t3di1|~ z&ppr&c}#cen=wlSneDZ+djq#uQkPQK>g^^S6TvUVr3#4E&iF2@e|IFK z8}y>|!@VtD(Ru7>3F#pb%t}mY{48%KukoBEu4mOnUMIFDC>8f<;EXPS5B_aboWZ9- zr|+iix4{w$S{Kk9)M56Sq`c=FKRd`p()BYhn&bol7Gbm>bij#*6>@fyS875uc%xKk z^dnWN`cWm;Ceng=z4QhS2db)F4xcEMi~u8_P?lo6IUNe^v+v+QITWmFj^iDIfB*-RG5~wbV-_TLMuYn@uZ2fpVpKh!gqk3N`G- zrW#kO+?$z7?<1l6D52tcsRy4QJooNr{fMj}4@FLPfZ$`Vlcn~WS)iD%{jqjT_Y_ey zb62F$Cpan+RmAOJe<#M@nMLaY0{r=jUP{!a<7B^b9(EvqJq-op5JKhY~pAx8N%rB~1X{c7gBs*vJvr35U5wp6lM*COUzs6 zG}&!IMitvK{!68O`+I+p1&Oe|-`h;;G@O6RW88Pp1mr69&=7CY|yxC0>w=iU#^0s zVM6OEH%IofaX34B@G}B+d9Swdao~npzQN^3XhzwtJ9<_9v0)S|Nnej3ST;mA8?5y^ zWtMKNh-2uI)#J>9ua8W&CZ&?K7GF;uM*%Kzrt}l6hw{7Rgjl1dKa-0$rD8Yr3&0{T z6RjA55FfUQ0?~>&8a+D3KRD4|=E)8L4uw;OH~w+l;l*wv#`&l|VdA_GMw(p|i^!4> zTa<;glMJd~P0E)MeH~#Y%s1x}^dqhxhaVBQSp5@h{|Vs?@xXho=s5rwYD<VY&UP1DWgfxr>SjLEBVf0=*~0 zxl1);JBj>2$W;^I@BQ~(B}_Z5$qa2N)Y($#ItFVp%reCv3~v^=Ih<8MKm|va0x3`6 zm__J>D=7fL%pMs;Cf0e2c7HyG%FV9Gs`c6-Be}MlmaHD`gE-bE_{FYE|RHCyOLFo&$t!@m?!8MV2w9mVv8$WEu8E7vxGUDeQ zHw77k&GUtY>o;zE+cjK0HX%=nctuYvR~_7{__0XuF*95pL~k3Nh^Eg|VWR$s?u|SS zj%Wg7gLEBi!B838ykeR3X{0_amBz1Z@sj~=4Y`n5@WKWmJQCK$)fmGthlD6_)I?@c;B0gqJeSMv>NI> z6p}0tp{4s`a5HQd!pcwV=|VAQ2hLQ6nZ*j8J|pNKOiNxlY^A#P zl5k5rr_&Bm1wJK7?dKZa9XAIC^>*s_l}hk8`k)l;kjI8lnU zCkW_%;Bd8-7s$U&l;Xmv=KPSw_lpvi;6^7<{BT}Y!G=>5w+Pp<}1c)Bt|DZK>?yxx4xdsO@ z${iqORv^4k$3$5x9b~>fvUv|71qB*ATu2|5#9=rV`6LlSbP7@*R!GoGn$ROh4`b!a zt$w=to~30CyagVr;BtR^Cg_A~_N=3#2gpSw3~h5$zVyrqB9hP#Gs~=bDR@$|zM(QLiJ8kFH+`{i zm#bmFd$&P8v2#5Tq<0>0>$TujK2udzSieL(Ue~U1{MwHSofdzx%eIO4wRW>!G*W@Z z2Be-~Yj=plLxW7@KfB3cbfT#xXpt3~@WHF22O2S%G}ShHK=J0Ns-D*5L}VAlwOIAf z(=^Sp29oYYKd2b392pl=@bU#S<8E~UKW6$a{iF?eq`RZz%3(VDQ?V`jw7+{#?w=)3 zvo?_h+1}nQAt1b2S-AF9$n^##zje24G%rz>r;80`OP>7_cPf}06J++=q`mSLCO9R(Mcjk~8X}PJW;iu#A>i3v41i=i z66L*Qkrru8gy4Mcp2h81JNXxD7KJf69m#txfDWE*la*A$!<2) zu{QqcLMjhZJ4F^jUfpjXeVJaM;IBJcNT9Qxw*zHybd@a=v}7n5ptO2N6o9sA=Ma@r z1Xla-$qWE_N?n>i{Ov^wPI&ua+#3r8V4^mMn=-RB)|;FRlav;E5J;y+P^QGUJNpVi zm!34SUp4ze(x57sp#fcad{d@l2ZeQ3h*2eHzV<0L`o_M)jtXB0r3YBXXq{(%87YtD+|(-66)7RcR2T5W3T$2ulEgkBYWv z&RN6)y;{A-a8Ca4^0FR8C#!s3Y2tr6emANS-4>?bt-S+#wP7P*==0CubDh=5oM|To zX{=@e(Z37;J;(9=Dmf#;bg@mX2X!#_=pF2vU4|RfTfde5_>EAK5V+5dg$lB3^3o@? zJsf~&R6h)*qc^1SE_>^j^s*bmrQ3NY9(qKbN|lCz^4aBI_UocWn1!iOFEpj)mj4%9 z2vzu!;!Q-Ze*-lmi6psdNf}f=ItX5kj;|YbQox;V)uu*XT@I`|^7iJv4iC9f+|0!3 z3k_&%3`gY7mPp0%<|SY!wY#ryU^gc9Aq6mfV~-_kH^yTZDFgI~P=Hjn?m_D-;fedlWj@P- zMeABg1J^jd#I;}j1~O?S)Bo%WW=nC&F#&M2_J6BEd-Kcb120SnbZp&Guz9r z;MB{CEOtK_F_vO{kf560dB?fZ)cdE-4L+&OIz=$r=%dUca#dQQLoqZLi;qGl$9cDs zAv+Vd0{ZJ&kjz>g9vT5J<32&fpo<**1v6lwESf$P*=Ig(TmkU_X_|o;1b3`4gHH5KdI zJh|d^v59_eet|MPAU0Is5kR>~T6NRLSC*12`>xe_`%=_L@Kl0?>PS5XP5Ft%w?WYc zl1eSGuOHF^V(03Q;Q6By=o!4k`|`1htfazbtYe4UOd7yc*otkfn{Nil&s-}bX4&Sg zsTAz^BWcwacW~v_c4^m#GAlk-SQgGiof+KpQoE{tca-Zj5n>?8I;7oiq1oX+g4Cw7 zk0N*l35360f+cAk-)3|Jk~2D7AB?qeXwi;s97>r{iks_=06*-;)tTYya3^YDaR}D` zSqwq8b^y4@887z~G2|_+H)bDXH5x5!Myil%57yAN&VqDy*f{yHmkPTq8Z^s#z*vtbd_v$O0^ zk*ltjc!7_;^m{zr{PWD}%+{2-%b%T8k-SrY$zsM)sQK06uE1&$G{Zht$<-?+Ure_Z z4j_XSj19LVk<0TROK;3Cy1DVw2E`yR0OVESpSFa%kx;EWj1Hoxxqwd-vLZs9)1H_R z6D{1#V0q{+I1;y{n-9aPQ|nh0_jRr?gRl&K91a*YkLHy@Lu~t1+1b?4DisU zYc8ea1!}3+=_@TznWXFON6Vq{K~5nslBVNv7&yp7@Wbx>?F$VGpb0plKDi>9j}^rI z99w$K`y~AS<=ND=v{iwcUC*)p;q|jKO!RWW|7s==t+fE`xsM2>B`aK(uNm_*z(kCj zV!R5e-b1#MNR}zw}-nxxnc>^r~rt_$$_cM1Vd>bD@ruf z7`Ting#5M#ex+cViE2Ti`}d85a=)c6#Go3mPq7)@dyb3h=?eoQ?EUqII=zoo`miuG zlhkKX3Y}Q9*v(e}ij6^;W!6IcFQ)U`Go~?WO@7{rf)46~8w54S6z(wY57E$mTnIS` z=-4?tt1lo8(?y+l`u<(Uq3J!UaUmVS!V~y#ty?Ej`F&=*Ppdit$JHo{J+*tTyRVw0 zzV2sp4B0a~5CPg$o)Xe*?1Oug-yXLHYVSajdZRd%?jcM(eQtjo!xXv;!*^WF;2G}R zN^eWr?aN7D+w(uQHn{6V`zQ29_JwaF;m}ac)-T(T`>|cxSnW z9JuX^x*J__XdF4Ugbt0cm<-J8K*b8gZR9Ke^(O!T62ieAdC%WiR|yP$X&CJK1^#?r zD1!zK)^aTGDHTAq>W*6T;o+vVMdfgOb3JC)ZEKAobRtG*bnk>xc z+9L1`Y!yHY0xIH8Jy2W*LIy)BX-9c-KbWSR zb|qdbnf*m>Ml7jQKA%h2${!F=xsfniy>{#-WNvQv5+m-^c}L&gHCmRXaH35aRamUF zg~vK)051-4*`fJn@T6whi3Hv|KiPKATYo=COAQqHJ-4kYH&yR<^lMv>Cds!@5hrQwmT_7_o363z1LiBs{!%+ zX7U(8$^($NhSx*-rCh`!H`3X$)?6OCOqhx13OMRH$xp}Jka$|L#8v&|3WAnQzxh*f z;g+jPifK&&)Qn#&(-@@qz+{BKD5H6)dKz#CdcuPJ&MBDvI5}T$BA84}>Y_wmFps4u z0>1kbUF9McmO=_I2AIT|391Wp=}XJ4O!~Tl9GQ-TlNIvhGGwm=&osj=^7_`#Vs6pv zx!9J*9GT?MS#yK<_Y4{a!WsvdpE|#!ou7F$d_9bxBt36OWCWDEP~Vzgm}>4B@+f8g zk8{F8%x7T{kjQmffaWL^T{CtQ{ka_J&OUClwGE;PUgP-SV`$i9y>AbRhV;hcKdf8}FC_ z@N^+uk{ITZUYK=Q-ju4B(zZdpl9+%?<%)6U8PsI2?kt|spBU?gV86^H+*uB=34MpQ zDf#Vz=i{;!5QJ4a`7lCf#H0wt=!SIGD0m0;u`;u*CiH~0=BiZuB(c`qCP%eEoF9R^ zOfo}~!1fBLWBkeC1p$s1ahsZ%2ec%3xp_dV4Dv3%D$2#Pv*s)*v*D`D8nYibfu$J2 zYI3DPnXtlrkD$WC@djhIoV8xiC)!3R*H)>Nt#L|35Dr=I$UBxeBM?djXiiMtd1kuE zdl1*Piq{2$fwS4!Wu7})FvTK_iGC)Y5BoUTp<>!OEq$igx{1mv1d8t;p+W3UjUt?d z0Jbf%z^C}CNhRl<_rmClmk+abt2q(ot`0VO+_%anXqD%jp=`Sh(<@mun-;#K;t{y3 z2SKt?U2(l1^-igsx0D(>;V>R4kAb?K*>dj|bTr#}Kv)_cmExzn1{)fUkU5d)`YD;C ze?pNp$!r~jH`u-fDX!#}ICYOKgdYI>D76{(MHc*Aqq%hsb+{1o3EAts3ry=?#M8P; z6Fq62NU8zAN_+e>d;7uy<-f}25gcFFWHrlSSQjP}KP(L(OjfxXSG{l}r3Oin3ytyd ziOZi+Nj=su_I%VsNVt9wOGCR5W%odIJM;j}a@T1K9+c8hqj&~6s^A04?!K!D%yDf? z%gCGXaD-|0Az3!&p>=%2L1H$!M0j_UM*lEv z?|+Frp!^h*O&WzAGK>7Qg-*7z`i8+M`6%1R3;G;HGE7}^g_Q5Q*1`{u+KOuJ&;22L z@N;!W)1A`3(=-AF_(!S9X38%S-1@Z(oE6eAn+ma)n25)WaC)2fz9!YC!4==mvI+`* z!#plrMH>g)>5w)2Ai0c`Ro{KK!#Z$&*jtkbn>eGg^qlD82OWq~P)9N@1xIW+j}HE| z4o$J84g&%(cpk+oRkPnb)-g)mORC4TINHLHM9aTHb#Pp+>WR~6=DrG;9iCeq_)~<@ z*@=?7>vrMLD{@@Kr%|yV111Ic&h!Mp>DJuFB*dQYLn8`hjNu!RrI`*EI>r1c-i&+Z zm$%ozG$x)AHX@@6*7tms-$qP~5jMqkKyuM1Xb3}`IC@7U7E78t*#3X1jmp5uP&HsvPuYY8|4N2bq(4&OYB zAlVZXX04IP8~}UiD1m~)4BYQ8EH z5)EB%V;>JTiE)n5cH#6;(7u?U-ubg zCejy**vxsd;vTZGMGJ!oH^g0QH4J0q=ai(r(S7koXfaJNCH1F!_*^UUP!uM|B)$K; zL5Sy{^IyW3mgWtLoXkz)g%3maqGx_qE@)by%Y6g7jq2G~VNGFx;riiq#1{8a37gLu zPsd2MZ3d41&xvt)M?L!lG#07}AZPgW%?Dov!TsgNUxN62?@-&m?iHht0wXgEHfUja$MhXgr zT|$@Uo32DLNiFir9V%+O32BfZOkGFYmDsMqt@W-Kw`+s)iwGi%k$5KljI(Hx5kS#> zm~hmL$Hn+@Oci8M!gF%%CJo8=^SbDK6C^H^{7 z+jjJtSOekPyJ#`tcdeXgtAKo$!8akYP4iI{p$nv(Jy&;e6E-9+Gab6j5r5`Ulqh)D0*_I4JB9MO~~Hyg_(ADsO}$&0%>&&Qy2l8<&s>CmTPD zDFF;guZGSzO)TW|29MwSq29?bh;h701pKfiw5g~G5oGM>V{9)d zw@~QA2#~Bj4S!Kz3FN7*7dNOM1@+V56*M~=KS`J0<{=_R)Z1+LL>_yomNHoBOORD! z)RSqNl|UX%9!80``pril<&BN82cq6!POyG2ES;zDVH?`Gi%GFy1;>vxfi}%Oys$qa zy!Y-Z9jnCS=+#d{na9_9NqT4ryrM;^c8n8$kkB1La@~~~2PgunsuZ2VWXnfFl7A61 zbt6OI#$kE(ByKQQ#15)V@?y19pN-p1ao|h6Y3`v0oJ>6@!HQn)(-+`FhYMfKdA~*# zda|nr4ln4kySoP>`_LC#5Wj;WFSdz2^E} zNCeDjx38Ve4-tQ&yxFYS@8Whq31|#ZU0FapVCYyEPnpTf{~$Ilp@s6b zK8evdEUB~eeqCobx0;iA-cArvfjj1qLfGc%^w)42%{kRYTu|hV5yL!1#bBy1C_M|85SU!KSkjyns#pTToO3|kPoQWVjG*# z8@Img7k_AVW^U-fq$*vO$|}t7^OU*m*{c(zx~YQ0S`cBrb=_n517AL@4LBAQp(ad$ zA4IYp{J~r#(*fD8WFB!RUDD3)U;+W1^z&Ri3SLtYNXO0XfC!B?rDK)35a)9A)lAnZ zYyuN9jvSb~qheIE_k$hc7-?18*`U+UlDB_u6d?9#bi|R>oN(#(67IgK@fEtgvSt1I z!jh&(OZRxpGkCrfU&(Km32!tv>}6(n?~gheQ{LC+?pKvzDvtU1YCU@R^jkr*A8F>f zC5cTGqnxqZS@j$k`qh^wNnY|=3GR)=<7sv)Wzp4M{L+C71@2~tgrb&HNOq~ zZ6XGu-D7hh#X~xOubV0x!yrShZDgg4GF-*R*pizG_rf%z4p4n>=oKxO9g^4!CEqZ; ze6&dP4=4Q49Mr$Z2^79L3mfRA2;sKXa<)AtxEiYBuRqSQKi&ma3*jU~f);e3uR0mQ zg=&PK+Wpi0*P6Aqzdr8B}lIu2X0{IzP?nG5`JkKoz_^w%gq*+DO$GENuh}bwDqw8PXh6o_@PsCb94%@6E;K zp8PYHWf5??p=lqzD_MG+BkKuL%-2Jm`FOf4oqIJYcEs+cazAf`PR$!B(OZ>!l1U$h zR_7og5tFsx)Y1P9iXpT^0NOOlQ;XpQYXk*c?ZacNK23DgO*J92(%$^(h+!g}W*F~R z!fRAR@`Q%tifF3R*7r zJaDC7DYIW$40w-X1PIDL8A+nwq&7lCIxmW&oOdI+c>|DD)XxEN>1 z3m853jrf64JSh16pef7Ppag%C0ZC8wE95Jv681$rxuX#mj{I@wKWVhqK} zQ%}{UUtY}FhgB$ES^6dksCa$4so8){%69gcsYj#qJ45mehA^-d40V6d(%OyHj0TXd zflOzs7sbAn0$CDTWc$%t|0SPad*QouQ+(N5;nRhRygzpVI|pDCQt~MBJJ}Jri6T{e z==-zN)u2U3wi0$sM(=qxo#uC;%{RW3liMShrI%iKWfo1)`c-c8G(-7r&$iy)AO!YV8n=aZ$=A0d zPFg;Fw~D)r=cI$KO8yL%Gm*Cix2uABc{#}zxFy|kMl=1egCw;60{>$SDBssiY+KBX zhOn@@!aT1tudysyrKZ1M_UwiN`HwLIaijh$lk5CLAQQ$B^HL(CF?6$pJ{`?)E6Thl znNaBJXS0<|l?X#>!s}aXkDPx;XesNiA6S|!X{sG29{gEobAhdPax9OM5ySZ9*uZs5!CpScVo_!A_wJsUg+A3F+L}rwc+Ws)%AtF8>bpL5S6S)Yl zCI;&;B{pf(BgKK-$#OE?fI^he7-;>`A@R@+t;5WCC({-pSm6ZK?67u67|Wu|#4b?u zoq@UKs1?Seb=@2?IKanQSSuEQI^i5A@cZL;rfQG;;h#4HS^Ry8ggEN#n5@9IMa!QP zfJub#!-lU0K0J;KI>4_iE4%Ew)px&E@!_AfMY50y+*}4CegY#=-6#%Vd3jAB)DQdU zA4WhJNN#YV6sZf_U0AeMm^t0y9C*>}TvEsrQaf=OPenzs&>Y;&@^B*G#$I7kuX+9M znjHI*daErB_n{gY__C{CA^Ww)npIU|iQOc)oDD-?{*(GoQ98^BhLCBR+4U~XwTweh zT8Yc#yVYPj6f=gsC5a8+^qn{!93XdAIp+J|ZZnnxVV~4Frua-?hg>@u3Bs0IGHXrK z)k+&BDL{$pB#Lojj?hq;=kT#bJXogj4ZZ?g9AGR#iHM#upP~TsIu3q~_1?1wy3z3z zDuwfAaLX^X7`r*OEuR7#s;3fa`fe{)3%*095|bL?lv_2=ftswG`Y7Z8KEp=lwNOEwH?LEnREd!ln4$gP=&RVwa7$b;r&-SX>@sesxmX5l_?*188 z)RadfyW~aXfsldc^`j%a*q@kuCW^i=VV67&CJR2*mUKs2Tgnt|8B-j*&2^%qu6syk z7rtL*PP#W~PH4DmJslTA#X!ywE}$$pA3UHh(rIm{9q4;RB%Yfaw;Krz)lJ-M_m7c!o6duSYr1MB`8nW9wZ}D5HR17|9qo+ErODbZZQu20k1^K$(Fv)Rs(q%2&7AgPo{c7 z^IknxjFbY*?2za9tB!H^0f3k%hv*mndx6Pin9Ix6h(}E8m_Sl<^%73FQe-vVX|7Cl zY&Rdx;nx}O!i)%JtW8-Cj{0N8Wd0vcEKWo@=;zYbr@8B;ipQbfD4Rc=Do*@5^38CZ z)N~=H)#oh3jVIvET4F$AmZTV>=saCwLk;smA+@RA0>K}Y9@{dIyKTubRK*DTTIrpI zs>VA(Ll0rDHjnW8-TQWRy{vTf^;vfWTnj0gM3^Jq#?esw(o1q)R5(jSS$)GC;A#Pz zTW+RjW<`Jve%-!+sjrfF?MW)$;(3Ad`h34AyBHdP56u8R5$7Qm9Js1vLSU5L&SZ<@ zY4#kr{moQUF(a6kbY`pQNNC5Dq(U_RJLSW${ZUm-!}5FW?y|d{-4#Ej z*4^9?T@}(8qFZQw1ry|E{b_(v)EPE_YG;rx$%o@L8OxTxE51~U61Al;HB`hHM_fJ+ zmbJOP-%&)8@{Zhe7{n1%sbhgEc$m~Y{s=#TJ(MybHVBKzBs~%fKhK#_5gWl{5Lw7p ztuQkbdWx7r{~7eKTz7a+7UrIA_4Hv(w+n!KqU!`!bo|XcXVmE6r^WjzgdC{S+j%211q;l^Pa2oBhvX5j_mEx5!ii?r>dmN9w1c+8dJe6f|n^M1jM zyandYFySk_XE!s^J5Drp(AFLX3MiU)3h9D!l9sED^6Dx6{<8!S%^Tu*iDhN4r*@nIE&`Y0yPY`X2L)u2v)2NcwxTX4yE4c`VL%6*B&hmc;|< zF$BZUJV8j(F3z5v1+#0I?kld^RLJIfMq|4L;fVOe1b|(a;Ln+~Hq)q~k>@iF1Q%7{ zKG^Dw>BMug9Se~#)9Wu<_nvx3+B?8s>ejk>Jz?NbTRPYUBl4DMf;bA zx2zf@`LegNMo)u^x?Pj30~Z9$lLz}~EI8V@`NkV=II+s%+3|qbiQBYzal2{*7nnd) z{o#j`;y(63$$Bzdy3L6D28fmu*6q&Rb)%8?C%*)tK+&0w$h8i+s@$@z-F*;e&}pZs z+*vP5zZ0c7hwtW-SkYKoFCUPEJEU|yDb=}uuxKu1%rv~!2`z}1rF|5hPh4=bo%`|= ziUsNkBn`C#R2Ax4BJtnbVEpJK?C^O>s8B-4f1nBt^!pd-2M}t|Xf_O*U;luRH_&JC zwkK&}hkaS&<^ibOA;!M7{P$%50MJ6S#<>6ItHRSU79m<$M+fo}PDiYA^3Kp51Pl7o2RkLsr19okzA=w3rkXy?YnvnEYQ%oheanJcI>$Xw7#dq=EbQ=<$aPU96~J!Yzu`#yiBUuD*^F0Z&A^}m%8?9VsY>S{ z(p^ChTCFSbb+g?R2K?*Bgm4$N35N~P%o0f7ghzV{?pV9QL-9APFqcIgf`}6X*=z9c zT>IUsid~=Wb_ie65uuJhY701D%?>!DW@!@dg{*@=_Ahh6xi0sTq~$1%&n+K4g{vA1 zOXsxWm_p{egz|o)FPb3|5|(Q*i(aaCp~eTJ3o)o7r~XQ(ZOANAClU)G6u9ere4=do z6Z3;=llA~}{K6`_!KG+gE4^Vb`MK7kD!HfREAj?2;xxXtQx-MmOUzu|?ve zX&5TkYaUC9;v5QBMs@l|8!4cgWSr*aA&=&piR8$+cw*v4p&;MyLCZN_K^>-BL0y&B z3tn14C8TR{oc3aRN*Cbz@$|bpJx8YwTaQA&BvDIl4Oy9Tn!hEg0a8sfhhEr66*zbB zrZ@WMJhz?xM$kC~LWC3_F^PD4i23jPw7MmFr@oTGQ+Y6Y@8`W7RYzEo4tM1Y-&b5& z)?6TYI-I!12#@MxN)O*?L)84K?CFPoX!?0NqBY~(%?+y4#4K~JFbaU2y$f>m*>`iU zHE`;oLZ72qV$$)p<5?(PpFNLSWcFjtPg3CUM9=24%ntR;ux>C#M~3A&f&wN~wVhc; zergp*0i&*Z`dbRO_CvxJ!e@b()Zboz+2SUhG*kgJJpKebEERa{3lF<3=j z&Wg(^y(Ur0kf>p`=c_ zWV@!A-Y`>SA`7vt{h@L{F$)KDXXydUleNri1LvvNx-E*ty#(Tub(C%+zfv)C%pGX4 zRrRw`qQ>ZJh*wkVS7{57mjkUa^|!jSKI|f=JO2`$Rda@`c^n zY;^lcE>;<{3{XQ72NLsPYZ`O+STd8l(8XUciq04IHrOP;iiL7A%E z5q=xZuO_NtL2r~;+zT6?t$e)QP_>GsrhLXzogNF@H}qsRca(5gN#O48YGIyRX#z5z zIsO3zyG*i-F+ocQf7iP);?q*iaCYtBJSn+Rss~ptR`mV41&mMJ##`;6|9wc!*TDPn z`yTDc12kOX<-qVzN*{+jPyS+m%jQi3>UV^3`2Ekc8B3J1!w)9z(fe26? zWSN+Q0Mg0c<(ek>HJ2?nAAhz)zh^nv{K_UAooxYay_TCRk-w2)nOlWmD~K(|>{E*i z8E0ll(#Cm{f=PgrRhvt>t;_Idv0T}=hq*;^Mb{pj-Yo}&xcV(vomOWt8!xz~axaJK+&Ra5VNLK#z^n1-Ys&u!8dh7b1$d5o=lx z3(y>;O_YO_=I*vnSWAYEBDZenhu}Yea&#m2$&#rI`+g1YME42W8xGB(AmC&2JD2F{mn`}(~Iz~X8!h-fbB03&3ZNz;%T zA^Lk6|LkJe+3|>aML*}-y6so%JQbic*UYrbD( za2>14YO(_^ej%ivSr5EYEf3i)jQgtAVqZz1VdJ$G7exTcdEg*xfY#t!oT4q_2T~=& zQ&yo#4x>RE?}ym5>kH(MP07E>e)|k&AmZlvb8LEO&)cjpwLe86Xg>XU?GsUG^#RQoc=LB zFJ%z#xpnVbHqS?!uy^}pTMP4{jgzBz#5HQdrlF^=_zy97BrKr8k`4)$;hxG{fK6=> znqZ`O2RQ2Wk;guqhExn6?#bA677ms#99**O7)~YNF79ZbP~Wt?8}a$9j)?`|fif9N zHO-oIy5dMs6(>U&&}jtvdis$}TfqwMKFc4JFLB-wR1ksv1j=-eqby$^tS&QXXnoef z4w%ueZl0KKM~V8VOQaDY?;--2SmoyN;?{b~A4O+oFm)Vzw*o)OwwoJCPf&=*Q67Jk z(C3_<@GW>JAPy1GlP-;6*ai^=F07S@M$R-5={%4G^W!Cx4b{40Lk8$DcL)4(3NDb) z@lun`WFxJou8c{Dpm1eRQprj#y;tB7^juB+b+caGACHhd#;DSFPWqa1zM3e4i7){7 z_uha&lh#~3Ay48~9Zpi5q9g?>Z@YSB?aN`VqY5GF6J`_^m$@1~?Z$7pu7nJ`C+=ts zjs29(w_Nxx|X)dt_^>c`C@9O5;euh;aJC1|GcJoRnj`p%}TtCDG zG7Vp|0 z{ss;8L`MVuw=f<4>P4gwxet=;gQV_GHc(e_B{*G@toVmW>q?@7dHe|88{dqzb)EkU3&3LyDaalOryA8qc0{stJ%}M>2aA-}s8`}@u5iLNN_(t3sY>fC zMDEp?Fx$P_HfrF6=~^(56$rIw z{A@$=^cRt&BAMkD(m$-Aa#d_QNOtk}dEl;ya2VGnjJ`{DA?Ei_?P#jLr-N~d;)_ZX zTVMr~(eRpg8rM-2GNfF?u@gI31A=SF`276S@@Z*&*|__tM+RMTOPg4<&~ zRy3uMmG zPYxHhasMFuYRJ$pb>%4xlnvsVP{ehu3Hg_Dr3reQW0k(pHX-M}04bU`-Sbtj8X5au zE*C(zSo+}$;;sR)ET99mhTHR3NXN=$a%NA{*@0*2P?SJ#rCApbv?$Nl{2mMQ(srec zOjQgu#1rLmf${Fh3*Ym$RX0c0dI>uebz%4qy*TK`~*wefd z(UA(+vUnc^WQpSqyag&ems(r?;o-+^R$3_& z!MZxEzXA&GeK@}?T~E6j2MTO>{0Y7 zo*tU?DeqT1F|G0imkokOMP&QI-YWe__olL3HlT4s>r(;>iSZNr?gkna_UmGizTZAM z2k>`JmFiq@K;)#l;VS|^zHEzS?7R0Op5Ml|M?{eYoAkxUz0X)I)%0=p2zhnP@@|?8 z$dLe`bn3orRFU~pl(tPQrf@p(^lwV6i3lZ8Xx-%`Pu1xdS?BXLLjb#tS}DmTM`$&r zch93SZnU^^A`8@4N*(~m3MC>^z(976&1r^I4~{EAlY0Eu#Ct;pOUE+1yDc?fk%HkU z+!AeFwrSv{Ilvb*3M&^!Li7dU+1E^u#4-s>??M#^wrq6g9=t!-QRgt%_qXr}`Yt2? z<*29&-T4eTxpiE|w>2qh<6~?69FVU;6e?~#O-it*EZcnrUPFTnrVLy~%;BFZ!IDI5 z)p;$+xkwGhlfNHtv#|s4ns|r{NH)F6*vV+Btmx|N8L_{Ns7t8fOeM$$XYzCtoc?s| zUqa;}QTa{RqAJWr9A0ouK*mpV}3bG~VR9?v>|g7=DA zbTXkPgFqa@`O&`^uaVq(t6iZjrl@LgG7Q;e0BtGoNf`)j9n2P>iWDe7%2s#0i=o+U z5IYCNs3upj+QB#JfYmS3pArscG}2@w=cVTG6ByKuux2KkyY;NrGYLDY^GEv`gDtV9 zY$lpk2yUSFg3YJl1I4HS(AqdO^i`4NO&Zb;U)6}aD|QA{yp@{Q{q(&Ro4>%-`^Y2e ztJ2x{7?zJB?I_dSKtkA-u9myktv8U+K!*LG9zV}=Ql|hlrX2_F`Z^iK-uFE>{+2By zRI94(y&3qEg_+{E1xfvu_HTz+|4jO*$&N4Z4pKhBR%nWQ?8=AL_L1nK&LK&wxXdac zM{Ug`GCe-R>ik_ct`G+6#_Lc8uHMeDxQB={gpU7QC@Tg?0J49)_K>f`(0m-p z>^g_}Sj>Ik_!yT{yCnpiG~T2TWtmz?{r_3hX9#u0-Y0IIWDmq3fmDVUTB1CaP;z z7QU36s8P4@eqBA-Z}+99jPe{@oGH#~H=1+HC%OtK#&AsP9weOGv)C3>rWN~tefzTO zeh|65Xq;UKG=!Ng9;#3i;W+4o>ueGDIxm4owtXUgk{~G1(#*yX;8!Pcb2dt*?qddl z#vh~_f_BySf^-l4qKlGR(NgG9JFezYO%}h=B@EzAv`g+*S|(+4xKhv)Kwhz060E0B z>%iB>q4u4oSa6%+g-v_dUsoz}Hyt|`Sm-7{!|=lCeAc1u_V-GxB_k80$_??u;1Bb8 zSGCz=A+MOQ4l`=8w=g8EZcmPSn$Uc=yb<*^)$b)h<`@SB$)Rz#k5+IAC>~vJBD!9gqG4kRz zA3!Gf7=D~k_n3vwr?6+e=BL}!n*Gs5I9)E=`oiu%uiUu;E0i>)Wmg-4xzY*y2K6GD z&@}78USh}QJL~K4XKc#h8JM~@-&krZLFqBy28#9^JcA3hTuw++hL(~6TkkHrdUs17 z-2Y;9M=!ngAZx_$*3E+7jE|7V`X`msY9C&BmBqr2{XS*+rD(;#T|Nq;8V+46B!scn zJ14(}dxdW31r}_o_7^a7jfLcc&S0>VmwYz`6lE_CBADF5YIG#EOt~X~pr1OG@oam8 zoqD0aKfj}ZP1Hp<&r zrf#2zl?=~D%$BU;`dqBW_H6-YsDP5gHZB7$;o2dw&3{6VCbfXTsoJz711%VaS?FNHmBZn9^y+Od43cZD;i%1Ns0{tTe>-fMP52)`Bp2_g>=Vm6saf@ z>!Te)@n_Ws!(hGg8|B;Tx+&9dDtu0cGhicB1y^N3@%=Cd$6@jL&?>LombP@HZ=c)! zk!}iintvyBs-D5secKWW%#ED>WH*exF5(lEew7}4`Dv*02jYv`#BsF*p!OkVyUD&2 zZy0+9JQT&1?H0fH*i%)D1g#lB00000Bw8%M0016KAd@>{=6N816#`B7Mq$o8D%s)j zsfI*#{X<@rHEruEUi$g|2I9Ke=q_*NUfF>r1N&wG7GV=aaWI)F?@vJ$x5kTtc(8xh zIfv&o)W6)EcIyXmBh2Yoau18=BM3Bj0bCV|TQIOF#(2J<`DOJ>Cidwm1{0>KVu+{! z=tRdj=-Zh%sf-MH?&j&7^`nRkRqoIL0000ypwwc}000000000000A$S+rXo}?`^lp zsrGB@dD=S6-$;ROdC?u{zf*4e+c}lj};z$wMG9qonZ|_ z5YYHG!Eyx26K;NMnD_%=CG_M$6-H;rpK1D#`*n5zi zvop!^NzQL`F9|qD=iiQ%VE)iut&SjB1Ah;a{b;rLa+NHw)ZfkuhYPWOJWu``$2J5Z zZ5|mdpFQ`*=iJ%xU_R?{7J<2xj_=1azen9$5^E9&(-vKK&HF?Qavs25HiQPpphald zUW)H-lHcFo!N$0-;>XOb*gh?p8&%is{z88fPIIu}!tu_n<(cDXI+F7634Ndd5RZ6- z>(sg{b@^tYeIlZ=LJHq{{$xEY7b>mZCymd!Dug!=N2h|81&fCBIb<-bJ`rb~smc^3 z?tlvG=KDjq-ND%KvN!r^fd_n zlS_60zKjsgLN+H{4}T%R2QUZ%=))ZId(c zrDJDa{L~YVTPt^2KPi_;7vB_1c4?8xdmV!jMf3>xMCIsRlkNy*;IJpcqf^6KvkKDK zjJhTgX>2sAj^)Y$nP0pkhhLTM@d^D9@cBd`TdVBFa9SE-knjC4%gjnx<$MzASzSys zV4)T{d#&Ht3o8#~RH2d8(L5a%He9oVod^%>$$+~g_FlN~o-qc?puu}E`DqYy_QI<* z#AzcJ5^9}h9%H6VTD(tknY*AZNjFrA_uEX!!G#!h1&l6<9dLW@L7cz<00003B58id zk|8Q*@foMGSdvJoEbofTF!*apJZfY~%(weg+&B(MFs8vmIt<`Pr~_2;{f-v)^B!yB zl)&+DxrX}+f^hs-GpE{ia2#Lll=)4|1=!H=d&+(7eA;h>#iJ7u*>sa8nV^#UtV7K* zXdlr+zIQxk(>K%u55LwNv34uAla++5GYM?Gmd}R!)s`|mbN;SsDzvio6`(XWQlRjD zn!wfhekpZmqXzPDNW?Xq@-JL?sz<|=!A``uNffwc_j?tJ#Z6xm;koemEVe$6j!e|J zeAaJ-5wo{{VEs&y!DOnDiB5b<*Vtz?as|DlOUZVWNaVXXbIOl5d>E$Myz#;Ki;)exNG}1_xtCCTRHS&Me8nvV@z*!i^YjQ&;=Na6VOymFu(^9=1^5y$|g+q%q4qoSJ zLx(yM&`VftkBNEiTn;6LeK-EO=~q z;@0XwPYcS8vLxx-At5^AWm)FKTsCH9;PJJ)Q-Vm+Q6cSb%w2TQ_g6O>Uy>EDRlLkn z$iT|vDOn@Wd|c_b)8~ixwQbboyLnZls6JiCnl<-(wqi9IfBctM(0QNIw-3_fWDU6X z3Gkm5(TjRE@Hek~aH=oZ3w?EDl^>uw^n( z4>AS4%))}lL?@4A2F!b|IfZS+r_@@> zzPsUg7sydRT83CtZTo!lXh`#Zu|?m9m0xGO&69ateS)Vw_!Lx0X2PKhv$uAC9qHMZiNxx zX0*96n4^V}(E$Gi+1yw!M+yS}nIcQVG)eY|V{G||M|C>dQ*;3gpjD}xkbs>U(9Tf1 zd8zjgv<*{z$+reVmp%^M_fJzSc7WDh8B&eS1Q6h&ARxs1KT3_AlY60_C7)6bE>f$j zgKOldgFJH>vGqfvcnVg8J?FFLR=H&%qfzrY;M>uc8d@G~P<;_nz?vNfp-&90!9?Ol za0M)^TQDa8P94Ag@)toPyM~*!TmYm*rJiE4Jnz%HePJivf=ta1eTFhtlOg77+a_2I_UbJvr^5!oc$$?t2~QR>BIU4I!jL+5)1krCfSqpaJWCuG6=n zg8w1j!Ohs8!u|2yPk9C0q)^!qQ89hqWe=fM4XQZFpDRBSIHD+Rtnj81!*kDSS2;HK z=ex*OQ#B>i|X4e2_)f?F_&6Nl(n`34y;DnQ$Afcyr!2QmvRgQy9l*erKx zeOc#U2H+I=y;AwutVnt<>f93r5 z=QhPiP8@Lwi}r$oA{ow0%kru_x(LrTiNesQ$SHqYF4@%D3}YcY^Yn-?TQwSm%;zLT z9SxDMmmKOa|4l|JlFv~$$t)LLz8R=EXQr@CHIWgiduFTxz1FBH0?)gF)^q;fW=_<- zgP{KJA%=3;kQG%l8M+8?cVy$^?~xtXaV9ECP*ft#3>BKL+FVi&5@4Upm#0xS{Dv~| z0OK?sy4sx!nM9eYtH*#O*Td$sqqC@lJN|}GTC#F*WGZ2p`U?JMkU&bol~}9o1@e92 zdNTeu)m=Q17z~@wCtl%nWohH-^!cNSwP*^(h1AHJwb%OZDeMR|DlPkg+A$LlAX*4J zsPWB=#8-}BEi@)ksDx_y&Yx<0n^t>|Btkd=n3atF3ki3i7xz5tJ`E-m+YY)FaQ%3P zUl=~nc{;Y1(016;&B|#p-}rTAPG{HL_p4IMbLXc{o&31xzHh~G@;`u3|23atF_M}K z0ixki$EzUaKE+fBg0BXW$Fu~gz*AyHS9b`Mr&_ujPiN~?6fsA0w5tX?kIBFjZ32ilil@E zStr(ynT+ouZ_Fdvu)(_(&1U*u*T>Z1?>`A*i3r%S{eey$r=&kRB%(-)&^u&Qql{&6 zpJDMuam;%~Vw!LzNO0<4Tz3KqJJQd4VjckX-5$5M*I@L>+!vkmsBdm|FntjH^8x6) zIlMK;%@)Ya25XadA;VyN6>XRhSs(tz%S77_A7I%)8BCG^H6E1PY<(doyi*2jqhfWs z^9FV&zrX#WNs|LO`Ky$yuP)@bcn6zTpwTL{o1s2kw?91r_i|!^#QA8zZo>8(<}u;> z!}LEQ6Et!sdGFUv$GJI+Z!>_ANa8O9F~R>86U=+DB%$K(B~99eDv(-r2&KV#?a!B- z?23ok=Q|(GK$5+=#YanM<}IAF>hwumB9=sq0_^TA7o&v%T=8qKIyn>ph)8--5^8zf zKS{G(}*Uh(M6s6*FyiR-eYvH zy5#$KXoK8)#FyG5dD}Y%)6^DX*tCFjz8$>#orL~ox$$`a+tV83gkaIf_y7O^000QK zi$X^Bb%yfJP7l8_+EW~)LQiup7$s3~NWS}#x}#Bhr7mh$dRyHFpgHPPi&Vc^zxHEe z!Wq@RLd~`LCIlERtBk7uQKVy=)?K}IB7hi*Knp%IDjEd_vohCR|>Ya3E`XU;lYtdOPDk4<8r@&^-@X^K6mBHUT8WVes>bOCN3#j4)69pA*61dy%Dn0tg zuy}M*{#pP40000OXQarXEqI!ADmqO_APB2)anf>lYMvnr3&WPSnjXI?kU{FG(bZv_ zHyRHjPLSguOnh5V<=VHheYg%dI-sIt-wT-C0?8TJze_%X&pg+*HZ+I3O^qwep@{yZ?So}y1lFygZoy!3fqwU=&FBqa9*PL%^;GY z{W@b~AOrI{adO4=hj`h3y{!$bWok-~5w+6udzZ6alOLAIv9BdchNPfTo2F^~e)t*S zLhxdvITqB18b>XO;R6Su8eTE_9nzVa>@r6L<70~JwLTC_t)8G#mpxzq=65Xp8kL~J z`3B1~et71?`1Vd@7}&e2Ak_7*VSLu|3GlKgU^5ZBd9nb{ghKm^$vvrk@W}3%ht4L0 zqG)jyj5xF3Qya^b+8wYKU06fSUp!Ipd*zd3CVwBQM_>{*SVj=l8Bv9M<#O_JM<9J~ z+j_PbU({8U!2b2U-gF%RAP^I9HCwQ7ej(G~6~;soa3w_2!j!a^T~~~y&JpchQ>QMH z%0;OT0W+pC`NWqe_fA)`sU!Kl%h|5UkIQ9#!tFcxn-HXX>@p5Q0@B9rl1$n!tcY%X zZA*yBeY_h@+$stS`GDu5Qbe6%ubXo0_E+hU23LTm87UvwvvVnPXyBzFC5WO^B)^Mi zGT@Rlq(b=c%@iK5r^JC@_fZUp?wqe>Qbhw6qPX;3v;$+@Et*I9d}s3pyA#kdKo2m) zaoyK*rn{jQ0@XBU@w03JjlfMd_<#IXxu{gzcESQi5>&pAgr4{vUm=iofZjDH2Of6u zwl>a%A18alD3AGXq20jV83{-Guxqfva_{I<+sIFSHMoGhP0cmUW2OZ5c2={PW~^TO z9UPAc;g~TRm>wJ9)OBIYnG%df%9z$g6+h)BVS&6<6cG-DquND^sFWH4lD;`$Byb#hBO~ zVug1)eD{KM)!TtML4?8I24{;q86lDtcyMYhW#{4Gdl>RJf(}7!2Vn<@w@@5YfX!|b z+9%>U5##$ztYCf{thz87OZ6f=S*A6&W-*tVXRv?EAOHXW002n^xTuR;@x4%~Jv{2% zb(Wb{@1Ql^Vr!*|HA(Hiv1Z*{__ncO>SCEZEae)`k2R#$uaTK2JoV0Hz#}I`x-*bN zH@Vvfuv|aBk!j70H>?TSJ>io&!fVoQt#phcHMtA%mBdF_ux2gh6A`4orE5F;H0%R& zH(=#JTL-F9N!^0h6ORq}aHAI!1Kpm3x%+V$mO>F9X-l-a-YJ(maADc8&3pBl_HyDSbp-!I z)dSkkk-Z4j{34j4TFbR_7x_4nv<D;oc|aO%IXri)be`1%bj&Mz%21M# zHCU@~UerO4y)~B_qQOp7fcg#A71A(Woqov!D6+4+4QEW8^`z0_X~pPG}({!bt~ zAf48q(7V~ldysGpccMp7d-xU$!lq%~hSj3|{ER-d#)PT300v(Y&yOc?enrrk=K)k0 zx4akC=g2baQ z1wTB6e9Zx1T%S8vvm(;n-|^J2A`zYCLl?5GV#{}RzlP&?Zx|gcC5LC>*8sQ78~NM0 ztL8Nm-XKTSnq;VYC94NcMkDE!79$@v2^ok--k&F2TEutY3^Do}`)a>~QgOGpVl<@` z?!>R`aKkGK7~BUWV-i;@vT6SJ4+W!>l`NHU?J5tZmy``EMq$;Tr00BE>E!xjItZ6} zymZ&DrA=F7-Q&l@w&abgFQy;E7TmoULf){pU`gS}7PM(NE0MGL_H8=BFqH6;+=s2G)yOS+05| zQ#MPezD1lXgI8N6>m>{x@CHzY zzm`sKQ@&9%uad$B)1C&+&bf{S@kL&3YV+(0Hg63b0O7b2dOE`ET|b}nyT1;x9Ek@6 zzE&M?R#ZocdeI>k}S*E9@VENtZF9RDujJLG>gKA zAhv^bFw@{Gh^3`D8MB0p?ea)_1nLjbBEF`;J|Dfwha zeVtUb2i)VzCkt%};r?_-IUO=Tpf52PVDma``!e<>2!F%aE)x33wZrPPeK!xp5 zn`$xR`gMm3xJS^1BG^a}VBJ@4$i2z3!tv3=PI(mXu?Bgrz+@QCj_L2WEf91>?r)?aR!mO#2sk!6G;}Y-R}T+V2K#>b zm{%hJ0e5JaDUij`ZH#-`>x^1)`n?U!gPV5zC9 zkQRN#Bh{yZe>LjpEZ~ZsUT8s_q&(HNyi)<*Ck_@N*RMltD(^g4@`|HK^(B{&CX0v3 zkNLsn3jc|(NVE?`I>=@%Wb8S0g#f?B_Djg)w)@6O{~3{rZOXbG-7N zSwPU3qDEoAAeD-tEcvS+*caL4i4!m-V`rOq?et{%?e@Pd)LN-BJ5q6PO6mAc9lZ(} zef0+An=T-zm69!?M_9yPro>R-3tJ!(7rx#ZD`{{uuoDolM{nG%K_YI0`;F2rJPi33 z4Dgi%HAKjkO#J6S$7p=Nmp5^zTIpT{kFg=6PFMZ8W+ywA9|7MBL7s)yIWC-2kHZ}< z@tXA-!JO_aeGW%p=xW{I)GDu0A5S1vGhVHw%r7nO_g*`hqz+pK5h4hn|D>}vwSE300000A;P|%inGj$Cn>Ow;-Kq9UKB9fqUrvT z!`B4G&5UMTae{FcK`lXC>??N8#1 zS4P@~Jg73?>8Aadad}8~I!+6*69cWuTz&-PT3gCf&tt%MZI_tPa_C+Spk2>53o-zMCP&r zf`E*(E~wN42O&TvoKaZRnbC-)r_wYr`xyo0>X_;R6|*E0Z%@QK)Kf;dtcheA2Ppgt z!V!%k>Swj+K&DCDWa6`T@(7Rs000000mMgJWq<$x0000000000008oXQH^x;LQ__7 z#p@2Y8J$`X{c7X?Yj8!oqkIA*;+Lq<)XDyyO?RI3kWx}d(Sf;ixfC*k-V1N}Q=k(05ufi6b1tCVBH_pQ~KG?8xMXu zHFXSLNz@6vC;7`1ZjAa$veOIxTu@BxWRv=0+G`{ex`L9tH_ettuH`^)Dza?7K5IAM zLF#{bb4{1I&LHVxtv*C+e+}y%)U#9S&@HhkThTCwkN{lHHH?+VhzU=zy&*sh}`N_cdsL9eKy8!$!Vx93DOfNF~X;*c@-E^UfhZ zl(#tGs{45W0LkW1BU&(5WZBUqO28CkX)IYafBR3QJREJ^=M$O}PDH`Sah@$Mwj`7m z2mk@z0$`8&-w_>qU$0CMGmL6??V3e-Z7brOalj9`lSppc2J5v!weRcY*`w@y{rgu) z#~0u6g|jy{bwpcnz}MgLs*kTTsyu`9D4h^0+rxFQ!=U&alr^obqA!{h5cn5ch+H(kux!qM+3^99+jn9@PUCP!k{qb& z^HF;B`EW>IX1QUZxlrS-!qDV&*xuqwA@@5ek+Q0%L%-- zb>;otD;9VBS^s0r?FJEvB+vD`%YP{@4Bx#-b*^-)s?lBc_75GT?y1A#@Ow6nLq}@; z1Ng)v31bF@w8AkV(s+UTV=xX3tC-<2&kMN4Kc+83IP5P^UuY+Hv)l?`YspIBwNYGT zcL(F`1X(o8=-C*Djkr6;1$`X^t|X9mk<@GXGaiF_-K-z>i{5do z9x4#w`}EV|fU}i5EXtH^NOHV6&SZH8%`YCCBZ;DXQD0Zq;nszA6sZk}kmfbaz>m9pU`cnsL@Je{Mzfo__z0 zL2RbIRz!cI_(+iljt^k1dnQ#hSK18vu;h%y#{jy8KkBr00U^^~ZnA}ky=(^CxXVTK z%{gA6T}BuBcZHoQFPeFQLD;>A+^HU7Nj>9lj@QNPqF|ezLyrz+T&al$t{Z61xqa+y zLzY(x6pF7A?iPKo@m$?9TyO!Pg4+lEgaq5ZD!9-`yw)0nTFpYh-g`;Sp#c|8&EQuy z6QYPLRCE`1HU;d!e~7ejE`Hb0YRWGL=Cs!gbf#>VI0oi~NU#6jMON)8LgucNGQy)x zZZa%nGwQOc0`j+I2<8XaVxCP|h`$EN2u!C+maOB^S}~0TpLU}5L@CtV4Bp<-!vZOy z^}?=}57~`Le_`3rL)qsGV= zGz-DOjl%?Nn>>a$moC^aERyXQl>bqOy1E2z1`Ob#nhXCQi{5wqK5vzz%l83l&43bh zcr$*d)Qgt9LUkj5m20~pf-nq#g1^C-d6IZ39Zmd!5gBAvy>fP@GB^u%XHxQ=5lY+g&*~gKFN{xf_Ed5CNd+R^{QT=djXK@p%pRz9A&2buBqaPf`#W&i~{OIH>tc zjHSgXr655(G_8VYUNIiPD+n4r^&3cTQrWj5ur*Pu{#6mUaqqD8vaIRS4Pz>kxJnG6 zTA)Eqcny*b-($SgAJe&_BT|F9DI*5?2Tinmq>l7#&?wX#eDi1#9I|G>M2R(3_AGq} zW?g^IriPf5^U`$cFzSK7CIMR$MKq$?s+UkVkyPA^N`KttPPO4B*k&h9H-!`mSH_7> zgtNc?3^8IZxC&spa!kC=D|+Eo9NnFAtDNXWy!vB9=`iy@4+#b}pJ!y^Ml_j^#IgII z`|2a;L#EI9$L5|mMF=Pn=`jRs;f4U3=$zmgpQKgi9xO)VSt#e^pdJiE~Q3G!ev%leWvy1%RI&Wd~8 zHY;fij)wz#1cj5qku=rmGD}8_DmvP3v$43CUvY#Cmh;6b&3$c@N-K?4XXIxdz2?tr`G}DvcD`C8sIW<@>ah0`l8XQOV=$Hs=S*Et`6Gpf{PD-JsMYQbL zVQTbIMy}t&T+)s7f&{x}G?i+W(-5@Fv=nzSxEY*P&rV!GP1yT?fJb=3q6eJk_i*T) z&5)c)GpAhQGX&-5BZ6#F7^^4S-BE0>mWSn^XS;Y}lg%vXEH%B{pIm+PT&)?@ zu0DV>!7>nuF8Gi?2X>-X404=zPJtVZmxZ`_#Sgwmb?E8uRkNy7tTI+_kkHnd`4)cz zJH9B}R)+}f!8;qrnT%POah<$Oh&RIFp_(%BuEv^6XT*wK3u7Eqya^Y3q~0*qgNlOo z*VZ9DoV*imvtBMKryKJBwTWz0+9n%jV9dV@{cv_W5^S8lm3dJBdk=5BkO_Lqd}@}K z_j1v~IsP2BU{N@>XItap(mB>=3^{Lajrlddq-TppXw1^mzy`vAPjDiQXe`}kjO&f_d!SY2_Tv@4r1>~MN%c#AOog;F1*+bz*4j-)Oz{|7`Aat5RlvT zZbg2kH+MKPVXv;e-VzH335wfNn(*mvdk>GvDgEG{c$5<|@HDLYdjwWbPu9|m-n%!{ zd{7wz(-N-gqU`Si%T^q{J163$3Xu2;k~8d{=nx)WCWHYYd?80G4bI9 zr#L-s$cuM;&10lcZwVy-_UuPj=dPxVF|8d)nFu4h2ArD}&4C3~ zgZ8l5Bz_KtEa*$t|XqkiFb)xKxhx00H0fXm(`0=DaE@0~Nce!)|D} z0lxe*>u7>0i7Hm-qYh<|9{9z~oSOwLAGFNs40Gq_zjF59vbH@K!vgq~U6Rk;C5+=k z5fjN^c+f-^fd?vm&>Vo5)qS`=8^tP28ETq8L ze*0D}x3XW4{lsZbLP``v#cx!LTB-ZPG}CR`B^tXqfXHx4Mf`1e7z2q zCC-(vogy8GQ}$EPlws&&F4Kx>xc=S*el4evu5&6%xLTh0Vr#(;PNnrxpWm8p7^RU| zu2k)`<`>x?Glw#a);%H!F%|#=kBo;Tfl?6N@W^fG;xV|k4bHWUMft_cES${w`q!dU zLs3{E&P;^glRUs8ve0BEr%|8Zkp9NHk3|JKYk(&eWAUQ z;l4J2#Pipo?C*)(Q{us&ix~oSIpf_}xk1!QDJ+1U=pe`tU{sLqZ_4xXkcg?2qgu8` zc`8%Nvb(v>!bF0-&?H))Lf+g4PgkKKeLak0l47)b^eU|2U;U87%MvU zP60%&{Es59KUIHhDXTZ7BpwMkUxlq_`yl*wC}{NAzEGYCo#)~;I~D}<)%VG(}{Gh zPdPVhz>9DsdzdfLG&qXJ99ilnP4Kym&@7Rii}l8Z2|@*3j#uEH z4@SH%b*KY5r7RwR05z^es(e0WYEy~mwF)(sCVW^zTUvn-6u*y6EvGP-P_XU50*K0HiNF8=0002fb1Flb53^wZcG`FehfL{J2AQwyNpJpWPq zuM3e~PO%#St{Of^y0AkEy?zEvsKex=q{0i$j+&riFG8BGhO!|)|2bJvZcd1dat^Ec z5^*_wGK$7AELR*0)p?nHJIT!_v_hK{F6dj3#C-5Q!+9AB@rG9N1%sb!M2ie>sM1u` z3*p_0T_+bqDD+L6+RUbey?`RCUpEY5Z#EFeXzehZ{VbL(=Q>Sf_6ntB9k7>QdJpCN z@;6PT&M^1^?RsH_)-~hZOY=nySz~d^&@FN^6104&d`)8DO}&7%XrslN_CToSQp~?j@qjbGO_wWkjlNwG=trhuzO%EV1WiQYqi$ zw27hNHIl{YOHWrH@J=3> zTz}rz#s{yz+gD%b$(3MBtKT8q;dey0G(6X5X%xOm<;QaqVGo9 zYeH~p(_J`Nf54D>iR!pHs-t7V=Zk+TDVH;GteTQ4btJ~S#nz1XwvDGj=;nStz>%c` z^p%ydRyJd$PZgP{Urx@WLx3ns$_Ba|Y=yWxU1Gh9Q)srw9a%+X-{F`LgrfRaor&%; zCV+rX)mJ}3axdt(v%RNAe^Uz9NP0yANkAzuJX=Vp7U@{IOZd}enT10D_!iVj4zO^R zM8*tT;2MAf_$pG4*Bo&khD!H3RQ1q!cyb8x(c+I%v6TPba%*?{2eLak8v>|URNE|- zqWu}xv=#aTP2MIFvYcrNF0|gNIgAfvfo4+`tp6bmouhCkx8gC|3JA=9?Q*LRrEUZw z^DK}3m?-Ja)Y?9okx3d)PQH1DN)_Hk83B#qSmH2&)tp!~Kz~UJ!_3Ci;Rg=*UENu(Six=ywRcz53EGakMSkGFA-2UNXda3)L>HX3_l+qRwD+1R%2 zWMkX5ZQHhOdt=)<`#z_>gFjRAXL@R;YPx&6ukK4?H)r$ms1IwM(QadPR{5M;jGJo{ zJ7K&C-dX}@E1K?u9i8l`?8uGYKYfeGs*Ai6sF`I=iuUJ)vPudUyS0fn(TVO1x@1h%W?X|R1!>8XQF-C!2$9tXY(n)qescjHKQ=ZHx54B)Q&65 zb8xLc#KGW>IG&B?hii77m+K$#-BN`Y|*oNIm9aWYM2meZ;2r24w7QFK&?BYanJMLzIaorWnhuC{bK}$)j@FyOyP;<( zf;iklK}@kM8>p2*0&@B?Gjm&390nKkQx*qVQ9L@lZXs44h!<~+RnJpFZcIP3688Pq z?Lu&j?IFj({Xpl5Q^MD_v(ydCv>o+V5bU@U(PH+xc1_YvXn(7W%aOsdaMGXIPXNoa z{=CFl={EubUHO@eWuwm0Tlun}G_qqUS}Z%#VfMKj*y$J(=w*(l7Pz?Z2aeu%htf?x z2RE~qVuk&gsyFA7G2tnCp(sZhV~31h&FEoa>aqQU2^k|nHQ!Be(Wg!!@d-6bGMH!)-qH*SV|l3N_(Wpl5i2jTn9%-}(~hcWZQ_~mwMMFHe z>8lu-v`S>mNy^mw_c_wE-JBUNIMv5ZsA(O({fti?*RU(@6bShD-#q>zSjxFvkpAd7 zdVEB_PfT^JK?&;%L1I}Za+#RgP~gJ+hF!BBJm?=MRRSq>HF=v9TDP21jf9Q8!86s8 z+(|I4zEe^#4X1q0gEu?)PRNF^Z{Qd-(M&`vCw=H!P-;Z@Ho-7K1CZ{>gj*w7te-ox zf>D)*XWWZ-&wD#DQpWoKGrRw4u@;4xr7%H_XV3Fw`)zYtYaLW7rZsB!fy`P+-&rn? zg(0(2<1sv!Clz%ft49gteH@He)q{7P@g!TXeZQrEmsyA}ui-$RRz?dpK?~soos%3B zH6P_~#_d|s44|ZGR$S6iLpZHx5(ZViQphAvPVXXfkhTKwmL^7XWaJWH1g2&%fH7mS z#>iJD4QM6V@knfaYWI{GMLl>rY}W#%fZyHsh2I+Um>rL-e|_#l!^RSgIpDq%?&!Bx-LJ5B9h1{@_i#@2T$9;xN9h_i zW|}vC%J`5pC2WPUPv*y+U-9s(Zw|Te<3n1wQ;0a~hIRh1GJtz0bW41Zj-5F*bC|TNGv)$NAf=0^uwVWT0G7M*+DBp)fF~^JR+? z+roAuS+Jog9lzCFDnqD2JqB3@dB5XG5=Al7$}Q8@ZOx9MCDj{x*&)8^?UbV@g|)Q2 zs^Xy(D=+yxY(5^EbX>Ahf=_R@{T|Cce!PnEH2Mf}4I}X^qZyHsK?FlN>?-VAZtFWQ z#0`Gt7lSGo#Pg_`yU$$~L8{Nmj_TrTJVs+wIz~pdL_WwTt|Myr3>qEaKt!_vM=8(@ zOy}q7t!vX@F3e${Mo(x4&&-N3PcaCcFO_Ys0vCwj&ZSqEhE^u!{Ae{95|pDOJH^}` zg5JO(DhIk?2!W<2Tb62x?4!nn)~QD^Cep3Um0eKbh8HB*3KBPMYsR5Xs$AW4I_tnKjV zw3}nZw5-d^9_g>nvNAAWk&PIFqlhl`X5(3k%2$p;KLo6ZXAelpAhE{|!CH95BH9MJ z@y~nBq{XGyZhMitmlP!mP01n5X3w{CS{i#!8l4IXxde@+d0HR_E`GkIv-1TOUven0OK(=2f;rZh0IsagTy z`GXk|a$!~sH7kgtl45SN4h_MsGCsIIL(PO5G~WdqHb6ybD5fv%lMmdJz3!;2ww{9S z=APxN4U)-IgZ4=d+f}w(gP<5U_W_3XHFJ&4S9m+`G4qa?j)yRx6S(p#MB3v#E)aln zz1NSA~^&H7~=2&WV17=@Nci7(5_t)lBY-T7O^T&{?i^QjQ|s>jM%;ahH_R>oyNi+0c=0p0Chq=~ z_bmADHW+6m;$?%~0(Xd1Pa+$Y&Vo3w#D#sNwpW3y1z!3p(m6s}ebAKyS8QgZcR|cR zwm~Ou;eE|Nf}fzJ$x}&jfDv)^)NzeSE`;t)*5d`zUhpjMz zcHRX*Q#N$kUbR@=M+!riZ=uU$-Rh5$1;nZNJqQFaw?qT7E2;){~4x0Z&=7M(a$ z;dqUOBn2AT4*)D~2%2((-veDB$la2srAlEc>a3YrtY<>Bj|LVy?XoYA2uDer{=IoW zbvb;3sBh6Gfsj7+tUD~U<1Q04!2Lsu{gNGoXvIMQqCYjcHYYX@W-k-+R?j<_hRrwm zHIj(Dcyav&@Q{Rus@u_9%7;qKEoiHnoDAGwKny?w%QbyQ)ybx0vQ`YPI+Gp4c>`$(i9iY%=26g zGy~WQhpGmeDV_tcPlvgEJ5W=uJ;?xGBwiG9LA{?~^5a-QaL?vp*9f&hNv!mcb>_5T z)T76XIcu&W1CS|O%R0vhb`ZUDN8;3*K3pm`DEdxBAgFDtVhlrPsX?xJ{*)sfmB3uw;07gmm4PLmN8QF8W#|2QGH(ptS&y zm-}Qg-%67Vl1z^qdS$&`nH|u<@p&LxD3BXe)HF9CBQ^Qqqin&<0pC3KMfZ+g@+^u_ ztLh~wYJJ#MCnj#iR3`$LQS9j{M4YrXV>u%MTu_qm1(j`%M>!VO-kH0fS6z1)jlLZi zn)*!BKFalXFY!iJtl0t3J7I`y_~w`oi|)TqG>Po(KfwiHAMx75Au3HY zLlpM;S^@T>Le;rdC(Yk9nM~6Gf165CW`8sY@k-qr+UHMvOJ1<`z1$Kk2!KNjoS6IC zsJMN5O*IfokQ+xn8qDF`IouLgEOGKUH{K8Fgex&&FJ$R5<>cl&CN|pV*oJaU^f zRpKE<_`yXvM>QXhFYoqGC%#Mkj9n%5NnK7A%M=q(oC=_<29(0A2U2au$d*jjZFgT~ z5k#%!A*@O>nLyDblFX-I+j=J2$)_!Or2cVb{SLzkgtwDM))5E(G@qG%oeMeObjnhO4V)-!LPg>njv5&|Mn=zH-{fU~YnCgGqo@nMFE+-34^jDPL zWpOn{h@8_^`iUZhawS>}+Q`q<$6YSguc8yBUPWd}pM2ySv79oCw6FMT*040Mh}k}s z$Eo9$NOuX^0piI4P%kuyg3mW`R&#ei%b2F!Z{fm%mc{B5#QgF&C$SWr%oN$5eGpGvHc6CFj9t+9S%9sncJZQ zkDw5?mX2uf*Hec)VD#4xV}v-nsS9t7;T5Vv73{3A+mWpsNR1?kW!p$yRH|MJNGe%xeWq_96$9yuV&+jF8WOEC@arfajXTscWxX|Hx zo@DM5mm;I=!YZf)C&>Lz1U1YJ6*eLjRRj7bE-G#Q?;A75tJW=@{u4V2?~84b=!EJN z;22)ke{$h3(l3e`PV$faXo9k7XH9fX@P_C>N&rFZaQ*FlRs7ybE-rC;BAG(MR z?ya?)JgmY$pmBUM%Ae8lr!#|+9&SS#?MnF0w;7P*7FP6qfqUJOTU~OxT8&s8sZnecc3wZ=Y=In3 zKtzzLiGKNuU47MeI_9?hgbVA^(&}W9iE7+z^{1TO7MyIw=e9ff{Z=U$Xcs z zwhXogt%G}Bi>>AhAA@^ks8!qVtExzDKKl!4Zm{PH{ImIIcE{;fj;O*Ppe;x^Ic1bQ zD5Kwd4atZE*M1-+SW}?3>QIM!kyyoCQQ|Qz9qqKQr0O}<@H;e$Dk^i#&%}|bHnynU zpy^zq+_Z0MGKJ2+@Nzh<=QRgypjn}jhK*`LG`9Y6;yG~`#p={;Q{(zx!%``LW&SQa zM`W7&R&Ym+z$A->ybb!Yoi0)seaXI4C=b9>3phSEGr<}PB z;@Hr@cxI)61A|PmeH*12XYT9@+9B9H2Nk8dYCW-L@3BZ}WfGRF<1s*LzjzY1==#66 zYY0{TgJg!Oq^MNiCdm|yq1~~aeN{-uuSxs8EN!fdW>wMSr38GmXPT?BW#lMEtHR@< zB-0ntk@|aO=8EvZY`;3WYwSB0lX>SnUj?attGEj($${a*1f0aG=R9yPKvXwSDI9FRuTvAZKIg`NzKwvVfgfJjPYZlxVSg-yWvlGb?-S^@vr zAz9$&{{2&30PKzqYOY;G)^nvn*dp+8f47TW*=tUt+E3ANY6Beqeal3>*1W*Qgq$-r zgtQHDSJ|slEEC8B@+DZa?MNq~*g4kEl&?%dc|^=S#8*ZQfyB!&a7R2Wx^4-hBvC_2 zD=AF@Ym24Q7IWCpytQa@s^Az}3C>wl$@MmpuI%4u`AcMP-8VEU+}=})rW1={0?<#$ zOW+2%WV{=G+zL5%y{$#z+spTgec$B`b-p`s!~_$a&(B8W^Sn?WrYIonoq;~xS|+VD z8DCf{@$GiDmpHps^=Ph!q0BL@wgPJ!WV`egX#O48ee~aT^lVlY|4V|AOqaJ!&3Nv1 zv-R;|;gkizBYl61#dqs%;?m-MKbU~L_^O@Xh_W@3V=Z>5ic*b$D>|gUP|Z~U`W``y zl^S?~@3(E5`jg}@z!f-}!(FZ9^)v2Luw~hrPCm|WB1jXT8W&W2N z4OC8n5J)oKuY!W}^b`!loLM0~wcka}T<1Y@=aqD5nK6JgBY^3MX2+0ouE%g5TaUDQ zvUSi$0ETflgkk~$J8$92e)Fu=jI6#d#$R^Fs7)$QD5g;nR$y-X+84PJvN&`&CbpEh zqAjpX#*VhH7a=Mhm+8bPn!EBO29Q~6t*`20+bUe9hXtYWHmgwlq)MCTkG(5mA@j8n-1F^9A#%w$lQzdlSn%{0>!*lp1xQ)$>Xm9sh#Es}U2%3p5;zXK%*%7E?M>ed0V^mMI`mLt zQ2w|V@6C|%ec*2*-fs2y|KQe(sq~qo&}`zV2j;dr)ILU`dk(uUIca=5i(4@1fGf^A z5Q-F7>!Fd`o}T@1sVyfhx0e&$H%x_>yPDRR@eUCYdGn+30LAc5PffAZyDk<_N{^eL z%0D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 Ujv)tsS3-yrvi!Ls>m17e0CH7T?*IS* literal 0 HcmV?d00001 diff --git a/Catalogger.Frontend/static/previews/delete-light.webp b/Catalogger.Frontend/static/previews/delete-light.webp new file mode 100644 index 0000000000000000000000000000000000000000..bfeda58037ca380759f3ea2e66b8d21082489e06 GIT binary patch literal 45266 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 OVC&cNXa8E~ApQ@S=u;&C literal 0 HcmV?d00001 diff --git a/Catalogger.Frontend/static/previews/edit-dark.webp b/Catalogger.Frontend/static/previews/edit-dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..20ef9a7cc725edb4def6ab5f0a69e71087a71c0a GIT binary patch literal 47618 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 XG5*Vw0UQ7Fg=Tg@2j~d&bRho+#{xsa literal 0 HcmV?d00001 diff --git a/Catalogger.Frontend/static/previews/edit-light.webp b/Catalogger.Frontend/static/previews/edit-light.webp new file mode 100644 index 0000000000000000000000000000000000000000..d0ddb5ed2a109585da150c973bcf4aa4e5ef5daf GIT binary patch literal 50180 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 J^Jk_5{2%(MiqZf8 literal 0 HcmV?d00001 diff --git a/Catalogger.Frontend/static/previews/join-dark.webp b/Catalogger.Frontend/static/previews/join-dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..57f15b287e93ea373e2205ea7de8c021a936fda0 GIT binary patch literal 79604 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

Dj0#Cmtfv=qb(%JE7*xr*}^^0N0np*ZQ0aIDv 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 SgMZgTpxs*mbb70FVE+dW`@G@+ literal 0 HcmV?d00001 diff --git a/Catalogger.Frontend/static/previews/keyroles-dark.webp b/Catalogger.Frontend/static/previews/keyroles-dark.webp new file mode 100644 index 0000000000000000000000000000000000000000..f7942823cf53d362baa4ad36415c6dfa2e7cb9fa GIT binary patch literal 32904 zcmc$_byOYA5;!=xy9amo;KAM9-66QULvSa!ySoQ>3l`i-Ah>(5CHdZ$_x5*o&)NTW z?wQ-wHPzkKT@G`VB*n!1{Q*E-R7gQhfl~t(006SL+X@We1p_37g%t`B-nsxnp|!D% z6DTqO*w{KdDv1jbX=rK@LG1&u04{(I5CRN_#!mKv3JNm6ssC+%!~eZ*7XXmoy>Ilt z=lU=H{}Y5_V(MfJ03Zr))IUv}jBNk_l=H3sWNh!~3;^Ko-|(bv&i21yjW-zG@r}VZ z*!nkY{txW`8#ej}PWnTmq9puAQwjjk@P>wt<^TZS_=YEPH8y{n2Y&7iX0kQ0w0+w@ z_#4b;V`FFX28+DGRBtr)Z}9K=IgS2j9`pZ!4GoR{&S_|9{ulmdFK;8?78bE|vbQ$$ z_|y5_2Sfl%zzMJitN}ydFZ$od|NplaKqLS-;`|Rwtw_;ezx&2crf+8i z06pYyx?=6}CbK^m<=Z#Bg`A$e8k(~U$c*{Sd|DmyPkx=~?Z|o%e zCeMHHPS(nj|H3AQBGUiDw$^gL_3zL8W|m@qX)K*3RsO}BI*BU(3p?5={ax40QCRR_ zyrJV8^q+ZLtW^KvElef<&hKfVqW&+9tEHOUzp#^)@?U;DErkE#9bJ_E?#0wrTX|I!;9{+EAKTfzU%>7?M@MSutp2V?-2 zw+|b@1V}iWy1&^F00`UJdpKH}TR0O5+S^;35=q(`Gtd#SFtNM`fZsmkHw^$>DgN;d zAea;X#o6V)nbr*efW`e6XOsc}Eun8qFaH-umIDAt!2r;MlS0EhxofIOfAXaahGF<=4M0FHng;0*)-pMXdp4)_eD135qe zPzqE5^*{^I0rUbxz&J1s%mb^y7O)E(0q4Li@CX6|0tJEqf(C*ELI^?*LJPtI!U@6$ zA_^h{q6DG|VgOCJ)bR2XZbPMzd^acz7 zg9F0^BL<@f;{+21lLylRGXrx3^973lO9smas|ITa8wUFZwgq+!_5cnEjs{KyP7lrl zE&;9zZVc`K?h76To(^6L-V8nf{tbK^{2crR0s#UKf);`sLJ~p)!W_a4;uAzNL@`7Y z#2~~x#4f}wBqSszBqbyVqy(fU zP@kaEpemudp=P0Wq3)sKpb4Q_pv9oIplzW8p_8G@p}U}Gq4%I4VUS_SVYp%BVN75= zU}9kkVcKD)V0K|1VNqZyVR>OyU_ZhJz^1}h!w$l(!Ct|^!I8jm!70L7!ui9c!qvi! zz-_}lz@x&`zzf6cz`MZ5z?Z=Hz%RpJAs`@7AP696Avhz%Ae15WBWxhtBcdTPAW9;d zAo?L@AT}e;BAz0_Adw>pBIzM{A|)d=AWb11Bf}t5APXZKBKsm|Ah#heBHy5(p)jM! zqu8KCp_HSHqU@tWp;DlVqMD!vqZXj{qy9hxLnB2KMl(hWLMucYMB7D&M5jcTME{5$ ziC%?1iGGfOit!#p4Z|HH1EUjT3lj{J0#g#x8Z#EN9&-Wn7ZyI2AeJdsI94^*EY=-1 zF17%+DRu;Q4fZ_tFB~EqQ5-9rc$^lT^>^U!Xx=Hlb9;ztrn5>=8wk{XhAQdm+>QZv#d(mv92GD0$0GH9oP$~7tkDt;;ls(h+BYDj8MYAfn2 z>S-EK8a5gWnhcsLT2NYcT1(n2+8H_sIxad}x_r7tdU$$4dRO`i`fUbG1{sDxh8BiX zMlwb%#(2hI#up|wCTpfbrd4KCW+~=C=62>w78({~mJF6TRs>ctRzKEO){FPF?@ixl zzh7cQW0PeIW$R;mX6ImcWUppF;2`5L;K<}y2`N8x<;fEi*B)o>adAwVEM0^H(xqMsv#QcW*`TXAnNCiv;iUsxr zsRcg@Rtla9F$p;eH3{7ba|`JvsOp2n4s*0wIZitbHnTu73or|-Hdx`f* zKuAbS#7itn;!7G!mPwvVaY*?{4M@XFD@&(Kf0v<=ag=G71(lVOO_W`eBbT$4Ymo=! zCFK+4*A*xg92CANLMkdKW+?ttVpj528dgSA)>kf9zEu%YiB(xurBZcK?NdWi(@`r^ zyHgiYPf*{|VASx@7}tEKX{p(&1*N5?RjhTREvo%ldsl}|=abHYE~T!!?x@~7J!`#A zeI$KD{RRUF19gLPgC|3I!+gUVBT1u7qjO_n;}qi~69JPXlLJ#;(*)B!GhVXv*g)GD*tFTA+FIET*b&&d+s)Y1 z+JCa&a^QCO>~QWV?O5yt;-u@;>Wu!DtWCI3xrDfEyYjhaxZb;|xiz?>xZAo(gc(Q&x9X|vWd+}L`e}z*Pr!2k0!rQ&PjnyaY@-q zl}T+)BTI`*drG%RpU)7=sL90349~pFGRd0F7Rav7!Ow}z`IT##yObxM*PKt0pIiW0 z;9BsrP_1ydh_k4y_+4>i@pFl7$yTXS=|CArSy?$=d29t}g-gXjrB3B^l}J@*K4{<#6gfyqJX!I2@cq5fgP z;qDRMk&aRB(Y7(pv6gZ6@#YD(iKee?Uz;Y`C!41@rdp@DrrT#e%yiB2&-Q*3`8G5s zIX6BpH$StWy0EmUv$(Znvb4W!y?n9ay7IW{zXq`uv5vf+yn(loze&AWv&FvExh=9i z@m=}*>JQ@|M>|eCPrJcC5q>7`5$=`kv+Q>qh#gEHY9H<%*&jU~e>y=q$vmYxZ9Ee= zn>g1v-@S0Wc)g6e!nrEBet+F}qj0lvYjgW}7jchsU;4oLF#JpX*WRPs6Vy}cGxc-( zi}cIdtIg}Hy`iJwpIiX!?Hkn03;-@m-tu)#06?1t09fsRa{NCOApg`QZ!pMz?%(MD z1OBHD`2FB5hX4u|0YJqI0A#)bKw3HgP`u5Lqyqp7Z`G0t7XZr2`uF}bCZ_N{s&N_eY^rYS+QKxnMN z_`vw$#j>S~3JOT_zfrr_qQY3(J_#)ks1HMxJFq@#NP7?5YBNI zcA|V}e$Kxn@=kotc&s_`>tT56rhM+dEtn!4;q!R1yW_v`JANJZvios1%b)OEbR+)2 zxTe40XaCCan)n0i^!2KH&@b}U?`O>(e~;hDE5>90Iot!*Rrl5AYPXYLhv(>V&_?&V z@AxC=qwuZYugxF)vk#_z{VzdtQ*->IeuuAw=O9myk9);A7vA{Y{4Ynhp<775DDS&h z?A#d7ULRivUcDa6PL2*YUkOk6z`OJPBCZc!UthboUeDBDUmy7qayt5Hb^yC$e}v~a zknVbb<5mFjWdzt<25=vV!2C@9UmrOlp+?kwIib8>s1vQ<)lG$rYe4q}^Dre&?urZ2 zsZJ@niT8sYDoYXCrROI@Pfsm6!=z?(TbRKY6io%9 z#GRer-;qVJjzjonmqUvda)dT<&oR6YYSkvD^gpZ0H${p`r)9h>ft_k|hef`2j)BF) zdD}4!CkBVw~Jr;Ew!-eiLkMKd&&msiv^#x6}eFCi$ve} z>c+vq`a$wWt6~t8b>gVuKYF6oGw*+tU%hK&s-io^5M-%Cy06$5JeXX>;02-mrID6L z_!wOXLnLn`GURPNoa`t`GL>o0i>Y9;_FvCejA6KG*()io7MO})UJsA)j!>u6)XKcG zWgk<*cdUf(u9QiH=S|cbOca zRwtRa6>R!&BQK_X8W76jojZ~l=6Tc%O>X`4W%~y2)FA(e-i%jOe!Nu}xx8>x6YIB* zM?@hzb)lDbBRmi>P5Zte;9<#h^0m5;DfuIt>7)<+NT!(d%6pljKJT<8@*943e;w5E zA-9GhAY(3)uPp9GE+*rIY^XKGa&nfXJ^t9zQX7wTQ31uO+FE6pMz!>S7zu zc?YW4KfeBavVBb{r}TY#N3`!V)}DDcwW2Rm>5DUJ>|w1Q!A2gXI0eq7|36*=v{Qaa zRP^3%6p|iMMCXn0kG%eo0@jJ#8%n`t#vl)OkM+1#>}kPfb__M~&W5K%CkK1w0;~!2ZNhK z>(@nqdAZw{G$o^F?T1Ip!(FDrf5M4@)m1oq?+e4^O#SixHJEenP3@Elf2*4|Ky@%R z6bsA11BWShDnPpHJ8@Aa>m#b`gk=^>k%a=mnu5y+smrK+t=wq>fra2Zo|6`K+QQ0q{Bn;?z((Z#K+%qmy3N>YZu~D0k%uS(FJMAYQX)j~M$T;q$ zGhdsbpDIy%(-c3y%gAzv4aNp*1d8=P0S%d;=1q&QnzZgv zCPla-E`JO2&FUgA;(seNd++JJQvSnA70Xo`7F6k%FDTc&eJS+N`9o?b(X^UP_;L`W zb!%cYrKd=4ZwB*^>-k@!#pzh&j6n#0#t3*Z3{&nKA_-^5g8!|B1)oP!(@1dY`B@M;xW#xKpWNz(7VE(nheA zUoAfioypeGf})=xJso$H&iSP)B9%KQF{~1uhzEXS-|W;|IsGhToD}{tDc}(pf+O?C z^Szn!+acmwct}NF#CcESVDP#MaYcJS~$7pc4eac>2I;cWnoi+{JjkPeEMQ>Xy7vV>2v4YdRh)J8q1w zAsf~fPKUs*anW$dK@l-&(>qjp=}T}J62l!Z>hl#$0MugRcZB(mvXZoLC2)@17cv>5C*gxAYy@-d+mS%}JyJOSpRn?#;3{QQZ}Aed2bSB5M*L%1l{oVP zW;Z08maxhQdt@#c{+X>(JeOQQE59RnMIu%a-M<3(V{1|gzfHs%$VYg%?bDVWKs`f7 z`MRblM&Rv!TZ*bo$5vS@=+1&iRNmL~->9tL^gB=sE{ghPi;&s&z8>YLYjzrOfh8bA zQ`!>Q(8G5qr)1OR+bMZ;GDxZL_hn}D!5bhszopwIGb`*Ii{AKOa4U0rIVt0kkc{FK zT(Z}mN2h2)v$lEUq0j%j%-!|xWni^)8YQ~nxKuG>X?vVVuVALu<48$khB64&10%kb zt--izl_l<;yDYH>cO(xzuM$M0JRZKTITy(9@X_ba_q7{iL=HNB_??9OBSPNi-*HYT z`Rw{Z^3@Pwy9BS*iek0GBbL5L@_*8fKdyEZxX8HQNq~7bgaJI5glvIQ|2=la=0Cn- za^A{U#0l12Z_d}G=iq)wumC9`wx20pz#E;)_U;P?H*DK^dKKBtbL<_Hl!25a>9$B) zJ*OyAo14#*AV6d!t2OT8)fUws&Q`r}m|()^Ft4B5Us8YWH4PEh8|{)%r|oqFy;DVz z<0+7P7-mc7Xjo|-Qxwr!C@xo#Khih}5?nlE{Q0*&y{Uax_S2ga?JIa-f--lgBldM0 zShZ8I9OfC%7=e*AP@RnBIuHEp;mFK0&WCIxe~+rPRrBF<;PCYWZ`-gk`!>Eh=Dz10 zD;GCaGg=W0S{tABAu%`<2gHMSD>zQ6*=U*W7w!BNI4&�TaT_qaWDOlKhfl#Fg92 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

Gq znMExs#L6^LYfE45Ii016x}(Ai)MbC4Lp0yBABg@Kn>+h%oWchla?wofaXcj!oe2S{ zjHhQ<&9SCjpsf9igK367>gAz6$d8nS?{!^`g~K+VwCKypIe?f)io|YGe&WLi2uOuy z&~rfm?_Xu316d#ws)c(6Dj+uC+??r4mg<(~tUor%l*s@IC<#Bf&V~o9+>su^f_h$F z67YeGf91g|553An-;Q$$AZY)4)ttc1mAvd*ZD5>6k};hVWIHlDG=_Gj9F??AEt7-; z!H8W=_M-9JlrWt|A^;^}=@mD!EoG<`Qhd(1ct8aa{vgb|z<=#NdHwks41d>TJD?X6 zvex7T>~>=Y!t+3}e+Il8d6kT@H`dAMEdFK;ht3bu9l$p@TJP{yblO*usB@3)T*cg^ zu~X*pdVAVLz_L?~1?R(Tlb#y%iJBsx##NOuRkIl}Q>_L#(NX0ju5Oaj7Mo0C?QtIFDC7qPrqcf-2RnoS*ZoT8z zu7VAo99Zx$BI-zK0OpA6pUde|y(ZYO2>RfU&$>IVz9u zozBmc;f$k#^Oc=c=Kb!AL4n6j!3=7%5Clc)Eq9pw$YGhh;?YtZn(}*hNYIFl&6tn| zBNelkA}PBTp@;WM@MLkFs-M1Xv8%x@_uB*28|I1QWNT?193#;8*eF=#93_VQ#ZM$n zNUVK`d_|)A`y~L`R8!WT%hq{~AkxYu$xX@5zAo=+RJ303@C}sF0pW-LLq!)Pjw9lX zf*N}T#-q!Zn058-&iK+^frn-{P>Isc@b{+WZ}SxquvIet@3vtg%?x(lsHp+_mZq*C z3c9w%E7r|4ey6MEBHxSJ2fv_8tV65YoMH=?_W%%*EY)YnZF2K=OdL@L+Kp1zM2-PV zLW+*lyK{^?*A?sco~l#r$%l6g&;3Mjm^fgbi@zr$k(4430z_nIMhcKb@3aeX6p%bk zYpIXQ)M^_Cb#62C0=xq3KOAyRDdygu0|{P^>*Vtveaq5d;oW5mX_~KaD!AVZFSaL~ zGMtD*Ti5tb%i7R6!mrWHW!?3 z-m@Hy1k_%KkMRClU<8>&0Ujf(E`)00N3ol>ta7brDRz_OgbC)A z-r)CL^#h@qCYS2+qAEAQyX`Nb>poG-C3G#a7{&$F31iXsoX*b}NR>ey!0{rf=*)Va-e}aK!HgtlMv~rX#^u%+d&De@0lcjWwDXXl9%mxzjn% zrDz$GXJU)rk|J0g4P%vp1&J1U455eVx8F#=NkiAJ5N8%KE0@RIcp8#N5-+$`mlXE^ z5F=FXb+3dnogMh~*Qp-$6vEEj(xsEV9GTrT zyn35}AxffhaWZPg>A}NRJmwAD^6=u~*GPv{2^9Id--n`{5;V1HkXn&<7^zBMvKo;> z4L~2hXHD#oLg_tk7weEqKY;uYRefDS*5Mq+?A57WMnEMAUpR(-pXjD?te$2Uvp=$k zg7h6>8t8KW{A5OOPaMpxaF)V#WT(zBL7>Zy*q(MkrbU{-Fs7d8z?CnsMHw6AJZZPdi?n{?ckEPl*M&UpN$9$!724+zGuT|r;o z!)9)^&h4N0IJmNsg8Pu<05s2Y1IXZAaFX00b8v)U=_uNMpdOd@ERv7y$}AD(^j*<7 z%}wTFSv(fc4L3Uu2%oc&Ob2xlq&~Y4ImE?x#!~U!RycQoy5@V%8`LHc?8M#O$zF-Q zO0gU*`v5d;J4{acU&lxpVqy?Y?T`QZajpNNhn=GBP~S*w1m(ecBLXBs4B|SQzcn5# zh96H6Qh^aEB{xp_@O~J27mGvh2)+U~g;X2B@7AnAoNN6C;{~i)E~d3D&Ej1p4K^jE z`8m?R==%&L_A!Ui8@}`RL0w8lKO7v$g_Bh>EdxOLna_V#XgpWu%}Y_&7e7+fvR%sgeC*c7w3E z`9>!4RY(cp{g4H0EZ&@P_m~D?Zx@5ZRzSq{^OXBA?%$HY8l;ja;K7LL&{Mx%S1R0m zN2shlQ|pIy3l^{t=I}bS5Pl#RJLQ^{Lqrh1-DeWK3q1X6_}oOmmIYnR{?Zy^A^>y$ z(2Ez^9uivMh?|Kowh~SxI_Pa_)4BakPps>!Bczx^R@-2{Mx;_eo<0zv4kl4BYa04z zm+Y-A5xvsD5ps3qf>X_jOv46ay^=t}<7*f?Yyb#sa~bNykJSLUZjC60ICN%h!UaMe z<>}?BnuXN@$@X*|het0gRv9Dw@}F)f+PJ7o0rq@(?K6q*aDx+gm;e~9 zUDQcR?F`c!v2gtnVpQEV+)fH>>b?XzRx8^Q`V@;WDC+^0A}pEf%!N?+HF(OLN7J$r z8#|B*Zf*Hn5lv=GK@v*U!Zhq16#04qHGFv+HJ+t(r8@+6lt36C5CYL$T z6!KLa6^jper4}R87S{D`QN$@i8ccz0-~ujm^EnY#Qy}I7MBiBDPCGl&jDp`K|8>+7 zwAq=a(Vwb!D5x|>GFS5@K;`P~ru0iC&K?ri(M0_Y|0b2^E@j+G`P!7#f1+@+CEuMO zif%*TN6C@^vq%FFv43GAf zqA_evU$4X5R+B-(s5d+9=7iCLQ6&rh6k;~{1HmZ-h~&J4iH(I&Jq;*e!b?5oB>j9| zr|a!006}?~J)F%eehaa3ipt23D-sSF&K=};4_fWvySkrLk2sf8;|4!!WInF7?LX=4 z&z5j+lGZ!Y;uC~r`k2o>_6ZjltT_c&&nz~`W-zF6GvO7NmFQX`J@hLE0#60U-e|<5t@qr5rxRGC#4IapFYh4%Z)#ga zPsKb$5Aw(FCn&0Dei0eM5n4Jfs()R(wdBLI~i8XnoXe7jMpg&cCQ zPdaSXT)?GY7oK1;if#p{%n~qs>bE$G7Rs=vpn;%aLJj>d?QPUuKd((vZ3n}ED}1QG z=#;duH>)biYTEX*AI7vC@tZ_q+-eGdF-m*HY{lv0GO@R|lJ;O&T^tUJPU#*ojJJr(8ngU;kxGE;e)^fVO)Etu+`P&Z`}663=`p%60Qt)nV&ax+CspyTAcDK z_BrO!j-*X@B8$N%{>y}*^3zftf&-DBVp9BO-T;nYq;?f?ufD+^+OT0E*wQ#nk)I3j z>!T9n+tA@e7Gb)sx36NoAp!BMR$-=Q zBx&sNZJg0)w6yAvV=-;h&$AHt#VTYoe&`e(4tsd0q9-&OtnXw&WhX>G54n@D`Cacm zxB>yQQ8rFNi#jy+iqZk?&k73nx6(m@gEFVRthos;%YQhCa~3Ew&`F+rW0LE}7h6#D z$$ioNcLpK7{oG8uN9LJl=$NDkPnzyeMJZqVEKpApz;47UBD9D#DpuxGprO=biAaWP z>@g~Q8Vn>LI6`K>d?5c!P}0#8#Yv8gMX1wx!LP2$;&O>?G&*aBVzvVD;!CVMSg(n?&@$#$qJWN85urQ6=yTXuaG1SYZ!dx1kVUYk!! zwj>;q35e>tqA2JxOjqXu!?wG03PxJoniDR3?_sV=1fqjo`_0L;ejWCt*k@Yi%EX6xk~W@-8j!Z7YQ}tPq&{*O8R}iSd`DG5S`=iB z60i~}QDV`#%_|^Bp#doO5TTS0C16`SzxXcb%*iLhvp*E3@opK*#Y-{oEc{q@*?5Qv zB;fH+VJ#mu^nD}y#$@9F3fd;8xro-$pmnp?<&_IDOM){rVCbB5evNUHYJwy^U9cTw22}1xPA$up7uK^vu}PUS2+a81(jPtLVQ zE&N~ej%;EW5wl&WTQ{QapgzDWuRtZ8+64qQEpXh87{zu7CtHZ=uSSzt^n9+hF+*iztxorpA2*0yrG&b4nM^sb=Q<9Cmtrv-NUGM1E>I z!*rn!U(FR{ZE<=VNuB!MEH?9JbCK`CyqTJ1|q9*T}4 zUAaX?#JwY0i;KDDR3w|caSGD4Uzd<|ITMZnnYjfJjVmg#Z+#xGTiqnC#iM9{dTDpm zHuD}=GEK~<0(ZEY341rW$t0lhQ^o1CAtINaBSqIz1ZUDDUnKFtkG)v5O7+lad>oFi zuOLBGB1AR4`H-Yk-%gug@0SZ>;7sA!*g8od^$aYZeil<&S!tOuoU`kVO0w`;r>k7{ zkac-mWsAgti;!r^Q~*umacPGZx}+6T*98aRK%ruUKhoD>7W?+509KnZm6lbponJ-% zrip71DOZRmPiB3;MXo>MR=}ztErZlAW}S46))-<`q}_l=8_d0mTM_O z{2tHo9K(Ai0ero`8x`Zn+Uy~P_zs1u_@JwA;T*YFEfaZ7veR_Y2^0@L4yVNbJqB z1ii~PI0zv%tEy-CuWLQ1laJ?a6PONATWj|ofd-rSkiu)sn~1Go)`6EP;gTzKAGfgq zhk`ZCM?ljuGtJJShr)!rUA+yG@|=Ycb!BcY#hAIb z&)0^V{qVUAg#CH#W$kQK^mh94H_ zIpCuYBXk5KwuWoG@BaJP^fHTyopf&<)51m?a+LN!g~7nU?7I*+k4Q)gX4nuCWnz;%ikkgczK9dzDKpjPbD3ZuzBGWcLF1jLmAEH3+yryBrid2Sc%oCs$2IupM zEXO26`>DT1CtJHluDIan))aofw&pRfseqytvKb>q?Q6V~V~+kIHl2f^5(J4mDy zA{)V~6BG06X3mr6f^~E!qKXw)5b^PN0OCACJR~Qix;Q{iOASJf$-dsed>p8W2Jo6nE;+ob#mbMj&fQE4a(Qoix z$hj#XCs0ZGZq8S)N=1;cpiPnXdtDoHXWNR@w`7PMKLCWQWl6F7bZX;dJ{vXeJR$k>j> zDT0lwO!#3MgWe7UO31rIIxViL(p~;z(jIitZ0!K#VAV%4TA@v}RjJ`Z<)&TktWUiD zPvN;j*%Dl57tMKtst{UIxQPhgiVOeQzFIU|L>vlp3z|&0wrYh~*zT>;o!+O^3-)Sc2YOIBf$a4xL43pA%r4^VQdR{xIs5hRq3%MN_*sN8;3Ce=}sD-RiL48@HNIG#B4dP@?G0g$&~u zWY2h{d@YZSF>diqO)6qn)H6}#OP$+0K_X6gTLT21`!tvej)^+IaAB)@8qWo+{O8;q zLMQ1f@v=CS9dP!bhOQ{R`6&fNk!u(Q<8|AALkt+mK$v{rs9l{``)xVi9Z=#DVZ9c= z{UUa{0C8MRYULaRFZ|Z(ChE9Ho^Bv?g}a+9Iy8U2^d<8mas~Hav__Ok5DPL!Bmq^YOw!XJb3Yr=4@mwa>1nv^Eotd;0Fd zY9Cpqa%-x8+mtVO+R!ZJ{D_Dkg$PeN4QiS*$goYwpMbm3*cyjv;_5CHGIw%ZV}PSw zg81SnZ0OyC0Df$n>@q`xj7J$HAHr1t+iW$8VcBBm%g1`pqDzQCl_ zp6iN4aW-vr;ODXntF=7HJ-FPcnVrQT|1-6~b+D-8<~e#^KM?R&n_iIu_`zKL>Bg{J zBEVI8IY<$Xb?gQFfN3F1B`r=6(g2l9t;VW68XGfQ5QsT1*xI@F$x1CPZknuN5>f63 zOve2#%AkEKVVP~=SJQ%vf)G{=X3uZZEl!B47t^gL9uyunID0BbaKaui3r3Wxm)sTQ zi9N8Dr^+Lfl%Z~NDTtiKE7a;wp}NyejkyE-e69WVkmrn=EGh8n>oIg-BS zh~o6o>h*5lGFM|v*KPGf=p2{g)7k6R96BEE1fKD&=ocQqP-MM%@cbT!cv=w>yO*&$ zf7B{}YbtX+TkzSBCpj4qTA^4R1U8aRT+6jg^UfZwzu%0@fBs>2H=rRcdDt|d&L`T+ zIv#eBV4=Zf9r@c zr6DpZ?@_3Wl_9~4G2fGJQvl>xR=QWvT2K^G zBuXq@dB!W_RB&Y(j1#ZOeB;Z(r{(hyBal#4Olhrs9BP;z2q8S1;`)$=cU%I>_q99)W_rqf3^bUQd98bf31oKj^$Pxa2mT2HZkzXZ=i$zqff(t)z zt3E3tJNLG|jdj_YlOm$e9gq?Lmz@d>PQS4farUoxt$-uLdUQn1sARVHRVAg++V z15NnZ8?J*KNNzhYH2%~CcA~kimzgXRA8VYFCXu`|xqOI316Tzh!366oEo_%$n>!5#FmK}D25dV2g87p)~h< z=rqNC4VyDQ|Dp0h??l1&zKgvZ5B-2rfAhhhp}%riPx$nL*LdHywjM`bK&K!os&G+B zu5-?O?F5bHux6R@H_daRm?)FKIjFzEIrQ9ZY{Lq{zWtadYo$>^WDUl#YOG+SgJE;p z)#G~5pX9$&EkUZuHxrZ<`5i`6|+fy@n*h1iFlbC7rqgJ@~dK$ckLnpv=wpYfaw3 z9HN0+2}+#T@Ym4bZ3k+C_#5~)xh^ebnsLYB<$5ZmN-|KdID1=x8#nf+;Wp2XKH@8m zWnyHXy30K{d)7~NJ-|!&aiclIGQW0=)q0MVlod1GI4~4LfyLcelP^|5OsEgKgtxH5 z7@A^^dQ<$>i8;fzG6fA)t= zcAHUDt{?_%I43~|t`C%Hz@MJg)s^q^l7u1bKJ&tY&o*PZt~31FtEU_C-0%q|>+5$z zMKOIS9q)jiLbBvL>+cemS*m5~Q;HoSO`t#{moM>vwvRtb=nv8b6gj#fLM>VLe2}_` zOs@1PBL#=A8f&Vn6bhHC5pT`f(9o&!Z0z7DU~-NZN>FpBBP=EKXv(n4PT{VM6*P~Q ze_4+OA2TR-97zxx-sze_n4XAD4{T3gA&?UjylkexzmI9XK|FDjw#z`oNrVn#_E;x` z)y2kf8EUl)6r3-t0^?pK#uGARTQ*t!m6@DjxxJ?Hx9kBxwgF5R9T|b1il5z~T4aqP z6%&3b{Q-@aRhAzd>`}!;kgIf2(Dyxv6F_k$gvOmI%htx{gekxGNMrNp;dwl!;09Y_ zLCH^#l^%Ar669?Ms56xg2fmxqG>}JThT$I7xw);R`x9?uy1K?0C3hj4AdlKHh=g)V&kKzjc8BTNAtuo z5(!~*K#j32y*!)`$1{FACthq!gqem_3bV*>sDl37CGTERFE>*G6m@f%zhSmX(|rUg z#ZvEdR~`GrD)jlgoCSPwVU2S2miKHDAbvS!j7ye;!~rFa*v;<~>`p>nCeEx;bR zu4o~Ws)r>g4i46CJ17ly^`*LO@(xw7JQ?U_snLyd9Ho2>Aed2swBo-^ueNQUG^Wra zxdx!b82M4JyOUr#IgD-@qX)2O*pD{oWKE_ZDH|jgur!N^gzaB@Nv1U@#|swyQ5Ll!EoN%s$;!{ZWuy_oujh4Z(?V=85%2@8=`-VCd;aj zfD$O7SdA$MA^%+}N8R5?n^TRwKygZEqFt8UDWs%!Mqvw7Lf~{&A^6uqG;k(6e*^ti zuwQEwPkY;~e5Ruouv6Smc;Hhi6dkNEriK;Co(hkhFPEHb@hgKv5KOsLfYLK%G|!Qs z?rQDzjlsFc6Km$mlZYeqV;2)1JOnbpIyvZzeb4oqzFER6dVG$s3i62PX;Bx`h;ADK zq3t&~O8ei$8^e@c!o8vcT_QUmP^{g-5sM;7o3)6@%h1`v_4kFOPiYB^jI7^K5-d$tINLQ!CVC~t7S{ti~SJnzlvQ+u! zx{fe|sZ{#jDA4(zlD5>9Mty9;IZ@D6Ri-**iYCPZWDOAJzQ?z;GoH;NXY$$7t(R3Q ziE7xBGsN)#Zo!7(Z1D%{$)z^R_+(KCv!H;D^QW>^+dzKDcKN^w0(HvgURLzwh)-gK z==N(_NjyT0x7ZbSp+lK;O)L)(5@00}Nea%X_fzxc-3NeAQtW!vlu>ssgt)12>5ZGJ zW2d-zv*I%LaNRt;5%Sw2jV|>>q@9sS&%1@!VqFEwc<;Q!J4f$1OV`!IL-p#>-#d(Q zOLcL=Ux#?5VL+1TK=HwMP+wX>!Fp zWi3w*^w-d~e$sc+F1XDoW3^Xe^x>&$k|pC9HeH=GsujIn4!Ka0sz@NWMbH81m&nCD zwSy^Io3)=d>?)cibF(~u%*=x9dlP)HxL8)8e5q1BbR`KUER7925t~`xU?7lupj+zV zm*!gTQ*%4GtNwHOO#p}tP`r2p1K)IG*0|lNQoWl;rNMhysFpVdpL5}BDLigL_xC=$ z-Z-FajZK&%0aQ`&E6^qaOgvNwjR<)dtJq4OXqhZ)Pp)0l$lr~cV*qC>IhvV;Ez#R0 zk_hi;AFW9Qz`9R(R7*!AUCTlPYpm<}P|5&P;(|!k$?Tdw#H?pnh(R_w*woQzFP`;r z*?LoitWA=_&ln+x{CDQ5dC3@Ve*qUV_)XlFi|lUX0`$1Q^EB$UGNJeii3J*InO=16;!SU(?Se$3%Zm6c103TB`10{JQg!tY-4@BzS{28*tnI&QVlbM= zXh}GhSq;BQH=^|1xJk6AdN0}spkCjY99de;`3}5`??(L(o(!0FLdo>C$3XFef&4{g zc*Z1k01ZmL;ld+VNH{SQYd0?>Gd{L?{26YG(UL2G5YtNyW4bUvoTF;M#IsgEK^>o_ zXZ|#y57U^aO@5N%&o7l+4N(_ih^5Y!0jnT7v*m3)wooXk8_W_mkp&VPvNG~L@SF&6 z`E;eW1ar&+^L=x~aUQE2SqAen!n;fGJ-jS){m24m2s*G|zkKOH^+9np?9(y0Sn=O1Ac6iPJZwB7n4QQx6?OP*8SF_(_Uq9ap~ zB@HhCgMYA{@>-BLwm3k_ut)!D1U&nD${3)j(99yyZM9<<(dZV-ixDLZqil;i(0af| zi-;;DmljWdnsD0JZaab-@BjU_NM&raf=l844Sx49oi{yC)are93dSIJ9U7R2x>nC9I5)#JsqgLa$0zB^N-jjH^z2H$gP3AK(cKepGByOd@* zKKkXTWaM|exy*NcFO={g-OY3}{Wma2u5-EX#3Ko8p14Rf+HOaJIu+Uk<;S*vpU`OM z=FR;uFV~APYuH6hbOpQTt&}FlD#w(q-@1y9;Ek1rqv`yF?JX{Co^Z(vU(+v980tH0 z5DUNH%x4d$ygk>HKMnHp?pm-iYpZ-bBmTK`hW7_$#}Cl`85MXCbcz$v~6WUzQXfb3Wn)2^`8* zxsx@wQ8W&gpQF4|pp3ya{y2;i0ZqMF-?`TNCZEG*au`}}ZlZyLXK9yp34bhCulqG# zSd`m+QKpJ1B;8rn#N3^!3kbpTKw*l4cS%cN*@Zjw@Kz-M;!GlE{)2H5SxEac^FPql z`37b1)Zei}pcPBWg-z453)K$4i49Vy#r#_CyhHVs*2quW$2$cCE$wX1=LjJpDP32$ zCO;J)Y9=BIZrzrSa8hrYMrR>ttmw{XdkU#&1vpIKYkCR=u1p_}1X)+8xJm!!h|@0? zmwUqrXs`Q!ruqviAz+{HZ#89}+JDD8em%%25cJU0ZYe<+`Md=0V~LAKt+61GgOKQG z%DD+FaLM$p_+0PoT=EMP>pPD*$t2AN`tJ8*x%8G7J<@_PGh=o^awRr^fa)`dER!|2 zXBz9n0Tc-RH>oo*;MDs@k4gC7YSwk|&W}d1q^$B;@-ES3H_Ao#!o+Y#AJ{7?o|&YQ zZ|vcKYOsy|(v_Mi?qfz@kupi~Bdi`U)b3_)LSJ2Eq;g#&{wo%T8^^4iLlqJUtM=IQAg@y03a25we{!U6ctfa4&!_ zSfbqc>-!2x{smoMra8 zXkf0V(p+l+#p?rIJj+guJO*d~MZy+{|1nT17YL3VOaHYblJkaZW7<~qQOfReX$@|5 zzkLz5f9q`Lxo|BzUxzMVagGoBQ&no)wJT?v>_bLrjoq2U)G@^f)=YRDZ_VmFuvBmz zW1+MPF%9b-F`9>jL?7KmW{4Cbzn|eG$?F*Hk)l3R;DYfO5_N@W`$^e-QGGPHPy(s}`IT4|@~ncnMEPe6tqDY&@891St))`Qqv0vH{R8k-cg=Qh zA1p!Gw^e~zlK+_Dl{N3VM+O+-t>vd`UpS~NZ*e=GPo{#*`rRHt^re=g?S&T2G&Nu# zbfH9Xbmwi}_So5V`2aYCpq=)xg~9BAcNnwy2Mz<&Ty^*Iq{xSqfS@?294U4z-8;TA zmN&hfcE+t!)-~GV2+eTIqsKrmbE?kPq#k_qi1SkTuqAOvpl~Hdva&!u0QwYLppH$_;w8VW)MWQMewlBoSkB&)3t}0 znGUy>e81kHMk6EB6~f?r)%{hG^~#9^?~yFA>NNpW-e;%$XRJYAfrEJ-ZsmLFbz=b2 zFQomIOe+gMMJs1O0l3_rCuHB~*Tc>)OKULy1P!0M{WVh@Ii2N2Bn%iAfYVQoXDL96 ztVk{FPE2wm~a^q2BoiM z$slNqNE^qf_q12!p$O&Vyr_0}g&a!F-!jdXlT2xZyYxGD`E!XWWBEx}9@! zC~!}|xTQNf$+`3L_Z^%U4@S(nMxK{+jSyS7`?*P$tbBF8&vMQL-b6^j7zXOx1TrUQ zF+OX5e;U<(`E`?+HKXoSYQieSh2_OdZr=a|_*N=C81`#?Q-MrrJ~Z)kd|`PbPg|j+ zJiRT8N~{qM4B|vs26ccF&)BiufxKjJwzJNIJ&*PfKb9dCK`O!osU`*Ts$s)9i6*)S z)zuj*OK|v5I{mJjA{X`@RQM2hCfj78eLKuO6sG83?7zdQCt8WZ0ngnO^993dHHf^$ zBVtF0d@aUE96kkjOi_5H1YWWt~5LSe=`35B%|Lb%X_ditaA@#*_vPv&;C5%Ct>d1Y0p zuHY6rd{pGG_v0U06pX5*d^)BQQ%FaBtT8GWY5Bm0&ECPmo>w#lApi&pg;okS<|d|y_?}Bh<43(t{^w@87l?a}``tRQ!$172KB14}V(9;VD=r8C z`mdL!oFWk}I1mu8fQN&TiH(^Hk+GSD6@ZWAw!5E%$jX$DM1xI^QO-fc%+gBI%gIc| zOJ3E)%f^Julth3ZhS!7J!_L9Z%*BYv!_F4q%Y{vcX`9H52NQnLm#l?n? zR?sySng^ko?1m z{+n|%53B#-9pFs=UzSO4VsFRrAB2I4o{`~yrn^{~|6l0;LH;+ogQdNTy|bmg!++nv z|1!mYhyORjf8qN-n|K&G{GZ5ja{vEyJG=j78_q6bZvO)D--7zTtm*%qz**JP!HhxK z%-P=6$;3>|%?#i|`d=dPpSW-rEtW>fHVG z7_aD6YWML_Dh?Bat;~FL5K;^=&>DkexclULrVJ`B3i2d6-Ku_({J=k~H73XVava<; zLQ6B8+`XulT}#f8Drm=|U0dlJReW7TL%F-IDgk5coxQmnCvqYX1-l@V%k9J=+~4H- l%bv#CGXF>QmV$*wfS-K>?Ew+ Date: Tue, 29 Oct 2024 20:19:49 +0100 Subject: [PATCH 11/57] fix: don't change status in test mode, fix broken guilds query --- .../Database/Repositories/GuildRepository.cs | 4 ++-- Catalogger.Backend/Services/StatusUpdateService.cs | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Catalogger.Backend/Database/Repositories/GuildRepository.cs b/Catalogger.Backend/Database/Repositories/GuildRepository.cs index 74a4462..79d950a 100644 --- a/Catalogger.Backend/Database/Repositories/GuildRepository.cs +++ b/Catalogger.Backend/Database/Repositories/GuildRepository.cs @@ -31,7 +31,7 @@ public class GuildRepository(ILogger logger, DatabaseConnection conn) public async Task GetAsync(ulong id) { - _logger.Debug("Getting guild config for {GuildId}", id); + _logger.Verbose("Getting guild config for {GuildId}", id); var guild = await conn.QueryFirstOrDefaultAsync( "select * from guilds where id = @Id", @@ -52,7 +52,7 @@ public class GuildRepository(ILogger logger, DatabaseConnection conn) await conn.ExecuteAsync( """ insert into guilds (id, key_roles, banned_systems, channels) - values (@Id, array[]::bigint[], array[]::text[], array[]::bigint[], @Channels) + values (@Id, array[]::bigint[], array[]::text[], @Channels::jsonb) on conflict do nothing """, new { Id = id, Channels = new Guild.ChannelConfig() } diff --git a/Catalogger.Backend/Services/StatusUpdateService.cs b/Catalogger.Backend/Services/StatusUpdateService.cs index 414c2d2..6c0dff7 100644 --- a/Catalogger.Backend/Services/StatusUpdateService.cs +++ b/Catalogger.Backend/Services/StatusUpdateService.cs @@ -20,7 +20,7 @@ using Remora.Discord.API.Objects; namespace Catalogger.Backend.Services; -public class StatusUpdateService(ILogger logger, ShardedGatewayClient shardedClient) +public class StatusUpdateService(ILogger logger, ShardedGatewayClient shardedClient, Config config) : BackgroundService { private readonly ILogger _logger = logger.ForContext(); @@ -40,6 +40,12 @@ public class StatusUpdateService(ILogger logger, ShardedGatewayClient shardedCli CataloggerMetrics.GuildsCached.Value ); + if (config.Discord.TestMode) + { + _logger.Debug("Not updating shard statuses because test mode is enabled."); + return; + } + foreach (var (shardId, client) in shardedClient.Shards) { if (!ShardedGatewayClient.IsConnected(client)) From dce148b844ef76d29bf4b55712804ca713330ac8 Mon Sep 17 00:00:00 2001 From: sam Date: Tue, 29 Oct 2024 20:24:00 +0100 Subject: [PATCH 12/57] colour output to journalctl --- Catalogger.Backend/Extensions/StartupExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Catalogger.Backend/Extensions/StartupExtensions.cs b/Catalogger.Backend/Extensions/StartupExtensions.cs index 4690dab..9776395 100644 --- a/Catalogger.Backend/Extensions/StartupExtensions.cs +++ b/Catalogger.Backend/Extensions/StartupExtensions.cs @@ -63,7 +63,7 @@ public static class StartupExtensions .MinimumLevel.Override("Microsoft.AspNetCore.Mvc", LogEventLevel.Warning) .MinimumLevel.Override("Microsoft.AspNetCore.Routing", LogEventLevel.Warning) // The default theme doesn't support light mode - .WriteTo.Console(theme: AnsiConsoleTheme.Sixteen); + .WriteTo.Console(theme: AnsiConsoleTheme.Sixteen, applyThemeToRedirectedOutput: true); if (config.Logging.SeqLogUrl != null) { From 8f154ce5aeb8599f7f10dfab846242fa2c0fa8f6 Mon Sep 17 00:00:00 2001 From: sam Date: Tue, 29 Oct 2024 21:32:33 +0100 Subject: [PATCH 13/57] slightly less verbose logging --- .editorconfig | 5 ++++- .../Bot/Commands/IgnoreChannelCommands.cs | 5 ----- .../Responders/Messages/MessageCreateResponder.cs | 12 ------------ .../Responders/Messages/MessageUpdateResponder.cs | 3 --- .../Services/WebhookExecutorService.cs | 2 -- 5 files changed, 4 insertions(+), 23 deletions(-) diff --git a/.editorconfig b/.editorconfig index d20e217..1e5c57b 100644 --- a/.editorconfig +++ b/.editorconfig @@ -14,4 +14,7 @@ resharper_entity_framework_model_validation_unlimited_string_length_highlighting # This is raised for every single property of records returned by endpoints resharper_not_accessed_positional_property_local_highlighting = none # ReSharper yells at us for the name "GuildCache", for some reason -resharper_inconsistent_naming_highlighting = none \ No newline at end of file +resharper_inconsistent_naming_highlighting = none +# From the docs: "You might consider excluding [FirstOrDefault or LastOrDefault] if readability is a concern, +# since the code you'd write to replace them is not easily readable." +dotnet_code_quality.CA1826.exclude_ordefault_methods = true \ No newline at end of file diff --git a/Catalogger.Backend/Bot/Commands/IgnoreChannelCommands.cs b/Catalogger.Backend/Bot/Commands/IgnoreChannelCommands.cs index 63dce5e..73b0a21 100644 --- a/Catalogger.Backend/Bot/Commands/IgnoreChannelCommands.cs +++ b/Catalogger.Backend/Bot/Commands/IgnoreChannelCommands.cs @@ -142,11 +142,6 @@ public class IgnoreChannelCommands( }) .ToList(); - foreach (var ch in ignoredChannels) - { - _logger.Debug("Channel: {ChannelId}, type: {Type}", ch.Id, ch.Type); - } - var embed = new EmbedBuilder() .WithTitle($"Ignored channels in {guild.Name}") .WithColour(DiscordUtils.Purple); diff --git a/Catalogger.Backend/Bot/Responders/Messages/MessageCreateResponder.cs b/Catalogger.Backend/Bot/Responders/Messages/MessageCreateResponder.cs index 47cf10c..3eebf2f 100644 --- a/Catalogger.Backend/Bot/Responders/Messages/MessageCreateResponder.cs +++ b/Catalogger.Backend/Bot/Responders/Messages/MessageCreateResponder.cs @@ -88,18 +88,11 @@ public partial class PkMessageHandler(ILogger logger, IServiceProvider services) public async Task HandlePkMessageAsync(IMessageCreate msg) { - _logger.Debug("Received PluralKit message"); - await Task.Delay(500.Milliseconds()); - _logger.Debug("Starting handling PluralKit message"); - // Check if the content matches a Discord link--if not, it's not a log message (we already check if this is a PluralKit message earlier) if (!LinkRegex().IsMatch(msg.Content)) - { - _logger.Debug("PluralKit message is not a log message because content is not a link"); return; - } // The first (only, I think always?) embed's footer must match the expected format var firstEmbed = msg.Embeds.FirstOrDefault(); @@ -108,12 +101,7 @@ public partial class PkMessageHandler(ILogger logger, IServiceProvider services) || !firstEmbed.Footer.TryGet(out var footer) || !FooterRegex().IsMatch(footer.Text) ) - { - _logger.Debug( - "PK message is not a log message because there is no first embed or its footer doesn't match the regex" - ); return; - } var match = FooterRegex().Match(footer.Text); diff --git a/Catalogger.Backend/Bot/Responders/Messages/MessageUpdateResponder.cs b/Catalogger.Backend/Bot/Responders/Messages/MessageUpdateResponder.cs index 1dd9290..023cab1 100644 --- a/Catalogger.Backend/Bot/Responders/Messages/MessageUpdateResponder.cs +++ b/Catalogger.Backend/Bot/Responders/Messages/MessageUpdateResponder.cs @@ -58,10 +58,7 @@ public class MessageUpdateResponder( var guildConfig = await guildRepository.GetAsync(msg.GuildID); if (await messageRepository.IsMessageIgnoredAsync(msg.ID.Value)) - { - _logger.Debug("Message {MessageId} should be ignored", msg.ID); return Result.Success; - } try { diff --git a/Catalogger.Backend/Services/WebhookExecutorService.cs b/Catalogger.Backend/Services/WebhookExecutorService.cs index dfde9b2..df2a122 100644 --- a/Catalogger.Backend/Services/WebhookExecutorService.cs +++ b/Catalogger.Backend/Services/WebhookExecutorService.cs @@ -61,7 +61,6 @@ public class WebhookExecutorService( public void QueueLog(Guild guildConfig, LogChannelType logChannelType, IEmbed embed) { var logChannel = GetLogChannel(guildConfig, logChannelType, channelId: null, userId: null); - _logger.Debug("Channel to log {Type} to: {LogChannel}", logChannelType, logChannel); if (logChannel == null) return; @@ -73,7 +72,6 @@ public class WebhookExecutorService( /// public void QueueLog(ulong channelId, IEmbed embed) { - _logger.Debug("Channel to log to: {LogChannel}", channelId); if (channelId == 0) return; From 00af303555bf5e5150bd4de803fda9aa44bc6c72 Mon Sep 17 00:00:00 2001 From: sam Date: Tue, 29 Oct 2024 21:32:50 +0100 Subject: [PATCH 14/57] feat(dashboard): remove WIP ignored users page we're not entirely sure how to implement this yet, so putting it on the backburner for now. --- .../src/routes/dash/[guildId]/+layout.svelte | 7 ------- .../src/routes/dash/[guildId]/ignored-users/+page.svelte | 7 ------- 2 files changed, 14 deletions(-) delete mode 100644 Catalogger.Frontend/src/routes/dash/[guildId]/ignored-users/+page.svelte diff --git a/Catalogger.Frontend/src/routes/dash/[guildId]/+layout.svelte b/Catalogger.Frontend/src/routes/dash/[guildId]/+layout.svelte index 353b812..3af8ba8 100644 --- a/Catalogger.Frontend/src/routes/dash/[guildId]/+layout.svelte +++ b/Catalogger.Frontend/src/routes/dash/[guildId]/+layout.svelte @@ -56,13 +56,6 @@ > Ignored channels - - Ignored users - - - // TODO - - -

Ignored users

- -

This page is still under construction!

From a34b5479c0cbd58cc29c3ad3f41300207e2f4ff5 Mon Sep 17 00:00:00 2001 From: sam Date: Tue, 29 Oct 2024 22:01:29 +0100 Subject: [PATCH 15/57] feat: add expiry to create invite command --- .../Bot/Commands/InviteCommands.cs | 65 +++++++++++++++++-- 1 file changed, 59 insertions(+), 6 deletions(-) diff --git a/Catalogger.Backend/Bot/Commands/InviteCommands.cs b/Catalogger.Backend/Bot/Commands/InviteCommands.cs index 77757f6..7ffa031 100644 --- a/Catalogger.Backend/Bot/Commands/InviteCommands.cs +++ b/Catalogger.Backend/Bot/Commands/InviteCommands.cs @@ -43,6 +43,7 @@ public class InviteCommands( InviteRepository inviteRepository, GuildCache guildCache, IInviteCache inviteCache, + UserCache userCache, IDiscordRestChannelAPI channelApi, IDiscordRestGuildAPI guildApi, FeedbackService feedbackService, @@ -113,21 +114,22 @@ public class InviteCommands( ); [Command("create")] - [Description("Create a new invite.`")] + [Description("Create a new invite.")] public async Task CreateInviteAsync( [Description("The channel to create the invite in")] [ChannelTypes(ChannelType.GuildText, ChannelType.GuildAnnouncement)] IChannel channel, - [Description("What to name the new invite")] string? name = null + [Description("What to name the new invite")] string? name = null, + [Description("How long the invite should be valid for")] InviteDuration? duration = null ) { var (userId, guildId) = contextInjection.GetUserAndGuild(); var inviteResult = await channelApi.CreateChannelInviteAsync( channel.ID, - maxAge: TimeSpan.Zero, + maxAge: duration?.ToTimespan() ?? TimeSpan.Zero, isUnique: true, - reason: $"Create invite command by {userId}" + reason: $"Create invite command by {await userCache.TryFormatUserAsync(userId, addMention: false)}" ); if (inviteResult.Error != null) { @@ -144,17 +146,20 @@ public class InviteCommands( ); } + var durationText = + duration != null ? $"\nThis invite {duration.ToHumanString()}." : string.Empty; + if (name == null) return await feedbackService.ReplyAsync( $"Created a new invite in <#{channel.ID}>!" - + $"\nLink: https://discord.gg/{inviteResult.Entity.Code}" + + $"\nLink: https://discord.gg/{inviteResult.Entity.Code}{durationText}" ); await inviteRepository.SetInviteNameAsync(guildId, inviteResult.Entity.Code, name); return await feedbackService.ReplyAsync( $"Created a new invite in <#{channel.ID}> with the name **{name}**!" - + $"\nLink: https://discord.gg/{inviteResult.Entity.Code}" + + $"\nLink: https://discord.gg/{inviteResult.Entity.Code}{durationText}" ); } @@ -253,3 +258,51 @@ public class InviteAutocompleteProvider( .ToList(); } } + +public enum InviteDuration +{ + [Description("30 minutes")] + ThirtyMinutes, + + [Description("1 hour")] + OneHour, + + [Description("6 hours")] + SixHours, + + [Description("12 hours")] + TwelveHours, + + [Description("1 day")] + OneDay, + + [Description("1 week")] + OneWeek, +} + +internal static class InviteEnumExtensions +{ + internal static TimeSpan ToTimespan(this InviteDuration dur) => + dur switch + { + InviteDuration.ThirtyMinutes => TimeSpan.FromMinutes(30), + InviteDuration.OneHour => TimeSpan.FromHours(1), + InviteDuration.SixHours => TimeSpan.FromHours(6), + InviteDuration.TwelveHours => TimeSpan.FromHours(12), + InviteDuration.OneDay => TimeSpan.FromDays(1), + InviteDuration.OneWeek => TimeSpan.FromDays(7), + _ => TimeSpan.Zero, + }; + + internal static string ToHumanString(this InviteDuration? dur) => + dur switch + { + InviteDuration.ThirtyMinutes => "expires after 30 minutes", + InviteDuration.OneHour => "expires after 1 hour", + InviteDuration.SixHours => "expires after 6 hours", + InviteDuration.TwelveHours => "expires after 12 hours", + InviteDuration.OneDay => "expires after 1 day", + InviteDuration.OneWeek => "expires after 1 week", + _ => "does not expire", + }; +} From c28f987240e74690b02c81d11eb78e3f4fe38de0 Mon Sep 17 00:00:00 2001 From: sam Date: Tue, 29 Oct 2024 22:18:30 +0100 Subject: [PATCH 16/57] fix: add missing option names/descriptions --- Catalogger.Backend/Bot/Commands/KeyRoleCommands.cs | 10 ++++++++-- Catalogger.Backend/Bot/Commands/WatchlistCommands.cs | 7 +++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/Catalogger.Backend/Bot/Commands/KeyRoleCommands.cs b/Catalogger.Backend/Bot/Commands/KeyRoleCommands.cs index 67d3ab8..b1ddca8 100644 --- a/Catalogger.Backend/Bot/Commands/KeyRoleCommands.cs +++ b/Catalogger.Backend/Bot/Commands/KeyRoleCommands.cs @@ -76,7 +76,10 @@ public class KeyRoleCommands( [Command("add")] [Description("Add a new key role.")] public async Task AddKeyRoleAsync( - [Description("The role to add.")] [DiscordTypeHint(TypeHint.Role)] Snowflake roleId + [Option("role")] + [Description("The role to add.")] + [DiscordTypeHint(TypeHint.Role)] + Snowflake roleId ) { var (_, guildId) = contextInjection.GetUserAndGuild(); @@ -98,7 +101,10 @@ public class KeyRoleCommands( [Command("remove")] [Description("Remove a key role.")] public async Task RemoveKeyRoleAsync( - [Description("The role to remove.")] [DiscordTypeHint(TypeHint.Role)] Snowflake roleId + [Option("role")] + [Description("The role to remove.")] + [DiscordTypeHint(TypeHint.Role)] + Snowflake roleId ) { var (_, guildId) = contextInjection.GetUserAndGuild(); diff --git a/Catalogger.Backend/Bot/Commands/WatchlistCommands.cs b/Catalogger.Backend/Bot/Commands/WatchlistCommands.cs index dc05f96..b47a583 100644 --- a/Catalogger.Backend/Bot/Commands/WatchlistCommands.cs +++ b/Catalogger.Backend/Bot/Commands/WatchlistCommands.cs @@ -47,7 +47,10 @@ public class WatchlistCommands( { [Command("add")] [Description("Add a user to the watchlist.")] - public async Task AddAsync(IUser user, string reason) + public async Task AddAsync( + [Description("The user to add")] IUser user, + [Description("The reason for adding this user to the watchlist")] string reason + ) { var (userId, guildId) = contextInjectionService.GetUserAndGuild(); @@ -59,7 +62,7 @@ public class WatchlistCommands( [Command("remove")] [Description("Remove a user from the watchlist.")] - public async Task RemoveAsync(IUser user) + public async Task RemoveAsync([Description("The user to remove")] IUser user) { var (userId, guildId) = contextInjectionService.GetUserAndGuild(); if (!await watchlistRepository.RemoveEntryAsync(guildId, user.ID)) From 4b74005110a567784c8bd815d84671ceeba6cd47 Mon Sep 17 00:00:00 2001 From: sam Date: Wed, 30 Oct 2024 13:52:33 +0100 Subject: [PATCH 17/57] fix: ignored channels should also apply to ChannelUpdate --- .../Bot/Responders/Channels/ChannelUpdateResponder.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Catalogger.Backend/Bot/Responders/Channels/ChannelUpdateResponder.cs b/Catalogger.Backend/Bot/Responders/Channels/ChannelUpdateResponder.cs index 0ad0c08..56ca415 100644 --- a/Catalogger.Backend/Bot/Responders/Channels/ChannelUpdateResponder.cs +++ b/Catalogger.Backend/Bot/Responders/Channels/ChannelUpdateResponder.cs @@ -179,11 +179,17 @@ public class ChannelUpdateResponder( // If that happens, there will be no embed fields, so just check for that if (builder.Fields.Count == 0) return Result.Success; - webhookExecutor.QueueLog( + + var logChannel = webhookExecutor.GetLogChannel( guildConfig, LogChannelType.ChannelUpdate, - builder.Build().GetOrThrow() + channelId: evt.ID, + userId: null ); + if (logChannel == null) + return Result.Success; + + webhookExecutor.QueueLog(logChannel.Value, builder.Build().GetOrThrow()); return Result.Success; } From 8ed9b4b143934b06915263f6efe6a99757c3d63a Mon Sep 17 00:00:00 2001 From: sam Date: Wed, 30 Oct 2024 14:35:56 +0100 Subject: [PATCH 18/57] feat: post stats to discord.bots.gg --- Catalogger.Backend/Config.cs | 3 ++ .../Services/StatusUpdateService.cs | 49 ++++++++++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/Catalogger.Backend/Config.cs b/Catalogger.Backend/Config.cs index 2a60d6a..612b91e 100644 --- a/Catalogger.Backend/Config.cs +++ b/Catalogger.Backend/Config.cs @@ -60,6 +60,9 @@ public class Config // If enabled, nothing will be logged. public bool TestMode { get; init; } = false; + + // Token for discord.bots.gg stats + public string? BotsGgToken { get; init; } } public class WebConfig diff --git a/Catalogger.Backend/Services/StatusUpdateService.cs b/Catalogger.Backend/Services/StatusUpdateService.cs index 6c0dff7..1d858aa 100644 --- a/Catalogger.Backend/Services/StatusUpdateService.cs +++ b/Catalogger.Backend/Services/StatusUpdateService.cs @@ -13,6 +13,9 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . +using System.Net.Http.Headers; +using System.Text.Json; +using System.Text.Json.Serialization; using Catalogger.Backend.Bot; using Remora.Discord.API.Abstractions.Objects; using Remora.Discord.API.Gateway.Commands; @@ -24,15 +27,16 @@ public class StatusUpdateService(ILogger logger, ShardedGatewayClient shardedCli : BackgroundService { private readonly ILogger _logger = logger.ForContext(); + private readonly HttpClient _client = new(); protected override async Task ExecuteAsync(CancellationToken ct) { using var timer = new PeriodicTimer(TimeSpan.FromMinutes(3)); while (await timer.WaitForNextTickAsync(ct)) - UpdateShardStatuses(ct); + await UpdateShardStatuses(ct); } - private void UpdateShardStatuses(CancellationToken ct = default) + private async Task UpdateShardStatuses(CancellationToken ct = default) { _logger.Information( "Updating status for {TotalShards} shards. Guild count is {GuildCount}", @@ -59,6 +63,8 @@ public class StatusUpdateService(ILogger logger, ShardedGatewayClient shardedCli client.SubmitCommand(PresenceFor(shardId)); } + + await ReportStatsAsync(); } private UpdatePresence PresenceFor(int shardId) @@ -75,4 +81,43 @@ public class StatusUpdateService(ILogger logger, ShardedGatewayClient shardedCli Activities: [new Activity(Name: "Beep", Type: ActivityType.Custom, State: status)] ); } + + private async Task ReportStatsAsync() + { + if (config.Discord.BotsGgToken == null) + return; + + _logger.Debug("Posting stats to discord.bots.gg"); + + var req = new HttpRequestMessage( + HttpMethod.Post, + $"https://discord.bots.gg/api/v1/bots/{config.Discord.ApplicationId}/stats" + ); + req.Headers.Add("Authorization", config.Discord.BotsGgToken); + req.Content = new StringContent( + JsonSerializer.Serialize( + new BotsGgStats( + (int)CataloggerMetrics.GuildsCached.Value, + shardedClient.TotalShards + ) + ), + new MediaTypeHeaderValue("application/json", "utf-8") + ); + + var resp = await _client.SendAsync(req); + if (!resp.IsSuccessStatusCode) + { + var content = await resp.Content.ReadAsStringAsync(); + _logger.Error( + "Error updating stats for discord.bots.gg: {StatusCode}, {Content}", + (int)resp.StatusCode, + content + ); + } + } + + private record BotsGgStats( + [property: JsonPropertyName("guildCount")] int GuildCount, + [property: JsonPropertyName("shardCount")] int ShardCount + ); } From a22057b9fa59adb4c681ec4f9630220190050826 Mon Sep 17 00:00:00 2001 From: sam Date: Thu, 31 Oct 2024 01:17:44 +0100 Subject: [PATCH 19/57] feat(dashboard): ignored users page --- ...s.cs => GuildsController.ChannelsRoles.cs} | 42 ------- .../Api/GuildsController.Users.cs | 106 ++++++++++++++++ Catalogger.Backend/Api/GuildsController.cs | 1 + .../Cache/InMemoryCache/UserCache.cs | 1 + .../src/routes/dash/[guildId]/+layout.svelte | 8 +- .../[guildId]/ignored-channels/+page.svelte | 5 +- .../dash/[guildId]/ignored-users/+page.svelte | 119 ++++++++++++++++++ .../dash/[guildId]/ignored-users/+page.ts | 10 ++ 8 files changed, 247 insertions(+), 45 deletions(-) rename Catalogger.Backend/Api/{GuildsController.Ignores.cs => GuildsController.ChannelsRoles.cs} (71%) create mode 100644 Catalogger.Backend/Api/GuildsController.Users.cs create mode 100644 Catalogger.Frontend/src/routes/dash/[guildId]/ignored-users/+page.svelte create mode 100644 Catalogger.Frontend/src/routes/dash/[guildId]/ignored-users/+page.ts diff --git a/Catalogger.Backend/Api/GuildsController.Ignores.cs b/Catalogger.Backend/Api/GuildsController.ChannelsRoles.cs similarity index 71% rename from Catalogger.Backend/Api/GuildsController.Ignores.cs rename to Catalogger.Backend/Api/GuildsController.ChannelsRoles.cs index f9cc106..23e424a 100644 --- a/Catalogger.Backend/Api/GuildsController.Ignores.cs +++ b/Catalogger.Backend/Api/GuildsController.ChannelsRoles.cs @@ -65,48 +65,6 @@ public partial class GuildsController return NoContent(); } - [HttpGet("users")] - public async Task ListUsersAsync(string id, [FromQuery] string query) - { - var (guildId, _) = await ParseGuildAsync(id); - var members = await memberCache.GetMemberNamesAsync(guildId, query); - - return Ok(members.OrderBy(m => m.Name).Select(m => new UserQueryResponse(m.Name, m.Id))); - } - - private record UserQueryResponse(string Name, string Id); - - [HttpPut("ignored-users/{userId}")] - public async Task AddIgnoredUserAsync(string id, ulong userId) - { - var (guildId, _) = await ParseGuildAsync(id); - var guildConfig = await guildRepository.GetAsync(guildId); - - if (guildConfig.Channels.IgnoredUsers.Contains(userId)) - return NoContent(); - - var user = await memberCache.TryGetAsync(guildId, DiscordSnowflake.New(userId)); - if (user == null) - return NoContent(); - - guildConfig.Channels.IgnoredUsers.Add(userId); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig.Channels); - - return NoContent(); - } - - [HttpDelete("ignored-users/{userId}")] - public async Task RemoveIgnoredUserAsync(string id, ulong userId) - { - var (guildId, _) = await ParseGuildAsync(id); - var guildConfig = await guildRepository.GetAsync(guildId); - - guildConfig.Channels.IgnoredUsers.Remove(userId); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig.Channels); - - return NoContent(); - } - [HttpPut("key-roles/{roleId}")] public async Task AddKeyRoleAsync(string id, ulong roleId) { diff --git a/Catalogger.Backend/Api/GuildsController.Users.cs b/Catalogger.Backend/Api/GuildsController.Users.cs new file mode 100644 index 0000000..f762d1e --- /dev/null +++ b/Catalogger.Backend/Api/GuildsController.Users.cs @@ -0,0 +1,106 @@ +// Copyright (C) 2021-present sam (starshines.gay) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +using System.Net; +using Catalogger.Backend.Api.Middleware; +using Catalogger.Backend.Extensions; +using Microsoft.AspNetCore.Mvc; +using Remora.Discord.API; +using Remora.Discord.API.Abstractions.Objects; + +namespace Catalogger.Backend.Api; + +public partial class GuildsController +{ + [HttpGet("ignored-users")] + public async Task GetIgnoredUsersAsync(string id, CancellationToken ct = default) + { + var cts = CancellationTokenSource.CreateLinkedTokenSource(ct); + // not actually sure how long fetching members might take. timing it out after 10 seconds just in case + // the underlying redis library doesn't support CancellationTokens so we don't pass it down + // we just end the loop early if it expires + cts.CancelAfter(TimeSpan.FromSeconds(10)); + + var (guildId, _) = await ParseGuildAsync(id); + var guildConfig = await guildRepository.GetAsync(guildId); + + var output = new List(); + foreach (var userId in guildConfig.Channels.IgnoredUsers) + { + if (cts.Token.IsCancellationRequested) + break; + + var member = await memberCache.TryGetAsync(guildId, DiscordSnowflake.New(userId)); + output.Add( + new IgnoredUser( + Id: userId, + Tag: member != null ? member.User.Value.Tag() : "unknown user" + ) + ); + } + + return Ok(output.OrderBy(i => i.Id)); + } + + private record IgnoredUser(ulong Id, string Tag); + + [HttpPut("ignored-users/{userId}")] + public async Task AddIgnoredUserAsync(string id, ulong userId) + { + var (guildId, _) = await ParseGuildAsync(id); + var guildConfig = await guildRepository.GetAsync(guildId); + + IUser? user; + var member = await memberCache.TryGetAsync(guildId, DiscordSnowflake.New(userId)); + if (member != null) + user = member.User.Value; + else + user = await userCache.GetUserAsync(DiscordSnowflake.New(userId)); + + if (user == null) + throw new ApiError(HttpStatusCode.NotFound, ErrorCode.BadRequest, "User not found"); + + if (guildConfig.Channels.IgnoredUsers.Contains(user.ID.Value)) + return Ok(new IgnoredUser(user.ID.Value, user.Tag())); + + guildConfig.Channels.IgnoredUsers.Add(user.ID.Value); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig.Channels); + + return Ok(new IgnoredUser(user.ID.Value, user.Tag())); + } + + [HttpDelete("ignored-users/{userId}")] + public async Task RemoveIgnoredUserAsync(string id, ulong userId) + { + var (guildId, _) = await ParseGuildAsync(id); + var guildConfig = await guildRepository.GetAsync(guildId); + + guildConfig.Channels.IgnoredUsers.Remove(userId); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig.Channels); + + return NoContent(); + } + + [HttpGet("users")] + public async Task ListUsersAsync(string id, [FromQuery] string query) + { + var (guildId, _) = await ParseGuildAsync(id); + var members = await memberCache.GetMemberNamesAsync(guildId, query); + + return Ok(members.OrderBy(m => m.Name).Select(m => new UserQueryResponse(m.Name, m.Id))); + } + + private record UserQueryResponse(string Name, string Id); +} diff --git a/Catalogger.Backend/Api/GuildsController.cs b/Catalogger.Backend/Api/GuildsController.cs index e1a52b0..4289bee 100644 --- a/Catalogger.Backend/Api/GuildsController.cs +++ b/Catalogger.Backend/Api/GuildsController.cs @@ -40,6 +40,7 @@ public partial class GuildsController( RoleCache roleCache, IMemberCache memberCache, IInviteCache inviteCache, + UserCache userCache, DiscordRequestService discordRequestService, IDiscordRestUserAPI userApi, WebhookExecutorService webhookExecutor diff --git a/Catalogger.Backend/Cache/InMemoryCache/UserCache.cs b/Catalogger.Backend/Cache/InMemoryCache/UserCache.cs index f99856e..d5a1313 100644 --- a/Catalogger.Backend/Cache/InMemoryCache/UserCache.cs +++ b/Catalogger.Backend/Cache/InMemoryCache/UserCache.cs @@ -13,6 +13,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . +using System.Diagnostics.CodeAnalysis; using Catalogger.Backend.Extensions; using LazyCache; using Remora.Discord.API.Abstractions.Objects; diff --git a/Catalogger.Frontend/src/routes/dash/[guildId]/+layout.svelte b/Catalogger.Frontend/src/routes/dash/[guildId]/+layout.svelte index 3af8ba8..6bdb009 100644 --- a/Catalogger.Frontend/src/routes/dash/[guildId]/+layout.svelte +++ b/Catalogger.Frontend/src/routes/dash/[guildId]/+layout.svelte @@ -56,6 +56,12 @@ > Ignored channels + + Ignored users + - {#if $page.url.pathname === `/dash/${data.guild.id}` || $page.url.pathname === `/dash/${data.guild.id}/ignored-channels`} + {#if $page.url.pathname === `/dash/${data.guild.id}`} {/if} diff --git a/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-channels/+page.svelte b/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-channels/+page.svelte index fe0ea57..7764287 100644 --- a/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-channels/+page.svelte +++ b/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-channels/+page.svelte @@ -82,8 +82,9 @@

Ignored channels

- Messages from ignored channels will not be logged. Note that this does not - ignore channel update events, any changes to the channel will still be logged. + Messages from ignored channels will not be logged. Changes to ignored channels + will also not be logged, but note that ignored channels being deleted + (or new channels being created in an ignored category) will still be logged.

diff --git a/Catalogger.Frontend/src/routes/dash/[guildId]/redirects/+page.svelte b/Catalogger.Frontend/src/routes/dash/[guildId]/redirects/+page.svelte index bfff7cd..8e77ec5 100644 --- a/Catalogger.Frontend/src/routes/dash/[guildId]/redirects/+page.svelte +++ b/Catalogger.Frontend/src/routes/dash/[guildId]/redirects/+page.svelte @@ -11,10 +11,11 @@ import { fastFetch } from "$lib/api"; import { addToast } from "$lib/toast"; import { makeFullOptions } from "$lib/util"; + import RemovableListItem from "$lib/components/RemovableListItem.svelte"; export let data: PageData; - $: redirects = data.guild.config.redirects; + $: redirects = data.guild.channels.redirects; $: allChannels = [ ...data.guild.channels_without_category.map((c) => ({ @@ -51,7 +52,7 @@ target, }); - data.guild.config.redirects[source] = target; + data.guild.channels.redirects[source] = target; addToast({ body: "Successfully added redirect." }); } catch (e) { @@ -67,8 +68,8 @@ try { await fastFetch("DELETE", `/api/guilds/${data.guild.id}/redirects/${id}`); - delete data.guild.config.redirects[id]; - data.guild.config.redirects = data.guild.config.redirects; + delete data.guild.channels.redirects[id]; + data.guild.channels.redirects = data.guild.channels.redirects; addToast({ body: "Successfully removed redirect." }); } catch (e) { @@ -108,16 +109,12 @@ {#each Object.keys(redirects) as redirectSource} - - {channelName(redirectSource)} ➜ {channelName( - redirects[redirectSource], - )} - - + removeRedirect(redirectSource)} + buttonText="Remove redirect" + > + {channelName(redirectSource)} ➜ {channelName(redirects[redirectSource])} + {/each} {:else} diff --git a/Catalogger.Frontend/yarn.lock b/Catalogger.Frontend/yarn.lock index 4ede98d..ded308d 100644 --- a/Catalogger.Frontend/yarn.lock +++ b/Catalogger.Frontend/yarn.lock @@ -696,8 +696,8 @@ __metadata: linkType: hard "@sveltejs/kit@npm:^2.0.0": - version: 2.8.0 - resolution: "@sveltejs/kit@npm:2.8.0" + version: 2.8.1 + resolution: "@sveltejs/kit@npm:2.8.1" dependencies: "@types/cookie": "npm:^0.6.0" cookie: "npm:^0.6.0" @@ -717,7 +717,7 @@ __metadata: vite: ^5.0.3 bin: svelte-kit: svelte-kit.js - checksum: 10c0/f4fdad81bf5f8f645eed21ffd7015b14c76481b4df054f7dc16ab6bb6a32dc0c9fd28790a7da3e3e3a0b9860e6405cbd082df8cc689694f09bef30659c47cc23 + checksum: 10c0/531cf8fdff0e039f51ad3e9aa288acea5fd9eb03b3189fda68dc45e7ac12a288f6a1792aace9c9fec3979475b5e487eb3af4b6160ad23c5bea1f503b89da5cd2 languageName: node linkType: hard @@ -734,7 +734,7 @@ __metadata: languageName: node linkType: hard -"@sveltejs/vite-plugin-svelte@npm:3": +"@sveltejs/vite-plugin-svelte@npm:^3.0.0": version: 3.1.2 resolution: "@sveltejs/vite-plugin-svelte@npm:3.1.2" dependencies: @@ -1117,7 +1117,7 @@ __metadata: dependencies: "@sveltejs/adapter-static": "npm:^3.0.5" "@sveltejs/kit": "npm:^2.0.0" - "@sveltejs/vite-plugin-svelte": "npm:3" + "@sveltejs/vite-plugin-svelte": "npm:^3.0.0" "@sveltestrap/sveltestrap": "npm:^6.2.7" "@types/eslint": "npm:^9.6.0" "@types/file-saver": "npm:^2.0.7" @@ -1135,7 +1135,7 @@ __metadata: sass: "npm:^1.80.1" snarkdown: "npm:^2.0.0" svelecte: "npm:^4.3.1" - svelte: "npm:4" + svelte: "npm:^4.2.7" svelte-check: "npm:^4.0.0" typescript: "npm:^5.0.0" typescript-eslint: "npm:^8.0.0" @@ -3124,7 +3124,7 @@ __metadata: languageName: node linkType: hard -"svelte@npm:4": +"svelte@npm:^4.2.7": version: 4.2.19 resolution: "svelte@npm:4.2.19" dependencies: From e12bd6194b9baeadcf486ed0dac1ba87c8cf3801 Mon Sep 17 00:00:00 2001 From: sam Date: Mon, 18 Nov 2024 20:47:58 +0100 Subject: [PATCH 35/57] fix: actually store ignored channels/roles --- .../Api/GuildsController.ChannelsRoles.cs | 16 ++++++++-------- .../Api/GuildsController.Redirects.cs | 4 ++-- Catalogger.Backend/Api/GuildsController.Users.cs | 4 ++-- Catalogger.Backend/Api/GuildsController.cs | 2 +- .../Bot/Commands/ChannelCommandsComponents.cs | 4 ++-- .../Commands/IgnoreMessageCommands.Channels.cs | 4 ++-- .../Bot/Commands/IgnoreMessageCommands.Roles.cs | 4 ++-- .../Bot/Commands/IgnoreMessageCommands.Users.cs | 4 ++-- .../Bot/Commands/RedirectCommands.cs | 4 ++-- .../005_add_ignored_channels_roles.up.sql | 2 ++ .../006_add_ignored_channels_roles.down.sql | 2 ++ .../Database/Repositories/GuildRepository.cs | 12 ++++++++++-- 12 files changed, 37 insertions(+), 25 deletions(-) create mode 100644 Catalogger.Backend/Database/Migrations/005_add_ignored_channels_roles.up.sql create mode 100644 Catalogger.Backend/Database/Migrations/006_add_ignored_channels_roles.down.sql diff --git a/Catalogger.Backend/Api/GuildsController.ChannelsRoles.cs b/Catalogger.Backend/Api/GuildsController.ChannelsRoles.cs index b3a6928..c93a2b8 100644 --- a/Catalogger.Backend/Api/GuildsController.ChannelsRoles.cs +++ b/Catalogger.Backend/Api/GuildsController.ChannelsRoles.cs @@ -45,7 +45,7 @@ public partial class GuildsController return NoContent(); guildConfig.Messages.IgnoredChannels.Add(channelId); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); return NoContent(); } @@ -57,7 +57,7 @@ public partial class GuildsController var guildConfig = await guildRepository.GetAsync(guildId); guildConfig.Messages.IgnoredChannels.Remove(channelId); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); return NoContent(); } @@ -75,7 +75,7 @@ public partial class GuildsController return NoContent(); guildConfig.Messages.IgnoredRoles.Add(roleId); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); return NoContent(); } @@ -87,7 +87,7 @@ public partial class GuildsController var guildConfig = await guildRepository.GetAsync(guildId); guildConfig.Messages.IgnoredRoles.Remove(roleId); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); return NoContent(); } @@ -117,7 +117,7 @@ public partial class GuildsController return NoContent(); guildConfig.IgnoredChannels = [.. guildConfig.IgnoredChannels, channelId]; - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); return NoContent(); } @@ -131,7 +131,7 @@ public partial class GuildsController var channels = guildConfig.IgnoredChannels.ToList(); channels.Remove(channelId); guildConfig.IgnoredChannels = channels.ToArray(); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); return NoContent(); } @@ -149,7 +149,7 @@ public partial class GuildsController return NoContent(); guildConfig.IgnoredRoles = [.. guildConfig.IgnoredRoles, roleId]; - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); return NoContent(); } @@ -163,7 +163,7 @@ public partial class GuildsController var roles = guildConfig.IgnoredRoles.ToList(); roles.Remove(roleId); guildConfig.IgnoredRoles = roles.ToArray(); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); return NoContent(); } diff --git a/Catalogger.Backend/Api/GuildsController.Redirects.cs b/Catalogger.Backend/Api/GuildsController.Redirects.cs index f762896..4131343 100644 --- a/Catalogger.Backend/Api/GuildsController.Redirects.cs +++ b/Catalogger.Backend/Api/GuildsController.Redirects.cs @@ -61,7 +61,7 @@ public partial class GuildsController ); guildConfig.Channels.Redirects[source.ID.Value] = target.ID.Value; - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); return NoContent(); } @@ -80,7 +80,7 @@ public partial class GuildsController ); guildConfig.Channels.Redirects.Remove(channelId, out _); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); return NoContent(); } diff --git a/Catalogger.Backend/Api/GuildsController.Users.cs b/Catalogger.Backend/Api/GuildsController.Users.cs index 3a3ef43..e67cb55 100644 --- a/Catalogger.Backend/Api/GuildsController.Users.cs +++ b/Catalogger.Backend/Api/GuildsController.Users.cs @@ -76,7 +76,7 @@ public partial class GuildsController return Ok(new IgnoredUser(user.ID.Value, user.Tag())); guildConfig.Messages.IgnoredUsers.Add(user.ID.Value); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); return Ok(new IgnoredUser(user.ID.Value, user.Tag())); } @@ -88,7 +88,7 @@ public partial class GuildsController var guildConfig = await guildRepository.GetAsync(guildId); guildConfig.Messages.IgnoredUsers.Remove(userId); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); return NoContent(); } diff --git a/Catalogger.Backend/Api/GuildsController.cs b/Catalogger.Backend/Api/GuildsController.cs index 5eb29f3..d032d6f 100644 --- a/Catalogger.Backend/Api/GuildsController.cs +++ b/Catalogger.Backend/Api/GuildsController.cs @@ -318,7 +318,7 @@ public partial class GuildsController( ) guildConfig.Channels.MessageDeleteBulk = req.MessageDeleteBulk ?? 0; - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); return Ok(guildConfig.Channels); } diff --git a/Catalogger.Backend/Bot/Commands/ChannelCommandsComponents.cs b/Catalogger.Backend/Bot/Commands/ChannelCommandsComponents.cs index ae472e7..9867e7d 100644 --- a/Catalogger.Backend/Bot/Commands/ChannelCommandsComponents.cs +++ b/Catalogger.Backend/Bot/Commands/ChannelCommandsComponents.cs @@ -261,7 +261,7 @@ public class ChannelCommandsComponents( throw new ArgumentOutOfRangeException(); } - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); goto case "return"; case "return": var (e, c) = ChannelCommands.BuildRootMenu(guildChannels, guild, guildConfig); @@ -384,7 +384,7 @@ public class ChannelCommandsComponents( throw new ArgumentOutOfRangeException(); } - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); List embeds = [ diff --git a/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Channels.cs b/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Channels.cs index 310142d..a365c9f 100644 --- a/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Channels.cs +++ b/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Channels.cs @@ -75,7 +75,7 @@ public partial class IgnoreMessageCommands : CommandGroup ); guildConfig.Messages.IgnoredChannels.Add(channel.ID.Value); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); return await feedbackService.ReplyAsync( $"Successfully added {(channel.Type == ChannelType.GuildCategory ? channel.Name : $"<#{channel.ID}>")} to the list of ignored channels." @@ -98,7 +98,7 @@ public partial class IgnoreMessageCommands : CommandGroup ); guildConfig.Messages.IgnoredChannels.Remove(channel.ID.Value); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); return await feedbackService.ReplyAsync( $"Successfully removed {(channel.Type == ChannelType.GuildCategory ? channel.Name : $"<#{channel.ID}>")} from the list of ignored channels." diff --git a/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Roles.cs b/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Roles.cs index 6515f47..cf3cb10 100644 --- a/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Roles.cs +++ b/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Roles.cs @@ -54,7 +54,7 @@ public partial class IgnoreMessageCommands ); guildConfig.Messages.IgnoredRoles.Add(role.ID.Value); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); return await feedbackService.ReplyAsync( $"Successfully added {role.Name} to the list of ignored roles." @@ -77,7 +77,7 @@ public partial class IgnoreMessageCommands ); guildConfig.Messages.IgnoredRoles.Remove(role.ID.Value); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); return await feedbackService.ReplyAsync( $"Successfully removed {role.Name} from the list of ignored roles." diff --git a/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Users.cs b/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Users.cs index 89f329b..d89f487 100644 --- a/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Users.cs +++ b/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Users.cs @@ -58,7 +58,7 @@ public partial class IgnoreMessageCommands ); guildConfig.Messages.IgnoredUsers.Add(user.ID.Value); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); return await feedbackService.ReplyAsync( $"Successfully added {user.PrettyFormat()} to the list of ignored users." @@ -81,7 +81,7 @@ public partial class IgnoreMessageCommands ); guildConfig.Messages.IgnoredUsers.Remove(user.ID.Value); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); return await feedbackService.ReplyAsync( $"Successfully removed {user.PrettyFormat()} from the list of ignored users." diff --git a/Catalogger.Backend/Bot/Commands/RedirectCommands.cs b/Catalogger.Backend/Bot/Commands/RedirectCommands.cs index 0fb2a3d..586deb3 100644 --- a/Catalogger.Backend/Bot/Commands/RedirectCommands.cs +++ b/Catalogger.Backend/Bot/Commands/RedirectCommands.cs @@ -61,7 +61,7 @@ public class RedirectCommands( var (_, guildId) = contextInjectionService.GetUserAndGuild(); var guildConfig = await guildRepository.GetAsync(guildId); guildConfig.Channels.Redirects[source.ID.Value] = target.ID.Value; - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); var output = $"Success! Edited and deleted messages from {FormatChannel(source)} will now be redirected to <#{target.ID}>."; @@ -101,7 +101,7 @@ public class RedirectCommands( var guildConfig = await guildRepository.GetAsync(guildId); var wasSet = guildConfig.Channels.Redirects.Remove(source.ID.Value); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); var output = wasSet ? $"Removed the redirect for {FormatChannel(source)}! Message logs from" diff --git a/Catalogger.Backend/Database/Migrations/005_add_ignored_channels_roles.up.sql b/Catalogger.Backend/Database/Migrations/005_add_ignored_channels_roles.up.sql new file mode 100644 index 0000000..8d39d94 --- /dev/null +++ b/Catalogger.Backend/Database/Migrations/005_add_ignored_channels_roles.up.sql @@ -0,0 +1,2 @@ +alter table guilds add column ignored_channels bigint[] not null default array[]::bigint[]; +alter table guilds add column ignored_roles bigint[] not null default array[]::bigint[]; diff --git a/Catalogger.Backend/Database/Migrations/006_add_ignored_channels_roles.down.sql b/Catalogger.Backend/Database/Migrations/006_add_ignored_channels_roles.down.sql new file mode 100644 index 0000000..30f833d --- /dev/null +++ b/Catalogger.Backend/Database/Migrations/006_add_ignored_channels_roles.down.sql @@ -0,0 +1,2 @@ +alter table guilds drop column ignored_channels; +alter table guilds drop column ignored_roles; diff --git a/Catalogger.Backend/Database/Repositories/GuildRepository.cs b/Catalogger.Backend/Database/Repositories/GuildRepository.cs index 276b89a..853a93e 100644 --- a/Catalogger.Backend/Database/Repositories/GuildRepository.cs +++ b/Catalogger.Backend/Database/Repositories/GuildRepository.cs @@ -131,14 +131,22 @@ public class GuildRepository(ILogger logger, DatabaseConnection conn) new { GuildId = guildId.Value, RoleId = roleId.Value } ); - public async Task UpdateChannelConfigAsync(Snowflake id, Guild config) => + public async Task UpdateConfigAsync(Snowflake id, Guild config) => await conn.ExecuteAsync( - "update guilds set channels = @Channels::jsonb, messages = @Messages::jsonb where id = @Id", + """ + update guilds set channels = @Channels::jsonb, + messages = @Messages::jsonb, + ignored_channels = @IgnoredChannels, + ignored_roles = @IgnoredRoles + where id = @Id + """, new { Id = id.Value, config.Channels, config.Messages, + config.IgnoredChannels, + config.IgnoredRoles, } ); From 4eb5c1645120c31d4c7a878191280409a61e3289 Mon Sep 17 00:00:00 2001 From: sam Date: Mon, 18 Nov 2024 21:01:52 +0100 Subject: [PATCH 36/57] refactor: change ulong[] to List for better ergonomics --- .../Api/GuildsController.ChannelsRoles.cs | 12 +++------ .../Api/GuildsController.KeyRoles.cs | 6 +++-- Catalogger.Backend/Api/GuildsController.cs | 6 ++--- .../Bot/Commands/KeyRoleCommands.cs | 8 +++--- Catalogger.Backend/Database/DatabasePool.cs | 25 ++++++++++--------- .../Database/Models/ConfigExport.cs | 2 +- Catalogger.Backend/Database/Models/Guild.cs | 6 ++--- .../Database/Repositories/GuildRepository.cs | 18 +++---------- 8 files changed, 37 insertions(+), 46 deletions(-) diff --git a/Catalogger.Backend/Api/GuildsController.ChannelsRoles.cs b/Catalogger.Backend/Api/GuildsController.ChannelsRoles.cs index c93a2b8..4114d5a 100644 --- a/Catalogger.Backend/Api/GuildsController.ChannelsRoles.cs +++ b/Catalogger.Backend/Api/GuildsController.ChannelsRoles.cs @@ -116,7 +116,7 @@ public partial class GuildsController if (channel == null) return NoContent(); - guildConfig.IgnoredChannels = [.. guildConfig.IgnoredChannels, channelId]; + guildConfig.IgnoredChannels.Add(channelId); await guildRepository.UpdateConfigAsync(guildId, guildConfig); return NoContent(); @@ -128,9 +128,7 @@ public partial class GuildsController var (guildId, _) = await ParseGuildAsync(id); var guildConfig = await guildRepository.GetAsync(guildId); - var channels = guildConfig.IgnoredChannels.ToList(); - channels.Remove(channelId); - guildConfig.IgnoredChannels = channels.ToArray(); + guildConfig.IgnoredChannels.Remove(channelId); await guildRepository.UpdateConfigAsync(guildId, guildConfig); return NoContent(); @@ -148,7 +146,7 @@ public partial class GuildsController if (roleCache.GuildRoles(guildId).All(r => r.ID.Value != roleId)) return NoContent(); - guildConfig.IgnoredRoles = [.. guildConfig.IgnoredRoles, roleId]; + guildConfig.IgnoredRoles.Add(roleId); await guildRepository.UpdateConfigAsync(guildId, guildConfig); return NoContent(); @@ -160,9 +158,7 @@ public partial class GuildsController var (guildId, _) = await ParseGuildAsync(id); var guildConfig = await guildRepository.GetAsync(guildId); - var roles = guildConfig.IgnoredRoles.ToList(); - roles.Remove(roleId); - guildConfig.IgnoredRoles = roles.ToArray(); + guildConfig.IgnoredRoles.Remove(roleId); await guildRepository.UpdateConfigAsync(guildId, guildConfig); return NoContent(); diff --git a/Catalogger.Backend/Api/GuildsController.KeyRoles.cs b/Catalogger.Backend/Api/GuildsController.KeyRoles.cs index 2580042..f1e786e 100644 --- a/Catalogger.Backend/Api/GuildsController.KeyRoles.cs +++ b/Catalogger.Backend/Api/GuildsController.KeyRoles.cs @@ -38,7 +38,8 @@ public partial class GuildsController "Role is already a key role" ); - await guildRepository.AddKeyRoleAsync(guildId, DiscordSnowflake.New(roleId)); + guildConfig.KeyRoles.Add(roleId); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); return NoContent(); } @@ -55,7 +56,8 @@ public partial class GuildsController "Role is already not a key role" ); - await guildRepository.RemoveKeyRoleAsync(guildId, DiscordSnowflake.New(roleId)); + guildConfig.KeyRoles.Remove(roleId); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); return NoContent(); } } diff --git a/Catalogger.Backend/Api/GuildsController.cs b/Catalogger.Backend/Api/GuildsController.cs index d032d6f..73d81ef 100644 --- a/Catalogger.Backend/Api/GuildsController.cs +++ b/Catalogger.Backend/Api/GuildsController.cs @@ -140,11 +140,11 @@ public partial class GuildsController( IEnumerable Categories, IEnumerable ChannelsWithoutCategory, IEnumerable Roles, - ulong[] IgnoredChannels, - ulong[] IgnoredRoles, + List IgnoredChannels, + List IgnoredRoles, Database.Models.Guild.MessageConfig Messages, Database.Models.Guild.ChannelConfig Channels, - ulong[] KeyRoles + List KeyRoles ); private record GuildCategory(string Id, string Name, IEnumerable Channels); diff --git a/Catalogger.Backend/Bot/Commands/KeyRoleCommands.cs b/Catalogger.Backend/Bot/Commands/KeyRoleCommands.cs index b1ddca8..1ebc458 100644 --- a/Catalogger.Backend/Bot/Commands/KeyRoleCommands.cs +++ b/Catalogger.Backend/Bot/Commands/KeyRoleCommands.cs @@ -49,7 +49,7 @@ public class KeyRoleCommands( var guildRoles = roleCache.GuildRoles(guildId).ToList(); var guildConfig = await guildRepository.GetAsync(guildId); - if (guildConfig.KeyRoles.Length == 0) + if (guildConfig.KeyRoles.Count == 0) return await feedbackService.ReplyAsync( "There are no key roles to list. Add some with `/key-roles add`.", isEphemeral: true @@ -94,7 +94,8 @@ public class KeyRoleCommands( isEphemeral: true ); - await guildRepository.AddKeyRoleAsync(guildId, role.ID); + guildConfig.KeyRoles.Add(role.ID.Value); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); return await feedbackService.ReplyAsync($"Added {role.Name} to this server's key roles!"); } @@ -119,7 +120,8 @@ public class KeyRoleCommands( isEphemeral: true ); - await guildRepository.RemoveKeyRoleAsync(guildId, role.ID); + guildConfig.KeyRoles.Remove(role.ID.Value); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); return await feedbackService.ReplyAsync( $"Removed {role.Name} from this server's key roles!" ); diff --git a/Catalogger.Backend/Database/DatabasePool.cs b/Catalogger.Backend/Database/DatabasePool.cs index 9b1712f..fb266dd 100644 --- a/Catalogger.Backend/Database/DatabasePool.cs +++ b/Catalogger.Backend/Database/DatabasePool.cs @@ -112,11 +112,12 @@ public class DatabasePool SqlMapper.RemoveTypeMap(typeof(ulong)); SqlMapper.AddTypeHandler(new UlongEncodeAsLongHandler()); - SqlMapper.AddTypeHandler(new UlongArrayHandler()); SqlMapper.AddTypeHandler(new PassthroughTypeHandler()); SqlMapper.AddTypeHandler(new JsonTypeHandler()); SqlMapper.AddTypeHandler(new JsonTypeHandler()); + + SqlMapper.AddTypeHandler(new UlongListHandler()); } // Copied from PluralKit: @@ -132,34 +133,34 @@ public class DatabasePool private class UlongEncodeAsLongHandler : SqlMapper.TypeHandler { + public override void SetValue(IDbDataParameter parameter, ulong value) => + parameter.Value = (long)value; + public override ulong Parse(object value) => // Cast to long to unbox, then to ulong (???) (ulong)(long)value; - - public override void SetValue(IDbDataParameter parameter, ulong value) => - parameter.Value = (long)value; } - private class UlongArrayHandler : SqlMapper.TypeHandler + private class UlongListHandler : SqlMapper.TypeHandler> { - public override void SetValue(IDbDataParameter parameter, ulong[]? value) => - parameter.Value = value != null ? Array.ConvertAll(value, i => (long)i) : null; + public override void SetValue(IDbDataParameter parameter, List? value) => + parameter.Value = value?.Select(i => (long)i).ToArray(); - public override ulong[] Parse(object value) => - Array.ConvertAll((long[])value, i => (ulong)i); + public override List? Parse(object value) => + ((long[])value).Select(i => (ulong)i).ToList(); } private class JsonTypeHandler : SqlMapper.TypeHandler { + public override void SetValue(IDbDataParameter parameter, T? value) => + parameter.Value = JsonSerializer.Serialize(value); + public override T Parse(object value) { var json = (string)value; return JsonSerializer.Deserialize(json) ?? throw new CataloggerError("JsonTypeHandler returned null"); } - - public override void SetValue(IDbDataParameter parameter, T? value) => - parameter.Value = JsonSerializer.Serialize(value); } } diff --git a/Catalogger.Backend/Database/Models/ConfigExport.cs b/Catalogger.Backend/Database/Models/ConfigExport.cs index 664bfa8..dfbe95c 100644 --- a/Catalogger.Backend/Database/Models/ConfigExport.cs +++ b/Catalogger.Backend/Database/Models/ConfigExport.cs @@ -6,7 +6,7 @@ public record ConfigExport( ulong Id, ChannelsBackup Channels, string[] BannedSystems, - ulong[] KeyRoles, + List KeyRoles, IEnumerable Invites, IEnumerable Watchlist ); diff --git a/Catalogger.Backend/Database/Models/Guild.cs b/Catalogger.Backend/Database/Models/Guild.cs index 6ec6d82..0558da2 100644 --- a/Catalogger.Backend/Database/Models/Guild.cs +++ b/Catalogger.Backend/Database/Models/Guild.cs @@ -26,11 +26,11 @@ public class Guild public ChannelConfig Channels { get; init; } = new(); public MessageConfig Messages { get; init; } = new(); public string[] BannedSystems { get; set; } = []; - public ulong[] KeyRoles { get; set; } = []; + public List KeyRoles { get; set; } = []; // These channels and roles are ignored for channel/role update/delete events. - public ulong[] IgnoredChannels { get; set; } = []; - public ulong[] IgnoredRoles { get; set; } = []; + public List IgnoredChannels { get; set; } = []; + public List IgnoredRoles { get; set; } = []; public bool IsSystemBanned(PluralkitApiService.PkSystem system) => BannedSystems.Contains(system.Id) || BannedSystems.Contains(system.Uuid.ToString()); diff --git a/Catalogger.Backend/Database/Repositories/GuildRepository.cs b/Catalogger.Backend/Database/Repositories/GuildRepository.cs index 853a93e..71502e2 100644 --- a/Catalogger.Backend/Database/Repositories/GuildRepository.cs +++ b/Catalogger.Backend/Database/Repositories/GuildRepository.cs @@ -119,25 +119,14 @@ public class GuildRepository(ILogger logger, DatabaseConnection conn) private record BannedSystem(Guid SystemId, ulong UserId, ulong GuildId); - public async Task AddKeyRoleAsync(Snowflake guildId, Snowflake roleId) => - await conn.ExecuteAsync( - "update guilds set key_roles = array_append(key_roles, @RoleId) where id = @GuildId", - new { GuildId = guildId.Value, RoleId = roleId.Value } - ); - - public async Task RemoveKeyRoleAsync(Snowflake guildId, Snowflake roleId) => - await conn.ExecuteAsync( - "update guilds set key_roles = array_remove(key_roles, @RoleId) where id = @GuildId", - new { GuildId = guildId.Value, RoleId = roleId.Value } - ); - public async Task UpdateConfigAsync(Snowflake id, Guild config) => await conn.ExecuteAsync( """ update guilds set channels = @Channels::jsonb, messages = @Messages::jsonb, ignored_channels = @IgnoredChannels, - ignored_roles = @IgnoredRoles + ignored_roles = @IgnoredRoles, + key_roles = @KeyRoles where id = @Id """, new @@ -147,6 +136,7 @@ public class GuildRepository(ILogger logger, DatabaseConnection conn) config.Messages, config.IgnoredChannels, config.IgnoredRoles, + config.KeyRoles, } ); @@ -155,7 +145,7 @@ public class GuildRepository(ILogger logger, DatabaseConnection conn) Guild.ChannelConfig channels, Guild.MessageConfig messages, string[] bannedSystems, - ulong[] keyRoles + List keyRoles ) => await conn.ExecuteAsync( "update guilds set channels = @channels::jsonb, messages = @messages::jsonb, banned_systems = @bannedSystems, key_roles = @keyRoles where id = @id", From 223f8081512b667b53561eba4bd46b9de8e2d401 Mon Sep 17 00:00:00 2001 From: sam Date: Mon, 18 Nov 2024 21:26:47 +0100 Subject: [PATCH 37/57] feat: ignore entity commands, actually ignore events when the entity is ignored --- .../Bot/Commands/IgnoreEntitiesCommands.cs | 304 ++++++++++++++++++ .../IgnoreMessageCommands.Channels.cs | 1 - Catalogger.Backend/Program.cs | 3 + .../Services/WebhookExecutorService.cs | 43 ++- 4 files changed, 348 insertions(+), 3 deletions(-) create mode 100644 Catalogger.Backend/Bot/Commands/IgnoreEntitiesCommands.cs diff --git a/Catalogger.Backend/Bot/Commands/IgnoreEntitiesCommands.cs b/Catalogger.Backend/Bot/Commands/IgnoreEntitiesCommands.cs new file mode 100644 index 0000000..5ffc7a9 --- /dev/null +++ b/Catalogger.Backend/Bot/Commands/IgnoreEntitiesCommands.cs @@ -0,0 +1,304 @@ +// Copyright (C) 2021-present sam (starshines.gay) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +using System.ComponentModel; +using Catalogger.Backend.Cache; +using Catalogger.Backend.Cache.InMemoryCache; +using Catalogger.Backend.Database.Repositories; +using Catalogger.Backend.Extensions; +using Catalogger.Backend.Services; +using Remora.Commands.Attributes; +using Remora.Commands.Groups; +using Remora.Discord.API; +using Remora.Discord.API.Abstractions.Objects; +using Remora.Discord.Commands.Attributes; +using Remora.Discord.Commands.Feedback.Services; +using Remora.Discord.Commands.Services; +using Remora.Discord.Extensions.Embeds; +using Remora.Rest.Core; +using IResult = Remora.Results.IResult; + +namespace Catalogger.Backend.Bot.Commands; + +[Group("ignore")] +[Description("Manage the ignored channels and roles in this server.")] +[DiscordDefaultMemberPermissions(DiscordPermission.ManageGuild)] +public class IgnoreEntitiesCommands : CommandGroup +{ + [Group("role")] + public class Roles( + GuildRepository guildRepository, + GuildCache guildCache, + RoleCache roleCache, + ContextInjectionService contextInjection, + FeedbackService feedbackService + ) : CommandGroup + { + [Command("add")] + [Description("Add a role to the list of ignored roles.")] + public async Task AddIgnoredRoleAsync( + [Description("The role to ignore")] IRole role + ) + { + var (_, guildId) = contextInjection.GetUserAndGuild(); + var guildConfig = await guildRepository.GetAsync(guildId); + + if (guildConfig.IgnoredRoles.Contains(role.ID.Value)) + return await feedbackService.ReplyAsync( + "That role is already being ignored.", + isEphemeral: true + ); + + guildConfig.IgnoredRoles.Add(role.ID.Value); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); + + return await feedbackService.ReplyAsync( + $"Successfully added {role.Name} to the list of ignored roles." + ); + } + + [Command("remove")] + [Description("Remove a role from the list of ignored roles.")] + public async Task RemoveIgnoredRoleAsync( + [Description("The role to stop ignoring")] IRole role + ) + { + var (_, guildId) = contextInjection.GetUserAndGuild(); + var guildConfig = await guildRepository.GetAsync(guildId); + + if (!guildConfig.IgnoredRoles.Contains(role.ID.Value)) + return await feedbackService.ReplyAsync( + "That role is already not ignored.", + isEphemeral: true + ); + + guildConfig.IgnoredRoles.Remove(role.ID.Value); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); + + return await feedbackService.ReplyAsync( + $"Successfully removed {role.Name} from the list of ignored roles." + ); + } + + [Command("list")] + [Description("List roles ignored for logging.")] + public async Task ListIgnoredRolesAsync() + { + var (_, guildId) = contextInjection.GetUserAndGuild(); + if (!guildCache.TryGet(guildId, out var guild)) + throw new CataloggerError("Guild not in cache"); + + var guildConfig = await guildRepository.GetAsync(guildId); + + var roles = roleCache + .GuildRoles(guildId) + .Where(r => guildConfig.IgnoredRoles.Contains(r.ID.Value)) + .OrderByDescending(r => r.Position) + .Select(r => $"<@&{r.ID}>") + .ToList(); + if (roles.Count == 0) + return await feedbackService.ReplyAsync( + "No roles are being ignored right now.", + isEphemeral: true + ); + + return await feedbackService.ReplyAsync( + embeds: + [ + new EmbedBuilder() + .WithTitle($"Ignored roles in {guild.Name}") + .WithDescription(string.Join("\n", roles)) + .WithColour(DiscordUtils.Purple) + .Build() + .GetOrThrow(), + ] + ); + } + } + + [Group("channel")] + public class Channels( + GuildRepository guildRepository, + IMemberCache memberCache, + GuildCache guildCache, + ChannelCache channelCache, + PermissionResolverService permissionResolver, + ContextInjectionService contextInjection, + FeedbackService feedbackService + ) : CommandGroup + { + [Command("add")] + [Description("Add a channel to the list of ignored channels.")] + public async Task AddIgnoredChannelAsync( + [ChannelTypes( + ChannelType.GuildCategory, + ChannelType.GuildText, + ChannelType.GuildAnnouncement, + ChannelType.GuildForum, + ChannelType.GuildMedia, + ChannelType.GuildVoice, + ChannelType.GuildStageVoice + )] + [Description("The channel to ignore")] + IChannel channel + ) + { + var (_, guildId) = contextInjection.GetUserAndGuild(); + var guildConfig = await guildRepository.GetAsync(guildId); + + if (guildConfig.IgnoredChannels.Contains(channel.ID.Value)) + return await feedbackService.ReplyAsync( + "That channel is already being ignored.", + isEphemeral: true + ); + + guildConfig.IgnoredChannels.Add(channel.ID.Value); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); + + return await feedbackService.ReplyAsync( + $"Successfully added {(channel.Type == ChannelType.GuildCategory ? channel.Name : $"<#{channel.ID}>")} to the list of ignored channels." + ); + } + + [Command("remove")] + [Description("Remove a channel from the list of ignored channels.")] + public async Task RemoveIgnoredChannelAsync( + [Description("The channel to stop ignoring")] IChannel channel + ) + { + var (_, guildId) = contextInjection.GetUserAndGuild(); + var guildConfig = await guildRepository.GetAsync(guildId); + + if (!guildConfig.IgnoredChannels.Contains(channel.ID.Value)) + return await feedbackService.ReplyAsync( + "That channel is already not ignored.", + isEphemeral: true + ); + + guildConfig.IgnoredChannels.Remove(channel.ID.Value); + await guildRepository.UpdateConfigAsync(guildId, guildConfig); + + return await feedbackService.ReplyAsync( + $"Successfully removed {(channel.Type == ChannelType.GuildCategory ? channel.Name : $"<#{channel.ID}>")} from the list of ignored channels." + ); + } + + [Command("list")] + [Description("List channels ignored for logging.")] + public async Task ListIgnoredChannelsAsync() + { + var (userId, guildId) = contextInjection.GetUserAndGuild(); + if (!guildCache.TryGet(guildId, out var guild)) + throw new CataloggerError("Guild not in cache"); + + var guildChannels = channelCache.GuildChannels(guildId).ToList(); + var guildConfig = await guildRepository.GetAsync(guildId); + + var member = await memberCache.TryGetAsync(guildId, userId); + if (member == null) + throw new CataloggerError("Executing member not found"); + + var ignoredChannels = guildConfig + .IgnoredChannels.Select(id => + { + var channel = guildChannels.FirstOrDefault(c => c.ID.Value == id); + if (channel == null) + return new IgnoredChannel( + IgnoredChannelType.Unknown, + DiscordSnowflake.New(id) + ); + + var type = channel.Type switch + { + ChannelType.GuildCategory => IgnoredChannelType.Category, + _ => IgnoredChannelType.Base, + }; + + return new IgnoredChannel( + type, + channel.ID, + permissionResolver + .GetChannelPermissions(guildId, member, channel) + .HasPermission(DiscordPermission.ViewChannel) + ); + }) + .ToList(); + + var embed = new EmbedBuilder() + .WithTitle($"Ignored channels in {guild.Name}") + .WithColour(DiscordUtils.Purple); + + var nonVisibleCategories = ignoredChannels.Count(c => + c is { Type: IgnoredChannelType.Category, CanSee: false } + ); + var visibleCategories = ignoredChannels + .Where(c => c is { Type: IgnoredChannelType.Category, CanSee: true }) + .ToList(); + + if (nonVisibleCategories != 0 || visibleCategories.Count != 0) + { + var value = string.Join("\n", visibleCategories.Select(c => $"<#{c.Id}>")); + if (nonVisibleCategories != 0) + value += + $"\n\n{nonVisibleCategories} channel(s) are not shown as you do not have access to them."; + + embed.AddField("Categories", value); + } + + var nonVisibleBase = ignoredChannels.Count(c => + c is { Type: IgnoredChannelType.Base, CanSee: false } + ); + var visibleBase = ignoredChannels + .Where(c => c is { Type: IgnoredChannelType.Base, CanSee: true }) + .ToList(); + + if (nonVisibleBase != 0 || visibleBase.Count != 0) + { + var value = string.Join("\n", visibleBase.Select(c => $"<#{c.Id}>")); + if (nonVisibleBase != 0) + value += + $"\n\n{nonVisibleBase} channel(s) are not shown as you do not have access to them."; + + embed.AddField("Channels", value); + } + + var unknownChannels = string.Join( + "\n", + ignoredChannels + .Where(c => c.Type == IgnoredChannelType.Unknown) + .Select(c => $"{c.Id} <#{c.Id}>") + ); + if (!string.IsNullOrWhiteSpace(unknownChannels)) + { + embed.AddField("Unknown", unknownChannels); + } + + return await feedbackService.ReplyAsync(embeds: [embed.Build().GetOrThrow()]); + } + + private record struct IgnoredChannel( + IgnoredChannelType Type, + Snowflake Id, + bool CanSee = true + ); + + private enum IgnoredChannelType + { + Unknown, + Base, + Category, + } + } +} diff --git a/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Channels.cs b/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Channels.cs index a365c9f..69b225e 100644 --- a/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Channels.cs +++ b/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Channels.cs @@ -50,7 +50,6 @@ public partial class IgnoreMessageCommands : CommandGroup { [Command("add")] [Description("Add a channel to the list of ignored channels.")] - [SuppressInteractionResponse(true)] public async Task AddIgnoredChannelAsync( [ChannelTypes( ChannelType.GuildCategory, diff --git a/Catalogger.Backend/Program.cs b/Catalogger.Backend/Program.cs index f69c42e..94e785a 100644 --- a/Catalogger.Backend/Program.cs +++ b/Catalogger.Backend/Program.cs @@ -100,6 +100,9 @@ builder .WithCommandGroup() .WithCommandGroup() .WithCommandGroup() + .WithCommandGroup() + .WithCommandGroup() + .WithCommandGroup() .WithCommandGroup() .WithCommandGroup() // End command tree diff --git a/Catalogger.Backend/Services/WebhookExecutorService.cs b/Catalogger.Backend/Services/WebhookExecutorService.cs index 221b4a1..f82ea75 100644 --- a/Catalogger.Backend/Services/WebhookExecutorService.cs +++ b/Catalogger.Backend/Services/WebhookExecutorService.cs @@ -295,8 +295,8 @@ public class WebhookExecutorService( if (isMessageLog) return GetMessageLogChannel(guild, logChannelType, channelId, userId); - if (isChannelLog && guild.IgnoredChannels.Contains(channelId!.Value.Value)) - return null; + if (isChannelLog) + return GetChannelLogChannel(guild, logChannelType, channelId!.Value); if (isRoleLog && guild.IgnoredRoles.Contains(roleId!.Value.Value)) return null; @@ -309,6 +309,45 @@ public class WebhookExecutorService( return GetDefaultLogChannel(guild, logChannelType); } + private ulong? GetChannelLogChannel( + Guild guild, + LogChannelType logChannelType, + Snowflake channelId + ) + { + if (!channelCache.TryGet(channelId, out var channel)) + return GetDefaultLogChannel(guild, logChannelType); + + Snowflake? categoryId; + if ( + channel.Type + is ChannelType.AnnouncementThread + or ChannelType.PrivateThread + or ChannelType.PublicThread + ) + { + // parent_id should always have a value for threads + channelId = channel.ParentID.Value!.Value; + if (!channelCache.TryGet(channelId, out var parentChannel)) + return GetDefaultLogChannel(guild, logChannelType); + categoryId = parentChannel.ParentID.Value; + } + else + { + channelId = channel.ID; + categoryId = channel.ParentID.Value; + } + + // Check if the channel or its category is ignored + if ( + guild.IgnoredChannels.Contains(channelId.Value) + || (categoryId != null && guild.IgnoredChannels.Contains(categoryId.Value.Value)) + ) + return null; + + return GetDefaultLogChannel(guild, logChannelType); + } + private ulong? GetMessageLogChannel( Guild guild, LogChannelType logChannelType, From 1f4aba0868c0857ef345eba3cadc540a51611b4e Mon Sep 17 00:00:00 2001 From: sam Date: Mon, 18 Nov 2024 21:27:34 +0100 Subject: [PATCH 38/57] feat(dashboard): ignore entity page --- Catalogger.Frontend/src/routes/+layout.svelte | 4 +- Catalogger.Frontend/src/routes/+page.ts | 2 +- .../src/routes/about/contact/+page.svelte | 6 +- .../src/routes/about/tos/+page.svelte | 6 +- .../src/routes/dash/[guildId]/+layout.svelte | 35 +-- .../src/routes/dash/[guildId]/+page.svelte | 32 ++- .../[guildId]/ignored-entities/+page.svelte | 205 ++++++++++++++++++ .../[guildId]/ignored-messages/+page.svelte | 12 +- .../dash/[guildId]/key-roles/+page.svelte | 6 +- .../dash/[guildId]/redirects/+page.svelte | 7 +- 10 files changed, 264 insertions(+), 51 deletions(-) create mode 100644 Catalogger.Frontend/src/routes/dash/[guildId]/ignored-entities/+page.svelte diff --git a/Catalogger.Frontend/src/routes/+layout.svelte b/Catalogger.Frontend/src/routes/+layout.svelte index aae3f1a..a33b94e 100644 --- a/Catalogger.Frontend/src/routes/+layout.svelte +++ b/Catalogger.Frontend/src/routes/+layout.svelte @@ -31,7 +31,9 @@ · Privacy · - Source code + Source code diff --git a/Catalogger.Frontend/src/routes/+page.ts b/Catalogger.Frontend/src/routes/+page.ts index c8cacf0..189f71e 100644 --- a/Catalogger.Frontend/src/routes/+page.ts +++ b/Catalogger.Frontend/src/routes/+page.ts @@ -1 +1 @@ -export const prerender = true; \ No newline at end of file +export const prerender = true; diff --git a/Catalogger.Frontend/src/routes/about/contact/+page.svelte b/Catalogger.Frontend/src/routes/about/contact/+page.svelte index a2a9650..e38536f 100644 --- a/Catalogger.Frontend/src/routes/about/contact/+page.svelte +++ b/Catalogger.Frontend/src/routes/about/contact/+page.svelte @@ -1,9 +1,9 @@ - Catalogger - Contact + Catalogger - Contact -{@html html} \ No newline at end of file +{@html html} diff --git a/Catalogger.Frontend/src/routes/about/tos/+page.svelte b/Catalogger.Frontend/src/routes/about/tos/+page.svelte index bce6743..678e6fd 100644 --- a/Catalogger.Frontend/src/routes/about/tos/+page.svelte +++ b/Catalogger.Frontend/src/routes/about/tos/+page.svelte @@ -1,9 +1,9 @@ - Catalogger - Terms of Service + Catalogger - Terms of Service -{@html html} \ No newline at end of file +{@html html} diff --git a/Catalogger.Frontend/src/routes/dash/[guildId]/+layout.svelte b/Catalogger.Frontend/src/routes/dash/[guildId]/+layout.svelte index c3ddeaf..7c1832d 100644 --- a/Catalogger.Frontend/src/routes/dash/[guildId]/+layout.svelte +++ b/Catalogger.Frontend/src/routes/dash/[guildId]/+layout.svelte @@ -2,33 +2,8 @@ import { Button, Nav, NavItem, NavLink } from "@sveltestrap/sveltestrap"; import type { LayoutData } from "./$types"; import { page } from "$app/stores"; - import apiFetch, { type ApiError, type ChannelConfig } from "$lib/api"; - import { addToast } from "$lib/toast"; export let data: LayoutData; - - // This only saves log channels. All other pages are lists and are saved immediately upon adding/removing an entry. - const save = async () => { - try { - const resp = await apiFetch( - "PATCH", - `/api/guilds/${data.guild.id}`, - data.guild.channels, - ); - data.guild.channels = resp; - - addToast({ - header: "Saved log channels.", - body: "Successfully edited log channels.", - }); - } catch (e) { - addToast({ - header: "Error saving changes to log channels", - body: - (e as ApiError).message || "Unknown error. Please try again later.", - }); - } - }; @@ -56,6 +31,12 @@ > Ignored messages + + Ignored channels/roles + - - {#if $page.url.pathname === `/dash/${data.guild.id}`} - - {/if} diff --git a/Catalogger.Frontend/src/routes/dash/[guildId]/+page.svelte b/Catalogger.Frontend/src/routes/dash/[guildId]/+page.svelte index 7b6c087..793c966 100644 --- a/Catalogger.Frontend/src/routes/dash/[guildId]/+page.svelte +++ b/Catalogger.Frontend/src/routes/dash/[guildId]/+page.svelte @@ -1,14 +1,42 @@ -

Log channels

+
+

Log channels

+ +
diff --git a/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-entities/+page.svelte b/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-entities/+page.svelte new file mode 100644 index 0000000..33cc720 --- /dev/null +++ b/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-entities/+page.svelte @@ -0,0 +1,205 @@ + + +

Ignored channels and roles

+ +

+ Events related to these channels and roles (such as them being edited, them + being deleted, and them being added to users) will not be logged. +

+ +

+ If you want to ignore messages from channels and roles, go to + ignored messages instead. +

+ +

Channels

+ +
+ +
+ +
+ +
+ + + {#each ignoredChannels as id} + removeChannelIgnore(id)} + buttonText="Stop ignoring" + > + {channelName(id)} + + {:else} + No channels are being ignored right now. + {/each} + + +

Roles

+ +
+ +
+ +
+ +
+ + + {#each ignoredRoles as id} + removeRoleIgnore(id)} + buttonText="Stop ignoring" + /> + {:else} + No roles are being ignored right now. + {/each} + diff --git a/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-messages/+page.svelte b/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-messages/+page.svelte index 8704e8a..7632941 100644 --- a/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-messages/+page.svelte +++ b/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-messages/+page.svelte @@ -1,5 +1,5 @@
diff --git a/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-users/+page.svelte b/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-users/+page.svelte new file mode 100644 index 0000000..544d73b --- /dev/null +++ b/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-users/+page.svelte @@ -0,0 +1,119 @@ + + +

Ignored users

+ +

Messages from ignored users will not be logged.

+ +
+ + + {#if toIgnore && !idRegex.test(toIgnore)} +

+ If you're not ignoring a member of your server, you need to give a + user ID, not their username. +

+ {/if} +
+ +
+ +
+ +

Currently ignored users

+ + + {#each data.users as user (user.id)} + + {user.tag} (ID: {user.id}) + + + {/each} + diff --git a/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-users/+page.ts b/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-users/+page.ts new file mode 100644 index 0000000..8f793f5 --- /dev/null +++ b/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-users/+page.ts @@ -0,0 +1,10 @@ +import apiFetch from "$lib/api"; + +export const load = async ({ params }) => { + const users = await apiFetch>( + "GET", + `/api/guilds/${params.guildId}/ignored-users`, + ); + + return { users }; +}; From 5ac607fd0a9b7bad98bde34da9038947c69fbd79 Mon Sep 17 00:00:00 2001 From: sam Date: Thu, 31 Oct 2024 01:26:50 +0100 Subject: [PATCH 20/57] feat: show bot version on startup and in /catalogger ping --- .gitignore | 1 + .../Bot/Commands/MetaCommands.cs | 5 +- Catalogger.Backend/BuildInfo.cs | 46 +++++++++++++++++++ Catalogger.Backend/Catalogger.Backend.csproj | 6 +++ .../Extensions/StartupExtensions.cs | 8 +++- build_info.sh | 4 ++ 6 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 Catalogger.Backend/BuildInfo.cs create mode 100755 build_info.sh diff --git a/.gitignore b/.gitignore index 7d908b7..383eadd 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ riderModule.iml /_ReSharper.Caches/ config.ini *.DotSettings.user +.version diff --git a/Catalogger.Backend/Bot/Commands/MetaCommands.cs b/Catalogger.Backend/Bot/Commands/MetaCommands.cs index 8f516f1..1887507 100644 --- a/Catalogger.Backend/Bot/Commands/MetaCommands.cs +++ b/Catalogger.Backend/Bot/Commands/MetaCommands.cs @@ -176,7 +176,7 @@ public class MetaCommands( var embed = new EmbedBuilder() .WithColour(DiscordUtils.Purple) .WithFooter( - $"{RuntimeInformation.FrameworkDescription} on {RuntimeInformation.RuntimeIdentifier}" + $"{BuildInfo.Version}, {RuntimeInformation.FrameworkDescription} on {RuntimeInformation.RuntimeIdentifier}" ) .WithCurrentTimestamp(); embed.AddField( @@ -209,8 +209,7 @@ public class MetaCommands( "Numbers", $"{CataloggerMetrics.MessagesStored.Value:N0} messages " + $"from {guildCache.Size:N0} servers\n" - + $"Cached {channelCache.Size:N0} channels, {roleCache.Size:N0} roles, {emojiCache.Size:N0} emojis", - false + + $"Cached {channelCache.Size:N0} channels, {roleCache.Size:N0} roles, {emojiCache.Size:N0} emojis" ); IEmbed[] embeds = [embed.Build().GetOrThrow()]; diff --git a/Catalogger.Backend/BuildInfo.cs b/Catalogger.Backend/BuildInfo.cs new file mode 100644 index 0000000..95ca05f --- /dev/null +++ b/Catalogger.Backend/BuildInfo.cs @@ -0,0 +1,46 @@ +// Copyright (C) 2021-present sam (starshines.gay) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +namespace Catalogger.Backend; + +public static class BuildInfo +{ + public static string Hash { get; private set; } = "(unknown)"; + public static string Version { get; private set; } = "(unknown)"; + + public static async Task ReadBuildInfo() + { + await using var stream = typeof(BuildInfo).Assembly.GetManifestResourceStream("version"); + if (stream == null) + return; + + using var reader = new StreamReader(stream); + var data = (await reader.ReadToEndAsync()).Trim().Split("\n"); + if (data.Length < 3) + return; + + Hash = data[0]; + var dirty = data[2] == "dirty"; + + var versionData = data[1].Split("-"); + if (versionData.Length < 3) + return; + Version = versionData[0]; + if (versionData[1] != "0" || dirty) + Version += $"+{versionData[2]}"; + if (dirty) + Version += ".dirty"; + } +} diff --git a/Catalogger.Backend/Catalogger.Backend.csproj b/Catalogger.Backend/Catalogger.Backend.csproj index b6fd02c..1e06c3d 100644 --- a/Catalogger.Backend/Catalogger.Backend.csproj +++ b/Catalogger.Backend/Catalogger.Backend.csproj @@ -7,8 +7,14 @@ true + + + + + + diff --git a/Catalogger.Backend/Extensions/StartupExtensions.cs b/Catalogger.Backend/Extensions/StartupExtensions.cs index 9776395..a84e232 100644 --- a/Catalogger.Backend/Extensions/StartupExtensions.cs +++ b/Catalogger.Backend/Extensions/StartupExtensions.cs @@ -186,9 +186,15 @@ public static class StartupExtensions public static async Task Initialize(this WebApplication app) { + await BuildInfo.ReadBuildInfo(); + await using var scope = app.Services.CreateAsyncScope(); var logger = scope.ServiceProvider.GetRequiredService().ForContext(); - logger.Information("Starting Catalogger.NET"); + logger.Information( + "Starting Catalogger.NET {Version} ({Hash})", + BuildInfo.Version, + BuildInfo.Hash + ); CataloggerMetrics.Startup = scope .ServiceProvider.GetRequiredService() diff --git a/build_info.sh b/build_info.sh new file mode 100755 index 0000000..c644a3c --- /dev/null +++ b/build_info.sh @@ -0,0 +1,4 @@ +#!/bin/sh +(git rev-parse HEAD && + git describe --tags --always --long && + if test -z "$(git ls-files --exclude-standard --modified --deleted --others)"; then echo clean; else echo dirty; fi) > ../.version From 5f24a6aa889c29699e2f9f927c5dc5b5f14cb817 Mon Sep 17 00:00:00 2001 From: sam Date: Tue, 5 Nov 2024 15:32:53 +0100 Subject: [PATCH 21/57] feat: store system UUIDs of banned users per guild --- Catalogger.Backend/Api/MetaController.cs | 4 ++ .../Responders/Guilds/GuildBanAddResponder.cs | 7 ++- .../Guilds/GuildBanRemoveResponder.cs | 58 ++++++++++++++----- .../Responders/Guilds/GuildCreateResponder.cs | 4 +- Catalogger.Backend/CataloggerMetrics.cs | 5 ++ .../Migrations/002_store_pk_systems.down.sql | 1 + .../Migrations/002_store_pk_systems.up.sql | 9 +++ .../Database/Repositories/GuildRepository.cs | 49 +++++++++++++++- .../Services/MetricsCollectionService.cs | 2 + 9 files changed, 121 insertions(+), 18 deletions(-) create mode 100644 Catalogger.Backend/Database/Migrations/002_store_pk_systems.down.sql create mode 100644 Catalogger.Backend/Database/Migrations/002_store_pk_systems.up.sql diff --git a/Catalogger.Backend/Api/MetaController.cs b/Catalogger.Backend/Api/MetaController.cs index 17d3c27..9d7a7b1 100644 --- a/Catalogger.Backend/Api/MetaController.cs +++ b/Catalogger.Backend/Api/MetaController.cs @@ -65,6 +65,10 @@ public class MetaController( ); } + [HttpGet("coffee")] + public IActionResult BrewCoffee() => + Problem("Sorry, I'm a teapot!", statusCode: StatusCodes.Status418ImATeapot); + private record MetaResponse( int Guilds, string InviteUrl, diff --git a/Catalogger.Backend/Bot/Responders/Guilds/GuildBanAddResponder.cs b/Catalogger.Backend/Bot/Responders/Guilds/GuildBanAddResponder.cs index 0100b1f..f20d8c2 100644 --- a/Catalogger.Backend/Bot/Responders/Guilds/GuildBanAddResponder.cs +++ b/Catalogger.Backend/Bot/Responders/Guilds/GuildBanAddResponder.cs @@ -76,7 +76,12 @@ public class GuildBanAddResponder( evt.GuildID ); - await guildRepository.BanSystemAsync(evt.GuildID, pkSystem.Id, pkSystem.Uuid); + await guildRepository.BanSystemAsync( + evt.GuildID, + evt.User.ID, + pkSystem.Id, + pkSystem.Uuid + ); } embed.AddField( diff --git a/Catalogger.Backend/Bot/Responders/Guilds/GuildBanRemoveResponder.cs b/Catalogger.Backend/Bot/Responders/Guilds/GuildBanRemoveResponder.cs index ee1d1bc..99fcce2 100644 --- a/Catalogger.Backend/Bot/Responders/Guilds/GuildBanRemoveResponder.cs +++ b/Catalogger.Backend/Bot/Responders/Guilds/GuildBanRemoveResponder.cs @@ -67,20 +67,52 @@ public class GuildBanRemoveResponder( var pkSystem = await pluralkitApi.GetPluralKitSystemAsync(evt.User.ID.Value, ct); if (pkSystem != null) { - await guildRepository.UnbanSystemAsync(evt.GuildID, pkSystem.Id, pkSystem.Uuid); - - embed.AddField( - "PluralKit system", - $""" - **ID:** {pkSystem.Id} - **UUID:** `{pkSystem.Uuid}` - **Name:** {pkSystem.Name ?? "*(none)*"} - **Tag:** {pkSystem.Tag ?? "*(none)*"} - - This system has been unbanned. - Note that other accounts linked to the system might still be banned, check `pk;system {pkSystem.Id}` for the linked accounts. - """ + await guildRepository.UnbanSystemAsync( + evt.GuildID, + evt.User.ID, + pkSystem.Id, + pkSystem.Uuid ); + + var systemUsers = await guildRepository.GetSystemAccountsAsync( + evt.GuildID, + pkSystem.Uuid + ); + if (systemUsers.Length == 0) + { + embed.AddField( + "PluralKit system", + $""" + **ID:** {pkSystem.Id} + **UUID:** `{pkSystem.Uuid}` + **Name:** {pkSystem.Name ?? "*(none)*"} + **Tag:** {pkSystem.Tag ?? "*(none)*"} + + This system has been unbanned. + Note that other accounts linked to the system might still be banned, check `pk;system {pkSystem.Id}` for the linked accounts. + """ + ); + } + else + { + var users = new List(); + foreach (var id in systemUsers) + users.Add("- " + await userCache.TryFormatUserAsync(id)); + + embed.AddField( + "PluralKit system", + $""" + **ID:** {pkSystem.Id} + **UUID:** `{pkSystem.Uuid}` + **Name:** {pkSystem.Name ?? "*(none)*"} + **Tag:** {pkSystem.Tag ?? "*(none)*"} + + This system has been unbanned. + Note that the following accounts are known to be linked to this system and banned from this server: + {string.Join("\n", users)} + """ + ); + } } webhookExecutor.QueueLog( diff --git a/Catalogger.Backend/Bot/Responders/Guilds/GuildCreateResponder.cs b/Catalogger.Backend/Bot/Responders/Guilds/GuildCreateResponder.cs index ab12125..789d072 100644 --- a/Catalogger.Backend/Bot/Responders/Guilds/GuildCreateResponder.cs +++ b/Catalogger.Backend/Bot/Responders/Guilds/GuildCreateResponder.cs @@ -107,14 +107,14 @@ public class GuildCreateResponder( } // Clear the cache for this guild - guildCache.Remove(evt.ID, out _); + var wasCached = guildCache.Remove(evt.ID, out var guild); emojiCache.Remove(evt.ID); channelCache.RemoveGuild(evt.ID); roleCache.RemoveGuild(evt.ID); await memberCache.RemoveAllMembersAsync(evt.ID); await inviteCache.RemoveAsync(evt.ID); - if (!guildCache.TryGet(evt.ID, out var guild)) + if (!wasCached || guild == null) { _logger.Information("Left uncached guild {GuildId}", evt.ID); return Result.Success; diff --git a/Catalogger.Backend/CataloggerMetrics.cs b/Catalogger.Backend/CataloggerMetrics.cs index b8726b5..1dc0cf0 100644 --- a/Catalogger.Backend/CataloggerMetrics.cs +++ b/Catalogger.Backend/CataloggerMetrics.cs @@ -39,6 +39,11 @@ public static class CataloggerMetrics "Number of channels in the cache" ); + public static readonly Gauge RolesCached = Metrics.CreateGauge( + "catalogger_cache_roles", + "Number of roles in the cache" + ); + public static readonly Gauge UsersCached = Metrics.CreateGauge( "catalogger_cache_users", "Number of users in the cache" diff --git a/Catalogger.Backend/Database/Migrations/002_store_pk_systems.down.sql b/Catalogger.Backend/Database/Migrations/002_store_pk_systems.down.sql new file mode 100644 index 0000000..c411602 --- /dev/null +++ b/Catalogger.Backend/Database/Migrations/002_store_pk_systems.down.sql @@ -0,0 +1 @@ +drop table pluralkit_systems; diff --git a/Catalogger.Backend/Database/Migrations/002_store_pk_systems.up.sql b/Catalogger.Backend/Database/Migrations/002_store_pk_systems.up.sql new file mode 100644 index 0000000..d095e36 --- /dev/null +++ b/Catalogger.Backend/Database/Migrations/002_store_pk_systems.up.sql @@ -0,0 +1,9 @@ +create table pluralkit_systems ( + system_id uuid not null, + user_id bigint not null, + guild_id bigint not null, + + primary key (system_id, user_id, guild_id) +); + +create index ix_pluralkit_systems_user_guild on pluralkit_systems (user_id, guild_id); diff --git a/Catalogger.Backend/Database/Repositories/GuildRepository.cs b/Catalogger.Backend/Database/Repositories/GuildRepository.cs index 79d950a..5c1b3f7 100644 --- a/Catalogger.Backend/Database/Repositories/GuildRepository.cs +++ b/Catalogger.Backend/Database/Repositories/GuildRepository.cs @@ -15,6 +15,8 @@ using Catalogger.Backend.Database.Models; using Dapper; +using Npgsql.Replication; +using Remora.Discord.API; using Remora.Rest.Core; namespace Catalogger.Backend.Database.Repositories; @@ -58,13 +60,30 @@ public class GuildRepository(ILogger logger, DatabaseConnection conn) new { Id = id, Channels = new Guild.ChannelConfig() } ); - public async Task BanSystemAsync(Snowflake guildId, string hid, Guid uuid) => + public async Task BanSystemAsync(Snowflake guildId, Snowflake userId, string hid, Guid uuid) + { await conn.ExecuteAsync( "update guilds set banned_systems = array_cat(banned_systems, @SystemIds) where id = @GuildId", new { GuildId = guildId.Value, SystemIds = (string[])[hid, uuid.ToString()] } ); - public async Task UnbanSystemAsync(Snowflake guildId, string hid, Guid uuid) => + await conn.ExecuteAsync( + """ + insert into pluralkit_systems (system_id, user_id, guild_id) + values (@SystemId, @UserId, @GuildId) + on conflict (system_id, user_id, guild_id) do nothing + """, + new + { + SystemId = uuid, + UserId = userId.Value, + GuildId = guildId.Value, + } + ); + } + + public async Task UnbanSystemAsync(Snowflake guildId, Snowflake userId, string hid, Guid uuid) + { await conn.ExecuteAsync( "update guilds set banned_systems = array_remove(array_remove(banned_systems, @Hid), @Uuid) where id = @Id", new @@ -75,6 +94,32 @@ public class GuildRepository(ILogger logger, DatabaseConnection conn) } ); + await conn.ExecuteAsync( + """ + delete from pluralkit_systems where system_id = @SystemId + and user_id = @UserId + and guild_id = @GuildId + """, + new + { + SystemId = uuid, + UserId = userId.Value, + GuildId = guildId.Value, + } + ); + } + + public async Task GetSystemAccountsAsync(Snowflake guildId, Guid systemId) + { + var bannedAccounts = await conn.QueryAsync( + "select * from pluralkit_systems where system_id = @SystemId and guild_id = @GuildId", + new { SystemId = systemId, GuildId = guildId.Value } + ); + return bannedAccounts.Select(s => DiscordSnowflake.New(s.UserId)).ToArray(); + } + + private record BannedSystem(Guid SystemId, ulong UserId, ulong GuildId); + public async Task AddKeyRoleAsync(Snowflake guildId, Snowflake roleId) => await conn.ExecuteAsync( "update guilds set key_roles = array_append(key_roles, @RoleId) where id = @GuildId", diff --git a/Catalogger.Backend/Services/MetricsCollectionService.cs b/Catalogger.Backend/Services/MetricsCollectionService.cs index 7ac9ffe..5c003a0 100644 --- a/Catalogger.Backend/Services/MetricsCollectionService.cs +++ b/Catalogger.Backend/Services/MetricsCollectionService.cs @@ -26,6 +26,7 @@ public class MetricsCollectionService( ILogger logger, GuildCache guildCache, ChannelCache channelCache, + RoleCache roleCache, UserCache userCache, EmojiCache emojiCache, IServiceProvider services @@ -44,6 +45,7 @@ public class MetricsCollectionService( CataloggerMetrics.GuildsCached.Set(guildCache.Size); CataloggerMetrics.ChannelsCached.Set(channelCache.Size); + CataloggerMetrics.RolesCached.Set(roleCache.Size); CataloggerMetrics.UsersCached.Set(userCache.Size); CataloggerMetrics.EmojiCached.Set(emojiCache.Size); CataloggerMetrics.MessagesStored.Set(messageCount); From e7eaa9f13ae37cabed0306f1784ff7fbbd0a50db Mon Sep 17 00:00:00 2001 From: sam Date: Tue, 5 Nov 2024 15:48:23 +0100 Subject: [PATCH 22/57] remove ".dirty" suffix from builds in working directories with uncommitted changes this is always true when building for linux-x64 on macOS, it seems? --- Catalogger.Backend/BuildInfo.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Catalogger.Backend/BuildInfo.cs b/Catalogger.Backend/BuildInfo.cs index 95ca05f..2c55730 100644 --- a/Catalogger.Backend/BuildInfo.cs +++ b/Catalogger.Backend/BuildInfo.cs @@ -40,7 +40,5 @@ public static class BuildInfo Version = versionData[0]; if (versionData[1] != "0" || dirty) Version += $"+{versionData[2]}"; - if (dirty) - Version += ".dirty"; } } From f0fcfd7bd35447a40858ce4b6620efc375736275 Mon Sep 17 00:00:00 2001 From: sam Date: Tue, 5 Nov 2024 16:20:24 +0100 Subject: [PATCH 23/57] feat: replace buttons in /configure-channels with select menu --- .../Bot/Commands/ChannelCommands.cs | 288 ++++++------------ .../Bot/Commands/ChannelCommandsComponents.cs | 163 ++++++---- .../Cache/InMemoryCache/UserCache.cs | 1 - .../Database/Repositories/GuildRepository.cs | 1 - 4 files changed, 186 insertions(+), 267 deletions(-) diff --git a/Catalogger.Backend/Bot/Commands/ChannelCommands.cs b/Catalogger.Backend/Bot/Commands/ChannelCommands.cs index fcf54b9..2dab68f 100644 --- a/Catalogger.Backend/Bot/Commands/ChannelCommands.cs +++ b/Catalogger.Backend/Bot/Commands/ChannelCommands.cs @@ -222,6 +222,93 @@ public class ChannelCommands( return Result.Success; } + public static IStringSelectComponent LogTypeSelect => + new StringSelectComponent( + CustomID: CustomIDHelpers.CreateSelectMenuID("select-log-type"), + MinValues: 1, + MaxValues: 1, + Options: + [ + new SelectOption( + Label: "Server changes", + Value: nameof(LogChannelType.GuildUpdate) + ), + new SelectOption( + Label: "Emoji changes", + Value: nameof(LogChannelType.GuildEmojisUpdate) + ), + new SelectOption(Label: "New roles", Value: nameof(LogChannelType.GuildRoleCreate)), + new SelectOption( + Label: "Edited roles", + Value: nameof(LogChannelType.GuildRoleUpdate) + ), + new SelectOption( + Label: "Deleted roles", + Value: nameof(LogChannelType.GuildRoleDelete) + ), + new SelectOption( + Label: "New channels", + Value: nameof(LogChannelType.ChannelCreate) + ), + new SelectOption( + Label: "Edited channels", + Value: nameof(LogChannelType.ChannelUpdate) + ), + new SelectOption( + Label: "Deleted channels", + Value: nameof(LogChannelType.ChannelDelete) + ), + new SelectOption( + Label: "Members joining", + Value: nameof(LogChannelType.GuildMemberAdd) + ), + new SelectOption( + Label: "Members leaving", + Value: nameof(LogChannelType.GuildMemberRemove) + ), + new SelectOption( + Label: "Member role changes", + Value: nameof(LogChannelType.GuildMemberUpdate) + ), + new SelectOption( + Label: "Key role changes", + Value: nameof(LogChannelType.GuildKeyRoleUpdate) + ), + new SelectOption( + Label: "Member name changes", + Value: nameof(LogChannelType.GuildMemberNickUpdate) + ), + new SelectOption( + Label: "Member avatar changes", + Value: nameof(LogChannelType.GuildMemberAvatarUpdate) + ), + new SelectOption( + Label: "Timeouts", + Value: nameof(LogChannelType.GuildMemberTimeout) + ), + new SelectOption(Label: "Kicks", Value: nameof(LogChannelType.GuildMemberKick)), + new SelectOption(Label: "Bans", Value: nameof(LogChannelType.GuildBanAdd)), + new SelectOption(Label: "Unbans", Value: nameof(LogChannelType.GuildBanRemove)), + new SelectOption(Label: "New invites", Value: nameof(LogChannelType.InviteCreate)), + new SelectOption( + Label: "Deleted invites", + Value: nameof(LogChannelType.InviteDelete) + ), + new SelectOption( + Label: "Edited messages", + Value: nameof(LogChannelType.MessageUpdate) + ), + new SelectOption( + Label: "Deleted messages", + Value: nameof(LogChannelType.MessageDelete) + ), + new SelectOption( + Label: "Bulk deleted messages", + Value: nameof(LogChannelType.MessageDeleteBulk) + ), + ] + ); + public static (List, List) BuildRootMenu( List guildChannels, IGuild guild, @@ -357,208 +444,9 @@ public class ChannelCommands( List components = [ + new ActionRowComponent([LogTypeSelect]), new ActionRowComponent( [ - new ButtonComponent( - ButtonComponentStyle.Primary, - Label: "Server changes", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - nameof(LogChannelType.GuildUpdate) - ) - ), - new ButtonComponent( - ButtonComponentStyle.Primary, - Label: "Emoji changes", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - nameof(LogChannelType.GuildEmojisUpdate) - ) - ), - new ButtonComponent( - ButtonComponentStyle.Primary, - Label: "New roles", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - nameof(LogChannelType.GuildRoleCreate) - ) - ), - new ButtonComponent( - ButtonComponentStyle.Primary, - Label: "Edited roles", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - nameof(LogChannelType.GuildRoleUpdate) - ) - ), - new ButtonComponent( - ButtonComponentStyle.Primary, - Label: "Deleted roles", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - nameof(LogChannelType.GuildRoleDelete) - ) - ), - ] - ), - new ActionRowComponent( - [ - new ButtonComponent( - ButtonComponentStyle.Primary, - Label: "New channels", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - nameof(LogChannelType.ChannelCreate) - ) - ), - new ButtonComponent( - ButtonComponentStyle.Primary, - Label: "Edited channels", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - nameof(LogChannelType.ChannelUpdate) - ) - ), - new ButtonComponent( - ButtonComponentStyle.Primary, - Label: "Deleted channels", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - nameof(LogChannelType.ChannelDelete) - ) - ), - new ButtonComponent( - ButtonComponentStyle.Primary, - Label: "Members joining", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - nameof(LogChannelType.GuildMemberAdd) - ) - ), - new ButtonComponent( - ButtonComponentStyle.Primary, - Label: "Members leaving", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - nameof(LogChannelType.GuildMemberRemove) - ) - ), - ] - ), - new ActionRowComponent( - [ - new ButtonComponent( - ButtonComponentStyle.Primary, - Label: "Member role changes", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - nameof(LogChannelType.GuildMemberUpdate) - ) - ), - new ButtonComponent( - ButtonComponentStyle.Primary, - Label: "Key role changes", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - nameof(LogChannelType.GuildKeyRoleUpdate) - ) - ), - new ButtonComponent( - ButtonComponentStyle.Primary, - Label: "Member name changes", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - nameof(LogChannelType.GuildMemberNickUpdate) - ) - ), - new ButtonComponent( - ButtonComponentStyle.Primary, - Label: "Member avatar changes", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - nameof(LogChannelType.GuildMemberAvatarUpdate) - ) - ), - new ButtonComponent( - ButtonComponentStyle.Primary, - Label: "Timeouts", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - nameof(LogChannelType.GuildMemberTimeout) - ) - ), - ] - ), - new ActionRowComponent( - [ - new ButtonComponent( - ButtonComponentStyle.Primary, - Label: "Kicks", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - nameof(LogChannelType.GuildMemberKick) - ) - ), - new ButtonComponent( - ButtonComponentStyle.Primary, - Label: "Bans", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - nameof(LogChannelType.GuildBanAdd) - ) - ), - new ButtonComponent( - ButtonComponentStyle.Primary, - Label: "Unbans", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - nameof(LogChannelType.GuildBanRemove) - ) - ), - new ButtonComponent( - ButtonComponentStyle.Primary, - Label: "New invites", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - nameof(LogChannelType.InviteCreate) - ) - ), - new ButtonComponent( - ButtonComponentStyle.Primary, - Label: "Deleted invites", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - nameof(LogChannelType.InviteDelete) - ) - ), - ] - ), - new ActionRowComponent( - [ - new ButtonComponent( - ButtonComponentStyle.Primary, - Label: "Edited messages", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - nameof(LogChannelType.MessageUpdate) - ) - ), - new ButtonComponent( - ButtonComponentStyle.Primary, - Label: "Deleted messages", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - nameof(LogChannelType.MessageDelete) - ) - ), - new ButtonComponent( - ButtonComponentStyle.Primary, - Label: "Bulk deleted messages", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - nameof(LogChannelType.MessageDeleteBulk) - ) - ), new ButtonComponent( ButtonComponentStyle.Secondary, Label: "Close", diff --git a/Catalogger.Backend/Bot/Commands/ChannelCommandsComponents.cs b/Catalogger.Backend/Bot/Commands/ChannelCommandsComponents.cs index 1bda457..b94df0d 100644 --- a/Catalogger.Backend/Bot/Commands/ChannelCommandsComponents.cs +++ b/Catalogger.Backend/Bot/Commands/ChannelCommandsComponents.cs @@ -45,6 +45,103 @@ public class ChannelCommandsComponents( { private readonly ILogger _logger = logger.ForContext(); + [SelectMenu("select-log-type")] + [SuppressInteractionResponse(true)] + public async Task OnMenuSelectionAsync(IReadOnlyList values) + { + if (contextInjection.Context is not IInteractionCommandContext ctx) + throw new CataloggerError("No context"); + if (!ctx.TryGetUserID(out var userId)) + throw new CataloggerError("No user ID in context"); + if (!ctx.Interaction.Message.TryGet(out var msg)) + throw new CataloggerError("No message ID in context"); + if (!ctx.TryGetGuildID(out var guildId)) + throw new CataloggerError("No guild ID in context"); + if (!guildCache.TryGet(guildId, out var guild)) + throw new CataloggerError("Guild not in cache"); + var guildChannels = channelCache.GuildChannels(guildId).ToList(); + var guildConfig = await guildRepository.GetAsync(guildId); + + var result = await dataService.LeaseDataAsync(msg.ID); + await using var lease = result.GetOrThrow(); + if (lease.Data.UserId != userId) + { + return (Result) + await feedbackService.ReplyAsync( + "This is not your configuration menu.", + isEphemeral: true + ); + } + + var state = values[0]; + + if (!Enum.TryParse(state, out var logChannelType)) + throw new CataloggerError($"Invalid config-channels state {state}"); + + var channelId = WebhookExecutorService.GetDefaultLogChannel(guildConfig, logChannelType); + string? channelMention; + if (channelId is 0) + channelMention = null; + else if (guildChannels.All(c => c.ID != channelId)) + channelMention = $"unknown channel {channelId}"; + else + channelMention = $"<#{channelId}>"; + + List embeds = + [ + new Embed( + Title: ChannelCommands.PrettyLogTypeName(logChannelType), + Description: channelMention == null + ? "This event is not currently logged.\nTo start logging it somewhere, select a channel below." + : $"This event is currently set to log to {channelMention}." + + "\nTo change where it is logged, select a channel below." + + "\nTo disable logging this event entirely, select \"Stop logging\" below.", + Colour: DiscordUtils.Purple + ), + ]; + + List components = + [ + new ActionRowComponent( + new[] + { + new ChannelSelectComponent( + CustomID: CustomIDHelpers.CreateSelectMenuID("config-channels"), + ChannelTypes: new[] { ChannelType.GuildText } + ), + } + ), + new ActionRowComponent( + new[] + { + new ButtonComponent( + ButtonComponentStyle.Danger, + Label: "Stop logging", + CustomID: CustomIDHelpers.CreateButtonIDWithState( + "config-channels", + "reset" + ), + IsDisabled: channelMention == null + ), + new ButtonComponent( + ButtonComponentStyle.Secondary, + Label: "Return to menu", + CustomID: CustomIDHelpers.CreateButtonIDWithState( + "config-channels", + "return" + ) + ), + } + ), + ]; + + lease.Data = new ChannelCommandData(userId, CurrentPage: state); + return await interactionApi.UpdateMessageAsync( + ctx.Interaction, + new InteractionMessageCallbackData(Embeds: embeds, Components: components) + ); + } + [Button("config-channels")] [SuppressInteractionResponse(true)] public async Task OnButtonPressedAsync(string state) @@ -176,71 +273,7 @@ public class ChannelCommandsComponents( return Result.Success; } - if (!Enum.TryParse(state, out var logChannelType)) - throw new CataloggerError($"Invalid config-channels state {state}"); - - var channelId = WebhookExecutorService.GetDefaultLogChannel(guildConfig, logChannelType); - string? channelMention; - if (channelId is 0) - channelMention = null; - else if (guildChannels.All(c => c.ID != channelId)) - channelMention = $"unknown channel {channelId}"; - else - channelMention = $"<#{channelId}>"; - - List embeds = - [ - new Embed( - Title: ChannelCommands.PrettyLogTypeName(logChannelType), - Description: channelMention == null - ? "This event is not currently logged.\nTo start logging it somewhere, select a channel below." - : $"This event is currently set to log to {channelMention}." - + "\nTo change where it is logged, select a channel below." - + "\nTo disable logging this event entirely, select \"Stop logging\" below.", - Colour: DiscordUtils.Purple - ), - ]; - - List components = - [ - new ActionRowComponent( - new[] - { - new ChannelSelectComponent( - CustomID: CustomIDHelpers.CreateSelectMenuID("config-channels"), - ChannelTypes: new[] { ChannelType.GuildText } - ), - } - ), - new ActionRowComponent( - new[] - { - new ButtonComponent( - ButtonComponentStyle.Danger, - Label: "Stop logging", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - "reset" - ), - IsDisabled: channelMention == null - ), - new ButtonComponent( - ButtonComponentStyle.Secondary, - Label: "Return to menu", - CustomID: CustomIDHelpers.CreateButtonIDWithState( - "config-channels", - "return" - ) - ), - } - ), - ]; - - lease.Data = new ChannelCommandData(userId, CurrentPage: state); - return await interactionApi.UpdateMessageAsync( - ctx.Interaction, - new InteractionMessageCallbackData(Embeds: embeds, Components: components) - ); + return Result.Success; } [SelectMenu("config-channels")] diff --git a/Catalogger.Backend/Cache/InMemoryCache/UserCache.cs b/Catalogger.Backend/Cache/InMemoryCache/UserCache.cs index d5a1313..f99856e 100644 --- a/Catalogger.Backend/Cache/InMemoryCache/UserCache.cs +++ b/Catalogger.Backend/Cache/InMemoryCache/UserCache.cs @@ -13,7 +13,6 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -using System.Diagnostics.CodeAnalysis; using Catalogger.Backend.Extensions; using LazyCache; using Remora.Discord.API.Abstractions.Objects; diff --git a/Catalogger.Backend/Database/Repositories/GuildRepository.cs b/Catalogger.Backend/Database/Repositories/GuildRepository.cs index 5c1b3f7..0cf83bf 100644 --- a/Catalogger.Backend/Database/Repositories/GuildRepository.cs +++ b/Catalogger.Backend/Database/Repositories/GuildRepository.cs @@ -15,7 +15,6 @@ using Catalogger.Backend.Database.Models; using Dapper; -using Npgsql.Replication; using Remora.Discord.API; using Remora.Rest.Core; From e6d68338db2d6737e819025661d72af02032b85f Mon Sep 17 00:00:00 2001 From: sam Date: Tue, 5 Nov 2024 22:22:12 +0100 Subject: [PATCH 24/57] feat: store timeouts in database and log them ending we have to do this because discord doesn't notify us when a timeout ends naturally, only when a moderator removes it early. --- .../Members/GuildMemberUpdateResponder.cs | 29 +++++ .../Migrations/003_store_timeouts.down.sql | 1 + .../Migrations/003_store_timeouts.up.sql | 9 ++ .../Database/Models/DiscordTimeout.cs | 12 ++ .../Repositories/TimeoutRepository.cs | 72 +++++++++++ .../Extensions/StartupExtensions.cs | 8 +- Catalogger.Backend/Services/TimeoutService.cs | 119 ++++++++++++++++++ 7 files changed, 249 insertions(+), 1 deletion(-) create mode 100644 Catalogger.Backend/Database/Migrations/003_store_timeouts.down.sql create mode 100644 Catalogger.Backend/Database/Migrations/003_store_timeouts.up.sql create mode 100644 Catalogger.Backend/Database/Models/DiscordTimeout.cs create mode 100644 Catalogger.Backend/Database/Repositories/TimeoutRepository.cs create mode 100644 Catalogger.Backend/Services/TimeoutService.cs diff --git a/Catalogger.Backend/Bot/Responders/Members/GuildMemberUpdateResponder.cs b/Catalogger.Backend/Bot/Responders/Members/GuildMemberUpdateResponder.cs index 2440b83..6cdfe86 100644 --- a/Catalogger.Backend/Bot/Responders/Members/GuildMemberUpdateResponder.cs +++ b/Catalogger.Backend/Bot/Responders/Members/GuildMemberUpdateResponder.cs @@ -15,9 +15,11 @@ using Catalogger.Backend.Cache; using Catalogger.Backend.Cache.InMemoryCache; +using Catalogger.Backend.Database.Models; using Catalogger.Backend.Database.Repositories; using Catalogger.Backend.Extensions; using Catalogger.Backend.Services; +using NodaTime.Extensions; using Remora.Discord.API.Abstractions.Gateway.Events; using Remora.Discord.API.Abstractions.Objects; using Remora.Discord.Extensions.Embeds; @@ -30,6 +32,8 @@ namespace Catalogger.Backend.Bot.Responders.Members; public class GuildMemberUpdateResponder( ILogger logger, GuildRepository guildRepository, + TimeoutRepository timeoutRepository, + TimeoutService timeoutService, UserCache userCache, RoleCache roleCache, IMemberCache memberCache, @@ -245,11 +249,15 @@ public class GuildMemberUpdateResponder( var moderator = await userCache.TryFormatUserAsync(actionData.ModeratorId); embed.AddField("Responsible moderator", moderator); embed.AddField("Reason", actionData.Reason ?? "No reason given"); + + await UpdateTimeoutDatabaseAsync(member, actionData.ModeratorId); } else { embed.AddField("Responsible moderator", "*(unknown)*"); embed.AddField("Reason", "*(unknown)*"); + + await UpdateTimeoutDatabaseAsync(member, null); } var guildConfig = await guildRepository.GetAsync(member.GuildID); @@ -261,6 +269,27 @@ public class GuildMemberUpdateResponder( return Result.Success; } + private async Task UpdateTimeoutDatabaseAsync(IGuildMemberUpdate member, Snowflake? moderatorId) + { + var until = member.CommunicationDisabledUntil.OrDefault(); + if (until == null) + { + // timeout was ended early, delete database entry + var oldTimeout = await timeoutRepository.RemoveAsync(member.GuildID, member.User.ID); + if (oldTimeout != null) + timeoutService.RemoveTimer(oldTimeout.Id); + return; + } + + var dbTimeout = await timeoutRepository.SetAsync( + member.GuildID, + member.User.ID, + until.Value.ToInstant(), + moderatorId + ); + timeoutService.AddTimer(dbTimeout); + } + private async Task HandleRoleUpdateAsync( IGuildMemberUpdate member, IReadOnlyList oldRoles, diff --git a/Catalogger.Backend/Database/Migrations/003_store_timeouts.down.sql b/Catalogger.Backend/Database/Migrations/003_store_timeouts.down.sql new file mode 100644 index 0000000..d5f53c0 --- /dev/null +++ b/Catalogger.Backend/Database/Migrations/003_store_timeouts.down.sql @@ -0,0 +1 @@ +drop table timeouts; \ No newline at end of file diff --git a/Catalogger.Backend/Database/Migrations/003_store_timeouts.up.sql b/Catalogger.Backend/Database/Migrations/003_store_timeouts.up.sql new file mode 100644 index 0000000..41b4dd5 --- /dev/null +++ b/Catalogger.Backend/Database/Migrations/003_store_timeouts.up.sql @@ -0,0 +1,9 @@ +create table timeouts ( + id integer generated by default as identity primary key, + user_id bigint not null, + guild_id bigint not null, + moderator_id bigint, + until timestamptz not null +); + +create unique index ix_timeouts_user_guild on timeouts (user_id, guild_id); diff --git a/Catalogger.Backend/Database/Models/DiscordTimeout.cs b/Catalogger.Backend/Database/Models/DiscordTimeout.cs new file mode 100644 index 0000000..21ed5c5 --- /dev/null +++ b/Catalogger.Backend/Database/Models/DiscordTimeout.cs @@ -0,0 +1,12 @@ +using NodaTime; + +namespace Catalogger.Backend.Database.Models; + +public class DiscordTimeout +{ + public int Id { get; init; } + public ulong UserId { get; init; } + public ulong GuildId { get; init; } + public ulong? ModeratorId { get; init; } + public Instant Until { get; init; } +} diff --git a/Catalogger.Backend/Database/Repositories/TimeoutRepository.cs b/Catalogger.Backend/Database/Repositories/TimeoutRepository.cs new file mode 100644 index 0000000..c9c7ec5 --- /dev/null +++ b/Catalogger.Backend/Database/Repositories/TimeoutRepository.cs @@ -0,0 +1,72 @@ +using Catalogger.Backend.Database.Models; +using Dapper; +using NodaTime; +using Remora.Rest.Core; + +namespace Catalogger.Backend.Database.Repositories; + +public class TimeoutRepository(DatabaseConnection conn) : IDisposable, IAsyncDisposable +{ + public async Task GetAsync(int id) => + await conn.QueryFirstOrDefaultAsync( + "select * from timeouts where id = @id", + new { id } + ); + + public async Task GetAsync(Snowflake guildId, Snowflake userId) => + await conn.QueryFirstOrDefaultAsync( + "select * from timeouts where guild_id = @GuildId and user_id = @UserId", + new { GuildId = guildId.Value, UserId = userId.Value } + ); + + public async Task> GetAllAsync() => + (await conn.QueryAsync("select * from timeouts order by id")).ToList(); + + public async Task SetAsync( + Snowflake guildId, + Snowflake userId, + Instant until, + Snowflake? moderatorId + ) => + await conn.QueryFirstAsync( + """ + insert into timeouts (user_id, guild_id, moderator_id, until) + values (@UserId, @GuildId, @ModeratorId, @Until) + on conflict (user_id, guild_id) do update + set moderator_id = @ModeratorId, + until = @Until + returning * + """, + new + { + UserId = userId.Value, + GuildId = guildId.Value, + ModeratorId = moderatorId?.Value, + Until = until, + } + ); + + public async Task RemoveAsync(int id) => + await conn.QueryFirstOrDefaultAsync( + "delete from timeouts where id = @id returning *", + new { id } + ); + + public async Task RemoveAsync(Snowflake guildId, Snowflake userId) => + await conn.QueryFirstOrDefaultAsync( + "delete from timeouts where guild_id = @GuildId and user_id = @UserId returning *", + new { GuildId = guildId.Value, UserId = userId.Value } + ); + + public void Dispose() + { + conn.Dispose(); + GC.SuppressFinalize(this); + } + + public async ValueTask DisposeAsync() + { + await conn.DisposeAsync(); + GC.SuppressFinalize(this); + } +} diff --git a/Catalogger.Backend/Extensions/StartupExtensions.cs b/Catalogger.Backend/Extensions/StartupExtensions.cs index a84e232..aef61b0 100644 --- a/Catalogger.Backend/Extensions/StartupExtensions.cs +++ b/Catalogger.Backend/Extensions/StartupExtensions.cs @@ -108,6 +108,7 @@ public static class StartupExtensions .AddScoped() .AddScoped() .AddScoped() + .AddScoped() .AddSingleton() .AddSingleton() .AddSingleton() @@ -117,12 +118,13 @@ public static class StartupExtensions .AddSingleton() .AddSingleton() .AddScoped() + .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton(InMemoryDataService.Instance) - .AddSingleton() .AddTransient() + .AddSingleton() // Background services // GuildFetchService is added as a separate singleton as it's also injected into other services. .AddHostedService(serviceProvider => @@ -207,6 +209,7 @@ public static class StartupExtensions var config = scope.ServiceProvider.GetRequiredService(); var slashService = scope.ServiceProvider.GetRequiredService(); + var timeoutService = scope.ServiceProvider.GetRequiredService(); if (config.Discord.TestMode) logger.Warning( @@ -249,6 +252,9 @@ public static class StartupExtensions logger.Information( "Not syncing slash commands, Discord.SyncCommands is false or unset" ); + + // Initialize the timeout service by loading all the timeouts currently in the database. + await timeoutService.InitializeAsync(); } public static void MaybeAddDashboard(this WebApplication app) diff --git a/Catalogger.Backend/Services/TimeoutService.cs b/Catalogger.Backend/Services/TimeoutService.cs new file mode 100644 index 0000000..6615f43 --- /dev/null +++ b/Catalogger.Backend/Services/TimeoutService.cs @@ -0,0 +1,119 @@ +using System.Collections.Concurrent; +using Catalogger.Backend.Bot; +using Catalogger.Backend.Cache.InMemoryCache; +using Catalogger.Backend.Database.Models; +using Catalogger.Backend.Database.Repositories; +using Catalogger.Backend.Extensions; +using Remora.Discord.API; +using Remora.Discord.Extensions.Embeds; +using Remora.Rest.Core; + +namespace Catalogger.Backend.Services; + +public class TimeoutService( + IServiceProvider serviceProvider, + ILogger logger, + WebhookExecutorService webhookExecutor, + UserCache userCache +) +{ + private readonly ILogger _logger = logger.ForContext(); + private readonly ConcurrentDictionary _timers = new(); + + public async Task InitializeAsync() + { + _logger.Information("Populating timeout service with existing database timeouts"); + + await using var scope = serviceProvider.CreateAsyncScope(); + var timeoutRepository = scope.ServiceProvider.GetRequiredService(); + + var timeouts = await timeoutRepository.GetAllAsync(); + foreach (var timeout in timeouts) + AddTimer(timeout); + } + + public void AddTimer(DiscordTimeout timeout) + { + _logger.Debug("Adding timeout {TimeoutId} to queue", timeout.Id); + + RemoveTimer(timeout.Id); + _timers[timeout.Id] = new Timer( + _ => + { + var __ = SendTimeoutLogAsync(timeout.Id); + }, + null, + timeout.Until.ToDateTimeOffset() - DateTimeOffset.UtcNow, + Timeout.InfiniteTimeSpan + ); + } + + private async Task SendTimeoutLogAsync(int timeoutId) + { + _logger.Information("Sending timeout log for {TimeoutId}", timeoutId); + + await using var scope = serviceProvider.CreateAsyncScope(); + var guildRepository = scope.ServiceProvider.GetRequiredService(); + var timeoutRepository = scope.ServiceProvider.GetRequiredService(); + + var timeout = await timeoutRepository.RemoveAsync(timeoutId); + if (timeout == null) + { + _logger.Warning("Timeout {TimeoutId} not found, can't log anything", timeoutId); + return; + } + + var userId = DiscordSnowflake.New(timeout.UserId); + var moderatorId = + timeout.ModeratorId != null + ? DiscordSnowflake.New(timeout.ModeratorId.Value) + : (Snowflake?)null; + + var user = await userCache.GetUserAsync(userId); + if (user == null) + { + _logger.Warning("Could not get user {UserId} from cache, can't log timeout", userId); + return; + } + + var embed = new EmbedBuilder() + .WithAuthor(user.Tag(), null, user.AvatarUrl()) + .WithTitle("Member timeout ended") + .WithDescription($"<@{user.ID}>") + .WithColour(DiscordUtils.Green) + .WithFooter($"User ID: {user.ID}") + .WithCurrentTimestamp(); + + if (moderatorId != null) + { + var moderator = await userCache.TryFormatUserAsync(moderatorId.Value); + embed.AddField("Originally timed out by", moderator); + } + else + { + embed.AddField("Originally timed out by", "*(unknown)*"); + } + + try + { + var guildConfig = await guildRepository.GetAsync(DiscordSnowflake.New(timeout.GuildId)); + webhookExecutor.QueueLog( + guildConfig, + LogChannelType.GuildMemberTimeout, + embed.Build().GetOrThrow() + ); + } + catch (Exception e) + { + _logger.Error(e, "Could not log timeout {TimeoutId} expiring", timeout.Id); + } + } + + public void RemoveTimer(int timeoutId) + { + if (!_timers.TryRemove(timeoutId, out var timer)) + return; + _logger.Debug("Removing timeout {TimeoutId} from queue", timeoutId); + timer.Dispose(); + } +} From db5d7bb4f86c2248273619af9c8b766917f590b7 Mon Sep 17 00:00:00 2001 From: sam Date: Fri, 8 Nov 2024 17:12:00 +0100 Subject: [PATCH 25/57] feat: import/export settings, send backup of settings when leaving guild --- .../Api/GuildsController.Backup.cs | 117 ++++++++++++++++++ .../Api/GuildsController.Remove.cs | 23 +++- Catalogger.Backend/Api/GuildsController.cs | 2 + Catalogger.Backend/Cache/IWebhookCache.cs | 1 + .../InMemoryCache/InMemoryWebhookCache.cs | 7 ++ .../Cache/RedisCache/RedisWebhookCache.cs | 3 + .../Database/Redis/RedisService.cs | 3 + .../Database/Repositories/GuildRepository.cs | 17 +++ .../Database/Repositories/InviteRepository.cs | 28 +++++ .../Repositories/WatchlistRepository.cs | 33 +++++ Catalogger.Backend/JsonUtils.cs | 27 ++++ Catalogger.Backend/Program.cs | 3 + .../Services/PluralkitApiService.cs | 17 +-- Catalogger.Frontend/package.json | 4 +- .../src/routes/dash/[guildId]/+layout.svelte | 6 + .../routes/dash/[guildId]/delete/+page.svelte | 47 ++++--- .../routes/dash/[guildId]/import/+page.svelte | 83 +++++++++++++ Catalogger.Frontend/yarn.lock | 10 ++ 18 files changed, 392 insertions(+), 39 deletions(-) create mode 100644 Catalogger.Backend/Api/GuildsController.Backup.cs create mode 100644 Catalogger.Backend/JsonUtils.cs create mode 100644 Catalogger.Frontend/src/routes/dash/[guildId]/import/+page.svelte diff --git a/Catalogger.Backend/Api/GuildsController.Backup.cs b/Catalogger.Backend/Api/GuildsController.Backup.cs new file mode 100644 index 0000000..2c04fc4 --- /dev/null +++ b/Catalogger.Backend/Api/GuildsController.Backup.cs @@ -0,0 +1,117 @@ +// Copyright (C) 2021-present sam (starshines.gay) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +using System.Net; +using Catalogger.Backend.Api.Middleware; +using Catalogger.Backend.Database.Models; +using Microsoft.AspNetCore.Mvc; +using NodaTime; +using Remora.Discord.API; + +namespace Catalogger.Backend.Api; + +public partial class GuildsController +{ + [Authorize] + [HttpGet("config")] + public async Task ExportConfigAsync(string id) + { + var (guildId, _) = await ParseGuildAsync(id); + var guildConfig = await guildRepository.GetAsync(guildId); + + return Ok(await ToExport(guildConfig)); + } + + [Authorize] + [HttpPost("config")] + public async Task ImportConfigAsync( + string id, + [FromBody] GuildConfigExport export + ) + { + var (guildId, _) = await ParseGuildAsync(id); + if (export.Id != guildId.Value) + throw new ApiError( + HttpStatusCode.BadRequest, + ErrorCode.BadRequest, + "This backup is not from this server." + ); + + // Filter invites to *only* those that exist for this guild. + // Blame past me for not making (code, guild_id) a unique index >:| + var cachedInvites = (await inviteCache.TryGetAsync(guildId)).ToList(); + var invites = export.Invites.Where(i => cachedInvites.Any(ci => i.Code == ci.Code)); + + await guildRepository.ImportConfigAsync( + guildId.Value, + export.Channels, + export.BannedSystems, + export.KeyRoles + ); + + await inviteRepository.ImportInvitesAsync( + guildId, + invites.Select(i => new Invite + { + Code = i.Code, + Name = i.Name, + GuildId = guildId.Value, + }) + ); + + await watchlistRepository.ImportWatchlistAsync( + guildId, + export.Watchlist.Select(w => new Watchlist + { + GuildId = guildId.Value, + UserId = w.UserId, + ModeratorId = w.ModeratorId, + AddedAt = w.AddedAt, + Reason = w.Reason, + }) + ); + + return NoContent(); + } + + private async Task ToExport(Database.Models.Guild config) + { + var id = DiscordSnowflake.New(config.Id); + var invites = await inviteRepository.GetGuildInvitesAsync(id); + var watchlist = await watchlistRepository.GetGuildWatchlistAsync(id); + + return new GuildConfigExport( + config.Id, + config.Channels, + config.BannedSystems, + config.KeyRoles, + invites.Select(i => new InviteExport(i.Code, i.Name)), + watchlist.Select(w => new WatchlistExport(w.UserId, w.AddedAt, w.ModeratorId, w.Reason)) + ); + } + + public record GuildConfigExport( + ulong Id, + Database.Models.Guild.ChannelConfig Channels, + string[] BannedSystems, + ulong[] KeyRoles, + IEnumerable Invites, + IEnumerable Watchlist + ); + + public record InviteExport(string Code, string Name); + + public record WatchlistExport(ulong UserId, Instant AddedAt, ulong ModeratorId, string Reason); +} diff --git a/Catalogger.Backend/Api/GuildsController.Remove.cs b/Catalogger.Backend/Api/GuildsController.Remove.cs index 2d2ff5e..b877d6a 100644 --- a/Catalogger.Backend/Api/GuildsController.Remove.cs +++ b/Catalogger.Backend/Api/GuildsController.Remove.cs @@ -14,12 +14,15 @@ // along with this program. If not, see . using System.Net; +using System.Text; +using System.Text.Json; using Catalogger.Backend.Api.Middleware; using Catalogger.Backend.Bot; using Catalogger.Backend.Extensions; using Catalogger.Backend.Services; using Dapper; using Microsoft.AspNetCore.Mvc; +using Remora.Discord.API.Abstractions.Rest; using Remora.Discord.Extensions.Embeds; namespace Catalogger.Backend.Api; @@ -40,6 +43,8 @@ public partial class GuildsController } var guildConfig = await guildRepository.GetAsync(guildId); + var export = await ToExport(guildConfig); + var logChannelId = webhookExecutor.GetLogChannel(guildConfig, LogChannelType.GuildUpdate) ?? webhookExecutor.GetLogChannel(guildConfig, LogChannelType.GuildMemberRemove); @@ -50,15 +55,25 @@ public partial class GuildsController var embed = new EmbedBuilder() .WithTitle("Catalogger is leaving this server") .WithDescription( - $"A moderator in this server ({currentUser.Tag}, <@{currentUser.Id}>) requested that Catalogger leave. " - + "All data related to this server will be deleted." + $""" + A moderator in this server ({currentUser.Tag}, <@{currentUser.Id}>) requested that Catalogger leave. + All data related to this server will be deleted. + + A backup of this server's configuration is attached to this message, + in case you want to use the bot again later. + """ ) .WithColour(DiscordUtils.Red) .WithCurrentTimestamp() .Build() .GetOrThrow(); - await webhookExecutor.SendLogAsync(logChannelId.Value, [embed], []); + var exportData = JsonSerializer.Serialize(export, JsonUtils.ApiJsonOptions); + var file = new FileData( + "config-backup.json", + new MemoryStream(Encoding.UTF8.GetBytes(exportData)) + ); + await webhookExecutor.SendLogAsync(logChannelId.Value, [embed], [file]); } else { @@ -125,7 +140,7 @@ public partial class GuildsController _logger.Information("Left guild {GuildId} and removed all data for it", guildId); - return NoContent(); + return Ok(export); } public record LeaveGuildRequest(string Name); diff --git a/Catalogger.Backend/Api/GuildsController.cs b/Catalogger.Backend/Api/GuildsController.cs index 4289bee..e2445e1 100644 --- a/Catalogger.Backend/Api/GuildsController.cs +++ b/Catalogger.Backend/Api/GuildsController.cs @@ -34,6 +34,8 @@ public partial class GuildsController( ILogger logger, DatabaseConnection dbConn, GuildRepository guildRepository, + InviteRepository inviteRepository, + WatchlistRepository watchlistRepository, GuildCache guildCache, EmojiCache emojiCache, ChannelCache channelCache, diff --git a/Catalogger.Backend/Cache/IWebhookCache.cs b/Catalogger.Backend/Cache/IWebhookCache.cs index 4267260..69a256a 100644 --- a/Catalogger.Backend/Cache/IWebhookCache.cs +++ b/Catalogger.Backend/Cache/IWebhookCache.cs @@ -24,6 +24,7 @@ public interface IWebhookCache { Task GetWebhookAsync(ulong channelId); Task SetWebhookAsync(ulong channelId, Webhook webhook); + Task RemoveWebhooksAsync(ulong[] channelIds); public async Task GetOrFetchWebhookAsync( ulong channelId, diff --git a/Catalogger.Backend/Cache/InMemoryCache/InMemoryWebhookCache.cs b/Catalogger.Backend/Cache/InMemoryCache/InMemoryWebhookCache.cs index b4f1a2f..3a6208b 100644 --- a/Catalogger.Backend/Cache/InMemoryCache/InMemoryWebhookCache.cs +++ b/Catalogger.Backend/Cache/InMemoryCache/InMemoryWebhookCache.cs @@ -33,4 +33,11 @@ public class InMemoryWebhookCache : IWebhookCache _cache[channelId] = webhook; return Task.CompletedTask; } + + public Task RemoveWebhooksAsync(ulong[] channelIds) + { + foreach (var id in channelIds) + _cache.TryRemove(id, out _); + return Task.CompletedTask; + } } diff --git a/Catalogger.Backend/Cache/RedisCache/RedisWebhookCache.cs b/Catalogger.Backend/Cache/RedisCache/RedisWebhookCache.cs index 9c07f62..0e2962c 100644 --- a/Catalogger.Backend/Cache/RedisCache/RedisWebhookCache.cs +++ b/Catalogger.Backend/Cache/RedisCache/RedisWebhookCache.cs @@ -26,5 +26,8 @@ public class RedisWebhookCache(RedisService redisService) : IWebhookCache public async Task SetWebhookAsync(ulong channelId, Webhook webhook) => await redisService.SetAsync(WebhookKey(channelId), webhook, 24.Hours()); + public async Task RemoveWebhooksAsync(ulong[] channelIds) => + await redisService.DeleteAsync(channelIds.Select(WebhookKey).ToArray()); + private static string WebhookKey(ulong channelId) => $"webhook:{channelId}"; } diff --git a/Catalogger.Backend/Database/Redis/RedisService.cs b/Catalogger.Backend/Database/Redis/RedisService.cs index 1ed24af..f493a4a 100644 --- a/Catalogger.Backend/Database/Redis/RedisService.cs +++ b/Catalogger.Backend/Database/Redis/RedisService.cs @@ -44,6 +44,9 @@ public class RedisService(Config config) await GetDatabase().StringSetAsync(key, json, expiry); } + public async Task DeleteAsync(string[] keys) => + await GetDatabase().KeyDeleteAsync(keys.Select(k => new RedisKey(k)).ToArray()); + public async Task GetAsync(string key) { var value = await GetDatabase().StringGetAsync(key); diff --git a/Catalogger.Backend/Database/Repositories/GuildRepository.cs b/Catalogger.Backend/Database/Repositories/GuildRepository.cs index 0cf83bf..2a95403 100644 --- a/Catalogger.Backend/Database/Repositories/GuildRepository.cs +++ b/Catalogger.Backend/Database/Repositories/GuildRepository.cs @@ -137,6 +137,23 @@ public class GuildRepository(ILogger logger, DatabaseConnection conn) new { Id = id.Value, Channels = config } ); + public async Task ImportConfigAsync( + ulong id, + Guild.ChannelConfig channels, + string[] bannedSystems, + ulong[] keyRoles + ) => + await conn.ExecuteAsync( + "update guilds set channels = @channels::jsonb, banned_systems = @bannedSystems, key_roles = @keyRoles where id = @id", + new + { + id, + channels, + bannedSystems, + keyRoles, + } + ); + public void Dispose() { conn.Dispose(); diff --git a/Catalogger.Backend/Database/Repositories/InviteRepository.cs b/Catalogger.Backend/Database/Repositories/InviteRepository.cs index da88e6a..914588f 100644 --- a/Catalogger.Backend/Database/Repositories/InviteRepository.cs +++ b/Catalogger.Backend/Database/Repositories/InviteRepository.cs @@ -65,6 +65,34 @@ public class InviteRepository(ILogger logger, DatabaseConnection conn) new { GuildId = guildId.Value, Code = code } ); + /// + /// Bulk imports an array of invite codes and names. + /// The GuildId property in the Invite object is ignored. + /// + public async Task ImportInvitesAsync(Snowflake guildId, IEnumerable invites) + { + await using var tx = await conn.BeginTransactionAsync(); + foreach (var invite in invites) + { + await conn.ExecuteAsync( + """ + insert into invites (code, guild_id, name) + values (@Code, @GuildId, @Name) on conflict (code) + do update set name = @Name + """, + new + { + GuildId = guildId.Value, + invite.Code, + invite.Name, + }, + transaction: tx + ); + } + + await tx.CommitAsync(); + } + public void Dispose() { conn.Dispose(); diff --git a/Catalogger.Backend/Database/Repositories/WatchlistRepository.cs b/Catalogger.Backend/Database/Repositories/WatchlistRepository.cs index ce6bacd..653fd85 100644 --- a/Catalogger.Backend/Database/Repositories/WatchlistRepository.cs +++ b/Catalogger.Backend/Database/Repositories/WatchlistRepository.cs @@ -70,6 +70,39 @@ public class WatchlistRepository(ILogger logger, DatabaseConnection conn) ) ) != 0; + /// + /// Bulk imports an array of watchlist entries. + /// The GuildId property in the Watchlist object is ignored. + /// + public async Task ImportWatchlistAsync(Snowflake guildId, IEnumerable watchlist) + { + await using var tx = await conn.BeginTransactionAsync(); + foreach (var entry in watchlist) + { + await conn.ExecuteAsync( + """ + insert into watchlists (guild_id, user_id, added_at, moderator_id, reason) + values (@GuildId, @UserId, @AddedAt, @ModeratorId, @Reason) + on conflict (guild_id, user_id) do update + set added_at = @AddedAt, + moderator_id = @ModeratorId, + reason = @Reason + """, + new + { + GuildId = guildId.Value, + entry.UserId, + entry.AddedAt, + entry.ModeratorId, + entry.Reason, + }, + transaction: tx + ); + } + + await tx.CommitAsync(); + } + public void Dispose() { conn.Dispose(); diff --git a/Catalogger.Backend/JsonUtils.cs b/Catalogger.Backend/JsonUtils.cs new file mode 100644 index 0000000..4fa9a94 --- /dev/null +++ b/Catalogger.Backend/JsonUtils.cs @@ -0,0 +1,27 @@ +using System.Text.Json; +using System.Text.Json.Serialization; +using NodaTime; +using NodaTime.Serialization.SystemTextJson; +using NodaTime.Text; + +namespace Catalogger.Backend; + +public static class JsonUtils +{ + public static readonly NodaJsonSettings NodaTimeSettings = new NodaJsonSettings + { + InstantConverter = new NodaPatternConverter(InstantPattern.ExtendedIso), + }; + + public static readonly JsonSerializerOptions BaseJsonOptions = new JsonSerializerOptions + { + NumberHandling = JsonNumberHandling.AllowReadingFromString, + }.ConfigureForNodaTime(NodaTimeSettings); + + public static readonly JsonSerializerOptions ApiJsonOptions = new JsonSerializerOptions + { + NumberHandling = + JsonNumberHandling.WriteAsString | JsonNumberHandling.AllowReadingFromString, + PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower, + }.ConfigureForNodaTime(NodaTimeSettings); +} diff --git a/Catalogger.Backend/Program.cs b/Catalogger.Backend/Program.cs index 45d9904..ed9292a 100644 --- a/Catalogger.Backend/Program.cs +++ b/Catalogger.Backend/Program.cs @@ -15,9 +15,11 @@ using System.Text.Json; using System.Text.Json.Serialization; +using Catalogger.Backend; using Catalogger.Backend.Bot.Commands; using Catalogger.Backend.Extensions; using Catalogger.Backend.Services; +using NodaTime.Serialization.SystemTextJson; using Prometheus; using Remora.Commands.Extensions; using Remora.Discord.API.Abstractions.Gateway.Commands; @@ -45,6 +47,7 @@ builder options.JsonSerializerOptions.IncludeFields = true; options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.WriteAsString | JsonNumberHandling.AllowReadingFromString; + options.JsonSerializerOptions.ConfigureForNodaTime(JsonUtils.NodaTimeSettings); }); builder diff --git a/Catalogger.Backend/Services/PluralkitApiService.cs b/Catalogger.Backend/Services/PluralkitApiService.cs index 113374d..283200c 100644 --- a/Catalogger.Backend/Services/PluralkitApiService.cs +++ b/Catalogger.Backend/Services/PluralkitApiService.cs @@ -14,13 +14,9 @@ // along with this program. If not, see . using System.Net; -using System.Text.Json; -using System.Text.Json.Serialization; using System.Threading.RateLimiting; using Humanizer; using NodaTime; -using NodaTime.Serialization.SystemTextJson; -using NodaTime.Text; using Polly; namespace Catalogger.Backend.Services; @@ -32,17 +28,6 @@ public class PluralkitApiService(ILogger logger) private readonly HttpClient _client = new(); private readonly ILogger _logger = logger.ForContext(); - private readonly JsonSerializerOptions _jsonOptions = new JsonSerializerOptions - { - PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower, - NumberHandling = JsonNumberHandling.AllowReadingFromString, - }.ConfigureForNodaTime( - new NodaJsonSettings - { - InstantConverter = new NodaPatternConverter(InstantPattern.ExtendedIso), - } - ); - private readonly ResiliencePipeline _pipeline = new ResiliencePipelineBuilder() .AddRateLimiter( new FixedWindowRateLimiter( @@ -86,7 +71,7 @@ public class PluralkitApiService(ILogger logger) throw new CataloggerError("Non-200 status code from PluralKit API"); } - return await resp.Content.ReadFromJsonAsync(_jsonOptions, ct) + return await resp.Content.ReadFromJsonAsync(JsonUtils.ApiJsonOptions, ct) ?? throw new CataloggerError("JSON response from PluralKit API was null"); } diff --git a/Catalogger.Frontend/package.json b/Catalogger.Frontend/package.json index 1df9362..b36d8cd 100644 --- a/Catalogger.Frontend/package.json +++ b/Catalogger.Frontend/package.json @@ -17,11 +17,13 @@ "@sveltejs/vite-plugin-svelte": "^3.0.0", "@sveltestrap/sveltestrap": "^6.2.7", "@types/eslint": "^9.6.0", + "@types/file-saver": "^2.0.7", "@types/luxon": "^3.4.2", "bootstrap": "^5.3.3", "eslint": "^9.0.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-svelte": "^2.36.0", + "file-saver": "^2.0.5", "globals": "^15.0.0", "luxon": "^3.5.0", "marked": "^14.1.3", @@ -38,4 +40,4 @@ "vite-plugin-markdown": "^2.2.0" }, "type": "module" -} \ No newline at end of file +} diff --git a/Catalogger.Frontend/src/routes/dash/[guildId]/+layout.svelte b/Catalogger.Frontend/src/routes/dash/[guildId]/+layout.svelte index 6bdb009..6ec80b5 100644 --- a/Catalogger.Frontend/src/routes/dash/[guildId]/+layout.svelte +++ b/Catalogger.Frontend/src/routes/dash/[guildId]/+layout.svelte @@ -68,6 +68,12 @@ > Key roles + + Import/export settings + - import { Alert, Button, Input, InputGroup } from "@sveltestrap/sveltestrap"; + import { Button, Input, InputGroup } from "@sveltestrap/sveltestrap"; import type { PageData } from "./$types"; - import { fastFetch, type ApiError } from "$lib/api"; + import apiFetch, { type ApiError } from "$lib/api"; import { addToast } from "$lib/toast"; import { goto } from "$app/navigation"; + import { saveAs } from "file-saver"; export let data: PageData; @@ -11,9 +12,16 @@ const deleteData = async () => { try { - await fastFetch("POST", `/api/guilds/${data.guild.id}/leave`, { - name: guildName, - }); + const backup = await apiFetch( + "POST", + `/api/guilds/${data.guild.id}/leave`, + { + name: guildName, + }, + ); + + downloadBackup(backup); + addToast({ header: "Left server", body: `Successfully left ${data.guild.name} and deleted all data related to it.`, @@ -27,28 +35,31 @@ }); } }; + + const downloadBackup = (data: any) => { + const backup = JSON.stringify(data); + const blob = new Blob([backup], { type: "text/plain;charset=utf-8" }); + saveAs(blob, "server-backup.json"); + };

Delete this server's data

To make Catalogger leave your server and delete all data from your server, - fill its name in below and press "Delete". + fill its name ({data.guild.name}) in below and press + "Delete".
- - This is irreversible. If you change your mind later, your data cannot be - restored. - -
- If you just want to make Catalogger leave your server but not delete data, simply - kick it via Discord. + You will get a backup of your server's settings which you can restore later if + you change your mind.

- -

This is irreversible!

- - We cannot help you recover data deleted in this way. -
+

+ + Message data is not backed up. If you change your mind, we cannot restore it + for you. + +

diff --git a/Catalogger.Frontend/src/routes/dash/[guildId]/import/+page.svelte b/Catalogger.Frontend/src/routes/dash/[guildId]/import/+page.svelte new file mode 100644 index 0000000..7a8fccb --- /dev/null +++ b/Catalogger.Frontend/src/routes/dash/[guildId]/import/+page.svelte @@ -0,0 +1,83 @@ + + +

Import and export settings

+ +

+ You can create a backup of your server's configuration here. If you removed + the bot from your server before, you can import the backup you got then here + too. +

+ +

+ +

+ + + + + diff --git a/Catalogger.Frontend/yarn.lock b/Catalogger.Frontend/yarn.lock index 121c9a0..0111c04 100644 --- a/Catalogger.Frontend/yarn.lock +++ b/Catalogger.Frontend/yarn.lock @@ -500,6 +500,11 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== +"@types/file-saver@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@types/file-saver/-/file-saver-2.0.7.tgz#8dbb2f24bdc7486c54aa854eb414940bbd056f7d" + integrity sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A== + "@types/json-schema@*", "@types/json-schema@^7.0.15": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" @@ -1048,6 +1053,11 @@ file-entry-cache@^8.0.0: dependencies: flat-cache "^4.0.0" +file-saver@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" + integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== + fill-range@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" From 2deac26fc8527cda47d11dfa910b4553215a4ebd Mon Sep 17 00:00:00 2001 From: sam Date: Fri, 8 Nov 2024 19:27:39 +0100 Subject: [PATCH 26/57] chore: clean up unused code --- Catalogger.Backend/Api/ApiCache.cs | 34 +----------------------------- 1 file changed, 1 insertion(+), 33 deletions(-) diff --git a/Catalogger.Backend/Api/ApiCache.cs b/Catalogger.Backend/Api/ApiCache.cs index b790643..c4161ad 100644 --- a/Catalogger.Backend/Api/ApiCache.cs +++ b/Catalogger.Backend/Api/ApiCache.cs @@ -14,43 +14,11 @@ // along with this program. If not, see . using Catalogger.Backend.Database.Redis; -using Remora.Discord.API; -using Remora.Discord.API.Abstractions.Objects; -using Remora.Discord.API.Abstractions.Rest; namespace Catalogger.Backend.Api; -public class ApiCache(RedisService redisService, IDiscordRestChannelAPI channelApi, Config config) +public class ApiCache(RedisService redisService) { - private List? _news; - private readonly SemaphoreSlim _newsSemaphore = new(1); - - public async Task> GetNewsAsync() - { - await _newsSemaphore.WaitAsync(); - try - { - if (_news != null) - return _news; - - if (config.Web.NewsChannel == null) - return []; - - var res = await channelApi.GetChannelMessagesAsync( - DiscordSnowflake.New(config.Web.NewsChannel.Value), - limit: 5 - ); - if (res.IsSuccess) - return _news = res.Entity.ToList(); - - return []; - } - finally - { - _newsSemaphore.Release(); - } - } - private static string UserKey(string id) => $"api-user:{id}"; private static string GuildsKey(string userId) => $"api-user-guilds:{userId}"; From 492283b9c1a6eee85ef727f78398e093fe3ad6a6 Mon Sep 17 00:00:00 2001 From: sam Date: Fri, 8 Nov 2024 19:39:36 +0100 Subject: [PATCH 27/57] feat: clean webhook cache upon leaving guild --- .../Api/GuildsController.Remove.cs | 8 ----- Catalogger.Backend/Api/GuildsController.cs | 2 -- .../Responders/Guilds/GuildCreateResponder.cs | 5 ++++ Catalogger.Backend/Database/Models/Guild.cs | 30 +++++++++++++++++++ 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/Catalogger.Backend/Api/GuildsController.Remove.cs b/Catalogger.Backend/Api/GuildsController.Remove.cs index b877d6a..1002efa 100644 --- a/Catalogger.Backend/Api/GuildsController.Remove.cs +++ b/Catalogger.Backend/Api/GuildsController.Remove.cs @@ -130,14 +130,6 @@ public partial class GuildsController guildId ); - // Clear out the caches for this guild - guildCache.Remove(guildId, out _); - emojiCache.Remove(guildId); - channelCache.RemoveGuild(guildId); - roleCache.RemoveGuild(guildId); - await memberCache.RemoveAllMembersAsync(guildId); - await inviteCache.RemoveAsync(guildId); - _logger.Information("Left guild {GuildId} and removed all data for it", guildId); return Ok(export); diff --git a/Catalogger.Backend/Api/GuildsController.cs b/Catalogger.Backend/Api/GuildsController.cs index e2445e1..f557f90 100644 --- a/Catalogger.Backend/Api/GuildsController.cs +++ b/Catalogger.Backend/Api/GuildsController.cs @@ -36,8 +36,6 @@ public partial class GuildsController( GuildRepository guildRepository, InviteRepository inviteRepository, WatchlistRepository watchlistRepository, - GuildCache guildCache, - EmojiCache emojiCache, ChannelCache channelCache, RoleCache roleCache, IMemberCache memberCache, diff --git a/Catalogger.Backend/Bot/Responders/Guilds/GuildCreateResponder.cs b/Catalogger.Backend/Bot/Responders/Guilds/GuildCreateResponder.cs index 789d072..9d5ac61 100644 --- a/Catalogger.Backend/Bot/Responders/Guilds/GuildCreateResponder.cs +++ b/Catalogger.Backend/Bot/Responders/Guilds/GuildCreateResponder.cs @@ -35,6 +35,7 @@ public class GuildCreateResponder( RoleCache roleCache, IMemberCache memberCache, IInviteCache inviteCache, + IWebhookCache webhookCache, WebhookExecutorService webhookExecutor, GuildFetchService guildFetchService ) : IResponder, IResponder @@ -114,6 +115,10 @@ public class GuildCreateResponder( await memberCache.RemoveAllMembersAsync(evt.ID); await inviteCache.RemoveAsync(evt.ID); + // Also clear the webhook cache + var guildConfig = await guildRepository.GetAsync(evt.ID); + await webhookCache.RemoveWebhooksAsync(guildConfig.Channels.AllChannels); + if (!wasCached || guild == null) { _logger.Information("Left uncached guild {GuildId}", evt.ID); diff --git a/Catalogger.Backend/Database/Models/Guild.cs b/Catalogger.Backend/Database/Models/Guild.cs index e27ea1b..afbd1cb 100644 --- a/Catalogger.Backend/Database/Models/Guild.cs +++ b/Catalogger.Backend/Database/Models/Guild.cs @@ -83,5 +83,35 @@ public class Guild public ulong MessageUpdate { get; set; } public ulong MessageDelete { get; set; } public ulong MessageDeleteBulk { get; set; } + + private ulong[] _allUnfilteredChannels => + [ + GuildUpdate, + GuildEmojisUpdate, + GuildRoleCreate, + GuildRoleUpdate, + GuildRoleDelete, + ChannelCreate, + ChannelUpdate, + ChannelDelete, + GuildMemberAdd, + GuildMemberUpdate, + GuildKeyRoleUpdate, + GuildMemberNickUpdate, + GuildMemberAvatarUpdate, + GuildMemberTimeout, + GuildMemberRemove, + GuildMemberKick, + GuildBanAdd, + GuildBanRemove, + InviteCreate, + InviteDelete, + MessageUpdate, + MessageDelete, + MessageDeleteBulk, + .. Redirects.Values, + ]; + + public ulong[] AllChannels => _allUnfilteredChannels.Where(c => c != 0).ToArray(); } } From 0564206bf74b5ec9ab7078d9336e0c9daa0e8a77 Mon Sep 17 00:00:00 2001 From: sam Date: Tue, 12 Nov 2024 17:25:50 +0100 Subject: [PATCH 28/57] fix: disconnect all shards when shard manager restarts, don't fetch old timeouts --- Catalogger.Backend/Bot/ShardedGatewayClient.cs | 15 ++++++++++++++- .../Database/Repositories/TimeoutRepository.cs | 6 +++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Catalogger.Backend/Bot/ShardedGatewayClient.cs b/Catalogger.Backend/Bot/ShardedGatewayClient.cs index 2de70cd..5621389 100644 --- a/Catalogger.Backend/Bot/ShardedGatewayClient.cs +++ b/Catalogger.Backend/Bot/ShardedGatewayClient.cs @@ -115,7 +115,9 @@ public class ShardedGatewayClient( _logger.Information("Started shard {ShardId}/{ShardCount}", shardIndex, TotalShards); } - return await await Task.WhenAny(tasks); + var taskResult = await await Task.WhenAny(tasks); + Disconnect(); + return taskResult; } public int ShardIdFor(ulong guildId) => (int)((guildId >> 22) % (ulong)TotalShards); @@ -136,6 +138,17 @@ public class ShardedGatewayClient( client.Dispose(); } + private void Disconnect() + { + _logger.Information("Disconnecting from Discord"); + foreach (var shardId in _gatewayClients.Keys) + { + _logger.Debug("Disposing shard {shardId}", shardId); + if (_gatewayClients.Remove(shardId, out var client)) + client.Dispose(); + } + } + private IOptions CloneOptions( DiscordGatewayClientOptions options, int shardId diff --git a/Catalogger.Backend/Database/Repositories/TimeoutRepository.cs b/Catalogger.Backend/Database/Repositories/TimeoutRepository.cs index c9c7ec5..9917aec 100644 --- a/Catalogger.Backend/Database/Repositories/TimeoutRepository.cs +++ b/Catalogger.Backend/Database/Repositories/TimeoutRepository.cs @@ -20,7 +20,11 @@ public class TimeoutRepository(DatabaseConnection conn) : IDisposable, IAsyncDis ); public async Task> GetAllAsync() => - (await conn.QueryAsync("select * from timeouts order by id")).ToList(); + ( + await conn.QueryAsync( + "select * from timeouts where until > now() order by id" + ) + ).ToList(); public async Task SetAsync( Snowflake guildId, From 254a50da4dbeb23b188fee86d58a9a56cc57d30e Mon Sep 17 00:00:00 2001 From: sam Date: Wed, 13 Nov 2024 15:14:22 +0100 Subject: [PATCH 29/57] feat: clear timeouts that never get logged --- .../Database/Repositories/TimeoutRepository.cs | 10 +++++++++- Catalogger.Backend/Services/BackgroundTasksService.cs | 11 +++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Catalogger.Backend/Database/Repositories/TimeoutRepository.cs b/Catalogger.Backend/Database/Repositories/TimeoutRepository.cs index 9917aec..f50a177 100644 --- a/Catalogger.Backend/Database/Repositories/TimeoutRepository.cs +++ b/Catalogger.Backend/Database/Repositories/TimeoutRepository.cs @@ -5,7 +5,9 @@ using Remora.Rest.Core; namespace Catalogger.Backend.Database.Repositories; -public class TimeoutRepository(DatabaseConnection conn) : IDisposable, IAsyncDisposable +public class TimeoutRepository(DatabaseConnection conn, IClock clock) + : IDisposable, + IAsyncDisposable { public async Task GetAsync(int id) => await conn.QueryFirstOrDefaultAsync( @@ -62,6 +64,12 @@ public class TimeoutRepository(DatabaseConnection conn) : IDisposable, IAsyncDis new { GuildId = guildId.Value, UserId = userId.Value } ); + public async Task RemoveExpiredTimeoutsAsync() => + await conn.ExecuteAsync( + "delete from timeouts where until < @Expiry", + new { Expiry = clock.GetCurrentInstant() - Duration.FromMinutes(5) } + ); + public void Dispose() { conn.Dispose(); diff --git a/Catalogger.Backend/Services/BackgroundTasksService.cs b/Catalogger.Backend/Services/BackgroundTasksService.cs index 11a35da..c23e96b 100644 --- a/Catalogger.Backend/Services/BackgroundTasksService.cs +++ b/Catalogger.Backend/Services/BackgroundTasksService.cs @@ -35,16 +35,23 @@ public class BackgroundTasksService(ILogger logger, IServiceProvider services) : await using var scope = services.CreateAsyncScope(); await using var messageRepository = scope.ServiceProvider.GetRequiredService(); + await using var timeoutRepository = + scope.ServiceProvider.GetRequiredService(); var (msgCount, ignoredCount) = await messageRepository.DeleteExpiredMessagesAsync(); if (msgCount != 0 || ignoredCount != 0) - { _logger.Information( "Deleted {Count} messages and {IgnoredCount} ignored message IDs older than {MaxDays} days old", msgCount, ignoredCount, MessageRepository.MaxMessageAgeDays ); - } + + var timeoutCount = await timeoutRepository.RemoveExpiredTimeoutsAsync(); + if (timeoutCount != 0) + _logger.Information( + "Deleted {Count} expired timeouts that were never logged", + timeoutCount + ); } } From 681aaa8254820e4ee8a8454394f1ba58775b86fb Mon Sep 17 00:00:00 2001 From: sam Date: Wed, 13 Nov 2024 15:24:12 +0100 Subject: [PATCH 30/57] chore: update from yarn 1 to yarn 4 (whoops) --- Catalogger.Frontend/.gitignore | 4 + Catalogger.Frontend/.yarnrc.yml | 1 + Catalogger.Frontend/package.json | 7 +- Catalogger.Frontend/yarn.lock | 5236 +++++++++++++++++++----------- 4 files changed, 3437 insertions(+), 1811 deletions(-) create mode 100644 Catalogger.Frontend/.yarnrc.yml diff --git a/Catalogger.Frontend/.gitignore b/Catalogger.Frontend/.gitignore index 449610c..bbe170d 100644 --- a/Catalogger.Frontend/.gitignore +++ b/Catalogger.Frontend/.gitignore @@ -1,3 +1,4 @@ +.vscode node_modules # Output @@ -19,3 +20,6 @@ Thumbs.db # Vite vite.config.js.timestamp-* vite.config.ts.timestamp-* + +# yarn 4 +.yarn \ No newline at end of file diff --git a/Catalogger.Frontend/.yarnrc.yml b/Catalogger.Frontend/.yarnrc.yml new file mode 100644 index 0000000..3186f3f --- /dev/null +++ b/Catalogger.Frontend/.yarnrc.yml @@ -0,0 +1 @@ +nodeLinker: node-modules diff --git a/Catalogger.Frontend/package.json b/Catalogger.Frontend/package.json index b36d8cd..bfb736a 100644 --- a/Catalogger.Frontend/package.json +++ b/Catalogger.Frontend/package.json @@ -14,7 +14,7 @@ "devDependencies": { "@sveltejs/adapter-static": "^3.0.5", "@sveltejs/kit": "^2.0.0", - "@sveltejs/vite-plugin-svelte": "^3.0.0", + "@sveltejs/vite-plugin-svelte": "3", "@sveltestrap/sveltestrap": "^6.2.7", "@types/eslint": "^9.6.0", "@types/file-saver": "^2.0.7", @@ -32,12 +32,13 @@ "sass": "^1.80.1", "snarkdown": "^2.0.0", "svelecte": "^4.3.1", - "svelte": "^4.2.7", + "svelte": "4", "svelte-check": "^4.0.0", "typescript": "^5.0.0", "typescript-eslint": "^8.0.0", "vite": "^5.0.3", "vite-plugin-markdown": "^2.2.0" }, - "type": "module" + "type": "module", + "packageManager": "yarn@4.5.1" } diff --git a/Catalogger.Frontend/yarn.lock b/Catalogger.Frontend/yarn.lock index 0111c04..4ede98d 100644 --- a/Catalogger.Frontend/yarn.lock +++ b/Catalogger.Frontend/yarn.lock @@ -1,1808 +1,3428 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.2.1": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@esbuild/aix-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" - integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== - -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - -"@esbuild/android-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" - integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== - -"@esbuild/darwin-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" - integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== - -"@esbuild/darwin-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" - integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== - -"@esbuild/freebsd-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" - integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== - -"@esbuild/freebsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" - integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== - -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - -"@esbuild/linux-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" - integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== - -"@esbuild/linux-loong64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" - integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== - -"@esbuild/linux-mips64el@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" - integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== - -"@esbuild/linux-ppc64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" - integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== - -"@esbuild/linux-riscv64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" - integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== - -"@esbuild/linux-s390x@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" - integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== - -"@esbuild/linux-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" - integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== - -"@esbuild/netbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" - integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== - -"@esbuild/openbsd-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" - integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== - -"@esbuild/sunos-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" - integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== - -"@esbuild/win32-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" - integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== - -"@esbuild/win32-ia32@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" - integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== - -"@esbuild/win32-x64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" - integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== - -"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.11.0": - version "4.11.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f" - integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== - -"@eslint/config-array@^0.18.0": - version "0.18.0" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.18.0.tgz#37d8fe656e0d5e3dbaea7758ea56540867fd074d" - integrity sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw== - dependencies: - "@eslint/object-schema" "^2.1.4" - debug "^4.3.1" - minimatch "^3.1.2" - -"@eslint/core@^0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.6.0.tgz#9930b5ba24c406d67a1760e94cdbac616a6eb674" - integrity sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg== - -"@eslint/eslintrc@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6" - integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^10.0.1" - globals "^14.0.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@9.12.0": - version "9.12.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.12.0.tgz#69ca3ca9fab9a808ec6d67b8f6edb156cbac91e1" - integrity sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA== - -"@eslint/object-schema@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" - integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== - -"@eslint/plugin-kit@^0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz#8712dccae365d24e9eeecb7b346f85e750ba343d" - integrity sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig== - dependencies: - levn "^0.4.1" - -"@humanfs/core@^0.19.0": - version "0.19.0" - resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.0.tgz#08db7a8c73bb07673d9ebd925f2dad746411fcec" - integrity sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw== - -"@humanfs/node@^0.16.5": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.5.tgz#a9febb7e7ad2aff65890fdc630938f8d20aa84ba" - integrity sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg== - dependencies: - "@humanfs/core" "^0.19.0" - "@humanwhocodes/retry" "^0.3.0" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/retry@^0.3.0", "@humanwhocodes/retry@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" - integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== - -"@jridgewell/gen-mapping@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15", "@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== - -"@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@parcel/watcher-android-arm64@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz#c2c19a3c442313ff007d2d7a9c2c1dd3e1c9ca84" - integrity sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg== - -"@parcel/watcher-darwin-arm64@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz#c817c7a3b4f3a79c1535bfe54a1c2818d9ffdc34" - integrity sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA== - -"@parcel/watcher-darwin-x64@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz#1a3f69d9323eae4f1c61a5f480a59c478d2cb020" - integrity sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg== - -"@parcel/watcher-freebsd-x64@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz#0d67fef1609f90ba6a8a662bc76a55fc93706fc8" - integrity sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w== - -"@parcel/watcher-linux-arm-glibc@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz#ce5b340da5829b8e546bd00f752ae5292e1c702d" - integrity sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA== - -"@parcel/watcher-linux-arm64-glibc@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz#6d7c00dde6d40608f9554e73998db11b2b1ff7c7" - integrity sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA== - -"@parcel/watcher-linux-arm64-musl@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz#bd39bc71015f08a4a31a47cd89c236b9d6a7f635" - integrity sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA== - -"@parcel/watcher-linux-x64-glibc@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz#0ce29966b082fb6cdd3de44f2f74057eef2c9e39" - integrity sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg== - -"@parcel/watcher-linux-x64-musl@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz#d2ebbf60e407170bb647cd6e447f4f2bab19ad16" - integrity sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ== - -"@parcel/watcher-win32-arm64@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz#eb4deef37e80f0b5e2f215dd6d7a6d40a85f8adc" - integrity sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg== - -"@parcel/watcher-win32-ia32@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz#94fbd4b497be39fd5c8c71ba05436927842c9df7" - integrity sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw== - -"@parcel/watcher-win32-x64@2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz#4bf920912f67cae5f2d264f58df81abfea68dadf" - integrity sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A== - -"@parcel/watcher@^2.4.1": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.4.1.tgz#a50275151a1bb110879c6123589dba90c19f1bf8" - integrity sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA== - dependencies: - detect-libc "^1.0.3" - is-glob "^4.0.3" - micromatch "^4.0.5" - node-addon-api "^7.0.0" - optionalDependencies: - "@parcel/watcher-android-arm64" "2.4.1" - "@parcel/watcher-darwin-arm64" "2.4.1" - "@parcel/watcher-darwin-x64" "2.4.1" - "@parcel/watcher-freebsd-x64" "2.4.1" - "@parcel/watcher-linux-arm-glibc" "2.4.1" - "@parcel/watcher-linux-arm64-glibc" "2.4.1" - "@parcel/watcher-linux-arm64-musl" "2.4.1" - "@parcel/watcher-linux-x64-glibc" "2.4.1" - "@parcel/watcher-linux-x64-musl" "2.4.1" - "@parcel/watcher-win32-arm64" "2.4.1" - "@parcel/watcher-win32-ia32" "2.4.1" - "@parcel/watcher-win32-x64" "2.4.1" - -"@polka/url@^1.0.0-next.24": - version "1.0.0-next.28" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.28.tgz#d45e01c4a56f143ee69c54dd6b12eade9e270a73" - integrity sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw== - -"@popperjs/core@^2.11.8": - version "2.11.8" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" - integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== - -"@rollup/rollup-android-arm-eabi@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz#1661ff5ea9beb362795304cb916049aba7ac9c54" - integrity sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA== - -"@rollup/rollup-android-arm64@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz#2ffaa91f1b55a0082b8a722525741aadcbd3971e" - integrity sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA== - -"@rollup/rollup-darwin-arm64@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz#627007221b24b8cc3063703eee0b9177edf49c1f" - integrity sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA== - -"@rollup/rollup-darwin-x64@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz#0605506142b9e796c370d59c5984ae95b9758724" - integrity sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ== - -"@rollup/rollup-linux-arm-gnueabihf@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz#62dfd196d4b10c0c2db833897164d2d319ee0cbb" - integrity sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA== - -"@rollup/rollup-linux-arm-musleabihf@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz#53ce72aeb982f1f34b58b380baafaf6a240fddb3" - integrity sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw== - -"@rollup/rollup-linux-arm64-gnu@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz#1632990f62a75c74f43e4b14ab3597d7ed416496" - integrity sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA== - -"@rollup/rollup-linux-arm64-musl@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz#8c03a996efb41e257b414b2e0560b7a21f2d9065" - integrity sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw== - -"@rollup/rollup-linux-powerpc64le-gnu@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz#5b98729628d5bcc8f7f37b58b04d6845f85c7b5d" - integrity sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw== - -"@rollup/rollup-linux-riscv64-gnu@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz#48e42e41f4cabf3573cfefcb448599c512e22983" - integrity sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg== - -"@rollup/rollup-linux-s390x-gnu@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz#e0b4f9a966872cb7d3e21b9e412a4b7efd7f0b58" - integrity sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g== - -"@rollup/rollup-linux-x64-gnu@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz#78144741993100f47bd3da72fce215e077ae036b" - integrity sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A== - -"@rollup/rollup-linux-x64-musl@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz#d9fe32971883cd1bd858336bd33a1c3ca6146127" - integrity sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ== - -"@rollup/rollup-win32-arm64-msvc@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz#71fa3ea369316db703a909c790743972e98afae5" - integrity sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ== - -"@rollup/rollup-win32-ia32-msvc@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz#653f5989a60658e17d7576a3996deb3902e342e2" - integrity sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ== - -"@rollup/rollup-win32-x64-msvc@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz#0574d7e87b44ee8511d08cc7f914bcb802b70818" - integrity sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw== - -"@sveltejs/adapter-static@^3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@sveltejs/adapter-static/-/adapter-static-3.0.5.tgz#12ceaf396e27f5871ae59da44c15caf9f4a91005" - integrity sha512-kFJR7RxeB6FBvrKZWAEzIALatgy11ISaaZbcPup8JdWUdrmmfUHHTJ738YHJTEfnCiiXi6aX8Q6ePY7tnSMD6Q== - -"@sveltejs/kit@^2.0.0": - version "2.7.1" - resolved "https://registry.yarnpkg.com/@sveltejs/kit/-/kit-2.7.1.tgz#2c2a3d998965e6b37605137b256b56c57f47682a" - integrity sha512-TBVnkwgYQT3EafGQK6Eyh5FlLEBlRhCmqPTwcdOs+QdnyUc3eCAxRWtXlFxIWtmk6pqv11zdng8qTpThdTogew== - dependencies: - "@types/cookie" "^0.6.0" - cookie "^0.6.0" - devalue "^5.1.0" - esm-env "^1.0.0" - import-meta-resolve "^4.1.0" - kleur "^4.1.5" - magic-string "^0.30.5" - mrmime "^2.0.0" - sade "^1.8.1" - set-cookie-parser "^2.6.0" - sirv "^3.0.0" - tiny-glob "^0.2.9" - -"@sveltejs/vite-plugin-svelte-inspector@^2.1.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.1.0.tgz#116ba2b73be43c1d7d93de749f37becc7e45bb8c" - integrity sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg== - dependencies: - debug "^4.3.4" - -"@sveltejs/vite-plugin-svelte@^3.0.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.1.2.tgz#be3120b52e6d9facb55d58392b0dad9e5a35ba6f" - integrity sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA== - dependencies: - "@sveltejs/vite-plugin-svelte-inspector" "^2.1.0" - debug "^4.3.4" - deepmerge "^4.3.1" - kleur "^4.1.5" - magic-string "^0.30.10" - svelte-hmr "^0.16.0" - vitefu "^0.2.5" - -"@sveltestrap/sveltestrap@^6.2.7": - version "6.2.7" - resolved "https://registry.yarnpkg.com/@sveltestrap/sveltestrap/-/sveltestrap-6.2.7.tgz#5b2736cbee2db973f02b09d2e9d5bf819418f1f9" - integrity sha512-WwLLfAFUb42BGuRrf3Vbct30bQMzlEMMipN/MfxhjuLTmLQeW9muVJfPyvjtWS+mY+RjkSCoHvAp/ZobP1NLlQ== - dependencies: - "@popperjs/core" "^2.11.8" - -"@types/cookie@^0.6.0": - version "0.6.0" - resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.6.0.tgz#eac397f28bf1d6ae0ae081363eca2f425bedf0d5" - integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== - -"@types/eslint@^9.6.0": - version "9.6.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.1.tgz#d5795ad732ce81715f27f75da913004a56751584" - integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@1.0.6", "@types/estree@^1.0.0", "@types/estree@^1.0.1", "@types/estree@^1.0.6": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" - integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== - -"@types/file-saver@^2.0.7": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@types/file-saver/-/file-saver-2.0.7.tgz#8dbb2f24bdc7486c54aa854eb414940bbd056f7d" - integrity sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A== - -"@types/json-schema@*", "@types/json-schema@^7.0.15": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/luxon@^3.4.2": - version "3.4.2" - resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-3.4.2.tgz#e4fc7214a420173cea47739c33cdf10874694db7" - integrity sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA== - -"@typescript-eslint/eslint-plugin@8.9.0": - version "8.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.9.0.tgz#bf0b25305b0bf014b4b194a6919103d7ac2a7907" - integrity sha512-Y1n621OCy4m7/vTXNlCbMVp87zSd7NH0L9cXD8aIpOaNlzeWxIK4+Q19A68gSmTNRZn92UjocVUWDthGxtqHFg== - dependencies: - "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.9.0" - "@typescript-eslint/type-utils" "8.9.0" - "@typescript-eslint/utils" "8.9.0" - "@typescript-eslint/visitor-keys" "8.9.0" - graphemer "^1.4.0" - ignore "^5.3.1" - natural-compare "^1.4.0" - ts-api-utils "^1.3.0" - -"@typescript-eslint/parser@8.9.0": - version "8.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.9.0.tgz#0cecda6def8aef95d7c7098359c0fda5a362d6ad" - integrity sha512-U+BLn2rqTTHnc4FL3FJjxaXptTxmf9sNftJK62XLz4+GxG3hLHm/SUNaaXP5Y4uTiuYoL5YLy4JBCJe3+t8awQ== - dependencies: - "@typescript-eslint/scope-manager" "8.9.0" - "@typescript-eslint/types" "8.9.0" - "@typescript-eslint/typescript-estree" "8.9.0" - "@typescript-eslint/visitor-keys" "8.9.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@8.9.0": - version "8.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.9.0.tgz#c98fef0c4a82a484e6a1eb610a55b154d14d46f3" - integrity sha512-bZu9bUud9ym1cabmOYH9S6TnbWRzpklVmwqICeOulTCZ9ue2/pczWzQvt/cGj2r2o1RdKoZbuEMalJJSYw3pHQ== - dependencies: - "@typescript-eslint/types" "8.9.0" - "@typescript-eslint/visitor-keys" "8.9.0" - -"@typescript-eslint/type-utils@8.9.0": - version "8.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.9.0.tgz#aa86da3e4555fe7c8b42ab75e13561c4b5a8dfeb" - integrity sha512-JD+/pCqlKqAk5961vxCluK+clkppHY07IbV3vett97KOV+8C6l+CPEPwpUuiMwgbOz/qrN3Ke4zzjqbT+ls+1Q== - dependencies: - "@typescript-eslint/typescript-estree" "8.9.0" - "@typescript-eslint/utils" "8.9.0" - debug "^4.3.4" - ts-api-utils "^1.3.0" - -"@typescript-eslint/types@8.9.0": - version "8.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.9.0.tgz#b733af07fb340b32e962c6c63b1062aec2dc0fe6" - integrity sha512-SjgkvdYyt1FAPhU9c6FiYCXrldwYYlIQLkuc+LfAhCna6ggp96ACncdtlbn8FmnG72tUkXclrDExOpEYf1nfJQ== - -"@typescript-eslint/typescript-estree@8.9.0": - version "8.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.9.0.tgz#1714f167e9063062dc0df49c1d25afcbc7a96199" - integrity sha512-9iJYTgKLDG6+iqegehc5+EqE6sqaee7kb8vWpmHZ86EqwDjmlqNNHeqDVqb9duh+BY6WCNHfIGvuVU3Tf9Db0g== - dependencies: - "@typescript-eslint/types" "8.9.0" - "@typescript-eslint/visitor-keys" "8.9.0" - debug "^4.3.4" - fast-glob "^3.3.2" - is-glob "^4.0.3" - minimatch "^9.0.4" - semver "^7.6.0" - ts-api-utils "^1.3.0" - -"@typescript-eslint/utils@8.9.0": - version "8.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.9.0.tgz#748bbe3ea5bee526d9786d9405cf1b0df081c299" - integrity sha512-PKgMmaSo/Yg/F7kIZvrgrWa1+Vwn036CdNUvYFEkYbPwOH4i8xvkaRlu148W3vtheWK9ckKRIz7PBP5oUlkrvQ== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.9.0" - "@typescript-eslint/types" "8.9.0" - "@typescript-eslint/typescript-estree" "8.9.0" - -"@typescript-eslint/visitor-keys@8.9.0": - version "8.9.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.9.0.tgz#5f11f4d9db913f37da42776893ffe0dd1ae78f78" - integrity sha512-Ht4y38ubk4L5/U8xKUBfKNYGmvKvA1CANoxiTRMM+tOLk3lbF3DvzZCxJCRSE+2GdCMSh6zq9VZJc3asc1XuAA== - dependencies: - "@typescript-eslint/types" "8.9.0" - eslint-visitor-keys "^3.4.3" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^8.10.0, acorn@^8.12.0, acorn@^8.9.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.13.0.tgz#2a30d670818ad16ddd6a35d3842dacec9e5d7ca3" - integrity sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w== - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -aria-query@^5.3.0: - version "5.3.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" - integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== - -axobject-query@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee" - integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -bootstrap@^5.3.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.3.tgz#de35e1a765c897ac940021900fcbb831602bac38" - integrity sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chokidar@^4.0.0, chokidar@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.1.tgz#4a6dff66798fb0f72a94f616abbd7e1a19f31d41" - integrity sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA== - dependencies: - readdirp "^4.0.1" - -code-red@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/code-red/-/code-red-1.0.4.tgz#59ba5c9d1d320a4ef795bc10a28bd42bfebe3e35" - integrity sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw== - dependencies: - "@jridgewell/sourcemap-codec" "^1.4.15" - "@types/estree" "^1.0.1" - acorn "^8.10.0" - estree-walker "^3.0.3" - periscopic "^3.1.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -cookie@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" - integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== - -cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -css-tree@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" - integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== - dependencies: - mdn-data "2.0.30" - source-map-js "^1.0.1" - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== - dependencies: - ms "^2.1.3" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -detect-libc@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== - -devalue@^5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/devalue/-/devalue-5.1.1.tgz#a71887ac0f354652851752654e4bd435a53891ae" - integrity sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw== - -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domhandler@^4.0.0, domhandler@^4.2.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== - dependencies: - domelementtype "^2.2.0" - -domutils@^2.5.2: - version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -entities@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" - integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== - -esbuild@^0.21.3: - version "0.21.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" - integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== - optionalDependencies: - "@esbuild/aix-ppc64" "0.21.5" - "@esbuild/android-arm" "0.21.5" - "@esbuild/android-arm64" "0.21.5" - "@esbuild/android-x64" "0.21.5" - "@esbuild/darwin-arm64" "0.21.5" - "@esbuild/darwin-x64" "0.21.5" - "@esbuild/freebsd-arm64" "0.21.5" - "@esbuild/freebsd-x64" "0.21.5" - "@esbuild/linux-arm" "0.21.5" - "@esbuild/linux-arm64" "0.21.5" - "@esbuild/linux-ia32" "0.21.5" - "@esbuild/linux-loong64" "0.21.5" - "@esbuild/linux-mips64el" "0.21.5" - "@esbuild/linux-ppc64" "0.21.5" - "@esbuild/linux-riscv64" "0.21.5" - "@esbuild/linux-s390x" "0.21.5" - "@esbuild/linux-x64" "0.21.5" - "@esbuild/netbsd-x64" "0.21.5" - "@esbuild/openbsd-x64" "0.21.5" - "@esbuild/sunos-x64" "0.21.5" - "@esbuild/win32-arm64" "0.21.5" - "@esbuild/win32-ia32" "0.21.5" - "@esbuild/win32-x64" "0.21.5" - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-compat-utils@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz#7fc92b776d185a70c4070d03fd26fde3d59652e4" - integrity sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q== - dependencies: - semver "^7.5.4" - -eslint-config-prettier@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" - integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== - -eslint-plugin-svelte@^2.36.0: - version "2.45.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-svelte/-/eslint-plugin-svelte-2.45.1.tgz#2a9c1c5088667d432c36b0933229248450a199a6" - integrity sha512-mYAKNDRji0YWl7o00KQi0enREcrtzcN7xwK/8lwk5uLRoKLjzPXc+WjngsYpPV35I3AF7UlXc1+JfyNMJS+njA== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@jridgewell/sourcemap-codec" "^1.4.15" - eslint-compat-utils "^0.5.1" - esutils "^2.0.3" - known-css-properties "^0.34.0" - postcss "^8.4.38" - postcss-load-config "^3.1.4" - postcss-safe-parser "^6.0.0" - postcss-selector-parser "^6.1.0" - semver "^7.6.2" - svelte-eslint-parser "^0.42.0" - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-scope@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.1.0.tgz#70214a174d4cbffbc3e8a26911d8bf51b9ae9d30" - integrity sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint-visitor-keys@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz#1f785cc5e81eb7534523d85922248232077d2f8c" - integrity sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg== - -eslint@^9.0.0: - version "9.12.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.12.0.tgz#54fcba2876c90528396da0fa44b6446329031e86" - integrity sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.11.0" - "@eslint/config-array" "^0.18.0" - "@eslint/core" "^0.6.0" - "@eslint/eslintrc" "^3.1.0" - "@eslint/js" "9.12.0" - "@eslint/plugin-kit" "^0.2.0" - "@humanfs/node" "^0.16.5" - "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.3.1" - "@types/estree" "^1.0.6" - "@types/json-schema" "^7.0.15" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - escape-string-regexp "^4.0.0" - eslint-scope "^8.1.0" - eslint-visitor-keys "^4.1.0" - espree "^10.2.0" - esquery "^1.5.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^8.0.0" - find-up "^5.0.0" - glob-parent "^6.0.2" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - json-stable-stringify-without-jsonify "^1.0.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - text-table "^0.2.0" - -esm-env@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esm-env/-/esm-env-1.0.0.tgz#b124b40b180711690a4cb9b00d16573391950413" - integrity sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA== - -espree@^10.0.1, espree@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-10.2.0.tgz#f4bcead9e05b0615c968e85f83816bc386a45df6" - integrity sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g== - dependencies: - acorn "^8.12.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^4.1.0" - -espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" - integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estree-walker@^3.0.0, estree-walker@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" - integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== - dependencies: - "@types/estree" "^1.0.0" - -esutils@^2.0.2, esutils@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== - dependencies: - reusify "^1.0.4" - -fdir@^6.2.0: - version "6.4.2" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.2.tgz#ddaa7ce1831b161bc3657bb99cb36e1622702689" - integrity sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ== - -file-entry-cache@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" - integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== - dependencies: - flat-cache "^4.0.0" - -file-saver@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" - integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" - integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.4" - -flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== - -front-matter@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/front-matter/-/front-matter-4.0.2.tgz#b14e54dc745cfd7293484f3210d15ea4edd7f4d5" - integrity sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg== - dependencies: - js-yaml "^3.13.1" - -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -glob-parent@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -globals@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" - integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== - -globals@^15.0.0: - version "15.11.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-15.11.0.tgz#b96ed4c6998540c6fb824b24b5499216d2438d6e" - integrity sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw== - -globalyzer@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" - integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== - -globrex@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" - integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -htmlparser2@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - -ignore@^5.2.0, ignore@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -immutable@^4.0.0: - version "4.3.7" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381" - integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-meta-resolve@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#f9db8bead9fafa61adb811db77a2bf22c5399706" - integrity sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw== - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-reference@^3.0.0, is-reference@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.2.tgz#154747a01f45cd962404ee89d43837af2cba247c" - integrity sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg== - dependencies: - "@types/estree" "*" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -keyv@^4.5.4: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -kleur@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" - integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== - -known-css-properties@^0.34.0: - version "0.34.0" - resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.34.0.tgz#ccd7e9f4388302231b3f174a8b1d5b1f7b576cea" - integrity sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lilconfig@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -linkify-it@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e" - integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ== - dependencies: - uc.micro "^1.0.1" - -locate-character@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-character/-/locate-character-3.0.0.tgz#0305c5b8744f61028ef5d01f444009e00779f974" - integrity sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA== - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -luxon@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.5.0.tgz#6b6f65c5cd1d61d1fd19dbf07ee87a50bf4b8e20" - integrity sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ== - -magic-string@^0.30.10, magic-string@^0.30.4, magic-string@^0.30.5: - version "0.30.12" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.12.tgz#9eb11c9d072b9bcb4940a5b2c2e1a217e4ee1a60" - integrity sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - -markdown-it@^12.0.0: - version "12.3.2" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.3.2.tgz#bf92ac92283fe983fe4de8ff8abfb5ad72cd0c90" - integrity sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg== - dependencies: - argparse "^2.0.1" - entities "~2.1.0" - linkify-it "^3.0.1" - mdurl "^1.0.1" - uc.micro "^1.0.5" - -marked@^14.1.3: - version "14.1.3" - resolved "https://registry.yarnpkg.com/marked/-/marked-14.1.3.tgz#42372cffd22e76e0f1d7f3627ebc116d291abbed" - integrity sha512-ZibJqTULGlt9g5k4VMARAktMAjXoVnnr+Y3aCqW1oDftcV4BA3UmrBifzXoZyenHRk75csiPu9iwsTj4VNBT0g== - -mdn-data@2.0.30: - version "2.0.30" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" - integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== - -mdurl@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== - -merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -mri@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" - integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== - -mrmime@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" - integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== - -ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -node-addon-api@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" - integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -periscopic@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/periscopic/-/periscopic-3.1.0.tgz#7e9037bf51c5855bd33b48928828db4afa79d97a" - integrity sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw== - dependencies: - "@types/estree" "^1.0.0" - estree-walker "^3.0.0" - is-reference "^3.0.0" - -picocolors@^1.0.0, picocolors@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -postcss-load-config@^3.1.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" - integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== - dependencies: - lilconfig "^2.0.5" - yaml "^1.10.2" - -postcss-safe-parser@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz#bb4c29894171a94bc5c996b9a30317ef402adaa1" - integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== - -postcss-scss@^4.0.9: - version "4.0.9" - resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.9.tgz#a03c773cd4c9623cb04ce142a52afcec74806685" - integrity sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A== - -postcss-selector-parser@^6.1.0: - version "6.1.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" - integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss@^8.4.38, postcss@^8.4.39, postcss@^8.4.43: - version "8.4.47" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365" - integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ== - dependencies: - nanoid "^3.3.7" - picocolors "^1.1.0" - source-map-js "^1.2.1" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier-plugin-svelte@^3.1.2: - version "3.2.7" - resolved "https://registry.yarnpkg.com/prettier-plugin-svelte/-/prettier-plugin-svelte-3.2.7.tgz#10db2d553b48c6ed412e2d00688f8d2eaa274f8a" - integrity sha512-/Dswx/ea0lV34If1eDcG3nulQ63YNr5KPDfMsjbdtpSWOxKKJ7nAc2qlVuYwEvCr4raIuredNoR7K4JCkmTGaQ== - -prettier@^3.1.1: - version "3.3.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" - integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -readdirp@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a" - integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rollup@^4.20.0: - version "4.24.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.24.0.tgz#c14a3576f20622ea6a5c9cad7caca5e6e9555d05" - integrity sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg== - dependencies: - "@types/estree" "1.0.6" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.24.0" - "@rollup/rollup-android-arm64" "4.24.0" - "@rollup/rollup-darwin-arm64" "4.24.0" - "@rollup/rollup-darwin-x64" "4.24.0" - "@rollup/rollup-linux-arm-gnueabihf" "4.24.0" - "@rollup/rollup-linux-arm-musleabihf" "4.24.0" - "@rollup/rollup-linux-arm64-gnu" "4.24.0" - "@rollup/rollup-linux-arm64-musl" "4.24.0" - "@rollup/rollup-linux-powerpc64le-gnu" "4.24.0" - "@rollup/rollup-linux-riscv64-gnu" "4.24.0" - "@rollup/rollup-linux-s390x-gnu" "4.24.0" - "@rollup/rollup-linux-x64-gnu" "4.24.0" - "@rollup/rollup-linux-x64-musl" "4.24.0" - "@rollup/rollup-win32-arm64-msvc" "4.24.0" - "@rollup/rollup-win32-ia32-msvc" "4.24.0" - "@rollup/rollup-win32-x64-msvc" "4.24.0" - fsevents "~2.3.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -sade@^1.7.4, sade@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" - integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== - dependencies: - mri "^1.1.0" - -sass@^1.80.1: - version "1.80.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.80.1.tgz#5b26cde787917e845f25585b741c0caa653d0154" - integrity sha512-9lBwDZ7j3y/1DKj5Ec249EVGo5CVpwnzIyIj+cqlCjKkApLnzsJ/l9SnV4YnORvW9dQwQN+gQvh/mFZ8CnDs7Q== - dependencies: - "@parcel/watcher" "^2.4.1" - chokidar "^4.0.0" - immutable "^4.0.0" - source-map-js ">=0.6.2 <2.0.0" - -semver@^7.5.4, semver@^7.6.0, semver@^7.6.2: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - -set-cookie-parser@^2.6.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.0.tgz#ef5552b56dc01baae102acb5fc9fb8cd060c30f9" - integrity sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -sirv@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-3.0.0.tgz#f8d90fc528f65dff04cb597a88609d4e8a4361ce" - integrity sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg== - dependencies: - "@polka/url" "^1.0.0-next.24" - mrmime "^2.0.0" - totalist "^3.0.0" - -snarkdown@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/snarkdown/-/snarkdown-2.0.0.tgz#b1feb4db91b9f94a8ebbd7a50f3e99aee18b1e03" - integrity sha512-MgL/7k/AZdXCTJiNgrO7chgDqaB9FGM/1Tvlcenenb7div6obaDATzs16JhFyHHBGodHT3B7RzRc5qk8pFhg3A== - -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -svelecte@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/svelecte/-/svelecte-4.3.1.tgz#d7bfb8c14ef080ac43e36f42c6020aae044dd2fe" - integrity sha512-0wyPDel4J16ecwaDHvgdXsI5QvuC1pU8n2FY3tO4X39e6gcrnoQkgV3zVWYdm7xAQaqawAgZNBDgNZlonPLOmw== - dependencies: - svelte-tiny-virtual-list "^2.1.0" - -svelte-check@^4.0.0: - version "4.0.5" - resolved "https://registry.yarnpkg.com/svelte-check/-/svelte-check-4.0.5.tgz#5cd910c3b1d50f38159c17cc3bae127cbbb55c8d" - integrity sha512-icBTBZ3ibBaywbXUat3cK6hB5Du+Kq9Z8CRuyLmm64XIe2/r+lQcbuBx/IQgsbrC+kT2jQ0weVpZSSRIPwB6jQ== - dependencies: - "@jridgewell/trace-mapping" "^0.3.25" - chokidar "^4.0.1" - fdir "^6.2.0" - picocolors "^1.0.0" - sade "^1.7.4" - -svelte-eslint-parser@^0.42.0: - version "0.42.0" - resolved "https://registry.yarnpkg.com/svelte-eslint-parser/-/svelte-eslint-parser-0.42.0.tgz#a4b28b14505194e7f0b1aec22b2724253941cf40" - integrity sha512-e7LyqFPTuF43ZYhKOf0Gq1lzP+G64iWVJXAIcwVxohGx5FFyqdUkw7DEXNjZ+Fm+TAA98zPmDqWvgD1OpyMi5A== - dependencies: - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - postcss "^8.4.39" - postcss-scss "^4.0.9" - -svelte-hmr@^0.16.0: - version "0.16.0" - resolved "https://registry.yarnpkg.com/svelte-hmr/-/svelte-hmr-0.16.0.tgz#9f345b7d1c1662f1613747ed7e82507e376c1716" - integrity sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA== - -svelte-tiny-virtual-list@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/svelte-tiny-virtual-list/-/svelte-tiny-virtual-list-2.1.2.tgz#db826e5915f0374b793798bc8125b8a66fbc6c34" - integrity sha512-jeP/WMvgFUR4mYXHGPiCexjX5DuzSO+3xzHNhxfcsFyy+uYPtnqI5UGb383swpzQAyXB0OBqYfzpYihD/5gxnA== - -svelte@^4.2.7: - version "4.2.19" - resolved "https://registry.yarnpkg.com/svelte/-/svelte-4.2.19.tgz#4e6e84a8818e2cd04ae0255fcf395bc211e61d4c" - integrity sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw== - dependencies: - "@ampproject/remapping" "^2.2.1" - "@jridgewell/sourcemap-codec" "^1.4.15" - "@jridgewell/trace-mapping" "^0.3.18" - "@types/estree" "^1.0.1" - acorn "^8.9.0" - aria-query "^5.3.0" - axobject-query "^4.0.0" - code-red "^1.0.3" - css-tree "^2.3.1" - estree-walker "^3.0.3" - is-reference "^3.0.1" - locate-character "^3.0.0" - magic-string "^0.30.4" - periscopic "^3.1.0" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -tiny-glob@^0.2.9: - version "0.2.9" - resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2" - integrity sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg== - dependencies: - globalyzer "0.1.0" - globrex "^0.1.2" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -totalist@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" - integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== - -ts-api-utils@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" - integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -typescript-eslint@^8.0.0: - version "8.9.0" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.9.0.tgz#20a9b8125c57f3de962080ebebf366697f75bf79" - integrity sha512-AuD/FXGYRQyqyOBCpNLldMlsCGvmDNxptQ3Dp58/NXeB+FqyvTfXmMyba3PYa0Vi9ybnj7G8S/yd/4Cw8y47eA== - dependencies: - "@typescript-eslint/eslint-plugin" "8.9.0" - "@typescript-eslint/parser" "8.9.0" - "@typescript-eslint/utils" "8.9.0" - -typescript@^5.0.0: - version "5.6.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" - integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== - -uc.micro@^1.0.1, uc.micro@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" - integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -util-deprecate@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -vite-plugin-markdown@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/vite-plugin-markdown/-/vite-plugin-markdown-2.2.0.tgz#a0c5bd7bb88f385fa4ea983bf51b1ee35057c90a" - integrity sha512-eH2tXMZcx3EHb5okd+/0VIyoR8Gp9pGe24UXitOOcGkzObbJ1vl48aGOAbakoT88FBdzC8MXNkMfBIB9VK0Ndg== - dependencies: - domhandler "^4.0.0" - front-matter "^4.0.0" - htmlparser2 "^6.0.0" - markdown-it "^12.0.0" - -vite@^5.0.3: - version "5.4.9" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.9.tgz#215c80cbebfd09ccbb9ceb8c0621391c9abdc19c" - integrity sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg== - dependencies: - esbuild "^0.21.3" - postcss "^8.4.43" - rollup "^4.20.0" - optionalDependencies: - fsevents "~2.3.3" - -vitefu@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/vitefu/-/vitefu-0.2.5.tgz#c1b93c377fbdd3e5ddd69840ea3aa70b40d90969" - integrity sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q== - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -yaml@^1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10c0 + +"@ampproject/remapping@npm:^2.2.1": + version: 2.3.0 + resolution: "@ampproject/remapping@npm:2.3.0" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/81d63cca5443e0f0c72ae18b544cc28c7c0ec2cea46e7cb888bb0e0f411a1191d0d6b7af798d54e30777d8d1488b2ec0732aac2be342d3d7d3ffd271c6f489ed + languageName: node + linkType: hard + +"@esbuild/aix-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/aix-ppc64@npm:0.21.5" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm64@npm:0.21.5" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm@npm:0.21.5" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-x64@npm:0.21.5" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-arm64@npm:0.21.5" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-x64@npm:0.21.5" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-arm64@npm:0.21.5" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-x64@npm:0.21.5" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm64@npm:0.21.5" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm@npm:0.21.5" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ia32@npm:0.21.5" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-loong64@npm:0.21.5" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-mips64el@npm:0.21.5" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ppc64@npm:0.21.5" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-riscv64@npm:0.21.5" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-s390x@npm:0.21.5" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-x64@npm:0.21.5" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/netbsd-x64@npm:0.21.5" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/openbsd-x64@npm:0.21.5" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/sunos-x64@npm:0.21.5" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-arm64@npm:0.21.5" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-ia32@npm:0.21.5" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-x64@npm:0.21.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": + version: 4.4.1 + resolution: "@eslint-community/eslint-utils@npm:4.4.1" + dependencies: + eslint-visitor-keys: "npm:^3.4.3" + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 10c0/2aa0ac2fc50ff3f234408b10900ed4f1a0b19352f21346ad4cc3d83a1271481bdda11097baa45d484dd564c895e0762a27a8240be7a256b3ad47129e96528252 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.12.1": + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 10c0/a03d98c246bcb9109aec2c08e4d10c8d010256538dcb3f56610191607214523d4fb1b00aa81df830b6dffb74c5fa0be03642513a289c567949d3e550ca11cdf6 + languageName: node + linkType: hard + +"@eslint/config-array@npm:^0.18.0": + version: 0.18.0 + resolution: "@eslint/config-array@npm:0.18.0" + dependencies: + "@eslint/object-schema": "npm:^2.1.4" + debug: "npm:^4.3.1" + minimatch: "npm:^3.1.2" + checksum: 10c0/0234aeb3e6b052ad2402a647d0b4f8a6aa71524bafe1adad0b8db1dfe94d7f5f26d67c80f79bb37ac61361a1d4b14bb8fb475efe501de37263cf55eabb79868f + languageName: node + linkType: hard + +"@eslint/core@npm:^0.7.0": + version: 0.7.0 + resolution: "@eslint/core@npm:0.7.0" + checksum: 10c0/3cdee8bc6cbb96ac6103d3ead42e59830019435839583c9eb352b94ed558bd78e7ffad5286dc710df21ec1e7bd8f52aa6574c62457a4dd0f01f3736fa4a7d87a + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^3.1.0": + version: 3.1.0 + resolution: "@eslint/eslintrc@npm:3.1.0" + dependencies: + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^10.0.1" + globals: "npm:^14.0.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 10c0/5b7332ed781edcfc98caa8dedbbb843abfb9bda2e86538529c843473f580e40c69eb894410eddc6702f487e9ee8f8cfa8df83213d43a8fdb549f23ce06699167 + languageName: node + linkType: hard + +"@eslint/js@npm:9.14.0": + version: 9.14.0 + resolution: "@eslint/js@npm:9.14.0" + checksum: 10c0/a423dd435e10aa3b461599aa02f6cbadd4b5128cb122467ee4e2c798e7ca4f9bb1fce4dcea003b29b983090238cf120899c1af657cf86300b399e4f996b83ddc + languageName: node + linkType: hard + +"@eslint/object-schema@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/object-schema@npm:2.1.4" + checksum: 10c0/e9885532ea70e483fb007bf1275968b05bb15ebaa506d98560c41a41220d33d342e19023d5f2939fed6eb59676c1bda5c847c284b4b55fce521d282004da4dda + languageName: node + linkType: hard + +"@eslint/plugin-kit@npm:^0.2.0": + version: 0.2.2 + resolution: "@eslint/plugin-kit@npm:0.2.2" + dependencies: + levn: "npm:^0.4.1" + checksum: 10c0/ec533ccc99f2ab003d6f64495cff853730fb7d8bc0eaf031ffccc68de7c34c74a2eda50dfa759cacfb409f014c98d306714c995348d5383c9d3140f9f80a5895 + languageName: node + linkType: hard + +"@humanfs/core@npm:^0.19.1": + version: 0.19.1 + resolution: "@humanfs/core@npm:0.19.1" + checksum: 10c0/aa4e0152171c07879b458d0e8a704b8c3a89a8c0541726c6b65b81e84fd8b7564b5d6c633feadc6598307d34564bd53294b533491424e8e313d7ab6c7bc5dc67 + languageName: node + linkType: hard + +"@humanfs/node@npm:^0.16.6": + version: 0.16.6 + resolution: "@humanfs/node@npm:0.16.6" + dependencies: + "@humanfs/core": "npm:^0.19.1" + "@humanwhocodes/retry": "npm:^0.3.0" + checksum: 10c0/8356359c9f60108ec204cbd249ecd0356667359b2524886b357617c4a7c3b6aace0fd5a369f63747b926a762a88f8a25bc066fa1778508d110195ce7686243e1 + languageName: node + linkType: hard + +"@humanwhocodes/module-importer@npm:^1.0.1": + version: 1.0.1 + resolution: "@humanwhocodes/module-importer@npm:1.0.1" + checksum: 10c0/909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529 + languageName: node + linkType: hard + +"@humanwhocodes/retry@npm:^0.3.0": + version: 0.3.1 + resolution: "@humanwhocodes/retry@npm:0.3.1" + checksum: 10c0/f0da1282dfb45e8120480b9e2e275e2ac9bbe1cf016d046fdad8e27cc1285c45bb9e711681237944445157b430093412b4446c1ab3fc4bb037861b5904101d3b + languageName: node + linkType: hard + +"@humanwhocodes/retry@npm:^0.4.0": + version: 0.4.1 + resolution: "@humanwhocodes/retry@npm:0.4.1" + checksum: 10c0/be7bb6841c4c01d0b767d9bb1ec1c9359ee61421ce8ba66c249d035c5acdfd080f32d55a5c9e859cdd7868788b8935774f65b2caf24ec0b7bd7bf333791f063b + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e + languageName: node + linkType: hard + +"@jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.5 + resolution: "@jridgewell/gen-mapping@npm:0.3.5" + dependencies: + "@jridgewell/set-array": "npm:^1.2.1" + "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10c0/1be4fd4a6b0f41337c4f5fdf4afc3bd19e39c3691924817108b82ffcb9c9e609c273f936932b9fba4b3a298ce2eb06d9bff4eb1cc3bd81c4f4ee1b4917e25feb + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15, @jridgewell/sourcemap-codec@npm:^1.5.0": + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 10c0/732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 10c0/88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 + languageName: node + linkType: hard + +"@npmcli/agent@npm:^2.0.0": + version: 2.2.2 + resolution: "@npmcli/agent@npm:2.2.2" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.3" + checksum: 10c0/325e0db7b287d4154ecd164c0815c08007abfb07653cc57bceded17bb7fd240998a3cbdbe87d700e30bef494885eccc725ab73b668020811d56623d145b524ae + languageName: node + linkType: hard + +"@npmcli/fs@npm:^3.1.0": + version: 3.1.1 + resolution: "@npmcli/fs@npm:3.1.1" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/c37a5b4842bfdece3d14dfdb054f73fe15ed2d3da61b34ff76629fb5b1731647c49166fd2a8bf8b56fcfa51200382385ea8909a3cbecdad612310c114d3f6c99 + languageName: node + linkType: hard + +"@parcel/watcher-android-arm64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-android-arm64@npm:2.5.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-darwin-arm64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-darwin-arm64@npm:2.5.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-darwin-x64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-darwin-x64@npm:2.5.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher-freebsd-x64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-freebsd-x64@npm:2.5.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm-glibc@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm-glibc@npm:2.5.0" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm-musl@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm-musl@npm:2.5.0" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm64-glibc@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.5.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm64-musl@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-arm64-musl@npm:2.5.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-linux-x64-glibc@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-x64-glibc@npm:2.5.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-x64-musl@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-linux-x64-musl@npm:2.5.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-win32-arm64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-win32-arm64@npm:2.5.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-win32-ia32@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-win32-ia32@npm:2.5.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@parcel/watcher-win32-x64@npm:2.5.0": + version: 2.5.0 + resolution: "@parcel/watcher-win32-x64@npm:2.5.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher@npm:^2.4.1": + version: 2.5.0 + resolution: "@parcel/watcher@npm:2.5.0" + dependencies: + "@parcel/watcher-android-arm64": "npm:2.5.0" + "@parcel/watcher-darwin-arm64": "npm:2.5.0" + "@parcel/watcher-darwin-x64": "npm:2.5.0" + "@parcel/watcher-freebsd-x64": "npm:2.5.0" + "@parcel/watcher-linux-arm-glibc": "npm:2.5.0" + "@parcel/watcher-linux-arm-musl": "npm:2.5.0" + "@parcel/watcher-linux-arm64-glibc": "npm:2.5.0" + "@parcel/watcher-linux-arm64-musl": "npm:2.5.0" + "@parcel/watcher-linux-x64-glibc": "npm:2.5.0" + "@parcel/watcher-linux-x64-musl": "npm:2.5.0" + "@parcel/watcher-win32-arm64": "npm:2.5.0" + "@parcel/watcher-win32-ia32": "npm:2.5.0" + "@parcel/watcher-win32-x64": "npm:2.5.0" + detect-libc: "npm:^1.0.3" + is-glob: "npm:^4.0.3" + micromatch: "npm:^4.0.5" + node-addon-api: "npm:^7.0.0" + node-gyp: "npm:latest" + dependenciesMeta: + "@parcel/watcher-android-arm64": + optional: true + "@parcel/watcher-darwin-arm64": + optional: true + "@parcel/watcher-darwin-x64": + optional: true + "@parcel/watcher-freebsd-x64": + optional: true + "@parcel/watcher-linux-arm-glibc": + optional: true + "@parcel/watcher-linux-arm-musl": + optional: true + "@parcel/watcher-linux-arm64-glibc": + optional: true + "@parcel/watcher-linux-arm64-musl": + optional: true + "@parcel/watcher-linux-x64-glibc": + optional: true + "@parcel/watcher-linux-x64-musl": + optional: true + "@parcel/watcher-win32-arm64": + optional: true + "@parcel/watcher-win32-ia32": + optional: true + "@parcel/watcher-win32-x64": + optional: true + checksum: 10c0/9bad727d8b11e5d150ec47459254544c583adaa47d047b8ef65e1c74aede1a0767dc7fc6b8997649dae07318d6ef39caba6a1c405d306398d5bcd47074ec5d29 + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd + languageName: node + linkType: hard + +"@polka/url@npm:^1.0.0-next.24": + version: 1.0.0-next.28 + resolution: "@polka/url@npm:1.0.0-next.28" + checksum: 10c0/acc5ea62597e4da2fb42dbee02749d07f102ae7d6d2c966bf7e423c79cd65d1621da305af567e6e7c232f3b565e242d1ec932cbb3dcc0db1508d02e9a2cafa2e + languageName: node + linkType: hard + +"@popperjs/core@npm:^2.11.8": + version: 2.11.8 + resolution: "@popperjs/core@npm:2.11.8" + checksum: 10c0/4681e682abc006d25eb380d0cf3efc7557043f53b6aea7a5057d0d1e7df849a00e281cd8ea79c902a35a414d7919621fc2ba293ecec05f413598e0b23d5a1e63 + languageName: node + linkType: hard + +"@rollup/rollup-android-arm-eabi@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.26.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@rollup/rollup-android-arm64@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-android-arm64@npm:4.26.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-arm64@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-darwin-arm64@npm:4.26.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-x64@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-darwin-x64@npm:4.26.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-arm64@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.26.0" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-x64@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-freebsd-x64@npm:4.26.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.26.0" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-musleabihf@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.26.0" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-gnu@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.26.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-musl@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.26.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.26.0" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-gnu@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.26.0" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-s390x-gnu@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.26.0" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-gnu@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.26.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-musl@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.26.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.26.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-ia32-msvc@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.26.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.26.0": + version: 4.26.0 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.26.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@sveltejs/adapter-static@npm:^3.0.5": + version: 3.0.6 + resolution: "@sveltejs/adapter-static@npm:3.0.6" + peerDependencies: + "@sveltejs/kit": ^2.0.0 + checksum: 10c0/39fa8be56a9acf468d25d1d7608f3b89541a471afd6021ba627bc228e929cbe1f0c1c6c75e9e1da27e0873c4cd38d189833f4966b708780dae4f3e5e2faf7833 + languageName: node + linkType: hard + +"@sveltejs/kit@npm:^2.0.0": + version: 2.8.0 + resolution: "@sveltejs/kit@npm:2.8.0" + dependencies: + "@types/cookie": "npm:^0.6.0" + cookie: "npm:^0.6.0" + devalue: "npm:^5.1.0" + esm-env: "npm:^1.0.0" + import-meta-resolve: "npm:^4.1.0" + kleur: "npm:^4.1.5" + magic-string: "npm:^0.30.5" + mrmime: "npm:^2.0.0" + sade: "npm:^1.8.1" + set-cookie-parser: "npm:^2.6.0" + sirv: "npm:^3.0.0" + tiny-glob: "npm:^0.2.9" + peerDependencies: + "@sveltejs/vite-plugin-svelte": ^3.0.0 || ^4.0.0-next.1 + svelte: ^4.0.0 || ^5.0.0-next.0 + vite: ^5.0.3 + bin: + svelte-kit: svelte-kit.js + checksum: 10c0/f4fdad81bf5f8f645eed21ffd7015b14c76481b4df054f7dc16ab6bb6a32dc0c9fd28790a7da3e3e3a0b9860e6405cbd082df8cc689694f09bef30659c47cc23 + languageName: node + linkType: hard + +"@sveltejs/vite-plugin-svelte-inspector@npm:^2.1.0": + version: 2.1.0 + resolution: "@sveltejs/vite-plugin-svelte-inspector@npm:2.1.0" + dependencies: + debug: "npm:^4.3.4" + peerDependencies: + "@sveltejs/vite-plugin-svelte": ^3.0.0 + svelte: ^4.0.0 || ^5.0.0-next.0 + vite: ^5.0.0 + checksum: 10c0/da2d161691958bcb83d72634bd7d259fa07553af3cf71c2b9959feeccd6a9c58b08495cc5a936f6f0f5deb21aec4ad8b54ef8d9530510d2826548b4d19275b08 + languageName: node + linkType: hard + +"@sveltejs/vite-plugin-svelte@npm:3": + version: 3.1.2 + resolution: "@sveltejs/vite-plugin-svelte@npm:3.1.2" + dependencies: + "@sveltejs/vite-plugin-svelte-inspector": "npm:^2.1.0" + debug: "npm:^4.3.4" + deepmerge: "npm:^4.3.1" + kleur: "npm:^4.1.5" + magic-string: "npm:^0.30.10" + svelte-hmr: "npm:^0.16.0" + vitefu: "npm:^0.2.5" + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + vite: ^5.0.0 + checksum: 10c0/b15a82fc41ddd7983d7e130bedfc1c292c8a183677b78c5edd683d2f2df6cd2b1316e19958ab8c888031ca5941058f4475a16950ff1428ac7989c0b679987b36 + languageName: node + linkType: hard + +"@sveltestrap/sveltestrap@npm:^6.2.7": + version: 6.2.7 + resolution: "@sveltestrap/sveltestrap@npm:6.2.7" + dependencies: + "@popperjs/core": "npm:^2.11.8" + peerDependencies: + svelte: ^4.0.0 || ^5.0.0 || ^5.0.0-next.0 + checksum: 10c0/7336d5009abcbf69f3126a2449bf011f83f10cca2ea27d780ea9032930b499cf67b4c9498e44983763720a38c4382df3eafb80a659c488bfbbed3186bf7f8d4b + languageName: node + linkType: hard + +"@types/cookie@npm:^0.6.0": + version: 0.6.0 + resolution: "@types/cookie@npm:0.6.0" + checksum: 10c0/5b326bd0188120fb32c0be086b141b1481fec9941b76ad537f9110e10d61ee2636beac145463319c71e4be67a17e85b81ca9e13ceb6e3bb63b93d16824d6c149 + languageName: node + linkType: hard + +"@types/eslint@npm:^9.6.0": + version: 9.6.1 + resolution: "@types/eslint@npm:9.6.1" + dependencies: + "@types/estree": "npm:*" + "@types/json-schema": "npm:*" + checksum: 10c0/69ba24fee600d1e4c5abe0df086c1a4d798abf13792d8cfab912d76817fe1a894359a1518557d21237fbaf6eda93c5ab9309143dee4c59ef54336d1b3570420e + languageName: node + linkType: hard + +"@types/estree@npm:*, @types/estree@npm:1.0.6, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.1, @types/estree@npm:^1.0.6": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a + languageName: node + linkType: hard + +"@types/file-saver@npm:^2.0.7": + version: 2.0.7 + resolution: "@types/file-saver@npm:2.0.7" + checksum: 10c0/c6b88a1aea8eec58469da2a90828fef6e9d5d590c7094fb959783d7c32878af80d39439734f3d41b78355dadb507f606e3d04a29a160c85411c65251e58df847 + languageName: node + linkType: hard + +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.15": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db + languageName: node + linkType: hard + +"@types/luxon@npm:^3.4.2": + version: 3.4.2 + resolution: "@types/luxon@npm:3.4.2" + checksum: 10c0/d835467de3daf7e17ba78b50bb5a14efd94272439ca067990d71332a54b311544459c69623eddd243b511b28d70194c9591a9ee8cf9c038962c965f991affd7e + languageName: node + linkType: hard + +"@typescript-eslint/eslint-plugin@npm:8.14.0": + version: 8.14.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.14.0" + dependencies: + "@eslint-community/regexpp": "npm:^4.10.0" + "@typescript-eslint/scope-manager": "npm:8.14.0" + "@typescript-eslint/type-utils": "npm:8.14.0" + "@typescript-eslint/utils": "npm:8.14.0" + "@typescript-eslint/visitor-keys": "npm:8.14.0" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.3.1" + natural-compare: "npm:^1.4.0" + ts-api-utils: "npm:^1.3.0" + peerDependencies: + "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/46c82eb45be82ffec0ab04728a5180691b1d17002c669864861a3044b6d2105a75ca23cc80d18721b40b5e7dff1eff4ed68a43d726e25d55f3e466a9fbeeb873 + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:8.14.0": + version: 8.14.0 + resolution: "@typescript-eslint/parser@npm:8.14.0" + dependencies: + "@typescript-eslint/scope-manager": "npm:8.14.0" + "@typescript-eslint/types": "npm:8.14.0" + "@typescript-eslint/typescript-estree": "npm:8.14.0" + "@typescript-eslint/visitor-keys": "npm:8.14.0" + debug: "npm:^4.3.4" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/522b7afd25cd302c0510cc71985ba55ff92ecc5dbe3fc74a76fefea0169252fdd4b8cad6291fef05f63dfc173951af450dca20859c7f23e387b2e7410e8b97b1 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:8.14.0": + version: 8.14.0 + resolution: "@typescript-eslint/scope-manager@npm:8.14.0" + dependencies: + "@typescript-eslint/types": "npm:8.14.0" + "@typescript-eslint/visitor-keys": "npm:8.14.0" + checksum: 10c0/1e1295c6f9febadf63559aad328b23d960510ce6b4c9f74e10d881c3858fa7f1db767cd1af5272d2fe7c9c5c7daebee71854e6f841e413e5d70af282f6616e26 + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:8.14.0": + version: 8.14.0 + resolution: "@typescript-eslint/type-utils@npm:8.14.0" + dependencies: + "@typescript-eslint/typescript-estree": "npm:8.14.0" + "@typescript-eslint/utils": "npm:8.14.0" + debug: "npm:^4.3.4" + ts-api-utils: "npm:^1.3.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/42616a664b38ca418e13504247e5e1bad6ae85c045b48e5735ffab977d4bd58cc86fb9d2292bbb314fa408d78d4b0454c3a27dbf9f881f9921917a942825c806 + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:8.14.0": + version: 8.14.0 + resolution: "@typescript-eslint/types@npm:8.14.0" + checksum: 10c0/7707f900e24e60e6780c5705f69627b7c0ef912cb3b095dfc8f4a0c84e866c66b1c4c10278cf99724560dc66985ec640750c4192786a09b853f9bb4c3ca5a7ce + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:8.14.0": + version: 8.14.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.14.0" + dependencies: + "@typescript-eslint/types": "npm:8.14.0" + "@typescript-eslint/visitor-keys": "npm:8.14.0" + debug: "npm:^4.3.4" + fast-glob: "npm:^3.3.2" + is-glob: "npm:^4.0.3" + minimatch: "npm:^9.0.4" + semver: "npm:^7.6.0" + ts-api-utils: "npm:^1.3.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/5e890d22bd067095f871cf144907a8c302db5b5f014c58906ad58d7f23569951cba805042eac6844744e5abb0d3648c9cc221a91b0703da0a8d6345dc1f83e74 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:8.14.0": + version: 8.14.0 + resolution: "@typescript-eslint/utils@npm:8.14.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.4.0" + "@typescript-eslint/scope-manager": "npm:8.14.0" + "@typescript-eslint/types": "npm:8.14.0" + "@typescript-eslint/typescript-estree": "npm:8.14.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + checksum: 10c0/1fcc2651d870832a799a5d1c85fc9421853508a006d6a6073c8316b012489dda77e123d13aea8f53eb9030a2da2c0eb273a6946a9941caa2519b99b33e89b720 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:8.14.0": + version: 8.14.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.14.0" + dependencies: + "@typescript-eslint/types": "npm:8.14.0" + eslint-visitor-keys: "npm:^3.4.3" + checksum: 10c0/d0faf70ed9ecff5e36694bbb161a90bea6db59e0e79a7d4f264d67d565c12b13733d664b736b2730935f013c87ce3155cea954a533d28e99987681bc5f6259c3 + languageName: node + linkType: hard + +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: 10c0/f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 + languageName: node + linkType: hard + +"acorn-jsx@npm:^5.3.2": + version: 5.3.2 + resolution: "acorn-jsx@npm:5.3.2" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10c0/4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 + languageName: node + linkType: hard + +"acorn@npm:^8.10.0, acorn@npm:^8.14.0, acorn@npm:^8.9.0": + version: 8.14.0 + resolution: "acorn@npm:8.14.0" + bin: + acorn: bin/acorn + checksum: 10c0/6d4ee461a7734b2f48836ee0fbb752903606e576cc100eb49340295129ca0b452f3ba91ddd4424a1d4406a98adfb2ebb6bd0ff4c49d7a0930c10e462719bbfd7 + languageName: node + linkType: hard + +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": + version: 7.1.1 + resolution: "agent-base@npm:7.1.1" + dependencies: + debug: "npm:^4.3.4" + checksum: 10c0/e59ce7bed9c63bf071a30cc471f2933862044c97fd9958967bfe22521d7a0f601ce4ed5a8c011799d0c726ca70312142ae193bbebb60f576b52be19d4a363b50 + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: "npm:^2.0.0" + indent-string: "npm:^4.0.0" + checksum: 10c0/a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 + languageName: node + linkType: hard + +"ajv@npm:^6.12.4": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: "npm:^3.1.1" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" + uri-js: "npm:^4.2.2" + checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.1.0 + resolution: "ansi-regex@npm:6.1.0" + checksum: 10c0/a91daeddd54746338478eef88af3439a7edf30f8e23196e2d6ed182da9add559c601266dbef01c2efa46a958ad6f1f8b176799657616c702b5b02e799e7fd8dc + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + languageName: node + linkType: hard + +"ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: "npm:~1.0.2" + checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de + languageName: node + linkType: hard + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e + languageName: node + linkType: hard + +"aria-query@npm:^5.3.0": + version: 5.3.2 + resolution: "aria-query@npm:5.3.2" + checksum: 10c0/003c7e3e2cff5540bf7a7893775fc614de82b0c5dde8ae823d47b7a28a9d4da1f7ed85f340bdb93d5649caa927755f0e31ecc7ab63edfdfc00c8ef07e505e03e + languageName: node + linkType: hard + +"axobject-query@npm:^4.0.0": + version: 4.1.0 + resolution: "axobject-query@npm:4.1.0" + checksum: 10c0/c470e4f95008f232eadd755b018cb55f16c03ccf39c027b941cd8820ac6b68707ce5d7368a46756db4256fbc91bb4ead368f84f7fb034b2b7932f082f6dc0775 + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee + languageName: node + linkType: hard + +"bootstrap@npm:^5.3.3": + version: 5.3.3 + resolution: "bootstrap@npm:5.3.3" + peerDependencies: + "@popperjs/core": ^2.11.8 + checksum: 10c0/bb68ca7b763977b9cce40cb5b8c676ae19a716d2f5d15009fa7bdbcec9dea426968e3cb748fbed7592fbf10edd7c749aea841c2920996a7c1aa5e0a6e2d4c2ad + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f + languageName: node + linkType: hard + +"braces@npm:^3.0.3": + version: 3.0.3 + resolution: "braces@npm:3.0.3" + dependencies: + fill-range: "npm:^7.1.1" + checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 + languageName: node + linkType: hard + +"cacache@npm:^18.0.0": + version: 18.0.4 + resolution: "cacache@npm:18.0.4" + dependencies: + "@npmcli/fs": "npm:^3.1.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^4.0.0" + ssri: "npm:^10.0.0" + tar: "npm:^6.1.11" + unique-filename: "npm:^3.0.0" + checksum: 10c0/6c055bafed9de4f3dcc64ac3dc7dd24e863210902b7c470eb9ce55a806309b3efff78033e3d8b4f7dcc5d467f2db43c6a2857aaaf26f0094b8a351d44c42179f + languageName: node + linkType: hard + +"callsites@npm:^3.0.0": + version: 3.1.0 + resolution: "callsites@npm:3.1.0" + checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 + languageName: node + linkType: hard + +"catalogger.frontend@workspace:.": + version: 0.0.0-use.local + resolution: "catalogger.frontend@workspace:." + dependencies: + "@sveltejs/adapter-static": "npm:^3.0.5" + "@sveltejs/kit": "npm:^2.0.0" + "@sveltejs/vite-plugin-svelte": "npm:3" + "@sveltestrap/sveltestrap": "npm:^6.2.7" + "@types/eslint": "npm:^9.6.0" + "@types/file-saver": "npm:^2.0.7" + "@types/luxon": "npm:^3.4.2" + bootstrap: "npm:^5.3.3" + eslint: "npm:^9.0.0" + eslint-config-prettier: "npm:^9.1.0" + eslint-plugin-svelte: "npm:^2.36.0" + file-saver: "npm:^2.0.5" + globals: "npm:^15.0.0" + luxon: "npm:^3.5.0" + marked: "npm:^14.1.3" + prettier: "npm:^3.1.1" + prettier-plugin-svelte: "npm:^3.1.2" + sass: "npm:^1.80.1" + snarkdown: "npm:^2.0.0" + svelecte: "npm:^4.3.1" + svelte: "npm:4" + svelte-check: "npm:^4.0.0" + typescript: "npm:^5.0.0" + typescript-eslint: "npm:^8.0.0" + vite: "npm:^5.0.3" + vite-plugin-markdown: "npm:^2.2.0" + languageName: unknown + linkType: soft + +"chalk@npm:^4.0.0": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 + languageName: node + linkType: hard + +"chokidar@npm:^4.0.0, chokidar@npm:^4.0.1": + version: 4.0.1 + resolution: "chokidar@npm:4.0.1" + dependencies: + readdirp: "npm:^4.0.1" + checksum: 10c0/4bb7a3adc304059810bb6c420c43261a15bb44f610d77c35547addc84faa0374265c3adc67f25d06f363d9a4571962b02679268c40de07676d260de1986efea9 + languageName: node + linkType: hard + +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: 10c0/594754e1303672171cc04e50f6c398ae16128eb134a88f801bf5354fd96f205320f23536a045d9abd8b51024a149696e51231565891d4efdab8846021ecf88e6 + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 10c0/1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 + languageName: node + linkType: hard + +"code-red@npm:^1.0.3": + version: 1.0.4 + resolution: "code-red@npm:1.0.4" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.4.15" + "@types/estree": "npm:^1.0.1" + acorn: "npm:^8.10.0" + estree-walker: "npm:^3.0.3" + periscopic: "npm:^3.1.0" + checksum: 10c0/1309f062369ae520c422d7f45b93190faea2cbc7e3fe3375918f36bb394030d0936d940601426564c30abc71b8aa8e6d1505cccd67a8620183fb01c84bcb7304 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: "npm:~1.1.4" + checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f + languageName: node + linkType: hard + +"cookie@npm:^0.6.0": + version: 0.6.0 + resolution: "cookie@npm:0.6.0" + checksum: 10c0/f2318b31af7a31b4ddb4a678d024514df5e705f9be5909a192d7f116cfb6d45cbacf96a473fa733faa95050e7cff26e7832bb3ef94751592f1387b71c8956686 + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2": + version: 7.0.5 + resolution: "cross-spawn@npm:7.0.5" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10c0/aa82ce7ac0814a27e6f2b738c5a7cf1fa21a3558a1e42df449fc96541ba3ba731e4d3ecffa4435348808a86212f287c6f20a1ee551ef1ff95d01cfec5f434944 + languageName: node + linkType: hard + +"css-tree@npm:^2.3.1": + version: 2.3.1 + resolution: "css-tree@npm:2.3.1" + dependencies: + mdn-data: "npm:2.0.30" + source-map-js: "npm:^1.0.1" + checksum: 10c0/6f8c1a11d5e9b14bf02d10717fc0351b66ba12594166f65abfbd8eb8b5b490dd367f5c7721db241a3c792d935fc6751fbc09f7e1598d421477ad9fadc30f4f24 + languageName: node + linkType: hard + +"cssesc@npm:^3.0.0": + version: 3.0.0 + resolution: "cssesc@npm:3.0.0" + bin: + cssesc: bin/cssesc + checksum: 10c0/6bcfd898662671be15ae7827120472c5667afb3d7429f1f917737f3bf84c4176003228131b643ae74543f17a394446247df090c597bb9a728cce298606ed0aa7 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4": + version: 4.3.7 + resolution: "debug@npm:4.3.7" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10c0/1471db19c3b06d485a622d62f65947a19a23fbd0dd73f7fd3eafb697eec5360cde447fb075919987899b1a2096e85d35d4eb5a4de09a57600ac9cf7e6c8e768b + languageName: node + linkType: hard + +"deep-is@npm:^0.1.3": + version: 0.1.4 + resolution: "deep-is@npm:0.1.4" + checksum: 10c0/7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c + languageName: node + linkType: hard + +"deepmerge@npm:^4.3.1": + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 10c0/e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 + languageName: node + linkType: hard + +"detect-libc@npm:^1.0.3": + version: 1.0.3 + resolution: "detect-libc@npm:1.0.3" + bin: + detect-libc: ./bin/detect-libc.js + checksum: 10c0/4da0deae9f69e13bc37a0902d78bf7169480004b1fed3c19722d56cff578d16f0e11633b7fbf5fb6249181236c72e90024cbd68f0b9558ae06e281f47326d50d + languageName: node + linkType: hard + +"devalue@npm:^5.1.0": + version: 5.1.1 + resolution: "devalue@npm:5.1.1" + checksum: 10c0/f6717a856fd54216959abd341cb189e47a9b37d72d8419e055ae77567ff4ed0fb683b1ffb6a71067f645adae5991bffabe6468a3e2385937bff49273e71c1f51 + languageName: node + linkType: hard + +"dom-serializer@npm:^1.0.1": + version: 1.4.1 + resolution: "dom-serializer@npm:1.4.1" + dependencies: + domelementtype: "npm:^2.0.1" + domhandler: "npm:^4.2.0" + entities: "npm:^2.0.0" + checksum: 10c0/67d775fa1ea3de52035c98168ddcd59418356943b5eccb80e3c8b3da53adb8e37edb2cc2f885802b7b1765bf5022aec21dfc32910d7f9e6de4c3148f095ab5e0 + languageName: node + linkType: hard + +"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0": + version: 2.3.0 + resolution: "domelementtype@npm:2.3.0" + checksum: 10c0/686f5a9ef0fff078c1412c05db73a0dce096190036f33e400a07e2a4518e9f56b1e324f5c576a0a747ef0e75b5d985c040b0d51945ce780c0dd3c625a18cd8c9 + languageName: node + linkType: hard + +"domhandler@npm:^4.0.0, domhandler@npm:^4.2.0": + version: 4.3.1 + resolution: "domhandler@npm:4.3.1" + dependencies: + domelementtype: "npm:^2.2.0" + checksum: 10c0/5c199c7468cb052a8b5ab80b13528f0db3d794c64fc050ba793b574e158e67c93f8336e87fd81e9d5ee43b0e04aea4d8b93ed7be4899cb726a1601b3ba18538b + languageName: node + linkType: hard + +"domutils@npm:^2.5.2": + version: 2.8.0 + resolution: "domutils@npm:2.8.0" + dependencies: + dom-serializer: "npm:^1.0.1" + domelementtype: "npm:^2.2.0" + domhandler: "npm:^4.2.0" + checksum: 10c0/d58e2ae01922f0dd55894e61d18119924d88091837887bf1438f2327f32c65eb76426bd9384f81e7d6dcfb048e0f83c19b222ad7101176ad68cdc9c695b563db + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: "npm:^0.6.2" + checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 + languageName: node + linkType: hard + +"entities@npm:^2.0.0": + version: 2.2.0 + resolution: "entities@npm:2.2.0" + checksum: 10c0/7fba6af1f116300d2ba1c5673fc218af1961b20908638391b4e1e6d5850314ee2ac3ec22d741b3a8060479911c99305164aed19b6254bde75e7e6b1b2c3f3aa3 + languageName: node + linkType: hard + +"entities@npm:~2.1.0": + version: 2.1.0 + resolution: "entities@npm:2.1.0" + checksum: 10c0/dd96ed95f7e017b7fbbcdd39bd6dc3dea6638f747c00610b53f23ea461ac409af87670f313805d85854bfce04f96e17d83575f75b3b2920365d78678ccd2a405 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 + languageName: node + linkType: hard + +"esbuild@npm:^0.21.3": + version: 0.21.5 + resolution: "esbuild@npm:0.21.5" + dependencies: + "@esbuild/aix-ppc64": "npm:0.21.5" + "@esbuild/android-arm": "npm:0.21.5" + "@esbuild/android-arm64": "npm:0.21.5" + "@esbuild/android-x64": "npm:0.21.5" + "@esbuild/darwin-arm64": "npm:0.21.5" + "@esbuild/darwin-x64": "npm:0.21.5" + "@esbuild/freebsd-arm64": "npm:0.21.5" + "@esbuild/freebsd-x64": "npm:0.21.5" + "@esbuild/linux-arm": "npm:0.21.5" + "@esbuild/linux-arm64": "npm:0.21.5" + "@esbuild/linux-ia32": "npm:0.21.5" + "@esbuild/linux-loong64": "npm:0.21.5" + "@esbuild/linux-mips64el": "npm:0.21.5" + "@esbuild/linux-ppc64": "npm:0.21.5" + "@esbuild/linux-riscv64": "npm:0.21.5" + "@esbuild/linux-s390x": "npm:0.21.5" + "@esbuild/linux-x64": "npm:0.21.5" + "@esbuild/netbsd-x64": "npm:0.21.5" + "@esbuild/openbsd-x64": "npm:0.21.5" + "@esbuild/sunos-x64": "npm:0.21.5" + "@esbuild/win32-arm64": "npm:0.21.5" + "@esbuild/win32-ia32": "npm:0.21.5" + "@esbuild/win32-x64": "npm:0.21.5" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/fa08508adf683c3f399e8a014a6382a6b65542213431e26206c0720e536b31c09b50798747c2a105a4bbba1d9767b8d3615a74c2f7bf1ddf6d836cd11eb672de + languageName: node + linkType: hard + +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 + languageName: node + linkType: hard + +"eslint-compat-utils@npm:^0.5.1": + version: 0.5.1 + resolution: "eslint-compat-utils@npm:0.5.1" + dependencies: + semver: "npm:^7.5.4" + peerDependencies: + eslint: ">=6.0.0" + checksum: 10c0/325e815205fab70ebcd379f6d4b5d44c7d791bb8dfe0c9888233f30ebabd9418422595b53a781b946c768d9244d858540e5e6129a6b3dd6d606f467d599edc6c + languageName: node + linkType: hard + +"eslint-config-prettier@npm:^9.1.0": + version: 9.1.0 + resolution: "eslint-config-prettier@npm:9.1.0" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 10c0/6d332694b36bc9ac6fdb18d3ca2f6ac42afa2ad61f0493e89226950a7091e38981b66bac2b47ba39d15b73fff2cd32c78b850a9cf9eed9ca9a96bfb2f3a2f10d + languageName: node + linkType: hard + +"eslint-plugin-svelte@npm:^2.36.0": + version: 2.46.0 + resolution: "eslint-plugin-svelte@npm:2.46.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.4.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.15" + eslint-compat-utils: "npm:^0.5.1" + esutils: "npm:^2.0.3" + known-css-properties: "npm:^0.35.0" + postcss: "npm:^8.4.38" + postcss-load-config: "npm:^3.1.4" + postcss-safe-parser: "npm:^6.0.0" + postcss-selector-parser: "npm:^6.1.0" + semver: "npm:^7.6.2" + svelte-eslint-parser: "npm:^0.43.0" + peerDependencies: + eslint: ^7.0.0 || ^8.0.0-0 || ^9.0.0-0 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + checksum: 10c0/4d484183e29e6e6d2c85e91672e024b88b31d1bf98476e40379577b2e6c1d93f8676df11a4210864260fd7f23d14a1b7e80bb4a6bfba31324b78d88ee13cb81f + languageName: node + linkType: hard + +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 10c0/613c267aea34b5a6d6c00514e8545ef1f1433108097e857225fed40d397dd6b1809dffd11c2fde23b37ca53d7bf935fe04d2a18e6fc932b31837b6ad67e1c116 + languageName: node + linkType: hard + +"eslint-scope@npm:^8.2.0": + version: 8.2.0 + resolution: "eslint-scope@npm:8.2.0" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 10c0/8d2d58e2136d548ac7e0099b1a90d9fab56f990d86eb518de1247a7066d38c908be2f3df477a79cf60d70b30ba18735d6c6e70e9914dca2ee515a729975d70d6 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^4.2.0": + version: 4.2.0 + resolution: "eslint-visitor-keys@npm:4.2.0" + checksum: 10c0/2ed81c663b147ca6f578312919483eb040295bbab759e5a371953456c636c5b49a559883e2677112453728d66293c0a4c90ab11cab3428cf02a0236d2e738269 + languageName: node + linkType: hard + +"eslint@npm:^9.0.0": + version: 9.14.0 + resolution: "eslint@npm:9.14.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.12.1" + "@eslint/config-array": "npm:^0.18.0" + "@eslint/core": "npm:^0.7.0" + "@eslint/eslintrc": "npm:^3.1.0" + "@eslint/js": "npm:9.14.0" + "@eslint/plugin-kit": "npm:^0.2.0" + "@humanfs/node": "npm:^0.16.6" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@humanwhocodes/retry": "npm:^0.4.0" + "@types/estree": "npm:^1.0.6" + "@types/json-schema": "npm:^7.0.15" + ajv: "npm:^6.12.4" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.2" + debug: "npm:^4.3.2" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^8.2.0" + eslint-visitor-keys: "npm:^4.2.0" + espree: "npm:^10.3.0" + esquery: "npm:^1.5.0" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^8.0.0" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + ignore: "npm:^5.2.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.3" + text-table: "npm:^0.2.0" + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true + bin: + eslint: bin/eslint.js + checksum: 10c0/e1cbf571b75519ad0b24c27e66a6575e57cab2671ef5296e7b345d9ac3adc1a549118dcc74a05b651a7a13a5e61ebb680be6a3e04a80e1f22eba1931921b5187 + languageName: node + linkType: hard + +"esm-env@npm:^1.0.0": + version: 1.1.4 + resolution: "esm-env@npm:1.1.4" + checksum: 10c0/bc6f24faf0022e0ec98a4747616f4d38f7db371609edc081f584b711d55167b0d9aa2e068badc49621a16df73488786a36bc67f2fbcfb319cc002f908e8eda0f + languageName: node + linkType: hard + +"espree@npm:^10.0.1, espree@npm:^10.3.0": + version: 10.3.0 + resolution: "espree@npm:10.3.0" + dependencies: + acorn: "npm:^8.14.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^4.2.0" + checksum: 10c0/272beeaca70d0a1a047d61baff64db04664a33d7cfb5d144f84bc8a5c6194c6c8ebe9cc594093ca53add88baa23e59b01e69e8a0160ab32eac570482e165c462 + languageName: node + linkType: hard + +"espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" + dependencies: + acorn: "npm:^8.9.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 10c0/1a2e9b4699b715347f62330bcc76aee224390c28bb02b31a3752e9d07549c473f5f986720483c6469cf3cfb3c9d05df612ffc69eb1ee94b54b739e67de9bb460 + languageName: node + linkType: hard + +"esprima@npm:^4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 + languageName: node + linkType: hard + +"esquery@npm:^1.5.0": + version: 1.6.0 + resolution: "esquery@npm:1.6.0" + dependencies: + estraverse: "npm:^5.1.0" + checksum: 10c0/cb9065ec605f9da7a76ca6dadb0619dfb611e37a81e318732977d90fab50a256b95fee2d925fba7c2f3f0523aa16f91587246693bc09bc34d5a59575fe6e93d2 + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: "npm:^5.2.0" + checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 + languageName: node + linkType: hard + +"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 + languageName: node + linkType: hard + +"estree-walker@npm:^3.0.0, estree-walker@npm:^3.0.3": + version: 3.0.3 + resolution: "estree-walker@npm:3.0.3" + dependencies: + "@types/estree": "npm:^1.0.0" + checksum: 10c0/c12e3c2b2642d2bcae7d5aa495c60fa2f299160946535763969a1c83fc74518ffa9c2cd3a8b69ac56aea547df6a8aac25f729a342992ef0bbac5f1c73e78995d + languageName: node + linkType: hard + +"esutils@npm:^2.0.2, esutils@npm:^2.0.3": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 10c0/160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 + languageName: node + linkType: hard + +"fast-glob@npm:^3.3.2": + version: 3.3.2 + resolution: "fast-glob@npm:3.3.2" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.4" + checksum: 10c0/42baad7b9cd40b63e42039132bde27ca2cb3a4950d0a0f9abe4639ea1aa9d3e3b40f98b1fe31cbc0cc17b664c9ea7447d911a152fa34ec5b72977b125a6fc845 + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b + languageName: node + linkType: hard + +"fast-levenshtein@npm:^2.0.6": + version: 2.0.6 + resolution: "fast-levenshtein@npm:2.0.6" + checksum: 10c0/111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.17.1 + resolution: "fastq@npm:1.17.1" + dependencies: + reusify: "npm:^1.0.4" + checksum: 10c0/1095f16cea45fb3beff558bb3afa74ca7a9250f5a670b65db7ed585f92b4b48381445cd328b3d87323da81e43232b5d5978a8201bde84e0cd514310f1ea6da34 + languageName: node + linkType: hard + +"fdir@npm:^6.2.0": + version: 6.4.2 + resolution: "fdir@npm:6.4.2" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: 10c0/34829886f34a3ca4170eca7c7180ec4de51a3abb4d380344063c0ae2e289b11d2ba8b724afee974598c83027fea363ff598caf2b51bc4e6b1e0d8b80cc530573 + languageName: node + linkType: hard + +"file-entry-cache@npm:^8.0.0": + version: 8.0.0 + resolution: "file-entry-cache@npm:8.0.0" + dependencies: + flat-cache: "npm:^4.0.0" + checksum: 10c0/9e2b5938b1cd9b6d7e3612bdc533afd4ac17b2fc646569e9a8abbf2eb48e5eb8e316bc38815a3ef6a1b456f4107f0d0f055a614ca613e75db6bf9ff4d72c1638 + languageName: node + linkType: hard + +"file-saver@npm:^2.0.5": + version: 2.0.5 + resolution: "file-saver@npm:2.0.5" + checksum: 10c0/0a361f683786c34b2574aea53744cb70d0a6feb0fa5e3af00f2fcb6c9d40d3049cc1470e38c6c75df24219f247f6fb3076f86943958f580e62ee2ffe897af8b1 + languageName: node + linkType: hard + +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" + dependencies: + to-regex-range: "npm:^5.0.1" + checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 + languageName: node + linkType: hard + +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: "npm:^6.0.0" + path-exists: "npm:^4.0.0" + checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a + languageName: node + linkType: hard + +"flat-cache@npm:^4.0.0": + version: 4.0.1 + resolution: "flat-cache@npm:4.0.1" + dependencies: + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.4" + checksum: 10c0/2c59d93e9faa2523e4fda6b4ada749bed432cfa28c8e251f33b25795e426a1c6dbada777afb1f74fcfff33934fdbdea921ee738fcc33e71adc9d6eca984a1cfc + languageName: node + linkType: hard + +"flatted@npm:^3.2.9": + version: 3.3.1 + resolution: "flatted@npm:3.3.1" + checksum: 10c0/324166b125ee07d4ca9bcf3a5f98d915d5db4f39d711fba640a3178b959919aae1f7cfd8aabcfef5826ed8aa8a2aa14cc85b2d7d18ff638ddf4ae3df39573eaf + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.3.0 + resolution: "foreground-child@npm:3.3.0" + dependencies: + cross-spawn: "npm:^7.0.0" + signal-exit: "npm:^4.0.1" + checksum: 10c0/028f1d41000553fcfa6c4bb5c372963bf3d9bf0b1f25a87d1a6253014343fb69dfb1b42d9625d7cf44c8ba429940f3d0ff718b62105d4d4a4f6ef8ca0a53faa2 + languageName: node + linkType: hard + +"front-matter@npm:^4.0.0": + version: 4.0.2 + resolution: "front-matter@npm:4.0.2" + dependencies: + js-yaml: "npm:^3.13.1" + checksum: 10c0/7a0df5ca37428dd563c057bc17a8940481fe53876609bcdc443a02ce463c70f1842c7cb4628b80916de46a253732794b36fb6a31105db0f185698a93acee4011 + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/703d16522b8282d7299337539c3ed6edddd1afe82435e4f5b76e34a79cd74e488a8a0e26a636afc2440e1a23b03878e2122e3a2cfe375a5cf63c37d92b86a004 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 + languageName: node + linkType: hard + +"fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: "npm:^4.0.1" + checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee + languageName: node + linkType: hard + +"glob-parent@npm:^6.0.2": + version: 6.0.2 + resolution: "glob-parent@npm:6.0.2" + dependencies: + is-glob: "npm:^4.0.3" + checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 + languageName: node + linkType: hard + +"glob@npm:^10.2.2, glob@npm:^10.3.10": + version: 10.4.5 + resolution: "glob@npm:10.4.5" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^3.1.2" + minimatch: "npm:^9.0.4" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^1.11.1" + bin: + glob: dist/esm/bin.mjs + checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e + languageName: node + linkType: hard + +"globals@npm:^14.0.0": + version: 14.0.0 + resolution: "globals@npm:14.0.0" + checksum: 10c0/b96ff42620c9231ad468d4c58ff42afee7777ee1c963013ff8aabe095a451d0ceeb8dcd8ef4cbd64d2538cef45f787a78ba3a9574f4a634438963e334471302d + languageName: node + linkType: hard + +"globals@npm:^15.0.0": + version: 15.12.0 + resolution: "globals@npm:15.12.0" + checksum: 10c0/f34e0a1845b694f45188331742af9f488b07ba7440a06e9d2039fce0386fbbfc24afdbb9846ebdccd4092d03644e43081c49eb27b30f4b88e43af156e1c1dc34 + languageName: node + linkType: hard + +"globalyzer@npm:0.1.0": + version: 0.1.0 + resolution: "globalyzer@npm:0.1.0" + checksum: 10c0/e16e47a5835cbe8a021423d4c7fcd9f5f85815b4190a7f50c1fdb95fc559d72e4fb30be96f106c66a99413f36d72da0f8323d19d27f60a8feec9d936139ec5a8 + languageName: node + linkType: hard + +"globrex@npm:^0.1.2": + version: 0.1.2 + resolution: "globrex@npm:0.1.2" + checksum: 10c0/a54c029520cf58bda1d8884f72bd49b4cd74e977883268d931fd83bcbd1a9eb96d57c7dbd4ad80148fb9247467ebfb9b215630b2ed7563b2a8de02e1ff7f89d1 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.2.6": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + languageName: node + linkType: hard + +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: 10c0/e951259d8cd2e0d196c72ec711add7115d42eb9a8146c8eeda5b8d3ac91e5dd816b9cd68920726d9fd4490368e7ed86e9c423f40db87e2d8dfafa00fa17c3a31 + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 + languageName: node + linkType: hard + +"htmlparser2@npm:^6.0.0": + version: 6.1.0 + resolution: "htmlparser2@npm:6.1.0" + dependencies: + domelementtype: "npm:^2.0.1" + domhandler: "npm:^4.0.0" + domutils: "npm:^2.5.2" + entities: "npm:^2.0.0" + checksum: 10c0/3058499c95634f04dc66be8c2e0927cd86799413b2d6989d8ae542ca4dbf5fa948695d02c27d573acf44843af977aec6d9a7bdd0f6faa6b2d99e2a729b2a31b6 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.5 + resolution: "https-proxy-agent@npm:7.0.5" + dependencies: + agent-base: "npm:^7.0.2" + debug: "npm:4" + checksum: 10c0/2490e3acec397abeb88807db52cac59102d5ed758feee6df6112ab3ccd8325e8a1ce8bce6f4b66e5470eca102d31e425ace904242e4fa28dbe0c59c4bafa7b2c + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 + languageName: node + linkType: hard + +"ignore@npm:^5.2.0, ignore@npm:^5.3.1": + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 + languageName: node + linkType: hard + +"immutable@npm:^5.0.2": + version: 5.0.2 + resolution: "immutable@npm:5.0.2" + checksum: 10c0/0d97ad95384e49563b6ed68f90e5ea83c149fd96ff417fae8274e1c524e3ef800eb1a2e8009e29d9b8ffdf63affd7692f87c8af72714181aad8dca88747fb5ac + languageName: node + linkType: hard + +"import-fresh@npm:^3.2.1": + version: 3.3.0 + resolution: "import-fresh@npm:3.3.0" + dependencies: + parent-module: "npm:^1.0.0" + resolve-from: "npm:^4.0.0" + checksum: 10c0/7f882953aa6b740d1f0e384d0547158bc86efbf2eea0f1483b8900a6f65c5a5123c2cf09b0d542cc419d0b98a759ecaeb394237e97ea427f2da221dc3cd80cc3 + languageName: node + linkType: hard + +"import-meta-resolve@npm:^4.1.0": + version: 4.1.0 + resolution: "import-meta-resolve@npm:4.1.0" + checksum: 10c0/42f3284b0460635ddf105c4ad99c6716099c3ce76702602290ad5cbbcd295700cbc04e4bdf47bacf9e3f1a4cec2e1ff887dabc20458bef398f9de22ddff45ef5 + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 10c0/1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f + languageName: node + linkType: hard + +"ip-address@npm:^9.0.5": + version: 9.0.5 + resolution: "ip-address@npm:9.0.5" + dependencies: + jsbn: "npm:1.1.0" + sprintf-js: "npm:^1.1.3" + checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc + languageName: node + linkType: hard + +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: "npm:^2.1.1" + checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a + languageName: node + linkType: hard + +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 10c0/85fee098ae62ba6f1e24cf22678805473c7afd0fb3978a3aa260e354cb7bcb3a5806cf0a98403188465efedec41ab4348e8e4e79305d409601323855b3839d4d + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 + languageName: node + linkType: hard + +"is-reference@npm:^3.0.0, is-reference@npm:^3.0.1": + version: 3.0.3 + resolution: "is-reference@npm:3.0.3" + dependencies: + "@types/estree": "npm:^1.0.6" + checksum: 10c0/35edd284cfb4cd9e9f08973f20e276ec517eaca31f5f049598e97dbb2d05544973dde212dac30fddee5b420930bff365e2e67dcd1293d0866c6720377382e3e5 + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 + languageName: node + linkType: hard + +"jackspeak@npm:^3.1.2": + version: 3.4.3 + resolution: "jackspeak@npm:3.4.3" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 + languageName: node + linkType: hard + +"js-yaml@npm:^3.13.1": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b + languageName: node + linkType: hard + +"js-yaml@npm:^4.1.0": + version: 4.1.0 + resolution: "js-yaml@npm:4.1.0" + dependencies: + argparse: "npm:^2.0.1" + bin: + js-yaml: bin/js-yaml.js + checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f + languageName: node + linkType: hard + +"jsbn@npm:1.1.0": + version: 1.1.0 + resolution: "jsbn@npm:1.1.0" + checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 10c0/0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7 + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce + languageName: node + linkType: hard + +"json-stable-stringify-without-jsonify@npm:^1.0.1": + version: 1.0.1 + resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" + checksum: 10c0/cb168b61fd4de83e58d09aaa6425ef71001bae30d260e2c57e7d09a5fd82223e2f22a042dedaab8db23b7d9ae46854b08bb1f91675a8be11c5cffebef5fb66a5 + languageName: node + linkType: hard + +"keyv@npm:^4.5.4": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: "npm:3.0.1" + checksum: 10c0/aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e + languageName: node + linkType: hard + +"kleur@npm:^4.1.5": + version: 4.1.5 + resolution: "kleur@npm:4.1.5" + checksum: 10c0/e9de6cb49657b6fa70ba2d1448fd3d691a5c4370d8f7bbf1c2f64c24d461270f2117e1b0afe8cb3114f13bbd8e51de158c2a224953960331904e636a5e4c0f2a + languageName: node + linkType: hard + +"known-css-properties@npm:^0.35.0": + version: 0.35.0 + resolution: "known-css-properties@npm:0.35.0" + checksum: 10c0/04a4a2859d62670bb25b5b28091a1f03f6f0d3298a5ed3e7476397c5287b98c434f6dd9c004a0c67a53b7f21acc93f83c972e98c122f568d4d0bd21fd2b90fb6 + languageName: node + linkType: hard + +"levn@npm:^0.4.1": + version: 0.4.1 + resolution: "levn@npm:0.4.1" + dependencies: + prelude-ls: "npm:^1.2.1" + type-check: "npm:~0.4.0" + checksum: 10c0/effb03cad7c89dfa5bd4f6989364bfc79994c2042ec5966cb9b95990e2edee5cd8969ddf42616a0373ac49fac1403437deaf6e9050fbbaa3546093a59b9ac94e + languageName: node + linkType: hard + +"lilconfig@npm:^2.0.5": + version: 2.1.0 + resolution: "lilconfig@npm:2.1.0" + checksum: 10c0/64645641aa8d274c99338e130554abd6a0190533c0d9eb2ce7ebfaf2e05c7d9961f3ffe2bfa39efd3b60c521ba3dd24fa236fe2775fc38501bf82bf49d4678b8 + languageName: node + linkType: hard + +"linkify-it@npm:^3.0.1": + version: 3.0.3 + resolution: "linkify-it@npm:3.0.3" + dependencies: + uc.micro: "npm:^1.0.1" + checksum: 10c0/468cb4954f85cdfc16e169db89a42d65287e3f121a9448b29c3c00d64c6f5a8f4367bea3978ba9109a0e3a10b19d50632b983639f91b9be9f20d1f63a5ff5bc1 + languageName: node + linkType: hard + +"locate-character@npm:^3.0.0": + version: 3.0.0 + resolution: "locate-character@npm:3.0.0" + checksum: 10c0/9da917622395002eb1336fca8cbef1c19904e3dc0b3b8078abe8ff390106d947a86feccecd0346f0e0e19fa017623fb4ccb65263d72a76dfa36e20cc18766b6c + languageName: node + linkType: hard + +"locate-path@npm:^6.0.0": + version: 6.0.0 + resolution: "locate-path@npm:6.0.0" + dependencies: + p-locate: "npm:^5.0.0" + checksum: 10c0/d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 + languageName: node + linkType: hard + +"lodash.merge@npm:^4.6.2": + version: 4.6.2 + resolution: "lodash.merge@npm:4.6.2" + checksum: 10c0/402fa16a1edd7538de5b5903a90228aa48eb5533986ba7fa26606a49db2572bf414ff73a2c9f5d5fd36b31c46a5d5c7e1527749c07cbcf965ccff5fbdf32c506 + languageName: node + linkType: hard + +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": + version: 10.4.3 + resolution: "lru-cache@npm:10.4.3" + checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb + languageName: node + linkType: hard + +"luxon@npm:^3.5.0": + version: 3.5.0 + resolution: "luxon@npm:3.5.0" + checksum: 10c0/335789bba95077db831ef99894edadeb23023b3eb2137a1b56acd0d290082b691cf793143d69e30bc069ec95f0b49f36419f48e951c68014f19ffe12045e3494 + languageName: node + linkType: hard + +"magic-string@npm:^0.30.10, magic-string@npm:^0.30.4, magic-string@npm:^0.30.5": + version: 0.30.12 + resolution: "magic-string@npm:0.30.12" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.0" + checksum: 10c0/469f457d18af37dfcca8617086ea8a65bcd8b60ba8a1182cb024ce43e470ace3c9d1cb6bee58d3b311768fb16bc27bd50bdeebcaa63dadd0fd46cac4d2e11d5f + languageName: node + linkType: hard + +"make-fetch-happen@npm:^13.0.0": + version: 13.0.1 + resolution: "make-fetch-happen@npm:13.0.1" + dependencies: + "@npmcli/agent": "npm:^2.0.0" + cacache: "npm:^18.0.0" + http-cache-semantics: "npm:^4.1.1" + is-lambda: "npm:^1.0.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^3.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^0.6.3" + proc-log: "npm:^4.2.0" + promise-retry: "npm:^2.0.1" + ssri: "npm:^10.0.0" + checksum: 10c0/df5f4dbb6d98153b751bccf4dc4cc500de85a96a9331db9805596c46aa9f99d9555983954e6c1266d9f981ae37a9e4647f42b9a4bb5466f867f4012e582c9e7e + languageName: node + linkType: hard + +"markdown-it@npm:^12.0.0": + version: 12.3.2 + resolution: "markdown-it@npm:12.3.2" + dependencies: + argparse: "npm:^2.0.1" + entities: "npm:~2.1.0" + linkify-it: "npm:^3.0.1" + mdurl: "npm:^1.0.1" + uc.micro: "npm:^1.0.5" + bin: + markdown-it: bin/markdown-it.js + checksum: 10c0/7f97b924e6f90e2c5ccdfb486a19bd7885b938f568a86b527bf6f916a16b01a298e6739f86a99e77acb5e7c020f6c8b34bd726364179b3f820e48b2971a6450c + languageName: node + linkType: hard + +"marked@npm:^14.1.3": + version: 14.1.4 + resolution: "marked@npm:14.1.4" + bin: + marked: bin/marked.js + checksum: 10c0/7ccc4c9b58d430b68eb878133fc284235ef3022b1a465345d2464712bf7d47507203b54639826839b6cb8d8847cf46f2e382588b9e1fc1d98b657520e16bfa62 + languageName: node + linkType: hard + +"mdn-data@npm:2.0.30": + version: 2.0.30 + resolution: "mdn-data@npm:2.0.30" + checksum: 10c0/a2c472ea16cee3911ae742593715aa4c634eb3d4b9f1e6ada0902aa90df13dcbb7285d19435f3ff213ebaa3b2e0c0265c1eb0e3fb278fda7f8919f046a410cd9 + languageName: node + linkType: hard + +"mdurl@npm:^1.0.1": + version: 1.0.1 + resolution: "mdurl@npm:1.0.1" + checksum: 10c0/ea8534341eb002aaa532a722daef6074cd8ca66202e10a2b4cda46722c1ebdb1da92197ac300bc953d3ef1bf41cd6561ef2cc69d82d5d0237dae00d4a61a4eee + languageName: node + linkType: hard + +"merge2@npm:^1.3.0": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb + languageName: node + linkType: hard + +"micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": + version: 4.0.8 + resolution: "micromatch@npm:4.0.8" + dependencies: + braces: "npm:^3.0.3" + picomatch: "npm:^2.3.1" + checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 + languageName: node + linkType: hard + +"minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 + languageName: node + linkType: hard + +"minimatch@npm:^9.0.4": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed + languageName: node + linkType: hard + +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e + languageName: node + linkType: hard + +"minipass-fetch@npm:^3.0.0": + version: 3.0.5 + resolution: "minipass-fetch@npm:3.0.5" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^2.1.2" + dependenciesMeta: + encoding: + optional: true + checksum: 10c0/9d702d57f556274286fdd97e406fc38a2f5c8d15e158b498d7393b1105974b21249289ec571fa2b51e038a4872bfc82710111cf75fae98c662f3d6f95e72152b + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: "npm:^3.0.0" + checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: "npm:^4.0.0" + checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c + languageName: node + linkType: hard + +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: 10c0/a91d8043f691796a8ac88df039da19933ef0f633e3d7f0d35dcd5373af49131cf2399bfc355f41515dc495e3990369c3858cd319e5c2722b4753c90bf3152462 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 + languageName: node + linkType: hard + +"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: "npm:^3.0.0" + yallist: "npm:^4.0.0" + checksum: 10c0/64fae024e1a7d0346a1102bb670085b17b7f95bf6cfdf5b128772ec8faf9ea211464ea4add406a3a6384a7d87a0cd1a96263692134323477b4fb43659a6cab78 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: 10c0/46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf + languageName: node + linkType: hard + +"mri@npm:^1.1.0": + version: 1.2.0 + resolution: "mri@npm:1.2.0" + checksum: 10c0/a3d32379c2554cf7351db6237ddc18dc9e54e4214953f3da105b97dc3babe0deb3ffe99cf409b38ea47cc29f9430561ba6b53b24ab8f9ce97a4b50409e4a50e7 + languageName: node + linkType: hard + +"mrmime@npm:^2.0.0": + version: 2.0.0 + resolution: "mrmime@npm:2.0.0" + checksum: 10c0/312b35ed288986aec90955410b21ed7427fd1e4ee318cb5fc18765c8d029eeded9444faa46589e5b1ed6b35fb2054a802ac8dcb917ddf6b3e189cb3bf11a965c + languageName: node + linkType: hard + +"ms@npm:^2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 + languageName: node + linkType: hard + +"nanoid@npm:^3.3.7": + version: 3.3.7 + resolution: "nanoid@npm:3.3.7" + bin: + nanoid: bin/nanoid.cjs + checksum: 10c0/e3fb661aa083454f40500473bb69eedb85dc160e763150b9a2c567c7e9ff560ce028a9f833123b618a6ea742e311138b591910e795614a629029e86e180660f3 + languageName: node + linkType: hard + +"natural-compare@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare@npm:1.4.0" + checksum: 10c0/f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 + languageName: node + linkType: hard + +"negotiator@npm:^0.6.3": + version: 0.6.4 + resolution: "negotiator@npm:0.6.4" + checksum: 10c0/3e677139c7fb7628a6f36335bf11a885a62c21d5390204590a1a214a5631fcbe5ea74ef6a610b60afe84b4d975cbe0566a23f20ee17c77c73e74b80032108dea + languageName: node + linkType: hard + +"node-addon-api@npm:^7.0.0": + version: 7.1.1 + resolution: "node-addon-api@npm:7.1.1" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/fb32a206276d608037fa1bcd7e9921e177fe992fc610d098aa3128baca3c0050fc1e014fa007e9b3874cf865ddb4f5bd9f43ccb7cbbbe4efaff6a83e920b17e9 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 10.2.0 + resolution: "node-gyp@npm:10.2.0" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^13.0.0" + nopt: "npm:^7.0.0" + proc-log: "npm:^4.1.0" + semver: "npm:^7.3.5" + tar: "npm:^6.2.1" + which: "npm:^4.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: 10c0/00630d67dbd09a45aee0a5d55c05e3916ca9e6d427ee4f7bc392d2d3dc5fad7449b21fc098dd38260a53d9dcc9c879b36704a1994235d4707e7271af7e9a835b + languageName: node + linkType: hard + +"nopt@npm:^7.0.0": + version: 7.2.1 + resolution: "nopt@npm:7.2.1" + dependencies: + abbrev: "npm:^2.0.0" + bin: + nopt: bin/nopt.js + checksum: 10c0/a069c7c736767121242037a22a788863accfa932ab285a1eb569eb8cd534b09d17206f68c37f096ae785647435e0c5a5a0a67b42ec743e481a455e5ae6a6df81 + languageName: node + linkType: hard + +"optionator@npm:^0.9.3": + version: 0.9.4 + resolution: "optionator@npm:0.9.4" + dependencies: + deep-is: "npm:^0.1.3" + fast-levenshtein: "npm:^2.0.6" + levn: "npm:^0.4.1" + prelude-ls: "npm:^1.2.1" + type-check: "npm:^0.4.0" + word-wrap: "npm:^1.2.5" + checksum: 10c0/4afb687a059ee65b61df74dfe87d8d6815cd6883cb8b3d5883a910df72d0f5d029821f37025e4bccf4048873dbdb09acc6d303d27b8f76b1a80dd5a7d5334675 + languageName: node + linkType: hard + +"p-limit@npm:^3.0.2": + version: 3.1.0 + resolution: "p-limit@npm:3.1.0" + dependencies: + yocto-queue: "npm:^0.1.0" + checksum: 10c0/9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a + languageName: node + linkType: hard + +"p-locate@npm:^5.0.0": + version: 5.0.0 + resolution: "p-locate@npm:5.0.0" + dependencies: + p-limit: "npm:^3.0.2" + checksum: 10c0/2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a + languageName: node + linkType: hard + +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: "npm:^3.0.0" + checksum: 10c0/592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 + languageName: node + linkType: hard + +"package-json-from-dist@npm:^1.0.0": + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b + languageName: node + linkType: hard + +"parent-module@npm:^1.0.0": + version: 1.0.1 + resolution: "parent-module@npm:1.0.1" + dependencies: + callsites: "npm:^3.0.0" + checksum: 10c0/c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c + languageName: node + linkType: hard + +"path-scurry@npm:^1.11.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" + dependencies: + lru-cache: "npm:^10.2.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d + languageName: node + linkType: hard + +"periscopic@npm:^3.1.0": + version: 3.1.0 + resolution: "periscopic@npm:3.1.0" + dependencies: + "@types/estree": "npm:^1.0.0" + estree-walker: "npm:^3.0.0" + is-reference: "npm:^3.0.0" + checksum: 10c0/fb5ce7cd810c49254cdf1cd3892811e6dd1a1dfbdf5f10a0a33fb7141baac36443c4cad4f0e2b30abd4eac613f6ab845c2bc1b7ce66ae9694c7321e6ada5bd96 + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 + languageName: node + linkType: hard + +"picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be + languageName: node + linkType: hard + +"postcss-load-config@npm:^3.1.4": + version: 3.1.4 + resolution: "postcss-load-config@npm:3.1.4" + dependencies: + lilconfig: "npm:^2.0.5" + yaml: "npm:^1.10.2" + peerDependencies: + postcss: ">=8.0.9" + ts-node: ">=9.0.0" + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + checksum: 10c0/7d2cc6695c2fc063e4538316d651a687fdb55e48db453ff699de916a6ee55ab68eac2b120c28a6b8ca7aa746a588888351b810a215b5cd090eabea62c5762ede + languageName: node + linkType: hard + +"postcss-safe-parser@npm:^6.0.0": + version: 6.0.0 + resolution: "postcss-safe-parser@npm:6.0.0" + peerDependencies: + postcss: ^8.3.3 + checksum: 10c0/5b0997b63de6ab4afb4b718a52dd7902e465c21d1f2e516762bcb59047787459b4dc5713132f6a19c9c8c483043b20b8a380a55fb61152ee66cbffcddf3b57f0 + languageName: node + linkType: hard + +"postcss-scss@npm:^4.0.9": + version: 4.0.9 + resolution: "postcss-scss@npm:4.0.9" + peerDependencies: + postcss: ^8.4.29 + checksum: 10c0/f917ecfd4b9113a6648e966a41f027ff7e14238393914978d44596e227a50f084667dc8818742348dc7d8b20130b30d4259aca1d4db86754a9c141202ae03714 + languageName: node + linkType: hard + +"postcss-selector-parser@npm:^6.1.0": + version: 6.1.2 + resolution: "postcss-selector-parser@npm:6.1.2" + dependencies: + cssesc: "npm:^3.0.0" + util-deprecate: "npm:^1.0.2" + checksum: 10c0/523196a6bd8cf660bdf537ad95abd79e546d54180f9afb165a4ab3e651ac705d0f8b8ce6b3164fb9e3279ce482c5f751a69eb2d3a1e8eb0fd5e82294fb3ef13e + languageName: node + linkType: hard + +"postcss@npm:^8.4.38, postcss@npm:^8.4.39, postcss@npm:^8.4.43": + version: 8.4.49 + resolution: "postcss@npm:8.4.49" + dependencies: + nanoid: "npm:^3.3.7" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10c0/f1b3f17aaf36d136f59ec373459f18129908235e65dbdc3aee5eef8eba0756106f52de5ec4682e29a2eab53eb25170e7e871b3e4b52a8f1de3d344a514306be3 + languageName: node + linkType: hard + +"prelude-ls@npm:^1.2.1": + version: 1.2.1 + resolution: "prelude-ls@npm:1.2.1" + checksum: 10c0/b00d617431e7886c520a6f498a2e14c75ec58f6d93ba48c3b639cf241b54232d90daa05d83a9e9b9fef6baa63cb7e1e4602c2372fea5bc169668401eb127d0cd + languageName: node + linkType: hard + +"prettier-plugin-svelte@npm:^3.1.2": + version: 3.2.8 + resolution: "prettier-plugin-svelte@npm:3.2.8" + peerDependencies: + prettier: ^3.0.0 + svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + checksum: 10c0/aa5d8f3777911cf14ac920aaf74cbefa47b71cdb06279ea7eecab92cd7964f928ff3e213cf3194f30ffc3d4d1621c94eee97717a2c0cfc906cefc4e9e191aff6 + languageName: node + linkType: hard + +"prettier@npm:^3.1.1": + version: 3.3.3 + resolution: "prettier@npm:3.3.3" + bin: + prettier: bin/prettier.cjs + checksum: 10c0/b85828b08e7505716324e4245549b9205c0cacb25342a030ba8885aba2039a115dbcf75a0b7ca3b37bc9d101ee61fab8113fc69ca3359f2a226f1ecc07ad2e26 + languageName: node + linkType: hard + +"proc-log@npm:^4.1.0, proc-log@npm:^4.2.0": + version: 4.2.0 + resolution: "proc-log@npm:4.2.0" + checksum: 10c0/17db4757c2a5c44c1e545170e6c70a26f7de58feb985091fb1763f5081cab3d01b181fb2dd240c9f4a4255a1d9227d163d5771b7e69c9e49a561692db865efb9 + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: "npm:^2.0.2" + retry: "npm:^0.12.0" + checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 + languageName: node + linkType: hard + +"punycode@npm:^2.1.0": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: 10c0/900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 + languageName: node + linkType: hard + +"readdirp@npm:^4.0.1": + version: 4.0.2 + resolution: "readdirp@npm:4.0.2" + checksum: 10c0/a16ecd8ef3286dcd90648c3b103e3826db2b766cdb4a988752c43a83f683d01c7059158d623cbcd8bdfb39e65d302d285be2d208e7d9f34d022d912b929217dd + languageName: node + linkType: hard + +"resolve-from@npm:^4.0.0": + version: 4.0.0 + resolution: "resolve-from@npm:4.0.0" + checksum: 10c0/8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190 + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: 10c0/c19ef26e4e188f408922c46f7ff480d38e8dfc55d448310dfb518736b23ed2c4f547fb64a6ed5bdba92cd7e7ddc889d36ff78f794816d5e71498d645ef476107 + languageName: node + linkType: hard + +"rollup@npm:^4.20.0": + version: 4.26.0 + resolution: "rollup@npm:4.26.0" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.26.0" + "@rollup/rollup-android-arm64": "npm:4.26.0" + "@rollup/rollup-darwin-arm64": "npm:4.26.0" + "@rollup/rollup-darwin-x64": "npm:4.26.0" + "@rollup/rollup-freebsd-arm64": "npm:4.26.0" + "@rollup/rollup-freebsd-x64": "npm:4.26.0" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.26.0" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.26.0" + "@rollup/rollup-linux-arm64-gnu": "npm:4.26.0" + "@rollup/rollup-linux-arm64-musl": "npm:4.26.0" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.26.0" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.26.0" + "@rollup/rollup-linux-s390x-gnu": "npm:4.26.0" + "@rollup/rollup-linux-x64-gnu": "npm:4.26.0" + "@rollup/rollup-linux-x64-musl": "npm:4.26.0" + "@rollup/rollup-win32-arm64-msvc": "npm:4.26.0" + "@rollup/rollup-win32-ia32-msvc": "npm:4.26.0" + "@rollup/rollup-win32-x64-msvc": "npm:4.26.0" + "@types/estree": "npm:1.0.6" + fsevents: "npm:~2.3.2" + dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-powerpc64le-gnu": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10c0/a4375787b95bc3b55d38bbb8dec5f6a63862b08369b9562a2d38efadd400ca42a79406b8f09670a0deb0cc9cd72cca1c0be317302190d1f7feff597003d951bc + languageName: node + linkType: hard + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: "npm:^1.2.2" + checksum: 10c0/200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 + languageName: node + linkType: hard + +"sade@npm:^1.7.4, sade@npm:^1.8.1": + version: 1.8.1 + resolution: "sade@npm:1.8.1" + dependencies: + mri: "npm:^1.1.0" + checksum: 10c0/da8a3a5d667ad5ce3bf6d4f054bbb9f711103e5df21003c5a5c1a8a77ce12b640ed4017dd423b13c2307ea7e645adee7c2ae3afe8051b9db16a6f6d3da3f90b1 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + +"sass@npm:^1.80.1": + version: 1.80.7 + resolution: "sass@npm:1.80.7" + dependencies: + "@parcel/watcher": "npm:^2.4.1" + chokidar: "npm:^4.0.0" + immutable: "npm:^5.0.2" + source-map-js: "npm:>=0.6.2 <2.0.0" + dependenciesMeta: + "@parcel/watcher": + optional: true + bin: + sass: sass.js + checksum: 10c0/e0e0df8dc9dd7694826f915196a96cda45fe0fc849be9fc08b43c12aa1250eb512130979ed239e1106476973ace1f52abbcc1d5900a075d3813c282a626dcbf7 + languageName: node + linkType: hard + +"semver@npm:^7.3.5, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.2": + version: 7.6.3 + resolution: "semver@npm:7.6.3" + bin: + semver: bin/semver.js + checksum: 10c0/88f33e148b210c153873cb08cfe1e281d518aaa9a666d4d148add6560db5cd3c582f3a08ccb91f38d5f379ead256da9931234ed122057f40bb5766e65e58adaf + languageName: node + linkType: hard + +"set-cookie-parser@npm:^2.6.0": + version: 2.7.1 + resolution: "set-cookie-parser@npm:2.7.1" + checksum: 10c0/060c198c4c92547ac15988256f445eae523f57f2ceefeccf52d30d75dedf6bff22b9c26f756bd44e8e560d44ff4ab2130b178bd2e52ef5571bf7be3bd7632d9a + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 + languageName: node + linkType: hard + +"sirv@npm:^3.0.0": + version: 3.0.0 + resolution: "sirv@npm:3.0.0" + dependencies: + "@polka/url": "npm:^1.0.0-next.24" + mrmime: "npm:^2.0.0" + totalist: "npm:^3.0.0" + checksum: 10c0/282c52ee5a93cafa297096ad31aa6c3004a21d4c93abe728b701e51e4329acb887f6e92f07696225414fd6bb4a7782fd64a42d0b6b6467ae0f66bd3fde90b865 + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 + languageName: node + linkType: hard + +"snarkdown@npm:^2.0.0": + version: 2.0.0 + resolution: "snarkdown@npm:2.0.0" + checksum: 10c0/2e1645924041f0a69804b2d0eac3eef0403d1d769da374c73102f1f8a401401990c79e6dd1ee0ea302585ecea232e358c11134781b389b0afffb987f4db5b36d + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.3": + version: 8.0.4 + resolution: "socks-proxy-agent@npm:8.0.4" + dependencies: + agent-base: "npm:^7.1.1" + debug: "npm:^4.3.4" + socks: "npm:^2.8.3" + checksum: 10c0/345593bb21b95b0508e63e703c84da11549f0a2657d6b4e3ee3612c312cb3a907eac10e53b23ede3557c6601d63252103494caa306b66560f43af7b98f53957a + languageName: node + linkType: hard + +"socks@npm:^2.8.3": + version: 2.8.3 + resolution: "socks@npm:2.8.3" + dependencies: + ip-address: "npm:^9.0.5" + smart-buffer: "npm:^4.2.0" + checksum: 10c0/d54a52bf9325165770b674a67241143a3d8b4e4c8884560c4e0e078aace2a728dffc7f70150660f51b85797c4e1a3b82f9b7aa25e0a0ceae1a243365da5c51a7 + languageName: node + linkType: hard + +"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf + languageName: node + linkType: hard + +"sprintf-js@npm:^1.1.3": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb + languageName: node + linkType: hard + +"ssri@npm:^10.0.0": + version: 10.0.6 + resolution: "ssri@npm:10.0.6" + dependencies: + minipass: "npm:^7.0.3" + checksum: 10c0/e5a1e23a4057a86a97971465418f22ea89bd439ac36ade88812dd920e4e61873e8abd6a9b72a03a67ef50faa00a2daf1ab745c5a15b46d03e0544a0296354227 + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b + languageName: node + linkType: hard + +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: "npm:^6.0.1" + checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.1": + version: 3.1.1 + resolution: "strip-json-comments@npm:3.1.1" + checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 + languageName: node + linkType: hard + +"svelecte@npm:^4.3.1": + version: 4.4.1 + resolution: "svelecte@npm:4.4.1" + dependencies: + svelte-tiny-virtual-list: "npm:^2.1.0" + peerDependencies: + svelte: ^3.43.0 || ^4.0.0 + checksum: 10c0/b501673dc92a74855b095e5761e49385053cb8bae750e6dfbf531bdd35e5c65b2060faee9488dc8b99ccf4c81b761085d87e56329928cb495322f6fedf4a8f9a + languageName: node + linkType: hard + +"svelte-check@npm:^4.0.0": + version: 4.0.7 + resolution: "svelte-check@npm:4.0.7" + dependencies: + "@jridgewell/trace-mapping": "npm:^0.3.25" + chokidar: "npm:^4.0.1" + fdir: "npm:^6.2.0" + picocolors: "npm:^1.0.0" + sade: "npm:^1.7.4" + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: ">=5.0.0" + bin: + svelte-check: bin/svelte-check + checksum: 10c0/edd477910ede13d6a05d30ba073a69145bab02e37ed0fea65b1d5c46abb164fb2e7f06b3233a21f00882fe03e4666b1d1303abe303762c14993b7eaec3363739 + languageName: node + linkType: hard + +"svelte-eslint-parser@npm:^0.43.0": + version: 0.43.0 + resolution: "svelte-eslint-parser@npm:0.43.0" + dependencies: + eslint-scope: "npm:^7.2.2" + eslint-visitor-keys: "npm:^3.4.3" + espree: "npm:^9.6.1" + postcss: "npm:^8.4.39" + postcss-scss: "npm:^4.0.9" + peerDependencies: + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + checksum: 10c0/52bbbf5d266fc36f64626e38d8de4354d78a5490fa60b61b1cd127c1c661d94f0c671a220e3ed7dd92b144a3c99f517d5205c218f78feea0603132f24eeb4c9d + languageName: node + linkType: hard + +"svelte-hmr@npm:^0.16.0": + version: 0.16.0 + resolution: "svelte-hmr@npm:0.16.0" + peerDependencies: + svelte: ^3.19.0 || ^4.0.0 + checksum: 10c0/242c0775361b5e8e0c19550ce0f8d27f738c31f45684b8a8beb88e2cce931078ffab0a6793002b4879c2637fa698d559020e78cab40756be11341602284ed01e + languageName: node + linkType: hard + +"svelte-tiny-virtual-list@npm:^2.1.0": + version: 2.1.2 + resolution: "svelte-tiny-virtual-list@npm:2.1.2" + checksum: 10c0/a8d19fa9e04facea8dd10d86f2077e5cee6a8e23be889c9da74513eee5b5f4e81662da83cdd093fa6339693b6c1f832bc3b47d1b694612d80e888d6501efaebb + languageName: node + linkType: hard + +"svelte@npm:4": + version: 4.2.19 + resolution: "svelte@npm:4.2.19" + dependencies: + "@ampproject/remapping": "npm:^2.2.1" + "@jridgewell/sourcemap-codec": "npm:^1.4.15" + "@jridgewell/trace-mapping": "npm:^0.3.18" + "@types/estree": "npm:^1.0.1" + acorn: "npm:^8.9.0" + aria-query: "npm:^5.3.0" + axobject-query: "npm:^4.0.0" + code-red: "npm:^1.0.3" + css-tree: "npm:^2.3.1" + estree-walker: "npm:^3.0.3" + is-reference: "npm:^3.0.1" + locate-character: "npm:^3.0.0" + magic-string: "npm:^0.30.4" + periscopic: "npm:^3.1.0" + checksum: 10c0/77700133e90f86da3072ebfd5e8546b4ebe7296424bd65f89a7247fbcbae5dc56f56d15154e2a929ee3aa7da018cb5d5db24b99b7cb72f0ba2db2ad966d603dc + languageName: node + linkType: hard + +"tar@npm:^6.1.11, tar@npm:^6.2.1": + version: 6.2.1 + resolution: "tar@npm:6.2.1" + dependencies: + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.0.0" + minipass: "npm:^5.0.0" + minizlib: "npm:^2.1.1" + mkdirp: "npm:^1.0.3" + yallist: "npm:^4.0.0" + checksum: 10c0/a5eca3eb50bc11552d453488344e6507156b9193efd7635e98e867fab275d527af53d8866e2370cd09dfe74378a18111622ace35af6a608e5223a7d27fe99537 + languageName: node + linkType: hard + +"text-table@npm:^0.2.0": + version: 0.2.0 + resolution: "text-table@npm:0.2.0" + checksum: 10c0/02805740c12851ea5982686810702e2f14369a5f4c5c40a836821e3eefc65ffeec3131ba324692a37608294b0fd8c1e55a2dd571ffed4909822787668ddbee5c + languageName: node + linkType: hard + +"tiny-glob@npm:^0.2.9": + version: 0.2.9 + resolution: "tiny-glob@npm:0.2.9" + dependencies: + globalyzer: "npm:0.1.0" + globrex: "npm:^0.1.2" + checksum: 10c0/cbe072f0d213a1395d30aa94845a051d4af18fe8ffb79c8e99ac1787cd25df69083f17791a53997cb65f469f48950cb61426ccc0683cc9df170ac2430e883702 + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: "npm:^7.0.0" + checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 + languageName: node + linkType: hard + +"totalist@npm:^3.0.0": + version: 3.0.1 + resolution: "totalist@npm:3.0.1" + checksum: 10c0/4bb1fadb69c3edbef91c73ebef9d25b33bbf69afe1e37ce544d5f7d13854cda15e47132f3e0dc4cafe300ddb8578c77c50a65004d8b6e97e77934a69aa924863 + languageName: node + linkType: hard + +"ts-api-utils@npm:^1.3.0": + version: 1.4.0 + resolution: "ts-api-utils@npm:1.4.0" + peerDependencies: + typescript: ">=4.2.0" + checksum: 10c0/1b2bfa50ea52771d564bb143bb69010d25cda03ed573095fbac9b86f717012426443af6647e00e3db70fca60360482a30c1be7cf73c3521c321f6bf5e3594ea0 + languageName: node + linkType: hard + +"type-check@npm:^0.4.0, type-check@npm:~0.4.0": + version: 0.4.0 + resolution: "type-check@npm:0.4.0" + dependencies: + prelude-ls: "npm:^1.2.1" + checksum: 10c0/7b3fd0ed43891e2080bf0c5c504b418fbb3e5c7b9708d3d015037ba2e6323a28152ec163bcb65212741fa5d2022e3075ac3c76440dbd344c9035f818e8ecee58 + languageName: node + linkType: hard + +"typescript-eslint@npm:^8.0.0": + version: 8.14.0 + resolution: "typescript-eslint@npm:8.14.0" + dependencies: + "@typescript-eslint/eslint-plugin": "npm:8.14.0" + "@typescript-eslint/parser": "npm:8.14.0" + "@typescript-eslint/utils": "npm:8.14.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/b9c2f32139d3df52057bfb80d4663fd5e440ccd0da75d92fe91582fe5216213e7012ef691e7d91c75e402e373b9aded6b128b005aaeeae32d7b9d7b39732bcc7 + languageName: node + linkType: hard + +"typescript@npm:^5.0.0": + version: 5.6.3 + resolution: "typescript@npm:5.6.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/44f61d3fb15c35359bc60399cb8127c30bae554cd555b8e2b46d68fa79d680354b83320ad419ff1b81a0bdf324197b29affe6cc28988cd6a74d4ac60c94f9799 + languageName: node + linkType: hard + +"typescript@patch:typescript@npm%3A^5.0.0#optional!builtin": + version: 5.6.3 + resolution: "typescript@patch:typescript@npm%3A5.6.3#optional!builtin::version=5.6.3&hash=8c6c40" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10c0/7c9d2e07c81226d60435939618c91ec2ff0b75fbfa106eec3430f0fcf93a584bc6c73176676f532d78c3594fe28a54b36eb40b3d75593071a7ec91301533ace7 + languageName: node + linkType: hard + +"uc.micro@npm:^1.0.1, uc.micro@npm:^1.0.5": + version: 1.0.6 + resolution: "uc.micro@npm:1.0.6" + checksum: 10c0/9bde2afc6f2e24b899db6caea47dae778b88862ca76688d844ef6e6121dec0679c152893a74a6cfbd2e6fde34654e6bd8424fee8e0166cdfa6c9ae5d42b8a17b + languageName: node + linkType: hard + +"unique-filename@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-filename@npm:3.0.0" + dependencies: + unique-slug: "npm:^4.0.0" + checksum: 10c0/6363e40b2fa758eb5ec5e21b3c7fb83e5da8dcfbd866cc0c199d5534c42f03b9ea9ab069769cc388e1d7ab93b4eeef28ef506ab5f18d910ef29617715101884f + languageName: node + linkType: hard + +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: 10c0/cb811d9d54eb5821b81b18205750be84cb015c20a4a44280794e915f5a0a70223ce39066781a354e872df3572e8155c228f43ff0cce94c7cbf4da2cc7cbdd635 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: "npm:^2.1.0" + checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.2": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 + languageName: node + linkType: hard + +"vite-plugin-markdown@npm:^2.2.0": + version: 2.2.0 + resolution: "vite-plugin-markdown@npm:2.2.0" + dependencies: + domhandler: "npm:^4.0.0" + front-matter: "npm:^4.0.0" + htmlparser2: "npm:^6.0.0" + markdown-it: "npm:^12.0.0" + peerDependencies: + vite: ">= 2.0.0" + checksum: 10c0/fbdafcde545ca4020481696d82f762749ca0a23565de1b53f8c2fb260de600b32936f4916298b0069ef0a45da498be028250ffdc67e471ea2cc655a427e96999 + languageName: node + linkType: hard + +"vite@npm:^5.0.3": + version: 5.4.11 + resolution: "vite@npm:5.4.11" + dependencies: + esbuild: "npm:^0.21.3" + fsevents: "npm:~2.3.3" + postcss: "npm:^8.4.43" + rollup: "npm:^4.20.0" + peerDependencies: + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + sass-embedded: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + bin: + vite: bin/vite.js + checksum: 10c0/d536bb7af57dd0eca2a808f95f5ff1d7b7ffb8d86e17c6893087680a0448bd0d15e07475270c8a6de65cb5115592d037130a1dd979dc76bcef8c1dda202a1874 + languageName: node + linkType: hard + +"vitefu@npm:^0.2.5": + version: 0.2.5 + resolution: "vitefu@npm:0.2.5" + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + vite: + optional: true + checksum: 10c0/5781ece3025b6be0eb87ee7d97760a7721b1c6c5ad60ede5f37c86393ece3c8fce4245472f62368eb192448034086e25bdcadf098eefc271277176ab9a430204 + languageName: node + linkType: hard + +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f + languageName: node + linkType: hard + +"which@npm:^4.0.0": + version: 4.0.0 + resolution: "which@npm:4.0.0" + dependencies: + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: 10c0/449fa5c44ed120ccecfe18c433296a4978a7583bf2391c50abce13f76878d2476defde04d0f79db8165bdf432853c1f8389d0485ca6e8ebce3bbcded513d5e6a + languageName: node + linkType: hard + +"word-wrap@npm:^1.2.5": + version: 1.2.5 + resolution: "word-wrap@npm:1.2.5" + checksum: 10c0/e0e4a1ca27599c92a6ca4c32260e8a92e8a44f4ef6ef93f803f8ed823f486e0889fc0b93be4db59c8d51b3064951d25e43d434e95dc8c960cc3a63d65d00ba20 + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: "npm:^6.1.0" + string-width: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a + languageName: node + linkType: hard + +"yaml@npm:^1.10.2": + version: 1.10.2 + resolution: "yaml@npm:1.10.2" + checksum: 10c0/5c28b9eb7adc46544f28d9a8d20c5b3cb1215a886609a2fd41f51628d8aaa5878ccd628b755dbcd29f6bb4921bd04ffbc6dcc370689bb96e594e2f9813d2605f + languageName: node + linkType: hard + +"yocto-queue@npm:^0.1.0": + version: 0.1.0 + resolution: "yocto-queue@npm:0.1.0" + checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f + languageName: node + linkType: hard From cbb07f9cc3ffa4dfd0e7e7488e21a128ca653eaf Mon Sep 17 00:00:00 2001 From: sam Date: Thu, 14 Nov 2024 02:38:11 +0100 Subject: [PATCH 31/57] fix: add thousands separator to status --- Catalogger.Backend/Services/StatusUpdateService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Catalogger.Backend/Services/StatusUpdateService.cs b/Catalogger.Backend/Services/StatusUpdateService.cs index 1d858aa..b9f187b 100644 --- a/Catalogger.Backend/Services/StatusUpdateService.cs +++ b/Catalogger.Backend/Services/StatusUpdateService.cs @@ -69,7 +69,7 @@ public class StatusUpdateService(ILogger logger, ShardedGatewayClient shardedCli private UpdatePresence PresenceFor(int shardId) { - var status = $"/catalogger help | in {CataloggerMetrics.GuildsCached.Value} servers"; + var status = $"/catalogger help | in {CataloggerMetrics.GuildsCached.Value:N0} servers"; if (shardedClient.TotalShards != 1) status += $" | shard {shardId + 1}/{shardedClient.TotalShards}"; From d48ab7e16e6897881fcdda799b1094ebec3d2246 Mon Sep 17 00:00:00 2001 From: sam Date: Thu, 14 Nov 2024 02:45:20 +0100 Subject: [PATCH 32/57] feat: freeze config backup model the database model will probably change in the future, but backups should keep the same model even when that happens. --- .../Api/GuildsController.Backup.cs | 26 +--- .../Database/Models/ConfigExport.cs | 112 ++++++++++++++++++ 2 files changed, 117 insertions(+), 21 deletions(-) create mode 100644 Catalogger.Backend/Database/Models/ConfigExport.cs diff --git a/Catalogger.Backend/Api/GuildsController.Backup.cs b/Catalogger.Backend/Api/GuildsController.Backup.cs index 2c04fc4..4d64a9e 100644 --- a/Catalogger.Backend/Api/GuildsController.Backup.cs +++ b/Catalogger.Backend/Api/GuildsController.Backup.cs @@ -36,10 +36,7 @@ public partial class GuildsController [Authorize] [HttpPost("config")] - public async Task ImportConfigAsync( - string id, - [FromBody] GuildConfigExport export - ) + public async Task ImportConfigAsync(string id, [FromBody] ConfigExport export) { var (guildId, _) = await ParseGuildAsync(id); if (export.Id != guildId.Value) @@ -56,7 +53,7 @@ public partial class GuildsController await guildRepository.ImportConfigAsync( guildId.Value, - export.Channels, + export.Channels.ToGuildConfig(), export.BannedSystems, export.KeyRoles ); @@ -86,32 +83,19 @@ public partial class GuildsController return NoContent(); } - private async Task ToExport(Database.Models.Guild config) + private async Task ToExport(Database.Models.Guild config) { var id = DiscordSnowflake.New(config.Id); var invites = await inviteRepository.GetGuildInvitesAsync(id); var watchlist = await watchlistRepository.GetGuildWatchlistAsync(id); - return new GuildConfigExport( + return new ConfigExport( config.Id, - config.Channels, + ChannelsBackup.FromGuildConfig(config.Channels), config.BannedSystems, config.KeyRoles, invites.Select(i => new InviteExport(i.Code, i.Name)), watchlist.Select(w => new WatchlistExport(w.UserId, w.AddedAt, w.ModeratorId, w.Reason)) ); } - - public record GuildConfigExport( - ulong Id, - Database.Models.Guild.ChannelConfig Channels, - string[] BannedSystems, - ulong[] KeyRoles, - IEnumerable Invites, - IEnumerable Watchlist - ); - - public record InviteExport(string Code, string Name); - - public record WatchlistExport(ulong UserId, Instant AddedAt, ulong ModeratorId, string Reason); } diff --git a/Catalogger.Backend/Database/Models/ConfigExport.cs b/Catalogger.Backend/Database/Models/ConfigExport.cs new file mode 100644 index 0000000..b6514f7 --- /dev/null +++ b/Catalogger.Backend/Database/Models/ConfigExport.cs @@ -0,0 +1,112 @@ +using NodaTime; + +namespace Catalogger.Backend.Database.Models; + +public record ConfigExport( + ulong Id, + ChannelsBackup Channels, + string[] BannedSystems, + ulong[] KeyRoles, + IEnumerable Invites, + IEnumerable Watchlist +); + +public record InviteExport(string Code, string Name); + +public record WatchlistExport(ulong UserId, Instant AddedAt, ulong ModeratorId, string Reason); + +public class ChannelsBackup +{ + public List IgnoredChannels { get; init; } = []; + public List IgnoredUsers { get; init; } = []; + public Dictionary> IgnoredUsersPerChannel { get; init; } = []; + public Dictionary Redirects { get; init; } = []; + + public ulong GuildUpdate { get; init; } + public ulong GuildEmojisUpdate { get; init; } + public ulong GuildRoleCreate { get; init; } + public ulong GuildRoleUpdate { get; init; } + public ulong GuildRoleDelete { get; init; } + public ulong ChannelCreate { get; init; } + public ulong ChannelUpdate { get; init; } + public ulong ChannelDelete { get; init; } + public ulong GuildMemberAdd { get; init; } + public ulong GuildMemberUpdate { get; init; } + public ulong GuildKeyRoleUpdate { get; init; } + public ulong GuildMemberNickUpdate { get; init; } + public ulong GuildMemberAvatarUpdate { get; init; } + public ulong GuildMemberTimeout { get; init; } + public ulong GuildMemberRemove { get; init; } + public ulong GuildMemberKick { get; init; } + public ulong GuildBanAdd { get; init; } + public ulong GuildBanRemove { get; init; } + public ulong InviteCreate { get; init; } + public ulong InviteDelete { get; init; } + public ulong MessageUpdate { get; init; } + public ulong MessageDelete { get; init; } + public ulong MessageDeleteBulk { get; init; } + + public Guild.ChannelConfig ToGuildConfig() => + new() + { + IgnoredChannels = IgnoredChannels, + IgnoredUsers = IgnoredUsers, + IgnoredUsersPerChannel = IgnoredUsersPerChannel, + Redirects = Redirects, + GuildUpdate = GuildUpdate, + GuildEmojisUpdate = GuildEmojisUpdate, + GuildRoleCreate = GuildRoleCreate, + GuildRoleUpdate = GuildRoleUpdate, + GuildRoleDelete = GuildRoleDelete, + ChannelCreate = ChannelCreate, + ChannelUpdate = ChannelUpdate, + ChannelDelete = ChannelDelete, + GuildMemberAdd = GuildMemberAdd, + GuildMemberUpdate = GuildMemberUpdate, + GuildKeyRoleUpdate = GuildKeyRoleUpdate, + GuildMemberNickUpdate = GuildMemberNickUpdate, + GuildMemberAvatarUpdate = GuildMemberAvatarUpdate, + GuildMemberTimeout = GuildMemberTimeout, + GuildMemberRemove = GuildMemberRemove, + GuildMemberKick = GuildMemberKick, + GuildBanAdd = GuildBanAdd, + GuildBanRemove = GuildBanRemove, + InviteCreate = InviteCreate, + InviteDelete = InviteDelete, + MessageUpdate = MessageUpdate, + MessageDelete = MessageDelete, + MessageDeleteBulk = MessageDeleteBulk, + }; + + public static ChannelsBackup FromGuildConfig(Guild.ChannelConfig channels) => + new() + { + IgnoredChannels = channels.IgnoredChannels, + IgnoredUsers = channels.IgnoredUsers, + IgnoredUsersPerChannel = channels.IgnoredUsersPerChannel, + Redirects = channels.Redirects, + GuildUpdate = channels.GuildUpdate, + GuildEmojisUpdate = channels.GuildEmojisUpdate, + GuildRoleCreate = channels.GuildRoleCreate, + GuildRoleUpdate = channels.GuildRoleUpdate, + GuildRoleDelete = channels.GuildRoleDelete, + ChannelCreate = channels.ChannelCreate, + ChannelUpdate = channels.ChannelUpdate, + ChannelDelete = channels.ChannelDelete, + GuildMemberAdd = channels.GuildMemberAdd, + GuildMemberUpdate = channels.GuildMemberUpdate, + GuildKeyRoleUpdate = channels.GuildKeyRoleUpdate, + GuildMemberNickUpdate = channels.GuildMemberNickUpdate, + GuildMemberAvatarUpdate = channels.GuildMemberAvatarUpdate, + GuildMemberTimeout = channels.GuildMemberTimeout, + GuildMemberRemove = channels.GuildMemberRemove, + GuildMemberKick = channels.GuildMemberKick, + GuildBanAdd = channels.GuildBanAdd, + GuildBanRemove = channels.GuildBanRemove, + InviteCreate = channels.InviteCreate, + InviteDelete = channels.InviteDelete, + MessageUpdate = channels.MessageUpdate, + MessageDelete = channels.MessageDelete, + MessageDeleteBulk = channels.MessageDeleteBulk, + }; +} From 0cac964aa6fb09fa32331500402c17731620880d Mon Sep 17 00:00:00 2001 From: sam Date: Mon, 18 Nov 2024 00:47:27 +0100 Subject: [PATCH 33/57] feat: split ignores into 'ignore messages' and 'ignore entities' --- .idea/.idea.catalogger/.idea/sqldialects.xml | 1 + .../Api/GuildsController.Backup.cs | 5 +- .../Api/GuildsController.ChannelsRoles.cs | 10 +- .../Api/GuildsController.Redirects.cs | 4 +- .../Api/GuildsController.Users.cs | 12 +- Catalogger.Backend/Api/GuildsController.cs | 25 +- .../Bot/Commands/ChannelCommandsComponents.cs | 4 +- .../Bot/Commands/IgnoreChannelCommands.cs | 205 ----------------- .../IgnoreMessageCommands.Channels.cs | 214 ++++++++++++++++++ .../Commands/IgnoreMessageCommands.Roles.cs | 122 ++++++++++ .../Commands/IgnoreMessageCommands.Users.cs | 124 ++++++++++ .../Bot/Commands/IgnoreUserCommands.cs | 117 ---------- .../Bot/Commands/RedirectCommands.cs | 4 +- .../Channels/ChannelCreateResponder.cs | 8 +- .../Channels/ChannelDeleteResponder.cs | 7 +- .../Channels/ChannelUpdateResponder.cs | 16 +- .../Members/GuildMemberUpdateResponder.cs | 18 +- .../Messages/MessageCreateResponder.cs | 8 +- .../Messages/MessageDeleteBulkResponder.cs | 2 +- .../Messages/MessageDeleteResponder.cs | 15 +- .../Responders/Roles/RoleCreateResponder.cs | 7 +- .../Responders/Roles/RoleDeleteResponder.cs | 7 +- .../Responders/Roles/RoleUpdateResponder.cs | 7 +- Catalogger.Backend/Database/DatabasePool.cs | 1 + .../004_split_message_config.down.sql | 3 + .../004_split_message_config.up.sql | 12 + .../Database/Models/ConfigExport.cs | 66 +++--- Catalogger.Backend/Database/Models/Guild.cs | 25 +- .../Database/Repositories/GuildRepository.cs | 15 +- Catalogger.Backend/Program.cs | 8 +- .../Services/WebhookExecutorService.cs | 133 +++++++---- Catalogger.GoImporter/GuildImport.cs | 13 +- 32 files changed, 730 insertions(+), 488 deletions(-) delete mode 100644 Catalogger.Backend/Bot/Commands/IgnoreChannelCommands.cs create mode 100644 Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Channels.cs create mode 100644 Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Roles.cs create mode 100644 Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Users.cs delete mode 100644 Catalogger.Backend/Bot/Commands/IgnoreUserCommands.cs create mode 100644 Catalogger.Backend/Database/Migrations/004_split_message_config.down.sql create mode 100644 Catalogger.Backend/Database/Migrations/004_split_message_config.up.sql diff --git a/.idea/.idea.catalogger/.idea/sqldialects.xml b/.idea/.idea.catalogger/.idea/sqldialects.xml index 10eef95..4ea96ec 100644 --- a/.idea/.idea.catalogger/.idea/sqldialects.xml +++ b/.idea/.idea.catalogger/.idea/sqldialects.xml @@ -2,6 +2,7 @@ + \ No newline at end of file diff --git a/Catalogger.Backend/Api/GuildsController.Backup.cs b/Catalogger.Backend/Api/GuildsController.Backup.cs index 4d64a9e..f808b0c 100644 --- a/Catalogger.Backend/Api/GuildsController.Backup.cs +++ b/Catalogger.Backend/Api/GuildsController.Backup.cs @@ -53,7 +53,8 @@ public partial class GuildsController await guildRepository.ImportConfigAsync( guildId.Value, - export.Channels.ToGuildConfig(), + export.Channels.ToChannelConfig(), + export.Channels.ToMessageConfig(), export.BannedSystems, export.KeyRoles ); @@ -91,7 +92,7 @@ public partial class GuildsController return new ConfigExport( config.Id, - ChannelsBackup.FromGuildConfig(config.Channels), + ChannelsBackup.FromGuildConfig(config), config.BannedSystems, config.KeyRoles, invites.Select(i => new InviteExport(i.Code, i.Name)), diff --git a/Catalogger.Backend/Api/GuildsController.ChannelsRoles.cs b/Catalogger.Backend/Api/GuildsController.ChannelsRoles.cs index 23e424a..7fc43ac 100644 --- a/Catalogger.Backend/Api/GuildsController.ChannelsRoles.cs +++ b/Catalogger.Backend/Api/GuildsController.ChannelsRoles.cs @@ -29,7 +29,7 @@ public partial class GuildsController var (guildId, _) = await ParseGuildAsync(id); var guildConfig = await guildRepository.GetAsync(guildId); - if (guildConfig.Channels.IgnoredChannels.Contains(channelId)) + if (guildConfig.Messages.IgnoredChannels.Contains(channelId)) return NoContent(); var channel = channelCache @@ -47,8 +47,8 @@ public partial class GuildsController if (channel == null) return NoContent(); - guildConfig.Channels.IgnoredChannels.Add(channelId); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig.Channels); + guildConfig.Messages.IgnoredChannels.Add(channelId); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); return NoContent(); } @@ -59,8 +59,8 @@ public partial class GuildsController var (guildId, _) = await ParseGuildAsync(id); var guildConfig = await guildRepository.GetAsync(guildId); - guildConfig.Channels.IgnoredChannels.Remove(channelId); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig.Channels); + guildConfig.Messages.IgnoredChannels.Remove(channelId); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); return NoContent(); } diff --git a/Catalogger.Backend/Api/GuildsController.Redirects.cs b/Catalogger.Backend/Api/GuildsController.Redirects.cs index 9ce84de..f762896 100644 --- a/Catalogger.Backend/Api/GuildsController.Redirects.cs +++ b/Catalogger.Backend/Api/GuildsController.Redirects.cs @@ -61,7 +61,7 @@ public partial class GuildsController ); guildConfig.Channels.Redirects[source.ID.Value] = target.ID.Value; - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig.Channels); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); return NoContent(); } @@ -80,7 +80,7 @@ public partial class GuildsController ); guildConfig.Channels.Redirects.Remove(channelId, out _); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig.Channels); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); return NoContent(); } diff --git a/Catalogger.Backend/Api/GuildsController.Users.cs b/Catalogger.Backend/Api/GuildsController.Users.cs index f762d1e..3a3ef43 100644 --- a/Catalogger.Backend/Api/GuildsController.Users.cs +++ b/Catalogger.Backend/Api/GuildsController.Users.cs @@ -37,7 +37,7 @@ public partial class GuildsController var guildConfig = await guildRepository.GetAsync(guildId); var output = new List(); - foreach (var userId in guildConfig.Channels.IgnoredUsers) + foreach (var userId in guildConfig.Messages.IgnoredUsers) { if (cts.Token.IsCancellationRequested) break; @@ -72,11 +72,11 @@ public partial class GuildsController if (user == null) throw new ApiError(HttpStatusCode.NotFound, ErrorCode.BadRequest, "User not found"); - if (guildConfig.Channels.IgnoredUsers.Contains(user.ID.Value)) + if (guildConfig.Messages.IgnoredUsers.Contains(user.ID.Value)) return Ok(new IgnoredUser(user.ID.Value, user.Tag())); - guildConfig.Channels.IgnoredUsers.Add(user.ID.Value); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig.Channels); + guildConfig.Messages.IgnoredUsers.Add(user.ID.Value); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); return Ok(new IgnoredUser(user.ID.Value, user.Tag())); } @@ -87,8 +87,8 @@ public partial class GuildsController var (guildId, _) = await ParseGuildAsync(id); var guildConfig = await guildRepository.GetAsync(guildId); - guildConfig.Channels.IgnoredUsers.Remove(userId); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig.Channels); + guildConfig.Messages.IgnoredUsers.Remove(userId); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); return NoContent(); } diff --git a/Catalogger.Backend/Api/GuildsController.cs b/Catalogger.Backend/Api/GuildsController.cs index f557f90..dfd6479 100644 --- a/Catalogger.Backend/Api/GuildsController.cs +++ b/Catalogger.Backend/Api/GuildsController.cs @@ -159,28 +159,6 @@ public partial class GuildsController( .ToList(); var guildConfig = await guildRepository.GetAsync(guildId); - if (req.IgnoredChannels != null) - { - var categories = channelCache - .GuildChannels(guildId) - .Where(c => c.Type is ChannelType.GuildCategory) - .ToList(); - - if ( - req.IgnoredChannels.Any(cId => - guildChannels.All(c => c.ID.Value != cId) - && categories.All(c => c.ID.Value != cId) - ) - ) - throw new ApiError( - HttpStatusCode.BadRequest, - ErrorCode.BadRequest, - "One or more ignored channels are unknown" - ); - - guildConfig.Channels.IgnoredChannels = req.IgnoredChannels.ToList(); - } - // i love repeating myself wheeeeee if ( req.GuildUpdate == null @@ -334,12 +312,11 @@ public partial class GuildsController( ) guildConfig.Channels.MessageDeleteBulk = req.MessageDeleteBulk ?? 0; - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig.Channels); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); return Ok(guildConfig.Channels); } public record ChannelRequest( - ulong[]? IgnoredChannels = null, ulong? GuildUpdate = null, ulong? GuildEmojisUpdate = null, ulong? GuildRoleCreate = null, diff --git a/Catalogger.Backend/Bot/Commands/ChannelCommandsComponents.cs b/Catalogger.Backend/Bot/Commands/ChannelCommandsComponents.cs index b94df0d..ae472e7 100644 --- a/Catalogger.Backend/Bot/Commands/ChannelCommandsComponents.cs +++ b/Catalogger.Backend/Bot/Commands/ChannelCommandsComponents.cs @@ -261,7 +261,7 @@ public class ChannelCommandsComponents( throw new ArgumentOutOfRangeException(); } - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig.Channels); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); goto case "return"; case "return": var (e, c) = ChannelCommands.BuildRootMenu(guildChannels, guild, guildConfig); @@ -384,7 +384,7 @@ public class ChannelCommandsComponents( throw new ArgumentOutOfRangeException(); } - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig.Channels); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); List embeds = [ diff --git a/Catalogger.Backend/Bot/Commands/IgnoreChannelCommands.cs b/Catalogger.Backend/Bot/Commands/IgnoreChannelCommands.cs deleted file mode 100644 index 73b0a21..0000000 --- a/Catalogger.Backend/Bot/Commands/IgnoreChannelCommands.cs +++ /dev/null @@ -1,205 +0,0 @@ -// Copyright (C) 2021-present sam (starshines.gay) -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -using System.ComponentModel; -using Catalogger.Backend.Cache; -using Catalogger.Backend.Cache.InMemoryCache; -using Catalogger.Backend.Database.Repositories; -using Catalogger.Backend.Extensions; -using Catalogger.Backend.Services; -using Remora.Commands.Attributes; -using Remora.Commands.Groups; -using Remora.Discord.API; -using Remora.Discord.API.Abstractions.Objects; -using Remora.Discord.Commands.Attributes; -using Remora.Discord.Commands.Feedback.Services; -using Remora.Discord.Commands.Services; -using Remora.Discord.Extensions.Embeds; -using Remora.Rest.Core; -using IResult = Remora.Results.IResult; - -namespace Catalogger.Backend.Bot.Commands; - -[Group("ignored-channels")] -[Description("Manage channels ignored for logging.")] -[DiscordDefaultMemberPermissions(DiscordPermission.ManageGuild)] -public class IgnoreChannelCommands( - ILogger logger, - GuildRepository guildRepository, - IMemberCache memberCache, - GuildCache guildCache, - ChannelCache channelCache, - PermissionResolverService permissionResolver, - ContextInjectionService contextInjection, - FeedbackService feedbackService -) : CommandGroup -{ - private readonly ILogger _logger = logger.ForContext(); - - [Command("add")] - [Description("Add a channel to the list of ignored channels.")] - public async Task AddIgnoredChannelAsync( - [ChannelTypes( - ChannelType.GuildCategory, - ChannelType.GuildText, - ChannelType.GuildAnnouncement, - ChannelType.GuildForum, - ChannelType.GuildMedia, - ChannelType.GuildVoice, - ChannelType.GuildStageVoice - )] - [Description("The channel to ignore")] - IChannel channel - ) - { - var (_, guildId) = contextInjection.GetUserAndGuild(); - var guildConfig = await guildRepository.GetAsync(guildId); - - if (guildConfig.Channels.IgnoredChannels.Contains(channel.ID.Value)) - return await feedbackService.ReplyAsync( - "That channel is already being ignored.", - isEphemeral: true - ); - - guildConfig.Channels.IgnoredChannels.Add(channel.ID.Value); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig.Channels); - - return await feedbackService.ReplyAsync( - $"Successfully added {(channel.Type == ChannelType.GuildCategory ? channel.Name : $"<#{channel.ID}>")} to the list of ignored channels." - ); - } - - [Command("remove")] - [Description("Remove a channel from the list of ignored channels.")] - public async Task RemoveIgnoredChannelAsync( - [Description("The channel to stop ignoring")] IChannel channel - ) - { - var (_, guildId) = contextInjection.GetUserAndGuild(); - var guildConfig = await guildRepository.GetAsync(guildId); - - if (!guildConfig.Channels.IgnoredChannels.Contains(channel.ID.Value)) - return await feedbackService.ReplyAsync( - "That channel is already not ignored.", - isEphemeral: true - ); - - guildConfig.Channels.IgnoredChannels.Remove(channel.ID.Value); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig.Channels); - - return await feedbackService.ReplyAsync( - $"Successfully removed {(channel.Type == ChannelType.GuildCategory ? channel.Name : $"<#{channel.ID}>")} from the list of ignored channels." - ); - } - - [Command("list")] - [Description("List channels ignored for logging.")] - public async Task ListIgnoredChannelsAsync() - { - var (userId, guildId) = contextInjection.GetUserAndGuild(); - if (!guildCache.TryGet(guildId, out var guild)) - throw new CataloggerError("Guild not in cache"); - - var guildChannels = channelCache.GuildChannels(guildId).ToList(); - var guildConfig = await guildRepository.GetAsync(guildId); - - var member = await memberCache.TryGetAsync(guildId, userId); - if (member == null) - throw new CataloggerError("Executing member not found"); - - var ignoredChannels = guildConfig - .Channels.IgnoredChannels.Select(id => - { - var channel = guildChannels.FirstOrDefault(c => c.ID.Value == id); - if (channel == null) - return new IgnoredChannel(IgnoredChannelType.Unknown, DiscordSnowflake.New(id)); - - var type = channel.Type switch - { - ChannelType.GuildCategory => IgnoredChannelType.Category, - _ => IgnoredChannelType.Base, - }; - - return new IgnoredChannel( - type, - channel.ID, - permissionResolver - .GetChannelPermissions(guildId, member, channel) - .HasPermission(DiscordPermission.ViewChannel) - ); - }) - .ToList(); - - var embed = new EmbedBuilder() - .WithTitle($"Ignored channels in {guild.Name}") - .WithColour(DiscordUtils.Purple); - - var nonVisibleCategories = ignoredChannels.Count(c => - c is { Type: IgnoredChannelType.Category, CanSee: false } - ); - var visibleCategories = ignoredChannels - .Where(c => c is { Type: IgnoredChannelType.Category, CanSee: true }) - .ToList(); - - if (nonVisibleCategories != 0 || visibleCategories.Count != 0) - { - var value = string.Join("\n", visibleCategories.Select(c => $"<#{c.Id}>")); - if (nonVisibleCategories != 0) - value += - $"\n\n{nonVisibleCategories} channel(s) are not shown as you do not have access to them."; - - embed.AddField("Categories", value); - } - - var nonVisibleBase = ignoredChannels.Count(c => - c is { Type: IgnoredChannelType.Base, CanSee: false } - ); - var visibleBase = ignoredChannels - .Where(c => c is { Type: IgnoredChannelType.Base, CanSee: true }) - .ToList(); - - if (nonVisibleBase != 0 || visibleBase.Count != 0) - { - var value = string.Join("\n", visibleBase.Select(c => $"<#{c.Id}>")); - if (nonVisibleBase != 0) - value += - $"\n\n{nonVisibleBase} channel(s) are not shown as you do not have access to them."; - - embed.AddField("Channels", value); - } - - var unknownChannels = string.Join( - "\n", - ignoredChannels - .Where(c => c.Type == IgnoredChannelType.Unknown) - .Select(c => $"{c.Id} <#{c.Id}>") - ); - if (!string.IsNullOrWhiteSpace(unknownChannels)) - { - embed.AddField("Unknown", unknownChannels); - } - - return await feedbackService.ReplyAsync(embeds: [embed.Build().GetOrThrow()]); - } - - private record struct IgnoredChannel(IgnoredChannelType Type, Snowflake Id, bool CanSee = true); - - private enum IgnoredChannelType - { - Unknown, - Base, - Category, - } -} diff --git a/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Channels.cs b/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Channels.cs new file mode 100644 index 0000000..310142d --- /dev/null +++ b/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Channels.cs @@ -0,0 +1,214 @@ +// Copyright (C) 2021-present sam (starshines.gay) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +using System.ComponentModel; +using Catalogger.Backend.Cache; +using Catalogger.Backend.Cache.InMemoryCache; +using Catalogger.Backend.Database.Repositories; +using Catalogger.Backend.Extensions; +using Catalogger.Backend.Services; +using Remora.Commands.Attributes; +using Remora.Commands.Groups; +using Remora.Discord.API; +using Remora.Discord.API.Abstractions.Objects; +using Remora.Discord.Commands.Attributes; +using Remora.Discord.Commands.Feedback.Services; +using Remora.Discord.Commands.Services; +using Remora.Discord.Extensions.Embeds; +using Remora.Rest.Core; +using IResult = Remora.Results.IResult; + +namespace Catalogger.Backend.Bot.Commands; + +[Group("ignore-messages")] +[Description("Manage users, roles, and channels whose messages are not logged.")] +[DiscordDefaultMemberPermissions(DiscordPermission.ManageGuild)] +public partial class IgnoreMessageCommands : CommandGroup +{ + [Group("channels")] + public class Channels( + GuildRepository guildRepository, + IMemberCache memberCache, + GuildCache guildCache, + ChannelCache channelCache, + PermissionResolverService permissionResolver, + ContextInjectionService contextInjection, + FeedbackService feedbackService + ) : CommandGroup + { + [Command("add")] + [Description("Add a channel to the list of ignored channels.")] + [SuppressInteractionResponse(true)] + public async Task AddIgnoredChannelAsync( + [ChannelTypes( + ChannelType.GuildCategory, + ChannelType.GuildText, + ChannelType.GuildAnnouncement, + ChannelType.GuildForum, + ChannelType.GuildMedia, + ChannelType.GuildVoice, + ChannelType.GuildStageVoice + )] + [Description("The channel to ignore")] + IChannel channel + ) + { + var (_, guildId) = contextInjection.GetUserAndGuild(); + var guildConfig = await guildRepository.GetAsync(guildId); + + if (guildConfig.Messages.IgnoredChannels.Contains(channel.ID.Value)) + return await feedbackService.ReplyAsync( + "That channel is already being ignored.", + isEphemeral: true + ); + + guildConfig.Messages.IgnoredChannels.Add(channel.ID.Value); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + + return await feedbackService.ReplyAsync( + $"Successfully added {(channel.Type == ChannelType.GuildCategory ? channel.Name : $"<#{channel.ID}>")} to the list of ignored channels." + ); + } + + [Command("remove")] + [Description("Remove a channel from the list of ignored channels.")] + public async Task RemoveIgnoredChannelAsync( + [Description("The channel to stop ignoring")] IChannel channel + ) + { + var (_, guildId) = contextInjection.GetUserAndGuild(); + var guildConfig = await guildRepository.GetAsync(guildId); + + if (!guildConfig.Messages.IgnoredChannels.Contains(channel.ID.Value)) + return await feedbackService.ReplyAsync( + "That channel is already not ignored.", + isEphemeral: true + ); + + guildConfig.Messages.IgnoredChannels.Remove(channel.ID.Value); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + + return await feedbackService.ReplyAsync( + $"Successfully removed {(channel.Type == ChannelType.GuildCategory ? channel.Name : $"<#{channel.ID}>")} from the list of ignored channels." + ); + } + + [Command("list")] + [Description("List channels ignored for logging.")] + public async Task ListIgnoredChannelsAsync() + { + var (userId, guildId) = contextInjection.GetUserAndGuild(); + if (!guildCache.TryGet(guildId, out var guild)) + throw new CataloggerError("Guild not in cache"); + + var guildChannels = channelCache.GuildChannels(guildId).ToList(); + var guildConfig = await guildRepository.GetAsync(guildId); + + var member = await memberCache.TryGetAsync(guildId, userId); + if (member == null) + throw new CataloggerError("Executing member not found"); + + var ignoredChannels = guildConfig + .Messages.IgnoredChannels.Select(id => + { + var channel = guildChannels.FirstOrDefault(c => c.ID.Value == id); + if (channel == null) + return new IgnoredChannel( + IgnoredChannelType.Unknown, + DiscordSnowflake.New(id) + ); + + var type = channel.Type switch + { + ChannelType.GuildCategory => IgnoredChannelType.Category, + _ => IgnoredChannelType.Base, + }; + + return new IgnoredChannel( + type, + channel.ID, + permissionResolver + .GetChannelPermissions(guildId, member, channel) + .HasPermission(DiscordPermission.ViewChannel) + ); + }) + .ToList(); + + var embed = new EmbedBuilder() + .WithTitle($"Ignored channels in {guild.Name}") + .WithColour(DiscordUtils.Purple); + + var nonVisibleCategories = ignoredChannels.Count(c => + c is { Type: IgnoredChannelType.Category, CanSee: false } + ); + var visibleCategories = ignoredChannels + .Where(c => c is { Type: IgnoredChannelType.Category, CanSee: true }) + .ToList(); + + if (nonVisibleCategories != 0 || visibleCategories.Count != 0) + { + var value = string.Join("\n", visibleCategories.Select(c => $"<#{c.Id}>")); + if (nonVisibleCategories != 0) + value += + $"\n\n{nonVisibleCategories} channel(s) are not shown as you do not have access to them."; + + embed.AddField("Categories", value); + } + + var nonVisibleBase = ignoredChannels.Count(c => + c is { Type: IgnoredChannelType.Base, CanSee: false } + ); + var visibleBase = ignoredChannels + .Where(c => c is { Type: IgnoredChannelType.Base, CanSee: true }) + .ToList(); + + if (nonVisibleBase != 0 || visibleBase.Count != 0) + { + var value = string.Join("\n", visibleBase.Select(c => $"<#{c.Id}>")); + if (nonVisibleBase != 0) + value += + $"\n\n{nonVisibleBase} channel(s) are not shown as you do not have access to them."; + + embed.AddField("Channels", value); + } + + var unknownChannels = string.Join( + "\n", + ignoredChannels + .Where(c => c.Type == IgnoredChannelType.Unknown) + .Select(c => $"{c.Id} <#{c.Id}>") + ); + if (!string.IsNullOrWhiteSpace(unknownChannels)) + { + embed.AddField("Unknown", unknownChannels); + } + + return await feedbackService.ReplyAsync(embeds: [embed.Build().GetOrThrow()]); + } + + private record struct IgnoredChannel( + IgnoredChannelType Type, + Snowflake Id, + bool CanSee = true + ); + + private enum IgnoredChannelType + { + Unknown, + Base, + Category, + } + } +} diff --git a/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Roles.cs b/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Roles.cs new file mode 100644 index 0000000..6515f47 --- /dev/null +++ b/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Roles.cs @@ -0,0 +1,122 @@ +// Copyright (C) 2021-present sam (starshines.gay) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +using System.ComponentModel; +using Catalogger.Backend.Cache.InMemoryCache; +using Catalogger.Backend.Database.Repositories; +using Catalogger.Backend.Extensions; +using Remora.Commands.Attributes; +using Remora.Commands.Groups; +using Remora.Discord.API.Abstractions.Objects; +using Remora.Discord.Commands.Feedback.Services; +using Remora.Discord.Commands.Services; +using Remora.Discord.Extensions.Embeds; +using IResult = Remora.Results.IResult; + +namespace Catalogger.Backend.Bot.Commands; + +public partial class IgnoreMessageCommands +{ + [Group("roles")] + public class Roles( + GuildRepository guildRepository, + GuildCache guildCache, + RoleCache roleCache, + ContextInjectionService contextInjection, + FeedbackService feedbackService + ) : CommandGroup + { + [Command("add")] + [Description("Add a role to the list of ignored roles.")] + public async Task AddIgnoredRoleAsync( + [Description("The role to ignore")] IRole role + ) + { + var (_, guildId) = contextInjection.GetUserAndGuild(); + var guildConfig = await guildRepository.GetAsync(guildId); + + if (guildConfig.Messages.IgnoredRoles.Contains(role.ID.Value)) + return await feedbackService.ReplyAsync( + "That role is already being ignored.", + isEphemeral: true + ); + + guildConfig.Messages.IgnoredRoles.Add(role.ID.Value); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + + return await feedbackService.ReplyAsync( + $"Successfully added {role.Name} to the list of ignored roles." + ); + } + + [Command("remove")] + [Description("Remove a role from the list of ignored roles.")] + public async Task RemoveIgnoredRoleAsync( + [Description("The role to stop ignoring")] IRole role + ) + { + var (_, guildId) = contextInjection.GetUserAndGuild(); + var guildConfig = await guildRepository.GetAsync(guildId); + + if (!guildConfig.Messages.IgnoredRoles.Contains(role.ID.Value)) + return await feedbackService.ReplyAsync( + "That role is already not ignored.", + isEphemeral: true + ); + + guildConfig.Messages.IgnoredRoles.Remove(role.ID.Value); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + + return await feedbackService.ReplyAsync( + $"Successfully removed {role.Name} from the list of ignored roles." + ); + } + + [Command("list")] + [Description("List roles ignored for logging.")] + public async Task ListIgnoredRolesAsync() + { + var (_, guildId) = contextInjection.GetUserAndGuild(); + if (!guildCache.TryGet(guildId, out var guild)) + throw new CataloggerError("Guild not in cache"); + + var guildConfig = await guildRepository.GetAsync(guildId); + + var roles = roleCache + .GuildRoles(guildId) + .Where(r => guildConfig.Messages.IgnoredRoles.Contains(r.ID.Value)) + .OrderByDescending(r => r.Position) + .Select(r => $"<@&{r.ID}>") + .ToList(); + if (roles.Count == 0) + return await feedbackService.ReplyAsync( + "No roles are being ignored right now.", + isEphemeral: true + ); + + return await feedbackService.ReplyAsync( + embeds: + [ + new EmbedBuilder() + .WithTitle($"Ignored roles in {guild.Name}") + .WithDescription(string.Join("\n", roles)) + .WithColour(DiscordUtils.Purple) + .Build() + .GetOrThrow(), + ] + ); + } + } +} diff --git a/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Users.cs b/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Users.cs new file mode 100644 index 0000000..89f329b --- /dev/null +++ b/Catalogger.Backend/Bot/Commands/IgnoreMessageCommands.Users.cs @@ -0,0 +1,124 @@ +// Copyright (C) 2021-present sam (starshines.gay) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +using System.ComponentModel; +using Catalogger.Backend.Cache; +using Catalogger.Backend.Cache.InMemoryCache; +using Catalogger.Backend.Database.Repositories; +using Catalogger.Backend.Extensions; +using Remora.Commands.Attributes; +using Remora.Commands.Groups; +using Remora.Discord.API; +using Remora.Discord.API.Abstractions.Objects; +using Remora.Discord.Commands.Feedback.Services; +using Remora.Discord.Commands.Services; +using Remora.Discord.Pagination.Extensions; +using Remora.Rest.Core; +using IResult = Remora.Results.IResult; + +namespace Catalogger.Backend.Bot.Commands; + +public partial class IgnoreMessageCommands +{ + [Group("users")] + public class Users( + GuildRepository guildRepository, + IMemberCache memberCache, + GuildCache guildCache, + UserCache userCache, + ContextInjectionService contextInjection, + FeedbackService feedbackService + ) : CommandGroup + { + [Command("add")] + [Description("Add a user to the list of ignored users.")] + public async Task AddIgnoredUserAsync( + [Description("The user to ignore")] IUser user + ) + { + var (_, guildId) = contextInjection.GetUserAndGuild(); + var guildConfig = await guildRepository.GetAsync(guildId); + + if (guildConfig.Messages.IgnoredUsers.Contains(user.ID.Value)) + return await feedbackService.ReplyAsync( + "That user is already being ignored.", + isEphemeral: true + ); + + guildConfig.Messages.IgnoredUsers.Add(user.ID.Value); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + + return await feedbackService.ReplyAsync( + $"Successfully added {user.PrettyFormat()} to the list of ignored users." + ); + } + + [Command("remove")] + [Description("Remove a user from the list of ignored users.")] + public async Task RemoveIgnoredUserAsync( + [Description("The user to stop ignoring")] IUser user + ) + { + var (_, guildId) = contextInjection.GetUserAndGuild(); + var guildConfig = await guildRepository.GetAsync(guildId); + + if (!guildConfig.Messages.IgnoredUsers.Contains(user.ID.Value)) + return await feedbackService.ReplyAsync( + "That user is already not ignored.", + isEphemeral: true + ); + + guildConfig.Messages.IgnoredUsers.Remove(user.ID.Value); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + + return await feedbackService.ReplyAsync( + $"Successfully removed {user.PrettyFormat()} from the list of ignored users." + ); + } + + [Command("list")] + [Description("List currently ignored users.")] + public async Task ListIgnoredUsersAsync() + { + var (userId, guildId) = contextInjection.GetUserAndGuild(); + if (!guildCache.TryGet(guildId, out var guild)) + throw new CataloggerError("Guild was not cached"); + + var guildConfig = await guildRepository.GetAsync(guildId); + + if (guildConfig.Messages.IgnoredUsers.Count == 0) + return await feedbackService.ReplyAsync("No users are being ignored right now."); + + var users = new List(); + foreach (var id in guildConfig.Messages.IgnoredUsers) + { + var user = await TryGetUserAsync(guildId, DiscordSnowflake.New(id)); + users.Add(user?.PrettyFormat() ?? $"*(unknown user {id})* <@{id}>"); + } + + return await feedbackService.SendContextualPaginatedMessageAsync( + userId, + DiscordUtils.PaginateStrings( + users, + $"Ignored users for {guild.Name} ({users.Count})" + ) + ); + } + + private async Task TryGetUserAsync(Snowflake guildId, Snowflake userId) => + (await memberCache.TryGetAsync(guildId, userId))?.User.Value + ?? await userCache.GetUserAsync(userId); + } +} diff --git a/Catalogger.Backend/Bot/Commands/IgnoreUserCommands.cs b/Catalogger.Backend/Bot/Commands/IgnoreUserCommands.cs deleted file mode 100644 index 2474031..0000000 --- a/Catalogger.Backend/Bot/Commands/IgnoreUserCommands.cs +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright (C) 2021-present sam (starshines.gay) -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -using System.ComponentModel; -using Catalogger.Backend.Cache; -using Catalogger.Backend.Cache.InMemoryCache; -using Catalogger.Backend.Database.Repositories; -using Catalogger.Backend.Extensions; -using Remora.Commands.Attributes; -using Remora.Commands.Groups; -using Remora.Discord.API; -using Remora.Discord.API.Abstractions.Objects; -using Remora.Discord.Commands.Feedback.Services; -using Remora.Discord.Commands.Services; -using Remora.Discord.Pagination.Extensions; -using Remora.Rest.Core; -using IResult = Remora.Results.IResult; - -namespace Catalogger.Backend.Bot.Commands; - -[Group("ignored-users")] -[Description("Manage users ignored for logging.")] -public class IgnoreUserCommands( - GuildRepository guildRepository, - GuildCache guildCache, - IMemberCache memberCache, - UserCache userCache, - ContextInjectionService contextInjection, - FeedbackService feedbackService -) : CommandGroup -{ - [Command("add")] - [Description("Add a user to the list of ignored users.")] - public async Task AddIgnoredUserAsync([Description("The user to ignore")] IUser user) - { - var (_, guildId) = contextInjection.GetUserAndGuild(); - var guildConfig = await guildRepository.GetAsync(guildId); - - if (guildConfig.Channels.IgnoredUsers.Contains(user.ID.Value)) - return await feedbackService.ReplyAsync( - "That user is already being ignored.", - isEphemeral: true - ); - - guildConfig.Channels.IgnoredUsers.Add(user.ID.Value); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig.Channels); - - return await feedbackService.ReplyAsync( - $"Successfully added {user.PrettyFormat()} to the list of ignored users." - ); - } - - [Command("remove")] - [Description("Remove a user from the list of ignored users.")] - public async Task RemoveIgnoredUserAsync( - [Description("The user to stop ignoring")] IUser user - ) - { - var (_, guildId) = contextInjection.GetUserAndGuild(); - var guildConfig = await guildRepository.GetAsync(guildId); - - if (!guildConfig.Channels.IgnoredUsers.Contains(user.ID.Value)) - return await feedbackService.ReplyAsync( - "That user is already not ignored.", - isEphemeral: true - ); - - guildConfig.Channels.IgnoredUsers.Remove(user.ID.Value); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig.Channels); - - return await feedbackService.ReplyAsync( - $"Successfully removed {user.PrettyFormat()} from the list of ignored users." - ); - } - - [Command("list")] - [Description("List currently ignored users.")] - public async Task ListIgnoredUsersAsync() - { - var (userId, guildId) = contextInjection.GetUserAndGuild(); - if (!guildCache.TryGet(guildId, out var guild)) - throw new CataloggerError("Guild was not cached"); - - var guildConfig = await guildRepository.GetAsync(guildId); - - if (guildConfig.Channels.IgnoredUsers.Count == 0) - return await feedbackService.ReplyAsync("No users are being ignored right now."); - - var users = new List(); - foreach (var id in guildConfig.Channels.IgnoredUsers) - { - var user = await TryGetUserAsync(guildId, DiscordSnowflake.New(id)); - users.Add(user?.PrettyFormat() ?? $"*(unknown user {id})* <@{id}>"); - } - - return await feedbackService.SendContextualPaginatedMessageAsync( - userId, - DiscordUtils.PaginateStrings(users, $"Ignored users for {guild.Name} ({users.Count})") - ); - } - - private async Task TryGetUserAsync(Snowflake guildId, Snowflake userId) => - (await memberCache.TryGetAsync(guildId, userId))?.User.Value - ?? await userCache.GetUserAsync(userId); -} diff --git a/Catalogger.Backend/Bot/Commands/RedirectCommands.cs b/Catalogger.Backend/Bot/Commands/RedirectCommands.cs index c776675..0fb2a3d 100644 --- a/Catalogger.Backend/Bot/Commands/RedirectCommands.cs +++ b/Catalogger.Backend/Bot/Commands/RedirectCommands.cs @@ -61,7 +61,7 @@ public class RedirectCommands( var (_, guildId) = contextInjectionService.GetUserAndGuild(); var guildConfig = await guildRepository.GetAsync(guildId); guildConfig.Channels.Redirects[source.ID.Value] = target.ID.Value; - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig.Channels); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); var output = $"Success! Edited and deleted messages from {FormatChannel(source)} will now be redirected to <#{target.ID}>."; @@ -101,7 +101,7 @@ public class RedirectCommands( var guildConfig = await guildRepository.GetAsync(guildId); var wasSet = guildConfig.Channels.Redirects.Remove(source.ID.Value); - await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig.Channels); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); var output = wasSet ? $"Removed the redirect for {FormatChannel(source)}! Message logs from" diff --git a/Catalogger.Backend/Bot/Responders/Channels/ChannelCreateResponder.cs b/Catalogger.Backend/Bot/Responders/Channels/ChannelCreateResponder.cs index 93666fe..935734a 100644 --- a/Catalogger.Backend/Bot/Responders/Channels/ChannelCreateResponder.cs +++ b/Catalogger.Backend/Bot/Responders/Channels/ChannelCreateResponder.cs @@ -17,6 +17,7 @@ using Catalogger.Backend.Cache.InMemoryCache; using Catalogger.Backend.Database.Repositories; using Catalogger.Backend.Extensions; using Catalogger.Backend.Services; +using Microsoft.Extensions.Logging.Configuration; using Remora.Discord.API.Abstractions.Gateway.Events; using Remora.Discord.API.Abstractions.Objects; using Remora.Discord.Extensions.Embeds; @@ -97,8 +98,11 @@ public class ChannelCreateResponder( var guildConfig = await guildRepository.GetAsync(ch.GuildID); webhookExecutor.QueueLog( - guildConfig, - LogChannelType.ChannelCreate, + webhookExecutor.GetLogChannel( + guildConfig, + LogChannelType.ChannelCreate, + channelId: ch.ID + ), builder.Build().GetOrThrow() ); return Result.Success; diff --git a/Catalogger.Backend/Bot/Responders/Channels/ChannelDeleteResponder.cs b/Catalogger.Backend/Bot/Responders/Channels/ChannelDeleteResponder.cs index aaee939..7e13bcb 100644 --- a/Catalogger.Backend/Bot/Responders/Channels/ChannelDeleteResponder.cs +++ b/Catalogger.Backend/Bot/Responders/Channels/ChannelDeleteResponder.cs @@ -68,8 +68,11 @@ public class ChannelDeleteResponder( embed.AddField("Description", topic); webhookExecutor.QueueLog( - guildConfig, - LogChannelType.ChannelDelete, + webhookExecutor.GetLogChannel( + guildConfig, + LogChannelType.ChannelDelete, + channelId: channel.ID + ), embed.Build().GetOrThrow() ); return Result.Success; diff --git a/Catalogger.Backend/Bot/Responders/Channels/ChannelUpdateResponder.cs b/Catalogger.Backend/Bot/Responders/Channels/ChannelUpdateResponder.cs index 56ca415..7ed3954 100644 --- a/Catalogger.Backend/Bot/Responders/Channels/ChannelUpdateResponder.cs +++ b/Catalogger.Backend/Bot/Responders/Channels/ChannelUpdateResponder.cs @@ -180,16 +180,14 @@ public class ChannelUpdateResponder( if (builder.Fields.Count == 0) return Result.Success; - var logChannel = webhookExecutor.GetLogChannel( - guildConfig, - LogChannelType.ChannelUpdate, - channelId: evt.ID, - userId: null + webhookExecutor.QueueLog( + webhookExecutor.GetLogChannel( + guildConfig, + LogChannelType.ChannelUpdate, + channelId: evt.ID + ), + builder.Build().GetOrThrow() ); - if (logChannel == null) - return Result.Success; - - webhookExecutor.QueueLog(logChannel.Value, builder.Build().GetOrThrow()); return Result.Success; } diff --git a/Catalogger.Backend/Bot/Responders/Members/GuildMemberUpdateResponder.cs b/Catalogger.Backend/Bot/Responders/Members/GuildMemberUpdateResponder.cs index 6cdfe86..e02b790 100644 --- a/Catalogger.Backend/Bot/Responders/Members/GuildMemberUpdateResponder.cs +++ b/Catalogger.Backend/Bot/Responders/Members/GuildMemberUpdateResponder.cs @@ -315,19 +315,20 @@ public class GuildMemberUpdateResponder( .WithFooter($"User ID: {member.User.ID}") .WithCurrentTimestamp(); - var addedRoles = member.Roles.Except(oldRoles).Select(s => s.Value).ToList(); - var removedRoles = oldRoles.Except(member.Roles).Select(s => s.Value).ToList(); + var addedRoles = member.Roles.Except(oldRoles).ToList(); + var removedRoles = oldRoles.Except(member.Roles).ToList(); if (addedRoles.Count != 0) { roleUpdate.AddField("Added", string.Join(", ", addedRoles.Select(id => $"<@&{id}>"))); // Add all added key roles to the log - if (!addedRoles.Except(guildConfig.KeyRoles).Any()) + if (!addedRoles.Select(s => s.Value).Except(guildConfig.KeyRoles).Any()) { var value = string.Join( "\n", addedRoles + .Select(s => s.Value) .Where(guildConfig.KeyRoles.Contains) .Select(id => { @@ -348,11 +349,12 @@ public class GuildMemberUpdateResponder( ); // Add all removed key roles to the log - if (!removedRoles.Except(guildConfig.KeyRoles).Any()) + if (!removedRoles.Select(s => s.Value).Except(guildConfig.KeyRoles).Any()) { var value = string.Join( "\n", removedRoles + .Select(s => s.Value) .Where(guildConfig.KeyRoles.Contains) .Select(id => { @@ -369,8 +371,12 @@ public class GuildMemberUpdateResponder( if (roleUpdate.Fields.Count != 0) { webhookExecutor.QueueLog( - guildConfig, - LogChannelType.GuildMemberUpdate, + webhookExecutor.GetLogChannel( + guildConfig, + LogChannelType.GuildMemberUpdate, + // Check for all added and removed roles + roleIds: addedRoles.Concat(removedRoles).ToList() + ), roleUpdate.Build().GetOrThrow() ); } diff --git a/Catalogger.Backend/Bot/Responders/Messages/MessageCreateResponder.cs b/Catalogger.Backend/Bot/Responders/Messages/MessageCreateResponder.cs index 3eebf2f..4f2b3a7 100644 --- a/Catalogger.Backend/Bot/Responders/Messages/MessageCreateResponder.cs +++ b/Catalogger.Backend/Bot/Responders/Messages/MessageCreateResponder.cs @@ -53,7 +53,13 @@ public class MessageCreateResponder( var guild = await guildRepository.GetAsync(msg.GuildID); // The guild needs to have enabled at least one of the message logging events, // and the channel must not be ignored, to store the message. - if (guild.IsMessageIgnored(msg.ChannelID, msg.Author.ID)) + if ( + guild.IsMessageIgnored( + msg.ChannelID, + msg.Author.ID, + msg.Member.OrDefault()?.Roles.OrDefault() + ) + ) { await messageRepository.IgnoreMessageAsync(msg.ID.Value); return Result.Success; diff --git a/Catalogger.Backend/Bot/Responders/Messages/MessageDeleteBulkResponder.cs b/Catalogger.Backend/Bot/Responders/Messages/MessageDeleteBulkResponder.cs index 6676839..46fdd0b 100644 --- a/Catalogger.Backend/Bot/Responders/Messages/MessageDeleteBulkResponder.cs +++ b/Catalogger.Backend/Bot/Responders/Messages/MessageDeleteBulkResponder.cs @@ -42,7 +42,7 @@ public class MessageDeleteBulkResponder( public async Task RespondAsync(IMessageDeleteBulk evt, CancellationToken ct = default) { var guild = await guildRepository.GetAsync(evt.GuildID); - if (guild.IsMessageIgnored(evt.ChannelID, null)) + if (guild.IsMessageIgnored(evt.ChannelID, null, null)) return Result.Success; var logChannel = webhookExecutor.GetLogChannel( diff --git a/Catalogger.Backend/Bot/Responders/Messages/MessageDeleteResponder.cs b/Catalogger.Backend/Bot/Responders/Messages/MessageDeleteResponder.cs index f866b94..9cf621e 100644 --- a/Catalogger.Backend/Bot/Responders/Messages/MessageDeleteResponder.cs +++ b/Catalogger.Backend/Bot/Responders/Messages/MessageDeleteResponder.cs @@ -64,22 +64,15 @@ public class MessageDeleteResponder( return Result.Success; var guild = await guildRepository.GetAsync(evt.GuildID); - if (guild.IsMessageIgnored(evt.ChannelID, evt.ID)) + if (guild.IsMessageIgnored(evt.ChannelID, null, null)) return Result.Success; - var logChannel = webhookExecutor.GetLogChannel( - guild, - LogChannelType.MessageDelete, - evt.ChannelID - ); var msg = await messageRepository.GetMessageAsync(evt.ID.Value, ct); // Sometimes a message that *should* be logged isn't stored in the database, notify the user of that if (msg == null) { - if (logChannel == null) - return Result.Success; webhookExecutor.QueueLog( - logChannel.Value, + webhookExecutor.GetLogChannel(guild, LogChannelType.MessageDelete, evt.ChannelID), new Embed( Title: "Message deleted", Description: $"A message not found in the database was deleted in <#{evt.ChannelID}> ({evt.ChannelID}).", @@ -107,7 +100,7 @@ public class MessageDeleteResponder( } } - logChannel = webhookExecutor.GetLogChannel( + var logChannel = webhookExecutor.GetLogChannel( guild, LogChannelType.MessageDelete, evt.ChannelID, @@ -173,7 +166,7 @@ public class MessageDeleteResponder( builder.AddField("Attachments", attachmentInfo, false); } - webhookExecutor.QueueLog(logChannel.Value, builder.Build().GetOrThrow()); + webhookExecutor.QueueLog(logChannel, builder.Build().GetOrThrow()); return Result.Success; } } diff --git a/Catalogger.Backend/Bot/Responders/Roles/RoleCreateResponder.cs b/Catalogger.Backend/Bot/Responders/Roles/RoleCreateResponder.cs index 4df76ea..0d09658 100644 --- a/Catalogger.Backend/Bot/Responders/Roles/RoleCreateResponder.cs +++ b/Catalogger.Backend/Bot/Responders/Roles/RoleCreateResponder.cs @@ -54,8 +54,11 @@ public class RoleCreateResponder( } webhookExecutor.QueueLog( - guildConfig, - LogChannelType.GuildRoleCreate, + webhookExecutor.GetLogChannel( + guildConfig, + LogChannelType.GuildRoleCreate, + roleId: evt.Role.ID + ), embed.Build().GetOrThrow() ); diff --git a/Catalogger.Backend/Bot/Responders/Roles/RoleDeleteResponder.cs b/Catalogger.Backend/Bot/Responders/Roles/RoleDeleteResponder.cs index 8566434..f76b339 100644 --- a/Catalogger.Backend/Bot/Responders/Roles/RoleDeleteResponder.cs +++ b/Catalogger.Backend/Bot/Responders/Roles/RoleDeleteResponder.cs @@ -70,8 +70,11 @@ public class RoleDeleteResponder( } webhookExecutor.QueueLog( - guildConfig, - LogChannelType.GuildRoleDelete, + webhookExecutor.GetLogChannel( + guildConfig, + LogChannelType.GuildRoleDelete, + roleId: role.ID + ), embed.Build().GetOrThrow() ); } diff --git a/Catalogger.Backend/Bot/Responders/Roles/RoleUpdateResponder.cs b/Catalogger.Backend/Bot/Responders/Roles/RoleUpdateResponder.cs index 828ef22..4ed8c2f 100644 --- a/Catalogger.Backend/Bot/Responders/Roles/RoleUpdateResponder.cs +++ b/Catalogger.Backend/Bot/Responders/Roles/RoleUpdateResponder.cs @@ -96,8 +96,11 @@ public class RoleUpdateResponder( var guildConfig = await guildRepository.GetAsync(evt.GuildID); webhookExecutor.QueueLog( - guildConfig, - LogChannelType.GuildRoleUpdate, + webhookExecutor.GetLogChannel( + guildConfig, + LogChannelType.GuildRoleUpdate, + roleId: evt.Role.ID + ), embed.Build().GetOrThrow() ); } diff --git a/Catalogger.Backend/Database/DatabasePool.cs b/Catalogger.Backend/Database/DatabasePool.cs index 3677ae3..9b1712f 100644 --- a/Catalogger.Backend/Database/DatabasePool.cs +++ b/Catalogger.Backend/Database/DatabasePool.cs @@ -116,6 +116,7 @@ public class DatabasePool SqlMapper.AddTypeHandler(new PassthroughTypeHandler()); SqlMapper.AddTypeHandler(new JsonTypeHandler()); + SqlMapper.AddTypeHandler(new JsonTypeHandler()); } // Copied from PluralKit: diff --git a/Catalogger.Backend/Database/Migrations/004_split_message_config.down.sql b/Catalogger.Backend/Database/Migrations/004_split_message_config.down.sql new file mode 100644 index 0000000..a9f1de1 --- /dev/null +++ b/Catalogger.Backend/Database/Migrations/004_split_message_config.down.sql @@ -0,0 +1,3 @@ +update guilds set channels = (channels || messages) - 'IgnoredRoles'; + +alter table guilds drop column messages; diff --git a/Catalogger.Backend/Database/Migrations/004_split_message_config.up.sql b/Catalogger.Backend/Database/Migrations/004_split_message_config.up.sql new file mode 100644 index 0000000..6cd35f0 --- /dev/null +++ b/Catalogger.Backend/Database/Migrations/004_split_message_config.up.sql @@ -0,0 +1,12 @@ +alter table guilds + add column messages jsonb not null default '{}'; + +-- Extract the current message-related configuration options into the new "messages" column +-- noinspection SqlWithoutWhere +update guilds +set messages = jsonb_build_object('IgnoredUsers', channels['IgnoredUsers'], 'IgnoredChannels', + channels['IgnoredChannels'], 'IgnoredUsersPerChannel', + channels['IgnoredUsersPerChannel']); + +-- We don't update the "channels" column as it will be cleared out automatically over time, +-- as channel configurations are updated by the bot diff --git a/Catalogger.Backend/Database/Models/ConfigExport.cs b/Catalogger.Backend/Database/Models/ConfigExport.cs index b6514f7..664bfa8 100644 --- a/Catalogger.Backend/Database/Models/ConfigExport.cs +++ b/Catalogger.Backend/Database/Models/ConfigExport.cs @@ -19,6 +19,7 @@ public class ChannelsBackup { public List IgnoredChannels { get; init; } = []; public List IgnoredUsers { get; init; } = []; + public List IgnoredRoles { get; init; } = []; public Dictionary> IgnoredUsersPerChannel { get; init; } = []; public Dictionary Redirects { get; init; } = []; @@ -46,12 +47,18 @@ public class ChannelsBackup public ulong MessageDelete { get; init; } public ulong MessageDeleteBulk { get; init; } - public Guild.ChannelConfig ToGuildConfig() => + public Guild.MessageConfig ToMessageConfig() => new() { IgnoredChannels = IgnoredChannels, IgnoredUsers = IgnoredUsers, + IgnoredRoles = IgnoredRoles, IgnoredUsersPerChannel = IgnoredUsersPerChannel, + }; + + public Guild.ChannelConfig ToChannelConfig() => + new() + { Redirects = Redirects, GuildUpdate = GuildUpdate, GuildEmojisUpdate = GuildEmojisUpdate, @@ -78,35 +85,36 @@ public class ChannelsBackup MessageDeleteBulk = MessageDeleteBulk, }; - public static ChannelsBackup FromGuildConfig(Guild.ChannelConfig channels) => + public static ChannelsBackup FromGuildConfig(Guild guild) => new() { - IgnoredChannels = channels.IgnoredChannels, - IgnoredUsers = channels.IgnoredUsers, - IgnoredUsersPerChannel = channels.IgnoredUsersPerChannel, - Redirects = channels.Redirects, - GuildUpdate = channels.GuildUpdate, - GuildEmojisUpdate = channels.GuildEmojisUpdate, - GuildRoleCreate = channels.GuildRoleCreate, - GuildRoleUpdate = channels.GuildRoleUpdate, - GuildRoleDelete = channels.GuildRoleDelete, - ChannelCreate = channels.ChannelCreate, - ChannelUpdate = channels.ChannelUpdate, - ChannelDelete = channels.ChannelDelete, - GuildMemberAdd = channels.GuildMemberAdd, - GuildMemberUpdate = channels.GuildMemberUpdate, - GuildKeyRoleUpdate = channels.GuildKeyRoleUpdate, - GuildMemberNickUpdate = channels.GuildMemberNickUpdate, - GuildMemberAvatarUpdate = channels.GuildMemberAvatarUpdate, - GuildMemberTimeout = channels.GuildMemberTimeout, - GuildMemberRemove = channels.GuildMemberRemove, - GuildMemberKick = channels.GuildMemberKick, - GuildBanAdd = channels.GuildBanAdd, - GuildBanRemove = channels.GuildBanRemove, - InviteCreate = channels.InviteCreate, - InviteDelete = channels.InviteDelete, - MessageUpdate = channels.MessageUpdate, - MessageDelete = channels.MessageDelete, - MessageDeleteBulk = channels.MessageDeleteBulk, + IgnoredChannels = guild.Messages.IgnoredChannels, + IgnoredUsers = guild.Messages.IgnoredUsers, + IgnoredRoles = guild.Messages.IgnoredRoles, + IgnoredUsersPerChannel = guild.Messages.IgnoredUsersPerChannel, + Redirects = guild.Channels.Redirects, + GuildUpdate = guild.Channels.GuildUpdate, + GuildEmojisUpdate = guild.Channels.GuildEmojisUpdate, + GuildRoleCreate = guild.Channels.GuildRoleCreate, + GuildRoleUpdate = guild.Channels.GuildRoleUpdate, + GuildRoleDelete = guild.Channels.GuildRoleDelete, + ChannelCreate = guild.Channels.ChannelCreate, + ChannelUpdate = guild.Channels.ChannelUpdate, + ChannelDelete = guild.Channels.ChannelDelete, + GuildMemberAdd = guild.Channels.GuildMemberAdd, + GuildMemberUpdate = guild.Channels.GuildMemberUpdate, + GuildKeyRoleUpdate = guild.Channels.GuildKeyRoleUpdate, + GuildMemberNickUpdate = guild.Channels.GuildMemberNickUpdate, + GuildMemberAvatarUpdate = guild.Channels.GuildMemberAvatarUpdate, + GuildMemberTimeout = guild.Channels.GuildMemberTimeout, + GuildMemberRemove = guild.Channels.GuildMemberRemove, + GuildMemberKick = guild.Channels.GuildMemberKick, + GuildBanAdd = guild.Channels.GuildBanAdd, + GuildBanRemove = guild.Channels.GuildBanRemove, + InviteCreate = guild.Channels.InviteCreate, + InviteDelete = guild.Channels.InviteDelete, + MessageUpdate = guild.Channels.MessageUpdate, + MessageDelete = guild.Channels.MessageDelete, + MessageDeleteBulk = guild.Channels.MessageDeleteBulk, }; } diff --git a/Catalogger.Backend/Database/Models/Guild.cs b/Catalogger.Backend/Database/Models/Guild.cs index afbd1cb..6ec6d82 100644 --- a/Catalogger.Backend/Database/Models/Guild.cs +++ b/Catalogger.Backend/Database/Models/Guild.cs @@ -24,18 +24,28 @@ public class Guild public required ulong Id { get; init; } public ChannelConfig Channels { get; init; } = new(); + public MessageConfig Messages { get; init; } = new(); public string[] BannedSystems { get; set; } = []; public ulong[] KeyRoles { get; set; } = []; + // These channels and roles are ignored for channel/role update/delete events. + public ulong[] IgnoredChannels { get; set; } = []; + public ulong[] IgnoredRoles { get; set; } = []; + public bool IsSystemBanned(PluralkitApiService.PkSystem system) => BannedSystems.Contains(system.Id) || BannedSystems.Contains(system.Uuid.ToString()); - public bool IsMessageIgnored(Snowflake channelId, Snowflake? userId) + public bool IsMessageIgnored( + Snowflake channelId, + Snowflake? userId, + IReadOnlyList? roleIds + ) { if ( Channels is { MessageDelete: 0, MessageUpdate: 0, MessageDeleteBulk: 0 } - || Channels.IgnoredChannels.Contains(channelId.ToUlong()) - || (userId != null && Channels.IgnoredUsers.Contains(userId.Value.ToUlong())) + || Messages.IgnoredChannels.Contains(channelId.ToUlong()) + || (userId != null && Messages.IgnoredUsers.Contains(userId.Value.ToUlong())) + || (roleIds != null && roleIds.Any(r => Messages.IgnoredRoles.Any(id => r.Value == id))) ) return true; @@ -43,7 +53,7 @@ public class Guild return false; if ( - Channels.IgnoredUsersPerChannel.TryGetValue( + Messages.IgnoredUsersPerChannel.TryGetValue( channelId.ToUlong(), out var thisChannelIgnoredUsers ) @@ -53,11 +63,16 @@ public class Guild return false; } - public class ChannelConfig + public class MessageConfig { public List IgnoredChannels { get; set; } = []; + public List IgnoredRoles { get; set; } = []; public List IgnoredUsers { get; init; } = []; public Dictionary> IgnoredUsersPerChannel { get; init; } = []; + } + + public class ChannelConfig + { public Dictionary Redirects { get; init; } = []; public ulong GuildUpdate { get; set; } diff --git a/Catalogger.Backend/Database/Repositories/GuildRepository.cs b/Catalogger.Backend/Database/Repositories/GuildRepository.cs index 2a95403..276b89a 100644 --- a/Catalogger.Backend/Database/Repositories/GuildRepository.cs +++ b/Catalogger.Backend/Database/Repositories/GuildRepository.cs @@ -131,24 +131,31 @@ public class GuildRepository(ILogger logger, DatabaseConnection conn) new { GuildId = guildId.Value, RoleId = roleId.Value } ); - public async Task UpdateChannelConfigAsync(Snowflake id, Guild.ChannelConfig config) => + public async Task UpdateChannelConfigAsync(Snowflake id, Guild config) => await conn.ExecuteAsync( - "update guilds set channels = @Channels::jsonb where id = @Id", - new { Id = id.Value, Channels = config } + "update guilds set channels = @Channels::jsonb, messages = @Messages::jsonb where id = @Id", + new + { + Id = id.Value, + config.Channels, + config.Messages, + } ); public async Task ImportConfigAsync( ulong id, Guild.ChannelConfig channels, + Guild.MessageConfig messages, string[] bannedSystems, ulong[] keyRoles ) => await conn.ExecuteAsync( - "update guilds set channels = @channels::jsonb, banned_systems = @bannedSystems, key_roles = @keyRoles where id = @id", + "update guilds set channels = @channels::jsonb, messages = @messages::jsonb, banned_systems = @bannedSystems, key_roles = @keyRoles where id = @id", new { id, channels, + messages, bannedSystems, keyRoles, } diff --git a/Catalogger.Backend/Program.cs b/Catalogger.Backend/Program.cs index ed9292a..f69c42e 100644 --- a/Catalogger.Backend/Program.cs +++ b/Catalogger.Backend/Program.cs @@ -27,6 +27,7 @@ using Remora.Discord.API.Abstractions.Objects; using Remora.Discord.API.Gateway.Commands; using Remora.Discord.API.Objects; using Remora.Discord.Commands.Extensions; +using Remora.Discord.Commands.Responders; using Remora.Discord.Extensions.Extensions; using Remora.Discord.Gateway; using Remora.Discord.Interactivity.Extensions; @@ -83,6 +84,7 @@ builder ] ); }) + .Configure(opts => opts.SuppressAutomaticResponses = true) .AddDiscordCommands( enableSlash: true, useDefaultCommandResponder: false, @@ -94,10 +96,12 @@ builder .WithCommandGroup() .WithCommandGroup() .WithCommandGroup() - .WithCommandGroup() + .WithCommandGroup() + .WithCommandGroup() + .WithCommandGroup() + .WithCommandGroup() .WithCommandGroup() .WithCommandGroup() - .WithCommandGroup() // End command tree .Finish() .AddPagination() diff --git a/Catalogger.Backend/Services/WebhookExecutorService.cs b/Catalogger.Backend/Services/WebhookExecutorService.cs index df2a122..221b4a1 100644 --- a/Catalogger.Backend/Services/WebhookExecutorService.cs +++ b/Catalogger.Backend/Services/WebhookExecutorService.cs @@ -60,7 +60,14 @@ public class WebhookExecutorService( /// public void QueueLog(Guild guildConfig, LogChannelType logChannelType, IEmbed embed) { - var logChannel = GetLogChannel(guildConfig, logChannelType, channelId: null, userId: null); + var logChannel = GetLogChannel( + guildConfig, + logChannelType, + channelId: null, + userId: null, + roleId: null, + roleIds: null + ); if (logChannel == null) return; @@ -70,16 +77,16 @@ public class WebhookExecutorService( /// /// Queues a log embed for the given channel ID. /// - public void QueueLog(ulong channelId, IEmbed embed) + public void QueueLog(ulong? channelId, IEmbed embed) { - if (channelId == 0) + if (channelId is null or 0) return; - var queue = _cache.GetOrAdd(channelId, []); + var queue = _cache.GetOrAdd(channelId.Value, []); queue.Enqueue(embed); - _cache[channelId] = queue; + _cache[channelId.Value] = queue; - SetTimer(channelId, queue); + SetTimer(channelId.Value, queue); } ///
@@ -251,14 +258,72 @@ public class WebhookExecutorService( } public ulong? GetLogChannel( + Guild guild, + LogChannelType logChannelType, + Snowflake? channelId = null, + ulong? userId = null, + Snowflake? roleId = null, + IReadOnlyList? roleIds = null + ) + { + var isMessageLog = + logChannelType + is LogChannelType.MessageUpdate + or LogChannelType.MessageDelete + or LogChannelType.MessageDeleteBulk; + + // Check if we're getting the channel for a channel log + var isChannelLog = + channelId != null + && logChannelType + is LogChannelType.ChannelCreate + or LogChannelType.ChannelDelete + or LogChannelType.ChannelUpdate; + + // Check if we're getting the channel for a role log + var isRoleLog = + roleId != null + && logChannelType + is LogChannelType.GuildRoleCreate + or LogChannelType.GuildRoleUpdate + or LogChannelType.GuildRoleDelete; + + // Check if we're getting the channel for a member update log + var isMemberRoleUpdateLog = + roleIds != null && logChannelType is LogChannelType.GuildMemberUpdate; + + if (isMessageLog) + return GetMessageLogChannel(guild, logChannelType, channelId, userId); + + if (isChannelLog && guild.IgnoredChannels.Contains(channelId!.Value.Value)) + return null; + + if (isRoleLog && guild.IgnoredRoles.Contains(roleId!.Value.Value)) + return null; + + // Member update logs are only ignored if *all* updated roles are ignored + if (isMemberRoleUpdateLog && roleIds!.All(r => guild.IgnoredRoles.Contains(r.Value))) + return null; + + // If nothing is ignored, return the correct log channel! + return GetDefaultLogChannel(guild, logChannelType); + } + + private ulong? GetMessageLogChannel( Guild guild, LogChannelType logChannelType, Snowflake? channelId = null, ulong? userId = null ) { + // Check if the user is ignored globally + if (userId != null && guild.Messages.IgnoredUsers.Contains(userId.Value)) + return null; + + // If the user isn't ignored and we didn't get a channel ID, return the default log channel if (channelId == null) return GetDefaultLogChannel(guild, logChannelType); + if (!channelCache.TryGet(channelId.Value, out var channel)) return null; @@ -282,25 +347,23 @@ public class WebhookExecutorService( categoryId = channel.ParentID.Value; } - // Check if the channel, or its category, or the user is ignored + // Check if the channel or its category is ignored if ( - guild.Channels.IgnoredChannels.Contains(channelId.Value.Value) - || categoryId != null && guild.Channels.IgnoredChannels.Contains(categoryId.Value.Value) + guild.Messages.IgnoredChannels.Contains(channelId.Value.Value) + || categoryId != null && guild.Messages.IgnoredChannels.Contains(categoryId.Value.Value) ) return null; + if (userId != null) { - if (guild.Channels.IgnoredUsers.Contains(userId.Value)) - return null; - // Check the channel-local and category-local ignored users var channelIgnoredUsers = - guild.Channels.IgnoredUsersPerChannel.GetValueOrDefault(channelId.Value.Value) + guild.Messages.IgnoredUsersPerChannel.GetValueOrDefault(channelId.Value.Value) ?? []; var categoryIgnoredUsers = ( categoryId != null - ? guild.Channels.IgnoredUsersPerChannel.GetValueOrDefault( + ? guild.Messages.IgnoredUsersPerChannel.GetValueOrDefault( categoryId.Value.Value ) : [] @@ -310,36 +373,24 @@ public class WebhookExecutorService( } // These three events can be redirected to other channels. Redirects can be on a channel or category level. - // Obviously, the events are only redirected if they're supposed to be logged in the first place. - if ( - logChannelType - is LogChannelType.MessageUpdate - or LogChannelType.MessageDelete - or LogChannelType.MessageDeleteBulk - ) - { - if (GetDefaultLogChannel(guild, logChannelType) == 0) - return null; + // The events are only redirected if they're supposed to be logged in the first place. + if (GetDefaultLogChannel(guild, logChannelType) == 0) + return null; - var categoryRedirect = - categoryId != null - ? guild.Channels.Redirects.GetValueOrDefault(categoryId.Value.Value) - : 0; + var categoryRedirect = + categoryId != null + ? guild.Channels.Redirects.GetValueOrDefault(categoryId.Value.Value) + : 0; - if ( - guild.Channels.Redirects.TryGetValue(channelId.Value.Value, out var channelRedirect) - ) - return channelRedirect; - return categoryRedirect != 0 - ? categoryRedirect - : GetDefaultLogChannel(guild, logChannelType); - } - - return GetDefaultLogChannel(guild, logChannelType); + if (guild.Channels.Redirects.TryGetValue(channelId.Value.Value, out var channelRedirect)) + return channelRedirect; + return categoryRedirect != 0 + ? categoryRedirect + : GetDefaultLogChannel(guild, logChannelType); } - public static ulong GetDefaultLogChannel(Guild guild, LogChannelType channelType) => - channelType switch + public static ulong GetDefaultLogChannel(Guild guild, LogChannelType logChannelType) => + logChannelType switch { LogChannelType.GuildUpdate => guild.Channels.GuildUpdate, LogChannelType.GuildEmojisUpdate => guild.Channels.GuildEmojisUpdate, @@ -364,7 +415,7 @@ public class WebhookExecutorService( LogChannelType.MessageUpdate => guild.Channels.MessageUpdate, LogChannelType.MessageDelete => guild.Channels.MessageDelete, LogChannelType.MessageDeleteBulk => guild.Channels.MessageDeleteBulk, - _ => throw new ArgumentOutOfRangeException(nameof(channelType)), + _ => throw new ArgumentOutOfRangeException(nameof(logChannelType)), }; } diff --git a/Catalogger.GoImporter/GuildImport.cs b/Catalogger.GoImporter/GuildImport.cs index a578430..2f034ce 100644 --- a/Catalogger.GoImporter/GuildImport.cs +++ b/Catalogger.GoImporter/GuildImport.cs @@ -62,10 +62,14 @@ public static class GuildImport GoGuild guild ) { - var channels = new Guild.ChannelConfig + var messages = new Guild.MessageConfig { IgnoredChannels = guild.IgnoredChannels.ToList(), IgnoredUsers = guild.IgnoredUsers.ToList(), + }; + + var channels = new Guild.ChannelConfig + { GuildUpdate = guild.Channels.TryParse("GUILD_UPDATE"), GuildEmojisUpdate = guild.Channels.TryParse("GUILD_EMOJIS_UPDATE"), GuildRoleCreate = guild.Channels.TryParse("GUILD_ROLE_CREATE"), @@ -97,13 +101,14 @@ public static class GuildImport await conn.ExecuteAsync( """ - insert into guilds (id, channels, banned_systems, key_roles) - values (@Id, @Channels::jsonb, @BannedSystems, @KeyRoles) + insert into guilds (id, channels, messages, banned_systems, key_roles) + values (@Id, @channels::jsonb, @messages::jsonb, @BannedSystems, @KeyRoles) """, new { guild.Id, - Channels = channels, + messages, + channels, guild.BannedSystems, guild.KeyRoles, }, From 19d9f33454caf2d264f2783e6fbddff39987b95f Mon Sep 17 00:00:00 2001 From: sam Date: Mon, 18 Nov 2024 20:26:03 +0100 Subject: [PATCH 34/57] feat(dashboard): ignore messages page, remove ignore channel page --- .../Api/GuildsController.ChannelsRoles.cs | 118 +++++-- .../Api/GuildsController.KeyRoles.cs | 61 ++++ Catalogger.Backend/Api/GuildsController.cs | 8 +- Catalogger.Frontend/package.json | 4 +- Catalogger.Frontend/src/lib/api.ts | 12 +- .../lib/components/RemovableListItem.svelte | 12 + .../src/lib/components/RoleListItem.svelte | 18 + .../src/routes/dash/[guildId]/+layout.svelte | 22 +- .../src/routes/dash/[guildId]/+page.svelte | 3 +- .../routes/dash/[guildId]/RoleSelect.svelte | 18 + .../[guildId]/ignored-channels/+page.svelte | 114 ------- .../[guildId]/ignored-messages/+page.svelte | 320 ++++++++++++++++++ .../+page.ts | 0 .../dash/[guildId]/ignored-users/+page.svelte | 119 ------- .../routes/dash/[guildId]/import/+page.svelte | 8 +- .../dash/[guildId]/key-roles/+page.svelte | 14 +- .../dash/[guildId]/redirects/+page.svelte | 25 +- Catalogger.Frontend/yarn.lock | 14 +- 18 files changed, 575 insertions(+), 315 deletions(-) create mode 100644 Catalogger.Backend/Api/GuildsController.KeyRoles.cs create mode 100644 Catalogger.Frontend/src/lib/components/RemovableListItem.svelte create mode 100644 Catalogger.Frontend/src/lib/components/RoleListItem.svelte create mode 100644 Catalogger.Frontend/src/routes/dash/[guildId]/RoleSelect.svelte delete mode 100644 Catalogger.Frontend/src/routes/dash/[guildId]/ignored-channels/+page.svelte create mode 100644 Catalogger.Frontend/src/routes/dash/[guildId]/ignored-messages/+page.svelte rename Catalogger.Frontend/src/routes/dash/[guildId]/{ignored-users => ignored-messages}/+page.ts (100%) delete mode 100644 Catalogger.Frontend/src/routes/dash/[guildId]/ignored-users/+page.svelte diff --git a/Catalogger.Backend/Api/GuildsController.ChannelsRoles.cs b/Catalogger.Backend/Api/GuildsController.ChannelsRoles.cs index 7fc43ac..b3a6928 100644 --- a/Catalogger.Backend/Api/GuildsController.ChannelsRoles.cs +++ b/Catalogger.Backend/Api/GuildsController.ChannelsRoles.cs @@ -13,18 +13,15 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -using System.Net; -using Catalogger.Backend.Api.Middleware; using Microsoft.AspNetCore.Mvc; -using Remora.Discord.API; using Remora.Discord.API.Abstractions.Objects; namespace Catalogger.Backend.Api; public partial class GuildsController { - [HttpPut("ignored-channels/{channelId}")] - public async Task AddIgnoredChannelAsync(string id, ulong channelId) + [HttpPut("ignored-messages/channels/{channelId}")] + public async Task AddIgnoredMessageChannelAsync(string id, ulong channelId) { var (guildId, _) = await ParseGuildAsync(id); var guildConfig = await guildRepository.GetAsync(guildId); @@ -53,8 +50,8 @@ public partial class GuildsController return NoContent(); } - [HttpDelete("ignored-channels/{channelId}")] - public async Task RemoveIgnoredChannelAsync(string id, ulong channelId) + [HttpDelete("ignored-messages/channels/{channelId}")] + public async Task RemoveIgnoredMessageChannelAsync(string id, ulong channelId) { var (guildId, _) = await ParseGuildAsync(id); var guildConfig = await guildRepository.GetAsync(guildId); @@ -65,40 +62,109 @@ public partial class GuildsController return NoContent(); } - [HttpPut("key-roles/{roleId}")] - public async Task AddKeyRoleAsync(string id, ulong roleId) + [HttpPut("ignored-messages/roles/{roleId}")] + public async Task AddIgnoredMessageRoleAsync(string id, ulong roleId) { var (guildId, _) = await ParseGuildAsync(id); var guildConfig = await guildRepository.GetAsync(guildId); + if (guildConfig.Messages.IgnoredRoles.Contains(roleId)) + return NoContent(); + if (roleCache.GuildRoles(guildId).All(r => r.ID.Value != roleId)) - throw new ApiError(HttpStatusCode.BadRequest, ErrorCode.BadRequest, "Role not found"); + return NoContent(); - if (guildConfig.KeyRoles.Contains(roleId)) - throw new ApiError( - HttpStatusCode.BadRequest, - ErrorCode.BadRequest, - "Role is already a key role" - ); + guildConfig.Messages.IgnoredRoles.Add(roleId); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); - await guildRepository.AddKeyRoleAsync(guildId, DiscordSnowflake.New(roleId)); return NoContent(); } - [HttpDelete("key-roles/{roleId}")] - public async Task RemoveKeyRoleAsync(string id, ulong roleId) + [HttpDelete("ignored-messages/roles/{roleId}")] + public async Task RemoveIgnoredMessageRoleAsync(string id, ulong roleId) { var (guildId, _) = await ParseGuildAsync(id); var guildConfig = await guildRepository.GetAsync(guildId); - if (!guildConfig.KeyRoles.Contains(roleId)) - throw new ApiError( - HttpStatusCode.BadRequest, - ErrorCode.BadRequest, - "Role is already not a key role" - ); + guildConfig.Messages.IgnoredRoles.Remove(roleId); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + + return NoContent(); + } + + [HttpPut("ignored-entities/channels/{channelId}")] + public async Task AddIgnoredEntityChannelAsync(string id, ulong channelId) + { + var (guildId, _) = await ParseGuildAsync(id); + var guildConfig = await guildRepository.GetAsync(guildId); + + if (guildConfig.IgnoredChannels.Contains(channelId)) + return NoContent(); + + var channel = channelCache + .GuildChannels(guildId) + .FirstOrDefault(c => + c.ID.Value == channelId + && c.Type + is ChannelType.GuildText + or ChannelType.GuildCategory + or ChannelType.GuildAnnouncement + or ChannelType.GuildForum + or ChannelType.GuildMedia + or ChannelType.GuildVoice + ); + if (channel == null) + return NoContent(); + + guildConfig.IgnoredChannels = [.. guildConfig.IgnoredChannels, channelId]; + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + + return NoContent(); + } + + [HttpDelete("ignored-entities/channels/{channelId}")] + public async Task RemoveIgnoredEntityChannelAsync(string id, ulong channelId) + { + var (guildId, _) = await ParseGuildAsync(id); + var guildConfig = await guildRepository.GetAsync(guildId); + + var channels = guildConfig.IgnoredChannels.ToList(); + channels.Remove(channelId); + guildConfig.IgnoredChannels = channels.ToArray(); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + + return NoContent(); + } + + [HttpPut("ignored-entities/roles/{roleId}")] + public async Task AddIgnoredEntityRoleAsync(string id, ulong roleId) + { + var (guildId, _) = await ParseGuildAsync(id); + var guildConfig = await guildRepository.GetAsync(guildId); + + if (guildConfig.Messages.IgnoredRoles.Contains(roleId)) + return NoContent(); + + if (roleCache.GuildRoles(guildId).All(r => r.ID.Value != roleId)) + return NoContent(); + + guildConfig.IgnoredRoles = [.. guildConfig.IgnoredRoles, roleId]; + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); + + return NoContent(); + } + + [HttpDelete("ignored-entities/roles/{roleId}")] + public async Task RemoveIgnoredEntityRoleAsync(string id, ulong roleId) + { + var (guildId, _) = await ParseGuildAsync(id); + var guildConfig = await guildRepository.GetAsync(guildId); + + var roles = guildConfig.IgnoredRoles.ToList(); + roles.Remove(roleId); + guildConfig.IgnoredRoles = roles.ToArray(); + await guildRepository.UpdateChannelConfigAsync(guildId, guildConfig); - await guildRepository.RemoveKeyRoleAsync(guildId, DiscordSnowflake.New(roleId)); return NoContent(); } } diff --git a/Catalogger.Backend/Api/GuildsController.KeyRoles.cs b/Catalogger.Backend/Api/GuildsController.KeyRoles.cs new file mode 100644 index 0000000..2580042 --- /dev/null +++ b/Catalogger.Backend/Api/GuildsController.KeyRoles.cs @@ -0,0 +1,61 @@ +// Copyright (C) 2021-present sam (starshines.gay) +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +using System.Net; +using Catalogger.Backend.Api.Middleware; +using Microsoft.AspNetCore.Mvc; +using Remora.Discord.API; + +namespace Catalogger.Backend.Api; + +public partial class GuildsController +{ + [HttpPut("key-roles/{roleId}")] + public async Task AddKeyRoleAsync(string id, ulong roleId) + { + var (guildId, _) = await ParseGuildAsync(id); + var guildConfig = await guildRepository.GetAsync(guildId); + + if (roleCache.GuildRoles(guildId).All(r => r.ID.Value != roleId)) + throw new ApiError(HttpStatusCode.BadRequest, ErrorCode.BadRequest, "Role not found"); + + if (guildConfig.KeyRoles.Contains(roleId)) + throw new ApiError( + HttpStatusCode.BadRequest, + ErrorCode.BadRequest, + "Role is already a key role" + ); + + await guildRepository.AddKeyRoleAsync(guildId, DiscordSnowflake.New(roleId)); + return NoContent(); + } + + [HttpDelete("key-roles/{roleId}")] + public async Task RemoveKeyRoleAsync(string id, ulong roleId) + { + var (guildId, _) = await ParseGuildAsync(id); + var guildConfig = await guildRepository.GetAsync(guildId); + + if (!guildConfig.KeyRoles.Contains(roleId)) + throw new ApiError( + HttpStatusCode.BadRequest, + ErrorCode.BadRequest, + "Role is already not a key role" + ); + + await guildRepository.RemoveKeyRoleAsync(guildId, DiscordSnowflake.New(roleId)); + return NoContent(); + } +} diff --git a/Catalogger.Backend/Api/GuildsController.cs b/Catalogger.Backend/Api/GuildsController.cs index dfd6479..5eb29f3 100644 --- a/Catalogger.Backend/Api/GuildsController.cs +++ b/Catalogger.Backend/Api/GuildsController.cs @@ -111,6 +111,9 @@ public partial class GuildsController( categories, channelsWithoutCategories, roles, + guildConfig.IgnoredChannels, + guildConfig.IgnoredRoles, + guildConfig.Messages, guildConfig.Channels, guildConfig.KeyRoles ) @@ -137,7 +140,10 @@ public partial class GuildsController( IEnumerable Categories, IEnumerable ChannelsWithoutCategory, IEnumerable Roles, - Database.Models.Guild.ChannelConfig Config, + ulong[] IgnoredChannels, + ulong[] IgnoredRoles, + Database.Models.Guild.MessageConfig Messages, + Database.Models.Guild.ChannelConfig Channels, ulong[] KeyRoles ); diff --git a/Catalogger.Frontend/package.json b/Catalogger.Frontend/package.json index bfb736a..d1142b3 100644 --- a/Catalogger.Frontend/package.json +++ b/Catalogger.Frontend/package.json @@ -14,7 +14,7 @@ "devDependencies": { "@sveltejs/adapter-static": "^3.0.5", "@sveltejs/kit": "^2.0.0", - "@sveltejs/vite-plugin-svelte": "3", + "@sveltejs/vite-plugin-svelte": "^3.0.0", "@sveltestrap/sveltestrap": "^6.2.7", "@types/eslint": "^9.6.0", "@types/file-saver": "^2.0.7", @@ -32,7 +32,7 @@ "sass": "^1.80.1", "snarkdown": "^2.0.0", "svelecte": "^4.3.1", - "svelte": "4", + "svelte": "^4.2.7", "svelte-check": "^4.0.0", "typescript": "^5.0.0", "typescript-eslint": "^8.0.0", diff --git a/Catalogger.Frontend/src/lib/api.ts b/Catalogger.Frontend/src/lib/api.ts index a52aa7c..05c6d67 100644 --- a/Catalogger.Frontend/src/lib/api.ts +++ b/Catalogger.Frontend/src/lib/api.ts @@ -78,7 +78,10 @@ export type FullGuild = { categories: GuildCategory[]; channels_without_category: GuildChannel[]; roles: GuildRole[]; - config: GuildConfig; + ignored_channels: string[]; + ignored_roles: string[]; + messages: MessageConfig; + channels: ChannelConfig; key_roles: string[]; }; @@ -114,14 +117,15 @@ export type ApiError = { message: string; }; -export type GuildConfig = GuildChannelConfig & { +export type MessageConfig = { ignored_channels: string[]; ignored_users: string[]; + ignored_roles: string[]; ignored_users_per_channel: Record; - redirects: Record; }; -export type GuildChannelConfig = { +export type ChannelConfig = { + redirects: Record; guild_update: string; guild_emojis_update: string; guild_role_create: string; diff --git a/Catalogger.Frontend/src/lib/components/RemovableListItem.svelte b/Catalogger.Frontend/src/lib/components/RemovableListItem.svelte new file mode 100644 index 0000000..3c63c68 --- /dev/null +++ b/Catalogger.Frontend/src/lib/components/RemovableListItem.svelte @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/Catalogger.Frontend/src/lib/components/RoleListItem.svelte b/Catalogger.Frontend/src/lib/components/RoleListItem.svelte new file mode 100644 index 0000000..eed5c13 --- /dev/null +++ b/Catalogger.Frontend/src/lib/components/RoleListItem.svelte @@ -0,0 +1,18 @@ + + + + {#if typeof role === "string"} + (unknown role {role}) + {:else} + + {role.name} + {/if} + diff --git a/Catalogger.Frontend/src/routes/dash/[guildId]/+layout.svelte b/Catalogger.Frontend/src/routes/dash/[guildId]/+layout.svelte index 6ec80b5..c3ddeaf 100644 --- a/Catalogger.Frontend/src/routes/dash/[guildId]/+layout.svelte +++ b/Catalogger.Frontend/src/routes/dash/[guildId]/+layout.svelte @@ -2,7 +2,7 @@ import { Button, Nav, NavItem, NavLink } from "@sveltestrap/sveltestrap"; import type { LayoutData } from "./$types"; import { page } from "$app/stores"; - import apiFetch, { type ApiError, type GuildConfig } from "$lib/api"; + import apiFetch, { type ApiError, type ChannelConfig } from "$lib/api"; import { addToast } from "$lib/toast"; export let data: LayoutData; @@ -10,16 +10,16 @@ // This only saves log channels. All other pages are lists and are saved immediately upon adding/removing an entry. const save = async () => { try { - const resp = await apiFetch( + const resp = await apiFetch( "PATCH", `/api/guilds/${data.guild.id}`, - data.guild.config, + data.guild.channels, ); - data.guild.config = resp; + data.guild.channels = resp; addToast({ header: "Saved log channels.", - body: "Successfully edited log channels and ignored channels.", + body: "Successfully edited log channels.", }); } catch (e) { addToast({ @@ -51,16 +51,10 @@ Redirects - Ignored channels - - - Ignored users + Ignored messages import { Label } from "@sveltestrap/sveltestrap"; - import type { GuildChannelConfig } from "$lib/api"; import type { PageData } from "./$types"; import ChannelSelect from "./ChannelSelect.svelte"; export let data: PageData; - $: channels = data.guild.config as GuildChannelConfig; + $: channels = data.guild.channels;

Log channels

diff --git a/Catalogger.Frontend/src/routes/dash/[guildId]/RoleSelect.svelte b/Catalogger.Frontend/src/routes/dash/[guildId]/RoleSelect.svelte new file mode 100644 index 0000000..3dfc5c9 --- /dev/null +++ b/Catalogger.Frontend/src/routes/dash/[guildId]/RoleSelect.svelte @@ -0,0 +1,18 @@ + + + diff --git a/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-channels/+page.svelte b/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-channels/+page.svelte deleted file mode 100644 index 7764287..0000000 --- a/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-channels/+page.svelte +++ /dev/null @@ -1,114 +0,0 @@ - - -

Ignored channels

- -

- Messages from ignored channels will not be logged. Changes to ignored channels - will also not be logged, but note that ignored channels being deleted - (or new channels being created in an ignored category) will still be logged. -

- -
- - -
- -
- -
- -
-

Currently ignored channels

-
- - - {#each ignored as id} - - {channelName(id)} - - - {/each} - diff --git a/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-messages/+page.svelte b/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-messages/+page.svelte new file mode 100644 index 0000000..8704e8a --- /dev/null +++ b/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-messages/+page.svelte @@ -0,0 +1,320 @@ + + +

Ignored messages

+ +

Here you can select which channels and roles to ignore messages from.

+ +

How it works

+ +

Messages will be ignored if:

+ +
    +
  • They are posted in a channel that is listed here
  • +
  • + They are posted in a channel in a category that is listed here +
  • +
  • They are posted in a thread that's in a channel that is listed here
  • +
  • + They are posted by a person with at least one role that is listed here +
  • +
  • They are posted by a user that is listed here
  • +
+ +

+ Additionally, messages from ignored users are also ignored. +

+ +

Channels

+ +
+ +
+ +
+ +
+ + + {#each ignoredChannels as id} + removeChannelIgnore(id)} + buttonText="Stop ignoring" + > + {channelName(id)} + + {/each} + + +

Roles

+ +
+ +
+ +
+ +
+ + + {#each ignoredRoles as id} + removeRoleIgnore(id)} + buttonText="Stop ignoring" + /> + {/each} + + +

Users

+ +
+ + {#if userToIgnore && !userIdRegex.test(userToIgnore)} +

+ If you're not ignoring a member of your server, you need to give a + user ID, not their username. +

+ {/if} +
+ +
+ +
+ + + {#each data.users as user (user.id)} + removeUserIgnore(user.id)} + buttonText="Stop ignoring" + > + {user.tag} (ID: {user.id}) + + {/each} + diff --git a/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-users/+page.ts b/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-messages/+page.ts similarity index 100% rename from Catalogger.Frontend/src/routes/dash/[guildId]/ignored-users/+page.ts rename to Catalogger.Frontend/src/routes/dash/[guildId]/ignored-messages/+page.ts diff --git a/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-users/+page.svelte b/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-users/+page.svelte deleted file mode 100644 index 544d73b..0000000 --- a/Catalogger.Frontend/src/routes/dash/[guildId]/ignored-users/+page.svelte +++ /dev/null @@ -1,119 +0,0 @@ - - -

Ignored users

- -

Messages from ignored users will not be logged.

- -
- - - {#if toIgnore && !idRegex.test(toIgnore)} -

- If you're not ignoring a member of your server, you need to give a - user ID, not their username. -

- {/if} -
- -
- -
- -

Currently ignored users

- - - {#each data.users as user (user.id)} - - {user.tag} (ID: {user.id}) - - - {/each} - diff --git a/Catalogger.Frontend/src/routes/dash/[guildId]/import/+page.svelte b/Catalogger.Frontend/src/routes/dash/[guildId]/import/+page.svelte index 7a8fccb..4c32d95 100644 --- a/Catalogger.Frontend/src/routes/dash/[guildId]/import/+page.svelte +++ b/Catalogger.Frontend/src/routes/dash/[guildId]/import/+page.svelte @@ -1,5 +1,5 @@

Key roles

@@ -95,14 +93,8 @@

Current key roles

- {#each keyRoles as r (r.id)} - - - - {r.name} - - - + {#each keyRoles as role (role.id)} + removeRole(role.id)} /> {/each}

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