about summary refs log tree commit diff
path: root/pkgs/by-name/gi
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/by-name/gi')
-rw-r--r--pkgs/by-name/gi/gImageReader/package.nix71
-rw-r--r--pkgs/by-name/gi/gi-crystal/package.nix48
-rw-r--r--pkgs/by-name/gi/gi-crystal/src.patch57
-rw-r--r--pkgs/by-name/gi/gi-crystal/store-friendly-library-name.patch10
-rw-r--r--pkgs/by-name/gi/gi-docgen/package.nix60
-rw-r--r--pkgs/by-name/gi/giac/fix-fltk-guard.patch28
-rw-r--r--pkgs/by-name/gi/giac/package.nix158
-rw-r--r--pkgs/by-name/gi/giac/remove-old-functional-patterns.patch294
-rw-r--r--pkgs/by-name/gi/giada/package.nix77
-rw-r--r--pkgs/by-name/gi/giara/package.nix77
-rw-r--r--pkgs/by-name/gi/gibo/package.nix33
-rw-r--r--pkgs/by-name/gi/gif-for-cli/package.nix56
-rw-r--r--pkgs/by-name/gi/gif2apng/package.nix69
-rw-r--r--pkgs/by-name/gi/giflib/CVE-2021-40633.patch26
-rw-r--r--pkgs/by-name/gi/giflib/mingw-install-exes.patch11
-rw-r--r--pkgs/by-name/gi/giflib/package.nix63
-rw-r--r--pkgs/by-name/gi/gifticlib/package.nix34
-rw-r--r--pkgs/by-name/gi/gigalixir/package.nix65
-rw-r--r--pkgs/by-name/gi/gigedit/package.nix47
-rw-r--r--pkgs/by-name/gi/gildas/clang.patch77
-rw-r--r--pkgs/by-name/gi/gildas/cpp-darwin.patch17
-rw-r--r--pkgs/by-name/gi/gildas/package.nix75
-rw-r--r--pkgs/by-name/gi/gildas/wrapper.patch20
-rw-r--r--pkgs/by-name/gi/gimme-aws-creds/package.nix84
-rw-r--r--pkgs/by-name/gi/gimoji/package.nix32
-rw-r--r--pkgs/by-name/gi/gimx/conf.patch26
-rw-r--r--pkgs/by-name/gi/gimx/gcc14.patch26
-rw-r--r--pkgs/by-name/gi/gimx/package.nix54
-rw-r--r--pkgs/by-name/gi/ginac/package.nix34
-rw-r--r--pkgs/by-name/gi/ginkgo/package.nix45
-rw-r--r--pkgs/by-name/gi/gio-sharp/package.nix30
-rw-r--r--pkgs/by-name/gi/giph/package.nix44
-rw-r--r--pkgs/by-name/gi/gir-rs/Cargo.lock278
-rw-r--r--pkgs/by-name/gi/gir-rs/package.nix37
-rw-r--r--pkgs/by-name/gi/girouette/package.nix2
-rw-r--r--pkgs/by-name/gi/girsh/package.nix35
-rw-r--r--pkgs/by-name/gi/git-agecrypt/package.nix2
-rw-r--r--pkgs/by-name/gi/git-aggregator/package.nix43
-rw-r--r--pkgs/by-name/gi/git-annex-remote-rclone/package.nix30
-rw-r--r--pkgs/by-name/gi/git-annex-utils/package.nix27
-rw-r--r--pkgs/by-name/gi/git-appraise/package.nix25
-rw-r--r--pkgs/by-name/gi/git-backdate/package.nix32
-rw-r--r--pkgs/by-name/gi/git-backup-go/package.nix6
-rw-r--r--pkgs/by-name/gi/git-bars/package.nix26
-rw-r--r--pkgs/by-name/gi/git-big-picture/package.nix27
-rw-r--r--pkgs/by-name/gi/git-branchstack/package.nix30
-rw-r--r--pkgs/by-name/gi/git-bug-migration/package.nix35
-rw-r--r--pkgs/by-name/gi/git-bug/package.nix44
-rw-r--r--pkgs/by-name/gi/git-cache/package.nix28
-rw-r--r--pkgs/by-name/gi/git-chain/package.nix48
-rw-r--r--pkgs/by-name/gi/git-chglog/package.nix27
-rw-r--r--pkgs/by-name/gi/git-codereview/package.nix27
-rw-r--r--pkgs/by-name/gi/git-cola/package.nix69
-rw-r--r--pkgs/by-name/gi/git-crecord/package.nix26
-rw-r--r--pkgs/by-name/gi/git-credential-oauth/package.nix36
-rw-r--r--pkgs/by-name/gi/git-crypt/package.nix71
-rw-r--r--pkgs/by-name/gi/git-delete-merged-branches/package.nix28
-rw-r--r--pkgs/by-name/gi/git-dive/package.nix69
-rw-r--r--pkgs/by-name/gi/git-extras/package.nix47
-rw-r--r--pkgs/by-name/gi/git-fast-export/package.nix88
-rw-r--r--pkgs/by-name/gi/git-fire/package.nix31
-rw-r--r--pkgs/by-name/gi/git-fixup/package.nix23
-rw-r--r--pkgs/by-name/gi/git-ftp/package.nix100
-rw-r--r--pkgs/by-name/gi/git-gr/package.nix6
-rw-r--r--pkgs/by-name/gi/git-graph/package.nix28
-rw-r--r--pkgs/by-name/gi/git-hound/package.nix43
-rw-r--r--pkgs/by-name/gi/git-hub/package.nix44
-rw-r--r--pkgs/by-name/gi/git-identity/package.nix52
-rw-r--r--pkgs/by-name/gi/git-igitt/package.nix2
-rw-r--r--pkgs/by-name/gi/git-ignore/package.nix44
-rw-r--r--pkgs/by-name/gi/git-instafix/package.nix2
-rw-r--r--pkgs/by-name/gi/git-interactive-rebase-tool/package.nix30
-rw-r--r--pkgs/by-name/gi/git-latexdiff/package.nix40
-rw-r--r--pkgs/by-name/gi/git-latexdiff/version-test.patch17
-rw-r--r--pkgs/by-name/gi/git-mit/package.nix49
-rw-r--r--pkgs/by-name/gi/git-nomad/package.nix31
-rw-r--r--pkgs/by-name/gi/git-octopus/package.nix32
-rw-r--r--pkgs/by-name/gi/git-open/package.nix41
-rw-r--r--pkgs/by-name/gi/git-privacy/package.nix48
-rw-r--r--pkgs/by-name/gi/git-prole/package.nix40
-rw-r--r--pkgs/by-name/gi/git-quick-stats/package.nix52
-rw-r--r--pkgs/by-name/gi/git-radar/package.nix35
-rw-r--r--pkgs/by-name/gi/git-relevant-history/package.nix25
-rw-r--r--pkgs/by-name/gi/git-remote-gcrypt/package.nix37
-rw-r--r--pkgs/by-name/gi/git-remote-hg/package.nix32
-rw-r--r--pkgs/by-name/gi/git-reparent/package.nix34
-rw-r--r--pkgs/by-name/gi/git-repo/import-ssl-module.patch30
-rw-r--r--pkgs/by-name/gi/git-repo/package.nix61
-rw-r--r--pkgs/by-name/gi/git-secret/package.nix34
-rw-r--r--pkgs/by-name/gi/git-secrets/package.nix33
-rw-r--r--pkgs/by-name/gi/git-series/package.nix65
-rw-r--r--pkgs/by-name/gi/git-sim/package.nix84
-rw-r--r--pkgs/by-name/gi/git-sim/tests.patch33
-rw-r--r--pkgs/by-name/gi/git-sizer/package.nix31
-rw-r--r--pkgs/by-name/gi/git-spice/package.nix25
-rw-r--r--pkgs/by-name/gi/git-stree/package.nix28
-rw-r--r--pkgs/by-name/gi/git-subrepo/package.nix48
-rw-r--r--pkgs/by-name/gi/git-subtrac/package.nix25
-rw-r--r--pkgs/by-name/gi/git-sync/package.nix48
-rw-r--r--pkgs/by-name/gi/git-team/package.nix46
-rw-r--r--pkgs/by-name/gi/git-test/package.nix34
-rw-r--r--pkgs/by-name/gi/git-together/package.nix2
-rw-r--r--pkgs/by-name/gi/git-town/package.nix74
-rw-r--r--pkgs/by-name/gi/git-upstream/package.nix12
-rw-r--r--pkgs/by-name/gi/git-vanity-hash/package.nix33
-rw-r--r--pkgs/by-name/gi/git-vendor/package.nix67
-rw-r--r--pkgs/by-name/gi/git-warp-time/package.nix78
-rw-r--r--pkgs/by-name/gi/git-when-merged/package.nix41
-rw-r--r--pkgs/by-name/gi/git2-cpp/package.nix30
-rw-r--r--pkgs/by-name/gi/git2cl/package.nix25
-rw-r--r--pkgs/by-name/gi/gitaly/git.nix57
-rw-r--r--pkgs/by-name/gi/gitaly/package.nix67
-rw-r--r--pkgs/by-name/gi/gitbatch/package.nix39
-rw-r--r--pkgs/by-name/gi/gitbutler/package.nix61
-rw-r--r--pkgs/by-name/gi/gitea-actions-runner/package.nix42
-rw-r--r--pkgs/by-name/gi/gitea/package.nix6
-rw-r--r--pkgs/by-name/gi/gitflow/package.nix41
-rw-r--r--pkgs/by-name/gi/gitfs/package.nix44
-rw-r--r--pkgs/by-name/gi/gitg/package.nix1
-rw-r--r--pkgs/by-name/gi/githooks/package.nix4
-rw-r--r--pkgs/by-name/gi/github-backup/package.nix39
-rw-r--r--pkgs/by-name/gi/github-commenter/package.nix23
-rw-r--r--pkgs/by-name/gi/github-copilot-cli/package-lock.json3329
-rw-r--r--pkgs/by-name/gi/github-copilot-cli/package.nix29
-rw-r--r--pkgs/by-name/gi/github-copilot-intellij-agent/package.nix82
-rw-r--r--pkgs/by-name/gi/github-desktop/package.nix7
-rw-r--r--pkgs/by-name/gi/github-markdown-toc-go/package.nix25
-rw-r--r--pkgs/by-name/gi/github-release/package.nix37
-rw-r--r--pkgs/by-name/gi/github-runner/package.nix235
-rw-r--r--pkgs/by-name/gi/gitit/package.nix42
-rw-r--r--pkgs/by-name/gi/gitjacker/package.nix44
-rw-r--r--pkgs/by-name/gi/gitkraken/package.nix254
-rw-r--r--pkgs/by-name/gi/gitlab-ci-ls/package.nix8
-rw-r--r--pkgs/by-name/gi/gitlab-clippy/package.nix31
-rw-r--r--pkgs/by-name/gi/gitlab-container-registry/package.nix34
-rw-r--r--pkgs/by-name/gi/gitlab-elasticsearch-indexer/package.nix26
-rw-r--r--pkgs/by-name/gi/gitlab-pages/package.nix26
-rw-r--r--pkgs/by-name/gi/gitlab-release-cli/package.nix6
-rw-r--r--pkgs/by-name/gi/gitlab-shell/package.nix38
-rw-r--r--pkgs/by-name/gi/gitlab-shell/remove-hardcoded-locations.patch48
-rw-r--r--pkgs/by-name/gi/gitlab-timelogs/package.nix2
-rw-r--r--pkgs/by-name/gi/gitleaks/package.nix62
-rw-r--r--pkgs/by-name/gi/gitless/package.nix40
-rw-r--r--pkgs/by-name/gi/gitls/package.nix35
-rw-r--r--pkgs/by-name/gi/gitnr/package.nix49
-rw-r--r--pkgs/by-name/gi/gitnuro/package.nix73
-rw-r--r--pkgs/by-name/gi/gitolite/package.nix54
-rw-r--r--pkgs/by-name/gi/gitopper/package.nix54
-rw-r--r--pkgs/by-name/gi/gitrs/package.nix42
-rw-r--r--pkgs/by-name/gi/gitsign/package.nix44
-rw-r--r--pkgs/by-name/gi/gitstats/package.nix67
-rw-r--r--pkgs/by-name/gi/gitstatus/package.nix129
-rw-r--r--pkgs/by-name/gi/gitstatus/romkatv_libgit2.nix29
-rw-r--r--pkgs/by-name/gi/gittuf/package.nix6
-rw-r--r--pkgs/by-name/gi/gitty/package.nix25
-rw-r--r--pkgs/by-name/gi/gitu/package.nix8
-rw-r--r--pkgs/by-name/gi/gitui/package.nix4
-rw-r--r--pkgs/by-name/gi/gitweb/package.nix27
-rw-r--r--pkgs/by-name/gi/gitxray/package.nix33
-rw-r--r--pkgs/by-name/gi/gixy/package.nix79
160 files changed, 10392 insertions, 191 deletions
diff --git a/pkgs/by-name/gi/gImageReader/package.nix b/pkgs/by-name/gi/gImageReader/package.nix
new file mode 100644
index 000000000000..742b14a15fcf
--- /dev/null
+++ b/pkgs/by-name/gi/gImageReader/package.nix
@@ -0,0 +1,71 @@
+{ lib, stdenv, fetchFromGitHub, cmake, pkg-config, libuuid
+, sane-backends, podofo, libjpeg, djvulibre, libxmlxx3, libzip, tesseract
+, intltool, poppler, json-glib
+, ninja
+, python3
+
+# Gtk deps
+# upstream gImagereader supports Qt too
+, gobject-introspection, wrapGAppsHook3
+, gtkmm3, gtksourceview3, gtksourceviewmm, gtkspell3, gtkspellmm, cairomm
+}:
+
+let
+  variant = "gtk";
+  pythonEnv = python3.withPackages( ps: with ps;[ pygobject3 ] );
+in
+stdenv.mkDerivation rec {
+  pname = "gImageReader";
+  version = "3.4.2";
+
+  src = fetchFromGitHub {
+    owner= "manisandro";
+    repo = "gImageReader";
+    rev = "v${version}";
+    sha256 = "sha256-yBkVeufRRoSAc20/8mV39widBPloHFz12K7B4Y9xiWg=";
+  };
+
+  nativeBuildInputs = [
+    cmake ninja
+    intltool
+    pkg-config
+    pythonEnv
+
+    # Gtk specific
+    wrapGAppsHook3
+    gobject-introspection
+  ];
+
+  buildInputs = [
+    libxmlxx3
+    libzip
+    libuuid
+    sane-backends
+    podofo
+    libjpeg
+    djvulibre
+    tesseract
+    poppler
+
+    # Gtk specific
+    gtkmm3
+    gtkspell3
+    gtkspellmm
+    gtksourceview3
+    gtksourceviewmm
+    cairomm
+    json-glib
+  ];
+
+  # interface type can be where <type> is either gtk, qt5, qt4
+  cmakeFlags = [ "-DINTERFACE_TYPE=${variant}" ];
+
+  meta = with lib; {
+    description = "Simple Gtk/Qt front-end to tesseract-ocr";
+    mainProgram = "gimagereader-gtk";
+    homepage = "https://github.com/manisandro/gImageReader";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [teto];
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/by-name/gi/gi-crystal/package.nix b/pkgs/by-name/gi/gi-crystal/package.nix
new file mode 100644
index 000000000000..d5c19a21662a
--- /dev/null
+++ b/pkgs/by-name/gi/gi-crystal/package.nix
@@ -0,0 +1,48 @@
+{ lib
+, fetchFromGitHub
+, crystal
+, gobject-introspection
+, gitUpdater
+}:
+crystal.buildCrystalPackage rec {
+  pname = "gi-crystal";
+  version = "0.22.2";
+
+  src = fetchFromGitHub {
+    owner = "hugopl";
+    repo = "gi-crystal";
+    rev = "v${version}";
+    hash = "sha256-JfBbKqobikpTGMryeO86zZ46EbOHybem+Cc5FZEL6i4=";
+  };
+
+  # Make sure gi-crystal picks up the name of the so or dylib and not the leading nix store path
+  # when the package name happens to start with “lib”.
+  patches = [ ./src.patch ./store-friendly-library-name.patch ];
+
+  nativeBuildInputs = [ gobject-introspection ];
+  buildTargets = [ "generator" ];
+
+  doCheck = false;
+  doInstallCheck = false;
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir $out
+    cp -r * $out
+
+    runHook postInstall
+  '';
+
+  passthru = {
+    updateScript = gitUpdater { rev-prefix = "v"; };
+  };
+
+
+  meta = with lib; {
+    description = "GI Crystal is a binding generator used to generate Crystal bindings for GObject based libraries using GObject Introspection";
+    homepage = "https://github.com/hugopl/gi-crystal";
+    mainProgram = "gi-crystal";
+    maintainers = with maintainers; [ sund3RRR ];
+  };
+}
diff --git a/pkgs/by-name/gi/gi-crystal/src.patch b/pkgs/by-name/gi/gi-crystal/src.patch
new file mode 100644
index 000000000000..eb18035f9941
--- /dev/null
+++ b/pkgs/by-name/gi/gi-crystal/src.patch
@@ -0,0 +1,57 @@
+--- a/src/generator/main.cr	2023-07-14 18:30:47.687581729 +0300
++++ b/src/generator/main.cr	2023-07-17 07:55:24.177630085 +0300
+@@ -1,6 +1,8 @@
+ require "colorize"
+ require "log"
+ require "option_parser"
++require "file"
++require "file_utils"
+ 
+ require "./binding_config"
+ require "./error"
+@@ -43,7 +45,7 @@
+     end
+   end
+ 
+-  output_dir = Path.new(project_dir, "lib/gi-crystal/src/auto").normalize if output_dir.nil?
++  output_dir = Path.new(Dir.current, "lib/gi-crystal/src/auto").normalize if output_dir.nil?
+   extra_bindings = argv.map { |path| Path.new(path).expand.to_s }
+ 
+   {output_dir:     output_dir,
+@@ -74,11 +76,23 @@
+   end
+ end
+ 
+-private def find_bindings : Array(String)
+-  find_pattern = Path.new(project_dir, "**/binding.yml").normalize
++private def find_bindings_yml(path) : Array(String)
++  find_pattern = File.join(path, "**/binding.yml")
+   Dir[find_pattern]
+ end
+ 
++private def find_bindings : Array(String)
++  current_directory = Dir.current
++
++  bindings = find_bindings_yml(current_directory)
++  Dir.glob(File.join(current_directory, "**/*")).each do |path|
++      if File.symlink?(path)
++        bindings += find_bindings_yml(path)
++      end
++  end
++  bindings
++end
++
+ private def format_files(dir)
+   # We need to chdir into output dir since the formatter ignores everything under `lib` dir.
+   Dir.cd(dir) { `crystal tool format` }
+@@ -102,7 +116,9 @@
+   Log.info { "Generating bindings at #{options[:output_dir]}" }
+ 
+   Generator::DocRepo.disable! unless options[:doc_gen]
+-
++  
++  FileUtils.cp_r(project_dir, File.join(Dir.current, "lib/gi-crystal"))
++  
+   binding_yamls = find_bindings.concat(options[:extra_bindings])
+   binding_yamls.each do |file|
+     Log.info { "Using binding config at #{file}" }
diff --git a/pkgs/by-name/gi/gi-crystal/store-friendly-library-name.patch b/pkgs/by-name/gi/gi-crystal/store-friendly-library-name.patch
new file mode 100644
index 000000000000..c6fd4e18c8db
--- /dev/null
+++ b/pkgs/by-name/gi/gi-crystal/store-friendly-library-name.patch
@@ -0,0 +1,10 @@
+--- a/src/generator/lib_gen.cr	1969-12-31 17:00:01.000000000 -0700
++++ b/src/generator/lib_gen.cr	2023-07-14 11:48:41.509397114 -0600
+@@ -10,7 +10,7 @@
+ 
+     private def libraries : Array(String)
+       namespace.shared_libraries.map do |library|
+-        library[/lib([^\/]+)\.(?:so|.+?\.dylib).*/, 1]
++        library[/(?:\/[^\/]*)+\/lib([^\/]+)\.(?:so|.+?\.dylib).*/, 1]
+       end
+     end
\ No newline at end of file
diff --git a/pkgs/by-name/gi/gi-docgen/package.nix b/pkgs/by-name/gi/gi-docgen/package.nix
new file mode 100644
index 000000000000..9d5da739745f
--- /dev/null
+++ b/pkgs/by-name/gi/gi-docgen/package.nix
@@ -0,0 +1,60 @@
+{ lib
+, fetchurl
+, meson
+, ninja
+, python3
+, gnome
+}:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "gi-docgen";
+  version = "2024.1";
+
+  format = "other";
+
+  src = fetchurl {
+    url = "mirror://gnome/sources/gi-docgen/${lib.versions.major version}/gi-docgen-${version}.tar.xz";
+    hash = "sha256-hwx3+WIEYszknjVUKkLcFhL8hYcz6D274kjFNUWK7B4=";
+  };
+
+  depsBuildBuild = [
+    python3
+  ];
+
+  nativeBuildInputs = [
+    meson
+    ninja
+  ];
+
+  pythonPath = with python3.pkgs; [
+    jinja2
+    markdown
+    markupsafe
+    packaging
+    pygments
+    toml # remove once python311 is the default
+    typogrify
+  ];
+
+  doCheck = false; # no tests
+
+  postFixup = ''
+    # Do not propagate Python
+    substituteInPlace $out/nix-support/propagated-build-inputs \
+      --replace "${python3}" ""
+  '';
+
+  passthru = {
+    updateScript = gnome.updateScript {
+      packageName = "gi-docgen";
+    };
+  };
+
+  meta = with lib; {
+    description = "Documentation generator for GObject-based libraries";
+    mainProgram = "gi-docgen";
+    homepage = "https://gitlab.gnome.org/GNOME/gi-docgen";
+    license = licenses.asl20; # OR GPL-3.0-or-later
+    maintainers = teams.gnome.members;
+  };
+}
diff --git a/pkgs/by-name/gi/giac/fix-fltk-guard.patch b/pkgs/by-name/gi/giac/fix-fltk-guard.patch
new file mode 100644
index 000000000000..a9c8e5bbaab8
--- /dev/null
+++ b/pkgs/by-name/gi/giac/fix-fltk-guard.patch
@@ -0,0 +1,28 @@
+From c7eafa2d7bde0d735b125912542acec2d5896c17 Mon Sep 17 00:00:00 2001
+From: George Huebner <george@feyor.sh>
+Date: Sat, 20 Jul 2024 02:31:20 -0500
+Subject: [PATCH 3/4] remove erroneous HAVE_LIBFLTK guard
+
+---
+ src/icas.cc | 4 ----
+ 1 file changed, 4 deletions(-)
+
+diff --git a/src/icas.cc b/src/icas.cc
+index f91885b..17a0373 100644
+--- a/src/icas.cc
++++ b/src/icas.cc
+@@ -2407,11 +2407,7 @@ int main(int ARGC, char *ARGV[]){
+ #ifdef __APPLE__
+       startc=clock();
+ #endif
+-#ifdef HAVE_LIBFLTK
+       xcas::icas_eval(gq,e,reading_file,filename,contextptr);
+-#else
+-      e=eval(gq,1,contextptr);
+-#endif
+ #ifdef __APPLE__
+       startc=clock()-startc;
+ #endif
+-- 
+2.44.1
+
diff --git a/pkgs/by-name/gi/giac/package.nix b/pkgs/by-name/gi/giac/package.nix
new file mode 100644
index 000000000000..ce009975c1ba
--- /dev/null
+++ b/pkgs/by-name/gi/giac/package.nix
@@ -0,0 +1,158 @@
+{ stdenv, lib, fetchurl, fetchpatch, texliveSmall, bison, flex, lapack, blas
+, autoreconfHook, gmp, mpfr, pari, ntl, gsl, mpfi, ecm, glpk, nauty
+, buildPackages, readline, gettext, libpng, libao, gfortran, perl
+, enableGUI ? false, libGL, libGLU, xorg, fltk
+, enableMicroPy ? false, python3
+}:
+
+assert (!blas.isILP64) && (!lapack.isILP64);
+
+stdenv.mkDerivation rec {
+  pname = "giac${lib.optionalString enableGUI "-with-xcas"}";
+  version = "1.9.0-993"; # TODO try to remove preCheck phase on upgrade
+
+  src = fetchurl {
+    url = "https://www-fourier.ujf-grenoble.fr/~parisse/debian/dists/stable/main/source/giac_${version}.tar.gz";
+    sha256 = "sha256-pqytFWrSWfEwQqRdRbaigGCq68s8mdgj2j8M+kclslE=";
+  };
+
+  patches = [
+    ./remove-old-functional-patterns.patch
+    ./fix-fltk-guard.patch
+
+    (fetchpatch {
+      name = "pari_2_15.patch";
+      url = "https://raw.githubusercontent.com/sagemath/sage/07a2afd65fb4b0a1c9cbc43ede7d4a18c921a000/build/pkgs/giac/patches/pari_2_15.patch";
+      sha256 = "sha256-Q3xBFED7XEAyNz6AHjzt63XtospmdGAIdS6iPq1C2UE=";
+    })
+
+    (fetchpatch {
+      name = "infinity.patch";
+      url = "https://github.com/geogebra/giac/commit/851c2cd91e879c79d6652f8a5d5bed03b65c6d39.patch";
+      sha256 = "sha256-WJRT2b8I9kgAkRuIugMiXoF4hT7yR7qyad8A6IspNTM=";
+      stripLen = 5;
+      extraPrefix = "/src/";
+      excludes = [ "src/kdisplay.cc" ];
+    })
+
+    # giac calls scanf/printf with non-constant first arguments, which
+    # the compiler rightfully warns about (with an error nowadays).
+    (fetchpatch {
+      name = "fix-string-compiler-error.patch";
+      url = "https://salsa.debian.org/science-team/giac/-/raw/9ca8dbf4bb16d9d96948aa4024326d32485d7917/debian/patches/fix-string-compiler-error.patch";
+      sha256 = "sha256-r+M+9MRPRqhHcdhYWI6inxyNvWbXUbBcPCeDY7aulvk=";
+    })
+
+    # issue with include path precedence
+    (fetchpatch {
+      name = "fix_implicit_declaration.patch";
+      url = "https://salsa.debian.org/science-team/giac/-/raw/c05ae9b9e74d3c6ee6411d391071989426a76201/debian/patches/fix_implicit_declaration.patch";
+      sha256 = "sha256-ompUceYJLiL0ftfjBkIMcYvX1YqG2/XA7e1yDyFY0IY=";
+    })
+  ] ++ lib.optionals (!enableGUI) [
+    # when enableGui is false, giac is compiled without fltk. That
+    # means some outputs differ in the make check. Patch around this:
+    (fetchpatch {
+      name = "nofltk-check.patch";
+      url = "https://raw.githubusercontent.com/sagemath/sage/7553a3c8dfa7bcec07241a07e6a4e7dcf5bb4f26/build/pkgs/giac/patches/nofltk-check.patch";
+      sha256 = "sha256-nAl5q3ufLjK3X9s0qMlGNowdRRf3EaC24eVtJABzdXY=";
+    })
+  ];
+
+  # 1.9.0-5's tarball contains a binary (src/mkjs) which is executed
+  # at build time. we will delete and rebuild it.
+  depsBuildBuild = [ buildPackages.stdenv.cc ];
+
+  postPatch = ''
+    for i in doc/*/Makefile* micropython*/xcas/Makefile*; do
+      substituteInPlace "$i" --replace "/bin/cp" "cp";
+    done;
+    rm src/mkjs
+    substituteInPlace src/Makefile.am --replace "g++ mkjs.cc" \
+      "${buildPackages.stdenv.cc.targetPrefix}c++ mkjs.cc"
+
+    # to open help
+    substituteInPlace src/global.cc --replace 'browser="mozilla"' 'browser="xdg-open"'
+  '';
+
+  nativeBuildInputs = [
+    autoreconfHook texliveSmall bison flex
+  ];
+
+  # perl is only needed for patchShebangs fixup.
+  buildInputs = [
+    gmp mpfr pari ntl gsl blas mpfi glpk nauty
+    readline gettext libpng libao perl ecm
+    # gfortran.cc default output contains static libraries compiled without -fPIC
+    # we want libgfortran.so.3 instead
+    (lib.getLib gfortran.cc)
+    lapack blas
+  ] ++ lib.optionals enableGUI [
+    libGL libGLU fltk xorg.libX11
+  ] ++ lib.optional enableMicroPy python3;
+
+  # xcas Phys and Turtle menus are broken with split outputs
+  # and interactive use is likely to need docs
+  outputs = [ "out" ] ++ lib.optional (!enableGUI) "doc";
+
+  doCheck = true;
+  preCheck = lib.optionalString (!enableGUI) ''
+    # even with the nofltk patch, some changes in src/misc.cc (grep
+    # for HAVE_LIBFLTK) made it so that giac behaves differently
+    # when fltk is disabled. disable these tests for now.
+    echo > check/chk_fhan2
+    echo > check/chk_fhan9
+  '' + lib.optionalString (stdenv.hostPlatform.isDarwin) ''
+    # these cover a known regression in giac, likely due to how pari state
+    # is shared between multiple giac instances (see pari.cc.old).
+    # see https://github.com/NixOS/nixpkgs/pull/264126 for more information
+    echo > check/chk_fhan4
+    echo > check/chk_fhan6
+  '';
+
+  enableParallelBuilding = true;
+
+  configureFlags = [
+    "--enable-gc" "--enable-png" "--enable-gsl" "--enable-lapack"
+    "--enable-pari" "--enable-ntl" "--enable-gmpxx" # "--enable-cocoa"
+    "--enable-ao" "--enable-ecm" "--enable-glpk"
+  ] ++ lib.optionals enableGUI [
+    "--enable-gui" "--with-x"
+  ] ++ lib.optionals stdenv.hostPlatform.isDarwin [
+    "--disable-nls"
+  ] ++ lib.optionals (!enableGUI) [
+    "--disable-fltk"
+  ] ++ lib.optionals (!enableMicroPy) [
+    "--disable-micropy"
+  ];
+
+  postInstall = ''
+    # example Makefiles contain the full path to some commands
+    # notably texlive, and we don't want texlive to become a runtime
+    # dependency
+    for file in $(find $out -name Makefile) ; do
+      sed -i "s@${builtins.storeDir}/[^/]*/bin/@@" "$file" ;
+    done;
+
+    # reference cycle
+    rm "$out/share/giac/doc/el/"{casinter,tutoriel}/Makefile
+
+    if [ -n "$doc" ]; then
+      mkdir -p "$doc/share/giac"
+      mv "$out/share/giac/doc" "$doc/share/giac"
+      mv "$out/share/giac/examples" "$doc/share/giac"
+    fi
+  '' + lib.optionalString (!enableGUI) ''
+    for i in pixmaps application-registry applications icons; do
+      rm -r "$out/share/$i";
+    done;
+  '';
+
+  meta = with lib; {
+    description = "Free computer algebra system (CAS)";
+    homepage = "https://www-fourier.ujf-grenoble.fr/~parisse/giac.html";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux ++ (optionals (!enableGUI) platforms.darwin);
+    maintainers = [ maintainers.symphorien ];
+  };
+}
diff --git a/pkgs/by-name/gi/giac/remove-old-functional-patterns.patch b/pkgs/by-name/gi/giac/remove-old-functional-patterns.patch
new file mode 100644
index 000000000000..95f6efe119fc
--- /dev/null
+++ b/pkgs/by-name/gi/giac/remove-old-functional-patterns.patch
@@ -0,0 +1,294 @@
+From f1c5309d5b815acc2616cd9fbb5182b1e64d225f Mon Sep 17 00:00:00 2001
+From: George Huebner <george@feyor.sh>
+Date: Wed, 17 Jul 2024 18:12:36 -0500
+Subject: [PATCH 1/4] remove old <functional> patterns
+
+pointer_to_binary_function and ptr_fun are holdovers from pre c++11,
+and can be replaced or entirely removed. This allows Giac to compile
+with Clang 16>=.
+---
+ src/all_global_var |  2 +-
+ src/gausspol.cc    |  2 +-
+ src/gausspol.h     |  2 +-
+ src/gen.cc         |  2 +-
+ src/gen.h          |  4 ++--
+ src/maple.cc       |  2 +-
+ src/monomial.h     | 16 ++++++++--------
+ src/plot.cc        |  2 +-
+ src/poly.h         | 17 +++++++++--------
+ src/solve.cc       | 18 +++++++++---------
+ src/usual.cc       |  2 +-
+ 11 files changed, 35 insertions(+), 34 deletions(-)
+
+diff --git a/src/all_global_var b/src/all_global_var
+index 7d75d73..55f4782 100644
+--- a/src/all_global_var
++++ b/src/all_global_var
+@@ -16,7 +16,7 @@ Relatif a l'evaluation du tableur
+ // File Eqw.cc
+   vector<string> completion_tab;
+ // File alg_ext.cc
+-  rootmap symbolic_rootof_list(ptr_fun(islesscomplex));
++  rootmap symbolic_rootof_list(islesscomplex);
+ // File derive.cc
+ // File desolve.cc
+   identificateur laplace_var(" s");
+diff --git a/src/gausspol.cc b/src/gausspol.cc
+index 8fbd581..2f2121f 100644
+--- a/src/gausspol.cc
++++ b/src/gausspol.cc
+@@ -855,7 +855,7 @@ namespace giac {
+ 		 std::vector< monomial<gen> >::const_iterator & itb_end,
+ 		 std::vector< monomial<gen> > & new_coord,
+ 		 bool (* is_strictly_greater)( const index_m &, const index_m &),
+-		 const std::pointer_to_binary_function < const monomial<gen> &, const monomial<gen> &, bool> m_is_strictly_greater
++		 const std::function<bool(const monomial<gen> &, const monomial<gen> &)> m_is_strictly_greater
+ 	     ) {
+     if (ita==ita_end || itb==itb_end){
+       new_coord.clear();
+diff --git a/src/gausspol.h b/src/gausspol.h
+index b5d214b..e6c7e0c 100644
+--- a/src/gausspol.h
++++ b/src/gausspol.h
+@@ -93,7 +93,7 @@ namespace giac {
+ 		 std::vector< monomial<gen> >::const_iterator & itb_end,
+ 		 std::vector< monomial<gen> > & new_coord,
+ 		 bool (* is_strictly_greater)( const index_t &, const index_t &),
+-		 const std::pointer_to_binary_function < const monomial<gen> &, const monomial<gen> &, bool> m_is_greater
++         const std::function<bool(const monomial<gen> &, const monomial<gen> &)> m_is_greater
+ 		 ) ;
+   void mulpoly(const polynome & th,const gen & fact,polynome & res);
+   polynome operator * (const polynome & th, const gen & fact) ;
+diff --git a/src/gen.cc b/src/gen.cc
+index 7d4874c..0b64afe 100644
+--- a/src/gen.cc
++++ b/src/gen.cc
+@@ -1126,7 +1126,7 @@ namespace giac {
+ #if 1 // def NSPIRE
+       g.__MAPptr = new ref_gen_map;
+ #else
+-    g.__MAPptr = new ref_gen_map(ptr_fun(islesscomplexthanf));
++    g.__MAPptr = new ref_gen_map(islesscomplexthanf);
+ #endif
+ #endif
+     g.type=_MAP;
+diff --git a/src/gen.h b/src/gen.h
+index 04d70af..496b25d 100644
+--- a/src/gen.h
++++ b/src/gen.h
+@@ -443,7 +443,7 @@ namespace giac {
+   };
+   typedef std::map<gen,gen,comparegen> gen_map;
+ #else
+-  typedef std::map<gen,gen,const std::pointer_to_binary_function < const gen &, const gen &, bool> > gen_map;
++    typedef std::map<gen,gen,const std::function<bool(const gen &, const gen &)> > gen_map;
+ #endif
+   struct ref_gen_map;
+ 
+@@ -902,7 +902,7 @@ namespace giac {
+ #if 1 // def NSPIRE
+     ref_gen_map(): ref_count(1),m() {}
+ #else
+-    ref_gen_map(const std::pointer_to_binary_function < const gen &, const gen &, bool> & p): ref_count(1),m(p) {}
++    ref_gen_map(const std::function<bool(const gen &, const gen &)> & p): ref_count(1),m(p) {}
+ #endif
+     ref_gen_map(const gen_map & M):ref_count(1),m(M) {}
+   };
+diff --git a/src/maple.cc b/src/maple.cc
+index 3b33da8..d57a170 100644
+--- a/src/maple.cc
++++ b/src/maple.cc
+@@ -3626,7 +3626,7 @@ namespace giac {
+ #if 1 // def NSPIRE
+     gen_map m;
+ #else
+-    gen_map m(ptr_fun(islessthanf));
++    gen_map m(islessthanf);
+ #endif
+     int s=int(args.size());
+     vector<int> indexbegin,indexsize;
+diff --git a/src/monomial.h b/src/monomial.h
+index 6e606d0..637a76c 100644
+--- a/src/monomial.h
++++ b/src/monomial.h
+@@ -338,9 +338,9 @@ namespace giac {
+ 
+   template<class T> class sort_helper {
+   public:
+-    std::pointer_to_binary_function < const monomial<T> &, const monomial<T> &, bool> strictly_greater ;
+-    sort_helper(const std::pointer_to_binary_function < const monomial<T> &, const monomial<T> &, bool> is_strictly_greater):strictly_greater(is_strictly_greater) {};
+-    sort_helper():strictly_greater(std::ptr_fun<const monomial<T> &, const monomial<T> &, bool>(m_lex_is_strictly_greater<T>)) {};
++    std::function<bool(const monomial<T> &, const monomial<T> &)> strictly_greater ;
++      sort_helper(const std::function<bool(const monomial<T> &, const monomial<T> &)> is_strictly_greater):strictly_greater(is_strictly_greater) {};
++    sort_helper():strictly_greater(m_lex_is_strictly_greater<T>) {};
+     bool operator () (const monomial<T> & a, const monomial<T> & b){ return strictly_greater(a,b);}
+   };
+ 
+@@ -677,7 +677,7 @@ namespace giac {
+ 	     typename std::vector< monomial<T> >::const_iterator & itb_end,
+ 	     std::vector< monomial<T> > & new_coord,
+ 	     bool (* is_strictly_greater)( const index_m &, const index_m &),
+-	     const std::pointer_to_binary_function < const monomial<T> &, const monomial<T> &, bool> m_is_strictly_greater
++	     const std::function<bool(const monomial<T> &, const monomial<T> &)> m_is_strictly_greater
+ 	     ) {
+     if (ita==ita_end || itb==itb_end){
+       new_coord.clear();
+@@ -726,8 +726,8 @@ namespace giac {
+ #endif
+ #ifndef NSPIRE
+     /* other algorithm using a map to avoid reserving too much space */
+-    typedef std::map< index_t,T,const std::pointer_to_binary_function < const index_m &, const index_m &, bool> > application;
+-    application produit(std::ptr_fun(is_strictly_greater));
++    typedef std::map< index_t,T,const std::function<bool(const index_m &, const index_m &)> > application;
++    application produit(is_strictly_greater);
+     // typedef std::map<index_t,T> application;
+     // application produit;
+     index_t somme(ita->index.size());
+@@ -848,7 +848,7 @@ namespace giac {
+     typename std::vector< monomial<T> >::const_iterator a=v.begin(), a_end=v.end();
+     typename std::vector< monomial<T> >::const_iterator b=w.begin(), b_end=w.end();
+     std::vector< monomial<T> > res;
+-    Mul(a,a_end,b,b_end,res,i_lex_is_strictly_greater,std::ptr_fun< const monomial<T> &, const monomial<T> &, bool >((m_lex_is_strictly_greater<T>)));
++    Mul(a,a_end,b,b_end,res,i_lex_is_strictly_greater,m_lex_is_strictly_greater<T>);
+     return res ;
+   }
+ 
+@@ -856,7 +856,7 @@ namespace giac {
+   std::vector< monomial<T> > & operator *= (std::vector< monomial<T> > & v,const std::vector< monomial<T> > & w){
+     typename std::vector< monomial<T> >::const_iterator a=v.begin(), a_end=v.end();
+     typename std::vector< monomial<T> >::const_iterator b=w.begin(), b_end=w.end();
+-    Mul(a,a_end,b,b_end,v,i_lex_is_strictly_greater,std::ptr_fun< const monomial<T> &, const monomial<T> &, bool >((m_lex_is_strictly_greater<T>)));
++    Mul(a,a_end,b,b_end,v,i_lex_is_strictly_greater,m_lex_is_strictly_greater<T>);
+     return v;
+   }
+ 
+diff --git a/src/plot.cc b/src/plot.cc
+index 288a1b5..ac85c9a 100755
+--- a/src/plot.cc
++++ b/src/plot.cc
+@@ -11886,7 +11886,7 @@ static vecteur densityscale(double xmin,double xmax,double ymin,double ymax,doub
+ #if 1 // def NSPIRE
+     gen_map m;
+ #else
+-    gen_map m(ptr_fun(islesscomplexthanf));
++    gen_map m(islesscomplexthanf);
+ #endif
+     int taille;
+     is >> taille;
+diff --git a/src/poly.h b/src/poly.h
+index 7d64e2c..d9ff991 100644
+--- a/src/poly.h
++++ b/src/poly.h
+@@ -40,23 +40,24 @@ namespace giac {
+     // T zero;
+     // functional object sorting function for monomial ordering
+     bool (* is_strictly_greater)( const index_m &, const index_m &);
+-    std::pointer_to_binary_function < const monomial<T> &, const monomial<T> &, bool> m_is_strictly_greater ;
++    std::function<bool(const monomial<T> &, const monomial<T> &)> m_is_strictly_greater ;
+     // constructors
+     tensor(const tensor<T> & t) : dim(t.dim), coord(t.coord), is_strictly_greater(t.is_strictly_greater), m_is_strictly_greater(t.m_is_strictly_greater) { }
+     tensor(const tensor<T> & t, const std::vector< monomial<T> > & v) : dim(t.dim), coord(v), is_strictly_greater(t.is_strictly_greater), m_is_strictly_greater(t.m_is_strictly_greater) { }
+     // warning: this constructor prohibits construction of tensor from a value
+     // of type T if this value is an int, except by using tensor<T>(T(int))
+-    tensor() : dim(0), is_strictly_greater(i_lex_is_strictly_greater), m_is_strictly_greater(std::ptr_fun<const monomial<T> &, const monomial<T> &, bool>(m_lex_is_strictly_greater<T>)) { }
+-    explicit tensor(int d) : dim(d), is_strictly_greater(i_lex_is_strictly_greater), m_is_strictly_greater(std::ptr_fun<const monomial<T> &, const monomial<T> &, bool>(m_lex_is_strictly_greater<T>)) { }
++    // DANGER
++    tensor() : dim(0), is_strictly_greater(i_lex_is_strictly_greater), m_is_strictly_greater(m_lex_is_strictly_greater<T>) { }
++    explicit tensor(int d) : dim(d), is_strictly_greater(i_lex_is_strictly_greater), m_is_strictly_greater(m_lex_is_strictly_greater<T>) { }
+     explicit tensor(int d,const tensor<T> & t) : dim(d),is_strictly_greater(t.is_strictly_greater), m_is_strictly_greater(t.m_is_strictly_greater)  { }
+-    tensor(const monomial<T> & v) : dim(int(v.index.size())), is_strictly_greater(i_lex_is_strictly_greater), m_is_strictly_greater(std::ptr_fun<const monomial<T> &, const monomial<T> &, bool>(m_lex_is_strictly_greater<T>)) { 
++    tensor(const monomial<T> & v) : dim(int(v.index.size())), is_strictly_greater(i_lex_is_strictly_greater), m_is_strictly_greater(m_lex_is_strictly_greater<T>) { 
+       coord.push_back(v);
+     }
+-    tensor(const T & v, int d) : dim(d), is_strictly_greater(i_lex_is_strictly_greater), m_is_strictly_greater(std::ptr_fun<const monomial<T> &, const monomial<T> &, bool>(m_lex_is_strictly_greater<T>)) {
++    tensor(const T & v, int d) : dim(d), is_strictly_greater(i_lex_is_strictly_greater), m_is_strictly_greater(m_lex_is_strictly_greater<T>) {
+       if (!is_zero(v))
+ 	coord.push_back(monomial<T>(v,0,d));
+     }
+-    tensor(int d,const std::vector< monomial<T> > & c) : dim(d), coord(c), is_strictly_greater(i_lex_is_strictly_greater),m_is_strictly_greater(std::ptr_fun<const monomial<T> &, const monomial<T> &, bool>(m_lex_is_strictly_greater<T>)) { }
++    tensor(int d,const std::vector< monomial<T> > & c) : dim(d), coord(c), is_strictly_greater(i_lex_is_strictly_greater),m_is_strictly_greater(m_lex_is_strictly_greater<T>) { }
+     ~tensor() { coord.clear(); }
+     // member functions
+     // ordering monomials in the tensor
+@@ -519,10 +520,10 @@ namespace giac {
+   template <class T>
+   void lexsort(std::vector < monomial<T> > & v){
+ #if 1 // def NSPIRE
+-    sort_helper<T> M(std::ptr_fun<const monomial<T> &, const monomial<T> &, bool>(m_lex_is_strictly_greater<T>));
++    sort_helper<T> M(m_lex_is_strictly_greater<T>);
+     sort(v.begin(),v.end(),M);
+ #else
+-    sort(v.begin(),v.end(),std::ptr_fun<const monomial<T> &, const monomial<T> &, bool>(m_lex_is_strictly_greater<T>));
++    sort(v.begin(),v.end(),m_lex_is_strictly_greater<T>);
+ #endif
+   }
+ 
+diff --git a/src/solve.cc b/src/solve.cc
+index 889f824..2a51ab8 100755
+--- a/src/solve.cc
++++ b/src/solve.cc
+@@ -8684,39 +8684,39 @@ namespace giac {
+     switch (order.val){
+     case _PLEX_ORDER: 
+       p.is_strictly_greater=i_lex_is_strictly_greater;
+-      p.m_is_strictly_greater=std::ptr_fun(m_lex_is_strictly_greater<gen>);
++      p.m_is_strictly_greater=m_lex_is_strictly_greater<gen>;
+       break;
+     case _REVLEX_ORDER: 
+       p.is_strictly_greater=i_total_revlex_is_strictly_greater;
+-      p.m_is_strictly_greater=std::ptr_fun(m_total_revlex_is_strictly_greater<gen>);
++      p.m_is_strictly_greater=m_total_revlex_is_strictly_greater<gen>;
+       break;
+     case _TDEG_ORDER:
+       p.is_strictly_greater=i_total_lex_is_strictly_greater;
+-      p.m_is_strictly_greater=std::ptr_fun(m_total_lex_is_strictly_greater<gen>);
++      p.m_is_strictly_greater=m_total_lex_is_strictly_greater<gen>;
+       break;
+     case _3VAR_ORDER:
+       p.is_strictly_greater=i_3var_is_strictly_greater;
+-      p.m_is_strictly_greater=std::ptr_fun(m_3var_is_strictly_greater<gen>);
++      p.m_is_strictly_greater=m_3var_is_strictly_greater<gen>;
+       break;      
+     case _7VAR_ORDER:
+       p.is_strictly_greater=i_7var_is_strictly_greater;
+-      p.m_is_strictly_greater=std::ptr_fun(m_7var_is_strictly_greater<gen>);
++      p.m_is_strictly_greater=m_7var_is_strictly_greater<gen>;
+       break;      
+     case _11VAR_ORDER:
+       p.is_strictly_greater=i_11var_is_strictly_greater;
+-      p.m_is_strictly_greater=std::ptr_fun(m_11var_is_strictly_greater<gen>);
++      p.m_is_strictly_greater=m_11var_is_strictly_greater<gen>;
+       break;      
+     case _16VAR_ORDER:
+       p.is_strictly_greater=i_16var_is_strictly_greater;
+-      p.m_is_strictly_greater=std::ptr_fun(m_16var_is_strictly_greater<gen>);
++      p.m_is_strictly_greater=m_16var_is_strictly_greater<gen>;
+       break;      
+     case _32VAR_ORDER:
+       p.is_strictly_greater=i_32var_is_strictly_greater;
+-      p.m_is_strictly_greater=std::ptr_fun(m_32var_is_strictly_greater<gen>);
++      p.m_is_strictly_greater=m_32var_is_strictly_greater<gen>;
+       break;      
+     case _64VAR_ORDER:
+       p.is_strictly_greater=i_64var_is_strictly_greater;
+-      p.m_is_strictly_greater=std::ptr_fun(m_64var_is_strictly_greater<gen>);
++      p.m_is_strictly_greater=m_64var_is_strictly_greater<gen>;
+       break;      
+     }
+     p.tsort();
+diff --git a/src/usual.cc b/src/usual.cc
+index fddede6..eb7ae5e 100755
+--- a/src/usual.cc
++++ b/src/usual.cc
+@@ -5950,7 +5950,7 @@ namespace giac {
+ #if 1 // def NSPIRE
+     gen_map m;
+ #else
+-    gen_map m(ptr_fun(islesscomplexthanf));
++    gen_map m(islesscomplexthanf);
+ #endif
+     for (;it!=itend;++it){
+       if (is_equal(*it) || it->is_symb_of_sommet(at_deuxpoints)){
+-- 
+2.44.1
+
diff --git a/pkgs/by-name/gi/giada/package.nix b/pkgs/by-name/gi/giada/package.nix
new file mode 100644
index 000000000000..2880bce40f8b
--- /dev/null
+++ b/pkgs/by-name/gi/giada/package.nix
@@ -0,0 +1,77 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+, pkg-config
+, fltk
+, fmt
+, rtmidi
+, libsamplerate
+, libmpg123
+, libsndfile
+, jack2
+, alsa-lib
+, libpulseaudio
+, libXpm
+, libXrandr
+, flac
+, libogg
+, libvorbis
+, libopus
+, nlohmann_json
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "giada";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "monocasual";
+    repo = "giada";
+    rev = finalAttrs.version;
+    hash = "sha256-vTOUS9mI4B3yRNnM2dNCH7jgMuD3ztdhe1FMgXUIt58=";
+    fetchSubmodules = true;
+  };
+
+  env.NIX_CFLAGS_COMPILE = toString [
+    "-w"
+    "-Wno-error"
+  ];
+
+  cmakeFlags = [
+    "-DCMAKE_INSTALL_BINDIR=bin"
+  ];
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+  ];
+
+  buildInputs = [
+    rtmidi
+    fltk
+    fmt
+    libmpg123
+    libsndfile
+    libsamplerate
+    nlohmann_json
+    alsa-lib
+    libXpm
+    libpulseaudio
+    jack2
+    flac
+    libogg
+    libvorbis
+    libopus
+    libXrandr
+  ];
+
+  meta = {
+    description = "Free, minimal, hardcore audio tool for DJs, live performers and electronic musicians";
+    mainProgram = "giada";
+    homepage = "https://giadamusic.com/";
+    license = lib.licenses.gpl3;
+    maintainers = with lib.maintainers; [ kashw2 ];
+    platforms = lib.platforms.all;
+  };
+})
diff --git a/pkgs/by-name/gi/giara/package.nix b/pkgs/by-name/gi/giara/package.nix
new file mode 100644
index 000000000000..110d5c04767a
--- /dev/null
+++ b/pkgs/by-name/gi/giara/package.nix
@@ -0,0 +1,77 @@
+{ lib
+, fetchFromGitLab
+, meson
+, gobject-introspection
+, pkg-config
+, ninja
+, python3
+, wrapGAppsHook4
+, gtk4
+, gdk-pixbuf
+, webkitgtk_4_0
+, gtksourceview5
+, glib-networking
+, libadwaita
+, appstream
+, blueprint-compiler
+}:
+python3.pkgs.buildPythonApplication rec {
+  pname = "giara";
+  version = "1.1.0";
+
+  format = "other";
+
+  src = fetchFromGitLab {
+    domain = "gitlab.gnome.org";
+    owner = "World";
+    repo = pname;
+    rev = version;
+    hash = "sha256-FTy0ElcoTGXG9eV85pUrF35qKDKOfYIovPtjLfTJVOg=";
+  };
+
+  nativeBuildInputs = [
+    appstream
+    meson
+    gobject-introspection
+    pkg-config
+    ninja
+    wrapGAppsHook4
+    blueprint-compiler
+  ];
+
+  buildInputs = [
+    gtk4
+    gdk-pixbuf
+    webkitgtk_4_0
+    gtksourceview5
+    glib-networking
+    libadwaita
+  ];
+
+  pythonPath = with python3.pkgs; [
+    pygobject3
+    pycairo
+    python-dateutil
+    praw
+    pillow
+    mistune
+    beautifulsoup4
+  ];
+
+  postPatch = ''
+    substituteInPlace meson_post_install.py \
+      --replace "gtk-update-icon-cache" "gtk4-update-icon-cache"
+    # blueprint-compiler expects "profile" to be a string.
+    substituteInPlace data/ui/headerbar.blp \
+      --replace "item { custom: profile; }" 'item { custom: "profile"; }'
+  '';
+
+  meta = with lib; {
+    description = "Reddit app, built with Python, GTK and Handy; Created with mobile Linux in mind";
+    maintainers = with maintainers; [ dasj19 ];
+    homepage = "https://gitlab.gnome.org/World/giara";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    mainProgram = "giara";
+  };
+}
diff --git a/pkgs/by-name/gi/gibo/package.nix b/pkgs/by-name/gi/gibo/package.nix
new file mode 100644
index 000000000000..d037059fd4e3
--- /dev/null
+++ b/pkgs/by-name/gi/gibo/package.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, fetchFromGitHub, coreutils, findutils, git }:
+
+stdenv.mkDerivation rec {
+  pname = "gibo";
+  version = "1.0.6";
+
+  src = fetchFromGitHub {
+    owner = "simonwhitaker";
+    repo = "gibo";
+    rev = version;
+    sha256 = "07j3sv9ar9l074krajw8nfmsfmdp836irsbd053dbqk2v880gfm6";
+  };
+
+  installPhase = ''
+    mkdir -p $out/bin $out/share/bash-completion/completions
+    cp gibo $out/bin
+    cp gibo-completion.bash $out/share/bash-completion/completions
+
+    sed -e 's|\<git |${git}/bin/git |g' \
+        -e 's|\<basename |${coreutils}/bin/basename |g' \
+        -i "$out/bin/gibo"
+    sed -e 's|\<find |${findutils}/bin/find |g' \
+        -i "$out/share/bash-completion/completions/gibo-completion.bash"
+  '';
+
+  meta = {
+    homepage = "https://github.com/simonwhitaker/gibo";
+    license = lib.licenses.publicDomain;
+    description = "Shell script for easily accessing gitignore boilerplates";
+    platforms = lib.platforms.unix;
+    mainProgram = "gibo";
+  };
+}
diff --git a/pkgs/by-name/gi/gif-for-cli/package.nix b/pkgs/by-name/gi/gif-for-cli/package.nix
new file mode 100644
index 000000000000..3a2ad84a4430
--- /dev/null
+++ b/pkgs/by-name/gi/gif-for-cli/package.nix
@@ -0,0 +1,56 @@
+{ lib
+, fetchFromGitHub
+, fetchpatch
+, python3Packages
+, ffmpeg
+, zlib
+, libjpeg
+}:
+
+python3Packages.buildPythonApplication {
+  pname = "gif-for-cli";
+  version = "1.1.2";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = "gif-for-cli";
+    rev = "31f8aa2d617d6d6e941154f60e287c38dd9a74d5";
+    hash = "sha256-Bl5o492BUAn1KsscnlMIXCzJuy7xWUsdnxIKZKaRM3M=";
+  };
+
+  patches = [
+    # https://github.com/google/gif-for-cli/pull/36
+    (fetchpatch {
+      name = "pillow-10-compatibility.patch";
+      url = "https://github.com/google/gif-for-cli/commit/49b13ec981e197cbc10f920b7b25a97c4cc6a61c.patch";
+      hash = "sha256-B8wfkdhSUY++St6DzgaJ1xF1mZKvi8oxLXbo63yemDM=";
+    })
+  ];
+
+  # coverage is not needed to build and test this package
+  postPatch = ''
+    sed -i '/coverage>=/d' setup.py
+  '';
+
+  buildInputs = [
+    zlib
+    libjpeg
+  ];
+
+  propagatedBuildInputs = with python3Packages; [
+    ffmpeg
+    pillow
+    requests
+    x256
+  ];
+
+  meta = with lib; {
+    description = "Render gifs as ASCII art in your cli";
+    longDescription = "Takes in a GIF, short video, or a query to the Tenor GIF API and converts it to animated ASCII art.";
+    homepage = "https://github.com/google/gif-for-cli";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ Scriptkiddi ];
+    mainProgram = "gif-for-cli";
+  };
+}
diff --git a/pkgs/by-name/gi/gif2apng/package.nix b/pkgs/by-name/gi/gif2apng/package.nix
new file mode 100644
index 000000000000..1a824e14a5a3
--- /dev/null
+++ b/pkgs/by-name/gi/gif2apng/package.nix
@@ -0,0 +1,69 @@
+{ lib
+, stdenv
+, fetchzip
+, fetchpatch
+, zlib
+, zopfli
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gif2apng";
+  version = "1.9";
+
+  src = fetchzip {
+    url = "mirror://sourceforge/gif2apng/gif2apng-${version}-src.zip";
+    stripRoot = false;
+    hash = "sha256-rt1Vp4hjeFAVWJOU04BdU2YvBwECe9Q1c7EpNpIN+uE=";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://sources.debian.org/data/main/g/gif2apng/1.9%2Bsrconly-3%2Bdeb11u1/debian/patches/10-7z.patch";
+      hash = "sha256-zQgSWP/CIGaTUIxP/X92zpAQVSGgVo8gQEoCCMn+XT0=";
+    })
+    (fetchpatch {
+      url = "https://sources.debian.org/data/main/g/gif2apng/1.9%2Bsrconly-3%2Bdeb11u1/debian/patches/CVE-2021-45909.patch";
+      hash = "sha256-ZDN3xgvktgahDEtrEpyVsL+4u+97Fo9vAB1RSKhu8KA=";
+    })
+    (fetchpatch {
+      url = "https://sources.debian.org/data/main/g/gif2apng/1.9%2Bsrconly-3%2Bdeb11u1/debian/patches/CVE-2021-45910.patch";
+      hash = "sha256-MzOUOC7kqH22DmTMXoDu+jZAMBJPndnFNJGAQv5FcdI=";
+    })
+    (fetchpatch {
+      url = "https://sources.debian.org/data/main/g/gif2apng/1.9%2Bsrconly-3%2Bdeb11u1/debian/patches/CVE-2021-45911.patch";
+      hash = "sha256-o2YDHsSaorCx/6bQQfudzkLHo9pakgyvs2Pbafplnek=";
+    })
+  ];
+
+  # Remove bundled libs
+  postPatch = ''
+    rm -r 7z zlib zopfli
+  '';
+
+  buildInputs = [
+    zlib
+    zopfli
+  ];
+
+  preBuild = ''
+    buildFlagsArray+=("LIBS=-lzopfli -lstdc++ -lz")
+  '';
+
+  makeFlags = [ "CC=${stdenv.cc.targetPrefix}c++" ];
+
+  NIX_CFLAGS_COMPILE="-DENABLE_LOCAL_ZOPFLI";
+
+  installPhase = ''
+    runHook preInstall
+    install -Dm755 gif2apng $out/bin/gif2apng
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    homepage = "https://gif2apng.sourceforge.net/";
+    description = "Simple program that converts animations from GIF to APNG format";
+    license = licenses.zlib;
+    maintainers = with maintainers; [ fgaz ];
+    platforms = platforms.all;
+  };
+}
diff --git a/pkgs/by-name/gi/giflib/CVE-2021-40633.patch b/pkgs/by-name/gi/giflib/CVE-2021-40633.patch
new file mode 100644
index 000000000000..8a665bb1638b
--- /dev/null
+++ b/pkgs/by-name/gi/giflib/CVE-2021-40633.patch
@@ -0,0 +1,26 @@
+From ccbc956432650734c91acb3fc88837f7b81267ff Mon Sep 17 00:00:00 2001
+From: "Eric S. Raymond" <esr@thyrsus.com>
+Date: Wed, 21 Feb 2024 18:55:00 -0500
+Subject: [PATCH] Clean up memory better at end of run (CVE-2021-40633)
+
+---
+ gif2rgb.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/gif2rgb.c b/gif2rgb.c
+index d51226d..fc2e683 100644
+--- a/gif2rgb.c
++++ b/gif2rgb.c
+@@ -517,6 +517,9 @@ static void GIF2RGB(int NumFiles, char *FileName, bool OneFileFlag,
+ 	DumpScreen2RGB(OutFileName, OneFileFlag, ColorMap, ScreenBuffer,
+ 	               GifFile->SWidth, GifFile->SHeight);
+ 
++	for (i = 0; i < GifFile->SHeight; i++) {
++        	(void)free(ScreenBuffer[i]);
++	}
+ 	(void)free(ScreenBuffer);
+ 
+ 	{
+-- 
+2.44.0
+
diff --git a/pkgs/by-name/gi/giflib/mingw-install-exes.patch b/pkgs/by-name/gi/giflib/mingw-install-exes.patch
new file mode 100644
index 000000000000..5ec3fdad7e65
--- /dev/null
+++ b/pkgs/by-name/gi/giflib/mingw-install-exes.patch
@@ -0,0 +1,11 @@
+--- a/Makefile
++++ b/Makefile
+@@ -92,7 +92,7 @@
+ install: all install-bin install-include install-lib install-man
+ install-bin: $(INSTALLABLE)
+ 	$(INSTALL) -d "$(DESTDIR)$(BINDIR)"
+-	$(INSTALL) $^ "$(DESTDIR)$(BINDIR)"
++	$(INSTALL) $(^:=.exe) "$(DESTDIR)$(BINDIR)"
+ install-include:
+ 	$(INSTALL) -d "$(DESTDIR)$(INCDIR)"
+ 	$(INSTALL) -m 644 gif_lib.h "$(DESTDIR)$(INCDIR)"
diff --git a/pkgs/by-name/gi/giflib/package.nix b/pkgs/by-name/gi/giflib/package.nix
new file mode 100644
index 000000000000..c6dd7c81833f
--- /dev/null
+++ b/pkgs/by-name/gi/giflib/package.nix
@@ -0,0 +1,63 @@
+{ stdenv
+, lib
+, fetchurl
+, fixDarwinDylibNames
+, pkgsStatic
+}:
+
+stdenv.mkDerivation rec {
+  pname = "giflib";
+  version = "5.2.2";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/giflib/giflib-${version}.tar.gz";
+    hash = "sha256-vn/70FfK3r4qoURUL9kMaDjGoIO16KkEi47jtmsp1fs=";
+  };
+
+  patches = [
+    ./CVE-2021-40633.patch
+  ] ++ lib.optionals stdenv.hostPlatform.isMinGW [
+    # Build dll libraries.
+    (fetchurl {
+      url = "https://aur.archlinux.org/cgit/aur.git/plain/001-mingw-build.patch?h=mingw-w64-giflib&id=b7311edf54824ac797c7916cd3ddc3a4b2368a19";
+      hash = "sha256-bBx7lw7FWtxZJ+E9AAbKIpCGcJnS5lrGpjYcv/zBtKk=";
+    })
+
+    # Install executables.
+    ./mingw-install-exes.patch
+  ];
+
+  nativeBuildInputs = lib.optionals stdenv.hostPlatform.isDarwin [
+    fixDarwinDylibNames
+  ];
+
+  makeFlags = [
+    "PREFIX=${builtins.placeholder "out"}"
+  ];
+
+  postPatch = ''
+    # we don't want to build HTML documentation
+    substituteInPlace doc/Makefile \
+      --replace-fail "all: allhtml manpages" "all: manpages"
+  '' + lib.optionalString stdenv.hostPlatform.isStatic ''
+    # Upstream build system does not support NOT building shared libraries.
+    sed -i '/all:/ s/$(LIBGIFSO)//' Makefile
+    sed -i '/all:/ s/$(LIBUTILSO)//' Makefile
+    sed -i '/-m 755 $(LIBGIFSO)/ d' Makefile
+    sed -i '/ln -sf $(LIBGIFSOVER)/ d' Makefile
+    sed -i '/ln -sf $(LIBGIFSOMAJOR)/ d' Makefile
+  '';
+
+  passthru.tests = {
+    static = pkgsStatic.giflib;
+  };
+
+  meta = {
+    description = "Library for reading and writing gif images";
+    homepage = "https://giflib.sourceforge.net/";
+    platforms = lib.platforms.unix ++ lib.platforms.windows;
+    license = lib.licenses.mit;
+    maintainers = [ ];
+    branch = "5.2";
+  };
+}
diff --git a/pkgs/by-name/gi/gifticlib/package.nix b/pkgs/by-name/gi/gifticlib/package.nix
new file mode 100644
index 000000000000..b305df08860b
--- /dev/null
+++ b/pkgs/by-name/gi/gifticlib/package.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, fetchFromGitHub, cmake, expat, nifticlib, zlib }:
+
+stdenv.mkDerivation rec {
+  pname = "gifticlib";
+  version = "unstable-2020-07-07";
+
+  src = fetchFromGitHub {
+    owner = "NIFTI-Imaging";
+    repo = "gifti_clib";
+    rev = "5eae81ba1e87ef3553df3b6ba585f12dc81a0030";
+    sha256 = "0gcab06gm0irjnlrkpszzd4wr8z0fi7gx8f7966gywdp2jlxzw19";
+  };
+
+  cmakeFlags = [ "-DUSE_SYSTEM_NIFTI=ON" "-DDOWNLOAD_TEST_DATA=OFF" ];
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ expat nifticlib zlib ];
+
+  # without the test data, this is only a few basic tests
+  doCheck = !stdenv.hostPlatform.isDarwin;
+  checkPhase = ''
+    runHook preCheck
+    ctest -LE 'NEEDS_DATA'
+    runHook postCheck
+  '';
+
+  meta = with lib; {
+    homepage = "https://www.nitrc.org/projects/gifti";
+    description = "Medical imaging geometry format C API";
+    maintainers = with maintainers; [ bcdarwin ];
+    platforms = platforms.unix;
+    license = licenses.publicDomain;
+  };
+}
diff --git a/pkgs/by-name/gi/gigalixir/package.nix b/pkgs/by-name/gi/gigalixir/package.nix
new file mode 100644
index 000000000000..8628fdfcffb3
--- /dev/null
+++ b/pkgs/by-name/gi/gigalixir/package.nix
@@ -0,0 +1,65 @@
+{ stdenv
+, lib
+, python3
+, fetchPypi
+, git
+}:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "gigalixir";
+  version = "1.12.1";
+  format = "setuptools";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-T16+0F28/SxDl53GGTRzKbG+ghbL/80NkY08WpCixhA=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "'pytest-runner'," "" \
+      --replace "cryptography==" "cryptography>="
+  '';
+
+  propagatedBuildInputs = with python3.pkgs; [
+    click
+    pygments
+    pyopenssl
+    qrcode
+    requests
+    rollbar
+    stripe
+  ];
+
+  nativeCheckInputs = [
+    git
+  ] ++ (with python3.pkgs; [
+    httpretty
+    pytestCheckHook
+    sure
+  ]);
+
+  disabledTests = [
+    # Test requires network access
+    "test_rollback_without_version"
+    # These following test's are now depraced and removed, check out these commits:
+    # https://github.com/gigalixir/gigalixir-cli/commit/00b758ed462ad8eff6ff0b16cd37fa71f75b2d7d
+    # https://github.com/gigalixir/gigalixir-cli/commit/76fa25f96e71fd75cc22e5439b4a8f9e9ec4e3e5
+    "test_create_config"
+    "test_delete_free_database"
+    "test_get_free_databases"
+  ];
+
+  pythonImportsCheck = [
+    "gigalixir"
+  ];
+
+  meta = with lib; {
+    broken = stdenv.hostPlatform.isDarwin;
+    description = "Gigalixir Command-Line Interface";
+    homepage = "https://github.com/gigalixir/gigalixir-cli";
+    license = licenses.mit;
+    maintainers = [ ];
+    mainProgram = "gigalixir";
+  };
+}
diff --git a/pkgs/by-name/gi/gigedit/package.nix b/pkgs/by-name/gi/gigedit/package.nix
new file mode 100644
index 000000000000..d53aa51d9b56
--- /dev/null
+++ b/pkgs/by-name/gi/gigedit/package.nix
@@ -0,0 +1,47 @@
+{ lib
+, stdenv
+, fetchurl
+, autoconf
+, automake
+, intltool
+, libtool
+, pkg-config
+, which
+, docbook_xml_dtd_45
+, docbook_xsl
+, gtkmm2
+, pangomm_2_42
+, libgig
+, libsndfile
+, libxslt
+}:
+
+let
+  gtkmm2_with_pango242 = gtkmm2.override { pangomm = pangomm_2_42; };
+in
+stdenv.mkDerivation rec {
+  pname = "gigedit";
+  version = "1.1.1";
+
+  src = fetchurl {
+    url = "https://download.linuxsampler.org/packages/${pname}-${version}.tar.bz2";
+    sha256 = "08db12crwf0dy1dbyrmivqqpg5zicjikqkmf2kb1ywpq0a9hcxrb";
+  };
+
+  preConfigure = "make -f Makefile.svn";
+
+  nativeBuildInputs = [ autoconf automake intltool libtool pkg-config which ];
+
+  buildInputs = [ docbook_xml_dtd_45 docbook_xsl gtkmm2_with_pango242 libgig libsndfile libxslt ];
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    homepage = "http://www.linuxsampler.org";
+    description = "Gigasampler file access library";
+    license = licenses.gpl2;
+    maintainers = [ ];
+    platforms = platforms.linux;
+    mainProgram = "gigedit";
+  };
+}
diff --git a/pkgs/by-name/gi/gildas/clang.patch b/pkgs/by-name/gi/gildas/clang.patch
new file mode 100644
index 000000000000..aee010835248
--- /dev/null
+++ b/pkgs/by-name/gi/gildas/clang.patch
@@ -0,0 +1,77 @@
+diff --git a/admin/Makefile.def b/admin/Makefile.def
+index 932d18f102..309114e339 100644
+--- a/admin/Makefile.def
++++ b/admin/Makefile.def
+@@ -310,7 +310,7 @@ endif
+ 
+ # Apple CLANG flags (identical to GCC)
+ ifeq ($(GAG_COMPILER_CKIND),clang)
+-  GLOBAL_CFLAGS += -pipe -fPIC
++  GLOBAL_CFLAGS += -fPIC
+   ifeq ($(RELEASE_MODE),no)
+     OPTION_CFLAGS += -Wall
+   endif
+@@ -360,7 +360,7 @@ endif
+ 
+ # GFORTRAN flags
+ ifeq ($(GAG_COMPILER_FKIND),gfortran)
+-  GLOBAL_FFLAGS += -J$(moddir) -pipe -fno-backslash -fno-range-check
++  GLOBAL_FFLAGS += -J$(moddir) -fno-backslash -fno-range-check
+   ifeq ($(GAG_USE_SANITIZE),yes)
+     GLOBAL_FFLAGS += -fsanitize=address -fsanitize=null
+     # Can not be used with our memory(ip):
+diff --git a/admin/define-system.sh b/admin/define-system.sh
+index b6eda9fdfd..704050a9ac 100644
+--- a/admin/define-system.sh
++++ b/admin/define-system.sh
+@@ -272,34 +272,23 @@ EOF
+         	else
+         	    GAG_MACHINE=pc
+         	fi
+-                if which gcc > /dev/null 2>&1; then
+-                    DEFAULT_CCOMPILER=gcc
+-                fi
+-                if which g++ > /dev/null 2>&1; then
+-                    DEFAULT_CXXCOMPILER=g++
+-                elif which clang++ > /dev/null 2>&1; then
+-                    DEFAULT_CXXCOMPILER=clang++
+-                fi
+-        	if which ifort > /dev/null 2>&1; then
+-        	    DEFAULT_FCOMPILER=ifort
+-        	elif which gfortran > /dev/null 2>&1; then
+-        	    DEFAULT_FCOMPILER=gfortran
+-        	fi
+-            elif [ `uname -p` = "arm" ]; then
++	    elif [ `uname -p` = "arm" ]; then
+                 GAG_MACHINE=arm64
+-                if which gcc > /dev/null 2>&1; then
+-                    DEFAULT_CCOMPILER=gcc
+-                fi
+-                if which clang++ > /dev/null 2>&1; then
+-                    DEFAULT_CXXCOMPILER=clang++
+-                elif which g++ > /dev/null 2>&1; then
+-                    DEFAULT_CXXCOMPILER=g++
+-                fi
+-                if which ifort > /dev/null 2>&1; then
+-                    DEFAULT_FCOMPILER=ifort
+-                elif which gfortran > /dev/null 2>&1; then
+-                    DEFAULT_FCOMPILER=gfortran
+-                fi
++	    fi
++            if which clang > /dev/null 2>&1; then
++                DEFAULT_CCOMPILER=clang
++            elif which gcc > /dev/null 2>&1; then
++                DEFAULT_CCOMPILER=gcc
++	    fi
++	    if which clang++ > /dev/null 2>&1; then
++                DEFAULT_CXXCOMPILER=clang++
++            elif which g++ > /dev/null 2>&1; then
++                DEFAULT_CXXCOMPILER=g++
++            fi
++            if which ifort > /dev/null 2>&1; then
++        	DEFAULT_FCOMPILER=ifort
++            elif which gfortran > /dev/null 2>&1; then
++        	DEFAULT_FCOMPILER=gfortran
+             fi ;;
+         CYGWIN*)
+             if [ `uname -m | grep -c "x86_64"` -ne 0 ]; then
diff --git a/pkgs/by-name/gi/gildas/cpp-darwin.patch b/pkgs/by-name/gi/gildas/cpp-darwin.patch
new file mode 100644
index 000000000000..09085c29bf94
--- /dev/null
+++ b/pkgs/by-name/gi/gildas/cpp-darwin.patch
@@ -0,0 +1,17 @@
+diff --git a/admin/Makefile.def b/admin/Makefile.def
+index 0395d9d4f0..932d18f102 100644
+--- a/admin/Makefile.def
++++ b/admin/Makefile.def
+@@ -228,7 +228,11 @@ GLOBAL_DIRTY = $(builddir) *~ TAGS ChangeLog* Makefile.bak
+ # Fortran preprocessing
+ 
+ # Preprocessor command
+-CPP = cpp
++ifdef GAG_CPP
++   CPP = $(GAG_CPP)
++else
++   CPP = cpp
++endif
+ 
+ # Preprocessor generic flags
+ GLOBAL_CPPFLAGS += -P -traditional -C
diff --git a/pkgs/by-name/gi/gildas/package.nix b/pkgs/by-name/gi/gildas/package.nix
new file mode 100644
index 000000000000..eafc631ef92c
--- /dev/null
+++ b/pkgs/by-name/gi/gildas/package.nix
@@ -0,0 +1,75 @@
+{ lib, stdenv, fetchurl, gtk2-x11 , pkg-config , python3 , gfortran , lesstif
+, cfitsio , getopt , perl , groff , which, darwin, ncurses
+}:
+
+let
+  python3Env = python3.withPackages(ps: with ps; [ numpy setuptools ]);
+in
+
+stdenv.mkDerivation rec {
+  srcVersion = "sep24a";
+  version = "20240901_a";
+  pname = "gildas";
+
+  src = fetchurl {
+    # For each new release, the upstream developers of Gildas move the
+    # source code of the previous release to a different directory
+    urls = [ "http://www.iram.fr/~gildas/dist/gildas-src-${srcVersion}.tar.xz"
+      "http://www.iram.fr/~gildas/dist/archive/gildas/gildas-src-${srcVersion}.tar.xz" ];
+    sha256 = "sha256-dZ03J3I1dgoSgSc9yGfO13ZvNawCSYKN3+SGvp1eyGA=";
+  };
+
+  nativeBuildInputs = [ pkg-config groff perl getopt gfortran which ];
+
+  buildInputs = [ gtk2-x11 lesstif cfitsio python3Env ncurses ]
+    ++ lib.optionals stdenv.hostPlatform.isDarwin (with darwin.apple_sdk.frameworks; [ CoreFoundation ]);
+
+  patches = [ ./wrapper.patch ]
+    ++ lib.optionals stdenv.hostPlatform.isDarwin ([ ./clang.patch ./cpp-darwin.patch ]);
+
+  env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.cc.isClang "-Wno-unused-command-line-argument";
+
+  # Workaround for https://github.com/NixOS/nixpkgs/issues/304528
+  env.GAG_CPP = lib.optionalString stdenv.hostPlatform.isDarwin "${gfortran.outPath}/bin/cpp";
+
+  NIX_LDFLAGS = lib.optionalString stdenv.hostPlatform.isDarwin (with darwin.apple_sdk.frameworks; "-F${CoreFoundation}/Library/Frameworks");
+
+  configurePhase=''
+    substituteInPlace admin/wrapper.sh --replace '%%OUT%%' $out
+    substituteInPlace admin/wrapper.sh --replace '%%PYTHONHOME%%' ${python3Env}
+    substituteInPlace utilities/main/gag-makedepend.pl --replace '/usr/bin/perl' ${perl}/bin/perl
+    source admin/gildas-env.sh -c gfortran -o openmp
+    echo "gag_doc:        $out/share/doc/" >> kernel/etc/gag.dico.lcl
+  '';
+
+  userExec = "astro class greg imager mapping sic";
+
+  postInstall=''
+    mkdir -p $out/bin
+    cp -a ../gildas-exe-${srcVersion}/* $out
+    mv $out/$GAG_EXEC_SYSTEM $out/libexec
+    for i in ${userExec} ; do
+      cp admin/wrapper.sh $out/bin/$i
+      chmod 755 $out/bin/$i
+    done
+  '';
+
+  meta = {
+    description = "Radioastronomy data analysis software";
+    longDescription = ''
+      GILDAS is a collection of state-of-the-art software
+      oriented toward (sub-)millimeter radioastronomical
+      applications (either single-dish or interferometer).
+      It is daily used to reduce all data acquired with the
+      IRAM 30M telescope and Plateau de Bure Interferometer
+      PDBI (except VLBI observations). GILDAS is easily
+      extensible. GILDAS is written in Fortran-90, with a
+      few parts in C/C++ (mainly keyboard interaction,
+      plotting, widgets).'';
+    homepage = "http://www.iram.fr/IRAMFR/GILDAS/gildas.html";
+    license = lib.licenses.free;
+    maintainers = [ lib.maintainers.bzizou lib.maintainers.smaret ];
+    platforms = lib.platforms.all;
+  };
+
+}
diff --git a/pkgs/by-name/gi/gildas/wrapper.patch b/pkgs/by-name/gi/gildas/wrapper.patch
new file mode 100644
index 000000000000..3843937bf1bc
--- /dev/null
+++ b/pkgs/by-name/gi/gildas/wrapper.patch
@@ -0,0 +1,20 @@
+diff --new-file -r -u gildas-src-feb17d.orig/admin/wrapper.sh gildas-src-feb17d/admin/wrapper.sh
+--- gildas-src-feb17d.orig/admin/wrapper.sh	1970-01-01 01:00:00.000000000 +0100
++++ gildas-src-feb17d/admin/wrapper.sh	2017-05-18 21:00:01.660778782 +0200
+@@ -0,0 +1,16 @@
++#!/bin/sh -e
++
++export GAG_ROOT_DIR="%%OUT%%"
++export GAG_PATH="${GAG_ROOT_DIR}/etc"
++export GAG_EXEC_SYSTEM="libexec"
++export GAG_GAG="${HOME}/.gag"
++export PYTHONHOME="%%PYTHONHOME%%"
++if [ -z "\$PYTHONPATH" ]; then
++  PYTHONPATH="${GAG_ROOT_DIR}/${GAG_EXEC_SYSTEM}/python"
++else
++  PYTHONPATH="${GAG_ROOT_DIR}/${GAG_EXEC_SYSTEM}/python:${PYTHONPATH}"
++fi
++export PYTHONPATH
++export LD_LIBRARY_PATH=${GAG_ROOT_DIR}/${GAG_EXEC_SYSTEM}/lib/
++me=`basename $0`
++exec ${GAG_ROOT_DIR}/${GAG_EXEC_SYSTEM}/bin/${me} ${*}
diff --git a/pkgs/by-name/gi/gimme-aws-creds/package.nix b/pkgs/by-name/gi/gimme-aws-creds/package.nix
new file mode 100644
index 000000000000..69db86d4591d
--- /dev/null
+++ b/pkgs/by-name/gi/gimme-aws-creds/package.nix
@@ -0,0 +1,84 @@
+{ lib
+, installShellFiles
+, python3
+, fetchPypi
+, fetchFromGitHub
+, nix-update-script
+, testers
+, gimme-aws-creds
+}:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "gimme-aws-creds";
+  version = "2.8.2"; # N.B: if you change this, check if overrides are still up-to-date
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "Nike-Inc";
+    repo = "gimme-aws-creds";
+    rev = "v${version}";
+    hash = "sha256-fsFYcfbLeYV6tpOGgNrFmYjcUAmdsx5zwUbvcctwFVs=";
+  };
+
+  nativeBuildInputs = with python3.pkgs; [
+    installShellFiles
+  ];
+
+  pythonRemoveDeps = [
+    "configparser"
+  ];
+
+  dependencies = with python3.pkgs; [
+    boto3
+    beautifulsoup4
+    ctap-keyring-device
+    requests
+    okta
+    pyjwt
+    html5lib
+    furl
+  ];
+
+  preCheck = ''
+    # Disable using platform's keyring unavailable in sandbox
+    export PYTHON_KEYRING_BACKEND="keyring.backends.fail.Keyring"
+  '';
+
+  nativeCheckInputs = with python3.pkgs; [
+    pytestCheckHook
+    responses
+  ];
+
+  disabledTests = [
+    "test_build_factor_name_webauthn_registered"
+  ];
+
+  pythonImportsCheck = [
+    "gimme_aws_creds"
+  ];
+
+  postInstall = ''
+    rm $out/bin/gimme-aws-creds.cmd
+    chmod +x $out/bin/gimme-aws-creds
+    installShellCompletion --bash --name gimme-aws-creds $out/bin/gimme-aws-creds-autocomplete.sh
+    rm $out/bin/gimme-aws-creds-autocomplete.sh
+  '';
+
+  passthru = {
+    updateScript = nix-update-script { };
+    tests.version = testers.testVersion {
+      package = gimme-aws-creds;
+      command = ''touch tmp.conf && OKTA_CONFIG="tmp.conf" gimme-aws-creds --version'';
+      version = "gimme-aws-creds ${version}";
+    };
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/Nike-Inc/gimme-aws-creds";
+    changelog = "https://github.com/Nike-Inc/gimme-aws-creds/releases";
+    description = "CLI that utilizes Okta IdP via SAML to acquire temporary AWS credentials";
+    mainProgram = "gimme-aws-creds";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ jbgosselin ];
+  };
+}
diff --git a/pkgs/by-name/gi/gimoji/package.nix b/pkgs/by-name/gi/gimoji/package.nix
new file mode 100644
index 000000000000..02fe472ab39e
--- /dev/null
+++ b/pkgs/by-name/gi/gimoji/package.nix
@@ -0,0 +1,32 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, stdenv
+, darwin
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "gimoji";
+  version = "1.1.1";
+
+  src = fetchFromGitHub {
+    owner = "zeenix";
+    repo = "gimoji";
+    rev = version;
+    hash = "sha256-X1IiDnnRXiZBL/JBDfioKc/724TnVKaEjZLrNwX5SoA=";
+  };
+
+  cargoHash = "sha256-4B+IRYnqwIqkxjRjlxER8O414Zd/8Are4fu1OxA+dWI=";
+
+  buildInputs = lib.optionals stdenv.hostPlatform.isDarwin [
+    darwin.apple_sdk.frameworks.AppKit
+  ];
+
+  meta = with lib; {
+    description = "Easily add emojis to your git commit messages";
+    homepage = "https://github.com/zeenix/gimoji";
+    license = licenses.mit;
+    mainProgram = "gimoji";
+    maintainers = with maintainers; [ a-kenji ];
+  };
+}
diff --git a/pkgs/by-name/gi/gimx/conf.patch b/pkgs/by-name/gi/gimx/conf.patch
new file mode 100644
index 000000000000..1040a6192f38
--- /dev/null
+++ b/pkgs/by-name/gi/gimx/conf.patch
@@ -0,0 +1,26 @@
+diff --git a/core/config_reader.c b/core/config_reader.c
+index 451fc48..ed45f4d 100644
+--- a/core/config_reader.c
++++ b/core/config_reader.c
+@@ -1355,7 +1355,7 @@ int read_config_file(const char* file)
+   char file_path[PATH_MAX];
+ 
+   snprintf(file_path, sizeof(file_path), "%s%s%s%s", gimx_params.homedir, GIMX_DIR, CONFIG_DIR, file);
+-
++  snprintf(file_path, sizeof(file_path), "%s", file);
+   if(read_file(file_path) == -1)
+   {
+     gerror("read_file failed\n");
+diff --git a/core/gimx.c b/core/gimx.c
+index 700cae9..9143d8b 100755
+--- a/core/gimx.c
++++ b/core/gimx.c
+@@ -192,7 +192,7 @@ void show_config()
+   char file_path[PATH_MAX];
+ 
+   snprintf(file_path, sizeof(file_path), "%s%s%s%s", gimx_params.homedir, GIMX_DIR, CONFIG_DIR, gimx_params.config_file);
+-
++  snprintf(file_path, sizeof(file_path), "%s", gimx_params.config_file);
+   FILE * fp = gfile_fopen(file_path, "r");
+   if (fp == NULL)
+   {
diff --git a/pkgs/by-name/gi/gimx/gcc14.patch b/pkgs/by-name/gi/gimx/gcc14.patch
new file mode 100644
index 000000000000..b736891f07ea
--- /dev/null
+++ b/pkgs/by-name/gi/gimx/gcc14.patch
@@ -0,0 +1,26 @@
+diff --git a/core/config_reader.c b/core/config_reader.c
+index 451fc48..737d27c 100644
+--- a/core/config_reader.c
++++ b/core/config_reader.c
+@@ -17,7 +17,7 @@
+ #include "../directories.h"
+ #include "macros.h"
+ #include <errno.h>
+-
++#include <stdlib.h>
+ /*
+  * These variables are used to read the configuration.
+  */
+diff --git a/core/gimx.c b/core/gimx.c
+index 700cae9..693f72f 100755
+--- a/core/gimx.c
++++ b/core/gimx.c
+@@ -8,7 +8,7 @@
+ #include <errno.h> //to print errors
+ #include <string.h> //to print errors
+ #include <limits.h> //PATH_MAX
+-
++#include <stdlib.h>
+ #ifndef WIN32
+ #include <termios.h> //to disable/enable echo
+ #include <unistd.h>
diff --git a/pkgs/by-name/gi/gimx/package.nix b/pkgs/by-name/gi/gimx/package.nix
new file mode 100644
index 000000000000..8f81ab09357d
--- /dev/null
+++ b/pkgs/by-name/gi/gimx/package.nix
@@ -0,0 +1,54 @@
+{ stdenv, lib, fetchFromGitHub, makeWrapper, curl, libusb1, bluez, libxml2, ncurses5, libmhash, xorg }:
+
+let
+  gimx-config = fetchFromGitHub {
+    owner = "matlo";
+    repo = "GIMX-configurations";
+    rev = "c20300f24d32651d369e2b27614b62f4b856e4a0";
+    hash = "sha256-t/Ttlvc9LCRW624oSsFaP8EmswJ3OAn86QgF1dCUjAs=";
+  };
+
+in stdenv.mkDerivation rec {
+  pname = "gimx";
+  version = "8.0";
+
+  src = fetchFromGitHub {
+    owner = "matlo";
+    repo = "GIMX";
+    rev = "v${version}";
+    fetchSubmodules = true;
+    hash = "sha256-BcFLdQgEAi6Sxyb5/P9YAIkmeXNZXrKcOa/6g817xQg=";
+  };
+
+  env.NIX_CFLAGS_COMPILE = "-Wno-error";
+  patches = [ ./conf.patch ./gcc14.patch ];
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ curl libusb1 bluez libxml2 ncurses5 libmhash xorg.libX11 xorg.libXi ];
+  makeFlags = [ "build-core" ];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out
+    substituteInPlace ./core/Makefile --replace-fail "chmod ug+s" "echo"
+    export DESTDIR="$out"
+    make install-shared install-core
+    mv $out/usr/lib $out/lib
+    mv $out/usr/bin $out/bin
+    cp -r ${gimx-config}/Linux $out/share
+
+    makeWrapper $out/bin/gimx $out/bin/gimx-ds4 \
+      --add-flags "--nograb" --add-flags "-p /dev/ttyUSB0" \
+      --add-flags "-c $out/share/Dualshock4.xml"
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/matlo/GIMX";
+    description = "Game Input Multiplexer";
+    license = licenses.gpl3Only;
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/by-name/gi/ginac/package.nix b/pkgs/by-name/gi/ginac/package.nix
new file mode 100644
index 000000000000..d2713befed38
--- /dev/null
+++ b/pkgs/by-name/gi/ginac/package.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, fetchurl, cln, pkg-config, readline, gmp, python3 }:
+
+stdenv.mkDerivation rec {
+  pname = "ginac";
+  version = "1.8.7";
+
+  src = fetchurl {
+    url = "https://www.ginac.de/ginac-${version}.tar.bz2";
+    sha256 = "sha256-cf9PLYoA5vB86P7mm3bcweu7cnvmdgtYfB+7XM97Yeo=";
+  };
+
+  propagatedBuildInputs = [ cln ];
+
+  buildInputs = [ readline ]
+    ++ lib.optional stdenv.hostPlatform.isDarwin gmp;
+
+  nativeBuildInputs = [ pkg-config python3 ];
+
+  strictDeps = true;
+
+  preConfigure = ''
+    patchShebangs ginsh
+  '';
+
+  configureFlags = [ "--disable-rpath" ];
+
+  meta = with lib; {
+    description = "GiNaC is Not a CAS";
+    homepage = "https://www.ginac.de/";
+    maintainers = with maintainers; [ lovek323 ];
+    license = licenses.gpl2;
+    platforms = platforms.all;
+  };
+}
diff --git a/pkgs/by-name/gi/ginkgo/package.nix b/pkgs/by-name/gi/ginkgo/package.nix
new file mode 100644
index 000000000000..06a4c36a7d9f
--- /dev/null
+++ b/pkgs/by-name/gi/ginkgo/package.nix
@@ -0,0 +1,45 @@
+{ lib, buildGoModule, fetchFromGitHub, testers, ginkgo }:
+
+buildGoModule rec {
+  pname = "ginkgo";
+  version = "2.21.0";
+
+  src = fetchFromGitHub {
+    owner = "onsi";
+    repo = "ginkgo";
+    rev = "v${version}";
+    sha256 = "sha256-9WvBdcl65WTwzFKTPYTg6ufhIBuqx+T99ng7UePSNHU=";
+  };
+  vendorHash = "sha256-tjHBnkFlkP7n0/c9bz/nUzWerPzVQ+12cKijG1Jzti8=";
+
+  # integration tests expect more file changes
+  # types tests are missing CodeLocation
+  excludedPackages = [ "integration" "types" ];
+
+  __darwinAllowLocalNetworking = true;
+
+  passthru.tests.version = testers.testVersion {
+    package = ginkgo;
+    command = "ginkgo version";
+  };
+
+  meta = with lib; {
+    homepage = "https://onsi.github.io/ginkgo/";
+    changelog = "https://github.com/onsi/ginkgo/blob/master/CHANGELOG.md";
+    description = "Modern Testing Framework for Go";
+    mainProgram = "ginkgo";
+    longDescription = ''
+      Ginkgo is a testing framework for Go designed to help you write expressive
+      tests. It is best paired with the Gomega matcher library. When combined,
+      Ginkgo and Gomega provide a rich and expressive DSL
+      (Domain-specific Language) for writing tests.
+
+      Ginkgo is sometimes described as a "Behavior Driven Development" (BDD)
+      framework. In reality, Ginkgo is a general purpose testing framework in
+      active use across a wide variety of testing contexts: unit tests,
+      integration tests, acceptance test, performance tests, etc.
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ saschagrunert jk ];
+  };
+}
diff --git a/pkgs/by-name/gi/gio-sharp/package.nix b/pkgs/by-name/gi/gio-sharp/package.nix
new file mode 100644
index 000000000000..91fbb86bd669
--- /dev/null
+++ b/pkgs/by-name/gi/gio-sharp/package.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, fetchFromGitHub, autoconf, automake, which, pkg-config, mono, glib, gtk-sharp-2_0 }:
+
+stdenv.mkDerivation rec {
+  pname = "gio-sharp";
+  version = "0.3";
+
+  src = fetchFromGitHub {
+    owner = "mono";
+    repo = "gio-sharp";
+
+    rev = version;
+    sha256 = "13pc529pjabj7lq23dbndc26ssmg5wkhc7lfvwapm87j711m0zig";
+  };
+
+  nativeBuildInputs = [ pkg-config autoconf automake which ];
+  buildInputs = [ mono glib gtk-sharp-2_0 ];
+
+  dontStrip = true;
+
+  prePatch = ''
+    ./autogen-2.22.sh
+  '';
+
+  meta = with lib; {
+    description = "GIO API bindings";
+    homepage = "https://github.com/mono/gio-sharp";
+    license = licenses.mit;
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/by-name/gi/giph/package.nix b/pkgs/by-name/gi/giph/package.nix
new file mode 100644
index 000000000000..9d0175911d69
--- /dev/null
+++ b/pkgs/by-name/gi/giph/package.nix
@@ -0,0 +1,44 @@
+{ stdenvNoCC
+, lib
+, fetchFromGitHub
+, ffmpeg
+, xdotool
+, slop
+, libnotify
+, procps
+, makeWrapper
+}:
+
+stdenvNoCC.mkDerivation rec {
+  pname = "giph";
+  version = "1.1.1";
+
+  src = fetchFromGitHub {
+    owner = "phisch";
+    repo = pname;
+    rev = version;
+    sha256 = "19l46m1f32b3bagzrhaqsfnl5n3wbrmg3sdy6fdss4y1yf6nqayk";
+  };
+
+  dontConfigure = true;
+
+  dontBuild = true;
+
+  installFlags = [ "PREFIX=${placeholder "out"}" ];
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  postInstall = ''
+    wrapProgram $out/bin/giph \
+      --prefix PATH : ${lib.makeBinPath [ ffmpeg xdotool libnotify slop procps ]}
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/phisch/giph";
+    description = "Simple gif recorder";
+    license = licenses.mit;
+    maintainers = [ maintainers.lom ];
+    platforms = platforms.linux;
+    mainProgram = "giph";
+  };
+}
diff --git a/pkgs/by-name/gi/gir-rs/Cargo.lock b/pkgs/by-name/gi/gir-rs/Cargo.lock
new file mode 100644
index 000000000000..4a605d9ae634
--- /dev/null
+++ b/pkgs/by-name/gi/gir-rs/Cargo.lock
@@ -0,0 +1,278 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "aho-corasick"
+version = "0.7.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "clock_ticks"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c49a90f58e73ac5f41ed0ac249861ceb5f0976db35fabc2b9c2c856916042d63"
+
+[[package]]
+name = "env_logger"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0"
+dependencies = [
+ "log 0.4.17",
+]
+
+[[package]]
+name = "fix-getters-rules"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6af7c515020a47f109ddbb4ae0ea662e202c361e5d8570caaca2f1d9037d1bc"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "getopts"
+version = "0.2.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5"
+dependencies = [
+ "unicode-width",
+]
+
+[[package]]
+name = "gir"
+version = "0.0.1"
+dependencies = [
+ "bitflags",
+ "env_logger",
+ "fix-getters-rules",
+ "getopts",
+ "hprof",
+ "log 0.4.17",
+ "once_cell",
+ "regex",
+ "rustdoc-stripper",
+ "toml",
+ "xml-rs",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+
+[[package]]
+name = "hprof"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17b42e67c01ef27237e424783538a0bc45721ecd53438fab5c3f8bbf5dfd8516"
+dependencies = [
+ "clock_ticks",
+ "log 0.3.9",
+]
+
+[[package]]
+name = "indexmap"
+version = "1.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399"
+dependencies = [
+ "autocfg",
+ "hashbrown",
+]
+
+[[package]]
+name = "log"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b"
+dependencies = [
+ "log 0.4.17",
+]
+
+[[package]]
+name = "log"
+version = "0.4.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "memchr"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
+name = "nom8"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae01545c9c7fc4486ab7debaf2aad7003ac19431791868fb2e8066df97fad2f8"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.50"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "regex"
+version = "1.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
+
+[[package]]
+name = "rustdoc-stripper"
+version = "0.1.18"
+source = "git+https://github.com/GuillaumeGomez/rustdoc-stripper#08114e390ea162c7ed35dc20cbf1d38bd8bfc130"
+
+[[package]]
+name = "serde"
+version = "1.0.152"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.152"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_spanned"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c68e921cef53841b8925c2abadd27c9b891d9613bdc43d6b823062866df38e8"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.107"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "toml"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fb9d890e4dc9298b70f740f615f2e05b9db37dce531f6b24fb77ac993f9f217"
+dependencies = [
+ "indexmap",
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "toml_edit",
+]
+
+[[package]]
+name = "toml_datetime"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4553f467ac8e3d374bc9a177a26801e5d0f9b211aa1673fb137a403afd1c9cf5"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "729bfd096e40da9c001f778f5cdecbd2957929a24e10e5883d9392220a751581"
+dependencies = [
+ "indexmap",
+ "nom8",
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc"
+
+[[package]]
+name = "unicode-width"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
+
+[[package]]
+name = "xml-rs"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3"
diff --git a/pkgs/by-name/gi/gir-rs/package.nix b/pkgs/by-name/gi/gir-rs/package.nix
new file mode 100644
index 000000000000..afdfbda2c54e
--- /dev/null
+++ b/pkgs/by-name/gi/gir-rs/package.nix
@@ -0,0 +1,37 @@
+{ lib, fetchFromGitHub, rustPlatform }:
+
+let
+  version = "0.17.1";
+in
+rustPlatform.buildRustPackage {
+  pname = "gir";
+  inherit version;
+
+  src = fetchFromGitHub {
+    owner = "gtk-rs";
+    repo = "gir";
+    rev = version;
+    sha256 = "sha256-WpTyT62bykq/uwzBFQXeJ1HxR1a2vKmtid8YAzk7J+Q=";
+  };
+
+  cargoLock = {
+    lockFile = ./Cargo.lock;
+    outputHashes = {
+      "rustdoc-stripper-0.1.18" = "sha256-b+RRXJDGULEvkIZDBzU/ZchVF63pX0S9hBupeP12CkU=";
+    };
+  };
+
+  postPatch = ''
+    rm build.rs
+    sed -i '/build = "build\.rs"/d' Cargo.toml
+    echo "pub const VERSION: &str = \"$version\";" > src/gir_version.rs
+  '';
+
+  meta = with lib; {
+    description = "Tool to generate rust bindings and user API for glib-based libraries";
+    homepage = "https://github.com/gtk-rs/gir/";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ ekleog ];
+    mainProgram = "gir";
+  };
+}
diff --git a/pkgs/by-name/gi/girouette/package.nix b/pkgs/by-name/gi/girouette/package.nix
index 2c2a733c3117..09b0d61fccc9 100644
--- a/pkgs/by-name/gi/girouette/package.nix
+++ b/pkgs/by-name/gi/girouette/package.nix
@@ -28,7 +28,7 @@ rustPlatform.buildRustPackage rec {
   buildInputs = [
     dbus
     openssl
-  ] ++ lib.optionals stdenv.isDarwin [
+  ] ++ lib.optionals stdenv.hostPlatform.isDarwin [
     darwin.apple_sdk.frameworks.Security
   ];
 
diff --git a/pkgs/by-name/gi/girsh/package.nix b/pkgs/by-name/gi/girsh/package.nix
new file mode 100644
index 000000000000..ebec6f968df8
--- /dev/null
+++ b/pkgs/by-name/gi/girsh/package.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+}:
+
+buildGoModule rec {
+  pname = "girsh";
+  version = "0.41";
+
+  src = fetchFromGitHub {
+    owner = "nodauf";
+    repo = "Girsh";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-MgzIBag0Exoh0TXW/AD0lbSOj7PVkMeVYQ8v5jdCgAs=";
+  };
+
+  vendorHash = "sha256-8NPFohguMX/X1khEPF+noLBNe/MUoPpXS2PN6SiotL8=";
+
+  ldflags = [
+    "-s"
+    "-w"
+  ];
+
+  postInstall = ''
+    mv $out/bin/src $out/bin/$pname
+  '';
+
+  meta = with lib; {
+    description = "Automatically spawn a reverse shell fully interactive for Linux or Windows victim";
+    homepage = "https://github.com/nodauf/Girsh";
+    changelog = "https://github.com/nodauf/Girsh/releases/tag/v${version}";
+    license = licenses.gpl2Only;
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/pkgs/by-name/gi/git-agecrypt/package.nix b/pkgs/by-name/gi/git-agecrypt/package.nix
index a9c2d85ff63c..bdd9beba175d 100644
--- a/pkgs/by-name/gi/git-agecrypt/package.nix
+++ b/pkgs/by-name/gi/git-agecrypt/package.nix
@@ -25,7 +25,7 @@ rustPlatform.buildRustPackage {
   nativeBuildInputs = [ pkg-config git ];
 
   buildInputs = [ libgit2 zlib ]
-    ++ lib.optional stdenv.isDarwin darwin.apple_sdk.frameworks.Security;
+    ++ lib.optional stdenv.hostPlatform.isDarwin darwin.apple_sdk.frameworks.Security;
 
 
   meta = with lib; {
diff --git a/pkgs/by-name/gi/git-aggregator/package.nix b/pkgs/by-name/gi/git-aggregator/package.nix
new file mode 100644
index 000000000000..740f805d12c5
--- /dev/null
+++ b/pkgs/by-name/gi/git-aggregator/package.nix
@@ -0,0 +1,43 @@
+{ lib, python3Packages, fetchPypi, git }:
+
+python3Packages.buildPythonApplication rec {
+  pname = "git-aggregator";
+  version = "2.1.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-79xNPzYP1j71sU5wZM5e2xTqQExqQEdxXPxbk4T/Scw=";
+  };
+
+  nativeBuildInputs = with python3Packages; [
+    setuptools-scm
+  ];
+
+  propagatedBuildInputs = with python3Packages; [
+    argcomplete
+    colorama
+    git
+    kaptan
+    requests
+  ];
+
+  nativeCheckInputs = [
+    git
+  ];
+
+  preCheck = ''
+    export HOME="$(mktemp -d)"
+    git config --global user.name John
+    git config --global user.email john@localhost
+    git config --global init.defaultBranch master
+    git config --global pull.rebase false
+  '';
+
+  meta = with lib; {
+    description = "Manage the aggregation of git branches from different remotes to build a consolidated one";
+    homepage = "https://github.com/acsone/git-aggregator";
+    license = licenses.agpl3Plus;
+    maintainers = with maintainers; [ bbjubjub ];
+    mainProgram = "gitaggregate";
+  };
+}
diff --git a/pkgs/by-name/gi/git-annex-remote-rclone/package.nix b/pkgs/by-name/gi/git-annex-remote-rclone/package.nix
new file mode 100644
index 000000000000..4d1a7b2ade1d
--- /dev/null
+++ b/pkgs/by-name/gi/git-annex-remote-rclone/package.nix
@@ -0,0 +1,30 @@
+{ lib, stdenvNoCC, fetchFromGitHub, rclone, makeWrapper }:
+
+stdenvNoCC.mkDerivation rec {
+  pname = "git-annex-remote-rclone";
+  version = "0.8";
+
+  src = fetchFromGitHub {
+    owner = "DanielDent";
+    repo = "git-annex-remote-rclone";
+    rev = "v${version}";
+    sha256 = "sha256-B6x67XXE4BHd3x7a8pQlqPPmpy0c62ziDAldB4QpqQ4=";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  installPhase = ''
+    install -Dm755 -t $out/bin git-annex-remote-rclone
+    wrapProgram "$out/bin/git-annex-remote-rclone" \
+      --prefix PATH ":" "${lib.makeBinPath [ rclone ]}"
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/DanielDent/git-annex-remote-rclone";
+    description = "Use rclone supported cloud storage providers with git-annex";
+    license = licenses.gpl3Only;
+    platforms = platforms.all;
+    maintainers = [ maintainers.montag451 ];
+    mainProgram = "git-annex-remote-rclone";
+  };
+}
diff --git a/pkgs/by-name/gi/git-annex-utils/package.nix b/pkgs/by-name/gi/git-annex-utils/package.nix
new file mode 100644
index 000000000000..2b63192ea3b0
--- /dev/null
+++ b/pkgs/by-name/gi/git-annex-utils/package.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, fetchgit, autoconf, automake, libtool, gmp }:
+
+stdenv.mkDerivation rec {
+  pname = "git-annex-utils";
+  version = "0.04-3-g531bb33";
+  src = fetchgit {
+    url = "http://git.mysteryvortex.com/repositories/git-annex-utils.git";
+    rev = "531bb33";
+    sha256 = "1sv7s2ykc840cjwbfn7ayy743643x9i1lvk4cd55w9l052xvzj65";
+  };
+  nativeBuildInputs = [ autoconf automake ];
+  buildInputs = [ libtool gmp ];
+  preConfigure = "./autogen.sh";
+
+  meta = {
+    description = "gadu, a du like utility for annexed files";
+    longDescription = ''
+      This is a set of utilities that are handy to use with git-annex repositories.
+      Currently there is only one utility gadu, a du like utility for annexed files.
+    '';
+    homepage = "https://git-annex.mysteryvortex.com/git-annex-utils.html";
+    license = lib.licenses.gpl3;
+    maintainers = with lib.maintainers; [ woffs ];
+    mainProgram = "gadu";
+    platforms = lib.platforms.all;
+  };
+}
diff --git a/pkgs/by-name/gi/git-appraise/package.nix b/pkgs/by-name/gi/git-appraise/package.nix
new file mode 100644
index 000000000000..cc77bf5aca65
--- /dev/null
+++ b/pkgs/by-name/gi/git-appraise/package.nix
@@ -0,0 +1,25 @@
+{ lib, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "git-appraise";
+  version = "unstable-2022-04-13";
+
+  src = fetchFromGitHub {
+    owner = "google";
+    repo = "git-appraise";
+    rev = "99aeb0e71544d3e1952e208c339b1aec70968cf3";
+    sha256 = "sha256-TteTI8yGP2sckoJ5xuBB5S8xzm1upXmZPlcDLvXZrpc=";
+  };
+
+  vendorHash = "sha256-Lzq4qpDAUjKFA2T685eW9NCfzEhDsn5UR1A1cIaZadE=";
+
+  ldflags = [ "-s" "-w" ];
+
+  meta = with lib; {
+    description = "Distributed code review system for Git repos";
+    homepage = "https://github.com/google/git-appraise";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ vdemeester ];
+    mainProgram = "git-appraise";
+  };
+}
diff --git a/pkgs/by-name/gi/git-backdate/package.nix b/pkgs/by-name/gi/git-backdate/package.nix
new file mode 100644
index 000000000000..0d7d5810b9a8
--- /dev/null
+++ b/pkgs/by-name/gi/git-backdate/package.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, fetchFromGitHub, python3 }:
+
+stdenv.mkDerivation rec {
+  pname = "git-backdate";
+  version = "2023-07-19";
+
+  src = fetchFromGitHub {
+    owner = "rixx";
+    repo = pname;
+    rev = "8ba5a0eba04e5559be2e4b1b6e02e62b64ca4dd8";
+    sha256 = "sha256-91cEGQ0FtoiHEZHQ93jPFHF2vLoeQuBidykePFHtrsY=";
+  };
+
+  buildInputs = [
+    python3
+  ];
+
+  installPhase = ''
+    runHook preInstall
+    install -Dm555 git-backdate -t $out/bin
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Backdate a commit or range of commit to a date or range of dates";
+    homepage = "https://github.com/rixx/git-backdate";
+    license = licenses.wtfpl;
+    maintainers = with maintainers; [ matthiasbeyer ];
+    mainProgram = "git-backdate";
+  };
+}
+
diff --git a/pkgs/by-name/gi/git-backup-go/package.nix b/pkgs/by-name/gi/git-backup-go/package.nix
index 761912e118c3..41fa743ccc5d 100644
--- a/pkgs/by-name/gi/git-backup-go/package.nix
+++ b/pkgs/by-name/gi/git-backup-go/package.nix
@@ -8,16 +8,16 @@
 
 buildGoModule rec {
   pname = "git-backup-go";
-  version = "1.6.0";
+  version = "1.6.1";
 
   src = fetchFromGitHub {
     owner = "ChappIO";
     repo = "git-backup";
     rev = "v${version}";
-    hash = "sha256-C/ha/GuRvqxmgrbOgkhup1tNoDT3pDIbE+nO5eMZGlY=";
+    hash = "sha256-Z32ThzmGkF89wsYqJnP/Koz4/2mulkrvvnUKHE6Crks=";
   };
 
-  vendorHash = "sha256-wzivnTe9Rx3YLz6lvrzsLiJIbxX7QE059Kzb4rUfD+s=";
+  vendorHash = "sha256-BLnnwwCrJJd8ihpgfdWel7l8aAIVVJBIpE+97J9ojPo=";
 
   ldflags = [ "-X main.Version=${version}" ];
 
diff --git a/pkgs/by-name/gi/git-bars/package.nix b/pkgs/by-name/gi/git-bars/package.nix
new file mode 100644
index 000000000000..66ae9bf2987b
--- /dev/null
+++ b/pkgs/by-name/gi/git-bars/package.nix
@@ -0,0 +1,26 @@
+{ lib, fetchFromGitHub, python3Packages, git }:
+
+python3Packages.buildPythonApplication {
+  pname = "git-bars";
+  version = "unstable-2023-08-08";
+
+  src = fetchFromGitHub {
+    owner = "knadh";
+    repo = "git-bars";
+    rev = "f15fbc15345d9ef021e5a9b278e352bb532dcee8";
+    hash = "sha256-jHP6LqhUQv6hh97tSXAdOruWdtp2FXM6ANlpWoA+fHQ=";
+  };
+
+  propagatedBuildInputs = [
+    git
+    python3Packages.setuptools
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/knadh/git-bars";
+    description = "Utility for visualising git commit activity as bars on the terminal";
+    license = licenses.mit;
+    maintainers = [ maintainers.matthiasbeyer ];
+    mainProgram = "git-bars";
+  };
+}
diff --git a/pkgs/by-name/gi/git-big-picture/package.nix b/pkgs/by-name/gi/git-big-picture/package.nix
new file mode 100644
index 000000000000..a3ac58c04be8
--- /dev/null
+++ b/pkgs/by-name/gi/git-big-picture/package.nix
@@ -0,0 +1,27 @@
+{ lib, python3Packages, fetchPypi, git, graphviz }:
+
+python3Packages.buildPythonApplication rec {
+  pname = "git-big-picture";
+  version = "1.1.1";
+  format = "wheel";
+
+  src = fetchPypi {
+    inherit format version;
+    pname = "git_big_picture"; # underscores needed for working download URL
+    python = "py3"; # i.e. no Python 2.7
+    sha256 = "a20a480057ced1585c4c38497d27a5012f12dd29697313f0bb8fa6ddbb5c17d8";
+  };
+
+  postFixup = ''
+    wrapProgram $out/bin/git-big-picture \
+      --prefix PATH ":" ${ lib.makeBinPath [ git graphviz ]  }
+  '';
+
+  meta = {
+    description = "Tool for visualization of Git repositories";
+    homepage = "https://github.com/git-big-picture/git-big-picture";
+    license = lib.licenses.gpl3Plus;
+    maintainers = [ lib.maintainers.nthorne ];
+    mainProgram = "git-big-picture";
+  };
+}
diff --git a/pkgs/by-name/gi/git-branchstack/package.nix b/pkgs/by-name/gi/git-branchstack/package.nix
new file mode 100644
index 000000000000..e0cdfaa884df
--- /dev/null
+++ b/pkgs/by-name/gi/git-branchstack/package.nix
@@ -0,0 +1,30 @@
+{
+  lib,
+  fetchPypi,
+  python3Packages,
+}:
+
+let
+  self = python3Packages.buildPythonApplication {
+    pname = "git-branchstack";
+    version = "0.2.0";
+
+    src = fetchPypi {
+      pname = "git-branchstack";
+      inherit (self) version;
+      hash = "sha256-gja93LOcVCQ6l+Cygvsm+3uomvxtvUl6t23GIb/tKyQ=";
+    };
+
+    dependencies = with python3Packages; [
+      git-revise
+    ];
+
+    meta = {
+      homepage = "https://github.com/krobelus/git-branchstack";
+      description = "Efficiently manage Git branches without leaving your local branch";
+      license = lib.licenses.mit;
+      maintainers = with lib.maintainers; [ AndersonTorres ];
+    };
+  };
+in
+self
diff --git a/pkgs/by-name/gi/git-bug-migration/package.nix b/pkgs/by-name/gi/git-bug-migration/package.nix
new file mode 100644
index 000000000000..45e90c521f10
--- /dev/null
+++ b/pkgs/by-name/gi/git-bug-migration/package.nix
@@ -0,0 +1,35 @@
+{ lib, buildGoModule, fetchFromGitHub, git }:
+buildGoModule rec {
+  pname = "git-bug-migration";
+  version = "0.3.4";
+
+  src = fetchFromGitHub {
+    owner = "MichaelMure";
+    repo = "git-bug-migration";
+    rev = "v${version}";
+    hash = "sha256-IOBgrU3C0ZHD2wx9LRVgKEJzDlUj6z2UXlHGU3tdTdQ=";
+  };
+
+  vendorHash = "sha256-Hid9OK91LNjLmDHam0ZlrVQopVOsqbZ+BH2rfQi5lS0=";
+
+  nativeCheckInputs = [ git ];
+
+  ldflags = [
+    "-X main.GitExactTag=${version}"
+    "-X main.GitLastTag=${version}"
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+    git config --global user.name 'Nixpkgs Test User'
+    git config --global user.email 'nobody@localhost'
+  '';
+
+  meta =  with lib; {
+    description = "Tool for upgrading repositories using git-bug to new versions";
+    homepage = "https://github.com/MichaelMure/git-bug-migration";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ DeeUnderscore ];
+    mainProgram = "git-bug-migration";
+  };
+}
diff --git a/pkgs/by-name/gi/git-bug/package.nix b/pkgs/by-name/gi/git-bug/package.nix
new file mode 100644
index 000000000000..7db43130ab4c
--- /dev/null
+++ b/pkgs/by-name/gi/git-bug/package.nix
@@ -0,0 +1,44 @@
+{ lib, buildGoModule, fetchFromGitHub, installShellFiles }:
+
+buildGoModule rec {
+  pname = "git-bug";
+  version = "0.8.0";
+
+  src = fetchFromGitHub {
+    owner = "git-bug";
+    repo = "git-bug";
+    rev = "v${version}";
+    sha256 = "12byf6nsamwz0ssigan1z299s01cyh8bhgj86bibl90agd4zs9n8";
+  };
+
+  vendorHash = "sha256-32kNDoBE50Jx1Ef9YwhDk7nd3CaTSnHPlu7PgWPUGfE=";
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  doCheck = false;
+
+  excludedPackages = [ "doc" "misc" ];
+
+  ldflags = [
+    "-X github.com/MichaelMure/git-bug/commands.GitCommit=v${version}"
+    "-X github.com/MichaelMure/git-bug/commands.GitLastTag=${version}"
+    "-X github.com/MichaelMure/git-bug/commands.GitExactTag=${version}"
+  ];
+
+  postInstall = ''
+    installShellCompletion \
+      --bash misc/completion/bash/git-bug \
+      --zsh misc/completion/zsh/git-bug \
+      --fish misc/completion/fish/git-bug
+
+    installManPage doc/man/*
+  '';
+
+  meta = with lib; {
+    description = "Distributed bug tracker embedded in Git";
+    homepage = "https://github.com/git-bug/git-bug";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ royneary DeeUnderscore sudoforge ];
+    mainProgram = "git-bug";
+  };
+}
diff --git a/pkgs/by-name/gi/git-cache/package.nix b/pkgs/by-name/gi/git-cache/package.nix
new file mode 100644
index 000000000000..a099f92f504d
--- /dev/null
+++ b/pkgs/by-name/gi/git-cache/package.nix
@@ -0,0 +1,28 @@
+{fetchFromGitHub, lib, stdenv}:
+
+stdenv.mkDerivation {
+  pname = "git-cache";
+  version = "2018-06-18";
+
+  src = fetchFromGitHub {
+    owner = "Seb35";
+    repo = "git-cache";
+    rev = "354f661e40b358c5916c06957bd6b2c65426f452";
+    hash = "sha256-V7rQOy+s9Lzdc+RTA2QGPfyavw4De/qQ+tWrzYtO2qA=";
+  };
+
+  dontBuild = true;
+
+  installPhase = ''
+    install -Dm555 git-cache $out/bin/git-cache
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/Seb35/git-cache";
+    license = licenses.wtfpl;
+    description = "Program to add and manage a system-wide or user-wide cache for remote git repositories";
+    mainProgram = "git-cache";
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ maxhearnden ];
+  };
+}
diff --git a/pkgs/by-name/gi/git-chain/package.nix b/pkgs/by-name/gi/git-chain/package.nix
new file mode 100644
index 000000000000..1b66e4eb5d21
--- /dev/null
+++ b/pkgs/by-name/gi/git-chain/package.nix
@@ -0,0 +1,48 @@
+{
+  lib,
+  fetchFromGitHub,
+  rustPlatform,
+  pkg-config,
+  openssl,
+  git,
+  nix-update-script,
+  stdenv,
+  darwin,
+}:
+
+rustPlatform.buildRustPackage {
+  pname = "git-chain";
+  version = "0-unstable-2024-08-09";
+
+  src = fetchFromGitHub {
+    owner = "dashed";
+    repo = "git-chain";
+    rev = "4fee033ea1ee51bbb6b7f75411f0f4f799aea1e2";
+    hash = "sha256-wQZXixg7mCBUo18z/WCkTWW3R0j2jxs8t1yaQzY3Eu4=";
+  };
+
+  cargoHash = "sha256-pRxOrlDgfSpUBY2WKfoIH9ngLzb2noiLqxA3/6s+mRw=";
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs =
+    [ openssl ]
+    ++ lib.optionals stdenv.hostPlatform.isDarwin (
+      with darwin.apple_sdk.frameworks;
+      [
+        Security
+      ]
+    );
+
+  nativeCheckInputs = [ git ];
+
+  passthru.updateScript = nix-update-script { extraArgs = [ "--version=branch" ]; };
+
+  meta = with lib; {
+    description = "Tool for rebasing a chain of local git branches";
+    homepage = "https://github.com/dashed/git-chain";
+    license = licenses.mit;
+    mainProgram = "git-chain";
+    maintainers = with maintainers; [ bcyran ];
+  };
+}
diff --git a/pkgs/by-name/gi/git-chglog/package.nix b/pkgs/by-name/gi/git-chglog/package.nix
new file mode 100644
index 000000000000..eccc508fc257
--- /dev/null
+++ b/pkgs/by-name/gi/git-chglog/package.nix
@@ -0,0 +1,27 @@
+{ lib, fetchFromGitHub, buildGoModule }:
+
+buildGoModule rec {
+  pname = "git-chglog";
+  version = "0.15.4";
+
+  src = fetchFromGitHub {
+    owner = "git-chglog";
+    repo = "git-chglog";
+    rev = "v${version}";
+    sha256 = "sha256-rTJn2vUrEnmG2japqCxHv3BR9MpmMfpMLO2FBP6ONbw=";
+  };
+
+  vendorHash = "sha256-skhEHpSnxOTZrL8XLlQZL3s224mg8XRINKJnatYCQko=";
+
+  ldflags = [ "-s" "-w" "-X=main.Version=v${version}" ];
+
+  subPackages = [ "cmd/git-chglog" ];
+
+  meta = with lib; {
+    description = "CHANGELOG generator implemented in Go (Golang)";
+    homepage = "https://github.com/git-chglog/git-chglog";
+    license = licenses.mit;
+    maintainers = with maintainers; [ ldenefle ];
+    mainProgram = "git-chglog";
+  };
+}
diff --git a/pkgs/by-name/gi/git-codereview/package.nix b/pkgs/by-name/gi/git-codereview/package.nix
new file mode 100644
index 000000000000..a55fe7e3e7ed
--- /dev/null
+++ b/pkgs/by-name/gi/git-codereview/package.nix
@@ -0,0 +1,27 @@
+{ lib, buildGoModule, fetchFromGitHub, git }:
+
+buildGoModule rec {
+  pname = "git-codereview";
+  version = "1.12.0";
+
+  src = fetchFromGitHub {
+    owner = "golang";
+    repo = "review";
+    rev = "v${version}";
+    hash = "sha256-s3Re+LD3B8TAjamOSu66AfhaiIdcBoTjxEWxHEWSLPA=";
+  };
+
+  vendorHash = null;
+
+  ldflags = [ "-s" "-w" ];
+
+  nativeCheckInputs = [ git ];
+
+  meta = with lib; {
+    description = "Manage the code review process for Git changes using a Gerrit server";
+    homepage = "https://golang.org/x/review/git-codereview";
+    license = licenses.bsd3;
+    maintainers = [ maintainers.edef ];
+    mainProgram = "git-codereview";
+  };
+}
diff --git a/pkgs/by-name/gi/git-cola/package.nix b/pkgs/by-name/gi/git-cola/package.nix
new file mode 100644
index 000000000000..fac196e9ad0c
--- /dev/null
+++ b/pkgs/by-name/gi/git-cola/package.nix
@@ -0,0 +1,69 @@
+{ stdenv
+, lib
+, fetchFromGitHub
+, python3Packages
+, gettext
+, git
+, qt5
+, gitUpdater
+}:
+
+python3Packages.buildPythonApplication rec {
+  pname = "git-cola";
+  version = "4.8.2";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "git-cola";
+    repo = "git-cola";
+    rev = "v${version}";
+    hash = "sha256-8OErZ6uKTWE245BoBu9lQyTLA43DfWaYDv3wbPWaufg=";
+  };
+
+  buildInputs = lib.optionals stdenv.hostPlatform.isLinux [
+    qt5.qtwayland
+  ];
+
+  propagatedBuildInputs = with python3Packages; [
+    setuptools
+    git
+    pyqt5
+    qtpy
+    send2trash
+    polib
+  ];
+
+  nativeBuildInputs = with python3Packages; [
+    setuptools-scm
+    gettext
+    qt5.wrapQtAppsHook
+  ];
+
+  nativeCheckInputs = with python3Packages; [
+    git
+    pytestCheckHook
+  ];
+
+  disabledTestPaths = [
+    "qtpy/"
+    "contrib/win32"
+  ] ++ lib.optionals stdenv.hostPlatform.isDarwin [
+    "cola/inotify.py"
+  ];
+
+  preFixup = ''
+    makeWrapperArgs+=("''${qtWrapperArgs[@]}")
+  '';
+
+  passthru.updateScript = gitUpdater {
+    rev-prefix = "v";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/git-cola/git-cola";
+    description = "Sleek and powerful Git GUI";
+    license = licenses.gpl2;
+    maintainers = [ maintainers.bobvanderlinden ];
+    mainProgram = "git-cola";
+  };
+}
diff --git a/pkgs/by-name/gi/git-crecord/package.nix b/pkgs/by-name/gi/git-crecord/package.nix
new file mode 100644
index 000000000000..5365dc4e43ae
--- /dev/null
+++ b/pkgs/by-name/gi/git-crecord/package.nix
@@ -0,0 +1,26 @@
+{ lib, fetchFromGitHub, python3 }:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "git-crecord";
+  version = "20230226.0";
+
+  src = fetchFromGitHub {
+    owner = "andrewshadura";
+    repo = "git-crecord";
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-zsrMAD9EU+TvkWfWl9x6WbMXuw7YEz50LxQzSFVkKdQ=";
+  };
+
+  propagatedBuildInputs = with python3.pkgs; [ docutils ];
+
+  # has no tests
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/andrewshadura/git-crecord";
+    description = "Git subcommand to interactively select changes to commit or stage";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ onny ];
+    mainProgram = "git-crecord";
+  };
+}
diff --git a/pkgs/by-name/gi/git-credential-oauth/package.nix b/pkgs/by-name/gi/git-credential-oauth/package.nix
new file mode 100644
index 000000000000..209a3e8f7d08
--- /dev/null
+++ b/pkgs/by-name/gi/git-credential-oauth/package.nix
@@ -0,0 +1,36 @@
+{ lib, buildGoModule, fetchFromGitHub, installShellFiles }:
+
+buildGoModule rec {
+  pname = "git-credential-oauth";
+  version = "0.13.3";
+
+  src = fetchFromGitHub {
+    owner = "hickford";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-vs+PRFyvzn25nM6oO4VybXkTr1frmSspA2isSXLJFQo=";
+  };
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  ldflags = [
+    "-s"
+    "-w"
+    "-X main.version=${version}"
+  ];
+
+  vendorHash = "sha256-muK8UZW+8bhC6K0FvN6B7evTMeZnMeYlrIMJdJprPLM=";
+
+  postInstall = ''
+    installManPage $src/git-credential-oauth.1
+  '';
+
+  meta = {
+    description = "Git credential helper that securely authenticates to GitHub, GitLab and BitBucket using OAuth";
+    homepage = "https://github.com/hickford/git-credential-oauth";
+    changelog = "https://github.com/hickford/git-credential-oauth/releases/tag/${src.rev}";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ shyim ];
+    mainProgram = "git-credential-oauth";
+  };
+}
diff --git a/pkgs/by-name/gi/git-crypt/package.nix b/pkgs/by-name/gi/git-crypt/package.nix
new file mode 100644
index 000000000000..2355f48bcb77
--- /dev/null
+++ b/pkgs/by-name/gi/git-crypt/package.nix
@@ -0,0 +1,71 @@
+{ fetchFromGitHub
+, git
+, gnupg
+, makeWrapper
+, openssl
+, lib
+, stdenv
+, libxslt
+, docbook_xsl
+}:
+
+stdenv.mkDerivation rec {
+  pname = "git-crypt";
+  version = "0.7.0";
+
+  src = fetchFromGitHub {
+    owner = "AGWA";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-GcGCX6hoKL+sNLAeGEzZpaM+cdFjcNlwYExfOFEPi0I=";
+  };
+
+  strictDeps = true;
+
+  nativeBuildInputs = [ libxslt makeWrapper ];
+
+  buildInputs = [ openssl ];
+
+  postPatch = ''
+    substituteInPlace commands.cpp \
+      --replace '(escape_shell_arg(our_exe_path()))' '= "git-crypt"'
+  '';
+
+  makeFlags = [
+    "PREFIX=${placeholder "out"}"
+    "ENABLE_MAN=yes"
+    "DOCBOOK_XSL=${docbook_xsl}/share/xml/docbook-xsl-nons/manpages/docbook.xsl"
+  ];
+
+  # https://github.com/AGWA/git-crypt/issues/232
+  CXXFLAGS = [
+    "-DOPENSSL_API_COMPAT=0x30000000L"
+  ];
+
+  postFixup = ''
+    wrapProgram $out/bin/git-crypt \
+      --suffix PATH : ${lib.makeBinPath [ git gnupg ]}
+  '';
+
+  meta = with lib; {
+    homepage = "https://www.agwa.name/projects/git-crypt";
+    description = "Transparent file encryption in git";
+    longDescription = ''
+      git-crypt enables transparent encryption and decryption of files in a git
+      repository. Files which you choose to protect are encrypted when
+      committed, and decrypted when checked out. git-crypt lets you freely
+      share a repository containing a mix of public and private
+      content. git-crypt gracefully degrades, so developers without the secret
+      key can still clone and commit to a repository with encrypted files. This
+      lets you store your secret material (such as keys or passwords) in the
+      same repository as your code, without requiring you to lock down your
+      entire repository.
+    '';
+    downloadPage = "https://github.com/AGWA/git-crypt/releases";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ dochang ];
+    platforms = platforms.unix;
+    mainProgram = "git-crypt";
+  };
+
+}
diff --git a/pkgs/by-name/gi/git-delete-merged-branches/package.nix b/pkgs/by-name/gi/git-delete-merged-branches/package.nix
new file mode 100644
index 000000000000..423dc72d24ff
--- /dev/null
+++ b/pkgs/by-name/gi/git-delete-merged-branches/package.nix
@@ -0,0 +1,28 @@
+{ lib, python3Packages, fetchFromGitHub, git }:
+
+python3Packages.buildPythonApplication rec {
+  pname = "git-delete-merged-branches";
+  version = "7.4.1";
+
+  src = fetchFromGitHub {
+    owner = "hartwork";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-1CUwac2TPU5s1uLS1zPvtXZEGCWYwm1y935jqbI173Q=";
+  };
+
+  propagatedBuildInputs = with python3Packages; [
+    colorama
+    prompt-toolkit
+  ];
+
+  nativeCheckInputs = [ git ]
+    ++ (with python3Packages; [ parameterized ]);
+
+  meta = with lib; {
+    description = "Command-line tool to delete merged Git branches";
+    homepage = "https://pypi.org/project/git-delete-merged-branches/";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
diff --git a/pkgs/by-name/gi/git-dive/package.nix b/pkgs/by-name/gi/git-dive/package.nix
new file mode 100644
index 000000000000..b80397e142bf
--- /dev/null
+++ b/pkgs/by-name/gi/git-dive/package.nix
@@ -0,0 +1,69 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, pkg-config
+, libgit2
+, oniguruma
+, zlib
+, stdenv
+, darwin
+, git
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "git-dive";
+  version = "0.1.6";
+
+  src = fetchFromGitHub {
+    owner = "gitext-rs";
+    repo = "git-dive";
+    rev = "v${version}";
+    hash = "sha256-sy2qNFn8JLE173HVWfFXBx21jcx4kpFMwi9a0m38lso=";
+  };
+
+  cargoHash = "sha256-Z3TgVunC/qNzUe0X9xIg3fTFXFk2w9yDA+EskSCg0Qo=";
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+
+  buildInputs = [
+    libgit2
+    oniguruma
+    zlib
+  ] ++ lib.optionals stdenv.hostPlatform.isDarwin [
+    darwin.apple_sdk.frameworks.Security
+  ];
+
+  nativeCheckInputs = [
+    git
+  ];
+
+  # don't use vendored libgit2
+  buildNoDefaultFeatures = true;
+
+  checkFlags = [
+    # requires internet access
+    "--skip=screenshot"
+  ];
+
+  preCheck = ''
+    export HOME=$(mktemp -d)
+    git config --global user.name nixbld
+    git config --global user.email nixbld@example.com
+  '';
+
+  env = {
+    LIBGIT2_NO_VENDOR = 1;
+    RUSTONIG_SYSTEM_LIBONIG = true;
+  };
+
+  meta = with lib; {
+    description = "Dive into a file's history to find root cause";
+    homepage = "https://github.com/gitext-rs/git-dive";
+    changelog = "https://github.com/gitext-rs/git-dive/blob/${src.rev}/CHANGELOG.md";
+    license = with licenses; [ asl20 mit ];
+    maintainers = with maintainers; [ figsoda ];
+    mainProgram = "git-dive";
+  };
+}
diff --git a/pkgs/by-name/gi/git-extras/package.nix b/pkgs/by-name/gi/git-extras/package.nix
new file mode 100644
index 000000000000..53382b2c2403
--- /dev/null
+++ b/pkgs/by-name/gi/git-extras/package.nix
@@ -0,0 +1,47 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, unixtools
+, which
+}:
+
+stdenv.mkDerivation rec {
+  pname = "git-extras";
+  version = "7.3.0";
+
+  src = fetchFromGitHub {
+    owner = "tj";
+    repo = "git-extras";
+    rev = version;
+    sha256 = "sha256-0XZwEhDjh+rL6ZEWb60+GUw7hFOS3Xr32hgPNJcOL9I=";
+  };
+
+  postPatch = ''
+    patchShebangs check_dependencies.sh
+  '';
+
+  nativeBuildInputs = [
+    unixtools.column
+    which
+  ];
+
+  dontBuild = true;
+
+  installFlags = [
+    "PREFIX=${placeholder "out"}"
+    "SYSCONFDIR=${placeholder "out"}/share"
+  ];
+
+  postInstall = ''
+    # bash completion is already handled by make install
+    install -D etc/git-extras-completion.zsh $out/share/zsh/site-functions/_git_extras
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/tj/git-extras";
+    description = "GIT utilities -- repo summary, repl, changelog population, author commit percentages and more";
+    license = licenses.mit;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+  };
+}
diff --git a/pkgs/by-name/gi/git-fast-export/package.nix b/pkgs/by-name/gi/git-fast-export/package.nix
new file mode 100644
index 000000000000..f94bf3a3e580
--- /dev/null
+++ b/pkgs/by-name/gi/git-fast-export/package.nix
@@ -0,0 +1,88 @@
+{
+  lib,
+  stdenv,
+  fetchFromGitHub,
+  git,
+  mercurial,
+  makeWrapper,
+  nix-update-script,
+  fetchpatch,
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "fast-export";
+  version = "231118";
+
+  src = fetchFromGitHub {
+    owner = "frej";
+    repo = "fast-export";
+    rev = "v${finalAttrs.version}";
+    hash = "sha256-JUy0t2yzd4bI7WPGG1E8L1topLfR5leV/WTU+u0bCyM=";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://github.com/frej/fast-export/commit/a3d0562737e1e711659e03264e45cb47a5a2f46d.patch?full_index=1";
+      hash = "sha256-vZOHnb5lXO22ElCK4oWQKCcPIqRyZV5axWfZqa84V1Y=";
+    })
+  ];
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [
+    mercurial.python
+    mercurial
+  ];
+
+  installPhase = ''
+    binPath=$out/bin
+    libexecPath=$out/libexec/fast-export
+    sitepackagesPath=$out/${mercurial.python.sitePackages}
+    mkdir -p $binPath $libexecPath $sitepackagesPath
+
+    # Patch shell scripts so they can execute the Python scripts
+    sed -i "s|ROOT=.*|ROOT=$libexecPath|" *.sh
+
+    mv hg-fast-export.sh hg-reset.sh $binPath
+    mv hg-fast-export.py hg-reset.py $libexecPath
+    mv hg2git.py pluginloader plugins $sitepackagesPath
+
+    for script in $out/bin/*.sh; do
+      wrapProgram $script \
+        --prefix PATH : "${git}/bin":"${mercurial.python}/bin":$libexec \
+        --prefix PYTHONPATH : "${mercurial}/${mercurial.python.sitePackages}":$sitepackagesPath
+    done
+  '';
+
+  doInstallCheck = true;
+  # deliberately not adding git or hg into nativeInstallCheckInputs - package should
+  # be able to work without them in runtime env
+  installCheckPhase = ''
+    mkdir repo-hg
+    pushd repo-hg
+    ${mercurial}/bin/hg init
+    echo foo > bar
+    ${mercurial}/bin/hg add bar
+    ${mercurial}/bin/hg commit --message "baz"
+    popd
+
+    mkdir repo-git
+    pushd repo-git
+    ${git}/bin/git init
+    ${git}/bin/git config core.ignoreCase false  # for darwin
+    $out/bin/hg-fast-export.sh -r ../repo-hg/ --hg-hash
+    for s in "foo" "bar" "baz" ; do
+      (${git}/bin/git show | grep $s > /dev/null) && echo $s found
+    done
+    popd
+  '';
+
+  passthru.updateScript = nix-update-script { };
+
+  meta = {
+    description = "Import mercurial into git";
+    homepage = "https://repo.or.cz/w/fast-export.git";
+    license = lib.licenses.gpl2;
+    maintainers = [ lib.maintainers.koral ];
+    platforms = lib.platforms.unix;
+  };
+})
diff --git a/pkgs/by-name/gi/git-fire/package.nix b/pkgs/by-name/gi/git-fire/package.nix
new file mode 100644
index 000000000000..bc7e9f4840b7
--- /dev/null
+++ b/pkgs/by-name/gi/git-fire/package.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation {
+  pname = "git-fire";
+  version = "unstable-2017-08-27";
+
+  src = fetchFromGitHub {
+    owner = "qw3rtman";
+    repo = "git-fire";
+    rev = "d72b68ed356f726c77c60294f9220275f16c9931";
+    sha256 = "1hdwkhyjjx31y0lpjkhbb4f5y9f7g70fnd4c2246cmk2rbsvj5b2";
+  };
+
+  installPhase = ''
+    install -D -m755 $src/git-fire $out/bin/git-fire
+  '';
+
+  meta = with lib; {
+    description = ''
+      Push ALL changes in a git repository
+    '';
+    longDescription = ''
+      In the event of an emergency (fire, etc.), automatically commit all changes/files in a repository, pushing to all known remotes all commits and stashes.
+    '';
+    homepage = "https://github.com/qw3rtman/git-fire";
+    license = licenses.mit;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ swflint ];
+    mainProgram = "git-fire";
+  };
+}
diff --git a/pkgs/by-name/gi/git-fixup/package.nix b/pkgs/by-name/gi/git-fixup/package.nix
index 9a42a529e726..467870e33f32 100644
--- a/pkgs/by-name/gi/git-fixup/package.nix
+++ b/pkgs/by-name/gi/git-fixup/package.nix
@@ -1,4 +1,14 @@
-{ lib, stdenvNoCC, fetchFromGitHub, makeWrapper, git, coreutils, gnused, gnugrep }:
+{
+  lib,
+  stdenvNoCC,
+  fetchFromGitHub,
+  makeWrapper,
+  git,
+  coreutils,
+  gnused,
+  gnugrep,
+  nix-update-script,
+}:
 
 stdenvNoCC.mkDerivation (finalAttrs: {
   pname = "git-fixup";
@@ -28,9 +38,18 @@ stdenvNoCC.mkDerivation (finalAttrs: {
 
   postInstall = ''
     wrapProgram $out/bin/git-fixup \
-      --prefix PATH : "${lib.makeBinPath [ git coreutils gnused gnugrep ]}"
+      --prefix PATH : "${
+        lib.makeBinPath [
+          git
+          coreutils
+          gnused
+          gnugrep
+        ]
+      }"
   '';
 
+  passthru.updateScript = nix-update-script { };
+
   meta = {
     description = "Fighting the copy-paste element of your rebase workflow";
     homepage = "https://github.com/keis/git-fixup";
diff --git a/pkgs/by-name/gi/git-ftp/package.nix b/pkgs/by-name/gi/git-ftp/package.nix
new file mode 100644
index 000000000000..a3087249cadd
--- /dev/null
+++ b/pkgs/by-name/gi/git-ftp/package.nix
@@ -0,0 +1,100 @@
+{ lib
+, resholve
+, fetchFromGitHub
+, fetchpatch
+, bash
+, coreutils
+, git
+, gnugrep
+, gawk
+, curl
+, hostname
+, gnused
+, findutils
+, lftp
+, pandoc
+, man
+}:
+
+resholve.mkDerivation rec {
+  pname = "git-ftp";
+  version = "1.6.0";
+  src = fetchFromGitHub {
+    owner = "git-ftp";
+    repo = "git-ftp";
+    rev = version;
+    sha256 = "1hxkqf7jbrx24q18yxpnd3dxzh4xk6asymwkylp1x7zg6mcci87d";
+  };
+
+  dontBuild = true;
+
+  # fix bug/typo; PRed upstream @
+  # https://github.com/git-ftp/git-ftp/pull/628
+  patches = [
+    (fetchpatch {
+      name = "fix-function-invocation-typo.patch";
+      url = "https://github.com/git-ftp/git-ftp/commit/cddf7cbba80e710758f6aac0ec0d77552ea8cd75.patch";
+      sha256 = "sha256-2B0QaMJi78Bg3bA1jp41aiyql1/LCryoaDs7+xmS1HY=";
+    })
+  ];
+
+  installPhase = ''
+    make install-all prefix=$out
+  '';
+
+  nativeBuildInputs = [ pandoc man ];
+
+  solutions = {
+    git-ftp = {
+      scripts = [ "bin/git-ftp" ];
+      interpreter = "${bash}/bin/bash";
+      inputs = [
+        coreutils
+        git
+        gnugrep
+        gawk
+        curl
+        hostname
+        gnused
+        findutils
+        lftp
+      ];
+      fake = {
+        # don't resolve impure system macOS security
+        # caution: will still be fragile if PATH is bad
+        # TODO: fixable once we figure out how to handle
+        # this entire class of problem...
+        "external" = [ "security" ];
+      };
+      keep = {
+        # looks like run-time user/env/git-config controlled
+        "$GIT_PAGER" = true;
+        "$hook" = true; # presumably git hooks given context
+      };
+      execer = [
+        # TODO: rm when binlore/resholve handle git; manually
+        # checked and see no obvious subexec for now
+        "cannot:${git}/bin/git"
+        /*
+        Mild uncertainty here. There *are* commandlikes in
+        the arguments (especially wait & cd), but I think they are
+        fine as-is, because I'm reading them as:
+        1. ftp commands
+        2. running on the remote anyways
+
+        See https://github.com/git-ftp/git-ftp/blob/057f7d8e9f00ffc5a8c6ceaa4be30af2939df41a/git-ftp#L1214-L1221
+        */
+        "cannot:${lftp}/bin/lftp"
+      ];
+    };
+  };
+
+  meta = with lib; {
+    description = "Git powered FTP client written as shell script";
+    homepage = "https://git-ftp.github.io/";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ tweber ];
+    platforms = platforms.unix;
+    mainProgram = "git-ftp";
+  };
+}
diff --git a/pkgs/by-name/gi/git-gr/package.nix b/pkgs/by-name/gi/git-gr/package.nix
index 96a03ed49e94..a50d389c04d0 100644
--- a/pkgs/by-name/gi/git-gr/package.nix
+++ b/pkgs/by-name/gi/git-gr/package.nix
@@ -35,11 +35,11 @@ rustPlatform.buildRustPackage {
 
   nativeBuildInputs =
     [installShellFiles]
-    ++ lib.optional stdenv.isLinux pkg-config;
+    ++ lib.optional stdenv.hostPlatform.isLinux pkg-config;
 
   buildInputs =
-    lib.optional stdenv.isLinux openssl
-    ++ lib.optionals stdenv.isDarwin [
+    lib.optional stdenv.hostPlatform.isLinux openssl
+    ++ lib.optionals stdenv.hostPlatform.isDarwin [
       libiconv
       darwin.apple_sdk.frameworks.CoreServices
       darwin.apple_sdk.frameworks.SystemConfiguration
diff --git a/pkgs/by-name/gi/git-graph/package.nix b/pkgs/by-name/gi/git-graph/package.nix
new file mode 100644
index 000000000000..e801cb0e23bf
--- /dev/null
+++ b/pkgs/by-name/gi/git-graph/package.nix
@@ -0,0 +1,28 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, stdenv
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "git-graph";
+  version = "unstable-2023-01-14";
+
+  src = fetchFromGitHub {
+    owner = "mlange-42";
+    repo = pname;
+    rev = "9bd54eb0aed6f108364bce9ad0bdff12077038fc";
+    hash = "sha256-tMM/mpt9yzZYSpnOGBuGLM0XTJiiyChfUrERMuyn3mQ=";
+  };
+
+  cargoHash = "sha256-ZLF/l2HnIbmkayWXhjYr01M6lGaGiK2UYyp654ncxgo=";
+
+  meta = with lib; {
+    description = "Command line tool to show clear git graphs arranged for your branching model";
+    homepage = "https://github.com/mlange-42/git-graph";
+    license = licenses.mit;
+    broken = stdenv.hostPlatform.isDarwin;
+    maintainers = with maintainers; [ cafkafk ];
+    mainProgram = "git-graph";
+  };
+}
diff --git a/pkgs/by-name/gi/git-hound/package.nix b/pkgs/by-name/gi/git-hound/package.nix
new file mode 100644
index 000000000000..86efeef1c444
--- /dev/null
+++ b/pkgs/by-name/gi/git-hound/package.nix
@@ -0,0 +1,43 @@
+{ buildGoModule
+, fetchFromGitHub
+, fetchpatch
+, lib
+}:
+
+buildGoModule rec {
+  pname = "git-hound";
+  version = "1.7.2";
+
+  src = fetchFromGitHub {
+    owner = "tillson";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-W+rYDyRIw4jWWO4UZkUHFq/D/7ZXM+y5vdbclk6S0ro=";
+  };
+
+  patches = [
+    # https://github.com/tillson/git-hound/pull/66
+    (fetchpatch {
+      url = "https://github.com/tillson/git-hound/commit/cd8aa19401cfdec9e4d76c1f6eb4d85928ec4b03.patch";
+      hash = "sha256-EkdR2KkxxlMLNtKFGpxsQ/msJT5NcMF7irIUcU2WWJY=";
+    })
+  ];
+
+  # tests fail outside of nix
+  doCheck = false;
+
+  vendorHash = "sha256-8teIa083oMXm0SjzMP+mGOVAel1Hbsp3TSMhdvqVbQs=";
+
+  meta = with lib; {
+    description = "Reconnaissance tool for GitHub code search";
+    longDescription = ''
+      GitHound pinpoints exposed API keys and other sensitive information
+      across all of GitHub using pattern matching, commit history searching,
+      and a unique result scoring system.
+    '';
+    homepage = "https://github.com/tillson/git-hound";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+    mainProgram = "git-hound";
+  };
+}
diff --git a/pkgs/by-name/gi/git-hub/package.nix b/pkgs/by-name/gi/git-hub/package.nix
new file mode 100644
index 000000000000..907721f882b3
--- /dev/null
+++ b/pkgs/by-name/gi/git-hub/package.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv, fetchFromGitHub, gitMinimal, docutils }:
+
+stdenv.mkDerivation rec {
+  pname = "git-hub";
+  version = "2.1.3";
+
+  src = fetchFromGitHub {
+    owner = "sociomantic-tsunami";
+    repo = "git-hub";
+    rev = "v${version}";
+    sha256 = "sha256-fb/WDmBx1Vayu4fLeG+D1nmHJJawgIAAXcQsABsenBo=";
+  };
+
+  nativeBuildInputs = [
+    gitMinimal        # Used during build to generate Bash completion.
+    docutils
+  ];
+
+  postPatch = ''
+    patchShebangs .
+  '';
+
+  enableParallelBuilding = true;
+
+  installFlags = [ "prefix=$(out)" "sysconfdir=$(out)/etc" ];
+
+  postInstall = ''
+    # Remove inert ftdetect vim plugin and a README that's a man page subset:
+    rm -r $out/share/{doc,vim}
+  '';
+
+  meta = with lib; {
+    inherit (src.meta) homepage;
+    description = "Git command line interface to GitHub";
+    longDescription = ''
+      A simple command line interface to GitHub, enabling most useful GitHub
+      tasks (like creating and listing pull request or issues) to be accessed
+      directly through the Git command line.
+    '';
+    license = licenses.gpl3Plus;
+    platforms = platforms.all;
+    mainProgram = "git-hub";
+  };
+}
diff --git a/pkgs/by-name/gi/git-identity/package.nix b/pkgs/by-name/gi/git-identity/package.nix
new file mode 100644
index 000000000000..51addeebc16c
--- /dev/null
+++ b/pkgs/by-name/gi/git-identity/package.nix
@@ -0,0 +1,52 @@
+{
+  lib,
+  stdenvNoCC,
+  fetchFromGitHub,
+  installShellFiles,
+  ronn,
+  nix-update-script,
+}:
+stdenvNoCC.mkDerivation rec {
+  pname = "git-identity";
+  version = "1.1.1";
+
+  src = fetchFromGitHub {
+    owner = "madx";
+    repo = "git-identity";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-u4lIW0bntaKrVUwodXZ8ZwWxSZtLuhVSUAbIj8jjcLw=";
+  };
+
+  nativeBuildInputs = [
+    installShellFiles
+    ronn
+  ];
+
+  buildPhase = ''
+    runHook preBuild
+    ronn --roff git-identity.1.ronn
+    runHook postBuild
+  '';
+
+  installPhase = ''
+    runHook preInstall
+    mkdir -p $out/bin
+    cp git-identity $out/bin/git-identity
+    installManPage git-identity.1
+    installShellCompletion --cmd git-identity \
+      --bash git-identity.bash-completion \
+      --zsh git-identity.zsh-completion
+    runHook postInstall
+  '';
+
+  passthru.updateScript = nix-update-script { };
+
+  meta = {
+    description = "Manage your identity in Git";
+    mainProgram = "git-identity";
+    homepage = "https://github.com/madx/git-identity";
+    license = lib.licenses.wtfpl;
+    maintainers = with lib.maintainers; [ mynacol ];
+    platforms = lib.platforms.all;
+  };
+}
diff --git a/pkgs/by-name/gi/git-igitt/package.nix b/pkgs/by-name/gi/git-igitt/package.nix
index a8c281991686..65ee35a5e763 100644
--- a/pkgs/by-name/gi/git-igitt/package.nix
+++ b/pkgs/by-name/gi/git-igitt/package.nix
@@ -33,7 +33,7 @@ rustPlatform.buildRustPackage {
     libgit2
     oniguruma
     zlib
-  ] ++ lib.optionals stdenv.isDarwin [ darwin.apple_sdk.frameworks.Security ];
+  ] ++ lib.optionals stdenv.hostPlatform.isDarwin [ darwin.apple_sdk.frameworks.Security ];
 
   env = {
     RUSTONIG_SYSTEM_LIBONIG = true;
diff --git a/pkgs/by-name/gi/git-ignore/package.nix b/pkgs/by-name/gi/git-ignore/package.nix
new file mode 100644
index 000000000000..12f4f02fd0a2
--- /dev/null
+++ b/pkgs/by-name/gi/git-ignore/package.nix
@@ -0,0 +1,44 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, installShellFiles
+, stdenv
+, darwin
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "git-ignore";
+  version = "1.4.0";
+
+  src = fetchFromGitHub {
+    owner = "sondr3";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-KIdhsbD9v2kCM2C/kSJCleyniEz4Bw7UxBsF762fnJs=";
+  };
+
+  cargoHash = "sha256-UicChl0wD2GSCCHAqF4/FKVq15g9qusNOnNJJW2B/nw=";
+
+  nativeBuildInputs = [
+    installShellFiles
+  ];
+
+  buildInputs = lib.optionals stdenv.hostPlatform.isDarwin [
+    darwin.apple_sdk.frameworks.Security
+  ];
+
+  postInstall = ''
+    assets=$releaseDir/../assets
+    installManPage $assets/git-ignore.1
+    installShellCompletion $assets/git-ignore.{bash,fish} --zsh $assets/_git-ignore
+  '';
+
+  meta = with lib; {
+    description = "Quickly and easily fetch .gitignore templates from gitignore.io";
+    homepage = "https://github.com/sondr3/git-ignore";
+    changelog = "https://github.com/sondr3/git-ignore/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ figsoda ];
+    mainProgram = "git-ignore";
+  };
+}
diff --git a/pkgs/by-name/gi/git-instafix/package.nix b/pkgs/by-name/gi/git-instafix/package.nix
index d05e9fab8726..18ab6f5fa0bd 100644
--- a/pkgs/by-name/gi/git-instafix/package.nix
+++ b/pkgs/by-name/gi/git-instafix/package.nix
@@ -37,6 +37,6 @@ rustPlatform.buildRustPackage {
     license = with licenses; [ mit asl20 ];
     maintainers = with maintainers; [ mightyiam quodlibetor ];
     changelog = "https://github.com/quodlibetor/git-instafix/releases/tag/v${version}";
-    broken = stdenv.isDarwin;
+    broken = stdenv.hostPlatform.isDarwin;
   };
 }
diff --git a/pkgs/by-name/gi/git-interactive-rebase-tool/package.nix b/pkgs/by-name/gi/git-interactive-rebase-tool/package.nix
new file mode 100644
index 000000000000..fef465d9446e
--- /dev/null
+++ b/pkgs/by-name/gi/git-interactive-rebase-tool/package.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, fetchFromGitHub, rustPlatform, libiconv, apple-sdk_11 }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "git-interactive-rebase-tool";
+  version = "2.4.1";
+
+  src = fetchFromGitHub {
+    owner = "MitMaro";
+    repo = pname;
+    rev = version;
+    hash = "sha256-NlnESZua4OP7rhMoER/VgBST9THqISQ0LCG1ZakNTqs=";
+  };
+
+  cargoHash = "sha256-9pUUKxPpyoX9f10ZiLWsol2rv66WzQqwa6VubRTrT9Y=";
+
+  buildInputs = lib.optionals stdenv.hostPlatform.isDarwin [ libiconv apple-sdk_11 ];
+
+  # Compilation during tests fails if this env var is not set.
+  preCheck = "export GIRT_BUILD_GIT_HASH=${version}";
+  postCheck = "unset GIRT_BUILD_GIT_HASH";
+
+  meta = with lib; {
+    homepage = "https://github.com/MitMaro/git-interactive-rebase-tool";
+    description = "Native cross platform full feature terminal based sequence editor for git interactive rebase";
+    changelog = "https://github.com/MitMaro/git-interactive-rebase-tool/releases/tag/${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ SuperSandro2000 zowoq ma27 ];
+    mainProgram = "interactive-rebase-tool";
+  };
+}
diff --git a/pkgs/by-name/gi/git-latexdiff/package.nix b/pkgs/by-name/gi/git-latexdiff/package.nix
new file mode 100644
index 000000000000..e7e4351a2088
--- /dev/null
+++ b/pkgs/by-name/gi/git-latexdiff/package.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv, fetchFromGitLab, git, bash }:
+
+stdenv.mkDerivation rec {
+  version = "1.6.0";
+  pname = "git-latexdiff";
+
+  src = fetchFromGitLab {
+    hash = "sha256-DMoGEbCBuqUGjbna3yDpD4WNTikPudYRD4Wy1pPG2mw=";
+    rev = version;
+    repo = "git-latexdiff";
+    owner = "git-latexdiff";
+  };
+
+  buildInputs = [ git bash ];
+
+  dontBuild = true;
+
+  patches = [ ./version-test.patch ];
+
+  postPatch = ''
+    substituteInPlace git-latexdiff \
+      --replace "@GIT_LATEXDIFF_VERSION@" "v${version}"
+    patchShebangs git-latexdiff
+  '';
+
+  installPhase = ''
+    mkdir -p $prefix/bin
+    mv git-latexdiff $prefix/bin
+    chmod +x $prefix/bin/git-latexdiff
+  '';
+
+  meta = with lib; {
+    description = "View diff on LaTeX source files on the generated PDF files";
+    homepage = "https://gitlab.com/git-latexdiff/git-latexdiff";
+    maintainers = [ ];
+    license = licenses.bsd3; # https://gitlab.com/git-latexdiff/git-latexdiff/issues/9
+    platforms = platforms.unix;
+    mainProgram = "git-latexdiff";
+  };
+}
diff --git a/pkgs/by-name/gi/git-latexdiff/version-test.patch b/pkgs/by-name/gi/git-latexdiff/version-test.patch
new file mode 100644
index 000000000000..243bd90f9005
--- /dev/null
+++ b/pkgs/by-name/gi/git-latexdiff/version-test.patch
@@ -0,0 +1,17 @@
+Fix for https://gitlab.com/git-latexdiff/git-latexdiff/issues/7
+---
+--- src/git-latexdiff	2016-01-26 14:04:54.338568955 +0100
++++ src/git-latexdiff	2016-01-26 14:40:23.700381943 +0100
+@@ -44,11 +44,7 @@
+ git_latexdiff_version='@GIT_LATEXDIFF_VERSION@'
+
+ git_latexdiff_compute_version () {
+-    if [ "$git_latexdiff_version" = '@GIT_LATEXDIFF''_VERSION@' ]; then
+-	(cd "$(dirname "$0")" && git describe --tags HEAD 2>/dev/null || echo 'Unknown version')
+-    else
+-	echo "$git_latexdiff_version"
+-    fi
++    echo "$git_latexdiff_version"
+ }
+
+ usage () {
diff --git a/pkgs/by-name/gi/git-mit/package.nix b/pkgs/by-name/gi/git-mit/package.nix
new file mode 100644
index 000000000000..e334ef8c9fb6
--- /dev/null
+++ b/pkgs/by-name/gi/git-mit/package.nix
@@ -0,0 +1,49 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, pkg-config
+, libgit2
+, openssl
+, zlib
+, stdenv
+, darwin
+}:
+
+let
+  version = "5.13.30";
+in
+rustPlatform.buildRustPackage {
+  pname = "git-mit";
+  inherit version;
+
+  src = fetchFromGitHub {
+    owner = "PurpleBooth";
+    repo = "git-mit";
+    rev = "v${version}";
+    hash = "sha256-HBY9YJk7LvhCGAuXsWpugD5uSitLc1f/F4Ms4PxhZUo=";
+  };
+
+  cargoHash = "sha256-XMlVGr88RWwfJ2gHTSxdOxgUDlf51ra/opL66Dkd1p4=";
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [
+    libgit2
+    openssl
+    zlib
+  ] ++ lib.optionals stdenv.hostPlatform.isDarwin [
+    darwin.apple_sdk.frameworks.AppKit
+  ];
+
+  env = {
+    LIBGIT2_NO_VENDOR = 1;
+  };
+
+  meta = with lib; {
+    description = "Minimalist set of hooks to aid pairing and link commits to issues";
+    homepage = "https://github.com/PurpleBooth/git-mit";
+    changelog = "https://github.com/PurpleBooth/git-mit/releases/tag/v${version}";
+    license = licenses.cc0;
+    maintainers = with maintainers; [ figsoda ];
+  };
+}
diff --git a/pkgs/by-name/gi/git-nomad/package.nix b/pkgs/by-name/gi/git-nomad/package.nix
new file mode 100644
index 000000000000..659a342247c9
--- /dev/null
+++ b/pkgs/by-name/gi/git-nomad/package.nix
@@ -0,0 +1,31 @@
+{
+  lib,
+  rustPlatform,
+  fetchFromGitHub,
+  git,
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "git-nomad";
+  version = "0.7.1";
+
+  src = fetchFromGitHub {
+    owner = "rraval";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-N+iPr389l9PDfJIhvRL6ziGSPI6pgvfdGX6wxmapLhA=";
+  };
+
+  cargoHash = "sha256-7CZC29y9dLpyanolO+epKd0KwmRc1iGY+sPM9f/j5hk=";
+
+  nativeCheckInputs = [ git ];
+
+  meta = with lib; {
+    description = "Synchronize work-in-progress git branches in a light weight fashion";
+    homepage = "https://github.com/rraval/git-nomad";
+    changelog = "https://github.com/rraval/git-nomad/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ rraval ];
+    mainProgram = "git-nomad";
+  };
+}
diff --git a/pkgs/by-name/gi/git-octopus/package.nix b/pkgs/by-name/gi/git-octopus/package.nix
new file mode 100644
index 000000000000..3865c9ac83b8
--- /dev/null
+++ b/pkgs/by-name/gi/git-octopus/package.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, fetchFromGitHub, git, perl, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  pname = "git-octopus";
+  version = "1.4";
+
+  installFlags = [ "prefix=$(out)" ];
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  # perl provides shasum
+  postInstall = ''
+    for f in $out/bin/*; do
+      wrapProgram $f --prefix PATH : ${lib.makeBinPath [ git perl ]}
+    done
+  '';
+
+  src = fetchFromGitHub {
+    owner = "lesfurets";
+    repo = "git-octopus";
+    rev = "v${version}";
+    sha256 = "14p61xk7jankp6gc26xciag9fnvm7r9vcbhclcy23f4ghf4q4sj1";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/lesfurets/git-octopus";
+    description = "Continuous merge workflow";
+    license = licenses.lgpl3;
+    platforms = platforms.unix;
+    maintainers = [maintainers.mic92];
+  };
+}
diff --git a/pkgs/by-name/gi/git-open/package.nix b/pkgs/by-name/gi/git-open/package.nix
new file mode 100644
index 000000000000..1b4153f2ad1d
--- /dev/null
+++ b/pkgs/by-name/gi/git-open/package.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv, xdg-utils, gnugrep, fetchFromGitHub, installShellFiles, makeWrapper, pandoc }:
+
+stdenv.mkDerivation rec {
+  pname = "git-open";
+  version = "3.0.0";
+
+  src = fetchFromGitHub {
+    owner = "paulirish";
+    repo = "git-open";
+    rev = "v${version}";
+    sha256 = "sha256-Bag2rI2uR7ilkg2ozjR8tPXqKz5XjiY7WAUJKTVTXd8=";
+  };
+
+  nativeBuildInputs = [ installShellFiles makeWrapper pandoc ];
+
+  buildPhase = ''
+    # marked-man is broken and severly outdated.
+    # pandoc with some extra metadata is good enough and produces a by man readable file.
+    cat <(echo echo '% git-open (1) Version ${version} | Git manual') git-open.1.md > tmp
+    mv tmp git-open.1.md
+    pandoc --standalone --to man git-open.1.md -o git-open.1
+  '';
+
+  installPhase = ''
+    mkdir -p $out/bin
+    mv git-open $out/bin
+    installManPage git-open.1
+    wrapProgram $out/bin/git-open \
+      --prefix PATH : "${lib.makeBinPath [ gnugrep ]}" \
+      --suffix PATH : "${lib.makeBinPath [ xdg-utils ]}"
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/paulirish/git-open";
+    description = "Open the GitHub page or website for a repository in your browser";
+    license = licenses.mit;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ SuperSandro2000 ];
+    mainProgram = "git-open";
+  };
+}
diff --git a/pkgs/by-name/gi/git-privacy/package.nix b/pkgs/by-name/gi/git-privacy/package.nix
new file mode 100644
index 000000000000..3d3d7521f28d
--- /dev/null
+++ b/pkgs/by-name/gi/git-privacy/package.nix
@@ -0,0 +1,48 @@
+{ lib
+, fetchFromGitHub
+, git
+, python3
+}:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "git-privacy";
+  version = "2.3.0";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "EMPRI-DEVOPS";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-b2RkRL8/mZwqc3xCs+oltzualhQtp/7F9POlLlT3UUU=";
+  };
+
+  propagatedBuildInputs = with python3.pkgs; [
+    click
+    git-filter-repo
+    gitpython
+    pynacl
+    setuptools
+  ];
+
+  nativeCheckInputs = with python3.pkgs; [
+    git
+    pytestCheckHook
+  ];
+
+  disabledTests = [
+    # Tests want to interact with a git repo
+    "TestGitPrivacy"
+  ];
+
+  pythonImportsCheck = [
+    "gitprivacy"
+  ];
+
+  meta = with lib; {
+    description = "Tool to redact Git author and committer dates";
+    homepage = "https://github.com/EMPRI-DEVOPS/git-privacy";
+    license = with licenses; [ bsd2 ];
+    maintainers = with maintainers; [ fab ];
+    mainProgram = "git-privacy";
+  };
+}
diff --git a/pkgs/by-name/gi/git-prole/package.nix b/pkgs/by-name/gi/git-prole/package.nix
new file mode 100644
index 000000000000..9519c7840eeb
--- /dev/null
+++ b/pkgs/by-name/gi/git-prole/package.nix
@@ -0,0 +1,40 @@
+{
+  lib,
+  fetchFromGitHub,
+  rustPlatform,
+  git,
+  bash,
+  nix-update-script,
+}:
+let
+  version = "0.5.1";
+in
+rustPlatform.buildRustPackage {
+  pname = "git-prole";
+  inherit version;
+
+  src = fetchFromGitHub {
+    owner = "9999years";
+    repo = "git-prole";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-jJEskahZRCpM2WEH4myTLfowQxEJ4WCNXbTwGkwBHnY=";
+  };
+
+  cargoHash = "sha256-u4UJH+dIDI+I6fEQTRe3RRufYZwxBENxnwULSSCOZF8=";
+
+  nativeCheckInputs = [
+    git
+    bash
+  ];
+
+  meta = {
+    homepage = "https://github.com/9999years/git-prole";
+    changelog = "https://github.com/9999years/git-prole/releases/tag/v${version}";
+    description = "`git-worktree(1)` manager";
+    license = [ lib.licenses.mit ];
+    maintainers = [ lib.maintainers._9999years ];
+    mainProgram = "git-prole";
+  };
+
+  passthru.updateScript = nix-update-script { };
+}
diff --git a/pkgs/by-name/gi/git-quick-stats/package.nix b/pkgs/by-name/gi/git-quick-stats/package.nix
new file mode 100644
index 000000000000..113388c48cd3
--- /dev/null
+++ b/pkgs/by-name/gi/git-quick-stats/package.nix
@@ -0,0 +1,52 @@
+{ lib, stdenv
+, fetchFromGitHub
+, makeWrapper
+, coreutils
+, gawk
+, git
+, gnugrep
+, ncurses
+, util-linux
+}:
+
+stdenv.mkDerivation rec {
+  pname = "git-quick-stats";
+  version = "2.5.7";
+
+  src = fetchFromGitHub {
+    repo = "git-quick-stats";
+    owner = "arzzen";
+    rev = version;
+    sha256 = "sha256-TGwoW4jpXbFdxk9HAZJTDhXIHhR1QEcDRCjspBv2KdQ=";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  installFlags = [
+    "PREFIX=${builtins.placeholder "out"}"
+  ];
+
+  postInstall =
+    let
+      path = lib.makeBinPath [
+        coreutils
+        gawk
+        git
+        gnugrep
+        ncurses
+        util-linux
+      ];
+    in
+    ''
+      wrapProgram $out/bin/git-quick-stats --suffix PATH : ${path}
+    '';
+
+  meta = with lib; {
+    homepage = "https://github.com/arzzen/git-quick-stats";
+    description = "Simple and efficient way to access various statistics in git repository";
+    platforms = platforms.all;
+    maintainers = [ maintainers.kmein ];
+    license = licenses.mit;
+    mainProgram = "git-quick-stats";
+  };
+}
diff --git a/pkgs/by-name/gi/git-radar/package.nix b/pkgs/by-name/gi/git-radar/package.nix
new file mode 100644
index 000000000000..59ec4b61d85c
--- /dev/null
+++ b/pkgs/by-name/gi/git-radar/package.nix
@@ -0,0 +1,35 @@
+{ coreutils-prefixed, lib, makeWrapper, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "git-radar";
+  version = "0.6";
+
+  src = fetchFromGitHub {
+    owner = "michaeldfallen";
+    repo = "git-radar";
+    rev = "v${version}";
+    sha256 = "0c3zp8s4w7m4s71qgwk1jyfc8yzw34f2hi43x1w437ypgabwg81j";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  dontBuild = true;
+
+  installPhase = ''
+    mkdir -p $out/bin
+    cp git-radar fetch.sh prompt.bash prompt.zsh radar-base.sh $out
+    ln -s $out/git-radar $out/bin
+    ${lib.optionalString stdenv.hostPlatform.isDarwin ''
+      wrapProgram $out/git-radar --prefix PATH : ${lib.makeBinPath [ coreutils-prefixed ]}
+    ''}
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/michaeldfallen/git-radar";
+    license = licenses.mit;
+    description = "Tool you can add to your prompt to provide at-a-glance information on your git repo";
+    platforms = with platforms; linux ++ darwin;
+    maintainers = with maintainers; [ kamilchm ];
+    mainProgram = "git-radar";
+  };
+}
diff --git a/pkgs/by-name/gi/git-relevant-history/package.nix b/pkgs/by-name/gi/git-relevant-history/package.nix
new file mode 100644
index 000000000000..063aa3215705
--- /dev/null
+++ b/pkgs/by-name/gi/git-relevant-history/package.nix
@@ -0,0 +1,25 @@
+{ lib, fetchFromGitHub, python3, git, git-filter-repo }:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "git-relevant-history";
+  version = "2022-09-15";
+  src = fetchFromGitHub {
+    owner = "rainlabs-eu";
+    repo = pname;
+    rev = "84552324d7cb4790db86282fc61bf98a05b7a4fd";
+    hash = "sha256-46a6TR1Hi3Lg2DTmOp1aV5Uhd4IukTojZkA3TVbTnRY=";
+  };
+  propagatedBuildInputs = [
+    git git-filter-repo
+    python3.pkgs.docopt
+  ];
+
+  meta = with lib; {
+    description = "Extract only relevant history from git repo";
+    homepage = "https://github.com/rainlabs-eu/git-relevant-history";
+    license = licenses.asl20;
+    platforms = platforms.all;
+    maintainers = [ maintainers.bendlas ];
+    mainProgram = "git-relevant-history";
+  };
+}
diff --git a/pkgs/by-name/gi/git-remote-gcrypt/package.nix b/pkgs/by-name/gi/git-remote-gcrypt/package.nix
new file mode 100644
index 000000000000..d3f53b704eeb
--- /dev/null
+++ b/pkgs/by-name/gi/git-remote-gcrypt/package.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv, fetchFromGitHub, docutils, makeWrapper
+, gnupg, curl, rsync, coreutils
+, gawk, gnused, gnugrep
+}:
+
+stdenv.mkDerivation rec {
+  pname = "git-remote-gcrypt";
+  version = "1.5";
+  rev = version;
+
+  src = fetchFromGitHub {
+    inherit rev;
+    owner = "spwhitton";
+    repo = "git-remote-gcrypt";
+    sha256 = "sha256-uy6s3YQwY/aZmQoW/qe1YrSlfNHyDTXBFxB6fPGiPNQ=";
+  };
+
+  outputs = [ "out" "man" ];
+
+  nativeBuildInputs = [ docutils makeWrapper ];
+
+  installPhase = ''
+    prefix="$out" ./install.sh
+    wrapProgram "$out/bin/git-remote-gcrypt" \
+      --prefix PATH ":" "${lib.makeBinPath [ gnupg curl rsync coreutils
+                                                    gawk gnused gnugrep ]}"
+  '';
+
+  meta = with lib; {
+    homepage = "https://spwhitton.name/tech/code/git-remote-gcrypt";
+    description = "Git remote helper for GPG-encrypted remotes";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ ellis montag451 ];
+    platforms = platforms.unix;
+    mainProgram = "git-remote-gcrypt";
+  };
+}
diff --git a/pkgs/by-name/gi/git-remote-hg/package.nix b/pkgs/by-name/gi/git-remote-hg/package.nix
new file mode 100644
index 000000000000..76f40911f076
--- /dev/null
+++ b/pkgs/by-name/gi/git-remote-hg/package.nix
@@ -0,0 +1,32 @@
+{ lib, fetchFromGitHub, python3Packages
+, asciidoc, xmlto, docbook_xsl, docbook_xml_dtd_45, libxslt, libxml2
+}:
+
+python3Packages.buildPythonApplication rec {
+  pname = "git-remote-hg";
+  version = "1.0.3.2";
+
+  src = fetchFromGitHub {
+    owner = "mnauw";
+    repo = "git-remote-hg";
+    rev = "v${version}";
+    sha256 = "0b5lfbrcrvzpz380817md00lbgy5yl4y76vs3vm0bpm5wmr7c027";
+  };
+
+  nativeBuildInputs = [
+    asciidoc xmlto docbook_xsl docbook_xml_dtd_45 libxslt libxml2
+  ];
+  propagatedBuildInputs = with python3Packages; [ mercurial ];
+
+  postInstall = ''
+    make install-doc prefix=$out
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/mnauw/git-remote-hg";
+    description = "Semi-official Mercurial bridge from Git project";
+    license = licenses.gpl2;
+    maintainers = [ ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/pkgs/by-name/gi/git-reparent/package.nix b/pkgs/by-name/gi/git-reparent/package.nix
new file mode 100644
index 000000000000..38a66d6db1db
--- /dev/null
+++ b/pkgs/by-name/gi/git-reparent/package.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, fetchFromGitHub, makeWrapper, git, gnused }:
+
+stdenv.mkDerivation rec {
+  pname = "git-reparent";
+  version = "unstable-2017-09-03";
+
+  src = fetchFromGitHub {
+    owner  = "MarkLodato";
+    repo   = "git-reparent";
+    rev    = "a99554a32524a86421659d0f61af2a6c784b7715";
+    sha256 = "0v0yxydpw6r4awy0hb7sbnh520zsk86ibzh1xjf3983yhsvkfk5v";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  dontBuild = true;
+
+  installPhase = ''
+    install -m755 -Dt $out/bin git-reparent
+  '';
+
+  postFixup = ''
+    wrapProgram $out/bin/git-reparent --prefix PATH : "${lib.makeBinPath [ git gnused ]}"
+  '';
+
+  meta = with lib; {
+    inherit (src.meta) homepage;
+    description = "Git command to recommit HEAD with a new set of parents";
+    maintainers = [ ];
+    license = licenses.gpl2;
+    platforms = platforms.unix;
+    mainProgram = "git-reparent";
+  };
+}
diff --git a/pkgs/by-name/gi/git-repo/import-ssl-module.patch b/pkgs/by-name/gi/git-repo/import-ssl-module.patch
new file mode 100644
index 000000000000..43e879a8ba17
--- /dev/null
+++ b/pkgs/by-name/gi/git-repo/import-ssl-module.patch
@@ -0,0 +1,30 @@
+Fix runtime error due missing import
+
+Traceback (most recent call last):
+  File "/nix/store/4qqhr7g9ri3n7v6ik9ahlpvyp18wcn4p-git-repo-2.15.3/bin/.repo-wrapped", line 1339, in <module>
+    main(sys.argv[1:])
+  File "/nix/store/4qqhr7g9ri3n7v6ik9ahlpvyp18wcn4p-git-repo-2.15.3/bin/.repo-wrapped", line 1304, in main
+    _Init(args, gitc_init=(cmd == 'gitc-init'))
+  File "/nix/store/4qqhr7g9ri3n7v6ik9ahlpvyp18wcn4p-git-repo-2.15.3/bin/.repo-wrapped", line 607, in _Init
+    _Clone(url, dst, opt.clone_bundle, opt.quiet, opt.verbose)
+  File "/nix/store/4qqhr7g9ri3n7v6ik9ahlpvyp18wcn4p-git-repo-2.15.3/bin/.repo-wrapped", line 912, in _Clone
+    if clone_bundle and _DownloadBundle(url, cwd, quiet, verbose):
+  File "/nix/store/4qqhr7g9ri3n7v6ik9ahlpvyp18wcn4p-git-repo-2.15.3/bin/.repo-wrapped", line 860, in _DownloadBundle
+    r = urllib.request.urlopen(url, context=ssl.create_default_context())
+NameError: name 'ssl' is not defined
+builder for '/nix/store/4hvds8fv8xmzlm86yg9cf1lj6hrya7sg-amdvlk-src.drv' failed with exit code 1
+
+diff --git a/repo b/repo
+index 8b05def..f394b3e 100755
+--- a/repo
++++ b/repo
+@@ -236,8 +236,9 @@ import optparse
+ import re
+ import shutil
+ import stat
++import ssl
+ import urllib.error
+ import urllib.request
+ 
+ if sys.version_info[0] == 3:
+   import urllib.request
diff --git a/pkgs/by-name/gi/git-repo/package.nix b/pkgs/by-name/gi/git-repo/package.nix
new file mode 100644
index 000000000000..7a95582ee0ed
--- /dev/null
+++ b/pkgs/by-name/gi/git-repo/package.nix
@@ -0,0 +1,61 @@
+{ lib, stdenv, fetchFromGitHub, makeWrapper, nix-update-script
+, python3, git, gnupg, less, openssh
+}:
+
+stdenv.mkDerivation rec {
+  pname = "git-repo";
+  version = "2.48";
+
+  src = fetchFromGitHub {
+    owner = "android";
+    repo = "tools_repo";
+    rev = "v${version}";
+    hash = "sha256-BrdB6SqQlLRvXbfIXHqaKD+F/SBzqGru6ISkUrEnUeQ=";
+  };
+
+  # Fix 'NameError: name 'ssl' is not defined'
+  patches = [ ./import-ssl-module.patch ];
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ python3 ];
+
+  postPatch = ''
+    substituteInPlace repo --replace \
+      'urllib.request.urlopen(url)' \
+      'urllib.request.urlopen(url, context=ssl.create_default_context())'
+  '';
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/bin
+    cp repo $out/bin/repo
+
+    runHook postInstall
+  '';
+
+  # Important runtime dependencies
+  postFixup = ''
+    wrapProgram $out/bin/repo --prefix PATH ":" \
+      "${lib.makeBinPath [ git gnupg less openssh ]}"
+  '';
+
+  passthru = {
+    updateScript = nix-update-script { };
+  };
+
+  meta = with lib; {
+    description = "Android's repo management tool";
+    longDescription = ''
+      Repo is a Python script based on Git that helps manage many Git
+      repositories, does the uploads to revision control systems, and automates
+      parts of the development workflow. Repo is not meant to replace Git, only
+      to make it easier to work with Git.
+    '';
+    homepage = "https://android.googlesource.com/tools/repo";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ otavio ];
+    platforms = platforms.unix;
+    mainProgram = "repo";
+  };
+}
diff --git a/pkgs/by-name/gi/git-secret/package.nix b/pkgs/by-name/gi/git-secret/package.nix
new file mode 100644
index 000000000000..6c0613a28df7
--- /dev/null
+++ b/pkgs/by-name/gi/git-secret/package.nix
@@ -0,0 +1,34 @@
+{ stdenv, lib, fetchFromGitHub, makeWrapper, git, gnupg, gawk }:
+
+stdenv.mkDerivation rec {
+  pname = "git-secret";
+  version = "0.5.0";
+
+  src = fetchFromGitHub {
+    repo = "git-secret";
+    owner = "sobolevn";
+    rev = "v${version}";
+    sha256 = "sha256-Vdlv3H99BZcT1O66ZCpq5olENOaUSubx58B1PQ/OlMU=";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  installPhase = ''
+    install -D git-secret $out/bin/git-secret
+
+    wrapProgram $out/bin/git-secret \
+      --prefix PATH : "${lib.makeBinPath [ git gnupg gawk ]}"
+
+    mkdir $out/share
+    cp -r man $out/share
+  '';
+
+  meta = {
+    description = "Bash-tool to store your private data inside a git repository";
+    homepage = "https://git-secret.io";
+    license = lib.licenses.mit;
+    maintainers = [ lib.maintainers.lo1tuma ];
+    platforms = lib.platforms.all;
+    mainProgram = "git-secret";
+  };
+}
diff --git a/pkgs/by-name/gi/git-secrets/package.nix b/pkgs/by-name/gi/git-secrets/package.nix
new file mode 100644
index 000000000000..a2f2045a3ddc
--- /dev/null
+++ b/pkgs/by-name/gi/git-secrets/package.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, fetchFromGitHub, makeWrapper, git, coreutils }:
+
+stdenv.mkDerivation rec {
+  pname = "git-secrets";
+  version = "1.3.0";
+
+  src = fetchFromGitHub {
+    owner = "awslabs";
+    repo = "git-secrets";
+    rev = version;
+    sha256 = "10lnxg0q855zi3d6804ivlrn6dc817kilzdh05mmz8a0ccvm2qc7";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  dontBuild = true;
+
+  installPhase = ''
+    install -m755 -Dt $out/bin git-secrets
+    install -m444 -Dt $out/share/man/man1 git-secrets.1
+
+    wrapProgram $out/bin/git-secrets \
+      --prefix PATH : "${lib.makeBinPath [ git coreutils ]}"
+  '';
+
+  meta = with lib; {
+    description = "Prevents you from committing secrets and credentials into git repositories";
+    homepage = "https://github.com/awslabs/git-secrets";
+    license = licenses.asl20;
+    platforms = platforms.all;
+    mainProgram = "git-secrets";
+  };
+}
diff --git a/pkgs/by-name/gi/git-series/package.nix b/pkgs/by-name/gi/git-series/package.nix
new file mode 100644
index 000000000000..86277614bc4c
--- /dev/null
+++ b/pkgs/by-name/gi/git-series/package.nix
@@ -0,0 +1,65 @@
+{
+  lib,
+  rustPlatform,
+  fetchFromGitHub,
+  pkg-config,
+  stdenv,
+  curl,
+  installShellFiles,
+  libgit2,
+  libssh2,
+  openssl,
+  zlib,
+}:
+
+rustPlatform.buildRustPackage {
+  pname = "git-series";
+  version = "0.9.1-unstable-2024-02-02";
+
+  src = fetchFromGitHub {
+    owner = "git-series";
+    repo = "git-series";
+    rev = "9c5d40edec87b79db0c5bac1458aa0e2c8fdeb8e";
+    hash = "sha256-DtOR7+vX7efNzYMRJwJTj5cXlFHQwzcS0Gp2feVdea4=";
+  };
+
+  cargoHash = "sha256-D83mfaH4iKagGjdX+YhCzva99+dCneHeWPNnkzZB/k0=";
+
+  nativeBuildInputs = [
+    pkg-config
+    installShellFiles
+  ] ++ lib.optionals stdenv.hostPlatform.isDarwin [ curl ];
+
+  buildInputs = [
+    libgit2
+    libssh2
+    openssl
+    zlib
+  ] ++ lib.optionals stdenv.hostPlatform.isDarwin [ curl ];
+
+  env = {
+    LIBGIT2_SYS_USE_PKG_CONFIG = true;
+    LIBSSH2_SYS_USE_PKG_CONFIG = true;
+  };
+
+  postInstall = ''
+    installManPage ./git-series.1
+  '';
+
+  meta = with lib; {
+    description = "Tool to help with formatting git patches for review on mailing lists";
+    longDescription = ''
+      git series tracks changes to a patch series over time. git
+      series also tracks a cover letter for the patch series,
+      formats the series for email, and prepares pull requests.
+    '';
+    homepage = "https://github.com/git-series/git-series";
+    license = licenses.mit;
+    maintainers = with maintainers; [
+      edef
+      vmandela
+      aleksana
+    ];
+    mainProgram = "git-series";
+  };
+}
diff --git a/pkgs/by-name/gi/git-sim/package.nix b/pkgs/by-name/gi/git-sim/package.nix
new file mode 100644
index 000000000000..2cae12371b63
--- /dev/null
+++ b/pkgs/by-name/gi/git-sim/package.nix
@@ -0,0 +1,84 @@
+{
+  lib,
+  stdenv,
+  fetchFromGitHub,
+  installShellFiles,
+  python3Packages,
+}:
+let
+  inherit (python3Packages)
+    buildPythonApplication
+    gitpython
+    manim
+    opencv4
+    typer
+    pydantic
+    fonttools
+    git-dummy
+    pytestCheckHook
+    ;
+
+  version = "0.3.5";
+in
+
+buildPythonApplication {
+  pname = "git-sim";
+  inherit version;
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "initialcommit-com";
+    repo = "git-sim";
+    rev = "v${version}";
+    hash = "sha256-4jHkAlF2SAzHjBi8pmAJ0TKkcLxw+6EdGsXnHZUMILw=";
+  };
+
+  patches = [ ./tests.patch ];
+
+  build-system = [ ];
+
+  pythonRemoveDeps = [ "opencv-python-headless" ];
+
+  dependencies = [
+    gitpython
+    manim
+    opencv4
+    typer
+    pydantic
+    fonttools
+    git-dummy
+  ];
+
+  # https://github.com/NixOS/nixpkgs/commit/8033561015355dd3c3cf419d81ead31e534d2138
+  makeWrapperArgs = [ "--prefix PYTHONWARNINGS , ignore:::pydub.utils:" ];
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  postInstall =
+    # https://github.com/NixOS/nixpkgs/issues/308283
+    lib.optionalString (stdenv.buildPlatform.canExecute stdenv.hostPlatform) ''
+      installShellCompletion --cmd git-sim \
+        --bash <($out/bin/git-sim --show-completion bash) \
+        --fish <($out/bin/git-sim --show-completion fish) \
+        --zsh <($out/bin/git-sim --show-completion zsh)
+    ''
+    + "ln -s ${git-dummy}/bin/git-dummy $out/bin/";
+
+  preCheck = ''
+    PATH=$PATH:$out/bin
+  '';
+
+  nativeCheckInputs = [
+    pytestCheckHook
+    git-dummy
+  ];
+
+  doCheck = false;
+
+  meta = {
+    description = "Visually simulate Git operations in your own repos with a single terminal command";
+    homepage = "https://initialcommit.com/tools/git-sim";
+    license = lib.licenses.gpl2Only;
+    maintainers = with lib.maintainers; [ mathiassven ];
+  };
+}
diff --git a/pkgs/by-name/gi/git-sim/tests.patch b/pkgs/by-name/gi/git-sim/tests.patch
new file mode 100644
index 000000000000..525ce6b25252
--- /dev/null
+++ b/pkgs/by-name/gi/git-sim/tests.patch
@@ -0,0 +1,33 @@
+diff --git a/tests/e2e_tests/conftest.py b/tests/e2e_tests/conftest.py
+index 310197a..9e82a1e 100644
+--- a/tests/e2e_tests/conftest.py
++++ b/tests/e2e_tests/conftest.py
+@@ -22,9 +22,7 @@ def tmp_repo(tmp_path_factory):
+     # Create the sample repo for testing.
+     os.chdir(tmp_repo_dir)
+ 
+-    # When defining cmd, as_posix() is required for Windows compatibility.
+-    git_dummy_path = utils.get_venv_path() / "git-dummy"
+-    cmd = f"{git_dummy_path.as_posix()} --commits=10 --branches=4 --merge=1 --constant-sha --name=sample_repo --diverge-at=2"
++    cmd = "git-dummy --commits=10 --branches=4 --merge=1 --constant-sha --name=sample_repo --diverge-at=2"
+     cmd_parts = split(cmd)
+     subprocess.run(cmd_parts)
+ 
+diff --git a/tests/e2e_tests/utils.py b/tests/e2e_tests/utils.py
+index 8dfc623..41a4cf6 100644
+--- a/tests/e2e_tests/utils.py
++++ b/tests/e2e_tests/utils.py
+@@ -69,13 +69,6 @@ def get_cmd_parts(raw_command):
+         f"git-sim -d --output-only-path --img-format=png --font='{font_path}'",
+     )
+ 
+-    # Replace `git-sim` with the full path to the binary.
+-    #   as_posix() is needed for Windows compatibility.
+-    # The space is included in "git-sim " to avoid replacing any occurrences
+-    #   of git-sim in a font path.
+-    git_sim_path = get_venv_path() / "git-sim"
+-    cmd = cmd.replace("git-sim ", f"{git_sim_path.as_posix()} ")
+-
+     # Show full test command when run in diagnostic mode.
+     print(f"  Test command: {cmd}")
+ 
diff --git a/pkgs/by-name/gi/git-sizer/package.nix b/pkgs/by-name/gi/git-sizer/package.nix
new file mode 100644
index 000000000000..b3d7f7a3a432
--- /dev/null
+++ b/pkgs/by-name/gi/git-sizer/package.nix
@@ -0,0 +1,31 @@
+{ lib, buildGoModule, fetchFromGitHub, testers, git-sizer }:
+
+buildGoModule rec {
+  pname = "git-sizer";
+  version = "1.5.0";
+
+  src = fetchFromGitHub {
+    owner = "github";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-On7QBTzKfnuuzwMQ8m1odxGqfIKL+EDg5V05Kxuhmqw=";
+  };
+
+  vendorHash = "sha256-oRlsD99XiI/0ZWibjyRcycmGab+vMbXrV5hIdIyUDYg=";
+
+  ldflags = [ "-s" "-w" "-X main.BuildVersion=${version}" ];
+
+  doCheck = false;
+
+  passthru.tests.vesion = testers.testVersion {
+    package = git-sizer;
+  };
+
+  meta = with lib; {
+    description = "Compute various size metrics for a Git repository";
+    homepage = "https://github.com/github/git-sizer";
+    license = licenses.mit;
+    maintainers = with maintainers; [ matthewbauer ];
+    mainProgram = "git-sizer";
+  };
+}
diff --git a/pkgs/by-name/gi/git-spice/package.nix b/pkgs/by-name/gi/git-spice/package.nix
index 08e9260361b7..60b1e35d709b 100644
--- a/pkgs/by-name/gi/git-spice/package.nix
+++ b/pkgs/by-name/gi/git-spice/package.nix
@@ -1,26 +1,30 @@
 {
   lib,
+  stdenv,
   buildGo123Module,
   fetchFromGitHub,
   git,
   nix-update-script,
+  installShellFiles,
 }:
 
 buildGo123Module rec {
   pname = "git-spice";
-  version = "0.6.0";
+  version = "0.7.0";
 
   src = fetchFromGitHub {
     owner = "abhinav";
     repo = "git-spice";
     rev = "refs/tags/v${version}";
-    hash = "sha256-VODBN+3xDa+sGynhnWnnhPy0VEKPWOQeh2Ge75OTS0A=";
+    hash = "sha256-ap0ZGRDdHQMVYSk9J8vsZNpvaAwpHFmPT5REiCxYepQ=";
   };
 
-  vendorHash = "sha256-irYXuh0KmCmeZ2fKNduu7zpVqDQmmR7H2bNTMa2zOjI=";
+  vendorHash = "sha256-YJ8OxmonnxNu4W17tD1Z7K625LCINlh6ZgoxOpmtNC0=";
 
   subPackages = [ "." ];
 
+  nativeBuildInputs = [ installShellFiles ];
+
   nativeCheckInputs = [ git ];
 
   buildInputs = [ git ];
@@ -31,6 +35,21 @@ buildGo123Module rec {
     "-X=main._version=${version}"
   ];
 
+  __darwinAllowLocalNetworking = true;
+
+  preCheck = lib.optionalString (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isx86_64) ''
+    # timeout
+    rm testdata/script/branch_submit_remote_prompt.txt
+    rm testdata/script/branch_submit_multiple_pr_templates.txt
+  '';
+
+  postInstall = lib.optionalString (stdenv.buildPlatform.canExecute stdenv.hostPlatform) ''
+    installShellCompletion --cmd gs \
+      --bash <($out/bin/gs shell completion bash) \
+      --zsh <($out/bin/gs shell completion zsh) \
+      --fish <($out/bin/gs shell completion fish)
+  '';
+
   passthru.updateScript = nix-update-script { };
 
   meta = {
diff --git a/pkgs/by-name/gi/git-stree/package.nix b/pkgs/by-name/gi/git-stree/package.nix
new file mode 100644
index 000000000000..d15db48902fa
--- /dev/null
+++ b/pkgs/by-name/gi/git-stree/package.nix
@@ -0,0 +1,28 @@
+{ stdenv, lib, fetchFromGitHub, ... }:
+
+stdenv.mkDerivation {
+  pname = "git-stree";
+  version = "0.4.5";
+
+  src = fetchFromGitHub {
+    owner = "tdd";
+    repo = "git-stree";
+    rev = "0.4.5";
+    sha256 = "0y5h44n38w6rhy9m591dvibxpfggj3q950ll7y4h49bhpks4m0l9";
+  };
+
+  installPhase = ''
+    mkdir -p $out/bin $out/share/bash-completion/completions
+    install -m 0755 git-stree $out/bin/
+    install -m 0644 git-stree-completion.bash $out/share/bash-completion/completions/
+  '';
+
+  meta = with lib; {
+    description = "Better Git subtree helper command";
+    homepage = "http://deliciousinsights.github.io/git-stree";
+    license = licenses.mit;
+    maintainers = [ maintainers.benley ];
+    platforms = platforms.unix;
+    mainProgram = "git-stree";
+  };
+}
diff --git a/pkgs/by-name/gi/git-subrepo/package.nix b/pkgs/by-name/gi/git-subrepo/package.nix
new file mode 100644
index 000000000000..29da4ee6be8b
--- /dev/null
+++ b/pkgs/by-name/gi/git-subrepo/package.nix
@@ -0,0 +1,48 @@
+{ lib, stdenv, fetchFromGitHub, git, makeWrapper, which, installShellFiles }:
+
+stdenv.mkDerivation rec {
+  pname = "git-subrepo";
+  version = "0.4.9";
+
+  src = fetchFromGitHub {
+    owner = "ingydotnet";
+    repo = "git-subrepo";
+    rev = version;
+    sha256 = "sha256-Fwh4haGXVDsLexe/1kjUhY4lF6u5cTrAwivZiOkPig0=";
+  };
+
+  nativeBuildInputs = [
+    makeWrapper
+    which
+    installShellFiles
+  ];
+
+  buildInputs = [
+    git
+  ];
+
+  makeFlags = [
+    "PREFIX=${placeholder "out"}"
+    "INSTALL_LIB=${placeholder "out"}/bin"
+    "INSTALL_MAN=${placeholder "out"}/share/man/man1"
+  ];
+
+  postInstall = ''
+    installShellCompletion --bash --name git-subrepo.bash share/completion.bash
+    installShellCompletion --zsh share/zsh-completion/_git-subrepo
+  '';
+
+  postFixup = ''
+    wrapProgram $out/bin/git-subrepo \
+      --prefix PATH : "${git}/bin"
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/ingydotnet/git-subrepo";
+    description = "Git submodule alternative";
+    mainProgram = "git-subrepo";
+    license = licenses.mit;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ ryantrinkle ];
+  };
+}
diff --git a/pkgs/by-name/gi/git-subtrac/package.nix b/pkgs/by-name/gi/git-subtrac/package.nix
new file mode 100644
index 000000000000..43fb89661735
--- /dev/null
+++ b/pkgs/by-name/gi/git-subtrac/package.nix
@@ -0,0 +1,25 @@
+{ lib, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "git-subtrac";
+  version = "0.04";
+
+  src = fetchFromGitHub {
+    owner = "apenwarr";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-3Z1AbPPsTBa3rqfvNAMBz7CIRq/zc9q5/TcLJWYSNlw=";
+  };
+
+  vendorHash = "sha256-3mJoSsGE+f9hVbNctjMR7WmSkCaHmKIO125LWG1+xFQ=";
+
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Keep the content for your git submodules all in one place: the parent repo";
+    homepage = "https://github.com/apenwarr/git-subtrac";
+    license = licenses.asl20;
+    maintainers = [ ];
+    mainProgram = "git-subtrac";
+  };
+}
diff --git a/pkgs/by-name/gi/git-sync/package.nix b/pkgs/by-name/gi/git-sync/package.nix
new file mode 100644
index 000000000000..1534cfb81c1e
--- /dev/null
+++ b/pkgs/by-name/gi/git-sync/package.nix
@@ -0,0 +1,48 @@
+{ lib, stdenv, fetchFromGitHub, coreutils, git, gnugrep, gnused, makeWrapper, inotify-tools }:
+
+stdenv.mkDerivation rec {
+  pname = "git-sync";
+  version = "0-unstable-2024-02-15";
+
+  src = fetchFromGitHub {
+    owner = "simonthum";
+    repo = "git-sync";
+    rev = "493b0155fb974b477b6ea623d6e41e13ddad8500";
+    hash = "sha256-hsq+kpB+akjbFKBeHMsP8ibrtygEG2Yf2QW9vFFIano=";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  dontBuild = true;
+
+  installPhase = ''
+    mkdir -p $out/bin
+    cp -a git-* $out/bin/
+    cp -a contrib/git-* $out/bin/
+  '';
+
+  wrapperPath = lib.makeBinPath ([
+    coreutils
+    git
+    gnugrep
+    gnused
+  ] ++ lib.optionals stdenv.hostPlatform.isLinux [ inotify-tools ]);
+
+  postFixup = ''
+    wrap_path="${wrapperPath}":$out/bin
+
+    wrapProgram $out/bin/git-sync \
+      --prefix PATH : $wrap_path
+
+    wrapProgram $out/bin/git-sync-on-inotify \
+      --prefix PATH : $wrap_path
+  '';
+
+  meta = {
+    description = "Script to automatically synchronize a git repository";
+    homepage = "https://github.com/simonthum/git-sync";
+    maintainers = with lib.maintainers; [ imalison ];
+    license = lib.licenses.cc0;
+    platforms = with lib.platforms; unix;
+  };
+}
diff --git a/pkgs/by-name/gi/git-team/package.nix b/pkgs/by-name/gi/git-team/package.nix
new file mode 100644
index 000000000000..19556366b1eb
--- /dev/null
+++ b/pkgs/by-name/gi/git-team/package.nix
@@ -0,0 +1,46 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+, go-mockery
+, installShellFiles
+}:
+
+buildGoModule rec {
+  pname = "git-team";
+  version = "1.8.1";
+
+  src = fetchFromGitHub {
+    owner = "hekmekk";
+    repo = "git-team";
+    rev = "v${version}";
+    hash = "sha256-+j5d1tImVHaTx63uzLdh2YNCFa1ErAVv4OMwxOutBQ4=";
+  };
+
+  vendorHash = "sha256-NTOUL1oE2IhgLyYYHwRCMW5yCxIRxUwqkfuhSSBXf6A=";
+
+  nativeBuildInputs = [
+    go-mockery
+    installShellFiles
+  ];
+
+  preBuild = ''
+    mockery --dir=src/ --all --keeptree
+  '';
+
+  postInstall = ''
+    go run main.go --generate-man-page > git-team.1
+    installManPage git-team.1
+
+    installShellCompletion --cmd git-team \
+      --bash <($out/bin/git-team completion bash) \
+      --zsh <($out/bin/git-team completion zsh)
+  '';
+
+  meta = with lib; {
+    description = "Command line interface for managing and enhancing git commit messages with co-authors";
+    homepage = "https://github.com/hekmekk/git-team";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lockejan ];
+    mainProgram = "git-team";
+  };
+}
diff --git a/pkgs/by-name/gi/git-test/package.nix b/pkgs/by-name/gi/git-test/package.nix
new file mode 100644
index 000000000000..fb8619249b55
--- /dev/null
+++ b/pkgs/by-name/gi/git-test/package.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, fetchFromGitHub, makeWrapper, git }:
+
+stdenv.mkDerivation rec {
+  pname = "git-test";
+  version = "1.0.4";
+
+  src = fetchFromGitHub {
+    owner = "spotify";
+    repo = "git-test";
+    rev = "v${version}";
+    sha256 = "01h3f0andv1p7pwir3k6n01v92hgr5zbjadfwl144yjw9x37fm2f";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  dontBuild = true;
+
+  installPhase = ''
+    install -m755 -Dt $out/bin git-test
+    install -m444 -Dt $out/share/man/man1 git-test.1
+
+    wrapProgram $out/bin/git-test \
+      --prefix PATH : "${lib.makeBinPath [ git ]}"
+  '';
+
+  meta = with lib; {
+    description = "Test your commits";
+    homepage = "https://github.com/spotify/git-test";
+    license = licenses.asl20;
+    maintainers = [ ];
+    platforms = platforms.all;
+    mainProgram = "git-test";
+  };
+}
diff --git a/pkgs/by-name/gi/git-together/package.nix b/pkgs/by-name/gi/git-together/package.nix
index e71668a83a73..44ae1249a59c 100644
--- a/pkgs/by-name/gi/git-together/package.nix
+++ b/pkgs/by-name/gi/git-together/package.nix
@@ -19,7 +19,7 @@ rustPlatform.buildRustPackage rec {
   };
 
   nativeBuildInputs = [ pkg-config ];
-  buildInputs = [ openssl ] ++ lib.optional stdenv.isDarwin darwin.Security;
+  buildInputs = [ openssl ] ++ lib.optional stdenv.hostPlatform.isDarwin darwin.Security;
 
   OPENSSL_NO_VENDOR = true;
 
diff --git a/pkgs/by-name/gi/git-town/package.nix b/pkgs/by-name/gi/git-town/package.nix
new file mode 100644
index 000000000000..226afe310323
--- /dev/null
+++ b/pkgs/by-name/gi/git-town/package.nix
@@ -0,0 +1,74 @@
+{ lib, buildGoModule, fetchFromGitHub, installShellFiles, git, testers, git-town, makeWrapper }:
+
+buildGoModule rec {
+  pname = "git-town";
+  version = "16.4.1";
+
+  src = fetchFromGitHub {
+    owner = "git-town";
+    repo = "git-town";
+    rev = "v${version}";
+    hash = "sha256-8Xr1R6txsJBGzBtvvKOCg2lcAHksl4hNPc9zySkTfdg=";
+  };
+
+  vendorHash = null;
+
+  nativeBuildInputs = [ installShellFiles makeWrapper ];
+
+  buildInputs = [ git ];
+
+  ldflags =
+    let
+      modulePath = "github.com/git-town/git-town/v${lib.versions.major version}";
+    in
+    [
+      "-s"
+      "-w"
+      "-X ${modulePath}/src/cmd.version=v${version}"
+      "-X ${modulePath}/src/cmd.buildDate=nix"
+    ];
+
+  nativeCheckInputs = [ git ];
+
+  preCheck = ''
+    HOME=$(mktemp -d)
+
+    # this runs tests requiring local operations
+    rm main_test.go
+  '';
+
+  checkFlags =
+    let
+      # Disable tests requiring local operations
+      skippedTests = [
+        "TestGodog"
+        "TestMockingRunner/MockCommand"
+        "TestMockingRunner/QueryWith"
+        "TestTestCommands/CreateChildFeatureBranch"
+      ];
+    in
+    [ "-skip=^${builtins.concatStringsSep "$|^" skippedTests}$" ];
+
+  postInstall = ''
+    installShellCompletion --cmd git-town \
+      --bash <($out/bin/git-town completions bash) \
+      --fish <($out/bin/git-town completions fish) \
+      --zsh <($out/bin/git-town completions zsh)
+
+    wrapProgram $out/bin/git-town --prefix PATH : ${lib.makeBinPath [ git ]}
+  '';
+
+  passthru.tests.version = testers.testVersion {
+    package = git-town;
+    command = "git-town --version";
+    inherit version;
+  };
+
+  meta = with lib; {
+    description = "Generic, high-level git support for git-flow workflows";
+    homepage = "https://www.git-town.com/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ allonsy blaggacao gabyx ];
+    mainProgram = "git-town";
+  };
+}
diff --git a/pkgs/by-name/gi/git-upstream/package.nix b/pkgs/by-name/gi/git-upstream/package.nix
index f038db5a9dac..d94ca080b630 100644
--- a/pkgs/by-name/gi/git-upstream/package.nix
+++ b/pkgs/by-name/gi/git-upstream/package.nix
@@ -5,7 +5,7 @@
   nix-update-script,
 }: let
   pname = "git-upstream";
-  version = "1.1.0";
+  version = "1.2.0";
 in
   rustPlatform.buildRustPackage {
     inherit pname version;
@@ -14,17 +14,17 @@ in
       owner = "9999years";
       repo = pname;
       rev = "refs/tags/v${version}";
-      hash = "sha256-Pq0Z1WwrTP7dCwk6V/E0zu9sLLWr3kNuT3aJRZuRzhI=";
+      hash = "sha256-GnsqZSztDLXMO4T16nfcOKMKXap88CJzJ5nObzGwhMA=";
     };
 
-    cargoHash = "sha256-jNpleFrOvt1m2TXTeBXfhTSjWNpCknNoKooF2xsO46w=";
+    cargoHash = "sha256-a12C/fpeo0ZJ0MFQlKHVZER9dVrXF95YI1i8MwCTCJo=";
 
-    meta = with lib; {
+    meta = {
       homepage = "https://github.com/9999years/git-upstream";
       changelog = "https://github.com/9999years/git-upstream/releases/tag/v${version}";
       description = "Shortcut for `git push --set-upstream`";
-      license = [licenses.mit];
-      maintainers = [maintainers._9999years];
+      license = [lib.licenses.mit];
+      maintainers = [lib.maintainers._9999years];
       mainProgram = "git-upstream";
     };
 
diff --git a/pkgs/by-name/gi/git-vanity-hash/package.nix b/pkgs/by-name/gi/git-vanity-hash/package.nix
new file mode 100644
index 000000000000..55332c6c7287
--- /dev/null
+++ b/pkgs/by-name/gi/git-vanity-hash/package.nix
@@ -0,0 +1,33 @@
+{
+  lib,
+  fetchFromGitHub,
+  rustPlatform,
+}:
+
+rustPlatform.buildRustPackage {
+  pname = "git-vanity-hash";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "prasmussen";
+    repo = "git-vanity-hash";
+    # v1.0.0 + build fix
+    rev = "a80e7725ac6d0b7e6807cd7315cfdc7eaf0584f6";
+    hash = "sha256-1z4jbtzUB3SH79dDXAITf7Vup1YZdTLHBieSrhrvSXc=";
+  };
+
+  cargoHash = "sha256-+SQ0HpURBjnnwH1Ue7IUReOtI4LxVPK9AGSAihs0qsc=";
+
+  postInstall = ''
+    mkdir -p $out/share/doc/git-vanity-hash
+    cp README.md $out/share/doc/git-vanity-hash
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/prasmussen/git-vanity-hash";
+    description = "Tool for creating commit hashes with a specific prefix";
+    license = [ licenses.mit ];
+    maintainers = [ maintainers.kaction ];
+    mainProgram = "git-vanity-hash";
+  };
+}
diff --git a/pkgs/by-name/gi/git-vendor/package.nix b/pkgs/by-name/gi/git-vendor/package.nix
new file mode 100644
index 000000000000..a0f3e26b2e4f
--- /dev/null
+++ b/pkgs/by-name/gi/git-vendor/package.nix
@@ -0,0 +1,67 @@
+{ lib, stdenv, fetchFromGitHub, writeShellScriptBin, skawarePackages
+}:
+
+let
+  version = "1.3.0";
+  sha256 = "sha256-CFv9gZQHeEiZctJFyB6PJ1dVNkrQ7PlVtgZuteQQTJ0=";
+
+in stdenv.mkDerivation {
+  pname = "git-vendor";
+  inherit version;
+
+  src = fetchFromGitHub {
+    owner = "brettlangdon";
+    repo = "git-vendor";
+    rev = "v${version}";
+    inherit sha256;
+  };
+
+  outputs = [ "bin" "man" "doc" "out" ];
+
+  PREFIX = (placeholder "out");
+  BINPREFIX = "${placeholder "bin"}/bin";
+  MANPREFIX = "${placeholder "man"}/share/man/man1";
+
+  buildInputs = [
+    # stubbing out a `git config` check that `make install` tries to do
+    (writeShellScriptBin "git" "")
+  ];
+
+  postInstall = ''
+    ${skawarePackages.cleanPackaging.commonFileActions {
+        docFiles = [
+          "LICENSE"
+          "README.md"
+        ];
+        noiseFiles = [
+          "bin/git-vendor"
+          "Makefile"
+          "etc/bash_completion.sh"
+          "man"
+          "install.sh"
+        ];
+      }} $doc/share/doc/git-vendor
+  '';
+
+  postFixup = ''
+    ${skawarePackages.cleanPackaging.checkForRemainingFiles}
+  '';
+
+  meta = {
+    description = "Git command for managing vendored dependencies";
+    longDescription = ''
+      git-vendor is a wrapper around git-subtree commands for checking out and updating vendored dependencies.
+
+      By default git-vendor conforms to the pattern used for vendoring golang dependencies:
+        * Dependencies are stored under vendor/ directory in the repo.
+        * Dependencies are stored under the fully qualified project path.
+            e.g. https://github.com/brettlangdon/forge will be stored under vendor/github.com/brettlangdon/forge.
+    '';
+    homepage = "https://github.com/brettlangdon/git-vendor";
+    license = lib.licenses.mit;
+    maintainers = [ ];
+    platforms = lib.platforms.all;
+    mainProgram = "git-vendor";
+  };
+
+}
diff --git a/pkgs/by-name/gi/git-warp-time/package.nix b/pkgs/by-name/gi/git-warp-time/package.nix
new file mode 100644
index 000000000000..02b58f2cf703
--- /dev/null
+++ b/pkgs/by-name/gi/git-warp-time/package.nix
@@ -0,0 +1,78 @@
+{
+  lib,
+  stdenv,
+  fetchurl,
+
+  # nativeBuildInputs
+  zstd,
+  pkg-config,
+  jq,
+  cargo,
+  rustc,
+  rustPlatform,
+
+  # buildInputs
+  libgit2,
+  typos,
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "git-warp-time";
+  version = "0.8.4";
+
+  src = fetchurl {
+    url = "https://github.com/alerque/git-warp-time/releases/download/v${finalAttrs.version}/git-warp-time-${finalAttrs.version}.tar.zst";
+    sha256 = "sha256-Xh30nA77cJ7+UfKlIslnyD+93AtnQ+8P3sCFsG0DAUk=";
+  };
+
+  cargoDeps = rustPlatform.fetchCargoTarball {
+    inherit (finalAttrs) src;
+    nativeBuildInputs = [ zstd ];
+    dontConfigure = true;
+    hash = "sha256-ozy8Mfl5fTJL2Sr22tCSnK30SOKaC9cL+g4lX6ivi9Q=";
+  };
+
+  nativeBuildInputs = [
+    zstd
+    pkg-config
+    jq
+    cargo
+    rustc
+    rustPlatform.cargoSetupHook
+  ];
+
+  buildInputs = [
+    libgit2
+    typos
+  ];
+
+  env = {
+    LIBGIT2_NO_VENDOR = "1";
+  };
+
+  outputs = [
+    "out"
+    "doc"
+    "man"
+    "dev"
+  ];
+
+  enableParallelBuilding = true;
+
+  meta = {
+    description = "Utility to reset filesystem timestamps based on Git history";
+    longDescription = ''
+      A CLI utility that resets the timestamps of files in a Git repository
+      working directory to the exact timestamp of the last commit which
+      modified each file.
+    '';
+    homepage = "https://github.com/alerque/git-warp-time";
+    changelog = "https://github.com/alerque/git-warp-time/raw/v${finalAttrs.version}/CHANGELOG.md";
+    platforms = lib.platforms.unix;
+    maintainers = with lib.maintainers; [
+      alerque
+    ];
+    license = lib.licenses.gpl3Only;
+    mainProgram = "git-warp-time";
+  };
+})
diff --git a/pkgs/by-name/gi/git-when-merged/package.nix b/pkgs/by-name/gi/git-when-merged/package.nix
new file mode 100644
index 000000000000..36336d964cc3
--- /dev/null
+++ b/pkgs/by-name/gi/git-when-merged/package.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv, fetchFromGitHub, python3 }:
+
+stdenv.mkDerivation rec {
+  pname = "git-when-merged";
+  version = "1.2.1";
+
+  src = fetchFromGitHub {
+    owner = "mhagger";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-Yp/GNzD+7EPlk/kzZnT1eiSNsSxpYEiZezRbUU3HfLc=";
+  };
+
+  buildInputs = [ python3 ];
+
+  installPhase = ''
+    install -D --target-directory $out/bin/ bin/git-when-merged
+  '';
+
+  meta = with lib; {
+    description =
+      "Helps you figure out when and why a commit was merged into a branch";
+    longDescription = ''
+      If you use standard Git workflows, then you create a feature
+      branch for each feature that you are working on. When the feature
+      is complete, you merge it into your master branch. You might even
+      have sub-feature branches that are merged into a feature branch
+      before the latter is merged.
+
+      In such a workflow, the first-parent history of master consists
+      mainly of merges of feature branches into the mainline. git
+      when-merged can be used to ask, "When (and why) was commit C
+      merged into the current branch?"
+    '';
+    homepage = "https://github.com/mhagger/git-when-merged";
+    license = licenses.gpl2Only;
+    platforms = python3.meta.platforms;
+    maintainers = with maintainers; [ DamienCassou ];
+    mainProgram = "git-when-merged";
+  };
+}
diff --git a/pkgs/by-name/gi/git2-cpp/package.nix b/pkgs/by-name/gi/git2-cpp/package.nix
new file mode 100644
index 000000000000..45750d0b24d4
--- /dev/null
+++ b/pkgs/by-name/gi/git2-cpp/package.nix
@@ -0,0 +1,30 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cmake
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "git2-cpp";
+  version = "0.1.1";
+
+  src = fetchFromGitHub {
+    owner = "ken-matsui";
+    repo = "git2-cpp";
+    rev = finalAttrs.version;
+    hash = "sha256-2jKSQW6dUCIKtl33paSTuZdYAaYdFnILx/Gxv/ghFiI=";
+  };
+
+  nativeBuildInputs = [
+    cmake
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ken-matsui/git2-cpp";
+    description = "libgit2 bindings for C++";
+    license = licenses.mit;
+    maintainers = [ ];
+    platforms = platforms.unix;
+  };
+})
+# TODO [ ken-matsui ]: tests
diff --git a/pkgs/by-name/gi/git2cl/package.nix b/pkgs/by-name/gi/git2cl/package.nix
new file mode 100644
index 000000000000..cddc6eb7e2fe
--- /dev/null
+++ b/pkgs/by-name/gi/git2cl/package.nix
@@ -0,0 +1,25 @@
+{ fetchgit, lib, stdenv, perl }:
+
+stdenv.mkDerivation rec {
+  pname = "git2cl";
+  version = "unstable-2008-08-27";
+
+  src = fetchgit {
+    url = "git://repo.or.cz/git2cl.git";
+    rev = "8373c9f74993e218a08819cbcdbab3f3564bbeba";
+    sha256 = "b0d39379640c8a12821442431e2121f7908ce1cc88ec8ec6bede218ea8c21f2f";
+  };
+
+  buildInputs = [ perl ];
+  installPhase = ''
+    install -D -m755 git2cl $out/bin/git2cl
+    install -D -m644 README $out/share/doc/git2cl/README
+  '';
+
+  meta = {
+    homepage = "https://savannah.nongnu.org/projects/git2cl";
+    description = "Convert git logs to GNU style ChangeLog files";
+    platforms = lib.platforms.unix;
+    mainProgram = "git2cl";
+  };
+}
diff --git a/pkgs/by-name/gi/gitaly/git.nix b/pkgs/by-name/gi/gitaly/git.nix
new file mode 100644
index 000000000000..2610c39ca711
--- /dev/null
+++ b/pkgs/by-name/gi/gitaly/git.nix
@@ -0,0 +1,57 @@
+{ stdenv
+, lib
+, gitaly
+, fetchFromGitLab
+, curl
+, pcre2
+, zlib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gitaly-git";
+  version = "2.45.2";
+
+  # `src` attribute for nix-update
+  src = fetchFromGitLab {
+    owner = "gitlab-org";
+    repo = "git";
+    rev = "v${version}";
+    hash = "sha256-R4K5b4d1DQw+pwoOCAK4EJtVPXQDPossTUmVv0LJtUs=";
+  };
+
+  # we actually use the gitaly build system
+  unpackPhase = ''
+    cp -r ${gitaly.src} source
+    chmod -R +w source
+
+    mkdir -p source/_build/deps
+
+    cp -r ${src} source/_build/deps/git-distribution
+    chmod -R +w source/_build/deps/git-distribution
+
+    # FIXME? maybe just patch the makefile?
+    echo -n 'v${version} DEVELOPER=1 DEVOPTS=no-error USE_LIBPCRE=YesPlease NO_PERL=YesPlease NO_EXPAT=YesPlease NO_TCLTK=YesPlease NO_GETTEXT=YesPlease NO_PYTHON=YesPlease' > source/_build/deps/git-distribution.version
+    echo -n 'v${version}' > source/_build/deps/git-distribution/version
+  '';
+  sourceRoot = "source";
+
+  buildFlags = [ "git" ];
+
+  buildInputs = [
+    curl
+    pcre2
+    zlib
+  ];
+
+  # The build phase already installs it all
+  GIT_PREFIX = placeholder "out";
+  dontInstall = true;
+
+  meta = {
+    homepage = "https://git-scm.com/";
+    description = "Distributed version control system - with Gitaly patches";
+    license = lib.licenses.gpl2Only;
+    platforms = lib.platforms.all;
+    maintainers = lib.teams.gitlab.members;
+  };
+}
diff --git a/pkgs/by-name/gi/gitaly/package.nix b/pkgs/by-name/gi/gitaly/package.nix
new file mode 100644
index 000000000000..a826ba55b080
--- /dev/null
+++ b/pkgs/by-name/gi/gitaly/package.nix
@@ -0,0 +1,67 @@
+{ lib
+, callPackage
+, fetchFromGitLab
+, buildGoModule
+, pkg-config
+}:
+
+let
+  version = "17.3.6";
+  package_version = "v${lib.versions.major version}";
+  gitaly_package = "gitlab.com/gitlab-org/gitaly/${package_version}";
+
+  git = callPackage ./git.nix { };
+
+  commonOpts = {
+    inherit version;
+
+    # nixpkgs-update: no auto update
+    src = fetchFromGitLab {
+      owner = "gitlab-org";
+      repo = "gitaly";
+      rev = "v${version}";
+      hash = "sha256-nXblQfr9ml6F5nNz64haN7ub+cuN3eao14N0Y2d3n0Y=";
+    };
+
+    vendorHash = "sha256-spfSOOe+9NGu+2ZbEGb93X3HnANEXYbvP73DD6neIXQ=";
+
+    ldflags = [ "-X ${gitaly_package}/internal/version.version=${version}" "-X ${gitaly_package}/internal/version.moduleVersion=${version}" ];
+
+    tags = [ "static" ];
+
+    doCheck = false;
+  };
+
+  auxBins = buildGoModule ({
+    pname = "gitaly-aux";
+
+    subPackages = [ "cmd/gitaly-hooks" "cmd/gitaly-ssh" "cmd/gitaly-lfs-smudge" "cmd/gitaly-gpg" ];
+  } // commonOpts);
+in
+buildGoModule ({
+  pname = "gitaly";
+
+  subPackages = [ "cmd/gitaly" "cmd/gitaly-backup" ];
+
+  preConfigure = ''
+    mkdir -p _build/bin
+    cp -r ${auxBins}/bin/* _build/bin
+    for f in ${git}/bin/git-*; do
+      cp "$f" "_build/bin/gitaly-$(basename $f)";
+    done
+  '';
+
+  outputs = [ "out" ];
+
+  passthru = {
+    inherit git;
+  };
+
+  meta = with lib; {
+    homepage = "https://gitlab.com/gitlab-org/gitaly";
+    description = "Git RPC service for handling all the git calls made by GitLab";
+    platforms = platforms.linux ++ [ "x86_64-darwin" ];
+    maintainers = teams.gitlab.members;
+    license = licenses.mit;
+  };
+} // commonOpts)
diff --git a/pkgs/by-name/gi/gitbatch/package.nix b/pkgs/by-name/gi/gitbatch/package.nix
new file mode 100644
index 000000000000..7f7c6c64891a
--- /dev/null
+++ b/pkgs/by-name/gi/gitbatch/package.nix
@@ -0,0 +1,39 @@
+{ lib, buildGoModule, fetchFromGitHub, git }:
+
+buildGoModule rec {
+  pname = "gitbatch";
+  version = "0.6.1";
+
+  src = fetchFromGitHub {
+    owner = "isacikgoz";
+    repo = "gitbatch";
+    rev = "v${version}";
+    sha256 = "sha256-ovmdbyPRSebwmW6AW55jBgBKaNdY6w5/wrpUF2cMKw8=";
+  };
+
+  vendorHash = "sha256-wwpaJO5cXMsvqFXj+qGiIm4zg/SL4YCm2mNnG/qdilw=";
+
+  ldflags = [ "-s" "-w" ];
+
+  nativeCheckInputs = [
+    git # required by unit tests
+  ];
+
+  preCheck = ''
+    HOME=$(mktemp -d)
+  '';
+
+  checkFlags = [
+    # Disable tests requiring network access to gitlab.com
+    "-skip=Test(Run|Start|(Fetch|Pull)With(Go|)Git)"
+  ];
+
+  meta = with lib; {
+    description = "Running git UI commands";
+    homepage = "https://github.com/isacikgoz/gitbatch";
+    license = licenses.mit;
+    maintainers = with maintainers; [ teto ];
+    platforms = with platforms; linux;
+    mainProgram = "gitbatch";
+  };
+}
diff --git a/pkgs/by-name/gi/gitbutler/package.nix b/pkgs/by-name/gi/gitbutler/package.nix
index 66da05851dde..ea4ee4717e53 100644
--- a/pkgs/by-name/gi/gitbutler/package.nix
+++ b/pkgs/by-name/gi/gitbutler/package.nix
@@ -18,10 +18,12 @@
   libsoup,
   moreutils,
   openssl,
-  webkitgtk,
+  rust,
+  webkitgtk_4_0,
   nix-update-script,
   cacert,
 }:
+
 rustPlatform.buildRustPackage rec {
   pname = "gitbutler";
   version = "0.12.16";
@@ -33,11 +35,10 @@ rustPlatform.buildRustPackage rec {
     hash = "sha256-L4PVaNb3blpLIcyA7XLc71qwUPUADclxvbOkq1Jc1no=";
   };
 
-  # deactivate the upstream updater in tauri configuration
-  # TODO: use `tauri build`'s `--config` flag with the release configuration instead of manually merging
-  # them. it doesn't seem to like using paths currently, even though it should.
+  # deactivate the upstream updater in tauri configuration & set the version
   postPatch = ''
-    jq --slurp ".[0] * .[1] | .tauri.updater.active = false" crates/gitbutler-tauri/tauri.conf{,.release}.json | sponge crates/gitbutler-tauri/tauri.conf.json
+    tauri_conf="crates/gitbutler-tauri/tauri.conf.release.json"
+    jq '.package.version = "${version}" | .tauri.updater.active = false' "$tauri_conf" | sponge "$tauri_conf"
   '';
 
   cargoLock = {
@@ -50,11 +51,11 @@ rustPlatform.buildRustPackage rec {
 
   pnpmDeps = pnpm_9.fetchDeps {
     inherit pname version src;
-    hash = "sha256-r2PkNDvOofginL5Y0K+7Qhnsev2zle1q9qraG/ub7Wo=";
+    hash = "sha256-rlEwFwN6DrOJZm1Hzy6qu7rLKQx69rRIqrScx9FExZM=";
   };
 
   nativeBuildInputs = [
-    cargo-tauri
+    cargo-tauri.hook
     desktop-file-utils
     jq
     moreutils
@@ -67,12 +68,12 @@ rustPlatform.buildRustPackage rec {
 
   buildInputs =
     [ openssl ]
-    ++ lib.optionals stdenv.isLinux [
+    ++ lib.optionals stdenv.hostPlatform.isLinux [
       glib-networking
       libsoup
-      webkitgtk
+      webkitgtk_4_0
     ]
-    ++ lib.optionals stdenv.isDarwin (
+    ++ lib.optionals stdenv.hostPlatform.isDarwin (
       with darwin.apple_sdk.frameworks;
       [
         AppKit
@@ -82,7 +83,15 @@ rustPlatform.buildRustPackage rec {
       ]
     );
 
+  # extended release configuration
+  tauriBuildFlags = [ "--config crates/gitbutler-tauri/tauri.conf.release.json" ];
+
   env = {
+    # make sure `crates/gitbutler-tauri/inject-git-binaries.sh` can find our
+    # target dir
+    # https://github.com/gitbutlerapp/gitbutler/blob/56b64d778042d0e93fa362f808c35a7f095ab1d1/crates/gitbutler-tauri/inject-git-binaries.sh#L10C10-L10C26
+    TRIPLE_OVERRIDE = rust.envVars.rustHostPlatformSpec;
+
     # `pnpm`'s `fetchDeps` and `configHook` uses a specific version of pnpm, not upstream's
     COREPACK_ENABLE_STRICT = 0;
 
@@ -95,14 +104,6 @@ rustPlatform.buildRustPackage rec {
     # we also need to have `tracing` support in `tokio` for `console-subscriber`
     RUSTFLAGS = "--cfg tokio_unstable";
 
-    tauriBundle =
-      {
-        Linux = "deb";
-        Darwin = "app";
-      }
-      .${stdenv.hostPlatform.uname.system}
-        or (throw "No tauri bundle available for ${stdenv.hostPlatform.uname.system}");
-
     ESBUILD_BINARY_PATH = lib.getExe (
       esbuild.override {
         buildGoModule =
@@ -128,39 +129,23 @@ rustPlatform.buildRustPackage rec {
     OPENSSL_NO_VENDOR = true;
   };
 
-  buildPhase = ''
-    runHook preBuild
-
+  preBuild = ''
     pushd packages/ui
     pnpm package
     popd
-
-    cargo tauri build --bundles "$tauriBundle"
-
-    runHook postBuild
   '';
 
-  installPhase =
-    ''
-      runHook preInstall
-    ''
-    + lib.optionalString stdenv.isDarwin ''
-      mkdir -p $out/bin
-      cp -r target/release/bundle/macos $out/Applications
+  postInstall =
+    lib.optionalString stdenv.hostPlatform.isDarwin ''
       mv $out/Applications/GitButler.app/Contents/MacOS/GitButler $out/bin/git-butler
       ln -s $out/bin/git-butler $out/Applications/GitButler.app/Contents/MacOS/GitButler
     ''
-    + lib.optionalString stdenv.isLinux ''
-      cp -r target/release/bundle/"$tauriBundle"/*/data/usr $out
-
+    + lib.optionalString stdenv.hostPlatform.isLinux ''
       desktop-file-edit \
         --set-comment "A Git client for simultaneous branches on top of your existing workflow." \
         --set-key="Keywords" --set-value="git;" \
         --set-key="StartupWMClass" --set-value="GitButler" \
         $out/share/applications/git-butler.desktop
-    ''
-    + ''
-      runHook postInstall
     '';
 
   # the `gitbutler-git` crate's checks do not support release mode
diff --git a/pkgs/by-name/gi/gitea-actions-runner/package.nix b/pkgs/by-name/gi/gitea-actions-runner/package.nix
new file mode 100644
index 000000000000..d84c0de480b2
--- /dev/null
+++ b/pkgs/by-name/gi/gitea-actions-runner/package.nix
@@ -0,0 +1,42 @@
+{
+  lib,
+  fetchFromGitea,
+  buildGo123Module,
+  testers,
+  gitea-actions-runner,
+}:
+
+buildGo123Module rec {
+  pname = "gitea-actions-runner";
+  version = "0.2.11";
+
+  src = fetchFromGitea {
+    domain = "gitea.com";
+    owner = "gitea";
+    repo = "act_runner";
+    rev = "v${version}";
+    hash = "sha256-PmDa8XIe1uZ4SSrs9zh5HBmFaOuj+uuLm7jJ4O5V1dI=";
+  };
+
+  vendorHash = "sha256-lYJFySGqkhT89vHDp1FcTiiC7DG4ziQ1DaBHLh/kXQc=";
+
+  ldflags = [
+    "-s"
+    "-w"
+    "-X gitea.com/gitea/act_runner/internal/pkg/ver.version=v${version}"
+  ];
+
+  passthru.tests.version = testers.testVersion {
+    package = gitea-actions-runner;
+    version = "v${version}";
+  };
+
+  meta = with lib; {
+    mainProgram = "act_runner";
+    maintainers = with maintainers; [ techknowlogick ];
+    license = licenses.mit;
+    changelog = "https://gitea.com/gitea/act_runner/releases/tag/v${version}";
+    homepage = "https://gitea.com/gitea/act_runner";
+    description = "Runner for Gitea based on act";
+  };
+}
diff --git a/pkgs/by-name/gi/gitea/package.nix b/pkgs/by-name/gi/gitea/package.nix
index 3b5e5ccdf579..e68a58be66e6 100644
--- a/pkgs/by-name/gi/gitea/package.nix
+++ b/pkgs/by-name/gi/gitea/package.nix
@@ -33,18 +33,18 @@ let
   };
 in buildGoModule rec {
   pname = "gitea";
-  version = "1.22.2";
+  version = "1.22.3";
 
   src = fetchFromGitHub {
     owner = "go-gitea";
     repo = "gitea";
     rev = "v${gitea.version}";
-    hash = "sha256-PwA23cbRgw5crzZmngDjAAIODMtguwBCqc9NqWMjF3o=";
+    hash = "sha256-F1vvyf/FE/OIfDjM0CCOef/cXy+GPA+8n1AypE0r6p8=";
   };
 
   proxyVendor = true;
 
-  vendorHash = "sha256-rMTKmztQNse/9CK1qFGWmSwqunwh918EvcuIHk6BSTY=";
+  vendorHash = "sha256-iKf4ozCBcTJQ6bm6dX4dd4buVMGNDVF+rLuYkb7Zxw8=";
 
   outputs = [ "out" "data" ];
 
diff --git a/pkgs/by-name/gi/gitflow/package.nix b/pkgs/by-name/gi/gitflow/package.nix
new file mode 100644
index 000000000000..de291113daea
--- /dev/null
+++ b/pkgs/by-name/gi/gitflow/package.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv, fetchFromGitHub, makeWrapper, getopt, git, coreutils }:
+
+stdenv.mkDerivation rec {
+  pname = "gitflow";
+  version = "1.12.3";
+
+  src = fetchFromGitHub {
+    owner = "petervanderdoes";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-kHirHG/bfsU6tKyQ0khNSTyChhzHfzib+HyA3LOtBI8=";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  preBuild = ''
+    makeFlagsArray+=(prefix="$out")
+  '';
+
+  postInstall = ''
+    wrapProgram $out/bin/git-flow \
+      --set FLAGS_GETOPT_CMD ${getopt}/bin/getopt \
+      --suffix PATH : ${git}/bin \
+      --prefix PATH : ${coreutils}/bin
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/petervanderdoes/gitflow";
+    description = "Extend git with the Gitflow branching model";
+    mainProgram = "git-flow";
+    longDescription = ''
+      A set of scripts that provide high-level repository operations
+      for managing feature/release/hotfix branches in a Git repository,
+      particularly suited to be utilised to follow Vincent Driessen's
+      branching model.
+    '';
+    license = licenses.bsd2;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ offline ];
+  };
+}
diff --git a/pkgs/by-name/gi/gitfs/package.nix b/pkgs/by-name/gi/gitfs/package.nix
new file mode 100644
index 000000000000..c99455cdb997
--- /dev/null
+++ b/pkgs/by-name/gi/gitfs/package.nix
@@ -0,0 +1,44 @@
+{ lib, fetchFromGitHub, python3Packages }:
+
+python3Packages.buildPythonApplication rec {
+  pname = "gitfs";
+  version = "0.5.2";
+
+  src = fetchFromGitHub {
+    owner = "PressLabs";
+    repo = "gitfs";
+    rev = version;
+    sha256 = "1jzwdwan8ndvp2lw6j7zbvg5k9rgf2d8dcxjrwc6bwyk59xdxn4p";
+  };
+
+  patchPhase = ''
+    # requirement checks are unnecessary at runtime
+    echo > requirements.txt
+
+    # NOTE: As of gitfs 0.5.2, The pygit2 release that upstream uses is a major
+    # version behind the one packaged in nixpkgs.
+    substituteInPlace gitfs/mounter.py --replace \
+      'from pygit2.remote import RemoteCallbacks' \
+      'from pygit2 import RemoteCallbacks'
+  '';
+
+  nativeCheckInputs = with python3Packages; [ pytest pytest-cov mock ];
+  propagatedBuildInputs = with python3Packages; [ atomiclong fusepy pygit2 six ];
+
+  checkPhase = "py.test";
+  doCheck = false;
+
+  meta = {
+    description = "FUSE filesystem that fully integrates with git";
+    longDescription = ''
+      A git remote repository's branch can be mounted locally,
+      and any subsequent changes made to the files will be
+      automatically committed to the remote.
+    '';
+    homepage = "https://github.com/PressLabs/gitfs";
+    license = lib.licenses.asl20;
+    platforms = lib.platforms.unix;
+    maintainers = [ lib.maintainers.robbinch ];
+    mainProgram = "gitfs";
+  };
+}
diff --git a/pkgs/by-name/gi/gitg/package.nix b/pkgs/by-name/gi/gitg/package.nix
index 5c99f00c1206..c5071267ae8c 100644
--- a/pkgs/by-name/gi/gitg/package.nix
+++ b/pkgs/by-name/gi/gitg/package.nix
@@ -90,6 +90,7 @@ stdenv.mkDerivation rec {
 
   meta = with lib; {
     homepage = "https://gitlab.gnome.org/GNOME/gitg";
+    changelog = "https://gitlab.gnome.org/GNOME/gitg/-/blob/v${version}/NEWS?ref_type=tags";
     description = "GNOME GUI client to view git repositories";
     mainProgram = "gitg";
     maintainers = with maintainers; [ domenkozar Luflosi ];
diff --git a/pkgs/by-name/gi/githooks/package.nix b/pkgs/by-name/gi/githooks/package.nix
index d5a0b78f494f..54acd5292923 100644
--- a/pkgs/by-name/gi/githooks/package.nix
+++ b/pkgs/by-name/gi/githooks/package.nix
@@ -9,13 +9,13 @@
 }:
 buildGoModule rec {
   pname = "githooks";
-  version = "3.0.3";
+  version = "3.0.4";
 
   src = fetchFromGitHub {
     owner = "gabyx";
     repo = "githooks";
     rev = "v${version}";
-    hash = "sha256-9IsE9XGeMgOPPEyBvGLZaZKyz5HjnugiELP76+alFmU=";
+    hash = "sha256-pTSC8ruNiPzQO1C6j+G+WFX3pz/mWPukuWkKUSYdfHw=";
   };
 
   modRoot = "./githooks";
diff --git a/pkgs/by-name/gi/github-backup/package.nix b/pkgs/by-name/gi/github-backup/package.nix
new file mode 100644
index 000000000000..6958bf579b5a
--- /dev/null
+++ b/pkgs/by-name/gi/github-backup/package.nix
@@ -0,0 +1,39 @@
+{ lib
+, python3Packages
+, fetchFromGitHub
+, git
+, git-lfs
+}:
+
+python3Packages.buildPythonApplication rec {
+  pname = "github-backup";
+  version = "0.46.0";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "josegonzalez";
+    repo = "python-github-backup";
+    rev = "refs/tags/${version}";
+    hash = "sha256-kSxkD8vWBvaT7C0sS9rs3CEP2yeWsAJ0kjPlrGezoLU=";
+  };
+
+  build-system = with python3Packages; [
+    setuptools
+  ];
+
+  makeWrapperArgs = [
+    "--prefix" "PATH" ":" (lib.makeBinPath [ git git-lfs ])
+  ];
+
+  # has no unit tests
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Backup a github user or organization";
+    homepage = "https://github.com/josegonzalez/python-github-backup";
+    changelog = "https://github.com/josegonzalez/python-github-backup/blob/${version}/CHANGES.rst";
+    license = licenses.mit;
+    maintainers = with maintainers; [ dotlambda ];
+    mainProgram = "github-backup";
+  };
+}
diff --git a/pkgs/by-name/gi/github-commenter/package.nix b/pkgs/by-name/gi/github-commenter/package.nix
new file mode 100644
index 000000000000..50a12e0eb0a8
--- /dev/null
+++ b/pkgs/by-name/gi/github-commenter/package.nix
@@ -0,0 +1,23 @@
+{ lib, fetchFromGitHub, buildGoModule }:
+
+buildGoModule rec {
+  pname = "github-commenter";
+  version = "0.28.0";
+
+  src = fetchFromGitHub {
+    owner = "cloudposse";
+    repo = pname;
+    rev = version;
+    hash = "sha256-x3/ae22ub9Us3mvSmvq9ohlkujvZCUfSrmZeQNvIWzE=";
+  };
+
+  vendorHash = "sha256-DS2cTYQasIKmyqHS3kTpNMA4fuLxSv4n7ZQjeRWE0gI=";
+
+  meta = with lib; {
+    description = "Command line utility for creating GitHub comments on Commits, Pull Request Reviews or Issues";
+    mainProgram = "github-commenter";
+    license = licenses.asl20;
+    homepage = "https://github.com/cloudposse/github-commenter";
+    maintainers = [ maintainers.mmahut ];
+  };
+}
diff --git a/pkgs/by-name/gi/github-copilot-cli/package-lock.json b/pkgs/by-name/gi/github-copilot-cli/package-lock.json
new file mode 100644
index 000000000000..03bc0c1fc339
--- /dev/null
+++ b/pkgs/by-name/gi/github-copilot-cli/package-lock.json
@@ -0,0 +1,3329 @@
+{
+  "name": "@githubnext/github-copilot-cli",
+  "version": "0.1.36",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "@githubnext/github-copilot-cli",
+      "version": "0.1.36",
+      "dependencies": {
+        "applicationinsights": "^2.9.1",
+        "axios": "^1.6.0",
+        "chalk": "^5.1.0",
+        "cli-highlight": "^2.1.11",
+        "commander": "^9.4.1",
+        "get-stream": "^6.0.1",
+        "immer": "^9.0.16",
+        "ink": "^3.2.0",
+        "ink-divider": "^3.0.0",
+        "ink-select-input": "^4.2.1",
+        "ink-spinner": "^4.0.3",
+        "ink-text-input": "^4.0.3",
+        "inquirer": "^9.1.4",
+        "marked": "^4.2.12",
+        "marked-terminal": "^5.1.1",
+        "ora": "^6.1.2",
+        "radash": "^9.1.0",
+        "react": "17",
+        "react-devtools-core": "^4.28.4",
+        "react-dom": "17",
+        "react-query": "^3.39.2",
+        "semver": "^5.7.2",
+        "simple-update-notifier": "^1.1.0",
+        "tiny-invariant": "^1.3.1",
+        "tough-cookie": "^4.1.3",
+        "ts-dedent": "^2.2.0",
+        "use-zustand": "^0.0.1",
+        "uuid": "^9.0.0",
+        "zustand": "^4.1.4"
+      },
+      "bin": {
+        "github-copilot-cli": "cli.js"
+      },
+      "devDependencies": {
+        "@types/inquirer": "^9.0.2",
+        "@types/node": "^18.8.3",
+        "@types/react": "^18.0.25",
+        "@types/uuid": "^8.3.4",
+        "esbuild": "^0.15.10",
+        "genversion": "^3.1.1",
+        "typescript": "^4.8.4"
+      }
+    },
+    "node_modules/@azure/abort-controller": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz",
+      "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==",
+      "dependencies": {
+        "tslib": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      }
+    },
+    "node_modules/@azure/core-auth": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.5.0.tgz",
+      "integrity": "sha512-udzoBuYG1VBoHVohDTrvKjyzel34zt77Bhp7dQntVGGD0ehVq48owENbBG8fIgkHRNUBQH5k1r0hpoMu5L8+kw==",
+      "dependencies": {
+        "@azure/abort-controller": "^1.0.0",
+        "@azure/core-util": "^1.1.0",
+        "tslib": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/@azure/core-rest-pipeline": {
+      "version": "1.10.1",
+      "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.10.1.tgz",
+      "integrity": "sha512-Kji9k6TOFRDB5ZMTw8qUf2IJ+CeJtsuMdAHox9eqpTf1cefiNMpzrfnF6sINEBZJsaVaWgQ0o48B6kcUH68niA==",
+      "dependencies": {
+        "@azure/abort-controller": "^1.0.0",
+        "@azure/core-auth": "^1.4.0",
+        "@azure/core-tracing": "^1.0.1",
+        "@azure/core-util": "^1.0.0",
+        "@azure/logger": "^1.0.0",
+        "form-data": "^4.0.0",
+        "http-proxy-agent": "^5.0.0",
+        "https-proxy-agent": "^5.0.0",
+        "tslib": "^2.2.0",
+        "uuid": "^8.3.0"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/@azure/core-rest-pipeline/node_modules/uuid": {
+      "version": "8.3.2",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+      "bin": {
+        "uuid": "dist/bin/uuid"
+      }
+    },
+    "node_modules/@azure/core-tracing": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.1.tgz",
+      "integrity": "sha512-I5CGMoLtX+pI17ZdiFJZgxMJApsK6jjfm85hpgp3oazCdq5Wxgh4wMr7ge/TTWW1B5WBuvIOI1fMU/FrOAMKrw==",
+      "dependencies": {
+        "tslib": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=12.0.0"
+      }
+    },
+    "node_modules/@azure/core-util": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.2.0.tgz",
+      "integrity": "sha512-ffGIw+Qs8bNKNLxz5UPkz4/VBM/EZY07mPve1ZYFqYUdPwFqRj0RPk0U7LZMOfT7GCck9YjuT1Rfp1PApNl1ng==",
+      "dependencies": {
+        "@azure/abort-controller": "^1.0.0",
+        "tslib": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/@azure/logger": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.4.tgz",
+      "integrity": "sha512-ustrPY8MryhloQj7OWGe+HrYx+aoiOxzbXTtgblbV3xwCqpzUK36phH3XNHQKj3EPonyFUuDTfR3qFhTEAuZEg==",
+      "dependencies": {
+        "tslib": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/@azure/opentelemetry-instrumentation-azure-sdk": {
+      "version": "1.0.0-beta.5",
+      "resolved": "https://registry.npmjs.org/@azure/opentelemetry-instrumentation-azure-sdk/-/opentelemetry-instrumentation-azure-sdk-1.0.0-beta.5.tgz",
+      "integrity": "sha512-fsUarKQDvjhmBO4nIfaZkfNSApm1hZBzcvpNbSrXdcUBxu7lRvKsV5DnwszX7cnhLyVOW9yl1uigtRQ1yDANjA==",
+      "dependencies": {
+        "@azure/core-tracing": "^1.0.0",
+        "@azure/logger": "^1.0.0",
+        "@opentelemetry/api": "^1.4.1",
+        "@opentelemetry/core": "^1.15.2",
+        "@opentelemetry/instrumentation": "^0.41.2",
+        "tslib": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/@babel/runtime": {
+      "version": "7.23.8",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz",
+      "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==",
+      "dependencies": {
+        "regenerator-runtime": "^0.14.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@colors/colors": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+      "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+      "optional": true,
+      "engines": {
+        "node": ">=0.1.90"
+      }
+    },
+    "node_modules/@esbuild/android-arm": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz",
+      "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@esbuild/linux-loong64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz",
+      "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@ljharb/through": {
+      "version": "2.3.11",
+      "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.11.tgz",
+      "integrity": "sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==",
+      "dependencies": {
+        "call-bind": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/@microsoft/applicationinsights-web-snippet": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-web-snippet/-/applicationinsights-web-snippet-1.0.1.tgz",
+      "integrity": "sha512-2IHAOaLauc8qaAitvWS+U931T+ze+7MNWrDHY47IENP5y2UA0vqJDu67kWZDdpCN1fFC77sfgfB+HV7SrKshnQ=="
+    },
+    "node_modules/@opentelemetry/api": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.7.0.tgz",
+      "integrity": "sha512-AdY5wvN0P2vXBi3b29hxZgSFvdhdxPB9+f0B6s//P9Q8nibRWeA3cHm8UmLpio9ABigkVHJ5NMPk+Mz8VCCyrw==",
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/@opentelemetry/core": {
+      "version": "1.20.0",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.20.0.tgz",
+      "integrity": "sha512-lSRvk5AIdD6CtgYJcJXh0wGibQ3S/8bC2qbqKs9wK8e0K1tsWV6YkGFOqVc+jIRlCbZoIBeZzDe5UI+vb94uvg==",
+      "dependencies": {
+        "@opentelemetry/semantic-conventions": "1.20.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": ">=1.0.0 <1.8.0"
+      }
+    },
+    "node_modules/@opentelemetry/instrumentation": {
+      "version": "0.41.2",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.41.2.tgz",
+      "integrity": "sha512-rxU72E0pKNH6ae2w5+xgVYZLzc5mlxAbGzF4shxMVK8YC2QQsfN38B2GPbj0jvrKWWNUElfclQ+YTykkNg/grw==",
+      "dependencies": {
+        "@types/shimmer": "^1.0.2",
+        "import-in-the-middle": "1.4.2",
+        "require-in-the-middle": "^7.1.1",
+        "semver": "^7.5.1",
+        "shimmer": "^1.2.1"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": "^1.3.0"
+      }
+    },
+    "node_modules/@opentelemetry/instrumentation/node_modules/semver": {
+      "version": "7.5.4",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+      "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@opentelemetry/resources": {
+      "version": "1.20.0",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.20.0.tgz",
+      "integrity": "sha512-nOpV0vGegSq+9ze2cEDvO3BMA5pGBhmhKZiAlj+xQZjiEjPmJtdHIuBLRvptu2ahcbFJw85gIB9BYHZOvZK1JQ==",
+      "dependencies": {
+        "@opentelemetry/core": "1.20.0",
+        "@opentelemetry/semantic-conventions": "1.20.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": ">=1.0.0 <1.8.0"
+      }
+    },
+    "node_modules/@opentelemetry/sdk-trace-base": {
+      "version": "1.20.0",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.20.0.tgz",
+      "integrity": "sha512-BAIZ0hUgnhdb3OBQjn1FKGz/Iwie4l+uOMKklP7FGh7PTqEAbbzDNMJKaZQh6KepF7Fq+CZDRKslD3yrYy2Tzw==",
+      "dependencies": {
+        "@opentelemetry/core": "1.20.0",
+        "@opentelemetry/resources": "1.20.0",
+        "@opentelemetry/semantic-conventions": "1.20.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "peerDependencies": {
+        "@opentelemetry/api": ">=1.0.0 <1.8.0"
+      }
+    },
+    "node_modules/@opentelemetry/semantic-conventions": {
+      "version": "1.20.0",
+      "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.20.0.tgz",
+      "integrity": "sha512-3zLJJCgTKYpbqFX8drl8hOCHtdchELC+kGqlVcV4mHW1DiElTtv1Nt9EKBptTd1IfL56QkuYnWJ3DeHd2Gtu/A==",
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/@tootallnate/once": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
+      "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/@types/inquirer": {
+      "version": "9.0.7",
+      "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.7.tgz",
+      "integrity": "sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==",
+      "dev": true,
+      "dependencies": {
+        "@types/through": "*",
+        "rxjs": "^7.2.0"
+      }
+    },
+    "node_modules/@types/node": {
+      "version": "18.19.8",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.8.tgz",
+      "integrity": "sha512-g1pZtPhsvGVTwmeVoexWZLTQaOvXwoSq//pTL0DHeNzUDrFnir4fgETdhjhIxjVnN+hKOuh98+E1eMLnUXstFg==",
+      "dev": true,
+      "dependencies": {
+        "undici-types": "~5.26.4"
+      }
+    },
+    "node_modules/@types/prop-types": {
+      "version": "15.7.11",
+      "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz",
+      "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==",
+      "devOptional": true
+    },
+    "node_modules/@types/react": {
+      "version": "18.2.48",
+      "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.48.tgz",
+      "integrity": "sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==",
+      "devOptional": true,
+      "dependencies": {
+        "@types/prop-types": "*",
+        "@types/scheduler": "*",
+        "csstype": "^3.0.2"
+      }
+    },
+    "node_modules/@types/scheduler": {
+      "version": "0.16.8",
+      "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
+      "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==",
+      "devOptional": true
+    },
+    "node_modules/@types/shimmer": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.5.tgz",
+      "integrity": "sha512-9Hp0ObzwwO57DpLFF0InUjUm/II8GmKAvzbefxQTihCb7KI6yc9yzf0nLc4mVdby5N4DRCgQM2wCup9KTieeww=="
+    },
+    "node_modules/@types/through": {
+      "version": "0.0.33",
+      "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz",
+      "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==",
+      "dev": true,
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@types/uuid": {
+      "version": "8.3.4",
+      "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz",
+      "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==",
+      "dev": true
+    },
+    "node_modules/@types/yoga-layout": {
+      "version": "1.9.2",
+      "resolved": "https://registry.npmjs.org/@types/yoga-layout/-/yoga-layout-1.9.2.tgz",
+      "integrity": "sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw=="
+    },
+    "node_modules/acorn": {
+      "version": "8.11.3",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
+      "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/acorn-import-assertions": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
+      "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
+      "peerDependencies": {
+        "acorn": "^8"
+      }
+    },
+    "node_modules/agent-base": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+      "dependencies": {
+        "debug": "4"
+      },
+      "engines": {
+        "node": ">= 6.0.0"
+      }
+    },
+    "node_modules/ansi-escapes": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+      "dependencies": {
+        "type-fest": "^0.21.3"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/ansi-escapes/node_modules/type-fest": {
+      "version": "0.21.3",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+      "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "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==",
+      "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==",
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/ansicolors": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz",
+      "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg=="
+    },
+    "node_modules/any-promise": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+      "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="
+    },
+    "node_modules/applicationinsights": {
+      "version": "2.9.2",
+      "resolved": "https://registry.npmjs.org/applicationinsights/-/applicationinsights-2.9.2.tgz",
+      "integrity": "sha512-wlDiD7v0BQNM8oNzsf9C836R5ze25u+CuCEZsbA5xMIXYYBxkqkWE/mo9GFJM7rsKaiGqpxEwWmePHKD2Lwy2w==",
+      "dependencies": {
+        "@azure/core-auth": "^1.5.0",
+        "@azure/core-rest-pipeline": "1.10.1",
+        "@azure/core-util": "1.2.0",
+        "@azure/opentelemetry-instrumentation-azure-sdk": "^1.0.0-beta.5",
+        "@microsoft/applicationinsights-web-snippet": "^1.0.1",
+        "@opentelemetry/api": "^1.7.0",
+        "@opentelemetry/core": "^1.19.0",
+        "@opentelemetry/sdk-trace-base": "^1.19.0",
+        "@opentelemetry/semantic-conventions": "^1.19.0",
+        "cls-hooked": "^4.2.2",
+        "continuation-local-storage": "^3.2.1",
+        "diagnostic-channel": "1.1.1",
+        "diagnostic-channel-publishers": "1.0.8"
+      },
+      "engines": {
+        "node": ">=8.0.0"
+      },
+      "peerDependencies": {
+        "applicationinsights-native-metrics": "*"
+      },
+      "peerDependenciesMeta": {
+        "applicationinsights-native-metrics": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/arr-rotate": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/arr-rotate/-/arr-rotate-1.0.0.tgz",
+      "integrity": "sha512-yOzOZcR9Tn7enTF66bqKorGGH0F36vcPaSWg8fO0c0UYb3LX3VMXj5ZxEqQLNOecAhlRJ7wYZja5i4jTlnbIfQ==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/astral-regex": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+      "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/async": {
+      "version": "3.2.5",
+      "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz",
+      "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==",
+      "dev": true
+    },
+    "node_modules/async-hook-jl": {
+      "version": "1.7.6",
+      "resolved": "https://registry.npmjs.org/async-hook-jl/-/async-hook-jl-1.7.6.tgz",
+      "integrity": "sha512-gFaHkFfSxTjvoxDMYqDuGHlcRyUuamF8s+ZTtJdDzqjws4mCt7v0vuV79/E2Wr2/riMQgtG4/yUtXWs1gZ7JMg==",
+      "dependencies": {
+        "stack-chain": "^1.3.7"
+      },
+      "engines": {
+        "node": "^4.7 || >=6.9 || >=7.3"
+      }
+    },
+    "node_modules/async-listener": {
+      "version": "0.6.10",
+      "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz",
+      "integrity": "sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==",
+      "dependencies": {
+        "semver": "^5.3.0",
+        "shimmer": "^1.1.0"
+      },
+      "engines": {
+        "node": "<=0.11.8 || >0.11.10"
+      }
+    },
+    "node_modules/asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+    },
+    "node_modules/auto-bind": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz",
+      "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==",
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/axios": {
+      "version": "1.6.5",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz",
+      "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==",
+      "dependencies": {
+        "follow-redirects": "^1.15.4",
+        "form-data": "^4.0.0",
+        "proxy-from-env": "^1.1.0"
+      }
+    },
+    "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=="
+    },
+    "node_modules/base64-js": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+      "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/big-integer": {
+      "version": "1.6.52",
+      "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz",
+      "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==",
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/bl": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz",
+      "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==",
+      "dependencies": {
+        "buffer": "^6.0.3",
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.4.0"
+      }
+    },
+    "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==",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/broadcast-channel": {
+      "version": "3.7.0",
+      "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz",
+      "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==",
+      "dependencies": {
+        "@babel/runtime": "^7.7.2",
+        "detect-node": "^2.1.0",
+        "js-sha3": "0.8.0",
+        "microseconds": "0.2.0",
+        "nano-time": "1.0.0",
+        "oblivious-set": "1.0.0",
+        "rimraf": "3.0.2",
+        "unload": "2.2.0"
+      }
+    },
+    "node_modules/buffer": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+      "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+      "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": {
+        "base64-js": "^1.3.1",
+        "ieee754": "^1.2.1"
+      }
+    },
+    "node_modules/call-bind": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
+      "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
+      "dependencies": {
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.1",
+        "set-function-length": "^1.1.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/cardinal": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz",
+      "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==",
+      "dependencies": {
+        "ansicolors": "~0.3.2",
+        "redeyed": "~2.1.0"
+      },
+      "bin": {
+        "cdl": "bin/cdl.js"
+      }
+    },
+    "node_modules/chalk": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
+      "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
+      "engines": {
+        "node": "^12.17.0 || ^14.13 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/chardet": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+      "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
+    },
+    "node_modules/ci-info": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="
+    },
+    "node_modules/cjs-module-lexer": {
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz",
+      "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ=="
+    },
+    "node_modules/cli-boxes": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
+      "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/cli-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+      "dependencies": {
+        "restore-cursor": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/cli-highlight": {
+      "version": "2.1.11",
+      "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz",
+      "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==",
+      "dependencies": {
+        "chalk": "^4.0.0",
+        "highlight.js": "^10.7.1",
+        "mz": "^2.4.0",
+        "parse5": "^5.1.1",
+        "parse5-htmlparser2-tree-adapter": "^6.0.0",
+        "yargs": "^16.0.0"
+      },
+      "bin": {
+        "highlight": "bin/highlight"
+      },
+      "engines": {
+        "node": ">=8.0.0",
+        "npm": ">=5.0.0"
+      }
+    },
+    "node_modules/cli-highlight/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "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/cli-spinners": {
+      "version": "2.9.2",
+      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
+      "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/cli-table3": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz",
+      "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==",
+      "dependencies": {
+        "string-width": "^4.2.0"
+      },
+      "engines": {
+        "node": "10.* || >= 12.*"
+      },
+      "optionalDependencies": {
+        "@colors/colors": "1.5.0"
+      }
+    },
+    "node_modules/cli-truncate": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
+      "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
+      "dependencies": {
+        "slice-ansi": "^3.0.0",
+        "string-width": "^4.2.0"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/cli-width": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
+      "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==",
+      "engines": {
+        "node": ">= 12"
+      }
+    },
+    "node_modules/cliui": {
+      "version": "7.0.4",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+      "dependencies": {
+        "string-width": "^4.2.0",
+        "strip-ansi": "^6.0.0",
+        "wrap-ansi": "^7.0.0"
+      }
+    },
+    "node_modules/cliui/node_modules/wrap-ansi": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "node_modules/clone": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+      "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/cls-hooked": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/cls-hooked/-/cls-hooked-4.2.2.tgz",
+      "integrity": "sha512-J4Xj5f5wq/4jAvcdgoGsL3G103BtWpZrMo8NEinRltN+xpTZdI+M38pyQqhuFU/P792xkMFvnKSf+Lm81U1bxw==",
+      "dependencies": {
+        "async-hook-jl": "^1.7.6",
+        "emitter-listener": "^1.0.1",
+        "semver": "^5.4.1"
+      },
+      "engines": {
+        "node": "^4.7 || >=6.9 || >=7.3 || >=8.2.1"
+      }
+    },
+    "node_modules/code-excerpt": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-3.0.0.tgz",
+      "integrity": "sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw==",
+      "dependencies": {
+        "convert-to-spaces": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "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==",
+      "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=="
+    },
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dependencies": {
+        "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/commander": {
+      "version": "9.5.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+      "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
+      "engines": {
+        "node": "^12.20.0 || >=14"
+      }
+    },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+    },
+    "node_modules/continuation-local-storage": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz",
+      "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==",
+      "dependencies": {
+        "async-listener": "^0.6.0",
+        "emitter-listener": "^1.1.1"
+      }
+    },
+    "node_modules/convert-to-spaces": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz",
+      "integrity": "sha512-cj09EBuObp9gZNQCzc7hByQyrs6jVGE+o9kSJmeUoj+GiPiJvi5LYqEH/Hmme4+MTLHM+Ejtq+FChpjjEnsPdQ==",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/csstype": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+      "devOptional": true
+    },
+    "node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/defaults": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
+      "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+      "dependencies": {
+        "clone": "^1.0.2"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/define-data-property": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
+      "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
+      "dependencies": {
+        "get-intrinsic": "^1.2.1",
+        "gopd": "^1.0.1",
+        "has-property-descriptors": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/detect-node": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
+      "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="
+    },
+    "node_modules/diagnostic-channel": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-1.1.1.tgz",
+      "integrity": "sha512-r2HV5qFkUICyoaKlBEpLKHjxMXATUf/l+h8UZPGBHGLy4DDiY2sOLcIctax4eRnTw5wH2jTMExLntGPJ8eOJxw==",
+      "dependencies": {
+        "semver": "^7.5.3"
+      }
+    },
+    "node_modules/diagnostic-channel-publishers": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/diagnostic-channel-publishers/-/diagnostic-channel-publishers-1.0.8.tgz",
+      "integrity": "sha512-HmSm9hXxSPxA9BaLGY98QU1zsdjeCk113KjAYGPCen1ZP6mhVaTPzHd6UYv5r21DnWANi+f+NyPOHruGT9jpqQ==",
+      "peerDependencies": {
+        "diagnostic-channel": "*"
+      }
+    },
+    "node_modules/diagnostic-channel/node_modules/semver": {
+      "version": "7.5.4",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+      "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/ejs": {
+      "version": "3.1.9",
+      "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz",
+      "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==",
+      "dev": true,
+      "dependencies": {
+        "jake": "^10.8.5"
+      },
+      "bin": {
+        "ejs": "bin/cli.js"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/emitter-listener": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz",
+      "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==",
+      "dependencies": {
+        "shimmer": "^1.2.0"
+      }
+    },
+    "node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+    },
+    "node_modules/esbuild": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz",
+      "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==",
+      "dev": true,
+      "hasInstallScript": true,
+      "bin": {
+        "esbuild": "bin/esbuild"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "optionalDependencies": {
+        "@esbuild/android-arm": "0.15.18",
+        "@esbuild/linux-loong64": "0.15.18",
+        "esbuild-android-64": "0.15.18",
+        "esbuild-android-arm64": "0.15.18",
+        "esbuild-darwin-64": "0.15.18",
+        "esbuild-darwin-arm64": "0.15.18",
+        "esbuild-freebsd-64": "0.15.18",
+        "esbuild-freebsd-arm64": "0.15.18",
+        "esbuild-linux-32": "0.15.18",
+        "esbuild-linux-64": "0.15.18",
+        "esbuild-linux-arm": "0.15.18",
+        "esbuild-linux-arm64": "0.15.18",
+        "esbuild-linux-mips64le": "0.15.18",
+        "esbuild-linux-ppc64le": "0.15.18",
+        "esbuild-linux-riscv64": "0.15.18",
+        "esbuild-linux-s390x": "0.15.18",
+        "esbuild-netbsd-64": "0.15.18",
+        "esbuild-openbsd-64": "0.15.18",
+        "esbuild-sunos-64": "0.15.18",
+        "esbuild-windows-32": "0.15.18",
+        "esbuild-windows-64": "0.15.18",
+        "esbuild-windows-arm64": "0.15.18"
+      }
+    },
+    "node_modules/esbuild-android-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz",
+      "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-android-arm64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz",
+      "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-darwin-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz",
+      "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-darwin-arm64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz",
+      "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-freebsd-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz",
+      "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-freebsd-arm64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz",
+      "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-linux-32": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz",
+      "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-linux-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz",
+      "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-linux-arm": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz",
+      "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-linux-arm64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz",
+      "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-linux-mips64le": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz",
+      "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==",
+      "cpu": [
+        "mips64el"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-linux-ppc64le": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz",
+      "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-linux-riscv64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz",
+      "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-linux-s390x": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz",
+      "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-netbsd-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz",
+      "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-openbsd-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz",
+      "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-sunos-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz",
+      "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "sunos"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-windows-32": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz",
+      "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-windows-64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz",
+      "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/esbuild-windows-arm64": {
+      "version": "0.15.18",
+      "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz",
+      "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/escalade": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+      "bin": {
+        "esparse": "bin/esparse.js",
+        "esvalidate": "bin/esvalidate.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/external-editor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
+      "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+      "dependencies": {
+        "chardet": "^0.7.0",
+        "iconv-lite": "^0.4.24",
+        "tmp": "^0.0.33"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/figures": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+      "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+      "dependencies": {
+        "escape-string-regexp": "^1.0.5"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/filelist": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+      "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+      "dev": true,
+      "dependencies": {
+        "minimatch": "^5.0.1"
+      }
+    },
+    "node_modules/filelist/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/filelist/node_modules/minimatch": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+      "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/find-package": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/find-package/-/find-package-1.0.0.tgz",
+      "integrity": "sha512-yVn71XCCaNgxz58ERTl8nA/8YYtIQDY9mHSrgFBfiFtdNNfY0h183Vh8BRkKxD8x9TUw3ec290uJKhDVxqGZBw==",
+      "dev": true,
+      "dependencies": {
+        "parents": "^1.0.1"
+      }
+    },
+    "node_modules/follow-redirects": {
+      "version": "1.15.5",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz",
+      "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/RubenVerborgh"
+        }
+      ],
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/form-data": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "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=="
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/genversion": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/genversion/-/genversion-3.2.0.tgz",
+      "integrity": "sha512-OIYSX6XYA8PHecLDCTri30hadSZfAjZ8Iq1+BBDXqLWP4dRLuJNLoNjsSWtTpw97IccK2LDWzkEstxAB8GdN7g==",
+      "dev": true,
+      "dependencies": {
+        "commander": "^7.2.0",
+        "ejs": "^3.1.9",
+        "find-package": "^1.0.0"
+      },
+      "bin": {
+        "genversion": "bin/genversion.js"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/genversion/node_modules/commander": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+      "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+      "dev": true,
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+      "engines": {
+        "node": "6.* || 8.* || >= 10.*"
+      }
+    },
+    "node_modules/get-intrinsic": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
+      "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
+      "dependencies": {
+        "function-bind": "^1.1.2",
+        "has-proto": "^1.0.1",
+        "has-symbols": "^1.0.3",
+        "hasown": "^2.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-stream": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/glob": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "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/gopd": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+      "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+      "dependencies": {
+        "get-intrinsic": "^1.1.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "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==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/has-property-descriptors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
+      "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
+      "dependencies": {
+        "get-intrinsic": "^1.2.2"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+      "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/hasown": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
+      "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+      "dependencies": {
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/highlight.js": {
+      "version": "10.7.3",
+      "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
+      "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/http-proxy-agent": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+      "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
+      "dependencies": {
+        "@tootallnate/once": "2",
+        "agent-base": "6",
+        "debug": "4"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/https-proxy-agent": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+      "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+      "dependencies": {
+        "agent-base": "6",
+        "debug": "4"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+      "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/immer": {
+      "version": "9.0.21",
+      "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz",
+      "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/immer"
+      }
+    },
+    "node_modules/import-in-the-middle": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.4.2.tgz",
+      "integrity": "sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw==",
+      "dependencies": {
+        "acorn": "^8.8.2",
+        "acorn-import-assertions": "^1.9.0",
+        "cjs-module-lexer": "^1.2.2",
+        "module-details-from-path": "^1.0.3"
+      }
+    },
+    "node_modules/indent-string": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "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==",
+      "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=="
+    },
+    "node_modules/ink": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/ink/-/ink-3.2.0.tgz",
+      "integrity": "sha512-firNp1q3xxTzoItj/eOOSZQnYSlyrWks5llCTVX37nJ59K3eXbQ8PtzCguqo8YI19EELo5QxaKnJd4VxzhU8tg==",
+      "dependencies": {
+        "ansi-escapes": "^4.2.1",
+        "auto-bind": "4.0.0",
+        "chalk": "^4.1.0",
+        "cli-boxes": "^2.2.0",
+        "cli-cursor": "^3.1.0",
+        "cli-truncate": "^2.1.0",
+        "code-excerpt": "^3.0.0",
+        "indent-string": "^4.0.0",
+        "is-ci": "^2.0.0",
+        "lodash": "^4.17.20",
+        "patch-console": "^1.0.0",
+        "react-devtools-core": "^4.19.1",
+        "react-reconciler": "^0.26.2",
+        "scheduler": "^0.20.2",
+        "signal-exit": "^3.0.2",
+        "slice-ansi": "^3.0.0",
+        "stack-utils": "^2.0.2",
+        "string-width": "^4.2.2",
+        "type-fest": "^0.12.0",
+        "widest-line": "^3.1.0",
+        "wrap-ansi": "^6.2.0",
+        "ws": "^7.5.5",
+        "yoga-layout-prebuilt": "^1.9.6"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "@types/react": ">=16.8.0",
+        "react": ">=16.8.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/ink-divider": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/ink-divider/-/ink-divider-3.0.0.tgz",
+      "integrity": "sha512-Mqb9WArtEZCtXw622aHhJqPK157QNc+8ssl9/RvAZlS6nZRCKyW4mYOYCudQh6dSuFGt9eG5yaqT1mJaGmwu+w==",
+      "dependencies": {
+        "prop-types": "^15.7.2",
+        "string-width": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "peerDependencies": {
+        "ink": ">=3.0.0",
+        "react": ">=16.8.0"
+      }
+    },
+    "node_modules/ink-select-input": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/ink-select-input/-/ink-select-input-4.2.2.tgz",
+      "integrity": "sha512-E5AS2Vnd4CSzEa7Rm+hG47wxRQo1ASfh4msKxO7FHmn/ym+GKSSsFIfR+FonqjKNDPXYJClw8lM47RdN3Pi+nw==",
+      "dependencies": {
+        "arr-rotate": "^1.0.0",
+        "figures": "^3.2.0",
+        "lodash.isequal": "^4.5.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "ink": "^3.0.5",
+        "react": "^16.5.2 || ^17.0.0"
+      }
+    },
+    "node_modules/ink-spinner": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/ink-spinner/-/ink-spinner-4.0.3.tgz",
+      "integrity": "sha512-uJ4nbH00MM9fjTJ5xdw0zzvtXMkeGb0WV6dzSWvFv2/+ks6FIhpkt+Ge/eLdh0Ah6Vjw5pLMyNfoHQpRDRVFbQ==",
+      "dependencies": {
+        "cli-spinners": "^2.3.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "ink": ">=3.0.5",
+        "react": ">=16.8.2"
+      }
+    },
+    "node_modules/ink-text-input": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/ink-text-input/-/ink-text-input-4.0.3.tgz",
+      "integrity": "sha512-eQD01ik9ltmNoHmkeQ2t8LszYkv2XwuPSUz3ie/85qer6Ll/j0QSlSaLNl6ENHZakBHdCBVZY04iOXcLLXA0PQ==",
+      "dependencies": {
+        "chalk": "^4.1.0",
+        "type-fest": "^0.15.1"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "ink": "^3.0.0-3",
+        "react": "^16.5.2 || ^17.0.0"
+      }
+    },
+    "node_modules/ink-text-input/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "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/ink-text-input/node_modules/type-fest": {
+      "version": "0.15.1",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.15.1.tgz",
+      "integrity": "sha512-n+UXrN8i5ioo7kqT/nF8xsEzLaqFra7k32SEsSPwvXVGyAcRgV/FUQN/sgfptJTR1oRmmq7z4IXMFSM7im7C9A==",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/ink/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "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/inquirer": {
+      "version": "9.2.12",
+      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.12.tgz",
+      "integrity": "sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==",
+      "dependencies": {
+        "@ljharb/through": "^2.3.11",
+        "ansi-escapes": "^4.3.2",
+        "chalk": "^5.3.0",
+        "cli-cursor": "^3.1.0",
+        "cli-width": "^4.1.0",
+        "external-editor": "^3.1.0",
+        "figures": "^5.0.0",
+        "lodash": "^4.17.21",
+        "mute-stream": "1.0.0",
+        "ora": "^5.4.1",
+        "run-async": "^3.0.0",
+        "rxjs": "^7.8.1",
+        "string-width": "^4.2.3",
+        "strip-ansi": "^6.0.1",
+        "wrap-ansi": "^6.2.0"
+      },
+      "engines": {
+        "node": ">=14.18.0"
+      }
+    },
+    "node_modules/inquirer/node_modules/bl": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+      "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+      "dependencies": {
+        "buffer": "^5.5.0",
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.4.0"
+      }
+    },
+    "node_modules/inquirer/node_modules/buffer": {
+      "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+      "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": {
+        "base64-js": "^1.3.1",
+        "ieee754": "^1.1.13"
+      }
+    },
+    "node_modules/inquirer/node_modules/escape-string-regexp": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+      "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/inquirer/node_modules/figures": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz",
+      "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==",
+      "dependencies": {
+        "escape-string-regexp": "^5.0.0",
+        "is-unicode-supported": "^1.2.0"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/inquirer/node_modules/is-interactive": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+      "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/inquirer/node_modules/log-symbols": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+      "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+      "dependencies": {
+        "chalk": "^4.1.0",
+        "is-unicode-supported": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/inquirer/node_modules/log-symbols/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "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/inquirer/node_modules/log-symbols/node_modules/is-unicode-supported": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+      "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/inquirer/node_modules/ora": {
+      "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
+      "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
+      "dependencies": {
+        "bl": "^4.1.0",
+        "chalk": "^4.1.0",
+        "cli-cursor": "^3.1.0",
+        "cli-spinners": "^2.5.0",
+        "is-interactive": "^1.0.0",
+        "is-unicode-supported": "^0.1.0",
+        "log-symbols": "^4.1.0",
+        "strip-ansi": "^6.0.0",
+        "wcwidth": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/inquirer/node_modules/ora/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "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/inquirer/node_modules/ora/node_modules/is-unicode-supported": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+      "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-ci": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
+      "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+      "dependencies": {
+        "ci-info": "^2.0.0"
+      },
+      "bin": {
+        "is-ci": "bin.js"
+      }
+    },
+    "node_modules/is-core-module": {
+      "version": "2.13.1",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
+      "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+      "dependencies": {
+        "hasown": "^2.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-interactive": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz",
+      "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-unicode-supported": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz",
+      "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/jake": {
+      "version": "10.8.7",
+      "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz",
+      "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==",
+      "dev": true,
+      "dependencies": {
+        "async": "^3.2.3",
+        "chalk": "^4.0.2",
+        "filelist": "^1.0.4",
+        "minimatch": "^3.1.2"
+      },
+      "bin": {
+        "jake": "bin/cli.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/jake/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/js-sha3": {
+      "version": "0.8.0",
+      "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
+      "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q=="
+    },
+    "node_modules/js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+    },
+    "node_modules/lodash": {
+      "version": "4.17.21",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+    },
+    "node_modules/lodash.isequal": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+      "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
+    },
+    "node_modules/log-symbols": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz",
+      "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==",
+      "dependencies": {
+        "chalk": "^5.0.0",
+        "is-unicode-supported": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/loose-envify": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+      "dependencies": {
+        "js-tokens": "^3.0.0 || ^4.0.0"
+      },
+      "bin": {
+        "loose-envify": "cli.js"
+      }
+    },
+    "node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/marked": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz",
+      "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==",
+      "bin": {
+        "marked": "bin/marked.js"
+      },
+      "engines": {
+        "node": ">= 12"
+      }
+    },
+    "node_modules/marked-terminal": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.2.0.tgz",
+      "integrity": "sha512-Piv6yNwAQXGFjZSaiNljyNFw7jKDdGrw70FSbtxEyldLsyeuV5ZHm/1wW++kWbrOF1VPnUgYOhB2oLL0ZpnekA==",
+      "dependencies": {
+        "ansi-escapes": "^6.2.0",
+        "cardinal": "^2.1.1",
+        "chalk": "^5.2.0",
+        "cli-table3": "^0.6.3",
+        "node-emoji": "^1.11.0",
+        "supports-hyperlinks": "^2.3.0"
+      },
+      "engines": {
+        "node": ">=14.13.1 || >=16.0.0"
+      },
+      "peerDependencies": {
+        "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0"
+      }
+    },
+    "node_modules/marked-terminal/node_modules/ansi-escapes": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz",
+      "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==",
+      "dependencies": {
+        "type-fest": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=14.16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/marked-terminal/node_modules/type-fest": {
+      "version": "3.13.1",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz",
+      "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==",
+      "engines": {
+        "node": ">=14.16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/match-sorter": {
+      "version": "6.3.3",
+      "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.3.tgz",
+      "integrity": "sha512-sgiXxrRijEe0SzHKGX4HouCpfHRPnqteH42UdMEW7BlWy990ZkzcvonJGv4Uu9WE7Y1f8Yocm91+4qFPCbmNww==",
+      "dependencies": {
+        "@babel/runtime": "^7.23.8",
+        "remove-accents": "0.5.0"
+      }
+    },
+    "node_modules/microseconds": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz",
+      "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA=="
+    },
+    "node_modules/mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types": {
+      "version": "2.1.35",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "dependencies": {
+        "mime-db": "1.52.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mimic-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/module-details-from-path": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz",
+      "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A=="
+    },
+    "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=="
+    },
+    "node_modules/mute-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz",
+      "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==",
+      "engines": {
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+      }
+    },
+    "node_modules/mz": {
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+      "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+      "dependencies": {
+        "any-promise": "^1.0.0",
+        "object-assign": "^4.0.1",
+        "thenify-all": "^1.0.0"
+      }
+    },
+    "node_modules/nano-time": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz",
+      "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==",
+      "dependencies": {
+        "big-integer": "^1.6.16"
+      }
+    },
+    "node_modules/node-emoji": {
+      "version": "1.11.0",
+      "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz",
+      "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==",
+      "dependencies": {
+        "lodash": "^4.17.21"
+      }
+    },
+    "node_modules/object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/oblivious-set": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz",
+      "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw=="
+    },
+    "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==",
+      "dependencies": {
+        "wrappy": "1"
+      }
+    },
+    "node_modules/onetime": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+      "dependencies": {
+        "mimic-fn": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/ora": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/ora/-/ora-6.3.1.tgz",
+      "integrity": "sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==",
+      "dependencies": {
+        "chalk": "^5.0.0",
+        "cli-cursor": "^4.0.0",
+        "cli-spinners": "^2.6.1",
+        "is-interactive": "^2.0.0",
+        "is-unicode-supported": "^1.1.0",
+        "log-symbols": "^5.1.0",
+        "stdin-discarder": "^0.1.0",
+        "strip-ansi": "^7.0.1",
+        "wcwidth": "^1.0.1"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/ora/node_modules/ansi-regex": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+      "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+      }
+    },
+    "node_modules/ora/node_modules/cli-cursor": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz",
+      "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==",
+      "dependencies": {
+        "restore-cursor": "^4.0.0"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/ora/node_modules/restore-cursor": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz",
+      "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==",
+      "dependencies": {
+        "onetime": "^5.1.0",
+        "signal-exit": "^3.0.2"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/ora/node_modules/strip-ansi": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+      "dependencies": {
+        "ansi-regex": "^6.0.1"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+      }
+    },
+    "node_modules/os-tmpdir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/parents": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
+      "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==",
+      "dev": true,
+      "dependencies": {
+        "path-platform": "~0.11.15"
+      }
+    },
+    "node_modules/parse5": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
+      "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug=="
+    },
+    "node_modules/parse5-htmlparser2-tree-adapter": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
+      "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
+      "dependencies": {
+        "parse5": "^6.0.1"
+      }
+    },
+    "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
+      "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="
+    },
+    "node_modules/patch-console": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/patch-console/-/patch-console-1.0.0.tgz",
+      "integrity": "sha512-nxl9nrnLQmh64iTzMfyylSlRozL7kAXIaxw1fVcLYdyhNkJCRUzirRZTikXGJsg+hc4fqpneTK6iU2H1Q8THSA==",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "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==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+    },
+    "node_modules/path-platform": {
+      "version": "0.11.15",
+      "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
+      "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/prop-types": {
+      "version": "15.8.1",
+      "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+      "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+      "dependencies": {
+        "loose-envify": "^1.4.0",
+        "object-assign": "^4.1.1",
+        "react-is": "^16.13.1"
+      }
+    },
+    "node_modules/proxy-from-env": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+    },
+    "node_modules/psl": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+      "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
+    },
+    "node_modules/punycode": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/querystringify": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
+    },
+    "node_modules/radash": {
+      "version": "9.5.0",
+      "resolved": "https://registry.npmjs.org/radash/-/radash-9.5.0.tgz",
+      "integrity": "sha512-t0s8BJlvrk8YPaOS8X0J2xzqAsBlXAUkDEjoBXwlzaXsXNCpBILjT9OvWlabLa2KB/r4XrhThdXjxMs7SiCyIw==",
+      "engines": {
+        "node": ">=14.18.0"
+      }
+    },
+    "node_modules/react": {
+      "version": "17.0.2",
+      "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz",
+      "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==",
+      "dependencies": {
+        "loose-envify": "^1.1.0",
+        "object-assign": "^4.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/react-devtools-core": {
+      "version": "4.28.5",
+      "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.28.5.tgz",
+      "integrity": "sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA==",
+      "dependencies": {
+        "shell-quote": "^1.6.1",
+        "ws": "^7"
+      }
+    },
+    "node_modules/react-dom": {
+      "version": "17.0.2",
+      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz",
+      "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==",
+      "dependencies": {
+        "loose-envify": "^1.1.0",
+        "object-assign": "^4.1.1",
+        "scheduler": "^0.20.2"
+      },
+      "peerDependencies": {
+        "react": "17.0.2"
+      }
+    },
+    "node_modules/react-is": {
+      "version": "16.13.1",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+    },
+    "node_modules/react-query": {
+      "version": "3.39.3",
+      "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz",
+      "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==",
+      "dependencies": {
+        "@babel/runtime": "^7.5.5",
+        "broadcast-channel": "^3.4.1",
+        "match-sorter": "^6.0.2"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/tannerlinsley"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      },
+      "peerDependenciesMeta": {
+        "react-dom": {
+          "optional": true
+        },
+        "react-native": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/react-reconciler": {
+      "version": "0.26.2",
+      "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.26.2.tgz",
+      "integrity": "sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q==",
+      "dependencies": {
+        "loose-envify": "^1.1.0",
+        "object-assign": "^4.1.1",
+        "scheduler": "^0.20.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      },
+      "peerDependencies": {
+        "react": "^17.0.2"
+      }
+    },
+    "node_modules/readable-stream": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/redeyed": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz",
+      "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==",
+      "dependencies": {
+        "esprima": "~4.0.0"
+      }
+    },
+    "node_modules/regenerator-runtime": {
+      "version": "0.14.1",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+      "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+    },
+    "node_modules/remove-accents": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz",
+      "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A=="
+    },
+    "node_modules/require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/require-in-the-middle": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.2.0.tgz",
+      "integrity": "sha512-3TLx5TGyAY6AOqLBoXmHkNql0HIf2RGbuMgCDT2WO/uGVAPJs6h7Kl+bN6TIZGd9bWhWPwnDnTHGtW8Iu77sdw==",
+      "dependencies": {
+        "debug": "^4.1.1",
+        "module-details-from-path": "^1.0.3",
+        "resolve": "^1.22.1"
+      },
+      "engines": {
+        "node": ">=8.6.0"
+      }
+    },
+    "node_modules/requires-port": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+      "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
+    },
+    "node_modules/resolve": {
+      "version": "1.22.8",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+      "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+      "dependencies": {
+        "is-core-module": "^2.13.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      },
+      "bin": {
+        "resolve": "bin/resolve"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/restore-cursor": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+      "dependencies": {
+        "onetime": "^5.1.0",
+        "signal-exit": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/run-async": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz",
+      "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==",
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/rxjs": {
+      "version": "7.8.1",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
+      "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
+      "dependencies": {
+        "tslib": "^2.1.0"
+      }
+    },
+    "node_modules/safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+      "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/safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+    },
+    "node_modules/scheduler": {
+      "version": "0.20.2",
+      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
+      "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
+      "dependencies": {
+        "loose-envify": "^1.1.0",
+        "object-assign": "^4.1.1"
+      }
+    },
+    "node_modules/semver": {
+      "version": "5.7.2",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+      "bin": {
+        "semver": "bin/semver"
+      }
+    },
+    "node_modules/set-function-length": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz",
+      "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==",
+      "dependencies": {
+        "define-data-property": "^1.1.1",
+        "function-bind": "^1.1.2",
+        "get-intrinsic": "^1.2.2",
+        "gopd": "^1.0.1",
+        "has-property-descriptors": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/shell-quote": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
+      "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/shimmer": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz",
+      "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw=="
+    },
+    "node_modules/signal-exit": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
+    },
+    "node_modules/simple-update-notifier": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz",
+      "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==",
+      "dependencies": {
+        "semver": "~7.0.0"
+      },
+      "engines": {
+        "node": ">=8.10.0"
+      }
+    },
+    "node_modules/simple-update-notifier/node_modules/semver": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
+      "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/slice-ansi": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
+      "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "astral-regex": "^2.0.0",
+        "is-fullwidth-code-point": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/stack-chain": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-1.3.7.tgz",
+      "integrity": "sha512-D8cWtWVdIe/jBA7v5p5Hwl5yOSOrmZPWDPe2KxQ5UAGD+nxbxU0lKXA4h85Ta6+qgdKVL3vUxsbIZjc1kBG7ug=="
+    },
+    "node_modules/stack-utils": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
+      "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
+      "dependencies": {
+        "escape-string-regexp": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/stack-utils/node_modules/escape-string-regexp": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+      "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/stdin-discarder": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz",
+      "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==",
+      "dependencies": {
+        "bl": "^5.0.0"
+      },
+      "engines": {
+        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/string_decoder": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+      "dependencies": {
+        "safe-buffer": "~5.2.0"
+      }
+    },
+    "node_modules/string-width": {
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.1"
+      },
+      "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==",
+      "dependencies": {
+        "ansi-regex": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "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==",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/supports-hyperlinks": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz",
+      "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==",
+      "dependencies": {
+        "has-flag": "^4.0.0",
+        "supports-color": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/thenify": {
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+      "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+      "dependencies": {
+        "any-promise": "^1.0.0"
+      }
+    },
+    "node_modules/thenify-all": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+      "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+      "dependencies": {
+        "thenify": ">= 3.1.0 < 4"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/tiny-invariant": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz",
+      "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw=="
+    },
+    "node_modules/tmp": {
+      "version": "0.0.33",
+      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+      "dependencies": {
+        "os-tmpdir": "~1.0.2"
+      },
+      "engines": {
+        "node": ">=0.6.0"
+      }
+    },
+    "node_modules/tough-cookie": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz",
+      "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
+      "dependencies": {
+        "psl": "^1.1.33",
+        "punycode": "^2.1.1",
+        "universalify": "^0.2.0",
+        "url-parse": "^1.5.3"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/ts-dedent": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz",
+      "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==",
+      "engines": {
+        "node": ">=6.10"
+      }
+    },
+    "node_modules/tslib": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+      "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
+    },
+    "node_modules/type-fest": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz",
+      "integrity": "sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/typescript": {
+      "version": "4.9.5",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+      "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
+      "dev": true,
+      "bin": {
+        "tsc": "bin/tsc",
+        "tsserver": "bin/tsserver"
+      },
+      "engines": {
+        "node": ">=4.2.0"
+      }
+    },
+    "node_modules/undici-types": {
+      "version": "5.26.5",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+      "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+      "dev": true
+    },
+    "node_modules/universalify": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+      "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+      "engines": {
+        "node": ">= 4.0.0"
+      }
+    },
+    "node_modules/unload": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz",
+      "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==",
+      "dependencies": {
+        "@babel/runtime": "^7.6.2",
+        "detect-node": "^2.0.4"
+      }
+    },
+    "node_modules/url-parse": {
+      "version": "1.5.10",
+      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+      "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+      "dependencies": {
+        "querystringify": "^2.1.1",
+        "requires-port": "^1.0.0"
+      }
+    },
+    "node_modules/use-sync-external-store": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
+      "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      }
+    },
+    "node_modules/use-zustand": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/use-zustand/-/use-zustand-0.0.1.tgz",
+      "integrity": "sha512-axjswesUfXirTQ1CC1F4r0dkaI7g2nMEftyvg23Wq4PnAbLogswzj+o5gbnnnQaQOMXKHxNZIlYpKfuTnL466Q==",
+      "peerDependencies": {
+        "react": "*"
+      }
+    },
+    "node_modules/util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+    },
+    "node_modules/uuid": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+      "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+      "funding": [
+        "https://github.com/sponsors/broofa",
+        "https://github.com/sponsors/ctavan"
+      ],
+      "bin": {
+        "uuid": "dist/bin/uuid"
+      }
+    },
+    "node_modules/wcwidth": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+      "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+      "dependencies": {
+        "defaults": "^1.0.3"
+      }
+    },
+    "node_modules/widest-line": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
+      "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
+      "dependencies": {
+        "string-width": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/wrap-ansi": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+      "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "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=="
+    },
+    "node_modules/ws": {
+      "version": "7.5.9",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
+      "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
+      "engines": {
+        "node": ">=8.3.0"
+      },
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": "^5.0.2"
+      },
+      "peerDependenciesMeta": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/y18n": {
+      "version": "5.0.8",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+    },
+    "node_modules/yargs": {
+      "version": "16.2.0",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+      "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+      "dependencies": {
+        "cliui": "^7.0.2",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
+        "require-directory": "^2.1.1",
+        "string-width": "^4.2.0",
+        "y18n": "^5.0.5",
+        "yargs-parser": "^20.2.2"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/yargs-parser": {
+      "version": "20.2.9",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+      "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/yoga-layout-prebuilt": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.10.0.tgz",
+      "integrity": "sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g==",
+      "dependencies": {
+        "@types/yoga-layout": "1.9.2"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/zustand": {
+      "version": "4.4.7",
+      "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.4.7.tgz",
+      "integrity": "sha512-QFJWJMdlETcI69paJwhSMJz7PPWjVP8Sjhclxmxmxv/RYI7ZOvR5BHX+ktH0we9gTWQMxcne8q1OY8xxz604gw==",
+      "dependencies": {
+        "use-sync-external-store": "1.2.0"
+      },
+      "engines": {
+        "node": ">=12.7.0"
+      },
+      "peerDependencies": {
+        "@types/react": ">=16.8",
+        "immer": ">=9.0",
+        "react": ">=16.8"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        },
+        "immer": {
+          "optional": true
+        },
+        "react": {
+          "optional": true
+        }
+      }
+    }
+  }
+}
diff --git a/pkgs/by-name/gi/github-copilot-cli/package.nix b/pkgs/by-name/gi/github-copilot-cli/package.nix
new file mode 100644
index 000000000000..8bed7df94084
--- /dev/null
+++ b/pkgs/by-name/gi/github-copilot-cli/package.nix
@@ -0,0 +1,29 @@
+{ lib, buildNpmPackage, fetchzip }:
+
+buildNpmPackage rec {
+  pname = "github-copilot-cli";
+  version = "0.1.36";
+
+  src = fetchzip {
+    url = "https://registry.npmjs.org/@githubnext/github-copilot-cli/-/github-copilot-cli-${version}.tgz";
+    hash = "sha256-7n+7sN61OrqMVGaKll85+HwX7iGG9M/UW5lf2Pd5sRU=";
+  };
+
+  npmDepsHash = "sha256-h0StxzGbl3ZeOQ4Jy1BgJ5sJ0pAbubMCRsiIOYpU04w=";
+
+  postPatch = ''
+    cp ${./package-lock.json} package-lock.json
+  '';
+
+  dontNpmBuild = true;
+
+  meta = with lib; {
+    description = "CLI experience for letting GitHub Copilot help you on the command line";
+    homepage = "https://githubnext.com/projects/copilot-cli/";
+    license = licenses.unfree; # upstream has no license
+    maintainers = [ maintainers.malo ];
+    platforms = platforms.all;
+    mainProgram = "github-copilot-cli";
+  };
+}
+
diff --git a/pkgs/by-name/gi/github-copilot-intellij-agent/package.nix b/pkgs/by-name/gi/github-copilot-intellij-agent/package.nix
new file mode 100644
index 000000000000..13c28ca5b71a
--- /dev/null
+++ b/pkgs/by-name/gi/github-copilot-intellij-agent/package.nix
@@ -0,0 +1,82 @@
+{ stdenv, lib, fetchurl, unzip }:
+
+stdenv.mkDerivation rec {
+  pname = "github-copilot-intellij-agent";
+  version = "1.4.5.4049";
+
+  src = fetchurl {
+    name = "${pname}-${version}-plugin.zip";
+    url = "https://plugins.jetbrains.com/plugin/download?updateId=454005";
+    hash = "sha256-ibu3OcmtyLHuumhJQ6QipsNEIdEhvLUS7sb3xmnaR0U=";
+  };
+
+  nativeBuildInputs = [ unzip ];
+
+  dontUnpack = true;
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/bin
+    unzip -p $src github-copilot-intellij/copilot-agent/bin/copilot-agent-${
+      if stdenv.hostPlatform.isDarwin then (if stdenv.hostPlatform.isAarch64 then "macos-arm64" else "macos") else "linux"
+    } | install -m755 /dev/stdin $out/bin/copilot-agent
+
+    runHook postInstall
+  '';
+
+  # https://discourse.nixos.org/t/unrelatable-error-when-working-with-patchelf/12043
+  # https://github.com/NixOS/nixpkgs/blob/db0d8e10fc1dec84f1ccb111851a82645aa6a7d3/pkgs/development/web/now-cli/default.nix
+  preFixup = let
+    binaryLocation = "$out/bin/copilot-agent";
+    libPath = lib.makeLibraryPath [ stdenv.cc.cc ];
+  in ''
+    orig_size=$(stat --printf=%s ${binaryLocation})
+
+    patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" ${binaryLocation}
+    patchelf --set-rpath ${libPath} ${binaryLocation}
+    chmod +x ${binaryLocation}
+
+    new_size=$(stat --printf=%s ${binaryLocation})
+
+    var_skip=20
+    var_select=22
+    shift_by=$(expr $new_size - $orig_size)
+
+    function fix_offset {
+      location=$(grep -obUam1 "$1" ${binaryLocation} | cut -d: -f1)
+      location=$(expr $location + $var_skip)
+      value=$(dd if=${binaryLocation} iflag=count_bytes,skip_bytes skip=$location \
+                 bs=1 count=$var_select status=none)
+      value=$(expr $shift_by + $value)
+      echo -n $value | dd of=${binaryLocation} bs=1 seek=$location conv=notrunc
+    }
+
+    fix_offset PAYLOAD_POSITION
+    fix_offset PRELUDE_POSITION
+  '';
+
+  dontStrip = true;
+
+  meta = rec {
+    description = "GitHub copilot IntelliJ plugin's native component";
+    longDescription = ''
+      The GitHub copilot IntelliJ plugin's native component.
+      bin/copilot-agent must be symlinked into the plugin directory, replacing the existing binary.
+
+      For example:
+
+      ```shell
+      ln -fs /run/current-system/sw/bin/copilot-agent ~/.local/share/JetBrains/IntelliJIdea2022.2/github-copilot-intellij/copilot-agent/bin/copilot-agent-linux
+      ```
+    '';
+    homepage = "https://plugins.jetbrains.com/plugin/17718-github-copilot";
+    downloadPage = homepage;
+    changelog = homepage;
+    license = lib.licenses.unfree;
+    maintainers = with lib.maintainers; [ hacker1024 ];
+    mainProgram = "copilot-agent";
+    platforms = [ "x86_64-linux" "x86_64-darwin" "aarch64-darwin" ];
+    sourceProvenance = [ lib.sourceTypes.binaryNativeCode ];
+  };
+}
diff --git a/pkgs/by-name/gi/github-desktop/package.nix b/pkgs/by-name/gi/github-desktop/package.nix
index cbd89cda3c21..88f8b5620b45 100644
--- a/pkgs/by-name/gi/github-desktop/package.nix
+++ b/pkgs/by-name/gi/github-desktop/package.nix
@@ -2,8 +2,7 @@
 , lib
 , fetchurl
 , autoPatchelfHook
-, wrapGAppsHook3
-, makeWrapper
+, buildPackages
 , gnome-keyring
 , libsecret
 , git
@@ -44,7 +43,9 @@ stdenvNoCC.mkDerivation (finalAttrs: {
 
   nativeBuildInputs = [
     autoPatchelfHook
-    (wrapGAppsHook3.override { inherit makeWrapper; })
+    # override doesn't preserve splicing https://github.com/NixOS/nixpkgs/issues/132651
+    # Has to use `makeShellWrapper` from `buildPackages` even though `makeShellWrapper` from the inputs is spliced because `propagatedBuildInputs` would pick the wrong one because of a different offset.
+    (buildPackages.wrapGAppsHook3.override { makeWrapper = buildPackages.makeShellWrapper; })
   ];
 
   buildInputs = [
diff --git a/pkgs/by-name/gi/github-markdown-toc-go/package.nix b/pkgs/by-name/gi/github-markdown-toc-go/package.nix
new file mode 100644
index 000000000000..809664c90d1d
--- /dev/null
+++ b/pkgs/by-name/gi/github-markdown-toc-go/package.nix
@@ -0,0 +1,25 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+}:
+buildGoModule rec {
+  pname = "github-markdown-toc-go";
+  version = "1.4.0";
+
+  src = fetchFromGitHub {
+    owner = "ekalinin";
+    repo = "github-markdown-toc.go";
+    rev = "v${version}";
+    hash = "sha256-tZGAvbC9lrNhtRubCJUkQShRsfCsaAeI6XHhSp4FkS0=";
+  };
+
+  vendorHash = "sha256-K5yb7bnW6eS5UESK9wgNEUwGjB63eJk6+B0jFFiFero=";
+
+  meta = {
+    homepage = "https://github.com/ekalinin/github-markdown-toc.go";
+    description = "Easy TOC creation for GitHub README.md (in go)";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ dannixon ];
+    mainProgram = "gh-md-toc";
+  };
+}
diff --git a/pkgs/by-name/gi/github-release/package.nix b/pkgs/by-name/gi/github-release/package.nix
new file mode 100644
index 000000000000..e2480451e98d
--- /dev/null
+++ b/pkgs/by-name/gi/github-release/package.nix
@@ -0,0 +1,37 @@
+{ buildGoModule, fetchFromGitHub, lib, testers, github-release }:
+
+buildGoModule rec {
+  pname = "github-release";
+  version = "0.10.1-unstable-2024-06-25";
+
+  src = fetchFromGitHub {
+    owner = "github-release";
+    repo = "github-release";
+    rev = "d250e89a7bf00d54e823b169c3a4722a55ac67b0";
+    hash = "sha256-QDImy9VNJ3hfGVCpMoJ72Za3CiM3SVNH1D9RFHVM+4I=";
+  };
+
+  vendorHash = null;
+
+  ldflags = [ "-s" ];
+
+  passthru.tests.version = testers.testVersion {
+    package = github-release;
+    version = "v${version}";
+  };
+
+  meta = with lib; {
+    description = "Commandline app to create and edit releases on Github (and upload artifacts)";
+    mainProgram = "github-release";
+    longDescription = ''
+      A small commandline app written in Go that allows you to easily create and
+      delete releases of your projects on Github.
+      In addition it allows you to attach files to those releases.
+    '';
+
+    license = licenses.mit;
+    homepage = "https://github.com/github-release/github-release";
+    maintainers = with maintainers; [ ardumont j03 ];
+    platforms = with platforms; unix;
+  };
+}
diff --git a/pkgs/by-name/gi/github-runner/package.nix b/pkgs/by-name/gi/github-runner/package.nix
index 535aaeed42cf..392edeb7abfe 100644
--- a/pkgs/by-name/gi/github-runner/package.nix
+++ b/pkgs/by-name/gi/github-runner/package.nix
@@ -1,20 +1,21 @@
-{ buildDotnetModule
-, darwin
-, dotnetCorePackages
-, fetchFromGitHub
-, fetchpatch
-, git
-, glibc
-, glibcLocales
-, lib
-, nixosTests
-, stdenv
-, which
-, buildPackages
-, runtimeShell
+{
+  buildDotnetModule,
+  darwin,
+  dotnetCorePackages,
+  fetchFromGitHub,
+  fetchpatch,
+  git,
+  glibc,
+  glibcLocales,
+  lib,
+  nixosTests,
+  stdenv,
+  which,
+  buildPackages,
+  runtimeShell,
   # List of Node.js runtimes the package should support
-, nodeRuntimes ? [ "node20" ]
-, nodejs_20
+  nodeRuntimes ? [ "node20" ],
+  nodejs_20,
 }:
 
 # Node.js runtimes supported by upstream
@@ -22,13 +23,13 @@ assert builtins.all (x: builtins.elem x [ "node20" ]) nodeRuntimes;
 
 buildDotnetModule rec {
   pname = "github-runner";
-  version = "2.319.1";
+  version = "2.320.0";
 
   src = fetchFromGitHub {
     owner = "actions";
     repo = "runner";
     rev = "v${version}";
-    hash = "sha256-cXOYW4py2RRJVUKrQBGf6LHNyc1sJ/bMR4hJxtDv3PU=";
+    hash = "sha256-mVi/Z89R2nbxQAyEkpbcaU3Pc3wK6989QojHew9ad4g=";
     leaveDotGit = true;
     postFetch = ''
       git -C $out rev-parse --short HEAD > $out/.git-revision
@@ -79,25 +80,24 @@ buildDotnetModule rec {
       url = "https://github.com/actions/runner/commit/5ff0ce1.patch";
       hash = "sha256-2Vg3cKZK3cE/OcPDZkdN2Ro2WgvduYTTwvNGxwCfXas=";
     })
-  ] ++ lib.optionals (nodeRuntimes == [ "node20" ]) [
-    # If the package is built without Node 16, make Node 20 the default internal version
-    # https://github.com/actions/runner/pull/2844
-    (fetchpatch {
-      name = "internal-node-20.patch";
-      url = "https://github.com/actions/runner/commit/acdc6ed.patch";
-      hash = "sha256-3/6yhhJPr9OMWBFc5/NU/DRtn76aTYvjsjQo2u9ZqnU=";
-    })
   ];
 
-  postPatch = ''
-    # Ignore changes to src/Runner.Sdk/BuildConstants.cs
-    substituteInPlace src/dir.proj \
-      --replace 'git update-index --assume-unchanged ./Runner.Sdk/BuildConstants.cs' \
-                'true'
-  '';
+  postPatch =
+    ''
+      # Ignore changes to src/Runner.Sdk/BuildConstants.cs
+      substituteInPlace src/dir.proj \
+        --replace 'git update-index --assume-unchanged ./Runner.Sdk/BuildConstants.cs' \
+                  'true'
+    ''
+    + lib.optionalString (nodeRuntimes == [ "node20" ]) ''
+      substituteInPlace src/Runner.Common/Util/NodeUtil.cs \
+        --replace-fail '_defaultNodeVersion = "node16"' '_defaultNodeVersion = "node20"'
+    '';
 
   DOTNET_SYSTEM_GLOBALIZATION_INVARIANT = isNull glibcLocales;
-  LOCALE_ARCHIVE = lib.optionalString (!DOTNET_SYSTEM_GLOBALIZATION_INVARIANT) "${glibcLocales}/lib/locale/locale-archive";
+  LOCALE_ARCHIVE = lib.optionalString (
+    !DOTNET_SYSTEM_GLOBALIZATION_INVARIANT
+  ) "${glibcLocales}/lib/locale/locale-archive";
 
   postConfigure = ''
     # Generate src/Runner.Sdk/BuildConstants.cs
@@ -110,19 +110,23 @@ buildDotnetModule rec {
       src/dir.proj
   '';
 
-  nativeBuildInputs = [
-    which
-    git
-  ] ++ lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
-    darwin.autoSignDarwinBinariesHook
-  ];
+  nativeBuildInputs =
+    [
+      which
+      git
+    ]
+    ++ lib.optionals (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isAarch64) [
+      darwin.autoSignDarwinBinariesHook
+    ];
 
-  buildInputs = [ stdenv.cc.cc.lib ];
+  buildInputs = [ (lib.getLib stdenv.cc.cc) ];
 
   dotnet-sdk = dotnetCorePackages.sdk_6_0;
   dotnet-runtime = dotnetCorePackages.runtime_6_0;
 
-  dotnetFlags = [ "-p:PackageRuntime=${dotnetCorePackages.systemToDotnetRid stdenv.hostPlatform.system}" ];
+  dotnetFlags = [
+    "-p:PackageRuntime=${dotnetCorePackages.systemToDotnetRid stdenv.hostPlatform.system}"
+  ];
 
   # As given here: https://github.com/actions/runner/blob/0befa62/src/dir.proj#L33-L41
   projectFile = [
@@ -209,70 +213,79 @@ buildDotnetModule rec {
 
   testProjectFile = [ "src/Test/Test.csproj" ];
 
-  preCheck = ''
-    mkdir -p _layout/externals
-  '' + lib.optionalString (lib.elem "node20" nodeRuntimes) ''
-    ln -s ${nodejs_20} _layout/externals/node20
-  '';
+  preCheck =
+    ''
+      mkdir -p _layout/externals
+    ''
+    + lib.optionalString (lib.elem "node20" nodeRuntimes) ''
+      ln -s ${nodejs_20} _layout/externals/node20
+    '';
 
-  postInstall = ''
-    mkdir -p $out/bin
-
-    install -m755 src/Misc/layoutbin/runsvc.sh                 $out/lib/github-runner
-    install -m755 src/Misc/layoutbin/RunnerService.js          $out/lib/github-runner
-    install -m755 src/Misc/layoutroot/run.sh                   $out/lib/github-runner
-    install -m755 src/Misc/layoutroot/run-helper.sh.template   $out/lib/github-runner/run-helper.sh
-    install -m755 src/Misc/layoutroot/config.sh                $out/lib/github-runner
-    install -m755 src/Misc/layoutroot/env.sh                   $out/lib/github-runner
-
-    # env.sh is patched to not require any wrapping
-    ln -sr "$out/lib/github-runner/env.sh" "$out/bin/"
-
-    substituteInPlace $out/lib/github-runner/config.sh \
-      --replace './bin/Runner.Listener' "$out/bin/Runner.Listener"
-  '' + lib.optionalString stdenv.isLinux ''
-    substituteInPlace $out/lib/github-runner/config.sh \
-      --replace 'command -v ldd' 'command -v ${glibc.bin}/bin/ldd' \
-      --replace 'ldd ./bin' '${glibc.bin}/bin/ldd ${dotnet-runtime}/shared/Microsoft.NETCore.App/${dotnet-runtime.version}/' \
-      --replace '/sbin/ldconfig' '${glibc.bin}/bin/ldconfig'
-  '' + ''
-    # Remove uneeded copy for run-helper template
-    substituteInPlace $out/lib/github-runner/run.sh --replace 'cp -f "$DIR"/run-helper.sh.template "$DIR"/run-helper.sh' ' '
-    substituteInPlace $out/lib/github-runner/run-helper.sh --replace '"$DIR"/bin/' '"$DIR"/'
-
-    # Make paths absolute
-    substituteInPlace $out/lib/github-runner/runsvc.sh \
-      --replace './externals' "$out/lib/externals" \
-      --replace './bin/RunnerService.js' "$out/lib/github-runner/RunnerService.js"
-
-    # The upstream package includes Node and expects it at the path
-    # externals/node$version. As opposed to the official releases, we don't
-    # link the Alpine Node flavors.
-    mkdir -p $out/lib/externals
-  '' + lib.optionalString (lib.elem "node20" nodeRuntimes) ''
-    ln -s ${nodejs_20} $out/lib/externals/node20
-  '' + ''
-    # Install Nodejs scripts called from workflows
-    install -D src/Misc/layoutbin/hashFiles/index.js $out/lib/github-runner/hashFiles/index.js
-    mkdir -p $out/lib/github-runner/checkScripts
-    install src/Misc/layoutbin/checkScripts/* $out/lib/github-runner/checkScripts/
-  '' + lib.optionalString stdenv.isLinux ''
-    # Wrap explicitly to, e.g., prevent extra entries for LD_LIBRARY_PATH
-    makeWrapperArgs=()
-
-    # We don't wrap with libicu
-    substituteInPlace $out/lib/github-runner/config.sh \
-      --replace '$LDCONFIG_COMMAND -NXv ''${libpath//:/ }' 'echo libicu'
-  '' + ''
-    # XXX: Using the corresponding Nix argument does not work as expected:
-    #      https://github.com/NixOS/nixpkgs/issues/218449
-    # Common wrapper args for `executables`
-    makeWrapperArgs+=(
-      --run 'export RUNNER_ROOT="''${RUNNER_ROOT:-"$HOME/.github-runner"}"'
-      --run 'mkdir -p "$RUNNER_ROOT"'
-      --chdir "$out"
-    )
-  '';
+  postInstall =
+    ''
+      mkdir -p $out/bin
+
+      install -m755 src/Misc/layoutbin/runsvc.sh                 $out/lib/github-runner
+      install -m755 src/Misc/layoutbin/RunnerService.js          $out/lib/github-runner
+      install -m755 src/Misc/layoutroot/run.sh                   $out/lib/github-runner
+      install -m755 src/Misc/layoutroot/run-helper.sh.template   $out/lib/github-runner/run-helper.sh
+      install -m755 src/Misc/layoutroot/config.sh                $out/lib/github-runner
+      install -m755 src/Misc/layoutroot/env.sh                   $out/lib/github-runner
+
+      # env.sh is patched to not require any wrapping
+      ln -sr "$out/lib/github-runner/env.sh" "$out/bin/"
+
+      substituteInPlace $out/lib/github-runner/config.sh \
+        --replace './bin/Runner.Listener' "$out/bin/Runner.Listener"
+    ''
+    + lib.optionalString stdenv.hostPlatform.isLinux ''
+      substituteInPlace $out/lib/github-runner/config.sh \
+        --replace 'command -v ldd' 'command -v ${glibc.bin}/bin/ldd' \
+        --replace 'ldd ./bin' '${glibc.bin}/bin/ldd ${dotnet-runtime}/shared/Microsoft.NETCore.App/${dotnet-runtime.version}/' \
+        --replace '/sbin/ldconfig' '${glibc.bin}/bin/ldconfig'
+    ''
+    + ''
+      # Remove uneeded copy for run-helper template
+      substituteInPlace $out/lib/github-runner/run.sh --replace 'cp -f "$DIR"/run-helper.sh.template "$DIR"/run-helper.sh' ' '
+      substituteInPlace $out/lib/github-runner/run-helper.sh --replace '"$DIR"/bin/' '"$DIR"/'
+
+      # Make paths absolute
+      substituteInPlace $out/lib/github-runner/runsvc.sh \
+        --replace './externals' "$out/lib/externals" \
+        --replace './bin/RunnerService.js' "$out/lib/github-runner/RunnerService.js"
+
+      # The upstream package includes Node and expects it at the path
+      # externals/node$version. As opposed to the official releases, we don't
+      # link the Alpine Node flavors.
+      mkdir -p $out/lib/externals
+    ''
+    + lib.optionalString (lib.elem "node20" nodeRuntimes) ''
+      ln -s ${nodejs_20} $out/lib/externals/node20
+    ''
+    + ''
+      # Install Nodejs scripts called from workflows
+      install -D src/Misc/layoutbin/hashFiles/index.js $out/lib/github-runner/hashFiles/index.js
+      mkdir -p $out/lib/github-runner/checkScripts
+      install src/Misc/layoutbin/checkScripts/* $out/lib/github-runner/checkScripts/
+    ''
+    + lib.optionalString stdenv.hostPlatform.isLinux ''
+      # Wrap explicitly to, e.g., prevent extra entries for LD_LIBRARY_PATH
+      makeWrapperArgs=()
+
+      # We don't wrap with libicu
+      substituteInPlace $out/lib/github-runner/config.sh \
+        --replace '$LDCONFIG_COMMAND -NXv ''${libpath//:/ }' 'echo libicu'
+    ''
+    + ''
+      # XXX: Using the corresponding Nix argument does not work as expected:
+      #      https://github.com/NixOS/nixpkgs/issues/218449
+      # Common wrapper args for `executables`
+      makeWrapperArgs+=(
+        --run 'export RUNNER_ROOT="''${RUNNER_ROOT:-"$HOME/.github-runner"}"'
+        --run 'mkdir -p "$RUNNER_ROOT"'
+        --chdir "$out"
+      )
+    '';
 
   # List of files to wrap
   executables = [
@@ -318,8 +331,18 @@ buildDotnetModule rec {
     description = "Self-hosted runner for GitHub Actions";
     homepage = "https://github.com/actions/runner";
     license = licenses.mit;
-    maintainers = with maintainers; [ veehaitch kfollesdal aanderse zimbatm ];
-    platforms = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
+    maintainers = with maintainers; [
+      veehaitch
+      kfollesdal
+      aanderse
+      zimbatm
+    ];
+    platforms = [
+      "x86_64-linux"
+      "aarch64-linux"
+      "x86_64-darwin"
+      "aarch64-darwin"
+    ];
     sourceProvenance = with sourceTypes; [ binaryNativeCode ];
   };
 }
diff --git a/pkgs/by-name/gi/gitit/package.nix b/pkgs/by-name/gi/gitit/package.nix
new file mode 100644
index 000000000000..6958e1e6c59c
--- /dev/null
+++ b/pkgs/by-name/gi/gitit/package.nix
@@ -0,0 +1,42 @@
+{ lib, stdenv, haskellPackages, haskell
+# “Plugins” are a fancy way of saying gitit will invoke
+# GHC at *runtime*, which in turn makes it pull GHC
+# into its runtime closure. Only enable if you really need
+# that feature. But if you do you’ll want to use gitit
+# as a library anyway.
+, pluginSupport ? false
+}:
+
+let
+  inherit (haskell.lib.compose)
+    enableCabalFlag
+    disableCabalFlag
+    justStaticExecutables
+    overrideCabal
+  ;
+
+  base = (if pluginSupport then enableCabalFlag else disableCabalFlag)
+    "plugins"
+    haskellPackages.gitit;
+
+  # Removes erroneous references from dead code that GHC can't eliminate
+  aarch64DarwinFix = overrideCabal (drv:
+    lib.optionalAttrs (stdenv.hostPlatform.isDarwin && stdenv.hostPlatform.isAarch64) {
+      postInstall = ''
+        ${drv.postInstall or ""}
+        remove-references-to -t ${haskellPackages.HTTP} "$out/bin/gitit"
+        remove-references-to -t ${haskellPackages.HTTP} "$out/bin/expireGititCache"
+        remove-references-to -t ${haskellPackages.happstack-server} "$out/bin/gitit"
+        remove-references-to -t ${haskellPackages.hoauth2} "$out/bin/gitit"
+        remove-references-to -t ${haskellPackages.pandoc} "$out/bin/gitit"
+        remove-references-to -t ${haskellPackages.pandoc-types} "$out/bin/gitit"
+      '';
+    });
+in
+
+if pluginSupport
+then base
+else lib.pipe (base.override { ghc-paths = null; }) [
+  justStaticExecutables
+  aarch64DarwinFix
+]
diff --git a/pkgs/by-name/gi/gitjacker/package.nix b/pkgs/by-name/gi/gitjacker/package.nix
new file mode 100644
index 000000000000..83e8b91f8b28
--- /dev/null
+++ b/pkgs/by-name/gi/gitjacker/package.nix
@@ -0,0 +1,44 @@
+{ lib
+, buildGoModule
+, fetchFromGitHub
+, git
+, stdenv
+}:
+
+buildGoModule rec {
+  pname = "gitjacker";
+  version = "0.1.0";
+
+  src = fetchFromGitHub {
+    owner = "liamg";
+    repo = "gitjacker";
+    rev = "v${version}";
+    sha256 = "sha256-rEn9FpcRfEt2yGepIPEAO9m8JeVb+nMhYMBWhC/barc=";
+  };
+
+  vendorHash = null;
+
+  propagatedBuildInputs = [ git ];
+
+  nativeCheckInputs = [ git ];
+
+  doCheck = !stdenv.hostPlatform.isDarwin;
+
+  preCheck = ''
+    export PATH=$TMPDIR/usr/bin:$PATH
+  '';
+
+  meta = with lib; {
+    description = "Leak git repositories from misconfigured websites";
+    mainProgram = "gitjacker";
+    longDescription = ''
+      Gitjacker downloads git repositories and extracts their contents
+      from sites where the .git directory has been mistakenly uploaded.
+      It will still manage to recover a significant portion of a repository
+      even where directory listings are disabled.
+    '';
+    homepage = "https://github.com/liamg/gitjacker";
+    license = with licenses; [ unlicense ];
+    maintainers = with maintainers; [ fab ];
+  };
+}
diff --git a/pkgs/by-name/gi/gitkraken/package.nix b/pkgs/by-name/gi/gitkraken/package.nix
new file mode 100644
index 000000000000..3347a8cebbbb
--- /dev/null
+++ b/pkgs/by-name/gi/gitkraken/package.nix
@@ -0,0 +1,254 @@
+{
+  lib,
+  stdenv,
+  libXcomposite,
+  libgnome-keyring,
+  makeWrapper,
+  udev,
+  curlWithGnuTls,
+  alsa-lib,
+  libXfixes,
+  atk,
+  gtk3,
+  libXrender,
+  pango,
+  adwaita-icon-theme,
+  cairo,
+  freetype,
+  fontconfig,
+  libX11,
+  libXi,
+  libxcb,
+  libXext,
+  libXcursor,
+  glib,
+  libXScrnSaver,
+  libxkbfile,
+  libXtst,
+  nss,
+  nspr,
+  cups,
+  fetchzip,
+  expat,
+  gdk-pixbuf,
+  libXdamage,
+  libXrandr,
+  dbus,
+  makeDesktopItem,
+  openssl,
+  wrapGAppsHook3,
+  buildPackages,
+  at-spi2-atk,
+  at-spi2-core,
+  libuuid,
+  e2fsprogs,
+  krb5,
+  libdrm,
+  mesa,
+  unzip,
+  copyDesktopItems,
+  libxshmfence,
+  libxkbcommon,
+  git,
+  libGL,
+  zlib,
+  cacert,
+}:
+
+let
+  pname = "gitkraken";
+  version = "10.4.1";
+
+  throwSystem = throw "Unsupported system: ${stdenv.hostPlatform.system}";
+
+  srcs = {
+    x86_64-linux = fetchzip {
+      url = "https://release.axocdn.com/linux/GitKraken-v${version}.tar.gz";
+      hash = "sha256-ZvLDGhBnWjjWqzwqJOz91X8hr94jkXtMA8CL2hh9mlI=";
+    };
+
+    x86_64-darwin = fetchzip {
+      url = "https://release.axocdn.com/darwin/GitKraken-v${version}.zip";
+      hash = "sha256-fPvEItavxFwUbk3WsTBvzRMu7fjnm5HxybEueHn//Q4=";
+    };
+
+    aarch64-darwin = fetchzip {
+      url = "https://release.axocdn.com/darwin-arm64/GitKraken-v${version}.zip";
+      hash = "sha256-N8WMbJFC74tIeJ6Yyk58nT+sIBYN/7PNLdYNxGSB2yM=";
+    };
+  };
+
+  src = srcs.${stdenv.hostPlatform.system} or throwSystem;
+
+  meta = with lib; {
+    homepage = "https://www.gitkraken.com/git-client";
+    description = "Simplifying Git for any OS";
+    sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
+    license = licenses.unfree;
+    platforms = builtins.attrNames srcs;
+    maintainers = with maintainers; [
+      xnwdd
+      evanjs
+      arkivm
+      nicolas-goudry
+    ];
+    mainProgram = "gitkraken";
+  };
+
+  linux = stdenv.mkDerivation rec {
+    inherit
+      pname
+      version
+      src
+      meta
+      ;
+
+    dontBuild = true;
+    dontConfigure = true;
+
+    libPath = lib.makeLibraryPath [
+      stdenv.cc.cc
+      curlWithGnuTls
+      udev
+      libX11
+      libXext
+      libXcursor
+      libXi
+      libxcb
+      glib
+      libXScrnSaver
+      libxkbfile
+      libXtst
+      nss
+      nspr
+      cups
+      alsa-lib
+      expat
+      gdk-pixbuf
+      dbus
+      libXdamage
+      libXrandr
+      atk
+      pango
+      cairo
+      freetype
+      fontconfig
+      libXcomposite
+      libXfixes
+      libXrender
+      gtk3
+      libgnome-keyring
+      openssl
+      at-spi2-atk
+      at-spi2-core
+      libuuid
+      e2fsprogs
+      krb5
+      libdrm
+      mesa
+      libxshmfence
+      libxkbcommon
+      libGL
+      zlib
+    ];
+
+    desktopItems = [
+      (makeDesktopItem {
+        name = "GitKraken Desktop";
+        exec = "gitkraken";
+        icon = "gitkraken";
+        desktopName = "GitKraken Desktop";
+        genericName = "Git Client";
+        categories = [ "Development" ];
+        comment = "Unleash your repo";
+      })
+    ];
+
+    nativeBuildInputs = [
+      copyDesktopItems
+      # override doesn't preserve splicing https://github.com/NixOS/nixpkgs/issues/132651
+      # Has to use `makeShellWrapper` from `buildPackages` even though `makeShellWrapper` from the inputs is spliced because `propagatedBuildInputs` would pick the wrong one because of a different offset.
+      (buildPackages.wrapGAppsHook3.override { makeWrapper = buildPackages.makeShellWrapper; })
+    ];
+    buildInputs = [
+      gtk3
+      adwaita-icon-theme
+    ];
+
+    # avoid double-wrapping
+    dontWrapGApps = true;
+
+    installPhase = ''
+      runHook preInstall
+
+      mkdir -p $out/share/${pname}/
+      cp -R $src/* $out/share/${pname}
+
+      mkdir -p $out/share/pixmaps
+      cp gitkraken.png $out/share/pixmaps/
+
+      runHook postInstall
+    '';
+
+    preFixup = ''
+      gappsWrapperArgs+=(--add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations}}")
+    '';
+
+    postFixup = ''
+      pushd $out/share/${pname}
+      for file in gitkraken chrome-sandbox chrome_crashpad_handler; do
+        patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" $file
+      done
+
+      for file in $(find . -type f \( -name \*.node -o -name gitkraken -o -name git -o -name git-\* -o -name scalar -o -name \*.so\* \) ); do
+        patchelf --set-rpath ${libPath}:$out/share/${pname} $file || true
+      done
+      popd
+
+      # SSL and permissions fix for bundled nodegit
+      pushd $out/share/${pname}/resources/app.asar.unpacked/node_modules/@axosoft/nodegit/build/Release
+      mv nodegit-ubuntu-18.node nodegit-ubuntu-18-ssl-1.1.1.node
+      mv nodegit-ubuntu-18-ssl-static.node nodegit-ubuntu-18.node
+      chmod 755 nodegit-ubuntu-18.node
+      popd
+
+      # Devendor bundled git
+      rm -rf $out/share/${pname}/resources/app.asar.unpacked/git
+      ln -s ${git} $out/share/${pname}/resources/app.asar.unpacked/git
+
+      # GitKraken expects the CA bundle to be located in the bundled git directory. Since we replace it with
+      # the one from nixpkgs, which doesn't provide a CA bundle, we need to explicitly set its location at runtime
+      makeWrapper $out/share/${pname}/gitkraken $out/bin/gitkraken \
+        --set GIT_SSL_CAINFO "${cacert}/etc/ssl/certs/ca-bundle.crt" \
+        "''${gappsWrapperArgs[@]}"
+    '';
+  };
+
+  darwin = stdenv.mkDerivation {
+    inherit
+      pname
+      version
+      src
+      meta
+      ;
+
+    nativeBuildInputs = [
+      unzip
+      makeWrapper
+    ];
+
+    installPhase = ''
+      runHook preInstall
+
+      mkdir -p $out/Applications/GitKraken.app $out/bin
+      cp -R . $out/Applications/GitKraken.app
+
+      makeWrapper $out/Applications/GitKraken.app/Contents/MacOS/GitKraken $out/bin/gitkraken
+
+      runHook postInstall
+    '';
+
+    dontFixup = true;
+  };
+in
+if stdenv.hostPlatform.isDarwin then darwin else linux
diff --git a/pkgs/by-name/gi/gitlab-ci-ls/package.nix b/pkgs/by-name/gi/gitlab-ci-ls/package.nix
index 7468842c6468..ed0f4c522756 100644
--- a/pkgs/by-name/gi/gitlab-ci-ls/package.nix
+++ b/pkgs/by-name/gi/gitlab-ci-ls/package.nix
@@ -10,20 +10,20 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "gitlab-ci-ls";
-  version = "0.21.2";
+  version = "0.22.0";
   src = fetchFromGitHub {
     owner = "alesbrelih";
     repo = "gitlab-ci-ls";
     rev = "${version}";
-    hash = "sha256-wkL6ko43oWrpyscEpCMuoFamDMJk9+xI3qYOs+DgI8g=";
+    hash = "sha256-RXM581tW78YzH+NQhkpsbHz6m+PAF7NQ5p3TFugPo+M=";
   };
 
-  cargoHash = "sha256-H/p29QbCaZRa81g+5eUsG47tUJPVgB1J9zZYY5/n5Vk=";
+  cargoHash = "sha256-PuNpkDjoJr1GttETWHA9X+LYNIJSgBXdZId5q2JSo6g=";
 
   nativeBuildInputs = [ pkg-config ];
   buildInputs =
     [ openssl ]
-    ++ lib.optionals stdenv.isDarwin [
+    ++ lib.optionals stdenv.hostPlatform.isDarwin [
       darwin.apple_sdk.frameworks.SystemConfiguration
     ];
 
diff --git a/pkgs/by-name/gi/gitlab-clippy/package.nix b/pkgs/by-name/gi/gitlab-clippy/package.nix
new file mode 100644
index 000000000000..8bdd529bb447
--- /dev/null
+++ b/pkgs/by-name/gi/gitlab-clippy/package.nix
@@ -0,0 +1,31 @@
+{ lib
+, fetchFromGitLab
+, rustPlatform
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "gitlab-clippy";
+  version = "1.0.3";
+
+  src = fetchFromGitLab {
+    owner = "dlalic";
+    repo = pname;
+    rev = version;
+    hash = "sha256-d7SmlAWIV4SngJhIvlud90ZUSF55FWIrzFpkfSXIy2Y=";
+  };
+  cargoHash = "sha256-ztPbI+ncMNMKnIxUksxgz8GHQpLZ7SVWdC4QJWh18Wk=";
+
+  # TODO re-add theses tests once they get fixed in upstream
+  checkFlags = [
+    "--skip cli::converts_error_from_pipe"
+    "--skip cli::converts_warnings_from_pipe"
+  ];
+
+  meta = {
+    homepage = "https://gitlab.com/dlalic/gitlab-clippy";
+    description = "Convert clippy warnings into GitLab Code Quality report";
+    mainProgram = "gitlab-clippy";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ wucke13 ];
+  };
+}
diff --git a/pkgs/by-name/gi/gitlab-container-registry/package.nix b/pkgs/by-name/gi/gitlab-container-registry/package.nix
new file mode 100644
index 000000000000..5cd236a468ab
--- /dev/null
+++ b/pkgs/by-name/gi/gitlab-container-registry/package.nix
@@ -0,0 +1,34 @@
+{ lib, buildGoModule, fetchFromGitLab }:
+
+buildGoModule rec {
+  pname = "gitlab-container-registry";
+  version = "4.11.0";
+  rev = "v${version}-gitlab";
+
+  # nixpkgs-update: no auto update
+  src = fetchFromGitLab {
+    owner = "gitlab-org";
+    repo = "container-registry";
+    inherit rev;
+    hash = "sha256-wUypldxi3O5sm4i9v2HiZjqUy/JwtcRPvCCmINCk4YU=";
+  };
+
+  vendorHash = "sha256-Ed+WvdWpEU5c9v14eM1PdCcT3qRnaRF/XeUKedPmaSU=";
+
+  postPatch = ''
+    # Disable flaky inmemory storage driver test
+    rm registry/storage/driver/inmemory/driver_test.go
+
+    substituteInPlace health/checks/checks_test.go \
+      --replace \
+        'func TestHTTPChecker(t *testing.T) {' \
+        'func TestHTTPChecker(t *testing.T) { t.Skip("Test requires network connection")'
+  '';
+
+  meta = with lib; {
+    description = "GitLab Docker toolset to pack, ship, store, and deliver content";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ yayayayaka ] ++ teams.cyberus.members;
+    platforms = platforms.unix;
+  };
+}
diff --git a/pkgs/by-name/gi/gitlab-elasticsearch-indexer/package.nix b/pkgs/by-name/gi/gitlab-elasticsearch-indexer/package.nix
new file mode 100644
index 000000000000..e04809a59a83
--- /dev/null
+++ b/pkgs/by-name/gi/gitlab-elasticsearch-indexer/package.nix
@@ -0,0 +1,26 @@
+{ lib, buildGoModule, fetchFromGitLab, pkg-config, icu }:
+
+buildGoModule rec {
+  pname = "gitlab-elasticsearch-indexer";
+  version = "5.2.0";
+
+  # nixpkgs-update: no auto update
+  src = fetchFromGitLab {
+    owner = "gitlab-org";
+    repo = "gitlab-elasticsearch-indexer";
+    rev = "v${version}";
+    hash = "sha256-pkZWIsPWUDkjZo48mJ9N8LbMJJAHNI2Wf6X0F5+K23s=";
+  };
+
+  vendorHash = "sha256-hFTvNh/N3z99O7dtAEiksonJcTn7Zj7Ijp68vfXEBw8=";
+
+  buildInputs = [ icu ];
+  nativeBuildInputs = [ pkg-config ];
+
+  meta = with lib; {
+    description = "Indexes Git repositories into Elasticsearch for GitLab";
+    mainProgram = "gitlab-elasticsearch-indexer";
+    license = licenses.mit;
+    maintainers = with maintainers; [ yayayayaka ] ++ teams.cyberus.members;
+  };
+}
diff --git a/pkgs/by-name/gi/gitlab-pages/package.nix b/pkgs/by-name/gi/gitlab-pages/package.nix
new file mode 100644
index 000000000000..9846ae52cee2
--- /dev/null
+++ b/pkgs/by-name/gi/gitlab-pages/package.nix
@@ -0,0 +1,26 @@
+{ buildGoModule, lib, fetchFromGitLab }:
+
+buildGoModule rec {
+  pname = "gitlab-pages";
+  version = "17.3.6";
+
+  # nixpkgs-update: no auto update
+  src = fetchFromGitLab {
+    owner = "gitlab-org";
+    repo = "gitlab-pages";
+    rev = "v${version}";
+    hash = "sha256-yieOM9QQuQQ4RkfjASpcEvIKwbYMT9LkkJPHAYhY7uY=";
+  };
+
+  vendorHash = "sha256-O8kWiOpgVCUD6DdM95F1b+j4Gv9LTLRdBjByqXWV7Pk=";
+  subPackages = [ "." ];
+
+  meta = with lib; {
+    description = "Daemon used to serve static websites for GitLab users";
+    mainProgram = "gitlab-pages";
+    homepage = "https://gitlab.com/gitlab-org/gitlab-pages";
+    changelog = "https://gitlab.com/gitlab-org/gitlab-pages/-/blob/v${version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = teams.gitlab.members;
+  };
+}
diff --git a/pkgs/by-name/gi/gitlab-release-cli/package.nix b/pkgs/by-name/gi/gitlab-release-cli/package.nix
index 64f1f24e744b..61e2d5d84161 100644
--- a/pkgs/by-name/gi/gitlab-release-cli/package.nix
+++ b/pkgs/by-name/gi/gitlab-release-cli/package.nix
@@ -7,18 +7,18 @@
 
 buildGoModule rec {
   pname = "gitlab-release-cli";
-  version = "0.18.0";
+  version = "0.19.0";
 
   src = fetchFromGitLab {
     owner = "gitlab-org";
     repo = "release-cli";
     rev = "v${version}";
-    hash = "sha256-CCSice/uMf2OfFNEpwwhX6A0wrSsC1v9XWEhAAwQRso=";
+    hash = "sha256-AEDao1tehg15SmluHlivG/I+Y9Gcxjj7KUEGAmOZ1aY=";
   };
 
   vendorHash = "sha256-UwDMRsWbk8rEv2d5FssIzCLby68YZULoxd3/JGLsCQU=";
 
-  checkFlags = lib.optionals stdenv.isDarwin [
+  checkFlags = lib.optionals stdenv.hostPlatform.isDarwin [
     # Skip failing test
     "-skip TestHTTPSCustomCA"
   ];
diff --git a/pkgs/by-name/gi/gitlab-shell/package.nix b/pkgs/by-name/gi/gitlab-shell/package.nix
new file mode 100644
index 000000000000..53614d3a39e9
--- /dev/null
+++ b/pkgs/by-name/gi/gitlab-shell/package.nix
@@ -0,0 +1,38 @@
+{ lib, fetchFromGitLab, buildGoModule, ruby, libkrb5 }:
+
+buildGoModule rec {
+  pname = "gitlab-shell";
+  version = "14.38.0";
+
+  # nixpkgs-update: no auto update
+  src = fetchFromGitLab {
+    owner = "gitlab-org";
+    repo = "gitlab-shell";
+    rev = "v${version}";
+    hash = "sha256-oYvsSjdzfJn4ujy1qbMmqZyEQFbYTSke8t3KBqjr/Vc=";
+  };
+
+  buildInputs = [ ruby libkrb5 ];
+
+  patches = [
+    ./remove-hardcoded-locations.patch
+  ];
+
+  vendorHash = "sha256-YOShgZv0zdfXgKi//IENt6wE2m0S1Kqa+2ndvCwKDLQ=";
+
+  postInstall = ''
+    cp -r "$NIX_BUILD_TOP/source"/bin/* $out/bin
+    mv $out/bin/install $out/bin/gitlab-shell-install
+    mv $out/bin/check $out/bin/gitlab-shell-check
+    cp -r "$NIX_BUILD_TOP/source"/{support,VERSION} $out/
+  '';
+  doCheck = false;
+
+  meta = with lib; {
+    description = "SSH access and repository management app for GitLab";
+    homepage = "http://www.gitlab.com/";
+    platforms = platforms.linux;
+    maintainers = teams.gitlab.members;
+    license = licenses.mit;
+  };
+}
diff --git a/pkgs/by-name/gi/gitlab-shell/remove-hardcoded-locations.patch b/pkgs/by-name/gi/gitlab-shell/remove-hardcoded-locations.patch
new file mode 100644
index 000000000000..8fdc546cbf36
--- /dev/null
+++ b/pkgs/by-name/gi/gitlab-shell/remove-hardcoded-locations.patch
@@ -0,0 +1,48 @@
+diff --git a/internal/config/config.go b/internal/config/config.go
+index 36f8625..72ede08 100644
+--- a/internal/config/config.go
++++ b/internal/config/config.go
+@@ -12,7 +12,7 @@ import (
+ )
+ 
+ const (
+-	configFile            = "config.yml"
++	configFile            = "shell-config.yml"
+ 	defaultSecretFileName = ".gitlab_shell_secret"
+ )
+ 
+@@ -91,7 +91,7 @@ func (c *Config) GetHttpClient() *client.HttpClient {
+ // NewFromDirExternal returns a new config from a given root dir. It also applies defaults appropriate for
+ // gitlab-shell running in an external SSH server.
+ func NewFromDirExternal(dir string) (*Config, error) {
+-	cfg, err := newFromFile(filepath.Join(dir, configFile))
++	cfg, err := newFromFile(filepath.Join("/run/gitlab", configFile))
+ 	if err != nil {
+ 		return nil, err
+ 	}
+diff --git a/internal/keyline/key_line.go b/internal/keyline/key_line.go
+index c6f2422..fb0426b 100644
+--- a/internal/keyline/key_line.go
++++ b/internal/keyline/key_line.go
+@@ -37,7 +37,7 @@ func NewPrincipalKeyLine(keyId, principal string, config *config.Config) (*KeyLi
+ }
+ 
+ func (k *KeyLine) ToString() string {
+-	command := fmt.Sprintf("%s %s-%s", path.Join(k.Config.RootDir, executable.BinDir, executable.GitlabShell), k.Prefix, k.ID)
++	command := fmt.Sprintf("%s %s-%s", path.Join("/run/current-system/sw/bin", executable.GitlabShell), k.Prefix, k.ID)
+ 
+ 	return fmt.Sprintf(`command="%s",%s %s`, command, SshOptions, k.Value)
+ }
+diff --git a/support/gitlab_config.rb b/support/gitlab_config.rb
+index 52ac5ee..d96baa3 100644
+--- a/support/gitlab_config.rb
++++ b/support/gitlab_config.rb
+@@ -7,7 +7,7 @@ class GitlabConfig
+   attr_reader :config
+ 
+   def initialize
+-    @config = YAML.load_file(File.join(ROOT_PATH, 'config.yml'))
++    @config = YAML.load_file('/run/gitlab/shell-config.yml')
+   end
+ 
+   def auth_file
diff --git a/pkgs/by-name/gi/gitlab-timelogs/package.nix b/pkgs/by-name/gi/gitlab-timelogs/package.nix
index 23c03763e314..c0dc2a2a6153 100644
--- a/pkgs/by-name/gi/gitlab-timelogs/package.nix
+++ b/pkgs/by-name/gi/gitlab-timelogs/package.nix
@@ -22,7 +22,7 @@ rustPlatform.buildRustPackage rec {
 
   buildInputs =
     [ openssl ]
-    ++ lib.optionals stdenv.isDarwin [
+    ++ lib.optionals stdenv.hostPlatform.isDarwin [
       darwin.apple_sdk.frameworks.SystemConfiguration
       iconv
     ];
diff --git a/pkgs/by-name/gi/gitleaks/package.nix b/pkgs/by-name/gi/gitleaks/package.nix
new file mode 100644
index 000000000000..fa17828c303c
--- /dev/null
+++ b/pkgs/by-name/gi/gitleaks/package.nix
@@ -0,0 +1,62 @@
+{
+  lib,
+  stdenv,
+  buildGoModule,
+  fetchFromGitHub,
+  gitleaks,
+  installShellFiles,
+  testers,
+  nix-update-script,
+}:
+
+buildGoModule rec {
+  pname = "gitleaks";
+  version = "8.21.2";
+
+  src = fetchFromGitHub {
+    owner = "zricethezav";
+    repo = "gitleaks";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-1MCSGFpjYD4XdES+kJTz/NTN/B00TWMQ1Rmk/nsKf2Q=";
+  };
+
+  vendorHash = "sha256-iIgS0fXdiVMYKr3FZTYlCSEqqaH9sxZh1MFry9pGET8=";
+
+  ldflags = [
+    "-s"
+    "-w"
+    "-X=github.com/zricethezav/gitleaks/v${lib.versions.major version}/cmd.Version=${version}"
+  ];
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  # With v8 the config tests are blocking
+  doCheck = false;
+
+  postInstall = lib.optionalString (stdenv.buildPlatform.canExecute stdenv.hostPlatform) ''
+    installShellCompletion --cmd ${pname} \
+      --bash <($out/bin/${pname} completion bash) \
+      --fish <($out/bin/${pname} completion fish) \
+      --zsh <($out/bin/${pname} completion zsh)
+  '';
+
+  passthru.tests.version = testers.testVersion {
+    package = gitleaks;
+    command = "${pname} version";
+  };
+
+  passthru.updateScript = nix-update-script { };
+
+  meta = with lib; {
+    description = "Scan git repos (or files) for secrets";
+    longDescription = ''
+      Gitleaks is a SAST tool for detecting hardcoded secrets like passwords,
+      API keys and tokens in git repos.
+    '';
+    homepage = "https://github.com/zricethezav/gitleaks";
+    changelog = "https://github.com/zricethezav/gitleaks/releases/tag/v${version}";
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ fab ];
+    mainProgram = "gitleaks";
+  };
+}
diff --git a/pkgs/by-name/gi/gitless/package.nix b/pkgs/by-name/gi/gitless/package.nix
new file mode 100644
index 000000000000..93014402a2eb
--- /dev/null
+++ b/pkgs/by-name/gi/gitless/package.nix
@@ -0,0 +1,40 @@
+{ lib
+, fetchFromGitHub
+, python3
+}:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "gitless";
+  version = "0.9.17";
+  format = "setuptools";
+
+  src = fetchFromGitHub {
+    owner = "goldstar611";
+    repo = pname;
+    rev = version;
+    hash = "sha256-XDB1i2b1reMCM6i1uK3IzTnsoLXO7jldYtNlYUo1AoQ=";
+  };
+
+
+  propagatedBuildInputs = with python3.pkgs; [
+    pygit2
+    argcomplete
+  ];
+
+  pythonRelaxDeps = [ "pygit2" ];
+
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "gitless"
+  ];
+
+  meta = with lib; {
+    description = "Version control system built on top of Git";
+    homepage = "https://gitless.com/";
+    license = licenses.mit;
+    maintainers = with maintainers; [ cransom ];
+    platforms = platforms.all;
+    mainProgram = "gl";
+  };
+}
diff --git a/pkgs/by-name/gi/gitls/package.nix b/pkgs/by-name/gi/gitls/package.nix
new file mode 100644
index 000000000000..16ae8c9e6a8b
--- /dev/null
+++ b/pkgs/by-name/gi/gitls/package.nix
@@ -0,0 +1,35 @@
+{ lib
+, buildGoModule
+, gitls
+, fetchFromGitHub
+, testers
+}:
+
+buildGoModule rec {
+  pname = "gitls";
+  version = "1.0.4";
+
+  src = fetchFromGitHub {
+    owner = "hahwul";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-kLkH/nNidd1QNPKvo7fxZwMhTgd4AVB8Ofw0Wo0z6c0=";
+  };
+
+  vendorHash = null;
+
+  passthru.tests.version = testers.testVersion {
+    package = gitls;
+    command = "gitls -version";
+    version = "v${version}";
+  };
+
+  meta = with lib; {
+    description = "Tools to enumerate git repository URL";
+    homepage = "https://github.com/hahwul/gitls";
+    changelog = "https://github.com/hahwul/gitls/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ fab ];
+    mainProgram = "gitls";
+  };
+}
diff --git a/pkgs/by-name/gi/gitnr/package.nix b/pkgs/by-name/gi/gitnr/package.nix
new file mode 100644
index 000000000000..5d2813850983
--- /dev/null
+++ b/pkgs/by-name/gi/gitnr/package.nix
@@ -0,0 +1,49 @@
+{ lib
+, rustPlatform
+, fetchFromGitHub
+, pkg-config
+, libxkbcommon
+, openssl
+, stdenv
+, darwin
+, wayland
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "gitnr";
+  version = "0.2.2";
+
+  src = fetchFromGitHub {
+    owner = "reemus-dev";
+    repo = "gitnr";
+    rev = "v${version}";
+    hash = "sha256-9vx+bGfYuJuafZUY2ZT4SAgrNcSXuMe1kHH/lrpItvM=";
+  };
+
+  cargoHash = "sha256-ZvF8X+IT7mrKaUaNS4NhYzX9P3hkhNNH/ActxG/6YZE=";
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+
+  buildInputs = [
+    openssl
+  ] ++ lib.optionals stdenv.hostPlatform.isDarwin [
+    darwin.apple_sdk.frameworks.AppKit
+  ] ++ lib.optionals stdenv.hostPlatform.isLinux [
+    libxkbcommon
+    wayland
+  ];
+
+  # requires internet access
+  doCheck = false;
+
+  meta = with lib; {
+    description = "Create `.gitignore` files using one or more templates from TopTal, GitHub or your own collection";
+    homepage = "https://github.com/reemus-dev/gitnr";
+    changelog = "https://github.com/reemus-dev/gitnr/blob/${src.rev}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ figsoda matthiasbeyer ];
+    mainProgram = "gitnr";
+  };
+}
diff --git a/pkgs/by-name/gi/gitnuro/package.nix b/pkgs/by-name/gi/gitnuro/package.nix
new file mode 100644
index 000000000000..8809f748e6b7
--- /dev/null
+++ b/pkgs/by-name/gi/gitnuro/package.nix
@@ -0,0 +1,73 @@
+{ lib
+, stdenv
+, fetchurl
+, makeWrapper
+, copyDesktopItems
+, makeDesktopItem
+, jre
+, libGL
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gitnuro";
+  version = "1.3.1";
+
+  src = fetchurl (
+    if stdenv.hostPlatform.system == "x86_64-linux" then
+    {
+      url = "https://github.com/JetpackDuba/Gitnuro/releases/download/v${version}/Gitnuro-linux-x86_64-${version}.jar";
+      hash = "sha256-7yne9dD/7VT+H4tIBJvpOf8ksECCpoNAa8TSmFmjYMw=";
+    }
+    else if stdenv.hostPlatform.system == "aarch64-linux" then
+    {
+      url = "https://github.com/JetpackDuba/Gitnuro/releases/download/v${version}/Gitnuro-linux-arm_aarch64-${version}.jar";
+      hash = "sha256-6TRQfIhaKBjNPn3tEVWoUF92JAmwlHUtQZE8gKEZ/ZI=";
+    }
+    else throw "Unsupported architecture: ${stdenv.hostPlatform.system}"
+  );
+
+  icon = fetchurl {
+    url = "https://raw.githubusercontent.com/JetpackDuba/Gitnuro/4cfc45069c176f807d9bfb1a7cba410257078d3c/icons/logo.svg";
+    hash = "sha256-QGJcWTSJesIpDArOWiS3Kn1iznzeMFzvqS+CuNXh3as=";
+  };
+
+  dontUnpack = true;
+
+  nativeBuildInputs = [
+    makeWrapper
+    copyDesktopItems
+  ];
+
+  installPhase = ''
+    runHook preInstall
+
+    makeWrapper ${jre}/bin/java $out/bin/gitnuro \
+      --prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath [ libGL ]}" \
+      --add-flags "-jar $src"
+
+    install -Dm444 $icon $out/share/icons/hicolor/scalable/apps/com.jetpackduba.Gitnuro.svg
+
+    runHook postInstall
+  '';
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "Gitnuro";
+      exec = "gitnuro";
+      icon = "com.jetpackduba.Gitnuro";
+      desktopName = "Gitnuro";
+      categories = [ "Development" ];
+      comment = meta.description;
+    })
+  ];
+
+  meta = with lib; {
+    description = "A FOSS Git multiplatform client based on Compose and JGit";
+    homepage = "https://gitnuro.com/";
+    license = licenses.gpl3Plus;
+    platforms = [ "x86_64-linux" "aarch64-linux" ];
+    sourceProvenance = with sourceTypes; [ binaryBytecode ];
+    maintainers = with maintainers; [ zendo ];
+    mainProgram = "gitnuro";
+  };
+}
diff --git a/pkgs/by-name/gi/gitolite/package.nix b/pkgs/by-name/gi/gitolite/package.nix
new file mode 100644
index 000000000000..df0c75976032
--- /dev/null
+++ b/pkgs/by-name/gi/gitolite/package.nix
@@ -0,0 +1,54 @@
+{ stdenv, coreutils, fetchFromGitHub, git, lib, makeWrapper, nettools, perl, nixosTests }:
+
+stdenv.mkDerivation rec {
+  pname = "gitolite";
+  version = "3.6.13";
+
+  src = fetchFromGitHub {
+    owner = "sitaramc";
+    repo = "gitolite";
+    rev = "v${version}";
+    hash = "sha256-/VBu+aepIrxWc2padPa/WoXbIdKfIwqmA/M8d1GE5FI=";
+  };
+
+  buildInputs = [ nettools perl ];
+  nativeBuildInputs = [ makeWrapper ];
+  propagatedBuildInputs = [ git ];
+
+  dontBuild = true;
+
+  postPatch = ''
+    substituteInPlace ./install --replace " 2>/dev/null" ""
+    substituteInPlace src/lib/Gitolite/Hooks/PostUpdate.pm \
+      --replace /usr/bin/perl "${perl}/bin/perl"
+    substituteInPlace src/lib/Gitolite/Hooks/Update.pm \
+      --replace /usr/bin/perl "${perl}/bin/perl"
+    substituteInPlace src/lib/Gitolite/Setup.pm \
+      --replace hostname "${nettools}/bin/hostname"
+    substituteInPlace src/commands/sskm \
+      --replace /bin/rm "${coreutils}/bin/rm"
+  '';
+
+  postFixup = ''
+    wrapProgram $out/bin/gitolite-shell \
+      --prefix PATH : ${lib.makeBinPath [ git (perl.withPackages (p: [ p.JSON ])) ]}
+  '';
+
+  installPhase = ''
+    mkdir -p $out/bin
+    perl ./install -to $out/bin
+    echo ${version} > $out/bin/VERSION
+  '';
+
+  passthru.tests = {
+    gitolite = nixosTests.gitolite;
+  };
+
+  meta = with lib; {
+    description = "Finely-grained git repository hosting";
+    homepage    = "https://gitolite.com/gitolite/index.html";
+    license     = licenses.gpl2;
+    platforms   = platforms.unix;
+    maintainers = [ maintainers.thoughtpolice maintainers.lassulus maintainers.tomberek ];
+  };
+}
diff --git a/pkgs/by-name/gi/gitopper/package.nix b/pkgs/by-name/gi/gitopper/package.nix
new file mode 100644
index 000000000000..442a706ad7f9
--- /dev/null
+++ b/pkgs/by-name/gi/gitopper/package.nix
@@ -0,0 +1,54 @@
+{
+  lib,
+  buildGoModule,
+  fetchFromGitHub,
+  git,
+  makeWrapper,
+}:
+let
+  pname = "gitopper";
+  version = "0.0.16";
+in
+buildGoModule {
+  inherit pname version;
+
+  src = fetchFromGitHub {
+    owner = "miekg";
+    repo = "gitopper";
+    rev = "v${version}";
+    hash = "sha256-EAOC54VtGx6axfty5m8JOebcayINTy4cP4NBo5+ioLk=";
+  };
+
+  ldflags = [ "-X main.Version=${version}" ];
+
+  vendorHash = "sha256-sxeN7nbNTGfD8ZgNQiEQdYl11rhOvPP8UrnYXs9Ljhc=";
+
+  nativeCheckInputs = [
+    makeWrapper
+    git
+  ];
+
+  checkFlags =
+    let
+      # Skip tests that does not works well inside an isolated environment
+      skippedTests = [
+        "TestInitialGitCheckout"
+        "TestHash"
+      ];
+    in
+    [ "-skip=^${builtins.concatStringsSep "$|^" skippedTests}$" ];
+
+  postInstall = ''
+    wrapProgram $out/bin/gitopper \
+      --suffix PATH : ${lib.makeBinPath [ git ]}
+  '';
+
+  meta = {
+    description = "Gitops for non-Kubernetes folks";
+    homepage = "https://github.com/miekg/gitopper/";
+    license = lib.licenses.asl20;
+    platforms = lib.platforms.linux;
+    maintainers = with lib.maintainers; [ luftmensch-luftmensch ];
+    mainProgram = "gitopper";
+  };
+}
diff --git a/pkgs/by-name/gi/gitrs/package.nix b/pkgs/by-name/gi/gitrs/package.nix
new file mode 100644
index 000000000000..99139437b4a7
--- /dev/null
+++ b/pkgs/by-name/gi/gitrs/package.nix
@@ -0,0 +1,42 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, openssl
+, pkg-config
+, libiconv
+, darwin
+, rustPlatform
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "gitrs";
+  version = "v0.3.6";
+
+  src = fetchFromGitHub {
+    owner = "mccurdyc";
+    repo = pname;
+    rev = version;
+    hash = "sha256-+43XJroPNWmdUC6FDL84rZWrJm5fzuUXfpDkAMyVQQg=";
+  };
+
+  cargoHash = "sha256-2TXm1JTs0Xkid91A5tdi6Kokm0K1NOPmlocwFXv48uw=";
+
+  nativeBuildInputs = [
+    pkg-config # for openssl
+  ];
+
+  buildInputs = [ openssl.dev ]
+    ++ lib.optionals stdenv.hostPlatform.isDarwin [
+    libiconv
+    darwin.apple_sdk.frameworks.Security
+    darwin.apple_sdk.frameworks.SystemConfiguration
+  ];
+
+  meta = with lib; {
+    description = "Simple, opinionated, tool, written in Rust, for declaratively managing Git repos on your machine";
+    homepage = "https://github.com/mccurdyc/gitrs";
+    license = licenses.mit;
+    maintainers = with maintainers; [ mccurdyc ];
+    mainProgram = "gitrs";
+  };
+}
diff --git a/pkgs/by-name/gi/gitsign/package.nix b/pkgs/by-name/gi/gitsign/package.nix
new file mode 100644
index 000000000000..abc1e6a32594
--- /dev/null
+++ b/pkgs/by-name/gi/gitsign/package.nix
@@ -0,0 +1,44 @@
+{ lib, buildGoModule, fetchFromGitHub, makeWrapper, gitMinimal, testers, gitsign }:
+
+buildGoModule rec {
+  pname = "gitsign";
+  version = "0.10.2";
+
+  src = fetchFromGitHub {
+    owner = "sigstore";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-JNCz5MVqn8PeTfYUVowIVZwtpfD+Gx9yBckter6PfXA=";
+  };
+  vendorHash = "sha256-QW+ZWYEXkhSQR4HvmPLENzY/VEfjEX43mBPhmhsEBMI=";
+
+  subPackages = [
+    "."
+    "cmd/gitsign-credential-cache"
+  ];
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  ldflags = [ "-s" "-w" "-X github.com/sigstore/gitsign/pkg/version.gitVersion=${version}" ];
+
+  preCheck = ''
+    # test all paths
+    unset subPackages
+  '';
+
+  postInstall = ''
+    for f in $out/bin/*; do
+      wrapProgram $f --prefix PATH : ${lib.makeBinPath [ gitMinimal ]}
+    done
+  '';
+
+  passthru.tests.version = testers.testVersion { package = gitsign; };
+
+  meta = {
+    homepage = "https://github.com/sigstore/gitsign";
+    changelog = "https://github.com/sigstore/gitsign/releases/tag/v${version}";
+    description = "Keyless Git signing using Sigstore";
+    license = lib.licenses.asl20;
+    maintainers = with lib.maintainers; [ lesuisse developer-guy ];
+  };
+}
diff --git a/pkgs/by-name/gi/gitstats/package.nix b/pkgs/by-name/gi/gitstats/package.nix
new file mode 100644
index 000000000000..25fcd7247c22
--- /dev/null
+++ b/pkgs/by-name/gi/gitstats/package.nix
@@ -0,0 +1,67 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, fetchpatch
+, installShellFiles
+, perl
+, python3
+, gnuplot
+, coreutils
+, gnugrep
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gitstats";
+  version = "2016-01-08";
+
+  # upstream does not make releases
+  src = fetchFromGitHub {
+    owner = "hoxu";
+    repo = "gitstats";
+    rev = "55c5c285558c410bb35ebf421245d320ab9ee9fa";
+    sha256 = "sha256-qUQB3aCRbPkbMoMf39kPQ0vil8RjXL8RqjdTryfkzK0=";
+  };
+
+  patches = [
+    # make gitstats compatible with python3
+    # https://github.com/hoxu/gitstats/pull/105
+    (fetchpatch {
+      name = "convert-gitstats-to-use-python3.patch";
+      url = "https://github.com/hoxu/gitstats/commit/ca415668ce6b739ca9fefba6acd29c63b89f4211.patch";
+      hash = "sha256-sgjoj8eQ5CxQBffmhqymsmXb8peuaSbfFoWciLK3LOo=";
+    })
+  ];
+
+  nativeBuildInputs = [ installShellFiles perl ];
+
+  buildInputs = [ python3 ];
+
+  strictDeps = true;
+
+  postPatch = ''
+    sed -e "s|gnuplot_cmd = .*|gnuplot_cmd = '${gnuplot}/bin/gnuplot'|" \
+        -e "s|\<wc\>|${coreutils}/bin/wc|g" \
+        -e "s|\<grep\>|${gnugrep}/bin/grep|g" \
+        -i gitstats
+  '';
+
+  makeFlags = [
+    "PREFIX=$(out)"
+    "VERSION=${version}"
+  ];
+
+  buildFlags = [ "man" ];
+
+  postInstall = ''
+    installManPage doc/gitstats.1
+  '';
+
+  meta = with lib; {
+    homepage = "https://gitstats.sourceforge.net/";
+    description = "Git history statistics generator";
+    license = licenses.gpl2Plus;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ bjornfor ];
+    mainProgram = "gitstats";
+  };
+}
diff --git a/pkgs/by-name/gi/gitstatus/package.nix b/pkgs/by-name/gi/gitstatus/package.nix
new file mode 100644
index 000000000000..cc6037d16c21
--- /dev/null
+++ b/pkgs/by-name/gi/gitstatus/package.nix
@@ -0,0 +1,129 @@
+{
+  callPackage,
+  lib,
+  stdenv,
+  fetchFromGitHub,
+  git,
+  zsh,
+  runtimeShell,
+}:
+stdenv.mkDerivation rec {
+  pname = "gitstatus";
+  version = "1.5.5";
+
+  src = fetchFromGitHub {
+    owner = "romkatv";
+    repo = "gitstatus";
+    rev = "v${version}";
+    sha256 = "sha256-b+9bwJ87VV6rbOPobkwMkDXGH34STjYPlt8wCRR5tEc=";
+  };
+
+  env = lib.optionalAttrs stdenv.hostPlatform.isDarwin {
+    NIX_LDFLAGS = "-liconv";
+  };
+
+  buildInputs = [ (callPackage ./romkatv_libgit2.nix { }) ];
+
+  postPatch = ''
+    sed -i '1i GITSTATUS_AUTO_INSTALL=''${GITSTATUS_AUTO_INSTALL-0}' gitstatus.plugin.sh
+    sed -i '1i GITSTATUS_AUTO_INSTALL=''${GITSTATUS_AUTO_INSTALL-0}' gitstatus.plugin.zsh
+    sed -i "1a GITSTATUS_DAEMON=$out/bin/gitstatusd" install
+  '';
+
+  installPhase = ''
+    install -Dm755 usrbin/gitstatusd $out/bin/gitstatusd
+    install -Dm444 gitstatus.plugin.sh -t $out/share/gitstatus/
+    install -Dm444 gitstatus.plugin.zsh -t $out/share/gitstatus/
+    install -Dm444 gitstatus.prompt.sh -t $out/share/gitstatus/
+    install -Dm444 gitstatus.prompt.zsh -t $out/share/gitstatus/
+    install -Dm555 install -t $out/share/gitstatus/
+    install -Dm444 build.info -t $out/share/gitstatus/
+
+    # the fallback path is wrong in the case of home-manager
+    # because the FHS directories don't start at /
+    substituteInPlace install \
+      --replace "_gitstatus_install_main ." "_gitstatus_install_main $out"
+
+    cat <<EOF > $out/bin/gitstatus-share
+    #!${runtimeShell}
+    # Run this script to find the gitstatus shared folder where all the shell
+    # integration scripts are living.
+    echo $out/share/gitstatus
+    EOF
+    chmod +x $out/bin/gitstatus-share
+  '';
+
+  # Don't install the "install" and "build.info" files, which the end user
+  # should not need to worry about.
+  pathsToLink = [
+    "/bin/gitstatusd"
+    "/share/gitstatus/gitstatus.plugin.sh"
+    "/share/gitstatus/gitstatus.plugin.zsh"
+    "/share/gitstatus/gitstatus.prompt.sh"
+    "/share/gitstatus/gitstatus.prompt.zsh"
+  ];
+
+  # The install check sets up an empty Git repository and a minimal zshrc that
+  # invokes gitstatus.plugin.zsh. It runs zsh against this zshrc and verifies
+  # that the script was sourced successfully and that the "gitstatus_query"
+  # command ran successfully. This tests the binary itself and the zsh
+  # integration.
+  nativeInstallCheckInputs = [
+    git
+    zsh
+  ];
+  doInstallCheck = true;
+  installCheckPhase = ''
+    TEMP=$(mktemp -d)
+    cd "$TEMP"
+
+    git init
+
+    echo '
+      GITSTATUS_LOG_LEVEL=DEBUG
+      . $out/share/gitstatus/gitstatus.plugin.zsh || exit 1
+
+      gitstatus_stop NIX_TEST && gitstatus_start NIX_TEST
+      gitstatus_query NIX_TEST
+      if [[ $? -ne 0 ]]; then
+          print -- "Something went wrong with gitstatus"
+          exit 1
+      elif [[ $VCS_STATUS_RESULT != "ok-sync" ]]; then
+          print -- "Not in a Git repo"
+          exit 1
+      else
+          print -- "OK"
+          exit 0
+      fi
+    ' > .zshrc
+
+    # If we try to run zsh like "zsh -i -c true" or "zsh -i > output" then job
+    # control will be disabled in the shell and the gitstatus plugin script
+    # will fail when it tries to set the MONITOR option. As a workaround, we
+    # run zsh as a full-fledged independent process and then wait for it to
+    # exit. (The "exit" statements in the zshrc ensure that zsh will exit
+    # almost immediately after starting.)
+    ZDOTDIR=. zsh -i &
+    wait $!
+  '';
+
+  meta = with lib; {
+    description = "10x faster implementation of `git status` command";
+    longDescription = ''
+      To enable the included gitstatus prompt, add the appropriate line to your NixOS configuration:
+      `programs.bash.promptInit = "source $(gitstatus-share)/gitstatus.prompt.sh";`
+      `programs.zsh.promptInit = "source $(gitstatus-share)/gitstatus.prompt.zsh";`
+
+      See the project homepage for details on customization.
+    '';
+    homepage = "https://github.com/romkatv/gitstatus";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [
+      mmlb
+      hexa
+      SuperSandro2000
+    ];
+    platforms = platforms.all;
+    mainProgram = "gitstatusd";
+  };
+}
diff --git a/pkgs/by-name/gi/gitstatus/romkatv_libgit2.nix b/pkgs/by-name/gi/gitstatus/romkatv_libgit2.nix
new file mode 100644
index 000000000000..9881bd480406
--- /dev/null
+++ b/pkgs/by-name/gi/gitstatus/romkatv_libgit2.nix
@@ -0,0 +1,29 @@
+{ fetchFromGitHub, libgit2, ... }:
+
+libgit2.overrideAttrs (oldAttrs: {
+  cmakeFlags = oldAttrs.cmakeFlags ++ [
+    "-DBUILD_CLAR=OFF"
+    "-DBUILD_SHARED_LIBS=OFF"
+    "-DREGEX_BACKEND=builtin"
+    "-DUSE_BUNDLED_ZLIB=ON"
+    "-DUSE_GSSAPI=OFF"
+    "-DUSE_HTTPS=OFF"
+    "-DUSE_HTTP_PARSER=builtin" # overwritten from libgit2
+    "-DUSE_NTLMCLIENT=OFF"
+    "-DUSE_SSH=OFF"
+    "-DZERO_NSEC=ON"
+  ];
+
+  src = fetchFromGitHub {
+    owner = "romkatv";
+    repo = "libgit2";
+    rev = "tag-2ecf33948a4df9ef45a66c68b8ef24a5e60eaac6";
+    hash = "sha256-Bm3Gj9+AhNQMvkIqdrTkK5D9vrZ1qq6CS8Wrn9kfKiw=";
+  };
+
+  # this is a heavy fork of the original libgit2
+  # the original checkPhase does not work for this fork
+  doCheck = false;
+
+  patches = [ ];
+})
diff --git a/pkgs/by-name/gi/gittuf/package.nix b/pkgs/by-name/gi/gittuf/package.nix
index 04c4c8c32bb0..8dfca387e94a 100644
--- a/pkgs/by-name/gi/gittuf/package.nix
+++ b/pkgs/by-name/gi/gittuf/package.nix
@@ -2,16 +2,16 @@
 
 buildGoModule rec {
   pname = "gittuf";
-  version = "0.5.2";
+  version = "0.6.2";
 
   src = fetchFromGitHub {
     owner = "gittuf";
     repo = pname;
     rev = "v${version}";
-    hash = "sha256-mes+6Bs6KhLkcHRzI07ciT1SuSJU/YxjXt0MCDeVCUk=";
+    hash = "sha256-iPaYwZUnIu9GeyY4kBhj+9gIINYx+pGSWJqPekh535g=";
   };
 
-  vendorHash = "sha256-7z7+ycV6e24JUlLIxRCAgJwxRcRgGWBYPgbXgGqatEE=";
+  vendorHash = "sha256-mafN+Nrr0AtfMjnXNoEIuz90kJa58pgY2vUOlv7v+TE=";
 
   ldflags = [ "-X github.com/gittuf/gittuf/internal/version.gitVersion=${version}" ];
 
diff --git a/pkgs/by-name/gi/gitty/package.nix b/pkgs/by-name/gi/gitty/package.nix
new file mode 100644
index 000000000000..ba677b2ba8e5
--- /dev/null
+++ b/pkgs/by-name/gi/gitty/package.nix
@@ -0,0 +1,25 @@
+{ lib, fetchFromGitHub, buildGoModule }:
+
+buildGoModule rec {
+  pname = "gitty";
+  version = "0.7.0";
+
+  src = fetchFromGitHub {
+    owner = "muesli";
+    repo = "gitty";
+    rev = "v${version}";
+    sha256 = "sha256-g0D6nJiHY7cz72DSmdQZsj9Vgv/VOp0exTcLsaypGiU=";
+  };
+
+  vendorHash = "sha256-qrLECQkjXH0aTHmysq64jnXj9jgbunpVtBAIXJOEYIY=";
+
+  ldflags = [ "-s" "-w" "-X=main.Version=${version}" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/muesli/gitty/";
+    description = "Contextual information about your git projects, right on the command-line";
+    license = licenses.mit;
+    maintainers = with maintainers; [ izorkin ];
+    mainProgram = "gitty";
+  };
+}
diff --git a/pkgs/by-name/gi/gitu/package.nix b/pkgs/by-name/gi/gitu/package.nix
index eda3c91c59cb..db382be54fe7 100644
--- a/pkgs/by-name/gi/gitu/package.nix
+++ b/pkgs/by-name/gi/gitu/package.nix
@@ -12,16 +12,16 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "gitu";
-  version = "0.25.0";
+  version = "0.26.0";
 
   src = fetchFromGitHub {
     owner = "altsem";
     repo = "gitu";
     rev = "v${version}";
-    hash = "sha256-DqJ/O87LdNXmJNmoBCdAvLod8uDRHlNuMzAv+kEew1w=";
+    hash = "sha256-rHlehYdyBYyhP/kFciFW0vmaewtXYuypaHMzqyMDXYA=";
   };
 
-  cargoHash = "sha256-rfj2rDqO/sMaghpou2TCTfqrUmPxh0qooR6hhqlS4PM=";
+  cargoHash = "sha256-b0Z1SOprsVe8Sg4X0ooOahE9yrP65CV1otZ3nXFvPHo=";
 
   nativeBuildInputs = [
     pkg-config
@@ -31,7 +31,7 @@ rustPlatform.buildRustPackage rec {
     libgit2
     openssl
     zlib
-  ] ++ lib.optionals stdenv.isDarwin [
+  ] ++ lib.optionals stdenv.hostPlatform.isDarwin [
     darwin.apple_sdk.frameworks.AppKit
     darwin.apple_sdk.frameworks.Security
   ];
diff --git a/pkgs/by-name/gi/gitui/package.nix b/pkgs/by-name/gi/gitui/package.nix
index a93cad786827..df3adcb0e39f 100644
--- a/pkgs/by-name/gi/gitui/package.nix
+++ b/pkgs/by-name/gi/gitui/package.nix
@@ -25,8 +25,8 @@ rustPlatform.buildRustPackage rec {
   nativeBuildInputs = [ pkg-config ];
 
   buildInputs = [ openssl ]
-    ++ lib.optional stdenv.isLinux xclip
-    ++ lib.optionals stdenv.isDarwin [
+    ++ lib.optional stdenv.hostPlatform.isLinux xclip
+    ++ lib.optionals stdenv.hostPlatform.isDarwin [
          libiconv
          darwin.apple_sdk.frameworks.Security
          darwin.apple_sdk.frameworks.AppKit
diff --git a/pkgs/by-name/gi/gitweb/package.nix b/pkgs/by-name/gi/gitweb/package.nix
new file mode 100644
index 000000000000..f2cb91ac4f83
--- /dev/null
+++ b/pkgs/by-name/gi/gitweb/package.nix
@@ -0,0 +1,27 @@
+{ lib, buildEnv, git, fetchFromGitHub
+, gitwebTheme ? false }:
+
+let
+  gitwebThemeSrc = fetchFromGitHub {
+    owner = "kogakure";
+    repo = "gitweb-theme";
+    rev = "049b88e664a359f8ec25dc6f531b7e2aa60dd1a2";
+    postFetch = ''
+      mkdir -p "$TMPDIR/gitwebTheme"
+      mv "$out"/* "$TMPDIR/gitwebTheme/"
+      mkdir "$out/static"
+      mv "$TMPDIR/gitwebTheme"/* "$out/static/"
+    '';
+    sha256 = "17hypq6jvhy6zhh26lp3nyi52npfd5wy5752k6sq0shk4na2acqi";
+  };
+in buildEnv {
+  name = "gitweb-${lib.getVersion git}";
+
+  ignoreCollisions = true;
+  paths = lib.optional gitwebTheme gitwebThemeSrc
+       ++ [ "${git}/share/gitweb" ];
+
+  meta = git.meta // {
+    maintainers = [ ];
+  };
+}
diff --git a/pkgs/by-name/gi/gitxray/package.nix b/pkgs/by-name/gi/gitxray/package.nix
new file mode 100644
index 000000000000..dbdd5ce9dbfc
--- /dev/null
+++ b/pkgs/by-name/gi/gitxray/package.nix
@@ -0,0 +1,33 @@
+{
+  lib,
+  python3,
+  fetchFromGitHub,
+}:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "gitxray";
+  version = "1.0.16";
+  pyproject = true;
+
+  src = fetchFromGitHub {
+    owner = "kulkansecurity";
+    repo = "gitxray";
+    rev = "refs/tags/${version}";
+    hash = "sha256-sBDKRHNhRG0SUd9G0+iiKOB+lqzISi92itbZIT+j4ME=";
+  };
+
+  build-system = with python3.pkgs; [ setuptools ];
+
+  dependencies = with python3.pkgs; [ requests ];
+
+  pythonImportsCheck = [ "gitxray" ];
+
+  meta = {
+    description = "Tool which leverages Public GitHub REST APIs for various tasks";
+    homepage = "https://github.com/kulkansecurity/gitxray";
+    changelog = "https://github.com/kulkansecurity/gitxray/blob/${src.rev}/CHANGELOG.md";
+    license = lib.licenses.agpl3Only;
+    maintainers = with lib.maintainers; [ fab ];
+    mainProgram = "gitxray";
+  };
+}
diff --git a/pkgs/by-name/gi/gixy/package.nix b/pkgs/by-name/gi/gixy/package.nix
new file mode 100644
index 000000000000..5d1bfb65d4c2
--- /dev/null
+++ b/pkgs/by-name/gi/gixy/package.nix
@@ -0,0 +1,79 @@
+{
+  lib,
+  fetchFromGitHub,
+  fetchpatch2,
+  python3,
+  nginx,
+}:
+
+let
+  python = python3.override {
+    self = python;
+    packageOverrides = self: super: {
+      pyparsing = super.pyparsing.overridePythonAttrs rec {
+        version = "2.4.7";
+        src = fetchFromGitHub {
+          owner = "pyparsing";
+          repo = "pyparsing";
+          rev = "pyparsing_${version}";
+          sha256 = "14pfy80q2flgzjcx8jkracvnxxnr59kjzp3kdm5nh232gk1v6g6h";
+        };
+        nativeBuildInputs = [ super.setuptools ];
+      };
+    };
+  };
+in
+python.pkgs.buildPythonApplication rec {
+  pname = "gixy";
+  version = "0.1.20";
+  pyproject = true;
+
+  # fetching from GitHub because the PyPi source is missing the tests
+  src = fetchFromGitHub {
+    owner = "yandex";
+    repo = "gixy";
+    rev = "v${version}";
+    sha256 = "14arz3fjidb8z37m08xcpih1391varj8s0v3gri79z3qb4zq5k6b";
+  };
+
+  patches = [
+    # Migrate tests to pytest
+    # https://github.com/yandex/gixy/pull/146
+    (fetchpatch2 {
+      url = "https://github.com/yandex/gixy/compare/6f68624a7540ee51316651bda656894dc14c9a3e...b1c6899b3733b619c244368f0121a01be028e8c2.patch";
+      hash = "sha256-6VUF2eQ2Haat/yk8I5qIXhHdG9zLQgEXJMLfe25OKEo=";
+    })
+  ];
+
+  build-system = [ python.pkgs.setuptools ];
+
+  dependencies = with python.pkgs; [
+    cached-property
+    configargparse
+    pyparsing
+    jinja2
+    six
+  ];
+
+  nativeCheckInputs = [ python.pkgs.pytestCheckHook ];
+
+  pythonRemoveDeps = [ "argparse" ];
+
+  passthru = {
+    inherit (nginx.passthru) tests;
+  };
+
+  meta = {
+    description = "Nginx configuration static analyzer";
+    mainProgram = "gixy";
+    longDescription = ''
+      Gixy is a tool to analyze Nginx configuration.
+      The main goal of Gixy is to prevent security misconfiguration and automate flaw detection.
+    '';
+    homepage = "https://github.com/yandex/gixy";
+    sourceProvenance = [ lib.sourceTypes.fromSource ];
+    license = lib.licenses.mpl20;
+    maintainers = [ lib.maintainers.willibutz ];
+    platforms = lib.platforms.unix;
+  };
+}