From b342cafde7d93555f3d559f5a968fff2839a3d66 Mon Sep 17 00:00:00 2001
From: notohh <github@notohh.dev>
Date: Thu, 1 Feb 2024 13:26:18 -0500
Subject: [PATCH 1/3] yazi: use stylua

---
 home/yazi/init.lua | 256 +++++++++++++++++++++++++--------------------
 1 file changed, 140 insertions(+), 116 deletions(-)

diff --git a/home/yazi/init.lua b/home/yazi/init.lua
index b6e3f49..ec402ca 100644
--- a/home/yazi/init.lua
+++ b/home/yazi/init.lua
@@ -1,159 +1,183 @@
 function Manager:render(area)
-    self.area = area
+	self.area = area
 
-    local chunks = ui.Layout():direction(ui.Layout.HORIZONTAL):constraints({
-        ui.Constraint.Ratio(MANAGER.ratio.parent, MANAGER.ratio.all),
-        ui.Constraint.Ratio(MANAGER.ratio.current, MANAGER.ratio.all),
-        ui.Constraint.Ratio(MANAGER.ratio.preview, MANAGER.ratio.all)
-    }):split(area)
+	local chunks = ui.Layout()
+		:direction(ui.Layout.HORIZONTAL)
+		:constraints({
+			ui.Constraint.Ratio(MANAGER.ratio.parent, MANAGER.ratio.all),
+			ui.Constraint.Ratio(MANAGER.ratio.current, MANAGER.ratio.all),
+			ui.Constraint.Ratio(MANAGER.ratio.preview, MANAGER.ratio.all),
+		})
+		:split(area)
 
-    local bar = function(c, x, y)
-        return ui.Bar(ui.Rect {
-            x = math.max(0, x),
-            y = math.max(0, y),
-            w = math.min(1, area.w),
-            h = math.min(1, area.h)
-        }, ui.Bar.TOP):symbol(c)
-    end
+	local bar = function(c, x, y)
+		return ui.Bar(
+			ui.Rect({
+				x = math.max(0, x),
+				y = math.max(0, y),
+				w = math.min(1, area.w),
+				h = math.min(1, area.h),
+			}),
+			ui.Bar.TOP
+		):symbol(c)
+	end
 
-    return ya.flat {
-        -- Borders
-        ui.Border(area, ui.Border.ALL):type(ui.Border.ROUNDED),
-        ui.Bar(chunks[1], ui.Bar.RIGHT), ui.Bar(chunks[3], ui.Bar.LEFT),
+	return ya.flat({
+		-- Borders
+		ui.Border(area, ui.Border.ALL):type(ui.Border.ROUNDED),
+		ui.Bar(chunks[1], ui.Bar.RIGHT),
+		ui.Bar(chunks[3], ui.Bar.LEFT),
 
-        bar("┬", chunks[1].right - 1, chunks[1].y),
-        bar("┴", chunks[1].right - 1, chunks[1].bottom - 1),
-        bar("┬", chunks[2].right, chunks[2].y),
-        bar("┴", chunks[2].right, chunks[1].bottom - 1), -- Parent
-        Parent:render(chunks[1]:padding(ui.Padding.xy(1))), -- Current
-        Current:render(chunks[2]:padding(ui.Padding.y(1))), -- Preview
-        Preview:render(chunks[3]:padding(ui.Padding.xy(1)))
-    }
+		bar("┬", chunks[1].right - 1, chunks[1].y),
+		bar("┴", chunks[1].right - 1, chunks[1].bottom - 1),
+		bar("┬", chunks[2].right, chunks[2].y),
+		bar("┴", chunks[2].right, chunks[1].bottom - 1), -- Parent
+		Parent:render(chunks[1]:padding(ui.Padding.xy(1))), -- Current
+		Current:render(chunks[2]:padding(ui.Padding.y(1))), -- Preview
+		Preview:render(chunks[3]:padding(ui.Padding.xy(1))),
+	})
 end
 
-Status = {area = ui.Rect.default}
+Status = { area = ui.Rect.default }
 
 function Status.style()
-    if cx.active.mode.is_select then
-        return THEME.status.mode_select
-    elseif cx.active.mode.is_unset then
-        return THEME.status.mode_unset
-    else
-        return THEME.status.mode_normal
-    end
+	if cx.active.mode.is_select then
+		return THEME.status.mode_select
+	elseif cx.active.mode.is_unset then
+		return THEME.status.mode_unset
+	else
+		return THEME.status.mode_normal
+	end
 end
 
 function Status:mode()
-    local mode = tostring(cx.active.mode):upper()
-    if mode == "UNSET" then mode = "UN-SET" end
+	local mode = tostring(cx.active.mode):upper()
+	if mode == "UNSET" then
+		mode = "UN-SET"
+	end
 
-    local style = self.style()
-    return ui.Line {
-        ui.Span(THEME.status.separator_open):fg(style.bg),
-        ui.Span(" " .. mode .. " "):style(style)
-    }
+	local style = self.style()
+	return ui.Line({
+		ui.Span(THEME.status.separator_open):fg(style.bg),
+		ui.Span(" " .. mode .. " "):style(style),
+	})
 end
 
 function Status:size()
-    local h = cx.active.current.hovered
-    if h == nil then return ui.Line {} end
+	local h = cx.active.current.hovered
+	if h == nil then
+		return ui.Line({})
+	end
 
-    local style = self.style()
-    return ui.Line {
-        ui.Span(" " .. ya.readable_size(h:size() or h.cha.length) .. " "):fg(
-            style.bg):bg(THEME.status.separator_style.bg),
-        ui.Span(THEME.status.separator_close):fg(THEME.status.separator_style.fg)
-    }
+	local style = self.style()
+	return ui.Line({
+		ui.Span(" " .. ya.readable_size(h:size() or h.cha.length) .. " ")
+			:fg(style.bg)
+			:bg(THEME.status.separator_style.bg),
+		ui.Span(THEME.status.separator_close):fg(THEME.status.separator_style.fg),
+	})
 end
 
 function Status:name()
-    local h = cx.active.current.hovered
-    if h == nil then return ui.Span("") end
-    local linked = ""
-    if h.link_to ~= nil then linked = " -> " .. tostring(h.link_to) end
-    return ui.Span(" " .. h.name .. linked)
+	local h = cx.active.current.hovered
+	if h == nil then
+		return ui.Span("")
+	end
+	local linked = ""
+	if h.link_to ~= nil then
+		linked = " -> " .. tostring(h.link_to)
+	end
+	return ui.Span(" " .. h.name .. linked)
 end
 
 function Status:permissions()
-    local h = cx.active.current.hovered
-    if h == nil then return ui.Line {} end
+	local h = cx.active.current.hovered
+	if h == nil then
+		return ui.Line({})
+	end
 
-    local perm = h.cha:permissions()
-    if perm == nil then return ui.Line {} end
+	local perm = h.cha:permissions()
+	if perm == nil then
+		return ui.Line({})
+	end
 
-    local spans = {}
-    for i = 1, #perm do
-        local c = perm:sub(i, i)
-        local style = THEME.status.permissions_t
-        if c == "-" then
-            style = THEME.status.permissions_s
-        elseif c == "r" then
-            style = THEME.status.permissions_r
-        elseif c == "w" then
-            style = THEME.status.permissions_w
-        elseif c == "x" or c == "s" or c == "S" or c == "t" or c == "T" then
-            style = THEME.status.permissions_x
-        end
-        spans[i] = ui.Span(c):style(style)
-    end
-    return ui.Line(spans)
+	local spans = {}
+	for i = 1, #perm do
+		local c = perm:sub(i, i)
+		local style = THEME.status.permissions_t
+		if c == "-" then
+			style = THEME.status.permissions_s
+		elseif c == "r" then
+			style = THEME.status.permissions_r
+		elseif c == "w" then
+			style = THEME.status.permissions_w
+		elseif c == "x" or c == "s" or c == "S" or c == "t" or c == "T" then
+			style = THEME.status.permissions_x
+		end
+		spans[i] = ui.Span(c):style(style)
+	end
+	return ui.Line(spans)
 end
 
 function Status:percentage()
-    local percent = 0
-    local cursor = cx.active.current.cursor
-    local length = #cx.active.current.files
-    if cursor ~= 0 and length ~= 0 then
-        percent = math.floor((cursor + 1) * 100 / length)
-    end
+	local percent = 0
+	local cursor = cx.active.current.cursor
+	local length = #cx.active.current.files
+	if cursor ~= 0 and length ~= 0 then
+		percent = math.floor((cursor + 1) * 100 / length)
+	end
 
-    if percent == 0 then
-        percent = "  Top "
-    else
-        percent = string.format(" %3d%% ", percent)
-    end
+	if percent == 0 then
+		percent = "  Top "
+	else
+		percent = string.format(" %3d%% ", percent)
+	end
 
-    local style = self.style()
-    return ui.Line {
-        ui.Span(" " .. THEME.status.separator_open):fg(THEME.status
-                                                           .separator_style.fg),
-        ui.Span(percent):fg(style.bg):bg(THEME.status.separator_style.bg)
-    }
+	local style = self.style()
+	return ui.Line({
+		ui.Span(" " .. THEME.status.separator_open):fg(THEME.status.separator_style.fg),
+		ui.Span(percent):fg(style.bg):bg(THEME.status.separator_style.bg),
+	})
 end
 
 function Status:position()
-    local cursor = cx.active.current.cursor
-    local length = #cx.active.current.files
+	local cursor = cx.active.current.cursor
+	local length = #cx.active.current.files
 
-    local style = self.style()
-    return ui.Line {
-        ui.Span(string.format(" %2d/%-2d ", cursor + 1, length)):style(style),
-        ui.Span(THEME.status.separator_close):fg(style.bg)
-    }
+	local style = self.style()
+	return ui.Line({
+		ui.Span(string.format(" %2d/%-2d ", cursor + 1, length)):style(style),
+		ui.Span(THEME.status.separator_close):fg(style.bg),
+	})
 end
 
 function Status:render(area)
-    self.area = area
+	self.area = area
 
-    local left = ui.Line {self:mode(), self:size(), self:name()}
-    local right = ui.Line {
-        self:owner(), self:permissions(), self:percentage(), self:position()
-    }
-    return {
-        ui.Paragraph(area, {left}),
-        ui.Paragraph(area, {right}):align(ui.Paragraph.RIGHT),
-        table.unpack(Progress:render(area, right:width()))
-    }
+	local left = ui.Line({ self:mode(), self:size(), self:name() })
+	local right = ui.Line({
+		self:owner(),
+		self:permissions(),
+		self:percentage(),
+		self:position(),
+	})
+	return {
+		ui.Paragraph(area, { left }),
+		ui.Paragraph(area, { right }):align(ui.Paragraph.RIGHT),
+		table.unpack(Progress:render(area, right:width())),
+	}
 end
 
 function Status:owner()
-    local h = cx.active.current.hovered
-    if h == nil or ya.target_family() ~= "unix" then return ui.Line {} end
+	local h = cx.active.current.hovered
+	if h == nil or ya.target_family() ~= "unix" then
+		return ui.Line({})
+	end
 
-    return ui.Line {
-        ui.Span(ya.user_name(h.cha.uid) or tostring(h.cha.uid)):fg("magenta"),
-        ui.Span(":"),
-        ui.Span(ya.group_name(h.cha.gid) or tostring(h.cha.gid)):fg("magenta"),
-        ui.Span(" ")
-    }
+	return ui.Line({
+		ui.Span(ya.user_name(h.cha.uid) or tostring(h.cha.uid)):fg("magenta"),
+		ui.Span(":"),
+		ui.Span(ya.group_name(h.cha.gid) or tostring(h.cha.gid)):fg("magenta"),
+		ui.Span(" "),
+	})
 end
-- 
2.49.0


From 159346814bd18497daa38ce45b04a7d5d7b6b003 Mon Sep 17 00:00:00 2001
From: notohh <github@notohh.dev>
Date: Thu, 1 Feb 2024 13:26:32 -0500
Subject: [PATCH 2/3] wezterm: use stylua

---
 home/wezterm/config.lua | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/home/wezterm/config.lua b/home/wezterm/config.lua
index ceccae1..2f609b5 100644
--- a/home/wezterm/config.lua
+++ b/home/wezterm/config.lua
@@ -1,21 +1,21 @@
-local wezterm = require('wezterm')
+local wezterm = require("wezterm")
 
 local config = {
 
-    front_end = "WebGpu",
-    webgpu_preferred_adapter = {
-        backend = "Vulkan",
-        device_type = "DiscreteGpu",
-        name = "NVIDIA GeForce GTX 1070 Ti"
-    },
-    enable_wayland = false,
-    font = wezterm.font 'Monaspace Krypton',
-    font_size = 12.0,
-    window_background_opacity = 0.6,
-    text_background_opacity = 1.0,
-    enable_tab_bar = false,
-    color_scheme = 'tokyonight',
-    window_padding = {top = 20, bottom = 20, left = 20, right = 20}
+	front_end = "WebGpu",
+	webgpu_preferred_adapter = {
+		backend = "Vulkan",
+		device_type = "DiscreteGpu",
+		name = "NVIDIA GeForce GTX 1070 Ti",
+	},
+	enable_wayland = false,
+	font = wezterm.font("Monaspace Krypton"),
+	font_size = 12.0,
+	window_background_opacity = 0.6,
+	text_background_opacity = 1.0,
+	enable_tab_bar = false,
+	color_scheme = "tokyonight",
+	window_padding = { top = 20, bottom = 20, left = 20, right = 20 },
 }
 
 return config
-- 
2.49.0


