From 716e802a5725b9d4ce5046d10bf829ea2f371b9c Mon Sep 17 00:00:00 2001 From: Tim Kuhlmann Date: Mon, 2 Dec 2024 10:24:50 +0100 Subject: [PATCH 1/7] improve AddNodeAction placement - Position new nodes without sibling overlap. - X/Z size is determined relative to parent extents and actual available space in target region. - Maximal X/Z size is kept to 20% of parent according to previous implementation. - X/Z size of new nodes is squarified. - Z height is a fixed world-space configuration value. - If space does not suffice, placement is prevented and a notification is displayed. --- Assets/SEE/Controls/Actions/AddNodeAction.cs | 410 +++++++++++++++--- .../SEE/Controls/Actions/ResizeNodeAction.cs | 65 +-- .../Game/SceneManipulation/GameNodeMover.cs | 8 +- .../Game/SceneManipulation/SpatialMetrics.cs | 259 +++++++++++ .../SceneManipulation/SpatialMetrics.cs.meta | 11 + .../SEE/GameObjects/GameObjectExtensions.cs | 27 ++ Assets/SEE/Utils/SEEMath.cs | 111 +++++ Assets/SEE/Utils/SEEMath.cs.meta | 11 + 8 files changed, 782 insertions(+), 120 deletions(-) create mode 100644 Assets/SEE/Game/SceneManipulation/SpatialMetrics.cs create mode 100644 Assets/SEE/Game/SceneManipulation/SpatialMetrics.cs.meta create mode 100644 Assets/SEE/Utils/SEEMath.cs create mode 100644 Assets/SEE/Utils/SEEMath.cs.meta diff --git a/Assets/SEE/Controls/Actions/AddNodeAction.cs b/Assets/SEE/Controls/Actions/AddNodeAction.cs index 2784b1e509..e707566e14 100644 --- a/Assets/SEE/Controls/Actions/AddNodeAction.cs +++ b/Assets/SEE/Controls/Actions/AddNodeAction.cs @@ -1,14 +1,15 @@ -using System.Collections.Generic; -using SEE.GO; -using SEE.Net.Actions; -using SEE.Utils.History; +using System; +using System.Collections.Generic; using UnityEngine; using SEE.Audio; +using SEE.DataModel.DG; using SEE.Game.SceneManipulation; -using SEE.Utils; -using System; +using SEE.GO; +using SEE.Net.Actions; +using SEE.UI.Notification; using SEE.UI.PropertyDialog; -using SEE.DataModel.DG; +using SEE.Utils; +using SEE.Utils.History; using SEE.XR; namespace SEE.Controls.Actions @@ -44,16 +45,22 @@ private enum ProgressState private ProgressState progress = ProgressState.NoNodeSelected; /// - /// The chosen parent for the new node. - /// Will be used for context menu execution. + /// The chosen parent for the new node when executed via context menu. /// - private GameObject parent; + private GameObject contextMenuTargetParent; /// - /// The chosen position for the new node. - /// Will be used for context menu execution. + /// The chosen local position for the new node on its parent when executed via context menu. /// - private Vector3 position; + private Vector3 contextMenuTargetLocalPosition; + + /// + /// Tolerance value for comparing localScale to minimal size threshold. + /// + /// This is necessary to compensate for precision fluctuations in float values. + /// + /// + private const float tolerance = 0.0001f; /// /// If the user clicks with the mouse hitting a game object representing a graph node, @@ -71,21 +78,18 @@ public override bool Update() if (SceneSettings.InputType == PlayerInputType.DesktopPlayer && Input.GetMouseButtonDown(0) && Raycasting.RaycastGraphElement(out RaycastHit raycastHit, out GraphElementRef _) == HitGraphElement.Node) { - // the hit object is the parent in which to create the new node - GameObject parent = raycastHit.collider.gameObject; - AddNode(raycastHit.collider.gameObject, raycastHit.point); + AddNode(raycastHit.collider.gameObject, raycastHit.transform.InverseTransformPoint(raycastHit.point)); } else if (SceneSettings.InputType == PlayerInputType.VRPlayer && XRSEEActions.Selected && InteractableObject.HoveredObjectWithWorldFlag.gameObject != null && InteractableObject.HoveredObjectWithWorldFlag.gameObject.HasNodeRef() && - XRSEEActions.RayInteractor.TryGetCurrent3DRaycastHit(out RaycastHit res)) + XRSEEActions.RayInteractor.TryGetCurrent3DRaycastHit(out raycastHit)) { - // the hit object is the parent in which to create the new node - GameObject parent = res.collider.gameObject; XRSEEActions.Selected = false; - AddNode(res.collider.gameObject, res.point); + AddNode(raycastHit.collider.gameObject, raycastHit.transform.InverseTransformPoint(raycastHit.point)); } else if (ExecuteViaContextMenu) { - AddNode(parent, position); + ExecuteViaContextMenu = false; + AddNode(contextMenuTargetParent, contextMenuTargetLocalPosition); } break; case ProgressState.WaitingForInput: @@ -94,7 +98,7 @@ public override bool Update() case ProgressState.Finish: result = true; CurrentState = IReversibleAction.Progress.Completed; - AudioManagerImpl.EnqueueSoundEffect(IAudioManager.SoundEffect.NewNodeSound, parent); + AudioManagerImpl.EnqueueSoundEffect(IAudioManager.SoundEffect.NewNodeSound, addedGameNode); break; default: throw new NotImplementedException($"Unhandled case {nameof(progress)}."); @@ -104,30 +108,338 @@ public override bool Update() /// /// Adds a node on the chosen at the - /// chosen . + /// chosen . /// /// The parent on which to place the node. - /// The position where the node should be placed. - private void AddNode(GameObject parent, Vector3 position) + /// The local position where the node should be placed. + private void AddNode(GameObject parent, Vector3 targetPosition) { + Vector3 minLocalScale = SpatialMetrics.MinNodeSizeLocalScale(parent.transform); + Vector3 localPadding = parent.transform.InverseTransformVector(SpatialMetrics.Padding); + Bounds parentBounds3D = parent.LocalBounds(); + Bounds2D parentBounds = new( + parentBounds3D.min.x + localPadding.x, + parentBounds3D.max.x - localPadding.x, + parentBounds3D.min.z + localPadding.z, + parentBounds3D.max.z - localPadding.z); + + // Initial intended/default size + Bounds2D bounds = new( + targetPosition.x - Mathf.Max(SpatialMetrics.HalfDefaultNodeLocalScale, 0.5f * minLocalScale.x), + targetPosition.x + Mathf.Max(SpatialMetrics.HalfDefaultNodeLocalScale, 0.5f * minLocalScale.x), + targetPosition.z - Mathf.Max(SpatialMetrics.HalfDefaultNodeLocalScale, 0.5f * minLocalScale.z), + targetPosition.z + Mathf.Max(SpatialMetrics.HalfDefaultNodeLocalScale, 0.5f * minLocalScale.z)); + + // Move inside parent area + if (bounds.Left < parentBounds.Left) + { + float diff = parentBounds.Left - bounds.Left; + bounds.Left = parentBounds.Left; + bounds.Right = Mathf.Min(bounds.Right + diff, parentBounds.Right); + } + if (bounds.Right > parentBounds.Right) + { + float diff = bounds.Right - parentBounds.Right; + bounds.Right = parentBounds.Right; + bounds.Left = Mathf.Max(bounds.Left - diff, parentBounds.Left); + } + if (bounds.Back < parentBounds.Back) + { + float diff = parentBounds.Back - bounds.Back; + bounds.Back = parentBounds.Back; + bounds.Front = Mathf.Min(bounds.Front + diff, parentBounds.Front); + } + if (bounds.Front > parentBounds.Front) + { + float diff = bounds.Front - parentBounds.Front; + bounds.Front = parentBounds.Front; + bounds.Back = Mathf.Max(bounds.Back - diff, parentBounds.Back); + } + + // Shrink by raycasting on X/Z axes + List siblingBoundsList = new(); + Bounds2D potentialGrow = new(0f, 0f, 0f, 0f); + foreach (Transform sibling in parent.transform) + { + if (!sibling.gameObject.IsNodeAndActiveSelf()) + { + continue; + } + + Vector3 siblingSize = sibling.gameObject.LocalSize(); + Vector3 siblingPos = sibling.localPosition; + Bounds2D siblingBounds = new( + siblingPos.x - siblingSize.x / 2 - localPadding.x, + siblingPos.x + siblingSize.x / 2 + localPadding.x, + siblingPos.z - siblingSize.z / 2 - localPadding.z, + siblingPos.z + siblingSize.z / 2 + localPadding.z); + siblingBoundsList.Add(siblingBounds); + + if (siblingBounds.LineIntersect(new(targetPosition.x, targetPosition.z), Direction2D.Left) && bounds.Left <= siblingBounds.Right) + { + float newVal = SEEMath.BitIncrement(siblingBounds.Right); + potentialGrow.Right = newVal - bounds.Left; + potentialGrow.Left = 0f; + bounds.Left = newVal; + } + if (siblingBounds.LineIntersect(new(targetPosition.x, targetPosition.z), Direction2D.Right) && bounds.Right >= siblingBounds.Left) + { + float newVal = SEEMath.BitDecrement(siblingBounds.Left); + potentialGrow.Left = bounds.Right - newVal; + potentialGrow.Right = 0f; + bounds.Right = newVal; + } + if (siblingBounds.LineIntersect(new(targetPosition.x, targetPosition.z), Direction2D.Back) && bounds.Back <= siblingBounds.Front) + { + float newVal = SEEMath.BitIncrement(siblingBounds.Front); + potentialGrow.Front = newVal - bounds.Back; + potentialGrow.Back = 0f; + bounds.Back = newVal; + } + if (siblingBounds.LineIntersect(new(targetPosition.x, targetPosition.z), Direction2D.Front) && bounds.Front >= siblingBounds.Back) + { + float newVal = SEEMath.BitDecrement(siblingBounds.Back); + potentialGrow.Back = bounds.Front - newVal; + potentialGrow.Front = 0f; + bounds.Front = newVal; + } + } + + // Shrink to prevent sibling overlap + foreach (Bounds2D siblingBounds in siblingBoundsList) + { + if(!bounds.HasOverlap(siblingBounds)) + { + continue; + } + + + // Determine shrink direction: weight by area size + float area = 0f; + float potentialArea; + Direction2D direction = Direction2D.None; + if (bounds.Left < siblingBounds.Right) + { + float overlapLen = siblingBounds.Right - bounds.Left; + potentialArea = (bounds.Right - bounds.Left - overlapLen) * (bounds.Front - bounds.Back); + if (potentialArea > area) + { + area = potentialArea; + direction = Direction2D.Left; + } + } + if (siblingBounds.Left < bounds.Right) + { + float overlapLen = bounds.Right - siblingBounds.Left; + potentialArea = (bounds.Right - bounds.Left - overlapLen) * (bounds.Front - bounds.Back); + if (potentialArea > area) + { + area = potentialArea; + direction = Direction2D.Right; + } + } + if (bounds.Back < siblingBounds.Front) + { + float overlapLen = siblingBounds.Front - bounds.Back; + potentialArea = (bounds.Right - bounds.Left) * (bounds.Front - bounds.Back - overlapLen); + if (potentialArea > area) + { + area = potentialArea; + direction = Direction2D.Back; + } + } + if (siblingBounds.Back < bounds.Front) + { + float overlapLen = bounds.Front - siblingBounds.Back; + potentialArea = (bounds.Right - bounds.Left) * (bounds.Front - bounds.Back - overlapLen); + if (potentialArea > area) + { + area = potentialArea; + direction = Direction2D.Front; + } + } + + // Adapt bounds to prevent overlap with siblings + switch (direction) + { + case Direction2D.Left: { + float newVal = SEEMath.BitIncrement(siblingBounds.Right); + potentialGrow.Right += newVal - bounds.Left; + potentialGrow.Left = 0f; + bounds.Left = newVal; + break; + } + case Direction2D.Right: { + float newVal = SEEMath.BitDecrement(siblingBounds.Left); + potentialGrow.Left += bounds.Right - newVal; + potentialGrow.Right = 0f; + bounds.Right = newVal; + break; + } + case Direction2D.Back: { + float newVal = SEEMath.BitIncrement(siblingBounds.Front); + potentialGrow.Front += newVal - bounds.Back; + potentialGrow.Back = 0f; + bounds.Back = newVal; + break; + } + case Direction2D.Front: { + float newVal = SEEMath.BitDecrement(siblingBounds.Back); + potentialGrow.Back += bounds.Front - newVal; + potentialGrow.Front = 0f; + bounds.Front = newVal; + break; + } + } + } + + // Grow to fill available space + foreach (Direction2D direction in new Direction2D[] {Direction2D.Left, Direction2D.Right, Direction2D.Back, Direction2D.Front}) + { + float oldValue; + switch (direction) + { + case Direction2D.Left: + if (Mathf.Approximately(potentialGrow.Left, 0f)) + { + continue; + } + oldValue = bounds.Left; + bounds.Left = Mathf.Max(bounds.Left - potentialGrow.Left, parentBounds.Left); + break; + case Direction2D.Right: + if (Mathf.Approximately(potentialGrow.Right, 0f)) + { + continue; + } + oldValue = bounds.Right; + bounds.Right = Mathf.Min(bounds.Right + potentialGrow.Right, parentBounds.Right); + break; + case Direction2D.Back: + if (Mathf.Approximately(potentialGrow.Back, 0f)) + { + continue; + } + oldValue = bounds.Back; + bounds.Back = Mathf.Max(bounds.Back - potentialGrow.Back, parentBounds.Back); + break; + case Direction2D.Front: + if (Mathf.Approximately(potentialGrow.Front, 0f)) + { + continue; + } + oldValue = bounds.Front; + bounds.Front = Mathf.Min(bounds.Front + potentialGrow.Front, parentBounds.Front); + break; + default: + continue; + } + + float newValue; + foreach (Bounds2D siblingBounds in siblingBoundsList) + { + if(!bounds.HasOverlap(siblingBounds)) + { + continue; + } + + if (direction == Direction2D.Left && bounds.Left < siblingBounds.Right && + (newValue = SEEMath.BitIncrement(siblingBounds.Right)) <= oldValue) + { + bounds.Left = newValue; + } + if (direction == Direction2D.Right && bounds.Right > siblingBounds.Left && + (newValue = SEEMath.BitDecrement(siblingBounds.Left)) >= oldValue) + { + bounds.Right = newValue; + } + if (direction == Direction2D.Back && bounds.Back < siblingBounds.Front && + (newValue = SEEMath.BitIncrement(siblingBounds.Front)) <= oldValue) + { + bounds.Back = newValue; + } + if (direction == Direction2D.Front && bounds.Front > siblingBounds.Back && + (newValue = SEEMath.BitDecrement(siblingBounds.Back)) >= oldValue) + { + bounds.Front = newValue; + } + } + } + + float localHeight = SpatialMetrics.DefaultNodeHeight * parent.transform.InverseTransformVector(Vector3.up).y; + Vector3 scale = new( + bounds.Right - bounds.Left, + localHeight, + bounds.Front - bounds.Back); + Vector3 position = new( + bounds.Left + 0.5f * scale.x, + parentBounds3D.max.y + localPadding.y + 0.5f * localHeight, + bounds.Back + 0.5f * scale.z); + + // Squarify + Vector3 lossyScale = Vector3.Scale(scale, parent.transform.lossyScale); + if (lossyScale.x < lossyScale.z) + { + scale.z = lossyScale.x / parent.transform.lossyScale.z; + + // Move close to target position + float newBackBound = position.z - 0.5f * scale.z; + float maxMovement = newBackBound - bounds.Back; + float targetMovement = targetPosition.z - position.z; + float actualMovement = Mathf.Min(maxMovement, Mathf.Abs(targetMovement)); + if (targetMovement >= 0f) + { + position.z += actualMovement; + } + else + { + position.z -= actualMovement; + } + } + else + { + scale.x = lossyScale.z / parent.transform.lossyScale.x; + + // Move close to target position + float newLeftBound = position.x - 0.5f * scale.x; + float maxMovement = newLeftBound - bounds.Left; + float targetMovement = targetPosition.x - position.x; + float actualMovement = Mathf.Min(maxMovement, Mathf.Abs(targetMovement)); + if (targetMovement >= 0f) + { + position.x += actualMovement; + } + else + { + position.x -= actualMovement; + } + } + + // Enforce minimal size + if (scale.x + tolerance < minLocalScale.x || scale.z + tolerance < minLocalScale.z) + { + ShowNotification.Warn( + "Node Not Created", + "There is not enough space to create a new node at the given position."); + return; + } + addedGameNode = GameNodeAdder.AddChild(parent); - // addedGameNode has the scale and position of parent. - // The position at which the parent was hit will be the center point of the addedGameNode. - // The node is scaled down and placed on top of its parent. - addedGameNode.transform.localScale = new Vector3(0.2f, 0.2f, 0.2f); - addedGameNode.transform.position = GameNodeMover.GetCoordinatesOn(addedGameNode.transform.lossyScale, position, parent); - // TODO(#786) The new node is scaled down arbitrarily and might overlap with its siblings. + addedGameNode.transform.localScale = scale; + addedGameNode.transform.localPosition = position; + memento = new(child: addedGameNode, parent: parent) { NodeID = addedGameNode.name }; new AddNodeNetAction(parentID: memento.Parent.name, newNodeID: memento.NodeID, memento.Position, memento.Scale).Execute(); + progress = ProgressState.WaitingForInput; - OpenDialog(addedGameNode.GetNode()); + OpenDialog(addedGameNode); } /// - /// Opens a dialog where the user can enter the node name and type. + /// Opens a dialog where the user can enter the node name and select its type. /// If the user presses the OK button, the SourceName and Type of /// will have the new values entered /// and and @@ -136,17 +448,17 @@ private void AddNode(GameObject parent, Vector3 position) /// If the user presses the Cancel button, the node will be created as /// an unnamed node with the unkown type. /// - private void OpenDialog(Node node) + /// New node. + private void OpenDialog(GameObject go) { + Node node = go.GetNode(); NodePropertyDialog dialog = new(node); - dialog.OnConfirm.AddListener(OKButtonPressed); - dialog.OnCancel.AddListener(CancelButtonPressed); + dialog.OnConfirm.AddListener(OnConfirm); + dialog.OnCancel.AddListener(OnCancel); dialog.Open(true); SEEInput.KeyboardShortcutsEnabled = false; - return; - - void OKButtonPressed() + void OnConfirm() { memento.Name = node.SourceName; memento.Type = node.Type; @@ -156,16 +468,12 @@ void OKButtonPressed() SEEInput.KeyboardShortcutsEnabled = true; } - void CancelButtonPressed() + void OnCancel() { - // Case when last used is used and it has a value other - // then 'UNKOWNTYPE', use it. - if (node.Type != Graph.UnknownType) - { - memento.Name = node.SourceName; - memento.Type = node.Type; - } - progress = ProgressState.Finish; + // New node discarded + Destroyer.Destroy(go); + new DeleteNetAction(go.name).Execute(); + progress = ProgressState.NoNodeSelected; SEEInput.KeyboardShortcutsEnabled = true; } } @@ -176,11 +484,11 @@ void CancelButtonPressed() /// performs the execution via context menu. /// /// The parent node. - /// The position where the node should be placed. + /// The world-space position where the node should be placed on parent. public void ContextMenuExecution(GameObject parent, Vector3 position) { - this.parent = parent; - this.position = position; + contextMenuTargetParent = parent; + contextMenuTargetLocalPosition = parent.transform.InverseTransformPoint(position); ExecuteViaContextMenu = true; } diff --git a/Assets/SEE/Controls/Actions/ResizeNodeAction.cs b/Assets/SEE/Controls/Actions/ResizeNodeAction.cs index 9fd544480f..907b5ca3d0 100644 --- a/Assets/SEE/Controls/Actions/ResizeNodeAction.cs +++ b/Assets/SEE/Controls/Actions/ResizeNodeAction.cs @@ -3,6 +3,7 @@ using UnityEngine; using UnityEngine.Rendering; using SEE.Game; +using SEE.Game.SceneManipulation; using SEE.GO; using SEE.Net.Actions; using SEE.Utils; @@ -329,16 +330,6 @@ private class ResizeGizmo : MonoBehaviour #region Configurations - /// - /// The minimal size of a node in world space. - /// - private static readonly Vector3 minSize = new (0.06f, 0.001f, 0.06f); - - /// - /// The minimal world-space distance between nodes while resizing. - /// - private const float padding = 0.004f; - /// /// A small offset is used as a difference between the detection and the set value /// to prevent instant re-detection. @@ -937,8 +928,8 @@ public ResizeStepData (Vector3 initialHitPoint, Vector3 direction, Transform tra localScale.y / lossyScale.y, localScale.z / lossyScale.z ); - MinLocalSize = Vector3.Scale(minSize, LocalScaleFactor); - LocalPadding = padding * LocalScaleFactor; + MinLocalSize = Vector3.Scale(SpatialMetrics.MinNodeSize, LocalScaleFactor); + LocalPadding = SpatialMetrics.Padding.x * LocalScaleFactor; Left = Direction.x < 0; Right = Direction.x > 0; Back = Direction.z < 0; @@ -947,56 +938,6 @@ public ResizeStepData (Vector3 initialHitPoint, Vector3 direction, Transform tra IsSet = true; } } - - /// - /// Data structure for 2-dimensional bounds. - /// - private struct Bounds2D - { - /// - /// The left side of the area. - /// - public float Left; - /// - /// The right side of the area. - /// - public float Right; - /// - /// The back side of the area. - /// - public float Back; - /// - /// The front side of the area. - /// - public float Front; - - /// - /// Initializes the struct. - /// - public Bounds2D (float left, float right, float back, float front) - { - Left = left; - Right = right; - Back = back; - Front = front; - } - - /// - /// Implicit conversion to string. - /// - public static implicit operator string(Bounds2D bounds) - { - return bounds.ToString(); - } - - /// - /// Returns a printable string with the struct's values. - /// - public override readonly string ToString() - { - return $"{nameof(Bounds2D)}(Left: {Left}, Right: {Right}, Bottom: {Back}, Top: {Front})"; - } - } } } } diff --git a/Assets/SEE/Game/SceneManipulation/GameNodeMover.cs b/Assets/SEE/Game/SceneManipulation/GameNodeMover.cs index 92bc9d5193..83ff8b5eea 100644 --- a/Assets/SEE/Game/SceneManipulation/GameNodeMover.cs +++ b/Assets/SEE/Game/SceneManipulation/GameNodeMover.cs @@ -8,12 +8,6 @@ namespace SEE.Game.SceneManipulation /// public static class GameNodeMover { - /// - /// Empty space on the y-axis between the top of the target object and the bottom of the child - /// object in world space units, used in . - /// - private const float TopPadding = 0.0001f; - /// /// Sets the for both in the /// game-object hierarchy and in the underlying graph. If @@ -63,7 +57,7 @@ public static void SetParent(GameObject child, GameObject newParent) public static Vector3 GetCoordinatesOn(Vector3 childWorldScale, Vector3 childPosition, GameObject target) { Vector3 childWorldExtent = childWorldScale / 2; - childPosition.y = target.GetRoof() + childWorldExtent.y + TopPadding; + childPosition.y = target.GetRoof() + childWorldExtent.y + SpatialMetrics.Padding.y; // Make sure mappingTarget stays within the roof of parent. { diff --git a/Assets/SEE/Game/SceneManipulation/SpatialMetrics.cs b/Assets/SEE/Game/SceneManipulation/SpatialMetrics.cs new file mode 100644 index 0000000000..39dd04de3b --- /dev/null +++ b/Assets/SEE/Game/SceneManipulation/SpatialMetrics.cs @@ -0,0 +1,259 @@ +using System; +using UnityEngine; + +namespace SEE.Game.SceneManipulation +{ + /// + /// Stores metrics that are used for working with node placement. + /// + public class SpatialMetrics + { + /// + /// A small offset used as a difference between the detection and the set value + /// to prevent instant re-detection. + /// + public const float DetectionOffset = 0.0001f; + + /// + /// A small offset used for handle placement just outside its parent to prevent Z-fighting. + /// + public const float PlacementOffset = 0.0001f; + + /// + /// The default local X/Z scale of a (new) node placed on another node. + /// + public static float DefaultNodeLocalScale = 0.2f; + + /// + /// Half the default local X/Z scale of a (new) node placed on another node, + /// typically used in bounds. + /// + public static float HalfDefaultNodeLocalScale = DefaultNodeLocalScale / 2f; + + /// + /// The default world-space Y-axis size of a (new) node. + /// + public static float DefaultNodeHeight = 0.002f; + + /// + /// The minimal size of a node in world space. + /// + public static readonly Vector3 MinNodeSize = new (0.06f, 0.001f, 0.06f); + + /// + /// The minimal world-space distance between nodes for placing or resizing (x/z, y). + /// + public static readonly Vector3 Padding = new(0.004f, 0.0001f, 0.004f); + + /// + /// The minimal size of a node in local scale. + /// + /// Transform of the reference node. + /// The in 's local scale. + public static Vector3 MinNodeSizeLocalScale(Transform localTransform) + { + return localTransform.InverseTransformVector(MinNodeSize); + } + } + + /// + /// Direction in 2D plane. + /// + public enum Direction2D + { + Left, Right, Back, Front, None + } + + /// + /// Data structure for 2-dimensional bounds. + /// + public struct Bounds2D + { + /// + /// The left side of the area. + /// + public float Left; + /// + /// The right side of the area. + /// + public float Right; + /// + /// The back side of the area. + /// + public float Back; + /// + /// The front side of the area. + /// + public float Front; + + /// + /// Initializes the struct. + /// + public Bounds2D (float left, float right, float back, float front) + { + Left = left; + Right = right; + Back = back; + Front = front; + } + + /// + /// Gets or sets the element at the specified direction. + /// + /// The direction of the element to get or set. + /// The element at the specified direction. + /// + /// Thrown when the direction is ambiguous or zero. + /// + public float this[Vector3 dir] + { + get { + if (dir == Vector3.left) + { + return Left; + } + if (dir == Vector3.right) + { + return Right; + } + if (dir == Vector3.forward) + { + return Front; + } + if (dir == Vector3.back) + { + return Back; + } + throw new IndexOutOfRangeException($"Given direction is not possible in {nameof(Bounds2D)}: {dir}"); + } + + set { + if (dir == Vector3.left) + { + Left = value; + } + else if (dir == Vector3.right) + { + Right = value; + } + else if (dir == Vector3.back) + { + Back = value; + } + else if (dir == Vector3.forward) + { + Front = value; + } + throw new IndexOutOfRangeException($"Given direction is not possible in {nameof(Bounds2D)}: {dir}"); + } + } + + /// + /// Gets or sets the element at the specified direction. + /// + /// The direction of the element to get or set. + /// The element at the specified direction. + /// + /// Thrown when the direction is . + /// + public float this[Direction2D dir] + { + get { + switch (dir) + { + case Direction2D.Left: + return Left; + case Direction2D.Right: + return Right; + case Direction2D.Back: + return Back; + case Direction2D.Front: + return Front; + default: + throw new IndexOutOfRangeException($"Given direction is not possible in {nameof(Bounds2D)}: {dir}"); + } + } + + set { + switch (dir) + { + case Direction2D.Left: + Left = value; + break; + case Direction2D.Right: + Right = value; + break; + case Direction2D.Back: + Back = value; + break; + case Direction2D.Front: + Front = value; + break; + default: + throw new IndexOutOfRangeException($"Given direction is not possible in {nameof(Bounds2D)}: {dir}"); + } + } + } + + /// + /// Implicit conversion to string. + /// + public static implicit operator string(Bounds2D bounds) + { + return bounds.ToString(); + } + + /// + /// Returns a printable string with the struct's values. + /// + public override readonly string ToString() + { + return $"{nameof(Bounds2D)}(Left: {Left}, Right: {Right}, Back: {Back}, Front: {Front})"; + } + + /// + /// Checks if there is an overlap between two bounds. + /// + /// The bounds of another object. + /// true iff the bounds overlap. + public bool HasOverlap(Bounds2D other) + { + if (Front < other.Back || Back > other.Front || Left > other.Right || Right < other.Left) + { + // No overlap detected + return false; + } + return true; + } + + /// + /// Simulates a simple raycast and returns true if the ray from + /// in given intersects with the bounds. + /// + /// The position from which to cast. + /// The direction in which to cast. + /// true if the ray intersects with the bounds, else false.> + public bool LineIntersect(Vector2 point, Direction2D direction) + { + if ((direction == Direction2D.Left || direction == Direction2D.Right) && + point.y >= Back && point.y <= Front) + { + if (direction == Direction2D.Left && point.x >= Right || + direction == Direction2D.Right && point.x <= Left) + { + return true; + } + } + else if ((direction == Direction2D.Back || direction == Direction2D.Front) && + point.x >= Left && point.x <= Right) + { + if (direction == Direction2D.Back && point.y >= Front || + direction == Direction2D.Front && point.y <= Back) + { + return true; + } + } + return false; + } + } +} diff --git a/Assets/SEE/Game/SceneManipulation/SpatialMetrics.cs.meta b/Assets/SEE/Game/SceneManipulation/SpatialMetrics.cs.meta new file mode 100644 index 0000000000..b9669c0a40 --- /dev/null +++ b/Assets/SEE/Game/SceneManipulation/SpatialMetrics.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5cc64e9d144ba6bc5a0dab63ebb27c78 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SEE/GameObjects/GameObjectExtensions.cs b/Assets/SEE/GameObjects/GameObjectExtensions.cs index aa596742e7..6e222a4067 100644 --- a/Assets/SEE/GameObjects/GameObjectExtensions.cs +++ b/Assets/SEE/GameObjects/GameObjectExtensions.cs @@ -508,6 +508,33 @@ public static Vector3 LocalSize(this GameObject gameObject) } } + /// + /// Returns the bounds of the given in its own + /// local coordinate system. + /// + /// Note: A primitive cube has a size of (1,1,1), and a coordinate center (pivot) + /// of (0,0,0). + /// However, that does not apply for all primitives or models in general. + /// + /// + /// The game object. + /// Local-space bounds of . + public static Bounds LocalBounds(this GameObject gameObject) + { + if (gameObject.TryGetComponent(out MeshFilter meshFilter)) + { + return meshFilter.sharedMesh.bounds; + } + if (gameObject.TryGetComponent(out Renderer renderer)) + { + return new( + gameObject.transform.InverseTransformPoint(renderer.bounds.center), + gameObject.transform.InverseTransformVector(renderer.bounds.size)); + } + // This fallback works for uniform primitives like cubes, but not for non-uniforms like cylinders. + return new(Vector3.zero, Vector3.one); + } + /// /// Returns true if this is within the spatial area of , /// that is, if the bounding box of plus the extra padding diff --git a/Assets/SEE/Utils/SEEMath.cs b/Assets/SEE/Utils/SEEMath.cs new file mode 100644 index 0000000000..d75e54a060 --- /dev/null +++ b/Assets/SEE/Utils/SEEMath.cs @@ -0,0 +1,111 @@ +using System; + +namespace SEE.Utils +{ + /// + /// This class contains additional mathematical functions. + /// + /// Individual methods may be copied from other sources like newer versions of dotnet framework. + /// Please consult method descriptions for credits and license. + /// + /// + public static partial class SEEMath + { + + /// + /// Returns the largest value that compares less than a specified value. + /// + /// The value to decrement. + /// + /// The largest value that compares less than . + /// + /// -or- + /// + /// + /// if x equals . + /// + /// -or- + /// + /// if is equals . + /// + /// + /// + /// This method is part of .NET Runtime v8.0.11, licensed from the .NET Foundation under the MIT license: + /// + /// https://github.com/dotnet/runtime/blob/v8.0.11/src/libraries/System.Private.CoreLib/src/System/MathF.cs + /// + /// + public static float BitDecrement(float x) + { + int bits = BitConverter.SingleToInt32Bits(x); + + if ((bits & 0x7F800000) >= 0x7F800000) + { + // NaN returns NaN + // -Infinity returns -Infinity + // +Infinity returns float.MaxValue + return (bits == 0x7F800000) ? float.MaxValue : x; + } + + if (bits == 0x00000000) + { + // +0.0 returns -float.Epsilon + return -float.Epsilon; + } + + // Negative values need to be incremented + // Positive values need to be decremented + + bits += ((bits < 0) ? +1 : -1); + return BitConverter.Int32BitsToSingle(bits); + } + + /// + /// Returns the smallest value that compares greater than a specified value. + /// + /// The value to increment. + /// + /// The smallest value that compares greater than . + /// + /// -or- + /// + /// + /// if x equals . + /// + /// -or- + /// + /// if is equals . + /// + /// + /// + /// This method is part of .NET Runtime v8.0.11, licensed from the .NET Foundation under the MIT license: + /// + /// https://github.com/dotnet/runtime/blob/v8.0.11/src/libraries/System.Private.CoreLib/src/System/MathF.cs + /// + /// + public static float BitIncrement(float x) + { + int bits = BitConverter.SingleToInt32Bits(x); + + if ((bits & 0x7F800000) >= 0x7F800000) + { + // NaN returns NaN + // -Infinity returns float.MinValue + // +Infinity returns +Infinity + return (bits == unchecked((int)(0xFF800000))) ? float.MinValue : x; + } + + if (bits == unchecked((int)(0x80000000))) + { + // -0.0 returns float.Epsilon + return float.Epsilon; + } + + // Negative values need to be decremented + // Positive values need to be incremented + + bits += ((bits < 0) ? -1 : +1); + return BitConverter.Int32BitsToSingle(bits); + } + } +} diff --git a/Assets/SEE/Utils/SEEMath.cs.meta b/Assets/SEE/Utils/SEEMath.cs.meta new file mode 100644 index 0000000000..f018d1f235 --- /dev/null +++ b/Assets/SEE/Utils/SEEMath.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: efa4b7760b674e0f5bcb186edf8bedd2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 8a659190f964f177d0792b502be2d6e60c2466b5 Mon Sep 17 00:00:00 2001 From: Tim Kuhlmann Date: Mon, 2 Dec 2024 10:34:01 +0100 Subject: [PATCH 2/7] fix OverlapsWithSiblings() Ignore inactive nodes when checking overlap. --- Assets/SEE/GameObjects/GameObjectExtensions.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Assets/SEE/GameObjects/GameObjectExtensions.cs b/Assets/SEE/GameObjects/GameObjectExtensions.cs index 6e222a4067..ac978adb3e 100644 --- a/Assets/SEE/GameObjects/GameObjectExtensions.cs +++ b/Assets/SEE/GameObjects/GameObjectExtensions.cs @@ -1060,10 +1060,10 @@ public static GraphElementOperator Operator(this GameObject gameObject) } /// - /// Checks if overlaps with any other direct child node of its parent. + /// Checks if overlaps with any other acrtive direct child node of its parent. /// /// Overlap is checked based on the Collider components. Objects with no Collider - /// component are ignored. + /// component and inactive nodes are ignored. /// /// /// @@ -1071,7 +1071,7 @@ public static GraphElementOperator Operator(this GameObject gameObject) /// /// The game object whose operator to retrieve. /// false if does not have a Collider component, - /// or does not overlap with its siblings + /// or does not overlap with its siblings. /// /// Thrown when the object the method is called on is not a node, i.e., has no NodeRef /// component. @@ -1088,7 +1088,7 @@ public static bool OverlapsWithSiblings(this GameObject gameObject) } foreach (Transform sibling in gameObject.transform.parent) { - if (sibling.gameObject == gameObject || !sibling.gameObject.HasNodeRef() || !sibling.gameObject.TryGetComponent(out Collider siblingCollider)) + if (sibling.gameObject == gameObject || !sibling.gameObject.IsNodeAndActiveSelf() || !sibling.gameObject.TryGetComponent(out Collider siblingCollider)) { continue; } From 4c7e34d55d64e4c97fca08cd47c622ac783bf95c Mon Sep 17 00:00:00 2001 From: Tim Kuhlmann Date: Mon, 2 Dec 2024 15:01:57 +0100 Subject: [PATCH 3/7] place resize handles on top Place ResizeNodeAction handles on top of the resized node. This is especially helpful for nodes with a hight greater than the original intended architecture nodes (which virtuially had no height at all). Previously, it was possible to take the cursor movement directly via a raycast on a parent node because the handles were assumed to be flat on the surface. This assumption is not true when the nodes have a miscellaneous height and/or when the handles are positioned on top. A new mechanism translates the 2D movement of the cursor into the 3D world space. However, this is not yet compatible with VR controls. --- .../SEE/Controls/Actions/ResizeNodeAction.cs | 215 ++++++++++-------- 1 file changed, 119 insertions(+), 96 deletions(-) diff --git a/Assets/SEE/Controls/Actions/ResizeNodeAction.cs b/Assets/SEE/Controls/Actions/ResizeNodeAction.cs index 907b5ca3d0..a07f9153bc 100644 --- a/Assets/SEE/Controls/Actions/ResizeNodeAction.cs +++ b/Assets/SEE/Controls/Actions/ResizeNodeAction.cs @@ -324,17 +324,23 @@ private class ResizeGizmo : MonoBehaviour private bool clicked = false; /// - /// The sprite handles are placed just outside the parent object to prevent z-fighting. + /// The last recorded rotation of the camera. Used to detect camera orientation changes. /// - private static readonly float halfAndABit = 0.5001f; + private Quaternion lastCameraRotation; - #region Configurations + /// + /// The forward vector of the camera projected onto the horizontal plane. + /// Used for calculating movement relative to the camera's orientation. + /// + private Vector3 cameraPlanarForward; /// - /// A small offset is used as a difference between the detection and the set value - /// to prevent instant re-detection. + /// The right vector of the camera projected onto the horizontal plane. + /// Used for calculating movement relative to the camera's orientation. /// - private const float detectionOffset = 0.0001f; + private Vector3 cameraPlanarRight; + + #region Configurations /// /// The size of the handles. @@ -439,77 +445,66 @@ private void InitHandles() Vector3[] directions = new[] { Vector3.right, Vector3.left, Vector3.forward, Vector3.back, Vector3.right + Vector3.forward, Vector3.right + Vector3.back, Vector3.left + Vector3.forward, Vector3.left + Vector3.back }; - Vector3 position = transform.position; - Vector3 size = gameObject.WorldSpaceSize(); + Vector3 parentPosition = transform.position; + Vector3 parentSize = gameObject.WorldSpaceSize(); + // Prevent Z-fighting + float localOffset = Mathf.Max(SpatialMetrics.PlacementOffset * parentSize.y / gameObject.transform.localScale.y, SpatialMetrics.PlacementOffset); + float yPos = parentPosition.y + 0.5f * parentSize.y + localOffset; foreach (Vector3 direction in directions) { - handles[CreateHandle(direction, position, size)] = direction; + handles[CreateHandle(direction)] = direction; } - GameObject upDownHandle = CreateHandle(Vector3.up, position, size); + GameObject upDownHandle = CreateHandle(Vector3.up); upDownHandleTransform = upDownHandle.transform; handles[upDownHandle] = Vector3.up; - } - /// - /// Creates a resize handle game object at the appropriate position. - /// - /// The direction for which the handle is created. - /// The cached parent world-space position. - /// The cached parent world-space scale. - /// The handle game object. - private GameObject CreateHandle(Vector3 direction, Vector3 parentWorldPosition, Vector3 parentWorldScale) - { - GameObject handle = GameObject.CreatePrimitive(PrimitiveType.Plane); - handle.transform.localScale = handleScale; - Material material; - if (direction == Vector3.up) - { - handle.transform.localRotation = Quaternion.Euler(90f, 0f, 0f); - Texture texture = LoadTexture(resizeArrowUpDownTexture); - material = Materials.New(Materials.ShaderType.Sprite, Color.white, texture, (int)RenderQueue.Overlay); - } - else if (direction.x != 0f && direction.z != 0f) + /// + /// Creates a resize handle game object at the appropriate position. + /// + /// The direction for which the handle is created. + /// The handle game object. + GameObject CreateHandle(Vector3 direction) { - if (direction.x > 0f) + GameObject handle = GameObject.CreatePrimitive(PrimitiveType.Plane); + handle.transform.localScale = handleScale; + + Material material; + if (direction == Vector3.up) { - handle.transform.localRotation = Quaternion.Euler(0f, direction.z > 0f ? 90f : 180f, 0f); + handle.transform.localRotation = Quaternion.Euler(90f, 0f, 0f); + Texture texture = Resources.Load(resizeArrowUpDownTexture); + material = Materials.New(Materials.ShaderType.Sprite, Color.white, texture, (int)RenderQueue.Overlay); } - else + else if (direction.x != 0f && direction.z != 0f) { - handle.transform.localRotation = Quaternion.Euler(0f, direction.z > 0f ? 0f : 270f, 0f); + if (direction.x > 0f) + { + handle.transform.localRotation = Quaternion.Euler(0f, direction.z > 0f ? 90f : 180f, 0f); + } + else + { + handle.transform.localRotation = Quaternion.Euler(0f, direction.z > 0f ? 0f : 270f, 0f); + } + Texture texture = Resources.Load(resizeArrowBottomRightTexture); + material = Materials.New(Materials.ShaderType.Sprite, Color.white, texture, (int)RenderQueue.Overlay); } - Texture texture = LoadTexture(resizeArrowBottomRightTexture); - material = Materials.New(Materials.ShaderType.Sprite, Color.white, texture, (int)RenderQueue.Overlay); - } - else - { - handle.transform.localRotation = Quaternion.Euler(0f, direction.x > 0f ? 180f : 0f + direction.z * 90f, 0f); - Texture texture = LoadTexture(resizeArrowRightTexture); - material = Materials.New(Materials.ShaderType.Sprite, Color.white, texture, (int)RenderQueue.Overlay); - } - handle.GetComponent().material = material; - handle.transform.localPosition = new( - parentWorldPosition.x + 0.5f * parentWorldScale.x * direction.x, - parentWorldPosition.y - + (direction == Vector3.up ? 0.5f * parentWorldScale.y * direction.y + halfAndABit * handle.WorldSpaceSize().y : 0f), - parentWorldPosition.z + 0.5f * parentWorldScale.z * direction.z); - - handle.name = $"handle__{direction.x}_{direction.y}_{direction.z}"; - handle.transform.SetParent(transform); - Portal.InheritPortal(from: transform.gameObject, to: handle); - return handle; - - // Loads and return a texture with given path from the resources folder. - // If no such path exists, an exception is thrown. - static Texture LoadTexture(string path) - { - Texture result = Resources.Load(path); - if (result == null) + else { - throw new Exception($"Could not load texture at path: {path}"); + handle.transform.localRotation = Quaternion.Euler(0f, direction.x > 0f ? 180f : 0f + direction.z * 90f, 0f); + Texture texture = Resources.Load(resizeArrowRightTexture); + material = Materials.New(Materials.ShaderType.Sprite, Color.white, texture, (int)RenderQueue.Overlay); } - return result; + handle.GetComponent().material = material; + handle.transform.localPosition = new( + parentPosition.x + 0.5f * parentSize.x * direction.x, + yPos + (direction == Vector3.up ? 0.5f * handle.WorldSpaceSize().y : 0f), + parentPosition.z + 0.5f * parentSize.z * direction.z); + + handle.name = $"handle__{direction.x}_{direction.y}_{direction.z}"; + handle.transform.SetParent(transform); + Portal.InheritPortal(from: transform.gameObject, to: handle); + return handle; } } @@ -545,14 +540,14 @@ private void UpdateUpDownHandlePosition() // The height is updated during the resize process upDownHandleTransform.localPosition = new( - halfAndABit * directionToCamera.x, + (0.5f + SpatialMetrics.DetectionOffset) * directionToCamera.x, upDownHandleTransform.localPosition.y, - halfAndABit * directionToCamera.z); + (0.5f + SpatialMetrics.DetectionOffset) * directionToCamera.z); + // Swap Z and Y axes because the plane is rotated 90° on the X-axis to get it upright. void flipScales() { - // Note: Z and Y axes are swapped because the plane is rotated 90° on the X-axis to get it upright. upDownHandleTransform.localScale = new( upDownHandleTransform.localScale.y, upDownHandleTransform.localScale.x, @@ -594,6 +589,7 @@ void UpdateSize() } // Calculate new scale and position + // TODO [#806] Make cursorMovement compatible with VR controls Vector3 cursorMovement; if (currentResizeStep.Up) { @@ -601,8 +597,32 @@ void UpdateSize() } else { - Vector3 hitPoint = targetObjectHit.Value.point; - cursorMovement = Vector3.Scale(currentResizeStep.InitialHitPoint - hitPoint, currentResizeStep.Direction); + // Update cached camera rotation if necessary + if (!Equals(mainCameraTransform.rotation, lastCameraRotation)) + { + // Is camera looking straight up or down? + if (Mathf.Abs(Vector3.Dot(mainCameraTransform.forward, Vector3.up)) > 0.9999f) + { + // Use the camera's right vector projected onto the horizontal plane + cameraPlanarRight = Vector3.ProjectOnPlane(mainCameraTransform.right, Vector3.up).normalized; + // Calculate forward based on right, ensuring it's perpendicular + cameraPlanarForward = Vector3.Cross(Vector3.up, cameraPlanarRight).normalized * Mathf.Sign(mainCameraTransform.forward.y); + } + else + { + lastCameraRotation = mainCameraTransform.rotation; + cameraPlanarForward = Vector3.ProjectOnPlane(mainCameraTransform.forward, Vector3.up).normalized; + cameraPlanarRight = Vector3.Cross(Vector3.up, cameraPlanarForward).normalized; + } + } + + float deltaX = (currentResizeStep.InitialMousePosition.x - Input.mousePosition.x) * currentResizeStep.InvScreenHeight; + float deltaY = (currentResizeStep.InitialMousePosition.y - Input.mousePosition.y) * currentResizeStep.InvScreenHeight; + + cursorMovement = new Vector3( + (cameraPlanarRight.x * deltaX + cameraPlanarForward.x * deltaY) * currentResizeStep.Direction.x, + 0f, + (cameraPlanarRight.z * deltaX + cameraPlanarForward.z * deltaY) * currentResizeStep.Direction.z); } Vector3 newLocalSize = currentResizeStep.InitialLocalSize - Vector3.Scale(currentResizeStep.LocalScaleFactor, cursorMovement); Vector3 newLocalPosition = currentResizeStep.InitialLocalPosition @@ -668,10 +688,10 @@ void UpdateSize() { Vector3 siblingSize = sibling.gameObject.LocalSize(); Vector3 siblingPos = sibling.localPosition; - otherBounds.Left = siblingPos.x - siblingSize.x / 2 - currentResizeStep.LocalPadding.x + detectionOffset; - otherBounds.Right = siblingPos.x + siblingSize.x / 2 + currentResizeStep.LocalPadding.x - detectionOffset; - otherBounds.Back = siblingPos.z - siblingSize.z / 2 - currentResizeStep.LocalPadding.z + detectionOffset; - otherBounds.Front = siblingPos.z + siblingSize.z / 2 + currentResizeStep.LocalPadding.z - detectionOffset; + otherBounds.Left = siblingPos.x - siblingSize.x / 2 - currentResizeStep.LocalPadding.x + SpatialMetrics.DetectionOffset; + otherBounds.Right = siblingPos.x + siblingSize.x / 2 + currentResizeStep.LocalPadding.x - SpatialMetrics.DetectionOffset; + otherBounds.Back = siblingPos.z - siblingSize.z / 2 - currentResizeStep.LocalPadding.z + SpatialMetrics.DetectionOffset; + otherBounds.Front = siblingPos.z + siblingSize.z / 2 + currentResizeStep.LocalPadding.z - SpatialMetrics.DetectionOffset; if (bounds.Back > otherBounds.Front || bounds.Front < otherBounds.Back || bounds.Left > otherBounds.Right || bounds.Right < otherBounds.Left) @@ -704,22 +724,22 @@ void UpdateSize() { if (currentResizeStep.Right) { - bounds.Right = otherBounds.Left - detectionOffset; + bounds.Right = otherBounds.Left - SpatialMetrics.DetectionOffset; } else { - bounds.Left = otherBounds.Right + detectionOffset; + bounds.Left = otherBounds.Right + SpatialMetrics.DetectionOffset; } } else if (newLocalSize.z - overlap[1] > currentResizeStep.MinLocalSize.z) { if (currentResizeStep.Forward) { - bounds.Front = otherBounds.Back - detectionOffset; + bounds.Front = otherBounds.Back - SpatialMetrics.DetectionOffset; } else { - bounds.Back = otherBounds.Front + detectionOffset; + bounds.Back = otherBounds.Front + SpatialMetrics.DetectionOffset; } } } @@ -735,30 +755,30 @@ void UpdateSize() // Child position and scale on common parent Vector3 childPos = Vector3.Scale(child.localPosition, transform.localScale) + transform.localPosition; Vector3 childSize = Vector3.Scale(child.gameObject.LocalSize(), transform.localScale); - otherBounds.Left = childPos.x - childSize.x / 2 - currentResizeStep.LocalPadding.x + detectionOffset; - otherBounds.Right = childPos.x + childSize.x / 2 + currentResizeStep.LocalPadding.x - detectionOffset; - otherBounds.Back = childPos.z - childSize.z / 2 - currentResizeStep.LocalPadding.z + detectionOffset; - otherBounds.Front = childPos.z + childSize.z / 2 + currentResizeStep.LocalPadding.z - detectionOffset; + otherBounds.Left = childPos.x - childSize.x / 2 - currentResizeStep.LocalPadding.x + SpatialMetrics.DetectionOffset; + otherBounds.Right = childPos.x + childSize.x / 2 + currentResizeStep.LocalPadding.x - SpatialMetrics.DetectionOffset; + otherBounds.Back = childPos.z - childSize.z / 2 - currentResizeStep.LocalPadding.z + SpatialMetrics.DetectionOffset; + otherBounds.Front = childPos.z + childSize.z / 2 + currentResizeStep.LocalPadding.z - SpatialMetrics.DetectionOffset; if (currentResizeStep.Right && bounds.Right < otherBounds.Right) { - bounds.Right = otherBounds.Right + detectionOffset; + bounds.Right = otherBounds.Right + SpatialMetrics.DetectionOffset; } if (currentResizeStep.Left && bounds.Left > otherBounds.Left) { - bounds.Left = otherBounds.Left - detectionOffset; + bounds.Left = otherBounds.Left - SpatialMetrics.DetectionOffset; } if (currentResizeStep.Forward && bounds.Front < otherBounds.Front) { - bounds.Front = otherBounds.Front + detectionOffset; + bounds.Front = otherBounds.Front + SpatialMetrics.DetectionOffset; } if (currentResizeStep.Back && bounds.Back > otherBounds.Back) { - bounds.Back = otherBounds.Back - detectionOffset; + bounds.Back = otherBounds.Back - SpatialMetrics.DetectionOffset; } } @@ -800,24 +820,21 @@ void UpdateSize() // Reparent children foreach (Transform child in children) { - // Adapt position + // Adapt children's position based on changed position and size + bool shift2D = !child.gameObject.IsNodeAndActiveSelf(); + child.localPosition = new( + child.localPosition.x + (shift2D ? 0.5f * posDiff.x : 0f), + child.localPosition.y + posDiff.y, // we always resize height in positive direction + child.localPosition.z + (shift2D ? 0.5f * posDiff.z : 0f)); + + // Fix base handle position if (child != upDownHandleTransform && handles.TryGetValue(child.gameObject, out Vector3 direction)) { - // Reposition base handles child.localPosition = new( transform.localPosition.x + 0.5f * transform.localScale.x * direction.x, - child.localPosition.y, // don't move handles up or down + child.localPosition.y, transform.localPosition.z + 0.5f * transform.localScale.z * direction.z); } - else - { - // Adapt other children's position based on changed position and size - bool shift2D = !child.gameObject.IsNodeAndActiveSelf(); - child.localPosition = new( - child.localPosition.x + (shift2D ? 0.5f * posDiff.x * currentResizeStep.Direction.x : 0f), - child.localPosition.y + posDiff.y, // we always resize height in positive direction - child.localPosition.z + (shift2D ? 0.5f * posDiff.z * currentResizeStep.Direction.z : 0f)); - } child.SetParent(transform); } @@ -906,6 +923,11 @@ private readonly struct ResizeStepData /// public readonly bool Up; + /// + /// The inverse of the screen height. Cached for performance optimization in calculations. + /// + public readonly float InvScreenHeight; + /// /// Initializes the struct. /// @@ -935,6 +957,7 @@ public ResizeStepData (Vector3 initialHitPoint, Vector3 direction, Transform tra Back = Direction.z < 0; Forward = Direction.z > 0; Up = Direction.y > 0; + InvScreenHeight = 1f / Screen.height; IsSet = true; } } From 1339ba972a4f85c118692627c299722d7914550e Mon Sep 17 00:00:00 2001 From: Tim Kuhlmann Date: Tue, 3 Dec 2024 08:48:00 +0100 Subject: [PATCH 4/7] use Bit{In,De}crement() for resize Use BitIncrement() and BitDecrement() in ResizeNodeAction for setting float values near thresholds while preventing redetection instead of using a static offset that might not work in specific edge cases. --- .../SEE/Controls/Actions/ResizeNodeAction.cs | 40 +++++++++---------- .../Game/SceneManipulation/SpatialMetrics.cs | 8 +--- 2 files changed, 20 insertions(+), 28 deletions(-) diff --git a/Assets/SEE/Controls/Actions/ResizeNodeAction.cs b/Assets/SEE/Controls/Actions/ResizeNodeAction.cs index a07f9153bc..3e63a6f844 100644 --- a/Assets/SEE/Controls/Actions/ResizeNodeAction.cs +++ b/Assets/SEE/Controls/Actions/ResizeNodeAction.cs @@ -447,9 +447,7 @@ private void InitHandles() Vector3.left + Vector3.forward, Vector3.left + Vector3.back }; Vector3 parentPosition = transform.position; Vector3 parentSize = gameObject.WorldSpaceSize(); - // Prevent Z-fighting - float localOffset = Mathf.Max(SpatialMetrics.PlacementOffset * parentSize.y / gameObject.transform.localScale.y, SpatialMetrics.PlacementOffset); - float yPos = parentPosition.y + 0.5f * parentSize.y + localOffset; + float yPos = parentPosition.y + 0.5f * parentSize.y + SpatialMetrics.PlacementOffset; foreach (Vector3 direction in directions) { handles[CreateHandle(direction)] = direction; @@ -540,9 +538,9 @@ private void UpdateUpDownHandlePosition() // The height is updated during the resize process upDownHandleTransform.localPosition = new( - (0.5f + SpatialMetrics.DetectionOffset) * directionToCamera.x, + (0.5f + SpatialMetrics.PlacementOffset) * directionToCamera.x, upDownHandleTransform.localPosition.y, - (0.5f + SpatialMetrics.DetectionOffset) * directionToCamera.z); + (0.5f + SpatialMetrics.PlacementOffset) * directionToCamera.z); // Swap Z and Y axes because the plane is rotated 90° on the X-axis to get it upright. @@ -688,10 +686,10 @@ void UpdateSize() { Vector3 siblingSize = sibling.gameObject.LocalSize(); Vector3 siblingPos = sibling.localPosition; - otherBounds.Left = siblingPos.x - siblingSize.x / 2 - currentResizeStep.LocalPadding.x + SpatialMetrics.DetectionOffset; - otherBounds.Right = siblingPos.x + siblingSize.x / 2 + currentResizeStep.LocalPadding.x - SpatialMetrics.DetectionOffset; - otherBounds.Back = siblingPos.z - siblingSize.z / 2 - currentResizeStep.LocalPadding.z + SpatialMetrics.DetectionOffset; - otherBounds.Front = siblingPos.z + siblingSize.z / 2 + currentResizeStep.LocalPadding.z - SpatialMetrics.DetectionOffset; + otherBounds.Left = siblingPos.x - siblingSize.x / 2 - currentResizeStep.LocalPadding.x; + otherBounds.Right = siblingPos.x + siblingSize.x / 2 + currentResizeStep.LocalPadding.x; + otherBounds.Back = siblingPos.z - siblingSize.z / 2 - currentResizeStep.LocalPadding.z; + otherBounds.Front = siblingPos.z + siblingSize.z / 2 + currentResizeStep.LocalPadding.z; if (bounds.Back > otherBounds.Front || bounds.Front < otherBounds.Back || bounds.Left > otherBounds.Right || bounds.Right < otherBounds.Left) @@ -724,22 +722,22 @@ void UpdateSize() { if (currentResizeStep.Right) { - bounds.Right = otherBounds.Left - SpatialMetrics.DetectionOffset; + bounds.Right = SEEMath.BitDecrement(otherBounds.Left); } else { - bounds.Left = otherBounds.Right + SpatialMetrics.DetectionOffset; + bounds.Left = SEEMath.BitIncrement(otherBounds.Right); } } else if (newLocalSize.z - overlap[1] > currentResizeStep.MinLocalSize.z) { if (currentResizeStep.Forward) { - bounds.Front = otherBounds.Back - SpatialMetrics.DetectionOffset; + bounds.Front = SEEMath.BitDecrement(otherBounds.Back); } else { - bounds.Back = otherBounds.Front + SpatialMetrics.DetectionOffset; + bounds.Back = SEEMath.BitIncrement(otherBounds.Front); } } } @@ -755,30 +753,30 @@ void UpdateSize() // Child position and scale on common parent Vector3 childPos = Vector3.Scale(child.localPosition, transform.localScale) + transform.localPosition; Vector3 childSize = Vector3.Scale(child.gameObject.LocalSize(), transform.localScale); - otherBounds.Left = childPos.x - childSize.x / 2 - currentResizeStep.LocalPadding.x + SpatialMetrics.DetectionOffset; - otherBounds.Right = childPos.x + childSize.x / 2 + currentResizeStep.LocalPadding.x - SpatialMetrics.DetectionOffset; - otherBounds.Back = childPos.z - childSize.z / 2 - currentResizeStep.LocalPadding.z + SpatialMetrics.DetectionOffset; - otherBounds.Front = childPos.z + childSize.z / 2 + currentResizeStep.LocalPadding.z - SpatialMetrics.DetectionOffset; + otherBounds.Left = childPos.x - childSize.x / 2 - currentResizeStep.LocalPadding.x; + otherBounds.Right = childPos.x + childSize.x / 2 + currentResizeStep.LocalPadding.x; + otherBounds.Back = childPos.z - childSize.z / 2 - currentResizeStep.LocalPadding.z; + otherBounds.Front = childPos.z + childSize.z / 2 + currentResizeStep.LocalPadding.z; if (currentResizeStep.Right && bounds.Right < otherBounds.Right) { - bounds.Right = otherBounds.Right + SpatialMetrics.DetectionOffset; + bounds.Right = SEEMath.BitIncrement(otherBounds.Right); } if (currentResizeStep.Left && bounds.Left > otherBounds.Left) { - bounds.Left = otherBounds.Left - SpatialMetrics.DetectionOffset; + bounds.Left = SEEMath.BitDecrement(otherBounds.Left); } if (currentResizeStep.Forward && bounds.Front < otherBounds.Front) { - bounds.Front = otherBounds.Front + SpatialMetrics.DetectionOffset; + bounds.Front = SEEMath.BitIncrement(otherBounds.Front); } if (currentResizeStep.Back && bounds.Back > otherBounds.Back) { - bounds.Back = otherBounds.Back - SpatialMetrics.DetectionOffset; + bounds.Back = SEEMath.BitDecrement(otherBounds.Back); } } diff --git a/Assets/SEE/Game/SceneManipulation/SpatialMetrics.cs b/Assets/SEE/Game/SceneManipulation/SpatialMetrics.cs index 39dd04de3b..5f34fda407 100644 --- a/Assets/SEE/Game/SceneManipulation/SpatialMetrics.cs +++ b/Assets/SEE/Game/SceneManipulation/SpatialMetrics.cs @@ -9,13 +9,7 @@ namespace SEE.Game.SceneManipulation public class SpatialMetrics { /// - /// A small offset used as a difference between the detection and the set value - /// to prevent instant re-detection. - /// - public const float DetectionOffset = 0.0001f; - - /// - /// A small offset used for handle placement just outside its parent to prevent Z-fighting. + /// A small offset used for placement just outside specific bounds to prevent Z-fighting. /// public const float PlacementOffset = 0.0001f; From 9ee9ef221bcadd468393d6594955e6b9a13df594 Mon Sep 17 00:00:00 2001 From: Tim Kuhlmann Date: Tue, 14 Jan 2025 15:15:52 +0100 Subject: [PATCH 5/7] fix resize handle vs. edge draw order The edge shader is modified to handle opaque vs. transparent fragments in separate passes. Opaque elements write to the depth buffer (ZWrite) so that the order is preserved. This fixes the problem of resize handles occluding edges that should in fact be drawn over the handles. Please note that other approaches were problematic: 1. Keep the shader as-is but enable ZWrite: This solves the issue described above but transparent parts would occlude labels using TextMeshPro shaders. 2. Using ZWrite and pushing depth buffer values for semi- transparent fragments back just before the clipping plane, e.g., 0.99: This does not work the same way as not writing to the depth buffer, thus has several side effects and still interferes with TMP shaders. --- .../TransparentEdgePortalShader.shader | 197 ++++++++++++------ .../TransparentLinePortalShader.shader | 15 +- .../TransparentSpritePortalShader.shader | 18 +- .../SEE/Controls/Actions/ResizeNodeAction.cs | 6 +- Assets/SEE/GameObjects/SEESpline.cs | 1 - 5 files changed, 153 insertions(+), 84 deletions(-) diff --git a/Assets/Resources/Shaders/TransparentEdgePortalShader.shader b/Assets/Resources/Shaders/TransparentEdgePortalShader.shader index 21115baed9..3f5c2ca575 100644 --- a/Assets/Resources/Shaders/TransparentEdgePortalShader.shader +++ b/Assets/Resources/Shaders/TransparentEdgePortalShader.shader @@ -20,106 +20,169 @@ Shader "Unlit/SEE/TransparentEdgePortalShader" SubShader { Tags { - "Queue"="Transparent" - "RenderType"="Transparent" - "IgnoreProjector"="True" + "Queue" = "Transparent+1" + "RenderType" = "Transparent" + "IgnoreProjector" = "True" "ForceNoShadowCasting" = "True" "PreviewType" = "Plane" } // Alpha blending mode for transparency Blend SrcAlpha OneMinusSrcAlpha - // Do not write to depth buffer to allow transparency effect - // Note: We will be able to see parts of the edge through other parts of the same edge, that should be occluded - // on full opacity. This is not a desired effect but not a big issue either. - ZWrite Off // Makes the inside visible at clipping planes Cull Off // Unity's lighting will not be applied Lighting Off - Pass + // Shared code for both passes + HLSLINCLUDE + + #include "UnityCG.cginc" + + struct appdata { - CGPROGRAM - #pragma vertex vert - #pragma fragment frag + float4 vertex : POSITION; + float3 normal : NORMAL; + float2 uv : TEXCOORD0; + }; - #include "UnityCG.cginc" + struct v2f + { + float4 vertex : SV_POSITION; + float3 worldPos : TEXCOORD0; + float1 doDiscard : TEXCOORD1; + float4 color : TEXCOORD2; + }; - struct appdata + // Color + fixed4 _Color; + fixed4 _EndColor; + float _ColorGradientEnabled; + float _AlphaThreshold; + + // Data Flow + float _EdgeFlowEnabled; + float _AnimationFactor; + float _AnimationPause; + float _EffectWidth; + float _GrowthAmount; + + // Clipping + float4 _Portal; + + v2f SharedVertexManipulation(appdata v) + { + v2f o; + + if (_EdgeFlowEnabled > 0.5) { - float4 vertex : POSITION; - float3 normal : NORMAL; - float2 uv : TEXCOORD0; - }; + // The effect is supposed to move automatically based on the time and the animation factor. + // The position is calculated based on the assumption that the object has a uniform UV mapping (0.0 to 1.0 along the y axis). + // We stretch the effect scale by the effect width so that the effect fades in and out smoothly at both ends, respectively. + // Additionally, the effect scale is stretched to add a pause between the animations. + float effectPosition = frac(_Time.y * _AnimationFactor) * (1.0 + 2 * _EffectWidth + _AnimationPause) - _EffectWidth; + + // Distance between the vertex and the effect position on the y axis in world-space + float distance = abs(v.uv.y - effectPosition); + + if (distance < _EffectWidth) + { + // The effect strength is based on the distance to the effect position + float effectFactor = 1.0 - pow(distance / _EffectWidth, 3); + effectFactor = clamp(effectFactor, 0.0, 1.0); + // We use the direction of the normal to grow outward + float3 outwardDir = normalize(v.normal); + v.vertex.xyz += outwardDir * effectFactor * _GrowthAmount; + } + } + + o.vertex = UnityObjectToClipPos(v.vertex); + o.worldPos = mul(unity_ObjectToWorld, v.vertex); - struct v2f + // Note: The following is not strictly vertex related but we do this in the shared function + // to prevent clutter and code duplication. + + // Flag coordinates as discardable outside portal + // Note: We use a 2D portal that spans over Unity's XZ plane: (x_min, z_min, x_max, z_max) + if (o.worldPos.x < _Portal.x || o.worldPos.z < _Portal.y || + o.worldPos.x > _Portal.z || o.worldPos.z > _Portal.w) + { + o.doDiscard = 1; + } + else { - float4 vertex : SV_POSITION; - float3 worldPos : TEXCOORD0; - float2 uv : TEXCOORD1; - }; - - // Color - fixed4 _Color; - fixed4 _EndColor; - float _ColorGradientEnabled; - - // Data Flow - float _EdgeFlowEnabled; - float _AnimationFactor; - float _AnimationPause; - float _EffectWidth; - float _GrowthAmount; - - // Clipping - float4 _Portal; + o.doDiscard = 0; + } + + o.color = _ColorGradientEnabled > 0.5 ? lerp(_Color, _EndColor, v.uv.y) : _Color;; + + return o; + } + ENDHLSL + + // Pass 1: Render opaque fragments with depth writing + Pass + { + Name "OpaquePass" + // Write to depth buffer to make opaque fragments occlude other objects. + // All other fragments will be discarded in this step. + ZWrite On + + HLSLPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" v2f vert (appdata v) { - v2f o; + return SharedVertexManipulation(v); + } - if (_EdgeFlowEnabled > 0.5) + fixed4 frag (v2f i) : SV_Target + { + // Discard fragment if transparent or flagged earlier + if (i.doDiscard || i.color.a < 1.0) { - // The effect is supposed to move automatically based on the time and the animation factor. - // The position is calculated based on the assumption that the object has a uniform UV mapping (0.0 to 1.0 along the y axis). - // We stretch the effect scale by the effect width so that the effect fades in and out smoothly at both ends, respectively. - // Additionally, the effect scale is stretched to add a pause between the animations. - float effectPosition = frac(_Time.y * _AnimationFactor) * (1.0 + 2 * _EffectWidth + _AnimationPause) - _EffectWidth; - - // Distance between the vertex and the effect position on the y axis in world-space - float distance = abs(v.uv.y - effectPosition); - - if (distance < _EffectWidth) - { - // The effect strength is based on the distance to the effect position - float effectFactor = 1.0 - pow(distance / _EffectWidth, 3); - effectFactor = clamp(effectFactor, 0.0, 1.0); - // We use the direction of the normal to grow outward - float3 outwardDir = normalize(v.normal); - v.vertex.xyz += outwardDir * effectFactor * _GrowthAmount; - } + discard; } - o.vertex = UnityObjectToClipPos(v.vertex); - o.worldPos = mul(unity_ObjectToWorld, v.vertex); - o.uv = v.uv; - return o; + return i.color; + } + ENDHLSL + } + + // Pass 2: Render semitransparent fragments without depth writing + Pass + { + Name "TransparentPass" + // Do not write to depth buffer to allow transparency effect + // Note: We will be able to see parts of the edge through other parts of the same edge, that should be occluded + // on full opacity. This is not a desired effect but not a big issue either. + ZWrite Off + + HLSLPROGRAM + #pragma vertex vert + #pragma fragment frag + + #include "UnityCG.cginc" + + v2f vert (appdata v) + { + return SharedVertexManipulation(v); } fixed4 frag (v2f i) : SV_Target { - // Discard coordinates if transparent or outside portal - // Note: We use a 2D portal that spans over Unity's XZ plane: (x_min, z_min, x_max, z_max) - if (i.worldPos.x < _Portal.x || i.worldPos.z < _Portal.y || - i.worldPos.x > _Portal.z || i.worldPos.z > _Portal.w) + // Discard fragment if transparent or flagged earlier + if (i.doDiscard || i.color.a <= 0) { discard; } - return _ColorGradientEnabled > 0.5 ? lerp(_Color, _EndColor, i.uv.y) : _Color; + return i.color; } - ENDCG + ENDHLSL } } } diff --git a/Assets/Resources/Shaders/TransparentLinePortalShader.shader b/Assets/Resources/Shaders/TransparentLinePortalShader.shader index 5cf4353cd9..1108cefc1a 100644 --- a/Assets/Resources/Shaders/TransparentLinePortalShader.shader +++ b/Assets/Resources/Shaders/TransparentLinePortalShader.shader @@ -12,11 +12,11 @@ { Tags { - "Queue"="Transparent" - "IgnoreProjector"="True" - "RenderType"="Transparent" - "PreviewType"="Plane" - "CanUseSpriteAtlas"="True" + "Queue" = "Transparent+1" + "IgnoreProjector" = "True" + "RenderType" = "Transparent" + "PreviewType" = "Plane" + "CanUseSpriteAtlas" = "True" } Cull Off @@ -27,12 +27,13 @@ Pass { - CGPROGRAM + HLSLPROGRAM #pragma vertex vert #pragma fragment frag #pragma target 2.0 #pragma multi_compile _ PIXELSNAP_ON #pragma multi_compile _ ETC1_EXTERNAL_ALPHA + #include "UnityCG.cginc" struct appdata_t @@ -99,7 +100,7 @@ c.rgb *= c.a; return c; } - ENDCG + ENDHLSL } } } diff --git a/Assets/Resources/Shaders/TransparentSpritePortalShader.shader b/Assets/Resources/Shaders/TransparentSpritePortalShader.shader index fe78be47ce..3b4782d799 100644 --- a/Assets/Resources/Shaders/TransparentSpritePortalShader.shader +++ b/Assets/Resources/Shaders/TransparentSpritePortalShader.shader @@ -1,3 +1,11 @@ +// Please note: +// This shader is currently not intended for semi-transparent sprites. +// It handles full transparency and opaque elements well with depth writing (ZWrite) +// for opaque fragments; fully transparent fragments are discarded. +// To allow for blending of semitransparent areas it is necessary to implement a two-pass +// mechanism akin to the edge shader that draws translucent parts without depth writing. +// Depth writing is necessary to achieve the correct order of edges and resize handles. + Shader "Unlit/TransparentSpritePortalShader" { Properties @@ -10,15 +18,13 @@ Shader "Unlit/TransparentSpritePortalShader" Tags { "Queue" = "Transparent" "RenderType" = "Transparent" - "IgnoreProjector"="True" + "IgnoreProjector" = "True" "ForceNoShadowCasting" = "True" "PreviewType" = "Plane" } // Alpha blending mode for transparency Blend SrcAlpha OneMinusSrcAlpha - // Do not write to depth buffer to allow transparency effect - ZWrite Off // Makes the back of the sprite plane visible Cull Off // Unity's lighting will not be applied @@ -26,7 +32,7 @@ Shader "Unlit/TransparentSpritePortalShader" Pass { - CGPROGRAM + HLSLPROGRAM #pragma vertex vert #pragma fragment frag @@ -65,7 +71,7 @@ Shader "Unlit/TransparentSpritePortalShader" // Discard coordinates if transparent or outside portal // Note: We use a 2D portal that spans over Unity's XZ plane: (x_min, z_min, x_max, z_max) - if ( col.a <= 0 || + if (col.a <= 0 || i.worldPos.x < _Portal.x || i.worldPos.z < _Portal.y || i.worldPos.x > _Portal.z || i.worldPos.z > _Portal.w) { @@ -74,7 +80,7 @@ Shader "Unlit/TransparentSpritePortalShader" return col; } - ENDCG + ENDHLSL } } } diff --git a/Assets/SEE/Controls/Actions/ResizeNodeAction.cs b/Assets/SEE/Controls/Actions/ResizeNodeAction.cs index 3e63a6f844..d7bfc6b8f1 100644 --- a/Assets/SEE/Controls/Actions/ResizeNodeAction.cs +++ b/Assets/SEE/Controls/Actions/ResizeNodeAction.cs @@ -472,7 +472,7 @@ GameObject CreateHandle(Vector3 direction) { handle.transform.localRotation = Quaternion.Euler(90f, 0f, 0f); Texture texture = Resources.Load(resizeArrowUpDownTexture); - material = Materials.New(Materials.ShaderType.Sprite, Color.white, texture, (int)RenderQueue.Overlay); + material = Materials.New(Materials.ShaderType.Sprite, Color.white, texture); } else if (direction.x != 0f && direction.z != 0f) { @@ -485,13 +485,13 @@ GameObject CreateHandle(Vector3 direction) handle.transform.localRotation = Quaternion.Euler(0f, direction.z > 0f ? 0f : 270f, 0f); } Texture texture = Resources.Load(resizeArrowBottomRightTexture); - material = Materials.New(Materials.ShaderType.Sprite, Color.white, texture, (int)RenderQueue.Overlay); + material = Materials.New(Materials.ShaderType.Sprite, Color.white, texture); } else { handle.transform.localRotation = Quaternion.Euler(0f, direction.x > 0f ? 180f : 0f + direction.z * 90f, 0f); Texture texture = Resources.Load(resizeArrowRightTexture); - material = Materials.New(Materials.ShaderType.Sprite, Color.white, texture, (int)RenderQueue.Overlay); + material = Materials.New(Materials.ShaderType.Sprite, Color.white, texture); } handle.GetComponent().material = material; handle.transform.localPosition = new( diff --git a/Assets/SEE/GameObjects/SEESpline.cs b/Assets/SEE/GameObjects/SEESpline.cs index 4430f0367f..cdfe1249fa 100644 --- a/Assets/SEE/GameObjects/SEESpline.cs +++ b/Assets/SEE/GameObjects/SEESpline.cs @@ -299,7 +299,6 @@ private void Awake() { // Corresponds to the material of the LineRenderer. defaultMaterial = Materials.New(Materials.ShaderType.TransparentEdge, Color.white); - defaultMaterial.renderQueue = (int)(RenderQueue.Transparent + 1); } /// From c7d68c0bc3c8232c4964d212aeabeed0b7745f2e Mon Sep 17 00:00:00 2001 From: Tim Kuhlmann Date: Wed, 15 Jan 2025 12:39:31 +0100 Subject: [PATCH 6/7] bump server dependency versions --- .../.mvn/wrapper/maven-wrapper.properties | 2 +- Server/Backend/README.md | 44 + Server/Backend/pom.xml | 38 + Server/Backend/server/pom.xml | 6 +- .../see/manager/service/ContainerService.java | 15 + Server/Frontend/package.json | 38 +- Server/Frontend/pnpm-lock.yaml | 2239 +++++++++-------- 7 files changed, 1297 insertions(+), 1085 deletions(-) diff --git a/Server/Backend/.mvn/wrapper/maven-wrapper.properties b/Server/Backend/.mvn/wrapper/maven-wrapper.properties index 4154b8508e..654af46a70 100644 --- a/Server/Backend/.mvn/wrapper/maven-wrapper.properties +++ b/Server/Backend/.mvn/wrapper/maven-wrapper.properties @@ -16,4 +16,4 @@ # under the License. wrapperVersion=3.3.2 distributionType=only-script -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.8/apache-maven-3.9.8-bin.zip +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip diff --git a/Server/Backend/README.md b/Server/Backend/README.md index bee270d9e2..bab121f830 100644 --- a/Server/Backend/README.md +++ b/Server/Backend/README.md @@ -39,6 +39,50 @@ Metadata to identify and retrieve files are stored in the relational database, w -------------------------------------------------------------------------------- ## Dependencies +The backend itself manages its dependencies using Maven. +However, there are additional dependencies to run the complete stack effectively. + +### Maven + +You can use the following command to check for outdated versions of direct dependencies: + +```sh +./mvnw versions:display-dependency-updates +``` + +Please note that updating dependencies might require code changes. +It is usually safe -- and strongly suggested -- to bump patch level versions. +This is typically the third part of the version number, e.g., `1.2.3` -> `1.2.5`. +Changes to the first two segments are often associated to breaking changes and need additional manual review and testing. + +The first part is referred to as *major*, the second is *minor* and the third as *incremental*. +You can use `-DallowMinorUpdates=false` to limit the report to *incremental* updates, +or `-DallowMajorUpdates=false` to include *minor* version updates as well. +Omitting these parameters will result in a complete report, including *major* versions and all below. + +The version numbers are typically defined as properties in the respective `pom.xml` file. +This allows us also to use the following command: + +```sh +./mvnw versions:display-property-updates +``` + +A quick way to upgrade version numbers is the following command: + +```sh +./mvnw versions:update-properties +``` + +Use parameters like `-DallowMinorUpdates=false` as described above if desired. + +Similarly to the dependency versions, the following command checks for Maven plugin updates -- updates for the build system: + +```sh +./mvnw versions:display-plugin-updates +``` + +### Stack + This backend requires a container runtime to manage SEE game server instances. Refer to the README in the parent directory for additional considerations. diff --git a/Server/Backend/pom.xml b/Server/Backend/pom.xml index 8a8df40199..3911404cc8 100644 --- a/Server/Backend/pom.xml +++ b/Server/Backend/pom.xml @@ -9,6 +9,11 @@ Parent project of the SEE management tool pom + + + 3.9 + + server @@ -20,5 +25,38 @@ repo + + + + + org.codehaus.mojo + versions-maven-plugin + 2.18.0 + + false + + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.5.0 + + + enforce-maven + + enforce + + + + + ${maven-required-version} + + + + + + + + diff --git a/Server/Backend/server/pom.xml b/Server/Backend/server/pom.xml index d7d89aa71f..a8c5257361 100644 --- a/Server/Backend/server/pom.xml +++ b/Server/Backend/server/pom.xml @@ -18,12 +18,12 @@ ${project.groupId}.manager.SeeManagerApplication - 3.3.2 + 3.3.7 0.11.5 3.13.0 - 3.8.0 - 3.4.0 + 3.11.2 + 3.4.1 diff --git a/Server/Backend/server/src/main/java/de/unibremen/swt/see/manager/service/ContainerService.java b/Server/Backend/server/src/main/java/de/unibremen/swt/see/manager/service/ContainerService.java index 3cfa56af87..f5647c111c 100644 --- a/Server/Backend/server/src/main/java/de/unibremen/swt/see/manager/service/ContainerService.java +++ b/Server/Backend/server/src/main/java/de/unibremen/swt/see/manager/service/ContainerService.java @@ -94,13 +94,28 @@ public class ContainerService { */ private static class MaxRetriesExceededException extends RuntimeException { + /** + * Maximal number of retry attempts that were exceeded. + */ private final int maxAttempts; + /** + * Class constructor. + * + * @param maxAttempts the maximal number of retry attempts that were + * exceeded. + * @param cause the cause of this exception. + */ public MaxRetriesExceededException(int maxAttempts, Throwable cause) { super("Operation failed after " + maxAttempts + " attempts", cause); this.maxAttempts = maxAttempts; } + /** + * Returns the maximal number of retry attempts that were exceeded. + * + * @return maximal retry attempts that were exceeded. + */ public int getMaxAttempts() { return maxAttempts; } diff --git a/Server/Frontend/package.json b/Server/Frontend/package.json index fbca39c5d3..03c8acc69a 100644 --- a/Server/Frontend/package.json +++ b/Server/Frontend/package.json @@ -10,33 +10,33 @@ "preview": "vite preview" }, "dependencies": { - "@emotion/react": "^11.13.0", - "@emotion/styled": "^11.13.0", - "@fontsource/roboto": "^5.0.14", - "@fortawesome/fontawesome-svg-core": "^6.6.0", - "@fortawesome/free-solid-svg-icons": "^6.6.0", + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.0", + "@fontsource/roboto": "^5.1.1", + "@fortawesome/fontawesome-svg-core": "^6.7.2", + "@fortawesome/free-solid-svg-icons": "^6.7.2", "@fortawesome/react-fontawesome": "^0.2.2", - "@mui/material": "^5.16.6", - "axios": "^1.7.3", + "@mui/material": "^5.16.14", + "axios": "^1.7.9", "mui-file-input": "^4.0.6", "notistack": "^3.0.1", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-router": "^6.26.0", - "react-router-dom": "^6.26.0" + "react-router": "^6.28.1", + "react-router-dom": "^6.28.1" }, "devDependencies": { - "@eslint/compat": "^1.1.1", - "@eslint/js": "^9.8.0", - "@types/node": "^20.14.14", - "@types/react": "^18.3.3", - "@types/react-dom": "^18.3.0", - "@vitejs/plugin-react": "^4.3.1", + "@eslint/compat": "^1.2.5", + "@eslint/js": "^9.18.0", + "@types/node": "^20.17.13", + "@types/react": "^18.3.18", + "@types/react-dom": "^18.3.5", + "@vitejs/plugin-react": "^4.3.4", "eslint": "~9.6.0", - "eslint-plugin-react": "^7.35.0", - "globals": "^15.9.0", - "typescript": "^5.5.4", + "eslint-plugin-react": "^7.37.4", + "globals": "^15.14.0", + "typescript": "^5.7.3", "typescript-eslint": "^7.18.0", - "vite": "^5.3.5" + "vite": "^5.4.11" } } diff --git a/Server/Frontend/pnpm-lock.yaml b/Server/Frontend/pnpm-lock.yaml index 8d93d3cd75..99e609f667 100644 --- a/Server/Frontend/pnpm-lock.yaml +++ b/Server/Frontend/pnpm-lock.yaml @@ -9,32 +9,32 @@ importers: .: dependencies: '@emotion/react': - specifier: ^11.13.0 - version: 11.13.0(@types/react@18.3.3)(react@18.3.1) + specifier: ^11.14.0 + version: 11.14.0(@types/react@18.3.18)(react@18.3.1) '@emotion/styled': - specifier: ^11.13.0 - version: 11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + specifier: ^11.14.0 + version: 11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1) '@fontsource/roboto': - specifier: ^5.0.14 - version: 5.0.14 + specifier: ^5.1.1 + version: 5.1.1 '@fortawesome/fontawesome-svg-core': - specifier: ^6.6.0 - version: 6.6.0 + specifier: ^6.7.2 + version: 6.7.2 '@fortawesome/free-solid-svg-icons': - specifier: ^6.6.0 - version: 6.6.0 + specifier: ^6.7.2 + version: 6.7.2 '@fortawesome/react-fontawesome': specifier: ^0.2.2 - version: 0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1) + version: 0.2.2(@fortawesome/fontawesome-svg-core@6.7.2)(react@18.3.1) '@mui/material': - specifier: ^5.16.6 - version: 5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^5.16.14 + version: 5.16.14(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) axios: - specifier: ^1.7.3 - version: 1.7.3 + specifier: ^1.7.9 + version: 1.7.9 mui-file-input: specifier: ^4.0.6 - version: 4.0.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 4.0.6(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1))(@mui/material@5.16.14(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) notistack: specifier: ^3.0.1 version: 3.0.1(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -45,48 +45,48 @@ importers: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) react-router: - specifier: ^6.26.0 - version: 6.26.0(react@18.3.1) + specifier: ^6.28.1 + version: 6.28.1(react@18.3.1) react-router-dom: - specifier: ^6.26.0 - version: 6.26.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^6.28.1 + version: 6.28.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) devDependencies: '@eslint/compat': - specifier: ^1.1.1 - version: 1.1.1 + specifier: ^1.2.5 + version: 1.2.5(eslint@9.6.0) '@eslint/js': - specifier: ^9.8.0 - version: 9.8.0 + specifier: ^9.18.0 + version: 9.18.0 '@types/node': - specifier: ^20.14.14 - version: 20.14.14 + specifier: ^20.17.13 + version: 20.17.13 '@types/react': - specifier: ^18.3.3 - version: 18.3.3 + specifier: ^18.3.18 + version: 18.3.18 '@types/react-dom': - specifier: ^18.3.0 - version: 18.3.0 + specifier: ^18.3.5 + version: 18.3.5(@types/react@18.3.18) '@vitejs/plugin-react': - specifier: ^4.3.1 - version: 4.3.1(vite@5.3.5(@types/node@20.14.14)) + specifier: ^4.3.4 + version: 4.3.4(vite@5.4.11(@types/node@20.17.13)) eslint: specifier: ~9.6.0 version: 9.6.0 eslint-plugin-react: - specifier: ^7.35.0 - version: 7.35.0(eslint@9.6.0) + specifier: ^7.37.4 + version: 7.37.4(eslint@9.6.0) globals: - specifier: ^15.9.0 - version: 15.9.0 + specifier: ^15.14.0 + version: 15.14.0 typescript: - specifier: ^5.5.4 - version: 5.5.4 + specifier: ^5.7.3 + version: 5.7.3 typescript-eslint: specifier: ^7.18.0 - version: 7.18.0(eslint@9.6.0)(typescript@5.5.4) + version: 7.18.0(eslint@9.6.0)(typescript@5.7.3) vite: - specifier: ^5.3.5 - version: 5.3.5(@types/node@20.14.14) + specifier: ^5.4.11 + version: 5.4.11(@types/node@20.17.13) packages: @@ -94,114 +94,106 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@babel/code-frame@7.24.7': - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.25.2': - resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} + '@babel/compat-data@7.26.5': + resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==} engines: {node: '>=6.9.0'} - '@babel/core@7.25.2': - resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} + '@babel/core@7.26.0': + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.25.0': - resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} + '@babel/generator@7.26.5': + resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.25.2': - resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + '@babel/helper-compilation-targets@7.26.5': + resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.24.7': - resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.25.2': - resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.24.8': - resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} engines: {node: '>=6.9.0'} - '@babel/helper-simple-access@7.24.7': - resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.8': - resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.7': - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.24.8': - resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + '@babel/helpers@7.26.0': + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.25.0': - resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.24.7': - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.25.3': - resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} + '@babel/parser@7.26.5': + resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-transform-react-jsx-self@7.24.7': - resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==} + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.24.7': - resolution: {integrity: sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==} + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.25.0': - resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} engines: {node: '>=6.9.0'} - '@babel/template@7.25.0': - resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.3': - resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==} + '@babel/traverse@7.26.5': + resolution: {integrity: sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.25.2': - resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} + '@babel/types@7.26.5': + resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==} engines: {node: '>=6.9.0'} - '@emotion/babel-plugin@11.12.0': - resolution: {integrity: sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==} + '@emotion/babel-plugin@11.13.5': + resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} - '@emotion/cache@11.13.1': - resolution: {integrity: sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==} + '@emotion/cache@11.14.0': + resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} '@emotion/hash@0.9.2': resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} - '@emotion/is-prop-valid@1.3.0': - resolution: {integrity: sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==} + '@emotion/is-prop-valid@1.3.1': + resolution: {integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==} '@emotion/memoize@0.9.0': resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} - '@emotion/react@11.13.0': - resolution: {integrity: sha512-WkL+bw1REC2VNV1goQyfxjx1GYJkcc23CRQkXX+vZNLINyfI7o+uUn/rTGPt/xJ3bJHd5GcljgnxHf4wRw5VWQ==} + '@emotion/react@11.14.0': + resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==} peerDependencies: '@types/react': '*' react: '>=16.8.0' @@ -209,14 +201,14 @@ packages: '@types/react': optional: true - '@emotion/serialize@1.3.0': - resolution: {integrity: sha512-jACuBa9SlYajnpIVXB+XOXnfJHyckDfe6fOpORIM6yhBDlqGuExvDdZYHDQGoDf3bZXGv7tNr+LpLjJqiEQ6EA==} + '@emotion/serialize@1.3.3': + resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} '@emotion/sheet@1.4.0': resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} - '@emotion/styled@11.13.0': - resolution: {integrity: sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==} + '@emotion/styled@11.14.0': + resolution: {integrity: sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==} peerDependencies: '@emotion/react': ^11.0.0-rc.0 '@types/react': '*' @@ -225,16 +217,16 @@ packages: '@types/react': optional: true - '@emotion/unitless@0.9.0': - resolution: {integrity: sha512-TP6GgNZtmtFaFcsOgExdnfxLLpRDla4Q66tnenA9CktvVSdNKDvMVuUah4QvWPIpNjrWsGg3qeGo9a43QooGZQ==} + '@emotion/unitless@0.10.0': + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} - '@emotion/use-insertion-effect-with-fallbacks@1.1.0': - resolution: {integrity: sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==} + '@emotion/use-insertion-effect-with-fallbacks@1.2.0': + resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} peerDependencies: react: '>=16.8.0' - '@emotion/utils@1.4.0': - resolution: {integrity: sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==} + '@emotion/utils@1.4.2': + resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} '@emotion/weak-memoize@0.4.0': resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} @@ -377,53 +369,58 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.11.0': - resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/compat@1.1.1': - resolution: {integrity: sha512-lpHyRyplhGPL5mGEh6M9O5nnKk0Gz4bFI+Zu6tKlPpDUN7XshWvH9C/px4UVm87IAANE0W81CEsNGbS1KlzXpA==} + '@eslint/compat@1.2.5': + resolution: {integrity: sha512-5iuG/StT+7OfvhoBHPlmxkPA9om6aDUFgmD4+mWKAGsYt4vCe8rypneG03AuseyRHBmcCLXQtIH5S26tIoggLg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^9.10.0 + peerDependenciesMeta: + eslint: + optional: true '@eslint/config-array@0.17.1': resolution: {integrity: sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.1.0': - resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} + '@eslint/eslintrc@3.2.0': + resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.6.0': - resolution: {integrity: sha512-D9B0/3vNg44ZeWbYMpBoXqNP4j6eQD5vNwIlGAuFRRzK/WtT/jvDQW3Bi9kkf3PMDMlM7Yi+73VLUsn5bJcl8A==} + '@eslint/js@9.18.0': + resolution: {integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.8.0': - resolution: {integrity: sha512-MfluB7EUfxXtv3i/++oh89uzAr4PDI4nn201hsp+qaXqsjAWzinlZEHEfPgAX4doIlKvPG/i0A9dpKxOLII8yA==} + '@eslint/js@9.6.0': + resolution: {integrity: sha512-D9B0/3vNg44ZeWbYMpBoXqNP4j6eQD5vNwIlGAuFRRzK/WtT/jvDQW3Bi9kkf3PMDMlM7Yi+73VLUsn5bJcl8A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.4': - resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + '@eslint/object-schema@2.1.5': + resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@fontsource/roboto@5.0.14': - resolution: {integrity: sha512-zHAxlTTm9RuRn9/StwclFJChf3z9+fBrOxC3fw71htjHP1BgXNISwRjdJtAKAmMe5S2BzgpnjkQR93P9EZYI/Q==} + '@fontsource/roboto@5.1.1': + resolution: {integrity: sha512-XwVVXtERDQIM7HPUIbyDe0FP4SRovpjF7zMI8M7pbqFp3ahLJsJTd18h+E6pkar6UbV3btbwkKjYARr5M+SQow==} - '@fortawesome/fontawesome-common-types@6.6.0': - resolution: {integrity: sha512-xyX0X9mc0kyz9plIyryrRbl7ngsA9jz77mCZJsUkLl+ZKs0KWObgaEBoSgQiYWAsSmjz/yjl0F++Got0Mdp4Rw==} + '@fortawesome/fontawesome-common-types@6.7.2': + resolution: {integrity: sha512-Zs+YeHUC5fkt7Mg1l6XTniei3k4bwG/yo3iFUtZWd/pMx9g3fdvkSK9E0FOC+++phXOka78uJcYb8JaFkW52Xg==} engines: {node: '>=6'} - '@fortawesome/fontawesome-svg-core@6.6.0': - resolution: {integrity: sha512-KHwPkCk6oRT4HADE7smhfsKudt9N/9lm6EJ5BVg0tD1yPA5hht837fB87F8pn15D8JfTqQOjhKTktwmLMiD7Kg==} + '@fortawesome/fontawesome-svg-core@6.7.2': + resolution: {integrity: sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==} engines: {node: '>=6'} - '@fortawesome/free-solid-svg-icons@6.6.0': - resolution: {integrity: sha512-IYv/2skhEDFc2WGUcqvFJkeK39Q+HyPf5GHUrT/l2pKbtgEIv1al1TKd6qStR5OIwQdN1GZP54ci3y4mroJWjA==} + '@fortawesome/free-solid-svg-icons@6.7.2': + resolution: {integrity: sha512-GsBrnOzU8uj0LECDfD5zomZJIjrPhIlWU82AHwa2s40FKH+kcxQaBvBo3Z4TxyZHIyX8XTDxsyA33/Vx9eFuQA==} engines: {node: '>=6'} '@fortawesome/react-fontawesome@0.2.2': @@ -436,12 +433,12 @@ packages: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/retry@0.3.0': - resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} '@jridgewell/resolve-uri@3.1.2': @@ -458,18 +455,18 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@mui/core-downloads-tracker@5.16.6': - resolution: {integrity: sha512-kytg6LheUG42V8H/o/Ptz3olSO5kUXW9zF0ox18VnblX6bO2yif1FPItgc3ey1t5ansb1+gbe7SatntqusQupg==} + '@mui/core-downloads-tracker@5.16.14': + resolution: {integrity: sha512-sbjXW+BBSvmzn61XyTMun899E7nGPTXwqD9drm1jBUAvWEhJpPFIRxwQQiATWZnd9rvdxtnhhdsDxEGWI0jxqA==} - '@mui/material@5.16.6': - resolution: {integrity: sha512-0LUIKBOIjiFfzzFNxXZBRAyr9UQfmTAFzbt6ziOU2FDXhorNN2o3N9/32mNJbCA8zJo2FqFU6d3dtoqUDyIEfA==} + '@mui/material@5.16.14': + resolution: {integrity: sha512-eSXQVCMKU2xc7EcTxe/X/rC9QsV2jUe8eLM3MUCPYbo6V52eCE436akRIvELq/AqZpxx2bwkq7HC0cRhLB+yaw==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@emotion/react': optional: true @@ -478,37 +475,37 @@ packages: '@types/react': optional: true - '@mui/private-theming@5.16.6': - resolution: {integrity: sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==} + '@mui/private-theming@5.16.14': + resolution: {integrity: sha512-12t7NKzvYi819IO5IapW2BcR33wP/KAVrU8d7gLhGHoAmhDxyXlRoKiRij3TOD8+uzk0B6R9wHUNKi4baJcRNg==} engines: {node: '>=12.0.0'} peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true - '@mui/styled-engine@5.16.6': - resolution: {integrity: sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==} + '@mui/styled-engine@5.16.14': + resolution: {integrity: sha512-UAiMPZABZ7p8mUW4akDV6O7N3+4DatStpXMZwPlt+H/dA0lt67qawN021MNND+4QTpjaiMYxbhKZeQcyWCbuKw==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.4.1 '@emotion/styled': ^11.3.0 - react: ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@emotion/react': optional: true '@emotion/styled': optional: true - '@mui/system@5.16.6': - resolution: {integrity: sha512-5xgyJjBIMPw8HIaZpfbGAaFYPwImQn7Nyh+wwKWhvkoIeDosQ1ZMVrbTclefi7G8hNmqhip04duYwYpbBFnBgw==} + '@mui/system@5.16.14': + resolution: {integrity: sha512-KBxMwCb8mSIABnKvoGbvM33XHyT+sN0BzEBG+rsSc0lLQGzs7127KWkCA6/H8h6LZ00XpBEME5MAj8mZLiQ1tw==} engines: {node: '>=12.0.0'} peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@emotion/react': optional: true @@ -517,20 +514,20 @@ packages: '@types/react': optional: true - '@mui/types@7.2.15': - resolution: {integrity: sha512-nbo7yPhtKJkdf9kcVOF8JZHPZTmqXjJ/tI0bdWgHg5tp9AnIN4Y7f7wm9T+0SyGYJk76+GYZ8Q5XaTYAsUHN0Q==} + '@mui/types@7.2.21': + resolution: {integrity: sha512-6HstngiUxNqLU+/DPqlUJDIPbzUBxIVHb1MmXP0eTWDIROiCR2viugXpEif0PPe2mLqqakPzzRClWAnK+8UJww==} peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true - '@mui/utils@5.16.6': - resolution: {integrity: sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==} + '@mui/utils@5.16.14': + resolution: {integrity: sha512-wn1QZkRzSmeXD1IguBVvJJHV3s6rxJrfb6YuC9Kk6Noh9f8Fb54nUs5JRkKm+BOerRhj5fLg05Dhx/H3Ofb8Mg==} engines: {node: '>=12.0.0'} peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 - react: ^17.0.0 || ^18.0.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: '@types/react': optional: true @@ -550,87 +547,102 @@ packages: '@popperjs/core@2.11.8': resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - '@remix-run/router@1.19.0': - resolution: {integrity: sha512-zDICCLKEwbVYTS6TjYaWtHXxkdoUvD/QXvyVZjGCsWz5vyH7aFeONlPffPdW+Y/t6KT0MgXb2Mfjun9YpWN1dA==} + '@remix-run/router@1.21.0': + resolution: {integrity: sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==} engines: {node: '>=14.0.0'} - '@rollup/rollup-android-arm-eabi@4.20.0': - resolution: {integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==} + '@rollup/rollup-android-arm-eabi@4.30.1': + resolution: {integrity: sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.20.0': - resolution: {integrity: sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==} + '@rollup/rollup-android-arm64@4.30.1': + resolution: {integrity: sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.20.0': - resolution: {integrity: sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==} + '@rollup/rollup-darwin-arm64@4.30.1': + resolution: {integrity: sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.20.0': - resolution: {integrity: sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==} + '@rollup/rollup-darwin-x64@4.30.1': + resolution: {integrity: sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.20.0': - resolution: {integrity: sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==} + '@rollup/rollup-freebsd-arm64@4.30.1': + resolution: {integrity: sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.30.1': + resolution: {integrity: sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.30.1': + resolution: {integrity: sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.20.0': - resolution: {integrity: sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==} + '@rollup/rollup-linux-arm-musleabihf@4.30.1': + resolution: {integrity: sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.20.0': - resolution: {integrity: sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==} + '@rollup/rollup-linux-arm64-gnu@4.30.1': + resolution: {integrity: sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.20.0': - resolution: {integrity: sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==} + '@rollup/rollup-linux-arm64-musl@4.30.1': + resolution: {integrity: sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': - resolution: {integrity: sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==} + '@rollup/rollup-linux-loongarch64-gnu@4.30.1': + resolution: {integrity: sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': + resolution: {integrity: sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.20.0': - resolution: {integrity: sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==} + '@rollup/rollup-linux-riscv64-gnu@4.30.1': + resolution: {integrity: sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.20.0': - resolution: {integrity: sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==} + '@rollup/rollup-linux-s390x-gnu@4.30.1': + resolution: {integrity: sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.20.0': - resolution: {integrity: sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==} + '@rollup/rollup-linux-x64-gnu@4.30.1': + resolution: {integrity: sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.20.0': - resolution: {integrity: sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==} + '@rollup/rollup-linux-x64-musl@4.30.1': + resolution: {integrity: sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.20.0': - resolution: {integrity: sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==} + '@rollup/rollup-win32-arm64-msvc@4.30.1': + resolution: {integrity: sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.20.0': - resolution: {integrity: sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==} + '@rollup/rollup-win32-ia32-msvc@4.30.1': + resolution: {integrity: sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.20.0': - resolution: {integrity: sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==} + '@rollup/rollup-win32-x64-msvc@4.30.1': + resolution: {integrity: sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==} cpu: [x64] os: [win32] @@ -646,26 +658,30 @@ packages: '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - '@types/node@20.14.14': - resolution: {integrity: sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==} + '@types/node@20.17.13': + resolution: {integrity: sha512-RNf+4dEeV69PIvyp++4IKM2vnLXtmp/JovfeQm5P5+qpKb6wHoH7INywLdZ7z+gVX46kgBP/fwJJvZYaHxtdyw==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - '@types/prop-types@15.7.12': - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + '@types/prop-types@15.7.14': + resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} - '@types/react-dom@18.3.0': - resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + '@types/react-dom@18.3.5': + resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==} + peerDependencies: + '@types/react': ^18.0.0 - '@types/react-transition-group@4.4.10': - resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} + '@types/react-transition-group@4.4.12': + resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} + peerDependencies: + '@types/react': '*' - '@types/react@18.3.3': - resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + '@types/react@18.3.18': + resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==} '@typescript-eslint/eslint-plugin@7.18.0': resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} @@ -725,19 +741,19 @@ packages: resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} - '@vitejs/plugin-react@4.3.1': - resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} + '@vitejs/plugin-react@4.3.4': + resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - vite: ^4.2.0 || ^5.0.0 + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true @@ -748,10 +764,6 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -759,8 +771,8 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} array-includes@3.1.8: @@ -775,20 +787,20 @@ packages: resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} engines: {node: '>= 0.4'} - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} engines: {node: '>= 0.4'} - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} engines: {node: '>= 0.4'} array.prototype.tosorted@1.1.4: resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} engines: {node: '>= 0.4'} - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} asynckit@0.4.0: @@ -798,8 +810,8 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axios@1.7.3: - resolution: {integrity: sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw==} + axios@1.7.9: + resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} @@ -818,25 +830,29 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.23.3: - resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} engines: {node: '>= 0.4'} callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001649: - resolution: {integrity: sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==} - - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + caniuse-lite@1.0.30001692: + resolution: {integrity: sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -850,16 +866,10 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -880,27 +890,27 @@ packages: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} engines: {node: '>= 0.4'} - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} - debug@4.3.6: - resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -934,41 +944,45 @@ packages: dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} - electron-to-chromium@1.5.4: - resolution: {integrity: sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + electron-to-chromium@1.5.82: + resolution: {integrity: sha512-Zq16uk1hfQhyGx5GpwPAYDwddJuSGhtRhgOA2mCxANYaDT79nAeGnaXogMGng4KqLaJUVnOnuL0+TDop9nLOiA==} error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} engines: {node: '>= 0.4'} - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.0.19: - resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} engines: {node: '>= 0.4'} - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} esbuild@0.21.5: @@ -976,34 +990,30 @@ packages: engines: {node: '>=12'} hasBin: true - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-plugin-react@7.35.0: - resolution: {integrity: sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==} + eslint-plugin-react@7.37.4: + resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-scope@8.0.2: - resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} + eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.0.0: - resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint@9.6.0: @@ -1011,8 +1021,8 @@ packages: engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true - espree@10.1.0: - resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esquery@1.6.0: @@ -1034,8 +1044,8 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: @@ -1044,8 +1054,8 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.18.0: + resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} @@ -1066,11 +1076,11 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} - follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -1081,8 +1091,8 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} engines: {node: '>= 6'} fsevents@2.3.3: @@ -1093,8 +1103,8 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: @@ -1104,12 +1114,16 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} glob-parent@5.1.2: @@ -1128,8 +1142,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.9.0: - resolution: {integrity: sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==} + globals@15.14.0: + resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} engines: {node: '>=18'} globalthis@1.0.4: @@ -1140,23 +1154,21 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - goober@2.1.14: - resolution: {integrity: sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg==} + goober@2.1.16: + resolution: {integrity: sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==} peerDependencies: csstype: ^3.0.10 - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -1165,12 +1177,12 @@ packages: has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} engines: {node: '>= 0.4'} - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} has-tostringtag@1.0.2: @@ -1184,8 +1196,8 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} import-fresh@3.3.0: @@ -1196,53 +1208,55 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + is-async-function@2.1.0: + resolution: {integrity: sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==} engines: {node: '>= 0.4'} - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + is-boolean-object@1.2.1: + resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} engines: {node: '>= 0.4'} is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.15.0: - resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} engines: {node: '>= 0.4'} - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} is-glob@4.0.3: @@ -1253,12 +1267,8 @@ packages: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} is-number@7.0.0: @@ -1269,39 +1279,40 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.1.0: + resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} + engines: {node: '>= 0.4'} - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} isarray@2.0.5: @@ -1310,8 +1321,9 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -1320,9 +1332,9 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} hasBin: true json-buffer@3.0.1: @@ -1370,12 +1382,16 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} mime-db@1.52.0: @@ -1393,8 +1409,8 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} mui-file-input@4.0.6: resolution: {integrity: sha512-NRSW7WU7L1M5BZ4AhBL11KBpdza+F7nt81AbSl9ZND8nmm+eASMS6I+/eMrh+9XxpAjSKARPBjO9Xp8gqE7ZsQ==} @@ -1409,16 +1425,16 @@ packages: '@types/react': optional: true - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} notistack@3.0.1: resolution: {integrity: sha512-ntVZXXgSQH5WYfyU+3HfcXuKaapzAJ8fBLQ/G618rn3yvSzEbnOB8ZSOwhX+dAORy/lw+GC2N061JA0+gYWTVA==} @@ -1431,16 +1447,16 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.13.2: - resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + object-inspect@1.13.3: + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} engines: {node: '>= 0.4'} object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} object.entries@1.1.8: @@ -1451,14 +1467,18 @@ packages: resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -1490,8 +1510,8 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -1501,8 +1521,8 @@ packages: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} - postcss@8.4.40: - resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==} + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -1534,22 +1554,22 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-is@19.0.0: + resolution: {integrity: sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==} react-refresh@0.14.2: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} - react-router-dom@6.26.0: - resolution: {integrity: sha512-RRGUIiDtLrkX3uYcFiCIxKFWMcWQGMojpYZfcstc63A1+sSnVgILGIm9gNUA6na3Fm1QuPGSBQH2EMbAZOnMsQ==} + react-router-dom@6.28.1: + resolution: {integrity: sha512-YraE27C/RdjcZwl5UCqF/ffXnZDxpJdk9Q6jw38SZHjXs7NNdpViq2l2c7fO7+4uWaEfcwfGCv3RSg4e1By/fQ==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' - react-router@6.26.0: - resolution: {integrity: sha512-wVQq0/iFYd3iZ9H2l3N3k4PL8EEHcb0XlU2Na8nEwmiXgIUElEH6gaJDtUQxJ+JFzmIXaQjfdpcGWaM6IoQGxg==} + react-router@6.28.1: + resolution: {integrity: sha512-2omQTA3rkMljmrvvo6WtewGdVh45SpL9hGiCI9uUrwGGfNFDIvGK4gYJsKlJoNVi6AQZcopSCballL+QGOm7fA==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' @@ -1564,23 +1584,24 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} - reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} hasBin: true resolve@2.0.0-next.5: @@ -1591,20 +1612,24 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.20.0: - resolution: {integrity: sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==} + rollup@4.30.1: + resolution: {integrity: sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} scheduler@0.23.2: @@ -1627,6 +1652,10 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1635,35 +1664,48 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} - string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'} string.prototype.repeat@1.0.0: resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} @@ -1680,10 +1722,6 @@ packages: stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -1695,16 +1733,12 @@ packages: text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' @@ -1713,20 +1747,20 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} typescript-eslint@7.18.0: @@ -1739,19 +1773,20 @@ packages: typescript: optional: true - typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} engines: {node: '>=14.17'} hasBin: true - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - update-browserslist-db@1.1.0: - resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + update-browserslist-db@1.1.2: + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -1759,8 +1794,8 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - vite@5.3.5: - resolution: {integrity: sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==} + vite@5.4.11: + resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -1768,6 +1803,7 @@ packages: less: '*' lightningcss: ^1.21.0 sass: '*' + sass-embedded: '*' stylus: '*' sugarss: '*' terser: ^5.4.0 @@ -1780,6 +1816,8 @@ packages: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: @@ -1787,19 +1825,20 @@ packages: terser: optional: true - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} - which-builtin-type@1.1.4: - resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==} + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} engines: {node: '>= 0.4'} which-collection@1.0.2: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} engines: {node: '>= 0.4'} which@2.0.2: @@ -1826,144 +1865,130 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - '@babel/code-frame@7.24.7': + '@babel/code-frame@7.26.2': dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.0.1 + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 - '@babel/compat-data@7.25.2': {} + '@babel/compat-data@7.26.5': {} - '@babel/core@7.25.2': + '@babel/core@7.26.0': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helpers': 7.25.0 - '@babel/parser': 7.25.3 - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.5 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.5 + '@babel/template': 7.25.9 + '@babel/traverse': 7.26.5 + '@babel/types': 7.26.5 convert-source-map: 2.0.0 - debug: 4.3.6 + debug: 4.4.0 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.25.0': + '@babel/generator@7.26.5': dependencies: - '@babel/types': 7.25.2 - '@jridgewell/gen-mapping': 0.3.5 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 + jsesc: 3.1.0 - '@babel/helper-compilation-targets@7.25.2': + '@babel/helper-compilation-targets@7.26.5': dependencies: - '@babel/compat-data': 7.25.2 - '@babel/helper-validator-option': 7.24.8 - browserslist: 4.23.3 + '@babel/compat-data': 7.26.5 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-module-imports@7.24.7': - dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': + '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-simple-access': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.26.5 + '@babel/types': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/helper-plugin-utils@7.24.8': {} - - '@babel/helper-simple-access@7.24.7': + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.5 transitivePeerDependencies: - supports-color - '@babel/helper-string-parser@7.24.8': {} + '@babel/helper-plugin-utils@7.26.5': {} - '@babel/helper-validator-identifier@7.24.7': {} + '@babel/helper-string-parser@7.25.9': {} - '@babel/helper-validator-option@7.24.8': {} + '@babel/helper-validator-identifier@7.25.9': {} - '@babel/helpers@7.25.0': - dependencies: - '@babel/template': 7.25.0 - '@babel/types': 7.25.2 + '@babel/helper-validator-option@7.25.9': {} - '@babel/highlight@7.24.7': + '@babel/helpers@7.26.0': dependencies: - '@babel/helper-validator-identifier': 7.24.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.1 + '@babel/template': 7.25.9 + '@babel/types': 7.26.5 - '@babel/parser@7.25.3': + '@babel/parser@7.26.5': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.26.5 - '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 - '@babel/runtime@7.25.0': + '@babel/runtime@7.26.0': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.25.0': + '@babel/template@7.25.9': dependencies: - '@babel/code-frame': 7.24.7 - '@babel/parser': 7.25.3 - '@babel/types': 7.25.2 + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 - '@babel/traverse@7.25.3': + '@babel/traverse@7.26.5': dependencies: - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 - '@babel/parser': 7.25.3 - '@babel/template': 7.25.0 - '@babel/types': 7.25.2 - debug: 4.3.6 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.5 + '@babel/parser': 7.26.5 + '@babel/template': 7.25.9 + '@babel/types': 7.26.5 + debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.25.2': + '@babel/types@7.26.5': dependencies: - '@babel/helper-string-parser': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 - to-fast-properties: 2.0.0 + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 - '@emotion/babel-plugin@11.12.0': + '@emotion/babel-plugin@11.13.5': dependencies: - '@babel/helper-module-imports': 7.24.7 - '@babel/runtime': 7.25.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/runtime': 7.26.0 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 - '@emotion/serialize': 1.3.0 + '@emotion/serialize': 1.3.3 babel-plugin-macros: 3.1.0 convert-source-map: 1.9.0 escape-string-regexp: 4.0.0 @@ -1973,70 +1998,70 @@ snapshots: transitivePeerDependencies: - supports-color - '@emotion/cache@11.13.1': + '@emotion/cache@11.14.0': dependencies: '@emotion/memoize': 0.9.0 '@emotion/sheet': 1.4.0 - '@emotion/utils': 1.4.0 + '@emotion/utils': 1.4.2 '@emotion/weak-memoize': 0.4.0 stylis: 4.2.0 '@emotion/hash@0.9.2': {} - '@emotion/is-prop-valid@1.3.0': + '@emotion/is-prop-valid@1.3.1': dependencies: '@emotion/memoize': 0.9.0 '@emotion/memoize@0.9.0': {} - '@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1)': + '@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.0 - '@emotion/babel-plugin': 11.12.0 - '@emotion/cache': 11.13.1 - '@emotion/serialize': 1.3.0 - '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) - '@emotion/utils': 1.4.0 + '@babel/runtime': 7.26.0 + '@emotion/babel-plugin': 11.13.5 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1) + '@emotion/utils': 1.4.2 '@emotion/weak-memoize': 0.4.0 hoist-non-react-statics: 3.3.2 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.18 transitivePeerDependencies: - supports-color - '@emotion/serialize@1.3.0': + '@emotion/serialize@1.3.3': dependencies: '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 - '@emotion/unitless': 0.9.0 - '@emotion/utils': 1.4.0 + '@emotion/unitless': 0.10.0 + '@emotion/utils': 1.4.2 csstype: 3.1.3 '@emotion/sheet@1.4.0': {} - '@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': + '@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.0 - '@emotion/babel-plugin': 11.12.0 - '@emotion/is-prop-valid': 1.3.0 - '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.3.1) - '@emotion/serialize': 1.3.0 - '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) - '@emotion/utils': 1.4.0 + '@babel/runtime': 7.26.0 + '@emotion/babel-plugin': 11.13.5 + '@emotion/is-prop-valid': 1.3.1 + '@emotion/react': 11.14.0(@types/react@18.3.18)(react@18.3.1) + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1) + '@emotion/utils': 1.4.2 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.18 transitivePeerDependencies: - supports-color - '@emotion/unitless@0.9.0': {} + '@emotion/unitless@0.10.0': {} - '@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@18.3.1)': + '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@18.3.1)': dependencies: react: 18.3.1 - '@emotion/utils@1.4.0': {} + '@emotion/utils@1.4.2': {} '@emotion/weak-memoize@0.4.0': {} @@ -2109,30 +2134,32 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.6.0)': + '@eslint-community/eslint-utils@4.4.1(eslint@9.6.0)': dependencies: eslint: 9.6.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.11.0': {} + '@eslint-community/regexpp@4.12.1': {} - '@eslint/compat@1.1.1': {} + '@eslint/compat@1.2.5(eslint@9.6.0)': + optionalDependencies: + eslint: 9.6.0 '@eslint/config-array@0.17.1': dependencies: - '@eslint/object-schema': 2.1.4 - debug: 4.3.6 + '@eslint/object-schema': 2.1.5 + debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/eslintrc@3.1.0': + '@eslint/eslintrc@3.2.0': dependencies: ajv: 6.12.6 - debug: 4.3.6 - espree: 10.1.0 + debug: 4.4.0 + espree: 10.3.0 globals: 14.0.0 - ignore: 5.3.1 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -2140,35 +2167,35 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.6.0': {} + '@eslint/js@9.18.0': {} - '@eslint/js@9.8.0': {} + '@eslint/js@9.6.0': {} - '@eslint/object-schema@2.1.4': {} + '@eslint/object-schema@2.1.5': {} - '@fontsource/roboto@5.0.14': {} + '@fontsource/roboto@5.1.1': {} - '@fortawesome/fontawesome-common-types@6.6.0': {} + '@fortawesome/fontawesome-common-types@6.7.2': {} - '@fortawesome/fontawesome-svg-core@6.6.0': + '@fortawesome/fontawesome-svg-core@6.7.2': dependencies: - '@fortawesome/fontawesome-common-types': 6.6.0 + '@fortawesome/fontawesome-common-types': 6.7.2 - '@fortawesome/free-solid-svg-icons@6.6.0': + '@fortawesome/free-solid-svg-icons@6.7.2': dependencies: - '@fortawesome/fontawesome-common-types': 6.6.0 + '@fortawesome/fontawesome-common-types': 6.7.2 - '@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.6.0)(react@18.3.1)': + '@fortawesome/react-fontawesome@0.2.2(@fortawesome/fontawesome-svg-core@6.7.2)(react@18.3.1)': dependencies: - '@fortawesome/fontawesome-svg-core': 6.6.0 + '@fortawesome/fontawesome-svg-core': 6.7.2 prop-types: 15.8.1 react: 18.3.1 '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/retry@0.3.0': {} + '@humanwhocodes/retry@0.3.1': {} - '@jridgewell/gen-mapping@0.3.5': + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.5.0 @@ -2185,80 +2212,80 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@mui/core-downloads-tracker@5.16.6': {} + '@mui/core-downloads-tracker@5.16.14': {} - '@mui/material@5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@mui/material@5.16.14(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.0 - '@mui/core-downloads-tracker': 5.16.6 - '@mui/system': 5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - '@mui/types': 7.2.15(@types/react@18.3.3) - '@mui/utils': 5.16.6(@types/react@18.3.3)(react@18.3.1) + '@babel/runtime': 7.26.0 + '@mui/core-downloads-tracker': 5.16.14 + '@mui/system': 5.16.14(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1) + '@mui/types': 7.2.21(@types/react@18.3.18) + '@mui/utils': 5.16.14(@types/react@18.3.18)(react@18.3.1) '@popperjs/core': 2.11.8 - '@types/react-transition-group': 4.4.10 + '@types/react-transition-group': 4.4.12(@types/react@18.3.18) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-is: 18.3.1 + react-is: 19.0.0 react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) optionalDependencies: - '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.3.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - '@types/react': 18.3.3 + '@emotion/react': 11.14.0(@types/react@18.3.18)(react@18.3.1) + '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 - '@mui/private-theming@5.16.6(@types/react@18.3.3)(react@18.3.1)': + '@mui/private-theming@5.16.14(@types/react@18.3.18)(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.0 - '@mui/utils': 5.16.6(@types/react@18.3.3)(react@18.3.1) + '@babel/runtime': 7.26.0 + '@mui/utils': 5.16.14(@types/react@18.3.18)(react@18.3.1) prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.18 - '@mui/styled-engine@5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1)': + '@mui/styled-engine@5.16.14(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.0 - '@emotion/cache': 11.13.1 + '@babel/runtime': 7.26.0 + '@emotion/cache': 11.14.0 csstype: 3.1.3 prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.3.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) + '@emotion/react': 11.14.0(@types/react@18.3.18)(react@18.3.1) + '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1) - '@mui/system@5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1)': + '@mui/system@5.16.14(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.0 - '@mui/private-theming': 5.16.6(@types/react@18.3.3)(react@18.3.1) - '@mui/styled-engine': 5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(react@18.3.1) - '@mui/types': 7.2.15(@types/react@18.3.3) - '@mui/utils': 5.16.6(@types/react@18.3.3)(react@18.3.1) + '@babel/runtime': 7.26.0 + '@mui/private-theming': 5.16.14(@types/react@18.3.18)(react@18.3.1) + '@mui/styled-engine': 5.16.14(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1))(react@18.3.1) + '@mui/types': 7.2.21(@types/react@18.3.18) + '@mui/utils': 5.16.14(@types/react@18.3.18)(react@18.3.1) clsx: 2.1.1 csstype: 3.1.3 prop-types: 15.8.1 react: 18.3.1 optionalDependencies: - '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.3.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - '@types/react': 18.3.3 + '@emotion/react': 11.14.0(@types/react@18.3.18)(react@18.3.1) + '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1) + '@types/react': 18.3.18 - '@mui/types@7.2.15(@types/react@18.3.3)': + '@mui/types@7.2.21(@types/react@18.3.18)': optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.18 - '@mui/utils@5.16.6(@types/react@18.3.3)(react@18.3.1)': + '@mui/utils@5.16.14(@types/react@18.3.18)(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.0 - '@mui/types': 7.2.15(@types/react@18.3.3) - '@types/prop-types': 15.7.12 + '@babel/runtime': 7.26.0 + '@mui/types': 7.2.21(@types/react@18.3.18) + '@types/prop-types': 15.7.14 clsx: 2.1.1 prop-types: 15.8.1 react: 18.3.1 - react-is: 18.3.1 + react-is: 19.0.0 optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.18 '@nodelib/fs.scandir@2.1.5': dependencies: @@ -2270,132 +2297,141 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.18.0 '@popperjs/core@2.11.8': {} - '@remix-run/router@1.19.0': {} + '@remix-run/router@1.21.0': {} + + '@rollup/rollup-android-arm-eabi@4.30.1': + optional: true + + '@rollup/rollup-android-arm64@4.30.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.30.1': + optional: true - '@rollup/rollup-android-arm-eabi@4.20.0': + '@rollup/rollup-darwin-x64@4.30.1': optional: true - '@rollup/rollup-android-arm64@4.20.0': + '@rollup/rollup-freebsd-arm64@4.30.1': optional: true - '@rollup/rollup-darwin-arm64@4.20.0': + '@rollup/rollup-freebsd-x64@4.30.1': optional: true - '@rollup/rollup-darwin-x64@4.20.0': + '@rollup/rollup-linux-arm-gnueabihf@4.30.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.20.0': + '@rollup/rollup-linux-arm-musleabihf@4.30.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.20.0': + '@rollup/rollup-linux-arm64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.20.0': + '@rollup/rollup-linux-arm64-musl@4.30.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.20.0': + '@rollup/rollup-linux-loongarch64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.20.0': + '@rollup/rollup-linux-riscv64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.20.0': + '@rollup/rollup-linux-s390x-gnu@4.30.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.20.0': + '@rollup/rollup-linux-x64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-x64-musl@4.20.0': + '@rollup/rollup-linux-x64-musl@4.30.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.20.0': + '@rollup/rollup-win32-arm64-msvc@4.30.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.20.0': + '@rollup/rollup-win32-ia32-msvc@4.30.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.20.0': + '@rollup/rollup-win32-x64-msvc@4.30.1': optional: true '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.25.3 - '@babel/types': 7.25.2 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.26.5 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.25.3 - '@babel/types': 7.25.2 + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.26.5 - '@types/estree@1.0.5': {} + '@types/estree@1.0.6': {} - '@types/node@20.14.14': + '@types/node@20.17.13': dependencies: - undici-types: 5.26.5 + undici-types: 6.19.8 '@types/parse-json@4.0.2': {} - '@types/prop-types@15.7.12': {} + '@types/prop-types@15.7.14': {} - '@types/react-dom@18.3.0': + '@types/react-dom@18.3.5(@types/react@18.3.18)': dependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.18 - '@types/react-transition-group@4.4.10': + '@types/react-transition-group@4.4.12(@types/react@18.3.18)': dependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.18 - '@types/react@18.3.3': + '@types/react@18.3.18': dependencies: - '@types/prop-types': 15.7.12 + '@types/prop-types': 15.7.14 csstype: 3.1.3 - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.6.0)(typescript@5.5.4))(eslint@9.6.0)(typescript@5.5.4)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.6.0)(typescript@5.7.3))(eslint@9.6.0)(typescript@5.7.3)': dependencies: - '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 7.18.0(eslint@9.6.0)(typescript@5.5.4) + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 7.18.0(eslint@9.6.0)(typescript@5.7.3) '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@9.6.0)(typescript@5.5.4) - '@typescript-eslint/utils': 7.18.0(eslint@9.6.0)(typescript@5.5.4) + '@typescript-eslint/type-utils': 7.18.0(eslint@9.6.0)(typescript@5.7.3) + '@typescript-eslint/utils': 7.18.0(eslint@9.6.0)(typescript@5.7.3) '@typescript-eslint/visitor-keys': 7.18.0 eslint: 9.6.0 graphemer: 1.4.0 - ignore: 5.3.1 + ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.5.4) + ts-api-utils: 1.4.3(typescript@5.7.3) optionalDependencies: - typescript: 5.5.4 + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@9.6.0)(typescript@5.5.4)': + '@typescript-eslint/parser@7.18.0(eslint@9.6.0)(typescript@5.7.3)': dependencies: '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.6 + debug: 4.4.0 eslint: 9.6.0 optionalDependencies: - typescript: 5.5.4 + typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -2404,41 +2440,41 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/type-utils@7.18.0(eslint@9.6.0)(typescript@5.5.4)': + '@typescript-eslint/type-utils@7.18.0(eslint@9.6.0)(typescript@5.7.3)': dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) - '@typescript-eslint/utils': 7.18.0(eslint@9.6.0)(typescript@5.5.4) - debug: 4.3.6 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) + '@typescript-eslint/utils': 7.18.0(eslint@9.6.0)(typescript@5.7.3) + debug: 4.4.0 eslint: 9.6.0 - ts-api-utils: 1.3.0(typescript@5.5.4) + ts-api-utils: 1.4.3(typescript@5.7.3) optionalDependencies: - typescript: 5.5.4 + typescript: 5.7.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4)': + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.7.3)': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.6 + debug: 4.4.0 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.5.4) + ts-api-utils: 1.4.3(typescript@5.7.3) optionalDependencies: - typescript: 5.5.4 + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.18.0(eslint@9.6.0)(typescript@5.5.4)': + '@typescript-eslint/utils@7.18.0(eslint@9.6.0)(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.6.0) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) eslint: 9.6.0 transitivePeerDependencies: - supports-color @@ -2449,22 +2485,22 @@ snapshots: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 - '@vitejs/plugin-react@4.3.1(vite@5.3.5(@types/node@20.14.14))': + '@vitejs/plugin-react@4.3.4(vite@5.4.11(@types/node@20.17.13))': dependencies: - '@babel/core': 7.25.2 - '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.3.5(@types/node@20.14.14) + vite: 5.4.11(@types/node@20.17.13) transitivePeerDependencies: - supports-color - acorn-jsx@5.3.2(acorn@8.12.1): + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: - acorn: 8.12.1 + acorn: 8.14.0 - acorn@8.12.1: {} + acorn@8.14.0: {} ajv@6.12.6: dependencies: @@ -2475,73 +2511,68 @@ snapshots: ansi-regex@5.0.1: {} - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 argparse@2.0.1: {} - array-buffer-byte-length@1.0.1: + array-buffer-byte-length@1.0.2: dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 + call-bound: 1.0.3 + is-array-buffer: 3.0.5 array-includes@3.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - is-string: 1.0.7 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + is-string: 1.1.1 array-union@2.1.0: {} array.prototype.findlast@1.2.5: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 es-shim-unscopables: 1.0.2 - array.prototype.flat@1.3.2: + array.prototype.flat@1.3.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 es-shim-unscopables: 1.0.2 - array.prototype.flatmap@1.3.2: + array.prototype.flatmap@1.3.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 es-shim-unscopables: 1.0.2 array.prototype.tosorted@1.1.4: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 es-errors: 1.3.0 es-shim-unscopables: 1.0.2 - arraybuffer.prototype.slice@1.0.3: + arraybuffer.prototype.slice@1.0.4: dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 + get-intrinsic: 1.2.7 + is-array-buffer: 3.0.5 asynckit@0.4.0: {} @@ -2549,19 +2580,19 @@ snapshots: dependencies: possible-typed-array-names: 1.0.0 - axios@1.7.3: + axios@1.7.9: dependencies: - follow-redirects: 1.15.6 - form-data: 4.0.0 + follow-redirects: 1.15.9 + form-data: 4.0.1 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.26.0 cosmiconfig: 7.1.0 - resolve: 1.22.8 + resolve: 1.22.10 balanced-match@1.0.2: {} @@ -2578,30 +2609,33 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.23.3: + browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001649 - electron-to-chromium: 1.5.4 - node-releases: 2.0.18 - update-browserslist-db: 1.1.0(browserslist@4.23.3) + caniuse-lite: 1.0.30001692 + electron-to-chromium: 1.5.82 + node-releases: 2.0.19 + update-browserslist-db: 1.1.2(browserslist@4.24.4) - call-bind@1.0.7: + call-bind-apply-helpers@1.0.1: dependencies: - es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + get-intrinsic: 1.2.7 set-function-length: 1.2.2 - callsites@3.1.0: {} + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.7 - caniuse-lite@1.0.30001649: {} + callsites@3.1.0: {} - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 + caniuse-lite@1.0.30001692: {} chalk@4.1.2: dependencies: @@ -2612,16 +2646,10 @@ snapshots: clsx@2.1.1: {} - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} combined-stream@1.0.8: @@ -2642,7 +2670,7 @@ snapshots: path-type: 4.0.0 yaml: 1.10.2 - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 @@ -2650,35 +2678,35 @@ snapshots: csstype@3.1.3: {} - data-view-buffer@1.0.1: + data-view-buffer@1.0.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 - data-view-byte-length@1.0.1: + data-view-byte-length@1.0.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 - data-view-byte-offset@1.0.0: + data-view-byte-offset@1.0.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-data-view: 1.0.1 + is-data-view: 1.0.2 - debug@4.3.6: + debug@4.4.0: dependencies: - ms: 2.1.2 + ms: 2.1.3 deep-is@0.1.4: {} define-data-property@1.1.4: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 es-errors: 1.3.0 - gopd: 1.0.1 + gopd: 1.2.0 define-properties@1.2.1: dependencies: @@ -2698,94 +2726,106 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.26.0 csstype: 3.1.3 - electron-to-chromium@1.5.4: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + electron-to-chromium@1.5.82: {} error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.3: + es-abstract@1.23.9: dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 + call-bind: 1.0.8 + call-bound: 1.0.3 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 globalthis: 1.0.4 - gopd: 1.0.1 + gopd: 1.2.0 has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 + has-proto: 1.2.0 + has-symbols: 1.1.0 hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.2 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.0 + math-intrinsics: 1.1.0 + object-inspect: 1.13.3 object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.18 - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 + es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-iterator-helpers@1.0.19: + es-iterator-helpers@1.2.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-set-tostringtag: 2.0.3 + es-set-tostringtag: 2.1.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.7 globalthis: 1.0.4 + gopd: 1.2.0 has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - iterator.prototype: 1.1.2 - safe-array-concat: 1.1.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 - es-object-atoms@1.0.0: + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 - es-set-tostringtag@2.0.3: + es-set-tostringtag@2.1.0: dependencies: - get-intrinsic: 1.2.4 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -2793,11 +2833,11 @@ snapshots: dependencies: hasown: 2.0.2 - es-to-primitive@1.2.1: + es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 + is-date-object: 1.1.0 + is-symbol: 1.1.1 esbuild@0.21.5: optionalDependencies: @@ -2825,20 +2865,18 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - escalade@3.1.2: {} - - escape-string-regexp@1.0.5: {} + escalade@3.2.0: {} escape-string-regexp@4.0.0: {} - eslint-plugin-react@7.35.0(eslint@9.6.0): + eslint-plugin-react@7.37.4(eslint@9.6.0): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.2 + array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.0.19 + es-iterator-helpers: 1.2.1 eslint: 9.6.0 estraverse: 5.3.0 hasown: 2.0.2 @@ -2846,47 +2884,47 @@ snapshots: minimatch: 3.1.2 object.entries: 1.1.8 object.fromentries: 2.0.8 - object.values: 1.2.0 + object.values: 1.2.1 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 - string.prototype.matchall: 4.0.11 + string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-scope@8.0.2: + eslint-scope@8.2.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.0.0: {} + eslint-visitor-keys@4.2.0: {} eslint@9.6.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) - '@eslint-community/regexpp': 4.11.0 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.6.0) + '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.17.1 - '@eslint/eslintrc': 3.1.0 + '@eslint/eslintrc': 3.2.0 '@eslint/js': 9.6.0 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.3.0 + '@humanwhocodes/retry': 0.3.1 '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.6 + cross-spawn: 7.0.6 + debug: 4.4.0 escape-string-regexp: 4.0.0 - eslint-scope: 8.0.2 - eslint-visitor-keys: 4.0.0 - espree: 10.1.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - ignore: 5.3.1 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -2901,11 +2939,11 @@ snapshots: transitivePeerDependencies: - supports-color - espree@10.1.0: + espree@10.3.0: dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) - eslint-visitor-keys: 4.0.0 + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 esquery@1.6.0: dependencies: @@ -2921,19 +2959,19 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.7 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} - fastq@1.17.1: + fastq@1.18.0: dependencies: reusify: 1.0.4 @@ -2954,18 +2992,18 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.1 + flatted: 3.3.2 keyv: 4.5.4 - flatted@3.3.1: {} + flatted@3.3.2: {} - follow-redirects@1.15.6: {} + follow-redirects@1.15.9: {} for-each@0.3.3: dependencies: is-callable: 1.2.7 - form-data@4.0.0: + form-data@4.0.1: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -2976,30 +3014,42 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: + function.prototype.name@1.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.23.3 functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 functions-have-names@1.2.3: {} gensync@1.0.0-beta.2: {} - get-intrinsic@1.2.4: + get-intrinsic@1.2.7: dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 es-errors: 1.3.0 + es-object-atoms: 1.1.1 function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 - get-symbol-description@1.0.2: + get-symbol-description@1.1.0: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.4 + get-intrinsic: 1.2.7 glob-parent@5.1.2: dependencies: @@ -3013,49 +3063,47 @@ snapshots: globals@14.0.0: {} - globals@15.9.0: {} + globals@15.14.0: {} globalthis@1.0.4: dependencies: define-properties: 1.2.1 - gopd: 1.0.1 + gopd: 1.2.0 globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.1 + fast-glob: 3.3.3 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 - goober@2.1.14(csstype@3.1.3): + goober@2.1.16(csstype@3.1.3): dependencies: csstype: 3.1.3 - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 + gopd@1.2.0: {} graphemer@1.4.0: {} - has-bigints@1.0.2: {} - - has-flag@3.0.0: {} + has-bigints@1.1.0: {} has-flag@4.0.0: {} has-property-descriptors@1.0.2: dependencies: - es-define-property: 1.0.0 + es-define-property: 1.0.1 - has-proto@1.0.3: {} + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 - has-symbols@1.0.3: {} + has-symbols@1.1.0: {} has-tostringtag@1.0.2: dependencies: - has-symbols: 1.0.3 + has-symbols: 1.1.0 hasown@2.0.2: dependencies: @@ -3065,7 +3113,7 @@ snapshots: dependencies: react-is: 16.13.1 - ignore@5.3.1: {} + ignore@5.3.2: {} import-fresh@3.3.0: dependencies: @@ -3074,55 +3122,65 @@ snapshots: imurmurhash@0.1.4: {} - internal-slot@1.0.7: + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 hasown: 2.0.2 - side-channel: 1.0.6 + side-channel: 1.1.0 - is-array-buffer@3.0.4: + is-array-buffer@3.0.5: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 is-arrayish@0.2.1: {} - is-async-function@2.0.0: + is-async-function@2.1.0: dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 - is-bigint@1.0.4: + is-bigint@1.1.0: dependencies: - has-bigints: 1.0.2 + has-bigints: 1.1.0 - is-boolean-object@1.1.2: + is-boolean-object@1.2.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-callable@1.2.7: {} - is-core-module@2.15.0: + is-core-module@2.16.1: dependencies: hasown: 2.0.2 - is-data-view@1.0.1: + is-data-view@1.0.2: dependencies: - is-typed-array: 1.1.13 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + is-typed-array: 1.1.15 - is-date-object@1.0.5: + is-date-object@1.1.0: dependencies: + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-extglob@2.1.1: {} - is-finalizationregistry@1.0.2: + is-finalizationregistry@1.1.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 - is-generator-function@1.0.10: + is-generator-function@1.1.0: dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 is-glob@4.0.3: dependencies: @@ -3130,60 +3188,65 @@ snapshots: is-map@2.0.3: {} - is-negative-zero@2.0.3: {} - - is-number-object@1.0.7: + is-number-object@1.1.1: dependencies: + call-bound: 1.0.3 has-tostringtag: 1.0.2 is-number@7.0.0: {} is-path-inside@3.0.3: {} - is-regex@1.1.4: + is-regex@1.2.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 + gopd: 1.2.0 has-tostringtag: 1.0.2 + hasown: 2.0.2 is-set@2.0.3: {} - is-shared-array-buffer@1.0.3: + is-shared-array-buffer@1.0.4: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 - is-string@1.0.7: + is-string@1.1.1: dependencies: + call-bound: 1.0.3 has-tostringtag: 1.0.2 - is-symbol@1.0.4: + is-symbol@1.1.1: dependencies: - has-symbols: 1.0.3 + call-bound: 1.0.3 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 - is-typed-array@1.1.13: + is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.15 + which-typed-array: 1.1.18 is-weakmap@2.0.2: {} - is-weakref@1.0.2: + is-weakref@1.1.0: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 - is-weakset@2.0.3: + is-weakset@2.0.4: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 isarray@2.0.5: {} isexe@2.0.0: {} - iterator.prototype@1.1.2: + iterator.prototype@1.1.5: dependencies: - define-properties: 1.2.1 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.6 + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + has-symbols: 1.1.0 set-function-name: 2.0.2 js-tokens@4.0.0: {} @@ -3192,7 +3255,7 @@ snapshots: dependencies: argparse: 2.0.1 - jsesc@2.5.2: {} + jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -3207,9 +3270,9 @@ snapshots: jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.8 - array.prototype.flat: 1.3.2 - object.assign: 4.1.5 - object.values: 1.2.0 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 keyv@4.5.4: dependencies: @@ -3236,9 +3299,11 @@ snapshots: dependencies: yallist: 3.1.1 + math-intrinsics@1.1.0: {} + merge2@1.4.1: {} - micromatch@4.0.7: + micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 @@ -3257,29 +3322,29 @@ snapshots: dependencies: brace-expansion: 2.0.1 - ms@2.1.2: {} + ms@2.1.3: {} - mui-file-input@4.0.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@mui/material@5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + mui-file-input@4.0.6(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1))(@mui/material@5.16.14(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@emotion/react': 11.13.0(@types/react@18.3.3)(react@18.3.1) - '@emotion/styled': 11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1) - '@mui/material': 5.16.6(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@emotion/styled@11.13.0(@emotion/react@11.13.0(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react@18.3.1))(@types/react@18.3.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@emotion/react': 11.14.0(@types/react@18.3.18)(react@18.3.1) + '@emotion/styled': 11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1) + '@mui/material': 5.16.14(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react@18.3.1))(@types/react@18.3.18)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) pretty-bytes: 6.1.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.3 + '@types/react': 18.3.18 - nanoid@3.3.7: {} + nanoid@3.3.8: {} natural-compare@1.4.0: {} - node-releases@2.0.18: {} + node-releases@2.0.19: {} notistack@3.0.1(csstype@3.1.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: clsx: 1.2.1 - goober: 2.1.14(csstype@3.1.3) + goober: 2.1.16(csstype@3.1.3) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -3287,35 +3352,38 @@ snapshots: object-assign@4.1.1: {} - object-inspect@1.13.2: {} + object-inspect@1.13.3: {} object-keys@1.1.1: {} - object.assign@4.1.5: + object.assign@4.1.7: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - has-symbols: 1.0.3 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 object-keys: 1.1.1 object.entries@1.1.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 object.fromentries@2.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 - object.values@1.2.0: + object.values@1.2.1: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 optionator@0.9.4: dependencies: @@ -3326,6 +3394,12 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.2.7 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -3340,7 +3414,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.7 + '@babel/code-frame': 7.26.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -3353,17 +3427,17 @@ snapshots: path-type@4.0.0: {} - picocolors@1.0.1: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} possible-typed-array-names@1.0.0: {} - postcss@8.4.40: + postcss@8.5.1: dependencies: - nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 prelude-ls@1.2.1: {} @@ -3389,25 +3463,25 @@ snapshots: react-is@16.13.1: {} - react-is@18.3.1: {} + react-is@19.0.0: {} react-refresh@0.14.2: {} - react-router-dom@6.26.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-router-dom@6.28.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@remix-run/router': 1.19.0 + '@remix-run/router': 1.21.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-router: 6.26.0(react@18.3.1) + react-router: 6.28.1(react@18.3.1) - react-router@6.26.0(react@18.3.1): + react-router@6.28.1(react@18.3.1): dependencies: - '@remix-run/router': 1.19.0 + '@remix-run/router': 1.21.0 react: 18.3.1 react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.26.0 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -3418,79 +3492,91 @@ snapshots: dependencies: loose-envify: 1.4.0 - reflect.getprototypeof@1.0.6: + reflect.getprototypeof@1.0.10: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - globalthis: 1.0.4 - which-builtin-type: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 regenerator-runtime@0.14.1: {} - regexp.prototype.flags@1.5.2: + regexp.prototype.flags@1.5.4: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 set-function-name: 2.0.2 resolve-from@4.0.0: {} - resolve@1.22.8: + resolve@1.22.10: dependencies: - is-core-module: 2.15.0 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 resolve@2.0.0-next.5: dependencies: - is-core-module: 2.15.0 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 reusify@1.0.4: {} - rollup@4.20.0: + rollup@4.30.1: dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.20.0 - '@rollup/rollup-android-arm64': 4.20.0 - '@rollup/rollup-darwin-arm64': 4.20.0 - '@rollup/rollup-darwin-x64': 4.20.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.20.0 - '@rollup/rollup-linux-arm-musleabihf': 4.20.0 - '@rollup/rollup-linux-arm64-gnu': 4.20.0 - '@rollup/rollup-linux-arm64-musl': 4.20.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.20.0 - '@rollup/rollup-linux-riscv64-gnu': 4.20.0 - '@rollup/rollup-linux-s390x-gnu': 4.20.0 - '@rollup/rollup-linux-x64-gnu': 4.20.0 - '@rollup/rollup-linux-x64-musl': 4.20.0 - '@rollup/rollup-win32-arm64-msvc': 4.20.0 - '@rollup/rollup-win32-ia32-msvc': 4.20.0 - '@rollup/rollup-win32-x64-msvc': 4.20.0 + '@rollup/rollup-android-arm-eabi': 4.30.1 + '@rollup/rollup-android-arm64': 4.30.1 + '@rollup/rollup-darwin-arm64': 4.30.1 + '@rollup/rollup-darwin-x64': 4.30.1 + '@rollup/rollup-freebsd-arm64': 4.30.1 + '@rollup/rollup-freebsd-x64': 4.30.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.30.1 + '@rollup/rollup-linux-arm-musleabihf': 4.30.1 + '@rollup/rollup-linux-arm64-gnu': 4.30.1 + '@rollup/rollup-linux-arm64-musl': 4.30.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.30.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.30.1 + '@rollup/rollup-linux-riscv64-gnu': 4.30.1 + '@rollup/rollup-linux-s390x-gnu': 4.30.1 + '@rollup/rollup-linux-x64-gnu': 4.30.1 + '@rollup/rollup-linux-x64-musl': 4.30.1 + '@rollup/rollup-win32-arm64-msvc': 4.30.1 + '@rollup/rollup-win32-ia32-msvc': 4.30.1 + '@rollup/rollup-win32-x64-msvc': 4.30.1 fsevents: 2.3.3 run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - safe-array-concat@1.1.2: + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-push-apply@1.0.0: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 + es-errors: 1.3.0 isarray: 2.0.5 - safe-regex-test@1.0.3: + safe-regex-test@1.1.0: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-regex: 1.1.4 + is-regex: 1.2.1 scheduler@0.23.2: dependencies: @@ -3505,8 +3591,8 @@ snapshots: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 + get-intrinsic: 1.2.7 + gopd: 1.2.0 has-property-descriptors: 1.0.2 set-function-name@2.0.2: @@ -3516,63 +3602,95 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} - side-channel@1.0.6: + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + + side-channel-weakmap@1.0.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.2 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 slash@3.0.0: {} - source-map-js@1.2.0: {} + source-map-js@1.2.1: {} source-map@0.5.7: {} - string.prototype.matchall@4.0.11: + string.prototype.matchall@4.0.12: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 es-errors: 1.3.0 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - regexp.prototype.flags: 1.5.2 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 set-function-name: 2.0.2 - side-channel: 1.0.6 + side-channel: 1.1.0 string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.23.9 - string.prototype.trim@1.2.9: + string.prototype.trim@1.2.10: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 - string.prototype.trimend@1.0.8: + string.prototype.trimend@1.0.9: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 string.prototype.trimstart@1.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 strip-ansi@6.0.1: dependencies: @@ -3582,10 +3700,6 @@ snapshots: stylis@4.2.0: {} - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -3594,129 +3708,130 @@ snapshots: text-table@0.2.0: {} - to-fast-properties@2.0.0: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - ts-api-utils@1.3.0(typescript@5.5.4): + ts-api-utils@1.4.3(typescript@5.7.3): dependencies: - typescript: 5.5.4 + typescript: 5.7.3 type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - typed-array-buffer@1.0.2: + typed-array-buffer@1.0.3: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.3 es-errors: 1.3.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 - typed-array-byte-length@1.0.1: + typed-array-byte-length@1.0.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 - typed-array-byte-offset@1.0.2: + typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 - typed-array-length@1.0.6: + typed-array-length@1.0.7: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 + gopd: 1.2.0 + is-typed-array: 1.1.15 possible-typed-array-names: 1.0.0 + reflect.getprototypeof: 1.0.10 - typescript-eslint@7.18.0(eslint@9.6.0)(typescript@5.5.4): + typescript-eslint@7.18.0(eslint@9.6.0)(typescript@5.7.3): dependencies: - '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.6.0)(typescript@5.5.4))(eslint@9.6.0)(typescript@5.5.4) - '@typescript-eslint/parser': 7.18.0(eslint@9.6.0)(typescript@5.5.4) - '@typescript-eslint/utils': 7.18.0(eslint@9.6.0)(typescript@5.5.4) + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.6.0)(typescript@5.7.3))(eslint@9.6.0)(typescript@5.7.3) + '@typescript-eslint/parser': 7.18.0(eslint@9.6.0)(typescript@5.7.3) + '@typescript-eslint/utils': 7.18.0(eslint@9.6.0)(typescript@5.7.3) eslint: 9.6.0 optionalDependencies: - typescript: 5.5.4 + typescript: 5.7.3 transitivePeerDependencies: - supports-color - typescript@5.5.4: {} + typescript@5.7.3: {} - unbox-primitive@1.0.2: + unbox-primitive@1.1.0: dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 + call-bound: 1.0.3 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 - undici-types@5.26.5: {} + undici-types@6.19.8: {} - update-browserslist-db@1.1.0(browserslist@4.23.3): + update-browserslist-db@1.1.2(browserslist@4.24.4): dependencies: - browserslist: 4.23.3 - escalade: 3.1.2 - picocolors: 1.0.1 + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 uri-js@4.4.1: dependencies: punycode: 2.3.1 - vite@5.3.5(@types/node@20.14.14): + vite@5.4.11(@types/node@20.17.13): dependencies: esbuild: 0.21.5 - postcss: 8.4.40 - rollup: 4.20.0 + postcss: 8.5.1 + rollup: 4.30.1 optionalDependencies: - '@types/node': 20.14.14 + '@types/node': 20.17.13 fsevents: 2.3.3 - which-boxed-primitive@1.0.2: + which-boxed-primitive@1.1.1: dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 + is-bigint: 1.1.0 + is-boolean-object: 1.2.1 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 - which-builtin-type@1.1.4: + which-builtin-type@1.2.1: dependencies: - function.prototype.name: 1.1.6 + call-bound: 1.0.3 + function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 - is-async-function: 2.0.0 - is-date-object: 1.0.5 - is-finalizationregistry: 1.0.2 - is-generator-function: 1.0.10 - is-regex: 1.1.4 - is-weakref: 1.0.2 + is-async-function: 2.1.0 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.0 isarray: 2.0.5 - which-boxed-primitive: 1.0.2 + which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.15 + which-typed-array: 1.1.18 which-collection@1.0.2: dependencies: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 - is-weakset: 2.0.3 + is-weakset: 2.0.4 - which-typed-array@1.1.15: + which-typed-array@1.1.18: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 for-each: 0.3.3 - gopd: 1.0.1 + gopd: 1.2.0 has-tostringtag: 1.0.2 which@2.0.2: From d68745ba6914372b39c54c9e12bf5c15dd926c23 Mon Sep 17 00:00:00 2001 From: Tim Kuhlmann Date: Thu, 16 Jan 2025 15:53:01 +0100 Subject: [PATCH 7/7] evaluate environment variables (#758) Allow passing server configuration via environment. --- Assets/SEE/Net/Network.cs | 107 +++++++++++++++++++++++++++++--------- Server/Gameserver/run.sh | 5 +- 2 files changed, 82 insertions(+), 30 deletions(-) diff --git a/Assets/SEE/Net/Network.cs b/Assets/SEE/Net/Network.cs index 8830019903..ab08b8af5d 100644 --- a/Assets/SEE/Net/Network.cs +++ b/Assets/SEE/Net/Network.cs @@ -275,27 +275,42 @@ private void Awake() } /// - /// Name of command-line argument for room password . + /// Name of the command-line argument containing the room password (). /// - private const string passwordArgument = "--password"; - + private const string passwordArgumentName = "--password"; + /// + /// Name of the environment variable containing the room password (). + /// + private const string passwordVariableName = "SEE_SERVER_PASSWORD"; + /// + /// Name of the command-line argument containing the UDP port (). + /// + private const string portArgumentName = "--port"; + /// + /// Name of the environment variable containing the UDP port (). + /// + private const string portVariableName = "SEE_SERVER_PORT"; + /// + /// Name of the command-line argument containing the backend domain URL (). + /// + private const string domainArgumentName = "--host"; /// - /// Name of command-line argument for UDP port . + /// Name of the environment variable containing the backend domain URL (). /// - private const string portArgument = "--port"; + private const string domainVariableName = "SEE_BACKEND_DOMAIN"; /// - /// Name of command-line argument for backend domain URL . + /// Name of the command-line argument containing the the server id (). /// - private const string domainArgument = "--host"; + private const string serverIdArgumentName = "--id"; /// - /// Name of command-line argument for the server id . + /// Name of the environment variable containing the the server id (). /// - private const string serverIdArgument = "--id"; + private const string serverIdVariableName = "SEE_SERVER_ID"; /// - /// Name of command-line argument for launching this Unity instance + /// Name of the command-line argument for launching this Unity instance /// as a dedicated server. /// - private const string launchAsServerArgument = "--launch-as-server"; + private const string launchAsServerArgumentName = "--launch-as-server"; /// /// Makes sure that we have only one and checks @@ -315,6 +330,7 @@ private void Start() NetworkManager.Singleton.OnServerStarted += OnServerStarted; NetworkManager.Singleton.NetworkConfig.ConnectionApproval = true; + CollectEnvironmentVariables(); #if UNITY_EDITOR Debug.Log("Skipping parsing command-line parameters in Editor mode.\n"); #else @@ -322,11 +338,50 @@ private void Start() #endif } + /// + /// Processes and determines the values of the environment variables + /// , , , + /// . + /// + private void CollectEnvironmentVariables() + { + string serverPort = Environment.GetEnvironmentVariable(portVariableName); + if (!string.IsNullOrWhiteSpace(serverPort)) + { + try + { + ServerPort = Int32.Parse(serverPort); + } + catch (FormatException _) + { + Debug.LogWarning($"Server port passed via {portVariableName} environment variable is not a valid number."); + } + } + + string roomPassword = Environment.GetEnvironmentVariable(passwordVariableName); + if (!string.IsNullOrWhiteSpace(roomPassword)) + { + RoomPassword = roomPassword; + } + + string backendDomain = Environment.GetEnvironmentVariable(domainVariableName); + if (!string.IsNullOrWhiteSpace(backendDomain)) + { + BackendDomain = backendDomain; + } + + string serverId = Environment.GetEnvironmentVariable(serverIdVariableName); + if (!string.IsNullOrWhiteSpace(serverId)) + { + ServerId = serverId; + } + } + /// /// Processes and determines the values of the command-line arguments /// , , , /// , and starts the server if the command-line argument - /// is present. + /// is present. /// /// thrown if an option requiring a value does /// not have one @@ -346,32 +401,32 @@ private void ProcessCommandLineArguments() { switch (arguments[i]) { - case portArgument: - Debug.Log($"Found {portArgument} as parameter {i}.\n"); - CheckArgumentValue(arguments, i, portArgument); + case portArgumentName: + Debug.Log($"Found {portArgumentName} as parameter {i}.\n"); + CheckArgumentValue(arguments, i, portArgumentName); ServerPort = Int32.Parse(arguments[i + 1]); i++; // skip one parameter break; - case passwordArgument: - Debug.Log($"Found {passwordArgument} as parameter {i}.\n"); - CheckArgumentValue(arguments, i, passwordArgument); + case passwordArgumentName: + Debug.Log($"Found {passwordArgumentName} as parameter {i}.\n"); + CheckArgumentValue(arguments, i, passwordArgumentName); RoomPassword = arguments[i + 1]; i++; // skip one parameter break; - case domainArgument: - Debug.Log($"Found {domainArgument} as parameter {i}.\n"); - CheckArgumentValue(arguments, i, domainArgument); + case domainArgumentName: + Debug.Log($"Found {domainArgumentName} as parameter {i}.\n"); + CheckArgumentValue(arguments, i, domainArgumentName); BackendDomain = arguments[i + 1]; i++; // skip one parameter break; - case serverIdArgument: - Debug.Log($"Found {serverIdArgument} as parameter {i}.\n"); - CheckArgumentValue(arguments, i, serverIdArgument); + case serverIdArgumentName: + Debug.Log($"Found {serverIdArgumentName} as parameter {i}.\n"); + CheckArgumentValue(arguments, i, serverIdArgumentName); ServerId = arguments[i + 1]; i++; // skip one parameter break; - case launchAsServerArgument: - Debug.Log($"Found {launchAsServerArgument} as parameter {i}.\n"); + case launchAsServerArgumentName: + Debug.Log($"Found {launchAsServerArgumentName} as parameter {i}.\n"); // This argument does not have a value. It works as a flag. launchAsServer = true; break; diff --git a/Server/Gameserver/run.sh b/Server/Gameserver/run.sh index ef42193854..4f8f18cb6e 100644 --- a/Server/Gameserver/run.sh +++ b/Server/Gameserver/run.sh @@ -3,7 +3,4 @@ set -e /app/server.x86_64 \ --launch-as-server \ - --port 7777 \ - --host "$SEE_BACKEND_DOMAIN" \ - --id "$SEE_SERVER_ID" \ - --password "$SEE_SERVER_PASSWORD" + --port 7777