From 83f4b12cfe60feddddf0f0cf786d2bea4056e83d Mon Sep 17 00:00:00 2001
From: notohh <github@notohh.dev>
Date: Thu, 1 Feb 2024 15:48:47 -0500
Subject: [PATCH 3/3] treewide: refactor w/ deadnix && statix applied

---
 .gitignore                                 |    1 +
 .woodpecker/checks.yml                     |   17 -
 .woodpecker/deploy.yml                     |   29 +-
 README.md                                  |    1 +
 flake.lock                                 |  131 ++-
 flake.nix                                  |   27 +-
 home/README.md                             |    1 +
 home/ags/config/.eslintrc.js               |   26 +
 home/ags/config/config.js                  |   15 +-
 home/ags/config/import.js                  |    6 +-
 home/ags/config/js/main.js                 |   58 +-
 home/ags/config/js/widgets/hyprland.js     |   27 +-
 home/ags/config/js/widgets/images/image.js |   14 +-
 home/ags/config/js/widgets/music.js        |   29 +-
 home/ags/config/js/widgets/time.js         |   24 +-
 home/ags/config/jsconfig.json              |   15 +
 home/ags/config/package-lock.json          | 1135 ++++++++++++++++++++
 home/ags/config/package.json               |   15 +
 home/default.nix                           |   55 +-
 home/direnv/default.nix                    |    7 -
 home/git/default.nix                       |   21 -
 home/helix/languages.nix                   |    2 +-
 home/helix/themes/catppuccin_mocha.nix     |    1 -
 home/helix/themes/tokyonight.nix           |    4 -
 home/nushell/config.nu                     |    3 -
 home/wayland/default.nix                   |   83 +-
 home/wayland/hyprland/config/general.nix   |    2 +-
 home/zellij/default.nix                    |    2 +-
 hosts/ame/default.nix                      |   36 +-
 hosts/ame/hardware.nix                     |   46 +-
 hosts/ame/home.nix                         |    8 +-
 hosts/ame/services/restic.nix              |    8 +-
 hosts/arashi/default.nix                   |   13 -
 hosts/arashi/hardware.nix                  |   34 +-
 hosts/arashi/services/restic.nix           |    4 +-
 hosts/haru/default.nix                     |    9 -
 hosts/haru/hardware.nix                    |   26 +-
 hosts/kariru/default.nix                   |    9 -
 hosts/kariru/hardware.nix                  |   51 +-
 hosts/kariru/services/default.nix          |   58 +-
 hosts/kariru/services/restic.nix           |    4 +-
 hosts/kaze/default.nix                     |    9 -
 hosts/kaze/hardware.nix                    |   33 +-
 hosts/kaze/services/minio.nix              |    4 +-
 hosts/kaze/services/tailscale.nix          |    4 +-
 hosts/sakura/default.nix                   |    9 -
 hosts/sakura/hardware.nix                  |   42 +-
 hosts/sakura/services/restic.nix           |    4 +-
 hosts/sakura/services/rustypaste.nix       |    5 +-
 hosts/sakura/services/tailscale.nix        |    4 +-
 hosts/sora/default.nix                     |    3 +-
 hosts/sora/hardware.nix                    |   35 +-
 hosts/sora/services/foundryvtt.nix         |   10 +-
 hosts/sora/services/glances.nix            |    8 +-
 hosts/sora/services/minecraft.nix          |    4 +-
 hosts/sora/services/restic.nix             |    8 +-
 hosts/sora/services/tailscale.nix          |    4 +-
 hosts/sora/services/terraria.nix           |    2 +-
 hosts/tsuki/default.nix                    |   72 +-
 hosts/tsuki/hardware.nix                   |   64 +-
 hosts/tsuki/home.nix                       |    2 -
 hosts/tsuki/services/atticd.nix            |    4 +-
 hosts/tsuki/services/default.nix           |    2 +-
 hosts/tsuki/services/hydroxide.nix         |    4 +-
 hosts/tsuru/default.nix                    |    9 -
 hosts/tsuru/hardware.nix                   |   26 +-
 hosts/tsuru/services/tailscale.nix         |    4 +-
 hosts/tsuru/services/woodpecker.nix        |    4 +-
 hosts/yuki/hardware.nix                    |   60 +-
 hosts/yuki/services/restic.nix             |    4 +-
 hosts/yuki/services/stash.nix              |    6 +-
 hosts/yuki/services/wallos.nix             |    8 +-
 statix.toml                                |    3 +
 73 files changed, 1893 insertions(+), 624 deletions(-)
 delete mode 100644 .woodpecker/checks.yml
 create mode 100644 home/ags/config/.eslintrc.js
 create mode 100644 home/ags/config/jsconfig.json
 create mode 100644 home/ags/config/package-lock.json
 create mode 100644 home/ags/config/package.json
 delete mode 100644 home/direnv/default.nix
 delete mode 100644 home/git/default.nix
 create mode 100644 statix.toml

diff --git a/.gitignore b/.gitignore
index b2be92b..58399cb 100755
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
 result
+.pre-commit-config.yaml
diff --git a/.woodpecker/checks.yml b/.woodpecker/checks.yml
deleted file mode 100644
index 34d0c7d..0000000
--- a/.woodpecker/checks.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-when:
-  - event: [push]
-  - branch: master
-  - path:
-      include: ['**.nix']
-      exclude: ['**.md', 'docs/**', '.woodpecker/*.yaml', '**.js', '**.lua', '**.scss', '**.nu']
-steps:
-  check:
-    image: nixos/nix
-    commands:
-      - echo 'experimental-features = flakes nix-command' >> /etc/nix/nix.conf
-      - nix flake check
-  fmt:
-    image: nixos/nix
-    commands:
-      - echo 'experimental-features = flakes nix-command' >> /etc/nix/nix.conf
-      - nix run nixpkgs#alejandra -- -c .
diff --git a/.woodpecker/deploy.yml b/.woodpecker/deploy.yml
index c41f915..9358f46 100644
--- a/.woodpecker/deploy.yml
+++ b/.woodpecker/deploy.yml
@@ -1,27 +1,18 @@
 when:
   - branch: flake-lock-update
   - event: [pull_request_closed]
-  
+
 steps:
-  attic-push:
-    image: git.vdx.hu/voidcontext/woodpecker-plugin-nix-attic
-    settings:
-      binary_cache: https://cache.flake.sh/
-      binary_cache_public_key: kyasshu:g1heIgCgG7M4San6nRsz/omcVQ1GTc7+zKKm3L9Co7o=
-      binary_cache_token:
-        from_secret: kyasshu_access_token
-      script: |
-       attic login kyasshu $PLUGIN_BINARY_CACHE_TOKEN
   deploy:
     image: nixos/nix
     commands: |
-       echo 'experimental-features = flakes nix-command' >> /etc/nix/nix.conf
-       echo "access-tokens = github.com=$${GH_PAT}" >> /etc/nix/nix.conf
-       echo 'builders-use-substitutes = true' >> /etc/nix/nix.conf
-       echo 'substituters = https://cache.flake.sh/kyasshu https://hyprland.cachix.org https://cache.nixos.org https://nix-gaming.cachix.org https://anyrun.cachix.org https://viperml.cachix.org https://nix-community.cachix.org https://cache.nixos.org/' >> /etc/nix/nix.conf
-       echo 'trusted-public-keys = cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= kyasshu:g1heIgCgG7M4San6nRsz/omcVQ1GTc7+zKKm3L9Co7o= hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc= cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= nix-gaming.cachix.org-1:nbjlureqMbRAxR1gJ/f3hxemL9svXaZF/Ees8vCUUs4= anyrun.cachix.org-1:pqBobmOjI7nKlsUMV25u9QHa9btJK65/C8vnO3p346s= viperml.cachix.org-1:qZhKBMTfmcLL+OG6fj/hzsMEedgKvZVFRRAhq7j8Vh8= nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=' >> /etc/nix/nix.conf
-       mkdir -p .ssh && cd .ssh
-       echo "$${SSH_KEY}" > forgejo
-       chmod 400 forgejo
-       nix run github:serokell/deploy-rs -- --ssh-opts="-i forgejo -o StrictHostKeyChecking=no" --skip-checks --targets .#arashi .#kariru .#sakura .#sora .#yuki .#haru .#kaze
+      echo 'experimental-features = flakes nix-command' >> /etc/nix/nix.conf
+      echo "access-tokens = github.com=$${GH_PAT}" >> /etc/nix/nix.conf
+      echo 'builders-use-substitutes = true' >> /etc/nix/nix.conf
+      echo 'substituters = https://cache.flake.sh/kyasshu https://hyprland.cachix.org https://cache.nixos.org https://nix-gaming.cachix.org https://anyrun.cachix.org https://viperml.cachix.org https://nix-community.cachix.org https://cache.nixos.org/' >> /etc/nix/nix.conf
+      echo 'trusted-public-keys = cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= kyasshu:g1heIgCgG7M4San6nRsz/omcVQ1GTc7+zKKm3L9Co7o= hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc= cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= nix-gaming.cachix.org-1:nbjlureqMbRAxR1gJ/f3hxemL9svXaZF/Ees8vCUUs4= anyrun.cachix.org-1:pqBobmOjI7nKlsUMV25u9QHa9btJK65/C8vnO3p346s= viperml.cachix.org-1:qZhKBMTfmcLL+OG6fj/hzsMEedgKvZVFRRAhq7j8Vh8= nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=' >> /etc/nix/nix.conf
+      mkdir -p .ssh && cd .ssh
+      echo "$${SSH_KEY}" > forgejo
+      chmod 400 forgejo
+      nix run github:serokell/deploy-rs -- --ssh-opts="-i forgejo -o StrictHostKeyChecking=no" --skip-checks --targets .#arashi .#kariru .#sakura .#sora .#yuki .#haru .#kaze
     secrets: [ssh_key, gh_pat]
diff --git a/README.md b/README.md
index 8c37633..d738e66 100755
--- a/README.md
+++ b/README.md
@@ -49,6 +49,7 @@
 + multiple fully declarative self hosted services (and some containerized ones, with a docker backend)
 + wayland config for hyprland
 + custom packages not found in nixpkgs
++ linted & styled with [alejandra](https://github.com/kamadorueda/alejandra), [deadnix](https://github.com/astro/deadnix), and [statix](https://github.com/nerdypepper/statix)
 
 ## :busts_in_silhouette: Credit
 #### people who've inspired me to dive into nix, and i've stolen stuff from (you guys are awesome!)
diff --git a/flake.lock b/flake.lock
index 643d076..bc21727 100644
--- a/flake.lock
+++ b/flake.lock
@@ -157,6 +157,22 @@
         "type": "github"
       }
     },
+    "flake-compat_3": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1696426674,
+        "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
     "flake-parts": {
       "inputs": {
         "nixpkgs-lib": [
@@ -233,6 +249,24 @@
       "inputs": {
         "systems": "systems_4"
       },
+      "locked": {
+        "lastModified": 1701680307,
+        "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "4022d587cbbfd70fe950c1e2083a02621806a725",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "flake-utils_4": {
+      "inputs": {
+        "systems": "systems_5"
+      },
       "locked": {
         "lastModified": 1694529238,
         "narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
@@ -247,6 +281,27 @@
         "type": "github"
       }
     },
+    "gitignore": {
+      "inputs": {
+        "nixpkgs": [
+          "pre-commit-hooks",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1703887061,
+        "narHash": "sha256-gGPa9qWNc6eCXT/+Z5/zMkyYOuRZqeFZBDbopNZQkuY=",
+        "owner": "hercules-ci",
+        "repo": "gitignore.nix",
+        "rev": "43e1aa1308018f37118e34d3a9cb4f5e75dc11d5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "gitignore.nix",
+        "type": "github"
+      }
+    },
     "helix": {
       "inputs": {
         "crane": "crane_2",
@@ -487,6 +542,22 @@
       }
     },
     "nixpkgs-stable_2": {
+      "locked": {
+        "lastModified": 1704874635,
+        "narHash": "sha256-YWuCrtsty5vVZvu+7BchAxmcYzTMfolSPP5io8+WYCg=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "3dc440faeee9e889fe2d1b4d25ad0f430d449356",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-23.11",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs-stable_3": {
       "locked": {
         "lastModified": 1705957679,
         "narHash": "sha256-Q8LJaVZGJ9wo33wBafvZSzapYsjOaNjP/pOnSiKVGHY=",
@@ -583,6 +654,22 @@
       }
     },
     "nixpkgs_7": {
+      "locked": {
+        "lastModified": 1704842529,
+        "narHash": "sha256-OTeQA+F8d/Evad33JMfuXC89VMetQbsU4qcaePchGr4=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "eabe8d3eface69f5bb16c18f8662a702f50c20d5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixpkgs-unstable",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "nixpkgs_8": {
       "locked": {
         "lastModified": 1701174899,
         "narHash": "sha256-1W+FMe8mWsJKXoBc+QgKmEeRj33kTFnPq7XCjU+bfnA=",
@@ -613,6 +700,28 @@
         "type": "github"
       }
     },
+    "pre-commit-hooks": {
+      "inputs": {
+        "flake-compat": "flake-compat_3",
+        "flake-utils": "flake-utils_3",
+        "gitignore": "gitignore",
+        "nixpkgs": "nixpkgs_7",
+        "nixpkgs-stable": "nixpkgs-stable_2"
+      },
+      "locked": {
+        "lastModified": 1706424699,
+        "narHash": "sha256-Q3RBuOpZNH2eFA1e+IHgZLAOqDD9SKhJ/sszrL8bQD4=",
+        "owner": "cachix",
+        "repo": "pre-commit-hooks.nix",
+        "rev": "7c54e08a689b53c8a1e5d70169f2ec9e2a68ffaf",
+        "type": "github"
+      },
+      "original": {
+        "owner": "cachix",
+        "repo": "pre-commit-hooks.nix",
+        "type": "github"
+      }
+    },
     "root": {
       "inputs": {
         "ags": "ags",
@@ -628,6 +737,7 @@
         "nix-index-database": "nix-index-database",
         "nixpkgs": "nixpkgs_6",
         "nur": "nur",
+        "pre-commit-hooks": "pre-commit-hooks",
         "sops-nix": "sops-nix",
         "yazi": "yazi"
       }
@@ -687,7 +797,7 @@
         "nixpkgs": [
           "nixpkgs"
         ],
-        "nixpkgs-stable": "nixpkgs-stable_2"
+        "nixpkgs-stable": "nixpkgs-stable_3"
       },
       "locked": {
         "lastModified": 1706410821,
@@ -763,6 +873,21 @@
         "type": "github"
       }
     },
+    "systems_5": {
+      "locked": {
+        "lastModified": 1681028828,
+        "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+        "owner": "nix-systems",
+        "repo": "default",
+        "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-systems",
+        "repo": "default",
+        "type": "github"
+      }
+    },
     "utils": {
       "inputs": {
         "systems": "systems"
@@ -832,8 +957,8 @@
     },
     "yazi": {
       "inputs": {
-        "flake-utils": "flake-utils_3",
-        "nixpkgs": "nixpkgs_7",
+        "flake-utils": "flake-utils_4",
+        "nixpkgs": "nixpkgs_8",
         "rust-overlay": "rust-overlay_2"
       },
       "locked": {
diff --git a/flake.nix b/flake.nix
index f49f44a..5d32981 100755
--- a/flake.nix
+++ b/flake.nix
@@ -10,6 +10,7 @@
     nur.url = "github:nix-community/NUR";
     yazi.url = "github:sxyazi/yazi";
     helix.url = "github:helix-editor/helix";
+    pre-commit-hooks.url = "github:cachix/pre-commit-hooks.nix";
     hyprland-plugins = {
       url = "github:hyprwm/hyprland-plugins";
       inputs.hyprland.follows = "hyprland";
@@ -39,18 +40,42 @@
       inputs.nixpkgs.follows = "nixpkgs";
     };
   };
-  outputs = {nixpkgs, ...} @ inputs: let
+  outputs = {
+    self,
+    nixpkgs,
+    pre-commit-hooks,
+    ...
+  } @ inputs: let
     system = "x86_64-linux";
     pkgs = import nixpkgs {
       inherit system;
     };
   in {
+    checks = {
+      pre-commit-check = pre-commit-hooks.lib.${system}.run {
+        src = ./.;
+        hooks = {
+          stylua.enable = true;
+          eslint.enable = true;
+          statix.enable = true;
+          alejandra.enable = true;
+          deadnix = {
+            enable = true;
+            excludes = ["overlays.nix"];
+          };
+        };
+      };
+    };
     devShells.${system}.default = pkgs.mkShell {
       name = "snowflake";
+      inherit (self.checks.pre-commit-check) shellHook;
       packages = with pkgs; [
         git
         sops
         alejandra
+        statix
+        deadnix
+        stylua
         yaml-language-server
         lua-language-server
         nodePackages.typescript-language-server
diff --git a/home/README.md b/home/README.md
index c34b775..9219c94 100644
--- a/home/README.md
+++ b/home/README.md
@@ -25,3 +25,4 @@ name            | description
 `yazi`          | terminal file manager
 `zathura`       | pdf viewer
 `zellij`        | terminal multiplexer
+`zoxide`        | a smarter cd command
diff --git a/home/ags/config/.eslintrc.js b/home/ags/config/.eslintrc.js
new file mode 100644
index 0000000..bee4612
--- /dev/null
+++ b/home/ags/config/.eslintrc.js
@@ -0,0 +1,26 @@
+module.exports = {
+    "env": {
+        "browser": true,
+        "es2021": true
+    },
+    "extends": "eslint:recommended",
+    "overrides": [
+        {
+            "env": {
+                "node": true
+            },
+            "files": [
+                ".eslintrc.{js,cjs}"
+            ],
+            "parserOptions": {
+                "sourceType": "script"
+            }
+        }
+    ],
+    "parserOptions": {
+        "ecmaVersion": "latest",
+        "sourceType": "module"
+    },
+    "rules": {
+    }
+}
diff --git a/home/ags/config/config.js b/home/ags/config/config.js
index 98002c5..2376a82 100644
--- a/home/ags/config/config.js
+++ b/home/ags/config/config.js
@@ -1,9 +1,8 @@
-import { App, Utils } from './import.js';
-import { Bar } from './js/main.js'
+import { App, Utils } from "./import.js";
+import { Bar } from "./js/main.js";
 
-
-const scss = App.configDir + '/main.scss'
-const css = App.configDir + '/style.css'
+const scss = App.configDir + "/main.scss";
+const css = App.configDir + "/style.css";
 
 Utils.exec(`sass ${scss} ${css}`);
 
@@ -19,6 +18,6 @@ Utils.monitorFile(`${App.configDir}/scss`, reloadCss, "directory");
 export default {
     style: css,
     windows: [
-        Bar(2)
-    ]
-}
+        Bar(2),
+    ],
+};
\ No newline at end of file
diff --git a/home/ags/config/import.js b/home/ags/config/import.js
index e6b5813..e98e5db 100644
--- a/home/ags/config/import.js
+++ b/home/ags/config/import.js
@@ -7,17 +7,17 @@ import Audio from "resource:///com/github/Aylur/ags/service/audio.js";
 import Hyprland from "resource:///com/github/Aylur/ags/service/hyprland.js";
 import Network from "resource:///com/github/Aylur/ags/service/network.js";
 import SystemTray from "resource:///com/github/Aylur/ags/service/systemtray.js";
-import Mpris from 'resource:///com/github/Aylur/ags/service/mpris.js';
+import Mpris from "resource:///com/github/Aylur/ags/service/mpris.js";
 
 export {
   App,
   Audio,
   Hyprland,
+  Mpris,
   Network,
   Service,
   SystemTray,
   Utils,
   Variable,
   Widget,
-  Mpris,
-};
\ No newline at end of file
+};
diff --git a/home/ags/config/js/main.js b/home/ags/config/js/main.js
index 00c1656..e247c3a 100644
--- a/home/ags/config/js/main.js
+++ b/home/ags/config/js/main.js
@@ -1,40 +1,42 @@
-import { Widget } from '../import.js';
-import { Time } from './widgets/time.js'
-import { nixosLogo } from './widgets/images/image.js';
-import { Media } from './widgets/music.js';
-import { Workspaces } from './widgets/hyprland.js';
+import { Widget } from "../import.js";
+import { Time } from "./widgets/time.js";
+import { nixosLogo } from "./widgets/images/image.js";
+import { Media } from "./widgets/music.js";
+import { Workspaces } from "./widgets/hyprland.js";
 
-const Start = () => Widget.Box({
+const Start = () =>
+  Widget.Box({
     hpack: "start",
     children: [
-        nixosLogo(),
-        Workspaces(),
-    ]
-});
-const Center = () => Widget.Box({
+      nixosLogo(),
+      Workspaces(),
+    ],
+  });
+const Center = () =>
+  Widget.Box({
     children: [
-        Media(),
-    ]
-});
-const End = () => Widget.Box({
+      Media(),
+    ],
+  });
+const End = () =>
+  Widget.Box({
     hpack: "end",
     children: [
-        Time(),
-    ]
-});
+      Time(),
+    ],
+  });
 
-const Bar = (monitor) => Widget.Window({
+const Bar = (monitor) =>
+  Widget.Window({
     monitor,
     name: `bar`,
-    anchor: ['top', 'left', 'right'],
-    exclusivity: 'exclusive',
+    anchor: ["top", "left", "right"],
+    exclusivity: "exclusive",
     child: Widget.CenterBox({
-        startWidget: Start(),
-        centerWidget: Center(),
-        endWidget: End(),
+      startWidget: Start(),
+      centerWidget: Center(),
+      endWidget: End(),
     }),
-});
+  });
 
-export {
-    Bar
-}
+export { Bar };
diff --git a/home/ags/config/js/widgets/hyprland.js b/home/ags/config/js/widgets/hyprland.js
index 930db18..9591fcf 100644
--- a/home/ags/config/js/widgets/hyprland.js
+++ b/home/ags/config/js/widgets/hyprland.js
@@ -1,17 +1,18 @@
 import { Hyprland, Widget } from "../../import.js";
 
-const Workspaces = () => Widget.Box({
-    class_name: 'workspaces',
-    children: Hyprland.bind('workspaces').transform(ws => {
-        return ws.map(({ id }) => Widget.Button({
-            on_clicked: () => Hyprland.sendMessage(`dispatch workspace ${id}`),
-            child: Widget.Label(`${id}`),
-            class_name: Hyprland.active.workspace.bind('id')
-                .transform(i => `${i === id ? 'focused' : ''}`),
-        }));
+const Workspaces = () =>
+  Widget.Box({
+    class_name: "workspaces",
+    children: Hyprland.bind("workspaces").transform((ws) => {
+      return ws.map(({ id }) =>
+        Widget.Button({
+          on_clicked: () => Hyprland.sendMessage(`dispatch workspace ${id}`),
+          child: Widget.Label(`${id}`),
+          class_name: Hyprland.active.workspace.bind("id")
+            .transform((i) => `${i === id ? "focused" : ""}`),
+        })
+      );
     }),
-});
+  });
 
-export {
-    Workspaces
-}
\ No newline at end of file
+export { Workspaces };
diff --git a/home/ags/config/js/widgets/images/image.js b/home/ags/config/js/widgets/images/image.js
index bf3635a..4bde732 100644
--- a/home/ags/config/js/widgets/images/image.js
+++ b/home/ags/config/js/widgets/images/image.js
@@ -1,9 +1,9 @@
-import { Widget } from '../../../import.js';
+import { Widget } from "../../../import.js";
 
-const nixosLogo = () => Widget.Icon({
-    icon: '/home/notoh/snowflake/home/ags/config/js/widgets/images/static/nixos.png'
-});
+const nixosLogo = () =>
+  Widget.Icon({
+    icon:
+      "/home/notoh/snowflake/home/ags/config/js/widgets/images/static/nixos.png",
+  });
 
-export {
-    nixosLogo
-}
\ No newline at end of file
+export { nixosLogo };
diff --git a/home/ags/config/js/widgets/music.js b/home/ags/config/js/widgets/music.js
index 72ba717..135f138 100644
--- a/home/ags/config/js/widgets/music.js
+++ b/home/ags/config/js/widgets/music.js
@@ -1,17 +1,16 @@
-import { Widget, Mpris } from "../../import.js";
+import { Mpris, Widget } from "../../import.js";
 
-const Media = () => Widget.Box({
-    class_name: 'media',
-    child: Widget.Label('-').hook(Mpris, self => {
-        if (Mpris.players[0]) {
-            const { track_artists, track_title } = Mpris.players[0];
-            self.label = `${track_artists.join(', ')} - ${track_title}`;
-        } else {
-            self.label = 'Nothing is playing';
-        }
-    }, 'player-changed'),
-});
+const Media = () =>
+  Widget.Box({
+    class_name: "media",
+    child: Widget.Label("-").hook(Mpris, (self) => {
+      if (Mpris.players[0]) {
+        const { track_artists, track_title } = Mpris.players[0];
+        self.label = `${track_artists.join(", ")} - ${track_title}`;
+      } else {
+        self.label = "Nothing is playing";
+      }
+    }, "player-changed"),
+  });
 
-export {
-    Media
-}
\ No newline at end of file
+export { Media };
diff --git a/home/ags/config/js/widgets/time.js b/home/ags/config/js/widgets/time.js
index e2e7f27..3103c17 100644
--- a/home/ags/config/js/widgets/time.js
+++ b/home/ags/config/js/widgets/time.js
@@ -1,18 +1,16 @@
-import { Widget, Utils } from '../../import.js';
+import { Utils, Widget } from "../../import.js";
 
-
-const Time = () => Widget.Box({
+const Time = () =>
+  Widget.Box({
     child: Widget.Label({
-        className: "date"
+      className: "date",
     }).poll(
-        1000,
-        (self) =>
-            Utils.execAsync(["date", "+%a %b %d  %H:%M"]).then((time) =>
-                self.label = time
-            ),
+      1000,
+      (self) =>
+        Utils.execAsync(["date", "+%a %b %d  %H:%M"]).then((time) =>
+          self.label = time
+        ),
     ),
-});
+  });
 
-export {
-    Time
-}
\ No newline at end of file
+export { Time };
\ No newline at end of file
diff --git a/home/ags/config/jsconfig.json b/home/ags/config/jsconfig.json
new file mode 100644
index 0000000..961a4a5
--- /dev/null
+++ b/home/ags/config/jsconfig.json
@@ -0,0 +1,15 @@
+{
+    "compilerOptions": {
+        "module": "ESNext",
+        "moduleResolution": "Node",
+        "target": "ES2020",
+        "jsx": "react",
+        "allowImportingTsExtensions": true,
+        "strictNullChecks": true,
+        "strictFunctionTypes": true
+    },
+    "exclude": [
+        "node_modules",
+        "**/node_modules/*"
+    ]
+}
\ No newline at end of file
diff --git a/home/ags/config/package-lock.json b/home/ags/config/package-lock.json
new file mode 100644
index 0000000..5fab6d4
--- /dev/null
+++ b/home/ags/config/package-lock.json
@@ -0,0 +1,1135 @@
+{
+  "name": "snowflake-ags",
+  "version": "1.0.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "snowflake-ags",
+      "version": "1.0.0",
+      "license": "MIT",
+      "devDependencies": {
+        "eslint": "^8.56.0"
+      }
+    },
+    "node_modules/@aashutoshrathi/word-wrap": {
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+      "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/@eslint-community/eslint-utils": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+      "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+      "dev": true,
+      "dependencies": {
+        "eslint-visitor-keys": "^3.3.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "peerDependencies": {
+        "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+      }
+    },
+    "node_modules/@eslint-community/regexpp": {
+      "version": "4.10.0",
+      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
+      "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
+      "dev": true,
+      "engines": {
+        "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+      }
+    },
+    "node_modules/@eslint/eslintrc": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+      "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+      "dev": true,
+      "dependencies": {
+        "ajv": "^6.12.4",
+        "debug": "^4.3.2",
+        "espree": "^9.6.0",
+        "globals": "^13.19.0",
+        "ignore": "^5.2.0",
+        "import-fresh": "^3.2.1",
+        "js-yaml": "^4.1.0",
+        "minimatch": "^3.1.2",
+        "strip-json-comments": "^3.1.1"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/@eslint/js": {
+      "version": "8.56.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz",
+      "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==",
+      "dev": true,
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      }
+    },
+    "node_modules/@humanwhocodes/config-array": {
+      "version": "0.11.14",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+      "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
+      "dev": true,
+      "dependencies": {
+        "@humanwhocodes/object-schema": "^2.0.2",
+        "debug": "^4.3.1",
+        "minimatch": "^3.0.5"
+      },
+      "engines": {
+        "node": ">=10.10.0"
+      }
+    },
+    "node_modules/@humanwhocodes/module-importer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+      "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+      "dev": true,
+      "engines": {
+        "node": ">=12.22"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/nzakas"
+      }
+    },
+    "node_modules/@humanwhocodes/object-schema": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz",
+      "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==",
+      "dev": true
+    },
+    "node_modules/@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+      "dev": true,
+      "dependencies": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+      "dev": true,
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+      "dev": true,
+      "dependencies": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@ungap/structured-clone": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
+      "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
+      "dev": true
+    },
+    "node_modules/acorn": {
+      "version": "8.11.3",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
+      "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+      "dev": true,
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/acorn-jsx": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+      "dev": true,
+      "peerDependencies": {
+        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+      }
+    },
+    "node_modules/ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "dev": true,
+      "dependencies": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/ansi-regex": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dev": true,
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/argparse": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+      "dev": true
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+      "dev": true
+    },
+    "node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/callsites": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dev": true,
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dev": true,
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "dev": true
+    },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+      "dev": true
+    },
+    "node_modules/cross-spawn": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "dev": true,
+      "dependencies": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/deep-is": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+      "dev": true
+    },
+    "node_modules/doctrine": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+      "dev": true,
+      "dependencies": {
+        "esutils": "^2.0.2"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/escape-string-regexp": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/eslint": {
+      "version": "8.56.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
+      "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
+      "dev": true,
+      "dependencies": {
+        "@eslint-community/eslint-utils": "^4.2.0",
+        "@eslint-community/regexpp": "^4.6.1",
+        "@eslint/eslintrc": "^2.1.4",
+        "@eslint/js": "8.56.0",
+        "@humanwhocodes/config-array": "^0.11.13",
+        "@humanwhocodes/module-importer": "^1.0.1",
+        "@nodelib/fs.walk": "^1.2.8",
+        "@ungap/structured-clone": "^1.2.0",
+        "ajv": "^6.12.4",
+        "chalk": "^4.0.0",
+        "cross-spawn": "^7.0.2",
+        "debug": "^4.3.2",
+        "doctrine": "^3.0.0",
+        "escape-string-regexp": "^4.0.0",
+        "eslint-scope": "^7.2.2",
+        "eslint-visitor-keys": "^3.4.3",
+        "espree": "^9.6.1",
+        "esquery": "^1.4.2",
+        "esutils": "^2.0.2",
+        "fast-deep-equal": "^3.1.3",
+        "file-entry-cache": "^6.0.1",
+        "find-up": "^5.0.0",
+        "glob-parent": "^6.0.2",
+        "globals": "^13.19.0",
+        "graphemer": "^1.4.0",
+        "ignore": "^5.2.0",
+        "imurmurhash": "^0.1.4",
+        "is-glob": "^4.0.0",
+        "is-path-inside": "^3.0.3",
+        "js-yaml": "^4.1.0",
+        "json-stable-stringify-without-jsonify": "^1.0.1",
+        "levn": "^0.4.1",
+        "lodash.merge": "^4.6.2",
+        "minimatch": "^3.1.2",
+        "natural-compare": "^1.4.0",
+        "optionator": "^0.9.3",
+        "strip-ansi": "^6.0.1",
+        "text-table": "^0.2.0"
+      },
+      "bin": {
+        "eslint": "bin/eslint.js"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint-scope": {
+      "version": "7.2.2",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+      "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+      "dev": true,
+      "dependencies": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/eslint-visitor-keys": {
+      "version": "3.4.3",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+      "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+      "dev": true,
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/espree": {
+      "version": "9.6.1",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+      "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+      "dev": true,
+      "dependencies": {
+        "acorn": "^8.9.0",
+        "acorn-jsx": "^5.3.2",
+        "eslint-visitor-keys": "^3.4.1"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
+      }
+    },
+    "node_modules/esquery": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+      "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+      "dev": true,
+      "dependencies": {
+        "estraverse": "^5.1.0"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "dev": true,
+      "dependencies": {
+        "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/estraverse": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+      "dev": true,
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+      "dev": true
+    },
+    "node_modules/fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "dev": true
+    },
+    "node_modules/fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+      "dev": true
+    },
+    "node_modules/fastq": {
+      "version": "1.17.0",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz",
+      "integrity": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==",
+      "dev": true,
+      "dependencies": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "node_modules/file-entry-cache": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+      "dev": true,
+      "dependencies": {
+        "flat-cache": "^3.0.4"
+      },
+      "engines": {
+        "node": "^10.12.0 || >=12.0.0"
+      }
+    },
+    "node_modules/find-up": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+      "dev": true,
+      "dependencies": {
+        "locate-path": "^6.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/flat-cache": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+      "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+      "dev": true,
+      "dependencies": {
+        "flatted": "^3.2.9",
+        "keyv": "^4.5.3",
+        "rimraf": "^3.0.2"
+      },
+      "engines": {
+        "node": "^10.12.0 || >=12.0.0"
+      }
+    },
+    "node_modules/flatted": {
+      "version": "3.2.9",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
+      "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
+      "dev": true
+    },
+    "node_modules/fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+      "dev": true
+    },
+    "node_modules/glob": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "dev": true,
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.1.1",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      },
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/glob-parent": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+      "dev": true,
+      "dependencies": {
+        "is-glob": "^4.0.3"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/globals": {
+      "version": "13.24.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+      "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+      "dev": true,
+      "dependencies": {
+        "type-fest": "^0.20.2"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/graphemer": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+      "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+      "dev": true
+    },
+    "node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/ignore": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
+      "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
+      "dev": true,
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/import-fresh": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+      "dev": true,
+      "dependencies": {
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.8.19"
+      }
+    },
+    "node_modules/inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+      "dev": true,
+      "dependencies": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+      "dev": true
+    },
+    "node_modules/is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "dev": true,
+      "dependencies": {
+        "is-extglob": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-path-inside": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+      "dev": true
+    },
+    "node_modules/js-yaml": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+      "dev": true,
+      "dependencies": {
+        "argparse": "^2.0.1"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
+      }
+    },
+    "node_modules/json-buffer": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+      "dev": true
+    },
+    "node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "dev": true
+    },
+    "node_modules/json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+      "dev": true
+    },
+    "node_modules/keyv": {
+      "version": "4.5.4",
+      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+      "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+      "dev": true,
+      "dependencies": {
+        "json-buffer": "3.0.1"
+      }
+    },
+    "node_modules/levn": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+      "dev": true,
+      "dependencies": {
+        "prelude-ls": "^1.2.1",
+        "type-check": "~0.4.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/locate-path": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+      "dev": true,
+      "dependencies": {
+        "p-locate": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/lodash.merge": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+      "dev": true
+    },
+    "node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
+    },
+    "node_modules/natural-compare": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+      "dev": true
+    },
+    "node_modules/once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "dev": true,
+      "dependencies": {
+        "wrappy": "1"
+      }
+    },
+    "node_modules/optionator": {
+      "version": "0.9.3",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+      "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+      "dev": true,
+      "dependencies": {
+        "@aashutoshrathi/word-wrap": "^1.2.3",
+        "deep-is": "^0.1.3",
+        "fast-levenshtein": "^2.0.6",
+        "levn": "^0.4.1",
+        "prelude-ls": "^1.2.1",
+        "type-check": "^0.4.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/p-limit": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+      "dev": true,
+      "dependencies": {
+        "yocto-queue": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-locate": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+      "dev": true,
+      "dependencies": {
+        "p-limit": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "dev": true,
+      "dependencies": {
+        "callsites": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/prelude-ls": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/punycode": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/queue-microtask": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/resolve-from": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+      "dev": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "dev": true,
+      "engines": {
+        "iojs": ">=1.0.0",
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "dev": true,
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "dependencies": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "node_modules/shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "dev": true,
+      "dependencies": {
+        "shebang-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-ansi": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+      "dev": true,
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/strip-json-comments": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dev": true,
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/text-table": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+      "dev": true
+    },
+    "node_modules/type-check": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+      "dev": true,
+      "dependencies": {
+        "prelude-ls": "^1.2.1"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/type-fest": {
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "dev": true,
+      "dependencies": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "node_modules/which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "dev": true,
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/node-which"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+      "dev": true
+    },
+    "node_modules/yocto-queue": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    }
+  }
+}
diff --git a/home/ags/config/package.json b/home/ags/config/package.json
new file mode 100644
index 0000000..32675bb
--- /dev/null
+++ b/home/ags/config/package.json
@@ -0,0 +1,15 @@
+{
+  "name": "snowflake-ags",
+  "version": "1.0.0",
+  "description": "snowflake ags",
+  "main": "config.js",
+  "repository": {
+    "type": "git",
+    "url": "https://git.flake.sh/notohh/snowflake"
+  },
+  "author": "notohh",
+  "license": "MIT",
+  "devDependencies": {
+    "eslint": "^8.56.0"
+  }
+}
\ No newline at end of file
diff --git a/home/default.nix b/home/default.nix
index 6a9e1be..18481a3 100644
--- a/home/default.nix
+++ b/home/default.nix
@@ -4,9 +4,7 @@
     ./neofetch
     ./nushell
     ./starship
-    ./git
     ./lazygit
-    ./direnv
     ./yazi
   ];
 
@@ -31,21 +29,46 @@
     p7zip
   ];
 
-  services.gpg-agent = {
-    enable = true;
-    defaultCacheTtl = 3600;
-    pinentryFlavor = "curses";
-    enableSshSupport = true;
-    enableNushellIntegration = true;
+  services = {
+    gpg-agent = {
+      enable = true;
+      defaultCacheTtl = 3600;
+      pinentryFlavor = "curses";
+      enableSshSupport = true;
+      enableNushellIntegration = true;
+    };
   };
 
-  programs.bat.enable = true;
-
-  programs.zoxide = {
-    enable = true;
-    enableNushellIntegration = true;
-    options = [
-      "--cmd cdd"
-    ];
+  programs = {
+    bat.enable = true;
+    git = {
+      enable = true;
+      delta.enable = true;
+      userEmail = "github@notohh.dev";
+      userName = "notohh";
+      signing = {
+        key = "BD47506D475EE86D";
+        signByDefault = true;
+      };
+      ignores = ["*result*" ".direnv" "node_modules"];
+    };
+    gh = {
+      enable = true;
+      gitCredentialHelper.enable = true;
+      settings = {
+        editor = "hx";
+        prompt = "enabled";
+      };
+    };
+    direnv = {
+      enable = true;
+      enableNushellIntegration = true;
+      nix-direnv.enable = true;
+    };
+    zoxide = {
+      enable = true;
+      enableNushellIntegration = true;
+      options = ["--cmd cdd"];
+    };
   };
 }
diff --git a/home/direnv/default.nix b/home/direnv/default.nix
deleted file mode 100644
index e88b1eb..0000000
--- a/home/direnv/default.nix
+++ /dev/null
@@ -1,7 +0,0 @@
-_: {
-  programs.direnv = {
-    enable = true;
-    enableNushellIntegration = true;
-    nix-direnv.enable = true;
-  };
-}
diff --git a/home/git/default.nix b/home/git/default.nix
deleted file mode 100644
index 443bc5d..0000000
--- a/home/git/default.nix
+++ /dev/null
@@ -1,21 +0,0 @@
-_: {
-  programs.git = {
-    enable = true;
-    delta.enable = true;
-    userEmail = "github@notohh.dev";
-    userName = "notohh";
-    signing = {
-      key = "BD47506D475EE86D";
-      signByDefault = true;
-    };
-    ignores = ["*result*" ".direnv" "node_modules"];
-  };
-  programs.gh = {
-    enable = true;
-    gitCredentialHelper.enable = true;
-    settings = {
-      editor = "hx";
-      prompt = "enabled";
-    };
-  };
-}
diff --git a/home/helix/languages.nix b/home/helix/languages.nix
index 4c4d6d5..e4fdd3c 100644
--- a/home/helix/languages.nix
+++ b/home/helix/languages.nix
@@ -24,7 +24,7 @@
         name = "lua";
         auto-format = true;
         formatter = {
-          command = lib.getExe luaformatter;
+          command = lib.getExe stylua;
         };
       }
     ];
diff --git a/home/helix/themes/catppuccin_mocha.nix b/home/helix/themes/catppuccin_mocha.nix
index f5a0b66..8c87ea6 100644
--- a/home/helix/themes/catppuccin_mocha.nix
+++ b/home/helix/themes/catppuccin_mocha.nix
@@ -1,7 +1,6 @@
 _: {
   programs.helix = {
     themes.catppuccin_mocha = let
-      transparent = "none";
       rosewater = "#f5e0dc";
       flamingo = "#f2cdcd";
       pink = "#f5c2e7";
diff --git a/home/helix/themes/tokyonight.nix b/home/helix/themes/tokyonight.nix
index c35ac84..6377971 100644
--- a/home/helix/themes/tokyonight.nix
+++ b/home/helix/themes/tokyonight.nix
@@ -7,20 +7,16 @@ _: {
       light-green = "#9ece6a";
       green = "#73daca";
       turquoise = "#89ddff";
-      light-cyan = "#b4f9f8";
       teal = "#2ac3de";
       cyan = "#7dcfff";
       blue = "#7aa2f7";
       magenta = "#bb9af7";
       white = "#c0caf5";
       light-gray = "#9aa5ce";
-      parameters = "#cfc9c2";
       comment = "#565f89";
       black = "#414868";
       foreground = "#a9b1d6";
-      foreground_highlight = "#c0caf5";
       foreground_gutter = "#363b54";
-      background = "#1a1b26";
       background_highlight = "#30374b";
       background_menu = "#16161e";
     in {
diff --git a/home/nushell/config.nu b/home/nushell/config.nu
index 4c5ce8f..399fcc4 100755
--- a/home/nushell/config.nu
+++ b/home/nushell/config.nu
@@ -24,9 +24,6 @@ alias sora = nix run github:serokell/deploy-rs ".#sora"
 alias tsuru = nix run github:serokell/deploy-rs ".#tsuru"
 alias haru = nix run github:serokell/deploy-rs ".#haru"
 alias kaze = nix run github:serokell/deploy-rs ".#kaze"
-alias dx = nix run "nixpkgs#deadnix"
-alias sx = nix run "nixpkgs#statix" -- check
-alias sxfix = nix run "nixpkgs#statix" -- fix
 alias dl = yt-dlp -P ~/Videos/downloaded
 alias dlad = yt-dlp -x --audio-format mp3 --embed-thumbnail
 alias dlcd = yt-dlp
diff --git a/home/wayland/default.nix b/home/wayland/default.nix
index a131283..5676a23 100644
--- a/home/wayland/default.nix
+++ b/home/wayland/default.nix
@@ -14,24 +14,46 @@
     '';
   };
 in {
-  imports = [
-    ./greetd.nix
-  ];
-
-  environment.systemPackages = with pkgs; [
-    dbus-hyprland-environment
-    wayland
-    glib
-    grim
-    slurp
-    satty
-    wl-clipboard
-    wlr-randr
-    swayidle
-    swaylock-effects
-    hyprpicker
-    swww
-  ];
+  imports = [./greetd.nix];
+  environment = {
+    systemPackages = with pkgs; [
+      dbus-hyprland-environment
+      wayland
+      glib
+      grim
+      slurp
+      satty
+      wl-clipboard
+      wlr-randr
+      swayidle
+      swaylock-effects
+      hyprpicker
+      swww
+    ];
+    sessionVariables = {
+      GBM_BACKEND = "nvidia-drm";
+      __GL_GSYNC_ALLOWED = "0";
+      __GL_VRR_ALLOWED = "0";
+      WLR_DRM_NO_ATOMIC = "1";
+      XDG_SESSION_TYPE = "wayland";
+      __GLX_VENDOR_LIBRARY_NAME = "nvidia";
+      _JAVA_AWT_WM_NONREPARENTING = "1";
+      QT_QPA_PLATFORM = "wayland";
+      QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
+      GDK_BACKEND = "wayland";
+      WLR_NO_HARDWARE_CURSORS = "1";
+      MOZ_ENABLE_WAYLAND = "1";
+      WLR_BACKEND = "vulkan";
+      WLR_RENDERER = "vulkan";
+      XCURSOR_SIZE = "24";
+      NIXOS_OZONE_WL = "1";
+      EDITOR = "hx";
+      TERMINAL = "wezterm";
+    };
+    etc."greetd/environments".text = ''
+      Hyprland
+    '';
+  };
 
   services.dbus.enable = true;
   xdg.portal = {
@@ -44,29 +66,4 @@ in {
       common.default = "*";
     };
   };
-
-  environment.sessionVariables = {
-    GBM_BACKEND = "nvidia-drm";
-    __GL_GSYNC_ALLOWED = "0";
-    __GL_VRR_ALLOWED = "0";
-    WLR_DRM_NO_ATOMIC = "1";
-    XDG_SESSION_TYPE = "wayland";
-    __GLX_VENDOR_LIBRARY_NAME = "nvidia";
-    _JAVA_AWT_WM_NONREPARENTING = "1";
-    QT_QPA_PLATFORM = "wayland";
-    QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
-    GDK_BACKEND = "wayland";
-    WLR_NO_HARDWARE_CURSORS = "1";
-    MOZ_ENABLE_WAYLAND = "1";
-    WLR_BACKEND = "vulkan";
-    WLR_RENDERER = "vulkan";
-    XCURSOR_SIZE = "24";
-    NIXOS_OZONE_WL = "1";
-    EDITOR = "hx";
-    TERMINAL = "wezterm";
-  };
-
-  environment.etc."greetd/environments".text = ''
-    Hyprland
-  '';
 }
diff --git a/home/wayland/hyprland/config/general.nix b/home/wayland/hyprland/config/general.nix
index 10182a8..213a98e 100644
--- a/home/wayland/hyprland/config/general.nix
+++ b/home/wayland/hyprland/config/general.nix
@@ -9,7 +9,7 @@
       ];
       exec-once = [
         "ags"
-        "swww init && swww img ~/Pictures/wallpapers/city.png"
+        "swww init && swww img ~/Pictures/wallpapers/frieren.png"
         "dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP"
         "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1"
         "~/.local/bin/lock"
diff --git a/home/zellij/default.nix b/home/zellij/default.nix
index 415d152..205e4b2 100644
--- a/home/zellij/default.nix
+++ b/home/zellij/default.nix
@@ -1,4 +1,4 @@
-{...}: {
+_: {
   imports = [
     ./layouts.nix
   ];
diff --git a/hosts/ame/default.nix b/hosts/ame/default.nix
index af1b687..acd7918 100644
--- a/hosts/ame/default.nix
+++ b/hosts/ame/default.nix
@@ -7,34 +7,24 @@
     ../../modules/fonts.nix
   ];
 
-  boot.loader = {
-    systemd-boot = {
-      enable = true;
-      configurationLimit = 8;
-    };
-    efi = {
-      canTouchEfiVariables = true;
-      efiSysMountPoint = "/boot/efi";
-    };
-  };
-
   programs.hyprland.enable = true;
 
-  services.xserver.enable = true;
-  services.xserver.displayManager.sddm.enable = true;
-
-  services.xserver = {
-    layout = "us";
-    xkbVariant = "";
+  services = {
+    pipewire = {
+      enable = true;
+      alsa.enable = true;
+      alsa.support32Bit = true;
+      pulse.enable = true;
+    };
+    xserver = {
+      enable = true;
+      displayManager.sddm.enable = true;
+      layout = "us";
+      xkbVariant = "";
+    };
   };
 
   sound.enable = true;
   hardware.pulseaudio.enable = false;
   security.rtkit.enable = true;
-  services.pipewire = {
-    enable = true;
-    alsa.enable = true;
-    alsa.support32Bit = true;
-    pulse.enable = true;
-  };
 }
diff --git a/hosts/ame/hardware.nix b/hosts/ame/hardware.nix
index 7301562..fdde3e6 100644
--- a/hosts/ame/hardware.nix
+++ b/hosts/ame/hardware.nix
@@ -8,24 +8,38 @@
     (modulesPath + "/installer/scan/not-detected.nix")
   ];
 
-  boot.initrd.availableKernelModules = ["xhci_pci" "ahci" "usb_storage" "sd_mod"];
-  boot.initrd.kernelModules = [];
-  boot.kernelModules = ["kvm-intel"];
-  boot.extraModulePackages = [];
-
-  fileSystems."/" = {
-    device = "/dev/disk/by-uuid/57411820-f154-497e-9c7e-dfcb1f21c5cf";
-    fsType = "ext4";
+  boot = {
+    kernelModules = ["kvm-intel"];
+    extraModulePackages = [];
+    loader = {
+      systemd-boot = {
+        enable = true;
+        configurationLimit = 8;
+      };
+      efi = {
+        canTouchEfiVariables = true;
+        efiSysMountPoint = "/boot/efi";
+      };
+    };
+    initrd = {
+      availableKernelModules = ["xhci_pci" "ahci" "usb_storage" "sd_mod"];
+      kernelModules = [];
+    };
   };
 
-  fileSystems."/boot/efi" = {
-    device = "/dev/disk/by-uuid/4D09-1D57";
-    fsType = "vfat";
-  };
-
-  fileSystems."/nas/restic" = {
-    device = "192.168.1.199:/mnt/Sutoreji/nix-restic-data/ame";
-    fsType = "nfs";
+  fileSystems = {
+    "/" = {
+      device = "/dev/disk/by-uuid/57411820-f154-497e-9c7e-dfcb1f21c5cf";
+      fsType = "ext4";
+    };
+    "/boot/efi" = {
+      device = "/dev/disk/by-uuid/4D09-1D57";
+      fsType = "vfat";
+    };
+    "/nas/restic" = {
+      device = "192.168.1.199:/mnt/Sutoreji/nix-restic-data/ame";
+      fsType = "nfs";
+    };
   };
 
   swapDevices = [
diff --git a/hosts/ame/home.nix b/hosts/ame/home.nix
index 46631da..ba309df 100755
--- a/hosts/ame/home.nix
+++ b/hosts/ame/home.nix
@@ -17,12 +17,11 @@
     username = "notoh";
     homeDirectory = "/home/notoh";
     packages = with pkgs; [
+      chromium
       discord
       spotify-player
       cinny-desktop
       pavucontrol
-      unzip
-      p7zip
       imv
       mpv
       rustypaste-cli
@@ -33,12 +32,7 @@
       glib
       grim
       slurp
-      swappy
       wl-clipboard
-      wlogout
-      wlr-randr
-      swayidle
-      swaylock-effects
       swww
       hyprpicker
       (libsForQt5.callPackage ../../pkgs/chatterino7 {})
diff --git a/hosts/ame/services/restic.nix b/hosts/ame/services/restic.nix
index aea790f..af51f37 100644
--- a/hosts/ame/services/restic.nix
+++ b/hosts/ame/services/restic.nix
@@ -3,12 +3,8 @@
   config,
   ...
 }: {
-  sops.secrets.restic-ame = {
-    sopsFile = ../../../secrets/restic/secrets.yaml;
-  };
-  sops.secrets.ame-s3 = {
-    sopsFile = ../../../secrets/s3/secrets.yaml;
-  };
+  sops.secrets.restic-ame = {sopsFile = ../../../secrets/restic/secrets.yaml;};
+  sops.secrets.ame-s3 = {sopsFile = ../../../secrets/s3/secrets.yaml;};
   environment.systemPackages = [pkgs.restic];
   services.restic = {
     backups = {
diff --git a/hosts/arashi/default.nix b/hosts/arashi/default.nix
index 60e5ca0..de37b1a 100644
--- a/hosts/arashi/default.nix
+++ b/hosts/arashi/default.nix
@@ -6,19 +6,6 @@
     ../../modules
   ];
 
-  boot.loader = {
-    grub = {
-      enable = true;
-      configurationLimit = 5;
-      device = "/dev/sda";
-      useOSProber = false;
-    };
-  };
-
-  boot.kernel.sysctl = {
-    "kernel.shmmax" = 100663296;
-  };
-
   services.xserver = {
     layout = "us";
     xkbVariant = "";
diff --git a/hosts/arashi/hardware.nix b/hosts/arashi/hardware.nix
index c32d3ca..34febfc 100644
--- a/hosts/arashi/hardware.nix
+++ b/hosts/arashi/hardware.nix
@@ -7,19 +7,31 @@
     (modulesPath + "/profiles/qemu-guest.nix")
   ];
 
-  boot.initrd.availableKernelModules = ["ata_piix" "uhci_hcd" "virtio_pci" "virtio_scsi" "sd_mod" "sr_mod"];
-  boot.initrd.kernelModules = [];
-  boot.kernelModules = [];
-  boot.extraModulePackages = [];
-
-  fileSystems."/" = {
-    device = "/dev/disk/by-uuid/3fd88f1f-cec3-4737-b9d0-6c8f026c3927";
-    fsType = "ext4";
+  boot = {
+    kernelModules = [];
+    kernel.sysctl = {"kernel.shmmax" = 100663296;};
+    extraModulePackages = [];
+    loader.grub = {
+      enable = true;
+      configurationLimit = 5;
+      device = "/dev/sda";
+      useOSProber = false;
+    };
+    initrd = {
+      availableKernelModules = ["ata_piix" "uhci_hcd" "virtio_pci" "virtio_scsi" "sd_mod" "sr_mod"];
+      kernelModules = [];
+    };
   };
 
-  fileSystems."/nas/restic" = {
-    device = "192.168.1.199:/mnt/Sutoreji/nix-restic-data/arashi";
-    fsType = "nfs";
+  fileSystems = {
+    "/" = {
+      device = "/dev/disk/by-uuid/3fd88f1f-cec3-4737-b9d0-6c8f026c3927";
+      fsType = "ext4";
+    };
+    "/nas/restic" = {
+      device = "192.168.1.199:/mnt/Sutoreji/nix-restic-data/arashi";
+      fsType = "nfs";
+    };
   };
 
   swapDevices = [
diff --git a/hosts/arashi/services/restic.nix b/hosts/arashi/services/restic.nix
index 57410d4..5ed8f56 100644
--- a/hosts/arashi/services/restic.nix
+++ b/hosts/arashi/services/restic.nix
@@ -3,9 +3,7 @@
   config,
   ...
 }: {
-  sops.secrets.restic-arashi = {
-    sopsFile = ../../../secrets/restic/secrets.yaml;
-  };
+  sops.secrets.restic-arashi = {sopsFile = ../../../secrets/restic/secrets.yaml;};
   environment.systemPackages = [pkgs.restic];
   services.restic = {
     backups = {
diff --git a/hosts/haru/default.nix b/hosts/haru/default.nix
index ba6ba90..19d4041 100644
--- a/hosts/haru/default.nix
+++ b/hosts/haru/default.nix
@@ -6,15 +6,6 @@
     ../../modules
   ];
 
-  boot.loader = {
-    grub = {
-      enable = true;
-      configurationLimit = 5;
-      device = "/dev/sda";
-      useOSProber = false;
-    };
-  };
-
   services.xserver = {
     layout = "us";
     xkbVariant = "";
diff --git a/hosts/haru/hardware.nix b/hosts/haru/hardware.nix
index 9b8a468..26d580b 100644
--- a/hosts/haru/hardware.nix
+++ b/hosts/haru/hardware.nix
@@ -7,14 +7,26 @@
     (modulesPath + "/profiles/qemu-guest.nix")
   ];
 
-  boot.initrd.availableKernelModules = ["ata_piix" "uhci_hcd" "virtio_pci" "virtio_scsi" "sd_mod" "sr_mod"];
-  boot.initrd.kernelModules = [];
-  boot.kernelModules = [];
-  boot.extraModulePackages = [];
+  boot = {
+    kernelModules = [];
+    extraModulePackages = [];
+    loader.grub = {
+      enable = true;
+      configurationLimit = 5;
+      device = "/dev/sda";
+      useOSProber = false;
+    };
+    initrd = {
+      availableKernelModules = ["ata_piix" "uhci_hcd" "virtio_pci" "virtio_scsi" "sd_mod" "sr_mod"];
+      kernelModules = [];
+    };
+  };
 
-  fileSystems."/" = {
-    device = "/dev/disk/by-uuid/06177115-2e39-493b-81fb-5a1980ae0534";
-    fsType = "ext4";
+  fileSystems = {
+    "/" = {
+      device = "/dev/disk/by-uuid/06177115-2e39-493b-81fb-5a1980ae0534";
+      fsType = "ext4";
+    };
   };
 
   swapDevices = [
diff --git a/hosts/kariru/default.nix b/hosts/kariru/default.nix
index b4f397d..0249bce 100644
--- a/hosts/kariru/default.nix
+++ b/hosts/kariru/default.nix
@@ -6,15 +6,6 @@
     ../../modules
   ];
 
-  boot.loader = {
-    grub = {
-      enable = true;
-      configurationLimit = 5;
-      device = "/dev/sda";
-      useOSProber = false;
-    };
-  };
-
   services.xserver = {
     layout = "us";
     xkbVariant = "";
diff --git a/hosts/kariru/hardware.nix b/hosts/kariru/hardware.nix
index ccc714e..9e7e325 100644
--- a/hosts/kariru/hardware.nix
+++ b/hosts/kariru/hardware.nix
@@ -7,29 +7,38 @@
     (modulesPath + "/profiles/qemu-guest.nix")
   ];
 
-  boot.initrd.availableKernelModules = ["ata_piix" "uhci_hcd" "virtio_pci" "virtio_scsi" "sd_mod" "sr_mod"];
-  boot.initrd.kernelModules = [];
-  boot.kernelModules = [];
-  boot.extraModulePackages = [];
-
-  fileSystems."/" = {
-    device = "/dev/disk/by-uuid/f5a0738c-d027-4ffb-82ec-9901ca6b310b";
-    fsType = "ext4";
+  boot = {
+    kernelModules = [];
+    extraModulePackages = [];
+    loader.grub = {
+      enable = true;
+      configurationLimit = 5;
+      device = "/dev/sda";
+      useOSProber = false;
+    };
+    initrd = {
+      availableKernelModules = ["ata_piix" "uhci_hcd" "virtio_pci" "virtio_scsi" "sd_mod" "sr_mod"];
+      kernelModules = [];
+    };
   };
 
-  fileSystems."/media" = {
-    device = "192.168.1.199:/mnt/Sutoreji/media";
-    fsType = "nfs";
-  };
-
-  fileSystems."/stash" = {
-    device = "192.168.1.199:/mnt/Sutoreji/stash";
-    fsType = "nfs";
-  };
-
-  fileSystems."/nas/restic" = {
-    device = "192.168.1.199:/mnt/Sutoreji/nix-restic-data/kariru";
-    fsType = "nfs";
+  fileSystems = {
+    "/" = {
+      device = "/dev/disk/by-uuid/f5a0738c-d027-4ffb-82ec-9901ca6b310b";
+      fsType = "ext4";
+    };
+    "/media" = {
+      device = "192.168.1.199:/mnt/Sutoreji/media";
+      fsType = "nfs";
+    };
+    "/stash" = {
+      device = "192.168.1.199:/mnt/Sutoreji/stash";
+      fsType = "nfs";
+    };
+    "/nas/restic" = {
+      device = "192.168.1.199:/mnt/Sutoreji/nix-restic-data/kariru";
+      fsType = "nfs";
+    };
   };
 
   swapDevices = [
diff --git a/hosts/kariru/services/default.nix b/hosts/kariru/services/default.nix
index 516c0ef..20560e2 100644
--- a/hosts/kariru/services/default.nix
+++ b/hosts/kariru/services/default.nix
@@ -1,42 +1,40 @@
 {pkgs, ...}: {
   networking.firewall.allowedTCPPorts = [9292];
+
   imports = [
     ./restic.nix
     ./torrent.nix
   ];
+
   environment.systemPackages = [pkgs.recyclarr];
-  services.radarr = {
-    enable = true;
-    openFirewall = true;
+  services = {
+    radarr = {
+      enable = true;
+      openFirewall = true;
+    };
+    sonarr = {
+      enable = true;
+      openFirewall = true;
+    };
+    prowlarr = {
+      enable = true;
+      openFirewall = true;
+    };
+    bazarr = {
+      enable = true;
+      openFirewall = true;
+    };
+    readarr = {
+      enable = true;
+      openFirewall = true;
+    };
+    lidarr = {
+      enable = true;
+      openFirewall = true;
+    };
+    sabnzbd.enable = true;
   };
 
-  services.sonarr = {
-    enable = true;
-    openFirewall = true;
-  };
-
-  services.prowlarr = {
-    enable = true;
-    openFirewall = true;
-  };
-
-  services.bazarr = {
-    enable = true;
-    openFirewall = true;
-  };
-
-  services.readarr = {
-    enable = true;
-    openFirewall = true;
-  };
-
-  services.lidarr = {
-    enable = true;
-    openFirewall = true;
-  };
-
-  services.sabnzbd.enable = true;
-
   virtualisation.oci-containers.containers = {
     whisparr = {
       image = "ghcr.io/hotio/whisparr@sha256:88b91920b77339e2deda418960be28868df538413abea6cdddaf4013e43c4c0f"; # v3-3.0.0.425
diff --git a/hosts/kariru/services/restic.nix b/hosts/kariru/services/restic.nix
index 31d924f..53d859d 100644
--- a/hosts/kariru/services/restic.nix
+++ b/hosts/kariru/services/restic.nix
@@ -3,9 +3,7 @@
   config,
   ...
 }: {
-  sops.secrets.restic-kariru = {
-    sopsFile = ../../../secrets/restic/secrets.yaml;
-  };
+  sops.secrets.restic-kariru = {sopsFile = ../../../secrets/restic/secrets.yaml;};
   environment.systemPackages = [pkgs.restic];
   services.restic = {
     backups = {
diff --git a/hosts/kaze/default.nix b/hosts/kaze/default.nix
index 2d53712..27287e2 100644
--- a/hosts/kaze/default.nix
+++ b/hosts/kaze/default.nix
@@ -6,15 +6,6 @@
     ../../modules
   ];
 
-  boot.loader = {
-    grub = {
-      enable = true;
-      configurationLimit = 5;
-      device = "/dev/vda";
-      useOSProber = true;
-    };
-  };
-
   services.xserver = {
     layout = "us";
     xkbVariant = "";
diff --git a/hosts/kaze/hardware.nix b/hosts/kaze/hardware.nix
index 3196876..88bb176 100644
--- a/hosts/kaze/hardware.nix
+++ b/hosts/kaze/hardware.nix
@@ -7,19 +7,30 @@
     (modulesPath + "/profiles/qemu-guest.nix")
   ];
 
-  boot.initrd.availableKernelModules = ["ata_piix" "uhci_hcd" "virtio_pci" "virtio_scsi" "sd_mod" "sr_mod" "virtio_blk"];
-  boot.initrd.kernelModules = [];
-  boot.kernelModules = ["kvm-amd"];
-  boot.extraModulePackages = [];
-
-  fileSystems."/" = {
-    device = "/dev/disk/by-uuid/9cb414ab-0bb4-4db7-b77e-7d2a8cafd657";
-    fsType = "ext4";
+  boot = {
+    kernelModules = ["kvm-amd"];
+    extraModulePackages = [];
+    loader.grub = {
+      enable = true;
+      configurationLimit = 5;
+      device = "/dev/vda";
+      useOSProber = true;
+    };
+    initrd = {
+      availableKernelModules = ["ata_piix" "uhci_hcd" "virtio_pci" "virtio_scsi" "sd_mod" "sr_mod" "virtio_blk"];
+      kernelModules = [];
+    };
   };
 
-  fileSystems."/var/lib/slab" = {
-    device = "/dev/disk/by-uuid/733a3f7b-b232-4b34-8742-460a67d8f1d0";
-    fsType = "ext4";
+  fileSystems = {
+    "/" = {
+      device = "/dev/disk/by-uuid/9cb414ab-0bb4-4db7-b77e-7d2a8cafd657";
+      fsType = "ext4";
+    };
+    "/var/lib/slab" = {
+      device = "/dev/disk/by-uuid/733a3f7b-b232-4b34-8742-460a67d8f1d0";
+      fsType = "ext4";
+    };
   };
 
   swapDevices = [
diff --git a/hosts/kaze/services/minio.nix b/hosts/kaze/services/minio.nix
index 0ffdb40..f3c53b5 100644
--- a/hosts/kaze/services/minio.nix
+++ b/hosts/kaze/services/minio.nix
@@ -5,9 +5,7 @@
 }: {
   environment.systemPackages = [pkgs.minio-client];
 
-  systemd.services.minio.environment = {
-    MINIO_BROWSER_REDIRECT = "false";
-  };
+  systemd.services.minio.environment = {MINIO_BROWSER_REDIRECT = "false";};
 
   sops.secrets.minio = {
     owner = "minio";
diff --git a/hosts/kaze/services/tailscale.nix b/hosts/kaze/services/tailscale.nix
index cb7892c..b81ec21 100644
--- a/hosts/kaze/services/tailscale.nix
+++ b/hosts/kaze/services/tailscale.nix
@@ -4,9 +4,7 @@
   pkgs,
   ...
 }: {
-  sops.secrets.tsauth-kaze = {
-    sopsFile = ../../../secrets/tailscale/secrets.yaml;
-  };
+  sops.secrets.tsauth-kaze = {sopsFile = ../../../secrets/tailscale/secrets.yaml;};
   environment.systemPackages = [pkgs.jq pkgs.tailscale];
   services.tailscale = {
     useRoutingFeatures = lib.mkDefault "client";
diff --git a/hosts/sakura/default.nix b/hosts/sakura/default.nix
index 20d7c6e..ec403c0 100644
--- a/hosts/sakura/default.nix
+++ b/hosts/sakura/default.nix
@@ -6,15 +6,6 @@ _: {
     ../../modules
   ];
 
-  boot.loader = {
-    grub = {
-      enable = true;
-      configurationLimit = 5;
-      device = "/dev/sda";
-      useOSProber = false;
-    };
-  };
-
   services.snowflake-proxy.enable = true;
 
   services.xserver = {
diff --git a/hosts/sakura/hardware.nix b/hosts/sakura/hardware.nix
index 69b5b23..f0a6596 100644
--- a/hosts/sakura/hardware.nix
+++ b/hosts/sakura/hardware.nix
@@ -7,24 +7,34 @@
     (modulesPath + "/profiles/qemu-guest.nix")
   ];
 
-  boot.initrd.availableKernelModules = ["ata_piix" "uhci_hcd" "virtio_pci" "virtio_scsi" "sd_mod" "sr_mod"];
-  boot.initrd.kernelModules = [];
-  boot.kernelModules = [];
-  boot.extraModulePackages = [];
-
-  fileSystems."/" = {
-    device = "/dev/disk/by-uuid/db3e4722-35a6-44fb-8e4d-a75166b845cb";
-    fsType = "ext4";
+  boot = {
+    kernelModules = [];
+    extraModulePackages = [];
+    loader.grub = {
+      enable = true;
+      configurationLimit = 5;
+      device = "/dev/sda";
+      useOSProber = false;
+    };
+    initrd = {
+      availableKernelModules = ["ata_piix" "uhci_hcd" "virtio_pci" "virtio_scsi" "sd_mod" "sr_mod"];
+      kernelModules = [];
+    };
   };
 
-  fileSystems."/home/notoh/justlog/logs" = {
-    device = "192.168.1.199:/mnt/Sutoreji/twitchlogs";
-    fsType = "nfs";
-  };
-
-  fileSystems."/nas/restic" = {
-    device = "192.168.1.199:/mnt/Sutoreji/nix-restic-data/sakura";
-    fsType = "nfs";
+  fileSystems = {
+    "/" = {
+      device = "/dev/disk/by-uuid/db3e4722-35a6-44fb-8e4d-a75166b845cb";
+      fsType = "ext4";
+    };
+    "/home/notoh/justlog/logs" = {
+      device = "192.168.1.199:/mnt/Sutoreji/twitchlogs";
+      fsType = "nfs";
+    };
+    "/nas/restic" = {
+      device = "192.168.1.199:/mnt/Sutoreji/nix-restic-data/sakura";
+      fsType = "nfs";
+    };
   };
 
   swapDevices = [
diff --git a/hosts/sakura/services/restic.nix b/hosts/sakura/services/restic.nix
index ba88b77..58ac93c 100644
--- a/hosts/sakura/services/restic.nix
+++ b/hosts/sakura/services/restic.nix
@@ -3,9 +3,7 @@
   config,
   ...
 }: {
-  sops.secrets.restic-sakura = {
-    sopsFile = ../../../secrets/restic/secrets.yaml;
-  };
+  sops.secrets.restic-sakura = {sopsFile = ../../../secrets/restic/secrets.yaml;};
   environment.systemPackages = [pkgs.restic];
   services.restic = {
     backups = {
diff --git a/hosts/sakura/services/rustypaste.nix b/hosts/sakura/services/rustypaste.nix
index 5a9ead4..b7bf771 100644
--- a/hosts/sakura/services/rustypaste.nix
+++ b/hosts/sakura/services/rustypaste.nix
@@ -3,12 +3,9 @@
 
   systemd.services.rustypaste = {
     enable = true;
-    wantedBy = [
-      "multi-user.target"
-    ];
+    wantedBy = ["multi-user.target"];
     description = "A minimal file upload/pastebin service.";
     environment = {
-      # AUTH_TOKEN = config.sops.secrets.rusty-auth-token.path;
       CONFIG = "/var/lib/rustypaste/config.toml";
     };
     serviceConfig = {
diff --git a/hosts/sakura/services/tailscale.nix b/hosts/sakura/services/tailscale.nix
index 60ade22..6f4459d 100644
--- a/hosts/sakura/services/tailscale.nix
+++ b/hosts/sakura/services/tailscale.nix
@@ -4,9 +4,7 @@
   pkgs,
   ...
 }: {
-  sops.secrets.tsauth-sakura = {
-    sopsFile = ../../../secrets/tailscale/secrets.yaml;
-  };
+  sops.secrets.tsauth-sakura = {sopsFile = ../../../secrets/tailscale/secrets.yaml;};
   environment.systemPackages = [pkgs.jq pkgs.tailscale];
   services.tailscale = {
     useRoutingFeatures = lib.mkDefault "client";
diff --git a/hosts/sora/default.nix b/hosts/sora/default.nix
index ce12b01..8d390b3 100644
--- a/hosts/sora/default.nix
+++ b/hosts/sora/default.nix
@@ -6,7 +6,8 @@ _: {
     ../../modules
   ];
 
-  boot.tmp.cleanOnBoot = true;
+  services.snowflake-proxy.enable = true;
+
   zramSwap.enable = true;
   users.users.notoh.openssh.authorizedKeys.keys = [
     "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGmI3hRDFjxLjrM3pE471e4jxSlcqeizh3iNVVdaMHeN sora"
diff --git a/hosts/sora/hardware.nix b/hosts/sora/hardware.nix
index df001ef..6b35803 100644
--- a/hosts/sora/hardware.nix
+++ b/hosts/sora/hardware.nix
@@ -1,20 +1,27 @@
 {modulesPath, ...}: {
   imports = [(modulesPath + "/profiles/qemu-guest.nix")];
-  boot.loader.grub = {
-    efiSupport = true;
-    efiInstallAsRemovable = true;
-    device = "nodev";
+
+  boot = {
+    tmp.cleanOnBoot = true;
+    loader.grub = {
+      efiSupport = true;
+      efiInstallAsRemovable = true;
+      device = "nodev";
+    };
+    initrd = {
+      availableKernelModules = ["ata_piix" "uhci_hcd" "xen_blkfront" "vmw_pvscsi"];
+      kernelModules = ["nvme"];
+    };
   };
 
-  fileSystems."/boot" = {
-    device = "/dev/disk/by-uuid/B793-1B2C";
-    fsType = "vfat";
-  };
-
-  boot.initrd.availableKernelModules = ["ata_piix" "uhci_hcd" "xen_blkfront" "vmw_pvscsi"];
-  boot.initrd.kernelModules = ["nvme"];
-  fileSystems."/" = {
-    device = "/dev/sda1";
-    fsType = "ext4";
+  fileSystems = {
+    "/" = {
+      device = "/dev/sda1";
+      fsType = "ext4";
+    };
+    "/boot" = {
+      device = "/dev/disk/by-uuid/B793-1B2C";
+      fsType = "vfat";
+    };
   };
 }
diff --git a/hosts/sora/services/foundryvtt.nix b/hosts/sora/services/foundryvtt.nix
index 5380aab..8d4cd78 100644
--- a/hosts/sora/services/foundryvtt.nix
+++ b/hosts/sora/services/foundryvtt.nix
@@ -2,10 +2,8 @@ _: {
   sops.secrets.foundry-username = {};
   sops.secrets.foundry-password = {};
   virtualisation.oci-containers.containers.foundryvtt = {
-    image = "felddy/foundryvtt:sha-50af627";
-    volumes = [
-      "/home/notoh/docker/foundryvtt:/data"
-    ];
+    image = "felddy/foundryvtt@sha256:d85dab9704d771f3a33f21439f1bf34748fb5bf1987668ff402b5b17d1973f5a";
+    volumes = ["/home/notoh/docker/foundryvtt:/data"];
     environment = {
       CONTAINER_PRESERVE_CONFIG = "true";
     };
@@ -13,8 +11,6 @@ _: {
       /run/secrets/foundry-username
       /run/secrets/foundry-password
     ];
-    ports = [
-      "30000:30000"
-    ];
+    ports = ["30000:30000"];
   };
 }
diff --git a/hosts/sora/services/glances.nix b/hosts/sora/services/glances.nix
index 62163d3..1554a0e 100644
--- a/hosts/sora/services/glances.nix
+++ b/hosts/sora/services/glances.nix
@@ -1,12 +1,8 @@
 _: {
   virtualisation.oci-containers.containers.glances = {
     image = "nicolargo/glances";
-    ports = [
-      "61208-61209:61208-61209"
-    ];
-    volumes = [
-      "/var/run/docker.sock:/var/run/docker.sock"
-    ];
+    ports = ["61208-61209:61208-61209"];
+    volumes = ["/var/run/docker.sock:/var/run/docker.sock"];
     environment = {
       GLANCES_OPT = "-w";
     };
diff --git a/hosts/sora/services/minecraft.nix b/hosts/sora/services/minecraft.nix
index 995ffb8..1c44497 100644
--- a/hosts/sora/services/minecraft.nix
+++ b/hosts/sora/services/minecraft.nix
@@ -12,8 +12,6 @@ _: {
       FABRIC_LOADER_VERSION = "0.14.23";
       FABRIC_LAUNCHER_VERSION = "0.11.2";
     };
-    volumes = [
-      "/home/notoh/docker/modded-mc:/data:rw"
-    ];
+    volumes = ["/home/notoh/docker/modded-mc:/data:rw"];
   };
 }
diff --git a/hosts/sora/services/restic.nix b/hosts/sora/services/restic.nix
index adc9208..127398b 100644
--- a/hosts/sora/services/restic.nix
+++ b/hosts/sora/services/restic.nix
@@ -4,12 +4,8 @@
   ...
 }: {
   sops.secrets = {
-    restic-sora = {
-      sopsFile = ../../../secrets/restic/secrets.yaml;
-    };
-    sora-s3 = {
-      sopsFile = ../../../secrets/s3/secrets.yaml;
-    };
+    restic-sora = {sopsFile = ../../../secrets/restic/secrets.yaml;};
+    sora-s3 = {sopsFile = ../../../secrets/s3/secrets.yaml;};
   };
   environment.systemPackages = [pkgs.restic];
   services.restic = {
diff --git a/hosts/sora/services/tailscale.nix b/hosts/sora/services/tailscale.nix
index f2add0b..ba6558e 100644
--- a/hosts/sora/services/tailscale.nix
+++ b/hosts/sora/services/tailscale.nix
@@ -4,9 +4,7 @@
   pkgs,
   ...
 }: {
-  sops.secrets.tsauth-sora = {
-    sopsFile = ../../../secrets/tailscale/secrets.yaml;
-  };
+  sops.secrets.tsauth-sora = {sopsFile = ../../../secrets/tailscale/secrets.yaml;};
   environment.systemPackages = [pkgs.jq pkgs.tailscale];
   services.tailscale = {
     useRoutingFeatures = lib.mkDefault "server"; # important to make it a server, it sets sysctl for ip forwarding without intervention and reboot
diff --git a/hosts/sora/services/terraria.nix b/hosts/sora/services/terraria.nix
index ba0e2db..953215b 100644
--- a/hosts/sora/services/terraria.nix
+++ b/hosts/sora/services/terraria.nix
@@ -1,4 +1,4 @@
-{...}: {
+_: {
   networking.firewall.allowedTCPPorts = [7777];
   virtualisation.oci-containers.containers.terraria = {
     image = "jacobsmile/tmodloader1.4:v2023.11.3.3";
diff --git a/hosts/tsuki/default.nix b/hosts/tsuki/default.nix
index 35d96c9..9807be9 100755
--- a/hosts/tsuki/default.nix
+++ b/hosts/tsuki/default.nix
@@ -16,23 +16,22 @@
     ../../pkgs/overlays.nix
   ];
 
-  boot.loader = {
-    systemd-boot = {
-      enable = true;
-      configurationLimit = 10;
-    };
-    efi = {
-      canTouchEfiVariables = true;
-      efiSysMountPoint = "/boot/efi";
-    };
-  };
-
-  boot.extraModulePackages = with config.boot.kernelPackages; [v4l2loopback.out];
-  boot.kernelModules = ["v4l2loopback" "kvm-intel"];
-
   virtualisation.libvirtd.enable = true;
 
   services = {
+    pcscd.enable = true;
+    pipewire = {
+      enable = true;
+      alsa.enable = true;
+      alsa.support32Bit = true;
+      pulse.enable = true;
+      wireplumber.enable = true;
+      lowLatency = {
+        enable = true;
+        quantum = 64;
+        rate = 48000;
+      };
+    };
     xserver = {
       enable = true;
       videoDrivers = ["nvidia"];
@@ -53,41 +52,28 @@
     };
   };
 
-  services.pcscd.enable = true;
-  services.davfs2.enable = true;
-
-  hardware.pulseaudio.enable = false;
-  security.rtkit.enable = true;
-  services.pipewire = {
-    enable = true;
-    alsa.enable = true;
-    alsa.support32Bit = true;
-    pulse.enable = true;
-    wireplumber.enable = true;
-    lowLatency = {
-      enable = true;
-      quantum = 64;
-      rate = 48000;
+  security = {
+    rtkit.enable = true;
+    polkit.enable = true;
+    pam.services.swaylock = {
+      text = ''
+        auth include login
+      '';
     };
   };
 
-  programs.gamemode.enable = true;
-
-  programs.steam = {
-    enable = true;
-    extraCompatPackages = [
-      inputs.nix-gaming.packages.${pkgs.system}.proton-ge
-    ];
-  };
-
-  security.polkit.enable = true;
-  security.pam.services.swaylock = {
-    text = ''
-      auth include login
-    '';
+  programs = {
+    gamemode.enable = true;
+    steam = {
+      enable = true;
+      extraCompatPackages = [
+        inputs.nix-gaming.packages.${pkgs.system}.proton-ge
+      ];
+    };
   };
 
   hardware = {
+    pulseaudio.enable = false;
     nvidia = {
       powerManagement.enable = true;
       modesetting.enable = true;
diff --git a/hosts/tsuki/hardware.nix b/hosts/tsuki/hardware.nix
index 394a2a8..20dbb2a 100755
--- a/hosts/tsuki/hardware.nix
+++ b/hosts/tsuki/hardware.nix
@@ -8,34 +8,46 @@
     (modulesPath + "/installer/scan/not-detected.nix")
   ];
 
-  boot.initrd.availableKernelModules = ["xhci_pci" "ahci" "nvme" "usb_storage" "usbhid" "sd_mod"];
-  boot.initrd.kernelModules = [];
-  boot.kernelModules = ["kvm-intel"];
-  boot.extraModulePackages = [];
-
-  fileSystems."/" = {
-    device = "/dev/disk/by-uuid/7d098aab-1968-4605-a9a7-b1627941c1ff";
-    fsType = "ext4";
+  boot = {
+    kernelModules = ["v4l2loopback" "kvm-intel"];
+    extraModulePackages = with config.boot.kernelPackages; [v4l2loopback.out];
+    loader = {
+      systemd-boot = {
+        enable = true;
+        configurationLimit = 10;
+      };
+      efi = {
+        canTouchEfiVariables = true;
+        efiSysMountPoint = "/boot/efi";
+      };
+    };
+    initrd = {
+      availableKernelModules = ["xhci_pci" "ahci" "nvme" "usb_storage" "usbhid" "sd_mod"];
+      kernelModules = [];
+    };
   };
 
-  fileSystems."/boot/efi" = {
-    device = "/dev/disk/by-uuid/C356-B67C";
-    fsType = "vfat";
-  };
-
-  fileSystems."/hdd" = {
-    device = "/dev/disk/by-uuid/e2e4c4f3-51df-4020-b557-a7cf684de85b";
-    fsType = "ext4";
-  };
-
-  fileSystems."/ssd" = {
-    device = "/dev/disk/by-uuid/9e5a189d-7435-45d7-aef6-cdee4de2428d";
-    fsType = "ext4";
-  };
-
-  fileSystems."/nas/restic" = {
-    device = "192.168.1.199:/mnt/Sutoreji/nix-restic-data/tsuki";
-    fsType = "nfs";
+  fileSystems = {
+    "/" = {
+      device = "/dev/disk/by-uuid/7d098aab-1968-4605-a9a7-b1627941c1ff";
+      fsType = "ext4";
+    };
+    "/boot/efi" = {
+      device = "/dev/disk/by-uuid/C356-B67C";
+      fsType = "vfat";
+    };
+    "/hdd" = {
+      device = "/dev/disk/by-uuid/e2e4c4f3-51df-4020-b557-a7cf684de85b";
+      fsType = "ext4";
+    };
+    "/ssd" = {
+      device = "/dev/disk/by-uuid/9e5a189d-7435-45d7-aef6-cdee4de2428d";
+      fsType = "ext4";
+    };
+    "/nas/restic" = {
+      device = "192.168.1.199:/mnt/Sutoreji/nix-restic-data/tsuki";
+      fsType = "nfs";
+    };
   };
 
   swapDevices = [
diff --git a/hosts/tsuki/home.nix b/hosts/tsuki/home.nix
index b44d7b9..a6d4cfc 100755
--- a/hosts/tsuki/home.nix
+++ b/hosts/tsuki/home.nix
@@ -43,7 +43,6 @@
       imv
       mpv
       ffmpeg
-      nom
       rustypaste-cli
       gimp
       cryptomator
@@ -56,7 +55,6 @@
       prismlauncher
       yuzu
       inputs.nix-gaming.packages.${pkgs.system}.osu-lazer-bin
-      inputs.nix-gaming.packages.${pkgs.system}.wine-discord-ipc-bridge
       (libsForQt5.callPackage ../../pkgs/chatterino7 {})
       (callPackage ../../pkgs/jellyfin-rpc {})
     ];
diff --git a/hosts/tsuki/services/atticd.nix b/hosts/tsuki/services/atticd.nix
index 8fcc64b..fd625b5 100644
--- a/hosts/tsuki/services/atticd.nix
+++ b/hosts/tsuki/services/atticd.nix
@@ -3,9 +3,7 @@
 
   systemd.services.atticd = {
     enable = true;
-    wantedBy = [
-      "multi-user.target"
-    ];
+    wantedBy = ["multi-user.target"];
     description = "atticd";
 
     serviceConfig = {
diff --git a/hosts/tsuki/services/default.nix b/hosts/tsuki/services/default.nix
index 4cdded0..e7e280b 100644
--- a/hosts/tsuki/services/default.nix
+++ b/hosts/tsuki/services/default.nix
@@ -1,7 +1,7 @@
 {...}: {
   imports = [
-    ./atticd.nix
     ./restic.nix
+    ./atticd.nix
     ./hydroxide.nix
   ];
 }
diff --git a/hosts/tsuki/services/hydroxide.nix b/hosts/tsuki/services/hydroxide.nix
index 15f6817..690332c 100644
--- a/hosts/tsuki/services/hydroxide.nix
+++ b/hosts/tsuki/services/hydroxide.nix
@@ -4,9 +4,7 @@
 
   systemd.services.hydroxide = {
     enable = true;
-    wantedBy = [
-      "multi-user.target"
-    ];
+    wantedBy = ["multi-user.target"];
     description = "A third-party, open-source ProtonMail bridge";
 
     serviceConfig = {
diff --git a/hosts/tsuru/default.nix b/hosts/tsuru/default.nix
index 3690a55..c737bfa 100644
--- a/hosts/tsuru/default.nix
+++ b/hosts/tsuru/default.nix
@@ -6,15 +6,6 @@
     ../../modules
   ];
 
-  boot.loader = {
-    grub = {
-      enable = true;
-      configurationLimit = 5;
-      device = "/dev/sda";
-      useOSProber = false;
-    };
-  };
-
   services.xserver = {
     layout = "us";
     xkbVariant = "";
diff --git a/hosts/tsuru/hardware.nix b/hosts/tsuru/hardware.nix
index e6d6259..0a34d6d 100644
--- a/hosts/tsuru/hardware.nix
+++ b/hosts/tsuru/hardware.nix
@@ -7,14 +7,26 @@
     (modulesPath + "/profiles/qemu-guest.nix")
   ];
 
-  boot.initrd.availableKernelModules = ["ata_piix" "uhci_hcd" "virtio_pci" "virtio_scsi" "sd_mod" "sr_mod"];
-  boot.initrd.kernelModules = [];
-  boot.kernelModules = [];
-  boot.extraModulePackages = [];
+  boot = {
+    kernelModules = [];
+    extraModulePackages = [];
+    loader.grub = {
+      enable = true;
+      configurationLimit = 5;
+      device = "/dev/sda";
+      useOSProber = false;
+    };
+    initrd = {
+      availableKernelModules = ["ata_piix" "uhci_hcd" "virtio_pci" "virtio_scsi" "sd_mod" "sr_mod"];
+      kernelModules = [];
+    };
+  };
 
-  fileSystems."/" = {
-    device = "/dev/disk/by-uuid/625f557a-99a0-4e2d-9aef-f3aed7cea1c8";
-    fsType = "ext4";
+  fileSystems = {
+    "/" = {
+      device = "/dev/disk/by-uuid/625f557a-99a0-4e2d-9aef-f3aed7cea1c8";
+      fsType = "ext4";
+    };
   };
 
   swapDevices = [
diff --git a/hosts/tsuru/services/tailscale.nix b/hosts/tsuru/services/tailscale.nix
index 798440a..65c243b 100644
--- a/hosts/tsuru/services/tailscale.nix
+++ b/hosts/tsuru/services/tailscale.nix
@@ -4,9 +4,7 @@
   pkgs,
   ...
 }: {
-  sops.secrets.tsauth-tsuru = {
-    sopsFile = ../../../secrets/tailscale/secrets.yaml;
-  };
+  sops.secrets.tsauth-tsuru = {sopsFile = ../../../secrets/tailscale/secrets.yaml;};
   environment.systemPackages = [pkgs.jq pkgs.tailscale];
   services.tailscale = {
     useRoutingFeatures = lib.mkDefault "client";
diff --git a/hosts/tsuru/services/woodpecker.nix b/hosts/tsuru/services/woodpecker.nix
index b3fae28..b2d3f7f 100644
--- a/hosts/tsuru/services/woodpecker.nix
+++ b/hosts/tsuru/services/woodpecker.nix
@@ -31,8 +31,6 @@
       WOODPECKER_KEEPALIVE_MIN_TIME = "10s";
       WOODPECKER_HEALTHCHECK = "true";
     };
-    extraGroups = [
-      "docker"
-    ];
+    extraGroups = ["docker"];
   };
 }
diff --git a/hosts/yuki/hardware.nix b/hosts/yuki/hardware.nix
index 57787d2..fd0c8a9 100644
--- a/hosts/yuki/hardware.nix
+++ b/hosts/yuki/hardware.nix
@@ -7,34 +7,42 @@
     (modulesPath + "/profiles/qemu-guest.nix")
   ];
 
-  boot.initrd.availableKernelModules = ["ata_piix" "uhci_hcd" "virtio_pci" "virtio_scsi" "sd_mod" "sr_mod"];
-  boot.initrd.kernelModules = [];
-  boot.kernelModules = [];
-  boot.extraModulePackages = [];
-
-  fileSystems."/" = {
-    device = "/dev/disk/by-uuid/833959fb-de9d-4820-aa22-e6ce8bce6f6c";
-    fsType = "ext4";
+  boot = {
+    kernelModules = [];
+    extraModulePackages = [];
+    loader.grub = {
+      enable = true;
+      configurationLimit = 5;
+      device = "/dev/sda";
+      useOSProber = false;
+    };
+    initrd = {
+      availableKernelModules = ["ata_piix" "uhci_hcd" "virtio_pci" "virtio_scsi" "sd_mod" "sr_mod"];
+      kernelModules = [];
+    };
   };
 
-  fileSystems."/home/notoh/docker/stash/data" = {
-    device = "192.168.1.199:/mnt/Sutoreji/stash";
-    fsType = "nfs";
-  };
-
-  fileSystems."/media" = {
-    device = "192.168.1.199:/mnt/Sutoreji/media";
-    fsType = "nfs";
-  };
-
-  fileSystems."/nas/restic" = {
-    device = "192.168.1.199:/mnt/Sutoreji/nix-restic-data/yuki";
-    fsType = "nfs";
-  };
-
-  fileSystems."/var/lib/paperless-ngx/media" = {
-    device = "192.168.1.199:/mnt/Sutoreji/paperless-ngx/paperless-media ";
-    fsType = "nfs";
+  fileSystems = {
+    "/" = {
+      device = "/dev/disk/by-uuid/833959fb-de9d-4820-aa22-e6ce8bce6f6c";
+      fsType = "ext4";
+    };
+    "/home/notoh/docker/stash/data" = {
+      device = "192.168.1.199:/mnt/Sutoreji/stash";
+      fsType = "nfs";
+    };
+    "/media" = {
+      device = "192.168.1.199:/mnt/Sutoreji/media";
+      fsType = "nfs";
+    };
+    "/nas/restic" = {
+      device = "192.168.1.199:/mnt/Sutoreji/nix-restic-data/yuki";
+      fsType = "nfs";
+    };
+    "/var/lib/paperless-ngx/media" = {
+      device = "192.168.1.199:/mnt/Sutoreji/paperless-ngx/paperless-media ";
+      fsType = "nfs";
+    };
   };
 
   swapDevices = [
diff --git a/hosts/yuki/services/restic.nix b/hosts/yuki/services/restic.nix
index 8e32696..8215afc 100644
--- a/hosts/yuki/services/restic.nix
+++ b/hosts/yuki/services/restic.nix
@@ -3,9 +3,7 @@
   config,
   ...
 }: {
-  sops.secrets.restic-yuki = {
-    sopsFile = ../../../secrets/restic/secrets.yaml;
-  };
+  sops.secrets.restic-yuki = {sopsFile = ../../../secrets/restic/secrets.yaml;};
   environment.systemPackages = [pkgs.restic];
   services.restic = {
     backups = {
diff --git a/hosts/yuki/services/stash.nix b/hosts/yuki/services/stash.nix
index fe7f347..27e113b 100644
--- a/hosts/yuki/services/stash.nix
+++ b/hosts/yuki/services/stash.nix
@@ -1,6 +1,7 @@
 _: {
   virtualisation.oci-containers.containers.stash = {
-    image = "stashapp/stash@sha256:b3b59809d5be1d82467253ec9e2ee98628a0db7527d27a6c7daa75e1fcda7deb";
+    image = "stashapp/stash@sha256:b3b59809d5be1d82467253ec9e2ee98628a0db7527d27a6c7daa75e1fcda7deb"; # v0.24.3
+    ports = ["9999:9999"];
     environment = {
       STASH_STASH = "/data/";
       STASH_GENERATED = "/generated/";
@@ -17,8 +18,5 @@ _: {
       "/home/notoh/docker/stash/generated:/generated"
       "/home/notoh/docker/stash/blobs:/blobs"
     ];
-    ports = [
-      "9999:9999"
-    ];
   };
 }
diff --git a/hosts/yuki/services/wallos.nix b/hosts/yuki/services/wallos.nix
index 3cba45f..5eb6225 100644
--- a/hosts/yuki/services/wallos.nix
+++ b/hosts/yuki/services/wallos.nix
@@ -1,15 +1,11 @@
 _: {
   virtualisation.oci-containers.containers.wallos = {
     image = "bellamy/wallos@sha256:d3846ab980095be55a3c07633cca905bf29505bc63e5d92ad49938f56fd7b9f7";
-    ports = [
-      "8282:80"
-    ];
+    ports = ["8282:80"];
     volumes = [
       "/home/notoh/docker/wallos/db:/var/www/html/db"
       "/home/notoh/docker/wallos/logos:/var/www/html/images/uploads/logos"
     ];
-    environment = {
-      TZ = "America/New_York";
-    };
+    environment = {TZ = "America/New_York";};
   };
 }
diff --git a/statix.toml b/statix.toml
new file mode 100644
index 0000000..fbe25a9
--- /dev/null
+++ b/statix.toml
@@ -0,0 +1,3 @@
+disabled = []
+nix_version = '2.4'
+ignore = ['.direnv']
-- 
2.49.0