about summary refs log tree commit diff
path: root/pkgs/servers
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/servers')
-rw-r--r--pkgs/servers/adminer/default.nix31
-rw-r--r--pkgs/servers/ankisyncd/default.nix67
-rw-r--r--pkgs/servers/blockbook/default.nix4
-rw-r--r--pkgs/servers/blockbook/deps.nix75
-rw-r--r--pkgs/servers/clickhouse/default.nix4
-rw-r--r--pkgs/servers/dns/knot-dns/default.nix4
-rw-r--r--pkgs/servers/dns/knot-resolver/default.nix8
-rw-r--r--pkgs/servers/dns/pdns-recursor/default.nix6
-rw-r--r--pkgs/servers/freeradius/default.nix20
-rw-r--r--pkgs/servers/gortr/default.nix4
-rw-r--r--pkgs/servers/grocy/0001-Define-configs-with-env-vars.patch (renamed from pkgs/servers/grocy/config-locations.patch)79
-rw-r--r--pkgs/servers/grocy/default.nix7
-rw-r--r--pkgs/servers/home-assistant/component-packages.nix1817
-rw-r--r--pkgs/servers/home-assistant/default.nix9
-rw-r--r--pkgs/servers/home-assistant/frontend.nix4
-rwxr-xr-xpkgs/servers/home-assistant/parse-requirements.py177
-rw-r--r--pkgs/servers/home-assistant/relax-importlib-metadata-pyaml.patch22
-rw-r--r--pkgs/servers/http/unit/default.nix4
-rw-r--r--pkgs/servers/imgproxy/default.nix32
-rw-r--r--pkgs/servers/jackett/default.nix8
-rw-r--r--pkgs/servers/jellyfin/default.nix10
-rw-r--r--pkgs/servers/mail/dovecot/default.nix6
-rw-r--r--pkgs/servers/mail/rspamd/default.nix4
-rw-r--r--pkgs/servers/metabase/default.nix4
-rw-r--r--pkgs/servers/monitoring/prometheus/mikrotik-exporter.nix22
-rw-r--r--pkgs/servers/monitoring/prometheus/nginx-exporter.nix4
-rw-r--r--pkgs/servers/monitoring/prometheus/pushgateway.nix4
-rw-r--r--pkgs/servers/monitoring/prometheus/wireguard-exporter.nix7
-rw-r--r--pkgs/servers/monitoring/zabbix/versions.nix12
-rw-r--r--pkgs/servers/mpd/default.nix6
-rw-r--r--pkgs/servers/plex/raw.nix4
-rw-r--r--pkgs/servers/radarr/default.nix6
-rw-r--r--pkgs/servers/routinator/default.nix5
-rw-r--r--pkgs/servers/sql/mariadb/connector-c/3_1.nix4
-rw-r--r--pkgs/servers/sql/mariadb/connector-c/default.nix1
-rw-r--r--pkgs/servers/sql/postgresql/default.nix5
-rw-r--r--pkgs/servers/sql/postgresql/ext/pgroonga.nix4
-rw-r--r--pkgs/servers/trezord/default.nix4
-rw-r--r--pkgs/servers/ums/default.nix10
-rw-r--r--pkgs/servers/unpfs/default.nix5
-rw-r--r--pkgs/servers/web-apps/matomo/default.nix8
-rw-r--r--pkgs/servers/web-apps/moodle/default.nix4
-rw-r--r--pkgs/servers/webmetro/default.nix5
-rw-r--r--pkgs/servers/zoneminder/0001-Don-t-use-file-timestamp-in-cache-filename.patch32
-rw-r--r--pkgs/servers/zoneminder/default.nix26
-rw-r--r--pkgs/servers/zoneminder/link-with-libdl.patch17
46 files changed, 1473 insertions, 1128 deletions
diff --git a/pkgs/servers/adminer/default.nix b/pkgs/servers/adminer/default.nix
new file mode 100644
index 000000000000..6d7b12df56d4
--- /dev/null
+++ b/pkgs/servers/adminer/default.nix
@@ -0,0 +1,31 @@
+{ stdenv, libbsd, fetchurl, phpPackages, php }:
+
+stdenv.mkDerivation rec {
+  version = "4.7.6";
+  pname = "adminer";
+
+  # not using fetchFromGitHub as the git repo relies on submodules that are included in the tar file
+  src = fetchurl {
+    url = "https://github.com/vrana/adminer/releases/download/v${version}/adminer-${version}.tar.gz";
+    sha256 = "1zgvscz7jk32qga8hp2dg89h7y72v05vz4yh4lq2ahhwwkbnsxpi";
+  };
+
+  nativeBuildInputs = with phpPackages; [ php composer ];
+
+  buildPhase = ''
+    composer --no-cache run compile
+  '';
+
+  installPhase = ''
+    mkdir $out
+    cp adminer-${version}.php $out/adminer.php
+  '';
+
+  meta = with stdenv.lib; {
+    description = "Database management in a single PHP file";
+    homepage = "https://www.adminer.org";
+    license = with licenses; [ asl20 gpl2 ];
+    maintainers = with maintainers; [ sstef ];
+    platforms = platforms.all;
+  };
+}
diff --git a/pkgs/servers/ankisyncd/default.nix b/pkgs/servers/ankisyncd/default.nix
new file mode 100644
index 000000000000..e10986701237
--- /dev/null
+++ b/pkgs/servers/ankisyncd/default.nix
@@ -0,0 +1,67 @@
+{ lib
+, fetchFromGitHub
+, python3
+, anki
+}:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "ankisyncd";
+  version = "2.1.0";
+  src = fetchFromGitHub {
+    owner = "tsudoko";
+    repo = "anki-sync-server";
+    rev = version;
+    sha256 = "6a140afa94fdb1725fed716918875e3d2ad0092cb955136e381c9d826cc4927c";
+  };
+  format = "other";
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/${python3.sitePackages}
+
+    cp -r ankisyncd utils ankisyncd.conf $out/${python3.sitePackages}
+    mkdir $out/share
+    cp ankisyncctl.py $out/share/
+
+    runHook postInstall
+  '';
+
+  fixupPhase = ''
+    PYTHONPATH="$PYTHONPATH:$out/${python3.sitePackages}:${anki}"
+
+    makeWrapper "${python3.interpreter}" "$out/bin/ankisyncd" \
+          --set PYTHONPATH $PYTHONPATH \
+          --add-flags "-m ankisyncd"
+
+    makeWrapper "${python3.interpreter}" "$out/bin/ankisyncctl" \
+          --set PYTHONPATH $PYTHONPATH \
+          --add-flags "$out/share/ankisyncctl.py"
+  '';
+
+  checkInputs = with python3.pkgs; [
+    pytest
+    webtest
+  ];
+
+  buildInputs = [ ];
+
+  propagatedBuildInputs = [ anki ];
+
+  checkPhase = ''
+    # Exclude tests that require sqlite's sqldiff command, since
+    # it isn't yet packaged for NixOS, although 2 PRs exist:
+    # - https://github.com/NixOS/nixpkgs/pull/69112
+    # - https://github.com/NixOS/nixpkgs/pull/75784
+    # Once this is merged, these tests can be run as well.
+    pytest --ignore tests/test_web_media.py tests/
+  '';
+
+  meta = with lib; {
+    description = "Self-hosted Anki sync server";
+    maintainers = with maintainers; [ matt-snider ];
+    homepage = "https://github.com/tsudoko/anki-sync-server";
+    license = licenses.agpl3;
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/servers/blockbook/default.nix b/pkgs/servers/blockbook/default.nix
index b95c3d41b396..b931e8cfcb20 100644
--- a/pkgs/servers/blockbook/default.nix
+++ b/pkgs/servers/blockbook/default.nix
@@ -14,7 +14,7 @@
 
 buildGoPackage rec {
   pname = "blockbook";
-  version = "0.3.1";
+  version = "0.3.2";
 
   goPackagePath = "blockbook";
 
@@ -22,7 +22,7 @@ buildGoPackage rec {
     owner = "trezor";
     repo = "blockbook";
     rev = "v${version}";
-    sha256 = "0qgd1f3b4vavw55mvpvwvlya39dx1c3kjsc7n46nn7kpc152jv1l";
+    sha256 = "0hcgz4b7k8ia4dnjg6bbii95sqg3clc40ybwwc4qz3jv21ikc54x";
   };
 
   goDeps = ./deps.nix;
diff --git a/pkgs/servers/blockbook/deps.nix b/pkgs/servers/blockbook/deps.nix
index 90ff098581a2..9f9ae0a4704d 100644
--- a/pkgs/servers/blockbook/deps.nix
+++ b/pkgs/servers/blockbook/deps.nix
@@ -10,6 +10,33 @@
     };
   }
   {
+    goPackagePath  = "github.com/allegro/bigcache";
+    fetch = {
+      type = "git";
+      url = "https://github.com/allegro/bigcache";
+      rev =  "69ea0af04088faa57adb9ac683934277141e92a5";
+      sha256 = "0ac9pgzgi9lhklkqmc5f5x3d0cbyxjfpadc6mdbd7hdr7rfrjmxf";
+    };
+  }
+  {
+    goPackagePath  = "github.com/aristanetworks/goarista";
+    fetch = {
+      type = "git";
+      url = "https://github.com/aristanetworks/goarista";
+      rev =  "8e7d5b18fe7ad671e07097d5445dbc70422663b2";
+      sha256 = "1jbjviz8qi8izhvdvnbc5d9nqyxfww75ffcvxyhw5yxw9r1v0sn2";
+    };
+  }
+  {
+    goPackagePath  = "github.com/agl/ed25519";
+    fetch = {
+      type = "git";
+      url = "https://github.com/agl/ed25519";
+      rev =  "5312a61534124124185d41f09206b9fef1d88403";
+      sha256 = "1v8mhkf1m3ga5262s75vabskxvsw5rpqvi5nwhxwiv7gfk6h823i";
+    };
+  }
+  {
     goPackagePath  = "github.com/beorn7/perks";
     fetch = {
       type = "git";
@@ -46,6 +73,15 @@
     };
   }
   {
+    goPackagePath  = "github.com/dchest/blake256";
+    fetch = {
+      type = "git";
+      url = "https://github.com/dchest/blake256";
+      rev =  "dee3fe6eb0e98dc774a94fc231f85baf7c29d360";
+      sha256 = "18hkfm1zlkf6fsjzljiz5cjxxcf3kl5p9617si8xjggb33adzhyg";
+    };
+  }
+  {
     goPackagePath  = "github.com/deckarep/golang-set";
     fetch = {
       type = "git";
@@ -55,12 +91,39 @@
     };
   }
   {
+    goPackagePath  = "github.com/decred/base58";
+    fetch = {
+      type = "git";
+      url = "https://github.com/decred/base58";
+      rev =  "dbeddd8aab76c31eb2ea98351a63fa2c6bf46888";
+      sha256 = "0fm0gsz5myin4n15gx3fhi9pk82p6v0sxza945yvny7n13q44ns5";
+    };
+  }
+  {
+    goPackagePath  = "github.com/decred/dcrd";
+    fetch = {
+      type = "git";
+      url = "https://github.com/decred/dcrd";
+      rev =  "e3e8c47c68b010dbddeb783ebad32a3a4993dd71";
+      sha256 = "0zifsxhrjx282kvsqj80qr3v4af8hx4g6dqvrb6xggpkcaski8b4";
+    };
+  }
+  {
+    goPackagePath  = "github.com/decred/slog";
+    fetch = {
+      type = "git";
+      url = "https://github.com/decred/slog";
+      rev =  "fbd821ef791ba2b8ae945f5d44f4e49396d230c5";
+      sha256 = "0n3c7saiv4j22kjc1pf3771n6khx4g99n8vn4qvvv0i5vv04585n";
+    };
+  }
+  {
     goPackagePath  = "github.com/ethereum/go-ethereum";
     fetch = {
       type = "git";
       url = "https://github.com/ethereum/go-ethereum";
-      rev =  "8bbe72075e4e16442c4e28d999edee12e294329e";
-      sha256 = "0q0w0vz85d94wym3xni8y22vly886j6g6zn9hizcww1nanvk4nl6";
+      rev =  "24d727b6d6e2c0cde222fa12155c4a6db5caaf2e";
+      sha256 = "0vrhwfavx3gciihf406f2qfrhvhnygvlj2icbswq0d01dx3s566m";
     };
   }
   {
@@ -140,8 +203,8 @@
     fetch = {
       type = "git";
       url = "https://github.com/martinboehm/btcutil";
-      rev =  "225ed00dbbd5cb8d8b3949a0ee7c9ea540754585";
-      sha256 = "0dn5s6h1524q38glp6fcdws97lyvmchq26dhbd3dqazrq61dhdvy";
+      rev =  "a3d2b8457b77d37c3813742d4030e199b6e09111";
+      sha256 = "0152cyabklv9l39dm1g30jb7hzdv9rj45mp3v9x4kvaza58nz0x4";
     };
   }
   {
@@ -275,8 +338,8 @@
     fetch = {
       type = "git";
       url = "https://go.googlesource.com/crypto";
-      rev =  "d6449816ce06963d9d136eee5a56fca5b0616e7e";
-      sha256 = "17dkprbbk84q165275zwhcn0s6pcarigq37zlhsxj23pq2qz3aqy";
+      rev =  "a832865fa7ada6126f4c6124ac49f71be71bff2a";
+      sha256 = "0bikp74pdi9fsvfdgy0k0r8ipzz96hy28zm8qpky0vdbwqci0a8p";
     };
   }
   {
diff --git a/pkgs/servers/clickhouse/default.nix b/pkgs/servers/clickhouse/default.nix
index 90cdfc3e7051..40760093462a 100644
--- a/pkgs/servers/clickhouse/default.nix
+++ b/pkgs/servers/clickhouse/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchFromGitHub, cmake, libtool, ninja
+{ stdenv, fetchFromGitHub, cmake, libtool, lldClang, ninja
 , boost, brotli, capnproto, cctz, clang-unwrapped, double-conversion, gperftools
 , icu, jemalloc, libcpuid, libxml2, lld, llvm, lz4, libmysqlclient, openssl
 , poco, protobuf, rapidjson, re2, rdkafka, readline, sparsehash, unixODBC
@@ -16,7 +16,7 @@ stdenv.mkDerivation rec {
     sha256 = "0ck6kcifj7y4i2j1jj1a9vf5nfpp9mxk5x8y8557zp9yayjm9qyr";
   };
 
-  nativeBuildInputs = [ cmake libtool ninja ];
+  nativeBuildInputs = [ cmake libtool lldClang.bintools ninja ];
   buildInputs = [
     boost brotli capnproto cctz clang-unwrapped double-conversion gperftools
     icu jemalloc libcpuid libxml2 lld llvm lz4 libmysqlclient openssl
diff --git a/pkgs/servers/dns/knot-dns/default.nix b/pkgs/servers/dns/knot-dns/default.nix
index 234a39574506..7756c5fa3f19 100644
--- a/pkgs/servers/dns/knot-dns/default.nix
+++ b/pkgs/servers/dns/knot-dns/default.nix
@@ -8,11 +8,11 @@ let inherit (stdenv.lib) optional optionals; in
 # Note: ATM only the libraries have been tested in nixpkgs.
 stdenv.mkDerivation rec {
   pname = "knot-dns";
-  version = "2.9.2";
+  version = "2.9.3";
 
   src = fetchurl {
     url = "https://secure.nic.cz/files/knot-dns/knot-${version}.tar.xz";
-    sha256 = "298cdf33aa7589b50df7e5833694b24cd2de8b6d17cee7e1673873fe576db6ee";
+    sha256 = "f2adf137d70955a4a20df90c5409e10be8e1127204a98b27d626ac090531a07e";
   };
 
   outputs = [ "bin" "out" "dev" ];
diff --git a/pkgs/servers/dns/knot-resolver/default.nix b/pkgs/servers/dns/knot-resolver/default.nix
index c1c826b78129..ccb9a8590590 100644
--- a/pkgs/servers/dns/knot-resolver/default.nix
+++ b/pkgs/servers/dns/knot-resolver/default.nix
@@ -23,6 +23,14 @@ unwrapped = stdenv.mkDerivation rec {
     sha256 = "4a93264ad0cda7ea2252d1ba057e474722f77848165f2893e0c76e21ae406415";
   };
 
+  patches = [
+    (fetchpatch { # merged to upstream master, remove on update
+      name = "zfs-cpu-usage.diff";
+      url = "https://gitlab.labs.nic.cz/knot/knot-resolver/merge_requests/946.diff";
+      sha256 = "0mcvx4pfnl19h6zrv2fcgxdjarqzczn2dz85sylcczsfvdmn6i5m";
+    })
+  ];
+
   outputs = [ "out" "dev" ];
 
   # Path fixups for the NixOS service.
diff --git a/pkgs/servers/dns/pdns-recursor/default.nix b/pkgs/servers/dns/pdns-recursor/default.nix
index e5fc3ac5bb9a..7d6fa7d9c91b 100644
--- a/pkgs/servers/dns/pdns-recursor/default.nix
+++ b/pkgs/servers/dns/pdns-recursor/default.nix
@@ -8,11 +8,11 @@ with stdenv.lib;
 
 stdenv.mkDerivation rec {
   pname = "pdns-recursor";
-  version = "4.2.1";
+  version = "4.3.0";
 
   src = fetchurl {
     url = "https://downloads.powerdns.com/releases/pdns-recursor-${version}.tar.bz2";
-    sha256 = "07w9av3v9zjnb1fhknmza168yxsq4zr2jqcla7yg10ajrhsk534d";
+    sha256 = "13v2iah7z10wc43v9agcjrzi3wds4jna8f0b7ph35nyzhzr31h9b";
   };
 
   nativeBuildInputs = [ pkgconfig ];
@@ -30,7 +30,7 @@ stdenv.mkDerivation rec {
 
   meta = {
     description = "A recursive DNS server";
-    homepage = https://www.powerdns.com/;
+    homepage = "https://www.powerdns.com/";
     platforms = platforms.linux;
     license = licenses.gpl2;
     maintainers = with maintainers; [ rnhmjoj ];
diff --git a/pkgs/servers/freeradius/default.nix b/pkgs/servers/freeradius/default.nix
index cbd710853402..c7d6c509f098 100644
--- a/pkgs/servers/freeradius/default.nix
+++ b/pkgs/servers/freeradius/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, fetchurl, autoreconfHook, talloc, finger_bsd, perl
+{ stdenv, fetchurl, fetchpatch, autoreconfHook, talloc, finger_bsd, perl
 , openssl
 , linkOpenssl? true
 , openldap
@@ -71,13 +71,29 @@ stdenv.mkDerivation rec {
     "--localstatedir=/var"
   ] ++ optional (!linkOpenssl) "--with-openssl=no";
 
+  patches = stdenv.lib.optional withRest (fetchpatch {
+    # Fix HTTP/2 in rest
+    url = "https://github.com/FreeRADIUS/freeradius-server/commit/6286520698a3cc4053b4d49eb0a61d9ba77632aa.patch";
+    sha256 = "1ycvr3ql1mfkvzydnn4aiygnidicv2hgllppv37nb1p2pk02159g";
+  });
+
   postPatch = ''
     substituteInPlace src/main/checkrad.in --replace "/usr/bin/finger" "${finger_bsd}/bin/finger"
   '';
 
+  # By default, freeradius will generate Diffie-Hellman parameters and
+  # self-signed TLS certificates during installation. We don't want
+  # this, for several reasons:
+  # - reproducibility (random generation)
+  # - we don't want _anybody_ to use a cert where the private key is on our public binary cache!
+  # - we don't want the certs to change each time the package is rebuilt
+  # So let's avoid anything getting into our output.
+  makeFlags = [ "LOCAL_CERT_FILES=" ];
+
   installFlags = [
     "sysconfdir=\${out}/etc"
     "localstatedir=\${TMPDIR}"
+    "INSTALL_CERT_FILES=" # see comment at makeFlags
   ];
 
   outputs = [ "out" "dev" "man" "doc" ];
@@ -86,7 +102,7 @@ stdenv.mkDerivation rec {
     homepage = https://freeradius.org/;
     description = "A modular, high performance free RADIUS suite";
     license = licenses.gpl2;
-    maintainers = with maintainers; [ sheenobu willibutz ];
+    maintainers = with maintainers; [ sheenobu willibutz fpletz lheckemann elseym ];
     platforms = with platforms; linux;
   };
 
diff --git a/pkgs/servers/gortr/default.nix b/pkgs/servers/gortr/default.nix
index 375631d5cbf8..35c6e1452437 100644
--- a/pkgs/servers/gortr/default.nix
+++ b/pkgs/servers/gortr/default.nix
@@ -2,13 +2,13 @@
 
 buildGoModule rec {
   pname = "gortr";
-  version = "0.13.0";
+  version = "0.14.1";
 
   src = fetchFromGitHub {
     owner = "cloudflare";
     repo = pname;
     rev = "v${version}";
-    sha256 = "1kg42qynqqj05bvfwzd77mpl63y3gnkk15x2a4rspxf4w1ziaxkr";
+    sha256 = "03wxlras2akk2ig8sxzs89nvbc6zr2kbcmjlqldjdfhs1rcg82ra";
   };
   modSha256 = "157dpalfz3z1s3mxq63xy6lrkwzyy9xzmvn7wsxkwznjq4djv1a1";
 
diff --git a/pkgs/servers/grocy/config-locations.patch b/pkgs/servers/grocy/0001-Define-configs-with-env-vars.patch
index 475be78ec20e..654d96ae4e1a 100644
--- a/pkgs/servers/grocy/config-locations.patch
+++ b/pkgs/servers/grocy/0001-Define-configs-with-env-vars.patch
@@ -1,8 +1,20 @@
-diff --git a/app.php b/app.php
-index 5f91e4d..09c6010 100644
---- a/app.php
-+++ b/app.php
-@@ -23,7 +23,7 @@ else
+From 931958d8f11cb55f2e88a178a3b828f3c537eba8 Mon Sep 17 00:00:00 2001

+From: Maximilian Bosch <maximilian@mbosch.me>

+Date: Fri, 6 Mar 2020 23:43:58 +0100

+Subject: [PATCH] Define configs with env vars

+

+---

+ app.php                      | 4 ++--

+ services/DatabaseService.php | 2 +-

+ services/FilesService.php    | 2 +-

+ services/StockService.php    | 2 +-

+ 4 files changed, 5 insertions(+), 5 deletions(-)

+

+diff --git a/app.php b/app.php

+index af65ad1..4963c28 100644

+--- a/app.php

++++ b/app.php

+@@ -25,7 +25,7 @@ else

  require_once __DIR__ . '/vendor/autoload.php';

  

  // Load config files

@@ -11,20 +23,20 @@ index 5f91e4d..09c6010 100644
  require_once __DIR__ . '/config-dist.php'; // For not in own config defined values we use the default ones

  

  // Definitions for dev/demo/prerelease mode

-@@ -49,7 +49,7 @@ $appContainer = new \Slim\Container([
- 	],

- 	'view' => function($container)

- 	{

--		return new \Slim\Views\Blade(__DIR__ . '/views', GROCY_DATAPATH . '/viewcache');

-+		return new \Slim\Views\Blade(__DIR__ . '/views', getenv('GROCY_CACHE_DIR'));

- 	},

- 	'LoginControllerInstance' => function($container)

- 	{

-diff --git a/services/DatabaseService.php b/services/DatabaseService.php
-index 0bcf9b8..ec45e93 100644
---- a/services/DatabaseService.php
-+++ b/services/DatabaseService.php
-@@ -13,7 +13,7 @@ class DatabaseService
+@@ -50,7 +50,7 @@ $app = AppFactory::create();

+ $container = $app->getContainer();

+ $container->set('view', function(Container $container)

+ {

+-	return new Slim\Views\Blade(__DIR__ . '/views', GROCY_DATAPATH . '/viewcache');

++	return new \Slim\Views\Blade(__DIR__ . '/views', getenv('GROCY_CACHE_DIR'));

+ });

+ $container->set('LoginControllerInstance', function(Container $container)

+ {

+diff --git a/services/DatabaseService.php b/services/DatabaseService.php

+index 23fc7b9..daa1993 100644

+--- a/services/DatabaseService.php

++++ b/services/DatabaseService.php

+@@ -25,7 +25,7 @@ class DatabaseService

  			return GROCY_DATAPATH . '/grocy_' . GROCY_CULTURE . '.db';

  		}

  

@@ -32,25 +44,25 @@ index 0bcf9b8..ec45e93 100644
 +		return getenv('GROCY_DB_FILE');

  	}

  

- 	private $DbConnectionRaw;

-diff --git a/services/FilesService.php b/services/FilesService.php
-index 7933b73..f52657e 100644
---- a/services/FilesService.php
-+++ b/services/FilesService.php
-@@ -12,7 +12,7 @@ class FilesService extends BaseService
+     private static $DbConnectionRaw = null;

+diff --git a/services/FilesService.php b/services/FilesService.php

+index cecdae3..357298d 100644

+--- a/services/FilesService.php

++++ b/services/FilesService.php

+@@ -12,7 +12,7 @@ class FilesService extends BaseService

  	{

  		parent::__construct();

- 		

+ 

 -		$this->StoragePath = GROCY_DATAPATH . '/storage';

 +		$this->StoragePath = getenv('GROCY_STORAGE_DIR');

- 		

+ 

  		if (!file_exists($this->StoragePath))

  		{

-diff --git a/services/StockService.php b/services/StockService.php
-index d7482ef..d1399a7 100644
---- a/services/StockService.php
-+++ b/services/StockService.php
-@@ -933,7 +933,7 @@ class StockService extends BaseService
+diff --git a/services/StockService.php b/services/StockService.php

+index bfde3fc..53b2245 100644

+--- a/services/StockService.php

++++ b/services/StockService.php

+@@ -934,7 +934,7 @@ class StockService extends BaseService

  			throw new \Exception('No barcode lookup plugin defined');

  		}

  

@@ -59,3 +71,6 @@ index d7482ef..d1399a7 100644
  		if (file_exists($path))

  		{

  			require_once $path;

+-- 

+2.25.0

+

diff --git a/pkgs/servers/grocy/default.nix b/pkgs/servers/grocy/default.nix
index 7af59f6904c5..718d4b1bcded 100644
--- a/pkgs/servers/grocy/default.nix
+++ b/pkgs/servers/grocy/default.nix
@@ -2,11 +2,11 @@
 
 stdenv.mkDerivation rec {
   pname = "grocy";
-  version = "2.6.0";
+  version = "2.6.1";
 
   src = fetchurl {
     url = "https://github.com/grocy/grocy/releases/download/v${version}/grocy_${version}.zip";
-    sha256 = "1d4hy495in7p0i4fnhai1yqhjhmblv1g30siggmqpjrzdiiw3bak";
+    sha256 = "1fq1zlxxhpcxj67xxlgf20dia95xcimgnm13cr56sy9f2vjx58m6";
   };
 
   nativeBuildInputs = [ unzip ];
@@ -14,7 +14,8 @@ stdenv.mkDerivation rec {
     unzip ${src} -d .
   '';
 
-  patches = [ ./config-locations.patch ];
+  patches = [ ./0001-Define-configs-with-env-vars.patch ];
+  patchFlags = [ "--binary" "-p1" ];
 
   dontBuild = true;
 
diff --git a/pkgs/servers/home-assistant/component-packages.nix b/pkgs/servers/home-assistant/component-packages.nix
index 0dfb69b95384..6b18dd30f308 100644
--- a/pkgs/servers/home-assistant/component-packages.nix
+++ b/pkgs/servers/home-assistant/component-packages.nix
@@ -2,911 +2,918 @@
 # Do not edit!
 
 {
-  version = "0.104.3";
+  version = "0.106.6";
   components = {
-    "abode" = ps: with ps; [  ];
-    "acer_projector" = ps: with ps; [ pyserial ];
-    "actiontec" = ps: with ps; [  ];
-    "adguard" = ps: with ps; [  ];
-    "ads" = ps: with ps; [  ];
-    "aftership" = ps: with ps; [  ];
-    "air_quality" = ps: with ps; [  ];
-    "airly" = ps: with ps; [  ];
-    "airvisual" = ps: with ps; [ pyairvisual ];
-    "aladdin_connect" = ps: with ps; [  ];
-    "alarm_control_panel" = ps: with ps; [  ];
-    "alarmdecoder" = ps: with ps; [  ];
-    "alarmdotcom" = ps: with ps; [  ];
-    "alert" = ps: with ps; [  ];
-    "alexa" = ps: with ps; [ aiohttp-cors ];
-    "almond" = ps: with ps; [ aiohttp-cors ];
-    "alpha_vantage" = ps: with ps; [  ];
-    "amazon_polly" = ps: with ps; [ boto3 ];
-    "ambiclimate" = ps: with ps; [ aiohttp-cors ];
-    "ambient_station" = ps: with ps; [  ];
-    "amcrest" = ps: with ps; [ ha-ffmpeg ];
-    "ampio" = ps: with ps; [  ];
-    "android_ip_webcam" = ps: with ps; [  ];
-    "androidtv" = ps: with ps; [  ];
-    "anel_pwrctrl" = ps: with ps; [  ];
-    "anthemav" = ps: with ps; [  ];
-    "apache_kafka" = ps: with ps; [ aiokafka ];
-    "apcupsd" = ps: with ps; [  ];
-    "api" = ps: with ps; [ aiohttp-cors ];
-    "apns" = ps: with ps; [  ];
-    "apple_tv" = ps: with ps; [ pyatv ];
-    "apprise" = ps: with ps; [ apprise ];
-    "aprs" = ps: with ps; [  ];
-    "aqualogic" = ps: with ps; [  ];
-    "aquostv" = ps: with ps; [  ];
-    "arcam_fmj" = ps: with ps; [  ];
-    "arduino" = ps: with ps; [  ];
-    "arest" = ps: with ps; [  ];
-    "arlo" = ps: with ps; [ ha-ffmpeg ];
-    "aruba" = ps: with ps; [ pexpect ];
-    "arwn" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt ];
-    "asterisk_cdr" = ps: with ps; [  ];
-    "asterisk_mbox" = ps: with ps; [  ];
-    "asuswrt" = ps: with ps; [  ];
-    "aten_pe" = ps: with ps; [  ];
-    "atome" = ps: with ps; [  ];
-    "august" = ps: with ps; [  ];
-    "aurora" = ps: with ps; [  ];
-    "aurora_abb_powerone" = ps: with ps; [  ];
-    "auth" = ps: with ps; [ aiohttp-cors ];
-    "automatic" = ps: with ps; [ aiohttp-cors ];
-    "automation" = ps: with ps; [ aiohttp-cors ];
-    "avea" = ps: with ps; [  ];
-    "avion" = ps: with ps; [  ];
-    "awair" = ps: with ps; [  ];
-    "aws" = ps: with ps; [  ];
-    "axis" = ps: with ps; [  ];
-    "azure_event_hub" = ps: with ps; [  ];
-    "azure_service_bus" = ps: with ps; [ azure-servicebus ];
-    "baidu" = ps: with ps; [  ];
-    "bayesian" = ps: with ps; [  ];
-    "bbb_gpio" = ps: with ps; [  ];
-    "bbox" = ps: with ps; [  ];
-    "beewi_smartclim" = ps: with ps; [  ];
-    "bh1750" = ps: with ps; [  ];
-    "binary_sensor" = ps: with ps; [  ];
-    "bitcoin" = ps: with ps; [  ];
-    "bizkaibus" = ps: with ps; [  ];
-    "blackbird" = ps: with ps; [  ];
-    "blink" = ps: with ps; [  ];
-    "blinksticklight" = ps: with ps; [ BlinkStick ];
-    "blinkt" = ps: with ps; [  ];
-    "blockchain" = ps: with ps; [  ];
-    "bloomsky" = ps: with ps; [  ];
-    "bluesound" = ps: with ps; [ xmltodict ];
-    "bluetooth_le_tracker" = ps: with ps; [  ];
-    "bluetooth_tracker" = ps: with ps; [ bt_proximity ];
-    "bme280" = ps: with ps; [  ];
-    "bme680" = ps: with ps; [  ];
-    "bmw_connected_drive" = ps: with ps; [  ];
-    "bom" = ps: with ps; [  ];
-    "braviatv" = ps: with ps; [  ];
-    "broadlink" = ps: with ps; [ broadlink ];
-    "brother" = ps: with ps; [  ];
-    "brottsplatskartan" = ps: with ps; [  ];
-    "browser" = ps: with ps; [  ];
-    "brunt" = ps: with ps; [  ];
-    "bt_home_hub_5" = ps: with ps; [  ];
-    "bt_smarthub" = ps: with ps; [  ];
-    "buienradar" = ps: with ps; [  ];
-    "caldav" = ps: with ps; [ caldav ];
-    "calendar" = ps: with ps; [ aiohttp-cors ];
-    "camera" = ps: with ps; [ aiohttp-cors ];
-    "canary" = ps: with ps; [ ha-ffmpeg ];
-    "cast" = ps: with ps; [ PyChromecast ];
-    "cert_expiry" = ps: with ps; [  ];
-    "channels" = ps: with ps; [  ];
-    "cisco_ios" = ps: with ps; [ pexpect ];
-    "cisco_mobility_express" = ps: with ps; [  ];
-    "cisco_webex_teams" = ps: with ps; [  ];
-    "ciscospark" = ps: with ps; [  ];
-    "citybikes" = ps: with ps; [  ];
-    "clementine" = ps: with ps; [  ];
-    "clickatell" = ps: with ps; [  ];
-    "clicksend" = ps: with ps; [  ];
-    "clicksend_tts" = ps: with ps; [  ];
-    "climate" = ps: with ps; [  ];
-    "cloud" = ps: with ps; [ aiohttp-cors hass-nabucasa ];
-    "cloudflare" = ps: with ps; [  ];
-    "cmus" = ps: with ps; [  ];
-    "co2signal" = ps: with ps; [  ];
-    "coinbase" = ps: with ps; [  ];
-    "coinmarketcap" = ps: with ps; [ coinmarketcap ];
-    "comed_hourly_pricing" = ps: with ps; [  ];
-    "comfoconnect" = ps: with ps; [  ];
-    "command_line" = ps: with ps; [  ];
-    "concord232" = ps: with ps; [  ];
-    "config" = ps: with ps; [ aiohttp-cors ];
-    "configurator" = ps: with ps; [  ];
-    "conversation" = ps: with ps; [ aiohttp-cors ];
-    "coolmaster" = ps: with ps; [  ];
-    "counter" = ps: with ps; [  ];
-    "cover" = ps: with ps; [  ];
-    "cppm_tracker" = ps: with ps; [  ];
-    "cpuspeed" = ps: with ps; [ py-cpuinfo ];
-    "crimereports" = ps: with ps; [  ];
-    "cups" = ps: with ps; [ pycups ];
-    "currencylayer" = ps: with ps; [  ];
-    "daikin" = ps: with ps; [  ];
-    "danfoss_air" = ps: with ps; [  ];
-    "darksky" = ps: with ps; [ python-forecastio ];
-    "datadog" = ps: with ps; [ datadog ];
-    "ddwrt" = ps: with ps; [  ];
-    "deconz" = ps: with ps; [  ];
-    "decora" = ps: with ps; [  ];
-    "decora_wifi" = ps: with ps; [  ];
-    "default_config" = ps: with ps; [ pynacl aiohttp-cors defusedxml distro hass-nabucasa netdisco sqlalchemy zeroconf ];
-    "delijn" = ps: with ps; [  ];
-    "deluge" = ps: with ps; [ deluge-client ];
-    "demo" = ps: with ps; [ aiohttp-cors ];
-    "denon" = ps: with ps; [  ];
-    "denonavr" = ps: with ps; [  ];
-    "deutsche_bahn" = ps: with ps; [  ];
-    "device_automation" = ps: with ps; [ aiohttp-cors ];
-    "device_sun_light_trigger" = ps: with ps; [  ];
-    "device_tracker" = ps: with ps; [  ];
-    "dht" = ps: with ps; [  ];
-    "dialogflow" = ps: with ps; [ aiohttp-cors ];
-    "digital_ocean" = ps: with ps; [ digital-ocean ];
-    "digitalloggers" = ps: with ps; [  ];
-    "directv" = ps: with ps; [  ];
-    "discogs" = ps: with ps; [ discogs_client ];
-    "discord" = ps: with ps; [ discordpy ];
-    "discovery" = ps: with ps; [ netdisco ];
-    "dlib_face_detect" = ps: with ps; [ face_recognition ];
-    "dlib_face_identify" = ps: with ps; [ face_recognition ];
-    "dlink" = ps: with ps; [  ];
-    "dlna_dmr" = ps: with ps; [  ];
-    "dnsip" = ps: with ps; [ aiodns ];
-    "dominos" = ps: with ps; [ aiohttp-cors ];
-    "doods" = ps: with ps; [ pillow ];
-    "doorbird" = ps: with ps; [ aiohttp-cors ];
-    "dovado" = ps: with ps; [  ];
-    "downloader" = ps: with ps; [  ];
-    "dsmr" = ps: with ps; [  ];
-    "dsmr_reader" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt ];
-    "dte_energy_bridge" = ps: with ps; [  ];
-    "dublin_bus_transport" = ps: with ps; [  ];
-    "duckdns" = ps: with ps; [  ];
-    "duke_energy" = ps: with ps; [  ];
-    "dunehd" = ps: with ps; [  ];
-    "dwd_weather_warnings" = ps: with ps; [  ];
-    "dweet" = ps: with ps; [  ];
-    "dyson" = ps: with ps; [  ];
-    "ebox" = ps: with ps; [  ];
-    "ebusd" = ps: with ps; [  ];
-    "ecoal_boiler" = ps: with ps; [  ];
-    "ecobee" = ps: with ps; [  ];
-    "econet" = ps: with ps; [  ];
-    "ecovacs" = ps: with ps; [  ];
-    "eddystone_temperature" = ps: with ps; [ construct ];
-    "edimax" = ps: with ps; [  ];
-    "ee_brightbox" = ps: with ps; [  ];
-    "efergy" = ps: with ps; [  ];
-    "egardia" = ps: with ps; [  ];
-    "eight_sleep" = ps: with ps; [  ];
-    "elgato" = ps: with ps; [  ];
-    "eliqonline" = ps: with ps; [  ];
-    "elkm1" = ps: with ps; [  ];
-    "elv" = ps: with ps; [  ];
-    "emby" = ps: with ps; [  ];
-    "emoncms" = ps: with ps; [  ];
-    "emoncms_history" = ps: with ps; [  ];
-    "emulated_hue" = ps: with ps; [ aiohttp-cors ];
-    "emulated_roku" = ps: with ps; [  ];
-    "enigma2" = ps: with ps; [  ];
-    "enocean" = ps: with ps; [  ];
-    "enphase_envoy" = ps: with ps; [  ];
-    "entur_public_transport" = ps: with ps; [  ];
-    "environment_canada" = ps: with ps; [  ];
-    "envirophat" = ps: with ps; [  ];
-    "envisalink" = ps: with ps; [  ];
-    "ephember" = ps: with ps; [  ];
-    "epson" = ps: with ps; [  ];
-    "epsonworkforce" = ps: with ps; [  ];
-    "eq3btsmart" = ps: with ps; [ construct ];
-    "esphome" = ps: with ps; [ aioesphomeapi ];
-    "essent" = ps: with ps; [  ];
-    "etherscan" = ps: with ps; [  ];
-    "eufy" = ps: with ps; [  ];
-    "everlights" = ps: with ps; [  ];
-    "evohome" = ps: with ps; [  ];
-    "facebook" = ps: with ps; [  ];
-    "facebox" = ps: with ps; [  ];
-    "fail2ban" = ps: with ps; [  ];
-    "familyhub" = ps: with ps; [  ];
-    "fan" = ps: with ps; [  ];
-    "fastdotcom" = ps: with ps; [  ];
-    "feedreader" = ps: with ps; [  ];
-    "ffmpeg" = ps: with ps; [ ha-ffmpeg ];
-    "ffmpeg_motion" = ps: with ps; [ ha-ffmpeg ];
-    "ffmpeg_noise" = ps: with ps; [ ha-ffmpeg ];
-    "fibaro" = ps: with ps; [  ];
-    "fido" = ps: with ps; [  ];
-    "file" = ps: with ps; [  ];
-    "filesize" = ps: with ps; [  ];
-    "filter" = ps: with ps; [ aiohttp-cors sqlalchemy ];
-    "fints" = ps: with ps; [ fints ];
-    "fitbit" = ps: with ps; [ aiohttp-cors fitbit ];
-    "fixer" = ps: with ps; [  ];
-    "fleetgo" = ps: with ps; [  ];
-    "flexit" = ps: with ps; [  ];
-    "flic" = ps: with ps; [  ];
-    "flock" = ps: with ps; [  ];
-    "flume" = ps: with ps; [  ];
-    "flunearyou" = ps: with ps; [  ];
-    "flux" = ps: with ps; [  ];
-    "flux_led" = ps: with ps; [  ];
-    "folder" = ps: with ps; [  ];
-    "folder_watcher" = ps: with ps; [ watchdog ];
-    "foobot" = ps: with ps; [  ];
-    "fortigate" = ps: with ps; [  ];
-    "fortios" = ps: with ps; [  ];
-    "foscam" = ps: with ps; [  ];
-    "foursquare" = ps: with ps; [ aiohttp-cors ];
-    "free_mobile" = ps: with ps; [  ];
-    "freebox" = ps: with ps; [  ];
-    "freedns" = ps: with ps; [  ];
-    "fritz" = ps: with ps; [ fritzconnection ];
-    "fritzbox" = ps: with ps; [  ];
-    "fritzbox_callmonitor" = ps: with ps; [ fritzconnection ];
-    "fritzbox_netmonitor" = ps: with ps; [ fritzconnection ];
-    "fritzdect" = ps: with ps; [  ];
-    "fronius" = ps: with ps; [  ];
-    "frontend" = ps: with ps; [ aiohttp-cors ];
-    "frontier_silicon" = ps: with ps; [  ];
-    "futurenow" = ps: with ps; [  ];
-    "garadget" = ps: with ps; [  ];
-    "gc100" = ps: with ps; [  ];
-    "gearbest" = ps: with ps; [  ];
-    "geizhals" = ps: with ps; [  ];
-    "generic" = ps: with ps; [  ];
-    "generic_thermostat" = ps: with ps; [  ];
-    "geniushub" = ps: with ps; [  ];
-    "geo_json_events" = ps: with ps; [  ];
-    "geo_location" = ps: with ps; [  ];
-    "geo_rss_events" = ps: with ps; [  ];
-    "geofency" = ps: with ps; [ aiohttp-cors ];
-    "geonetnz_quakes" = ps: with ps; [  ];
-    "geonetnz_volcano" = ps: with ps; [  ];
-    "gios" = ps: with ps; [  ];
-    "github" = ps: with ps; [ PyGithub ];
-    "gitlab_ci" = ps: with ps; [ python-gitlab ];
-    "gitter" = ps: with ps; [  ];
-    "glances" = ps: with ps; [  ];
-    "gntp" = ps: with ps; [  ];
-    "goalfeed" = ps: with ps; [  ];
-    "gogogate2" = ps: with ps; [  ];
-    "google" = ps: with ps; [ google_api_python_client httplib2 oauth2client ];
-    "google_assistant" = ps: with ps; [ aiohttp-cors ];
-    "google_cloud" = ps: with ps; [ google_cloud_texttospeech ];
-    "google_domains" = ps: with ps; [  ];
-    "google_maps" = ps: with ps; [  ];
-    "google_pubsub" = ps: with ps; [ google_cloud_pubsub ];
-    "google_translate" = ps: with ps; [ gtts-token ];
-    "google_travel_time" = ps: with ps; [  ];
-    "google_wifi" = ps: with ps; [  ];
-    "gpmdp" = ps: with ps; [ websocket_client ];
-    "gpsd" = ps: with ps; [  ];
-    "gpslogger" = ps: with ps; [ aiohttp-cors ];
-    "graphite" = ps: with ps; [  ];
-    "greeneye_monitor" = ps: with ps; [  ];
-    "greenwave" = ps: with ps; [  ];
-    "group" = ps: with ps; [  ];
-    "growatt_server" = ps: with ps; [  ];
-    "gstreamer" = ps: with ps; [  ];
-    "gtfs" = ps: with ps; [  ];
-    "habitica" = ps: with ps; [  ];
-    "hangouts" = ps: with ps; [  ];
-    "harman_kardon_avr" = ps: with ps; [  ];
-    "harmony" = ps: with ps; [  ];
-    "hassio" = ps: with ps; [ aiohttp-cors ];
-    "haveibeenpwned" = ps: with ps; [  ];
-    "hddtemp" = ps: with ps; [  ];
-    "hdmi_cec" = ps: with ps; [  ];
-    "heatmiser" = ps: with ps; [  ];
-    "heos" = ps: with ps; [  ];
-    "here_travel_time" = ps: with ps; [  ];
-    "hikvision" = ps: with ps; [  ];
-    "hikvisioncam" = ps: with ps; [  ];
-    "hisense_aehw4a1" = ps: with ps; [  ];
-    "history" = ps: with ps; [ aiohttp-cors sqlalchemy ];
-    "history_graph" = ps: with ps; [ aiohttp-cors sqlalchemy ];
-    "history_stats" = ps: with ps; [ aiohttp-cors sqlalchemy ];
-    "hitron_coda" = ps: with ps; [  ];
-    "hive" = ps: with ps; [  ];
-    "hlk_sw16" = ps: with ps; [  ];
-    "homeassistant" = ps: with ps; [  ];
-    "homekit" = ps: with ps; [  ];
-    "homekit_controller" = ps: with ps; [  ];
-    "homematic" = ps: with ps; [ pyhomematic ];
-    "homematicip_cloud" = ps: with ps; [  ];
-    "homeworks" = ps: with ps; [  ];
-    "honeywell" = ps: with ps; [  ];
-    "hook" = ps: with ps; [  ];
-    "horizon" = ps: with ps; [  ];
-    "hp_ilo" = ps: with ps; [  ];
-    "html5" = ps: with ps; [ aiohttp-cors pywebpush ];
-    "http" = ps: with ps; [ aiohttp-cors ];
-    "htu21d" = ps: with ps; [  ];
-    "huawei_lte" = ps: with ps; [ stringcase ];
-    "huawei_router" = ps: with ps; [  ];
-    "hue" = ps: with ps; [ aiohue ];
-    "hunterdouglas_powerview" = ps: with ps; [  ];
-    "hydrawise" = ps: with ps; [  ];
-    "hyperion" = ps: with ps; [  ];
-    "ialarm" = ps: with ps; [  ];
-    "iaqualink" = ps: with ps; [  ];
-    "icloud" = ps: with ps; [ pyicloud ];
-    "idteck_prox" = ps: with ps; [  ];
-    "ifttt" = ps: with ps; [ aiohttp-cors pyfttt ];
-    "iglo" = ps: with ps; [  ];
-    "ign_sismologia" = ps: with ps; [  ];
-    "ihc" = ps: with ps; [ defusedxml ];
-    "image_processing" = ps: with ps; [ aiohttp-cors ];
-    "imap" = ps: with ps; [  ];
-    "imap_email_content" = ps: with ps; [  ];
-    "incomfort" = ps: with ps; [  ];
-    "influxdb" = ps: with ps; [ influxdb ];
-    "input_boolean" = ps: with ps; [  ];
-    "input_datetime" = ps: with ps; [  ];
-    "input_number" = ps: with ps; [  ];
-    "input_select" = ps: with ps; [  ];
-    "input_text" = ps: with ps; [  ];
-    "insteon" = ps: with ps; [  ];
-    "integration" = ps: with ps; [  ];
-    "intent" = ps: with ps; [ aiohttp-cors ];
-    "intent_script" = ps: with ps; [  ];
-    "intesishome" = ps: with ps; [  ];
-    "ios" = ps: with ps; [ aiohttp-cors zeroconf ];
-    "iota" = ps: with ps; [  ];
-    "iperf3" = ps: with ps; [  ];
-    "ipma" = ps: with ps; [  ];
-    "iqvia" = ps: with ps; [ numpy ];
-    "irish_rail_transport" = ps: with ps; [  ];
-    "islamic_prayer_times" = ps: with ps; [  ];
-    "iss" = ps: with ps; [  ];
-    "isy994" = ps: with ps; [  ];
-    "itach" = ps: with ps; [  ];
-    "itunes" = ps: with ps; [  ];
-    "izone" = ps: with ps; [  ];
-    "jewish_calendar" = ps: with ps; [  ];
-    "joaoapps_join" = ps: with ps; [  ];
-    "juicenet" = ps: with ps; [  ];
-    "kaiterra" = ps: with ps; [  ];
-    "kankun" = ps: with ps; [  ];
-    "keba" = ps: with ps; [  ];
-    "keenetic_ndms2" = ps: with ps; [  ];
-    "kef" = ps: with ps; [  ];
-    "keyboard" = ps: with ps; [  ];
-    "keyboard_remote" = ps: with ps; [ evdev ];
-    "kira" = ps: with ps; [  ];
-    "kiwi" = ps: with ps; [  ];
-    "knx" = ps: with ps; [  ];
-    "kodi" = ps: with ps; [ jsonrpc-async jsonrpc-websocket ];
-    "konnected" = ps: with ps; [ aiohttp-cors ];
-    "kwb" = ps: with ps; [  ];
-    "lacrosse" = ps: with ps; [  ];
-    "lametric" = ps: with ps; [  ];
-    "lannouncer" = ps: with ps; [  ];
-    "lastfm" = ps: with ps; [ pylast ];
-    "launch_library" = ps: with ps; [  ];
-    "lcn" = ps: with ps; [  ];
-    "lg_netcast" = ps: with ps; [  ];
-    "lg_soundbar" = ps: with ps; [  ];
-    "life360" = ps: with ps; [  ];
-    "lifx" = ps: with ps; [ aiolifx aiolifx-effects ];
-    "lifx_cloud" = ps: with ps; [  ];
-    "lifx_legacy" = ps: with ps; [  ];
-    "light" = ps: with ps; [  ];
-    "lightwave" = ps: with ps; [  ];
-    "limitlessled" = ps: with ps; [ limitlessled ];
-    "linksys_smart" = ps: with ps; [  ];
-    "linky" = ps: with ps; [  ];
-    "linode" = ps: with ps; [ linode-api ];
-    "linux_battery" = ps: with ps; [ batinfo ];
-    "lirc" = ps: with ps; [  ];
-    "litejet" = ps: with ps; [  ];
-    "liveboxplaytv" = ps: with ps; [  ];
-    "llamalab_automate" = ps: with ps; [  ];
-    "local_file" = ps: with ps; [  ];
-    "local_ip" = ps: with ps; [  ];
-    "locative" = ps: with ps; [ aiohttp-cors ];
-    "lock" = ps: with ps; [  ];
-    "lockitron" = ps: with ps; [  ];
-    "logbook" = ps: with ps; [ aiohttp-cors sqlalchemy ];
-    "logentries" = ps: with ps; [  ];
-    "logger" = ps: with ps; [  ];
-    "logi_circle" = ps: with ps; [ aiohttp-cors ha-ffmpeg ];
-    "london_air" = ps: with ps; [  ];
-    "london_underground" = ps: with ps; [  ];
-    "loopenergy" = ps: with ps; [  ];
-    "lovelace" = ps: with ps; [  ];
-    "luci" = ps: with ps; [  ];
-    "luftdaten" = ps: with ps; [ luftdaten ];
-    "lupusec" = ps: with ps; [  ];
-    "lutron" = ps: with ps; [  ];
-    "lutron_caseta" = ps: with ps; [  ];
-    "lw12wifi" = ps: with ps; [  ];
-    "lyft" = ps: with ps; [  ];
-    "magicseaweed" = ps: with ps; [  ];
-    "mailbox" = ps: with ps; [ aiohttp-cors ];
-    "mailgun" = ps: with ps; [ aiohttp-cors ];
-    "manual" = ps: with ps; [  ];
-    "manual_mqtt" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt ];
-    "map" = ps: with ps; [ aiohttp-cors ];
-    "marytts" = ps: with ps; [  ];
-    "mastodon" = ps: with ps; [  ];
-    "matrix" = ps: with ps; [ matrix-client ];
-    "maxcube" = ps: with ps; [  ];
-    "mcp23017" = ps: with ps; [  ];
-    "media_extractor" = ps: with ps; [ aiohttp-cors youtube-dl-light ];
-    "media_player" = ps: with ps; [ aiohttp-cors ];
-    "mediaroom" = ps: with ps; [  ];
-    "melissa" = ps: with ps; [  ];
-    "meraki" = ps: with ps; [ aiohttp-cors ];
-    "message_bird" = ps: with ps; [  ];
-    "met" = ps: with ps; [  ];
-    "meteo_france" = ps: with ps; [  ];
-    "meteoalarm" = ps: with ps; [  ];
-    "metoffice" = ps: with ps; [  ];
-    "mfi" = ps: with ps; [  ];
-    "mhz19" = ps: with ps; [  ];
-    "microsoft" = ps: with ps; [  ];
-    "microsoft_face" = ps: with ps; [ aiohttp-cors ];
-    "microsoft_face_detect" = ps: with ps; [ aiohttp-cors ];
-    "microsoft_face_identify" = ps: with ps; [ aiohttp-cors ];
-    "miflora" = ps: with ps; [  ];
-    "mikrotik" = ps: with ps; [  ];
-    "mill" = ps: with ps; [  ];
-    "min_max" = ps: with ps; [  ];
-    "minio" = ps: with ps; [ minio ];
-    "mitemp_bt" = ps: with ps; [  ];
-    "mjpeg" = ps: with ps; [  ];
-    "mobile_app" = ps: with ps; [ pynacl aiohttp-cors ];
-    "mochad" = ps: with ps; [  ];
-    "modbus" = ps: with ps; [  ];
-    "modem_callerid" = ps: with ps; [  ];
-    "mold_indicator" = ps: with ps; [  ];
-    "monoprice" = ps: with ps; [  ];
-    "moon" = ps: with ps; [  ];
-    "mopar" = ps: with ps; [  ];
-    "mpchc" = ps: with ps; [  ];
-    "mpd" = ps: with ps; [ mpd2 ];
-    "mqtt" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt ];
-    "mqtt_eventstream" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt ];
-    "mqtt_json" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt ];
-    "mqtt_room" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt ];
-    "mqtt_statestream" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt ];
-    "msteams" = ps: with ps; [  ];
-    "mvglive" = ps: with ps; [ PyMVGLive ];
-    "mychevy" = ps: with ps; [  ];
-    "mycroft" = ps: with ps; [  ];
-    "myq" = ps: with ps; [  ];
-    "mysensors" = ps: with ps; [  ];
-    "mystrom" = ps: with ps; [ aiohttp-cors ];
-    "mythicbeastsdns" = ps: with ps; [  ];
-    "n26" = ps: with ps; [  ];
-    "nad" = ps: with ps; [  ];
-    "namecheapdns" = ps: with ps; [ defusedxml ];
-    "nanoleaf" = ps: with ps; [  ];
-    "neato" = ps: with ps; [ pybotvac ];
-    "nederlandse_spoorwegen" = ps: with ps; [  ];
-    "nello" = ps: with ps; [  ];
-    "ness_alarm" = ps: with ps; [  ];
-    "nest" = ps: with ps; [  ];
-    "netatmo" = ps: with ps; [ aiohttp-cors pyatmo ];
-    "netdata" = ps: with ps; [  ];
-    "netgear" = ps: with ps; [  ];
-    "netgear_lte" = ps: with ps; [  ];
-    "netio" = ps: with ps; [ aiohttp-cors ];
-    "neurio_energy" = ps: with ps; [  ];
-    "nextbus" = ps: with ps; [  ];
-    "nfandroidtv" = ps: with ps; [  ];
-    "niko_home_control" = ps: with ps; [  ];
-    "nilu" = ps: with ps; [  ];
-    "nissan_leaf" = ps: with ps; [  ];
-    "nmap_tracker" = ps: with ps; [  ];
-    "nmbs" = ps: with ps; [  ];
-    "no_ip" = ps: with ps; [  ];
-    "noaa_tides" = ps: with ps; [  ];
-    "norway_air" = ps: with ps; [  ];
-    "notify" = ps: with ps; [  ];
-    "notion" = ps: with ps; [  ];
-    "nsw_fuel_station" = ps: with ps; [  ];
-    "nsw_rural_fire_service_feed" = ps: with ps; [  ];
-    "nuheat" = ps: with ps; [  ];
-    "nuimo_controller" = ps: with ps; [  ];
-    "nuki" = ps: with ps; [  ];
-    "nut" = ps: with ps; [  ];
-    "nws" = ps: with ps; [  ];
-    "nx584" = ps: with ps; [  ];
-    "nzbget" = ps: with ps; [  ];
-    "oasa_telematics" = ps: with ps; [  ];
-    "obihai" = ps: with ps; [  ];
-    "octoprint" = ps: with ps; [  ];
-    "oem" = ps: with ps; [  ];
-    "ohmconnect" = ps: with ps; [ defusedxml ];
-    "ombi" = ps: with ps; [  ];
-    "onboarding" = ps: with ps; [ aiohttp-cors ];
-    "onewire" = ps: with ps; [  ];
-    "onkyo" = ps: with ps; [ onkyo-eiscp ];
-    "onvif" = ps: with ps; [ ha-ffmpeg ];
-    "openalpr_cloud" = ps: with ps; [  ];
-    "openalpr_local" = ps: with ps; [  ];
-    "opencv" = ps: with ps; [ numpy ];
-    "openevse" = ps: with ps; [  ];
-    "openexchangerates" = ps: with ps; [  ];
-    "opengarage" = ps: with ps; [  ];
-    "openhardwaremonitor" = ps: with ps; [  ];
-    "openhome" = ps: with ps; [  ];
-    "opensensemap" = ps: with ps; [  ];
-    "opensky" = ps: with ps; [  ];
-    "opentherm_gw" = ps: with ps; [  ];
-    "openuv" = ps: with ps; [  ];
-    "openweathermap" = ps: with ps; [ pyowm ];
-    "opple" = ps: with ps; [  ];
-    "orangepi_gpio" = ps: with ps; [  ];
-    "oru" = ps: with ps; [  ];
-    "orvibo" = ps: with ps; [  ];
-    "osramlightify" = ps: with ps; [  ];
-    "otp" = ps: with ps; [ pyotp ];
-    "owlet" = ps: with ps; [  ];
-    "owntracks" = ps: with ps; [ pynacl aiohttp-cors ];
-    "panasonic_bluray" = ps: with ps; [  ];
-    "panasonic_viera" = ps: with ps; [ wakeonlan ];
-    "pandora" = ps: with ps; [ pexpect ];
-    "panel_custom" = ps: with ps; [ aiohttp-cors ];
-    "panel_iframe" = ps: with ps; [ aiohttp-cors ];
-    "pcal9535a" = ps: with ps; [  ];
-    "pencom" = ps: with ps; [  ];
-    "persistent_notification" = ps: with ps; [  ];
-    "person" = ps: with ps; [  ];
-    "philips_js" = ps: with ps; [  ];
-    "pi_hole" = ps: with ps; [  ];
-    "picotts" = ps: with ps; [  ];
-    "piglow" = ps: with ps; [  ];
-    "pilight" = ps: with ps; [  ];
-    "ping" = ps: with ps; [  ];
-    "pioneer" = ps: with ps; [  ];
-    "pjlink" = ps: with ps; [  ];
-    "plaato" = ps: with ps; [ aiohttp-cors ];
-    "plant" = ps: with ps; [  ];
-    "plex" = ps: with ps; [ aiohttp-cors ];
-    "plugwise" = ps: with ps; [  ];
-    "plum_lightpad" = ps: with ps; [  ];
-    "pocketcasts" = ps: with ps; [  ];
-    "point" = ps: with ps; [ aiohttp-cors ];
-    "postnl" = ps: with ps; [  ];
-    "prezzibenzina" = ps: with ps; [  ];
-    "proliphix" = ps: with ps; [  ];
-    "prometheus" = ps: with ps; [ aiohttp-cors prometheus_client ];
-    "prowl" = ps: with ps; [  ];
-    "proximity" = ps: with ps; [  ];
-    "proxmoxve" = ps: with ps; [  ];
-    "proxy" = ps: with ps; [ pillow ];
-    "ps4" = ps: with ps; [  ];
-    "ptvsd" = ps: with ps; [  ];
-    "pulseaudio_loopback" = ps: with ps; [  ];
-    "push" = ps: with ps; [ aiohttp-cors ];
-    "pushbullet" = ps: with ps; [ pushbullet ];
-    "pushetta" = ps: with ps; [  ];
-    "pushover" = ps: with ps; [ python-pushover ];
-    "pushsafer" = ps: with ps; [  ];
-    "pvoutput" = ps: with ps; [  ];
-    "pyload" = ps: with ps; [  ];
-    "python_script" = ps: with ps; [ restrictedpython ];
-    "qbittorrent" = ps: with ps; [  ];
-    "qld_bushfire" = ps: with ps; [  ];
-    "qnap" = ps: with ps; [  ];
-    "qrcode" = ps: with ps; [ pillow ];
-    "quantum_gateway" = ps: with ps; [  ];
-    "qwikswitch" = ps: with ps; [  ];
-    "rachio" = ps: with ps; [ aiohttp-cors ];
-    "radarr" = ps: with ps; [  ];
-    "radiotherm" = ps: with ps; [  ];
-    "rainbird" = ps: with ps; [  ];
-    "raincloud" = ps: with ps; [  ];
-    "rainforest_eagle" = ps: with ps; [  ];
-    "rainmachine" = ps: with ps; [  ];
-    "random" = ps: with ps; [  ];
-    "raspihats" = ps: with ps; [  ];
-    "raspyrfm" = ps: with ps; [  ];
-    "recollect_waste" = ps: with ps; [  ];
-    "recorder" = ps: with ps; [ sqlalchemy ];
-    "recswitch" = ps: with ps; [  ];
-    "reddit" = ps: with ps; [ praw ];
-    "rejseplanen" = ps: with ps; [  ];
-    "remember_the_milk" = ps: with ps; [ httplib2 ];
-    "remote" = ps: with ps; [  ];
-    "remote_rpi_gpio" = ps: with ps; [  ];
-    "repetier" = ps: with ps; [  ];
-    "rest" = ps: with ps; [  ];
-    "rest_command" = ps: with ps; [  ];
-    "rflink" = ps: with ps; [  ];
-    "rfxtrx" = ps: with ps; [  ];
-    "ring" = ps: with ps; [ ha-ffmpeg ];
-    "ripple" = ps: with ps; [  ];
-    "rmvtransport" = ps: with ps; [  ];
-    "rocketchat" = ps: with ps; [  ];
-    "roku" = ps: with ps; [  ];
-    "roomba" = ps: with ps; [  ];
-    "route53" = ps: with ps; [ boto3 ];
-    "rova" = ps: with ps; [  ];
-    "rpi_camera" = ps: with ps; [  ];
-    "rpi_gpio" = ps: with ps; [  ];
-    "rpi_gpio_pwm" = ps: with ps; [  ];
-    "rpi_pfio" = ps: with ps; [  ];
-    "rpi_rf" = ps: with ps; [  ];
-    "rss_feed_template" = ps: with ps; [ aiohttp-cors ];
-    "rtorrent" = ps: with ps; [  ];
-    "russound_rio" = ps: with ps; [  ];
-    "russound_rnet" = ps: with ps; [  ];
-    "sabnzbd" = ps: with ps; [  ];
-    "saj" = ps: with ps; [  ];
-    "samsungtv" = ps: with ps; [ wakeonlan ];
-    "satel_integra" = ps: with ps; [  ];
-    "scene" = ps: with ps; [  ];
-    "scrape" = ps: with ps; [ beautifulsoup4 ];
-    "script" = ps: with ps; [  ];
-    "scsgate" = ps: with ps; [  ];
-    "season" = ps: with ps; [ ephem ];
-    "sendgrid" = ps: with ps; [  ];
-    "sense" = ps: with ps; [  ];
-    "sensehat" = ps: with ps; [  ];
-    "sensibo" = ps: with ps; [  ];
-    "sensor" = ps: with ps; [  ];
-    "sentry" = ps: with ps; [ sentry-sdk ];
-    "serial" = ps: with ps; [ pyserial-asyncio ];
-    "serial_pm" = ps: with ps; [  ];
-    "sesame" = ps: with ps; [  ];
-    "seven_segments" = ps: with ps; [ pillow ];
-    "seventeentrack" = ps: with ps; [  ];
-    "shell_command" = ps: with ps; [  ];
-    "shiftr" = ps: with ps; [ paho-mqtt ];
-    "shodan" = ps: with ps; [ shodan ];
-    "shopping_list" = ps: with ps; [ aiohttp-cors ];
-    "sht31" = ps: with ps; [  ];
-    "sigfox" = ps: with ps; [  ];
-    "signal_messenger" = ps: with ps; [  ];
-    "simplepush" = ps: with ps; [  ];
-    "simplisafe" = ps: with ps; [  ];
-    "simulated" = ps: with ps; [  ];
-    "sinch" = ps: with ps; [  ];
-    "sisyphus" = ps: with ps; [  ];
-    "sky_hub" = ps: with ps; [  ];
-    "skybeacon" = ps: with ps; [  ];
-    "skybell" = ps: with ps; [  ];
-    "slack" = ps: with ps; [  ];
-    "sleepiq" = ps: with ps; [  ];
-    "slide" = ps: with ps; [  ];
-    "sma" = ps: with ps; [  ];
-    "smappee" = ps: with ps; [  ];
-    "smarthab" = ps: with ps; [  ];
-    "smartthings" = ps: with ps; [ aiohttp-cors ];
-    "smarty" = ps: with ps; [  ];
-    "smhi" = ps: with ps; [  ];
-    "smtp" = ps: with ps; [  ];
-    "snapcast" = ps: with ps; [ snapcast ];
-    "snips" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt ];
-    "snmp" = ps: with ps; [ pysnmp ];
-    "sochain" = ps: with ps; [  ];
-    "socialblade" = ps: with ps; [  ];
-    "solaredge" = ps: with ps; [ stringcase ];
-    "solaredge_local" = ps: with ps; [  ];
-    "solarlog" = ps: with ps; [  ];
-    "solax" = ps: with ps; [  ];
-    "soma" = ps: with ps; [  ];
-    "somfy" = ps: with ps; [ aiohttp-cors ];
-    "somfy_mylink" = ps: with ps; [  ];
-    "sonarr" = ps: with ps; [  ];
-    "songpal" = ps: with ps; [  ];
-    "sonos" = ps: with ps; [ pysonos ];
-    "sony_projector" = ps: with ps; [  ];
-    "soundtouch" = ps: with ps; [ libsoundtouch ];
-    "spaceapi" = ps: with ps; [ aiohttp-cors ];
-    "spc" = ps: with ps; [  ];
-    "speedtestdotnet" = ps: with ps; [ speedtest-cli ];
-    "spider" = ps: with ps; [  ];
-    "splunk" = ps: with ps; [  ];
-    "spotcrime" = ps: with ps; [  ];
-    "spotify" = ps: with ps; [ aiohttp-cors ];
-    "sql" = ps: with ps; [ sqlalchemy ];
-    "squeezebox" = ps: with ps; [  ];
-    "ssdp" = ps: with ps; [ defusedxml netdisco ];
-    "starline" = ps: with ps; [  ];
-    "starlingbank" = ps: with ps; [  ];
-    "startca" = ps: with ps; [ xmltodict ];
-    "statistics" = ps: with ps; [  ];
-    "statsd" = ps: with ps; [ statsd ];
-    "steam_online" = ps: with ps; [  ];
-    "stiebel_eltron" = ps: with ps; [  ];
-    "stookalert" = ps: with ps; [  ];
-    "stream" = ps: with ps; [ aiohttp-cors av ];
-    "streamlabswater" = ps: with ps; [  ];
-    "stt" = ps: with ps; [ aiohttp-cors ];
-    "suez_water" = ps: with ps; [  ];
-    "sun" = ps: with ps; [  ];
-    "supervisord" = ps: with ps; [  ];
-    "supla" = ps: with ps; [  ];
-    "surepetcare" = ps: with ps; [  ];
-    "swiss_hydrological_data" = ps: with ps; [  ];
-    "swiss_public_transport" = ps: with ps; [  ];
-    "swisscom" = ps: with ps; [  ];
-    "switch" = ps: with ps; [  ];
-    "switchbot" = ps: with ps; [  ];
-    "switcher_kis" = ps: with ps; [  ];
-    "switchmate" = ps: with ps; [  ];
-    "syncthru" = ps: with ps; [  ];
-    "synology" = ps: with ps; [  ];
-    "synology_chat" = ps: with ps; [  ];
-    "synology_srm" = ps: with ps; [  ];
-    "synologydsm" = ps: with ps; [  ];
-    "syslog" = ps: with ps; [  ];
-    "system_health" = ps: with ps; [ aiohttp-cors ];
-    "system_log" = ps: with ps; [ aiohttp-cors ];
-    "systemmonitor" = ps: with ps; [ psutil ];
-    "tado" = ps: with ps; [  ];
-    "tahoma" = ps: with ps; [  ];
-    "tank_utility" = ps: with ps; [  ];
-    "tapsaff" = ps: with ps; [  ];
-    "tautulli" = ps: with ps; [  ];
-    "tcp" = ps: with ps; [  ];
-    "ted5000" = ps: with ps; [ xmltodict ];
-    "teksavvy" = ps: with ps; [  ];
-    "telegram" = ps: with ps; [ pysocks aiohttp-cors python-telegram-bot ];
-    "telegram_bot" = ps: with ps; [ pysocks aiohttp-cors python-telegram-bot ];
-    "tellduslive" = ps: with ps; [  ];
-    "tellstick" = ps: with ps; [  ];
-    "telnet" = ps: with ps; [  ];
-    "temper" = ps: with ps; [  ];
-    "template" = ps: with ps; [  ];
-    "tensorflow" = ps: with ps; [ numpy pillow protobuf tensorflow ];
-    "tesla" = ps: with ps; [  ];
-    "tfiac" = ps: with ps; [  ];
-    "thermoworks_smoke" = ps: with ps; [ stringcase ];
-    "thethingsnetwork" = ps: with ps; [  ];
-    "thingspeak" = ps: with ps; [  ];
-    "thinkingcleaner" = ps: with ps; [  ];
-    "thomson" = ps: with ps; [  ];
-    "threshold" = ps: with ps; [  ];
-    "tibber" = ps: with ps; [  ];
-    "tikteck" = ps: with ps; [  ];
-    "tile" = ps: with ps; [  ];
-    "time_date" = ps: with ps; [  ];
-    "timer" = ps: with ps; [  ];
-    "tmb" = ps: with ps; [  ];
-    "tod" = ps: with ps; [  ];
-    "todoist" = ps: with ps; [ todoist ];
-    "tof" = ps: with ps; [  ];
-    "tomato" = ps: with ps; [  ];
-    "toon" = ps: with ps; [  ];
-    "torque" = ps: with ps; [ aiohttp-cors ];
-    "totalconnect" = ps: with ps; [  ];
-    "touchline" = ps: with ps; [  ];
-    "tplink" = ps: with ps; [  ];
-    "tplink_lte" = ps: with ps; [  ];
-    "traccar" = ps: with ps; [ aiohttp-cors stringcase ];
-    "trackr" = ps: with ps; [  ];
-    "tradfri" = ps: with ps; [  ];
-    "trafikverket_train" = ps: with ps; [  ];
-    "trafikverket_weatherstation" = ps: with ps; [  ];
-    "transmission" = ps: with ps; [ transmissionrpc ];
-    "transport_nsw" = ps: with ps; [  ];
-    "travisci" = ps: with ps; [  ];
-    "trend" = ps: with ps; [ numpy ];
-    "tts" = ps: with ps; [ aiohttp-cors mutagen ];
-    "tuya" = ps: with ps; [  ];
-    "twentemilieu" = ps: with ps; [  ];
-    "twilio" = ps: with ps; [ aiohttp-cors twilio ];
-    "twilio_call" = ps: with ps; [ aiohttp-cors twilio ];
-    "twilio_sms" = ps: with ps; [ aiohttp-cors twilio ];
-    "twitch" = ps: with ps; [  ];
-    "twitter" = ps: with ps; [  ];
-    "ubee" = ps: with ps; [  ];
-    "ubus" = ps: with ps; [  ];
-    "ue_smart_radio" = ps: with ps; [  ];
-    "uk_transport" = ps: with ps; [  ];
-    "unifi" = ps: with ps; [ aiounifi ];
-    "unifi_direct" = ps: with ps; [ pexpect ];
-    "unifiled" = ps: with ps; [  ];
-    "universal" = ps: with ps; [  ];
-    "upc_connect" = ps: with ps; [  ];
-    "upcloud" = ps: with ps; [  ];
-    "updater" = ps: with ps; [ distro ];
-    "upnp" = ps: with ps; [  ];
-    "uptime" = ps: with ps; [  ];
-    "uptimerobot" = ps: with ps; [  ];
-    "uscis" = ps: with ps; [  ];
-    "usgs_earthquakes_feed" = ps: with ps; [  ];
-    "utility_meter" = ps: with ps; [  ];
-    "uvc" = ps: with ps; [  ];
-    "vacuum" = ps: with ps; [  ];
-    "vallox" = ps: with ps; [  ];
-    "vasttrafik" = ps: with ps; [  ];
-    "velbus" = ps: with ps; [  ];
-    "velux" = ps: with ps; [  ];
-    "venstar" = ps: with ps; [  ];
-    "vera" = ps: with ps; [  ];
-    "verisure" = ps: with ps; [  ];
-    "versasense" = ps: with ps; [  ];
-    "version" = ps: with ps; [ pyhaversion ];
-    "vesync" = ps: with ps; [  ];
-    "viaggiatreno" = ps: with ps; [  ];
-    "vicare" = ps: with ps; [  ];
-    "vivotek" = ps: with ps; [  ];
-    "vizio" = ps: with ps; [  ];
-    "vlc" = ps: with ps; [ python-vlc ];
-    "vlc_telnet" = ps: with ps; [  ];
-    "voicerss" = ps: with ps; [  ];
-    "volkszaehler" = ps: with ps; [  ];
-    "volumio" = ps: with ps; [  ];
-    "volvooncall" = ps: with ps; [  ];
-    "vultr" = ps: with ps; [ vultr ];
-    "w800rf32" = ps: with ps; [  ];
-    "wake_on_lan" = ps: with ps; [ wakeonlan ];
-    "waqi" = ps: with ps; [  ];
-    "water_heater" = ps: with ps; [  ];
-    "waterfurnace" = ps: with ps; [  ];
-    "watson_iot" = ps: with ps; [  ];
-    "watson_tts" = ps: with ps; [  ];
-    "waze_travel_time" = ps: with ps; [ WazeRouteCalculator ];
-    "weather" = ps: with ps; [  ];
-    "webhook" = ps: with ps; [ aiohttp-cors ];
-    "weblink" = ps: with ps; [  ];
-    "webostv" = ps: with ps; [  ];
-    "websocket_api" = ps: with ps; [ aiohttp-cors ];
-    "wemo" = ps: with ps; [  ];
-    "whois" = ps: with ps; [  ];
-    "wink" = ps: with ps; [ aiohttp-cors ];
-    "wirelesstag" = ps: with ps; [  ];
-    "withings" = ps: with ps; [ aiohttp-cors ];
-    "wled" = ps: with ps; [  ];
-    "workday" = ps: with ps; [ holidays ];
-    "worldclock" = ps: with ps; [  ];
-    "worldtidesinfo" = ps: with ps; [  ];
-    "worxlandroid" = ps: with ps; [  ];
-    "wsdot" = ps: with ps; [  ];
-    "wunderground" = ps: with ps; [  ];
-    "wunderlist" = ps: with ps; [  ];
-    "wwlln" = ps: with ps; [  ];
-    "x10" = ps: with ps; [  ];
-    "xbox_live" = ps: with ps; [  ];
-    "xeoma" = ps: with ps; [  ];
-    "xfinity" = ps: with ps; [  ];
-    "xiaomi" = ps: with ps; [ ha-ffmpeg ];
-    "xiaomi_aqara" = ps: with ps; [  ];
-    "xiaomi_miio" = ps: with ps; [ construct python-miio ];
-    "xiaomi_tv" = ps: with ps; [  ];
-    "xmpp" = ps: with ps; [ slixmpp ];
-    "xs1" = ps: with ps; [  ];
-    "yale_smart_alarm" = ps: with ps; [  ];
-    "yamaha" = ps: with ps; [ rxv ];
-    "yamaha_musiccast" = ps: with ps; [  ];
-    "yandex_transport" = ps: with ps; [  ];
-    "yandextts" = ps: with ps; [  ];
-    "yeelight" = ps: with ps; [  ];
-    "yeelightsunflower" = ps: with ps; [  ];
-    "yessssms" = ps: with ps; [  ];
-    "yi" = ps: with ps; [ aioftp ha-ffmpeg ];
-    "yr" = ps: with ps; [ xmltodict ];
-    "yweather" = ps: with ps; [ yahooweather ];
-    "zabbix" = ps: with ps; [  ];
-    "zamg" = ps: with ps; [  ];
-    "zengge" = ps: with ps; [  ];
-    "zeroconf" = ps: with ps; [ aiohttp-cors zeroconf ];
-    "zestimate" = ps: with ps; [ xmltodict ];
-    "zha" = ps: with ps; [ zha-quirks zigpy-deconz zigpy ];
-    "zhong_hong" = ps: with ps; [  ];
-    "zigbee" = ps: with ps; [  ];
-    "ziggo_mediabox_xl" = ps: with ps; [  ];
-    "zone" = ps: with ps; [  ];
-    "zoneminder" = ps: with ps; [ zm-py ];
-    "zwave" = ps: with ps; [ homeassistant-pyozw pydispatcher ];
+    "abode" = ps: with ps; [ ]; # missing inputs: abodepy
+    "acer_projector" = ps: with ps; [ pyserial];
+    "actiontec" = ps: with ps; [ ];
+    "adguard" = ps: with ps; [ ]; # missing inputs: adguardhome
+    "ads" = ps: with ps; [ ]; # missing inputs: pyads
+    "aftership" = ps: with ps; [ ]; # missing inputs: pyaftership
+    "air_quality" = ps: with ps; [ ];
+    "airly" = ps: with ps; [ ]; # missing inputs: airly
+    "airvisual" = ps: with ps; [ pyairvisual];
+    "aladdin_connect" = ps: with ps; [ ]; # missing inputs: aladdin_connect
+    "alarm_control_panel" = ps: with ps; [ ];
+    "alarmdecoder" = ps: with ps; [ ]; # missing inputs: alarmdecoder
+    "alarmdotcom" = ps: with ps; [ ]; # missing inputs: pyalarmdotcom
+    "alert" = ps: with ps; [ ];
+    "alexa" = ps: with ps; [ aiohttp-cors];
+    "almond" = ps: with ps; [ aiohttp-cors]; # missing inputs: pyalmond
+    "alpha_vantage" = ps: with ps; [ ]; # missing inputs: alpha_vantage
+    "amazon_polly" = ps: with ps; [ boto3];
+    "ambiclimate" = ps: with ps; [ aiohttp-cors]; # missing inputs: ambiclimate
+    "ambient_station" = ps: with ps; [ ]; # missing inputs: aioambient
+    "amcrest" = ps: with ps; [ ha-ffmpeg]; # missing inputs: amcrest
+    "ampio" = ps: with ps; [ ]; # missing inputs: asmog
+    "android_ip_webcam" = ps: with ps; [ ]; # missing inputs: pydroid-ipcam
+    "androidtv" = ps: with ps; [ ]; # missing inputs: adb-shell androidtv pure-python-adb
+    "anel_pwrctrl" = ps: with ps; [ ]; # missing inputs: anel_pwrctrl-homeassistant
+    "anthemav" = ps: with ps; [ ]; # missing inputs: anthemav
+    "apache_kafka" = ps: with ps; [ aiokafka];
+    "apcupsd" = ps: with ps; [ ]; # missing inputs: apcaccess
+    "api" = ps: with ps; [ aiohttp-cors];
+    "apns" = ps: with ps; [ ]; # missing inputs: apns2
+    "apple_tv" = ps: with ps; [ pyatv];
+    "apprise" = ps: with ps; [ apprise];
+    "aprs" = ps: with ps; [ ]; # missing inputs: aprslib geopy
+    "aqualogic" = ps: with ps; [ ]; # missing inputs: aqualogic
+    "aquostv" = ps: with ps; [ ]; # missing inputs: sharp_aquos_rc
+    "arcam_fmj" = ps: with ps; [ ]; # missing inputs: arcam-fmj
+    "arduino" = ps: with ps; [ ]; # missing inputs: PyMata
+    "arest" = ps: with ps; [ ];
+    "arlo" = ps: with ps; [ ha-ffmpeg]; # missing inputs: pyarlo
+    "aruba" = ps: with ps; [ pexpect];
+    "arwn" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt];
+    "asterisk_cdr" = ps: with ps; [ ]; # missing inputs: asterisk_mbox
+    "asterisk_mbox" = ps: with ps; [ ]; # missing inputs: asterisk_mbox
+    "asuswrt" = ps: with ps; [ ]; # missing inputs: aioasuswrt
+    "aten_pe" = ps: with ps; [ ]; # missing inputs: atenpdu
+    "atome" = ps: with ps; [ ]; # missing inputs: pyatome
+    "august" = ps: with ps; [ ]; # missing inputs: py-august
+    "aurora" = ps: with ps; [ ];
+    "aurora_abb_powerone" = ps: with ps; [ ]; # missing inputs: aurorapy
+    "auth" = ps: with ps; [ aiohttp-cors];
+    "automatic" = ps: with ps; [ aiohttp-cors]; # missing inputs: aioautomatic
+    "automation" = ps: with ps; [ aiohttp-cors];
+    "avea" = ps: with ps; [ ]; # missing inputs: avea
+    "avion" = ps: with ps; [ ]; # missing inputs: avion
+    "awair" = ps: with ps; [ ]; # missing inputs: python_awair
+    "aws" = ps: with ps; [ ]; # missing inputs: aiobotocore
+    "axis" = ps: with ps; [ ]; # missing inputs: axis
+    "azure_event_hub" = ps: with ps; [ ]; # missing inputs: azure-eventhub
+    "azure_service_bus" = ps: with ps; [ azure-servicebus];
+    "baidu" = ps: with ps; [ ]; # missing inputs: baidu-aip
+    "bayesian" = ps: with ps; [ ];
+    "bbb_gpio" = ps: with ps; [ ]; # missing inputs: Adafruit_BBIO
+    "bbox" = ps: with ps; [ ]; # missing inputs: pybbox
+    "beewi_smartclim" = ps: with ps; [ ]; # missing inputs: beewi_smartclim
+    "bh1750" = ps: with ps; [ ]; # missing inputs: i2csense smbus-cffi
+    "binary_sensor" = ps: with ps; [ ];
+    "bitcoin" = ps: with ps; [ ]; # missing inputs: blockchain
+    "bizkaibus" = ps: with ps; [ ]; # missing inputs: bizkaibus
+    "blackbird" = ps: with ps; [ ]; # missing inputs: pyblackbird
+    "blink" = ps: with ps; [ ]; # missing inputs: blinkpy
+    "blinksticklight" = ps: with ps; [ BlinkStick];
+    "blinkt" = ps: with ps; [ ]; # missing inputs: blinkt
+    "blockchain" = ps: with ps; [ ]; # missing inputs: python-blockchain-api
+    "bloomsky" = ps: with ps; [ ];
+    "bluesound" = ps: with ps; [ xmltodict];
+    "bluetooth_le_tracker" = ps: with ps; [ ]; # missing inputs: pygatt[GATTTOOL]
+    "bluetooth_tracker" = ps: with ps; [ bt_proximity]; # missing inputs: pybluez
+    "bme280" = ps: with ps; [ ]; # missing inputs: i2csense smbus-cffi
+    "bme680" = ps: with ps; [ ]; # missing inputs: bme680 smbus-cffi
+    "bmw_connected_drive" = ps: with ps; [ ]; # missing inputs: bimmer_connected
+    "bom" = ps: with ps; [ ]; # missing inputs: bomradarloop
+    "braviatv" = ps: with ps; [ getmac]; # missing inputs: bravia-tv
+    "broadlink" = ps: with ps; [ broadlink];
+    "brother" = ps: with ps; [ ]; # missing inputs: brother
+    "brottsplatskartan" = ps: with ps; [ ]; # missing inputs: brottsplatskartan
+    "browser" = ps: with ps; [ ];
+    "brunt" = ps: with ps; [ ]; # missing inputs: brunt
+    "bt_home_hub_5" = ps: with ps; [ ]; # missing inputs: bthomehub5-devicelist
+    "bt_smarthub" = ps: with ps; [ ]; # missing inputs: btsmarthub_devicelist
+    "buienradar" = ps: with ps; [ ]; # missing inputs: buienradar
+    "caldav" = ps: with ps; [ caldav];
+    "calendar" = ps: with ps; [ aiohttp-cors];
+    "camera" = ps: with ps; [ aiohttp-cors];
+    "canary" = ps: with ps; [ ha-ffmpeg]; # missing inputs: py-canary
+    "cast" = ps: with ps; [ PyChromecast];
+    "cert_expiry" = ps: with ps; [ ];
+    "channels" = ps: with ps; [ ]; # missing inputs: pychannels
+    "cisco_ios" = ps: with ps; [ pexpect];
+    "cisco_mobility_express" = ps: with ps; [ ]; # missing inputs: ciscomobilityexpress
+    "cisco_webex_teams" = ps: with ps; [ ]; # missing inputs: webexteamssdk
+    "citybikes" = ps: with ps; [ ];
+    "clementine" = ps: with ps; [ ]; # missing inputs: python-clementine-remote
+    "clickatell" = ps: with ps; [ ];
+    "clicksend" = ps: with ps; [ ];
+    "clicksend_tts" = ps: with ps; [ ];
+    "climate" = ps: with ps; [ ];
+    "cloud" = ps: with ps; [ aiohttp-cors hass-nabucasa];
+    "cloudflare" = ps: with ps; [ ]; # missing inputs: pycfdns
+    "cmus" = ps: with ps; [ ]; # missing inputs: pycmus
+    "co2signal" = ps: with ps; [ ]; # missing inputs: co2signal
+    "coinbase" = ps: with ps; [ ]; # missing inputs: coinbase
+    "coinmarketcap" = ps: with ps; [ coinmarketcap];
+    "comed_hourly_pricing" = ps: with ps; [ ];
+    "comfoconnect" = ps: with ps; [ ]; # missing inputs: pycomfoconnect
+    "command_line" = ps: with ps; [ ];
+    "concord232" = ps: with ps; [ ]; # missing inputs: concord232
+    "config" = ps: with ps; [ aiohttp-cors];
+    "configurator" = ps: with ps; [ ];
+    "conversation" = ps: with ps; [ aiohttp-cors];
+    "coolmaster" = ps: with ps; [ ]; # missing inputs: pycoolmasternet
+    "coronavirus" = ps: with ps; [ ]; # missing inputs: coronavirus
+    "counter" = ps: with ps; [ ];
+    "cover" = ps: with ps; [ ];
+    "cppm_tracker" = ps: with ps; [ ]; # missing inputs: clearpasspy
+    "cpuspeed" = ps: with ps; [ py-cpuinfo];
+    "crimereports" = ps: with ps; [ ]; # missing inputs: crimereports
+    "cups" = ps: with ps; [ pycups];
+    "currencylayer" = ps: with ps; [ ];
+    "daikin" = ps: with ps; [ ]; # missing inputs: pydaikin
+    "danfoss_air" = ps: with ps; [ ]; # missing inputs: pydanfossair
+    "darksky" = ps: with ps; [ python-forecastio];
+    "datadog" = ps: with ps; [ datadog];
+    "ddwrt" = ps: with ps; [ ];
+    "deconz" = ps: with ps; [ ]; # missing inputs: pydeconz
+    "decora" = ps: with ps; [ ]; # missing inputs: bluepy decora
+    "decora_wifi" = ps: with ps; [ ]; # missing inputs: decora_wifi
+    "default_config" = ps: with ps; [ pynacl aiohttp-cors defusedxml distro hass-nabucasa netdisco sqlalchemy zeroconf]; # missing inputs: home-assistant-frontend
+    "delijn" = ps: with ps; [ ]; # missing inputs: pydelijn
+    "deluge" = ps: with ps; [ deluge-client];
+    "demo" = ps: with ps; [ aiohttp-cors];
+    "denon" = ps: with ps; [ ];
+    "denonavr" = ps: with ps; [ denonavr];
+    "derivative" = ps: with ps; [ ];
+    "deutsche_bahn" = ps: with ps; [ ]; # missing inputs: schiene
+    "device_automation" = ps: with ps; [ aiohttp-cors];
+    "device_sun_light_trigger" = ps: with ps; [ ];
+    "device_tracker" = ps: with ps; [ ];
+    "dht" = ps: with ps; [ ]; # missing inputs: Adafruit-DHT
+    "dialogflow" = ps: with ps; [ aiohttp-cors];
+    "digital_ocean" = ps: with ps; [ digital-ocean];
+    "digitalloggers" = ps: with ps; [ ]; # missing inputs: dlipower
+    "directv" = ps: with ps; [ ]; # missing inputs: directpy
+    "discogs" = ps: with ps; [ discogs_client];
+    "discord" = ps: with ps; [ discordpy];
+    "discovery" = ps: with ps; [ netdisco];
+    "dlib_face_detect" = ps: with ps; [ face_recognition];
+    "dlib_face_identify" = ps: with ps; [ face_recognition];
+    "dlink" = ps: with ps; [ ]; # missing inputs: pyW215
+    "dlna_dmr" = ps: with ps; [ ]; # missing inputs: async-upnp-client
+    "dnsip" = ps: with ps; [ aiodns];
+    "dominos" = ps: with ps; [ aiohttp-cors]; # missing inputs: pizzapi
+    "doods" = ps: with ps; [ pillow]; # missing inputs: pydoods
+    "doorbird" = ps: with ps; [ aiohttp-cors sqlalchemy]; # missing inputs: doorbirdpy home-assistant-frontend
+    "dovado" = ps: with ps; [ ]; # missing inputs: dovado
+    "downloader" = ps: with ps; [ ];
+    "dsmr" = ps: with ps; [ ]; # missing inputs: dsmr_parser
+    "dsmr_reader" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt];
+    "dte_energy_bridge" = ps: with ps; [ ];
+    "dublin_bus_transport" = ps: with ps; [ ];
+    "duckdns" = ps: with ps; [ ];
+    "dunehd" = ps: with ps; [ ]; # missing inputs: pdunehd
+    "dwd_weather_warnings" = ps: with ps; [ ];
+    "dweet" = ps: with ps; [ ]; # missing inputs: dweepy
+    "dynalite" = ps: with ps; [ ]; # missing inputs: dynalite_devices
+    "dyson" = ps: with ps; [ ]; # missing inputs: libpurecool
+    "ebox" = ps: with ps; [ ]; # missing inputs: pyebox
+    "ebusd" = ps: with ps; [ ]; # missing inputs: ebusdpy
+    "ecoal_boiler" = ps: with ps; [ ]; # missing inputs: ecoaliface
+    "ecobee" = ps: with ps; [ ]; # missing inputs: python-ecobee-api
+    "econet" = ps: with ps; [ ]; # missing inputs: pyeconet
+    "ecovacs" = ps: with ps; [ ]; # missing inputs: sucks
+    "eddystone_temperature" = ps: with ps; [ construct]; # missing inputs: beacontools[scan]
+    "edimax" = ps: with ps; [ ]; # missing inputs: pyedimax
+    "ee_brightbox" = ps: with ps; [ ]; # missing inputs: eebrightbox
+    "efergy" = ps: with ps; [ ];
+    "egardia" = ps: with ps; [ ]; # missing inputs: pythonegardia
+    "eight_sleep" = ps: with ps; [ ]; # missing inputs: pyeight
+    "elgato" = ps: with ps; [ ]; # missing inputs: elgato
+    "eliqonline" = ps: with ps; [ ]; # missing inputs: eliqonline
+    "elkm1" = ps: with ps; [ ]; # missing inputs: elkm1-lib
+    "elv" = ps: with ps; [ ]; # missing inputs: pypca
+    "emby" = ps: with ps; [ ]; # missing inputs: pyemby
+    "emoncms" = ps: with ps; [ ];
+    "emoncms_history" = ps: with ps; [ ];
+    "emulated_hue" = ps: with ps; [ aiohttp-cors];
+    "emulated_roku" = ps: with ps; [ ]; # missing inputs: emulated_roku
+    "enigma2" = ps: with ps; [ ]; # missing inputs: openwebifpy
+    "enocean" = ps: with ps; [ ]; # missing inputs: enocean
+    "enphase_envoy" = ps: with ps; [ ]; # missing inputs: envoy_reader
+    "entur_public_transport" = ps: with ps; [ ]; # missing inputs: enturclient
+    "environment_canada" = ps: with ps; [ ]; # missing inputs: env_canada
+    "envirophat" = ps: with ps; [ ]; # missing inputs: envirophat smbus-cffi
+    "envisalink" = ps: with ps; [ ]; # missing inputs: pyenvisalink
+    "ephember" = ps: with ps; [ ]; # missing inputs: pyephember
+    "epson" = ps: with ps; [ ]; # missing inputs: epson-projector
+    "epsonworkforce" = ps: with ps; [ ]; # missing inputs: epsonprinter
+    "eq3btsmart" = ps: with ps; [ construct]; # missing inputs: python-eq3bt
+    "esphome" = ps: with ps; [ aioesphomeapi];
+    "essent" = ps: with ps; [ ]; # missing inputs: PyEssent
+    "etherscan" = ps: with ps; [ ]; # missing inputs: python-etherscan-api
+    "eufy" = ps: with ps; [ ]; # missing inputs: lakeside
+    "everlights" = ps: with ps; [ ]; # missing inputs: pyeverlights
+    "evohome" = ps: with ps; [ ]; # missing inputs: evohome-async
+    "facebook" = ps: with ps; [ ];
+    "facebox" = ps: with ps; [ ];
+    "fail2ban" = ps: with ps; [ ];
+    "familyhub" = ps: with ps; [ ]; # missing inputs: python-family-hub-local
+    "fan" = ps: with ps; [ ];
+    "fastdotcom" = ps: with ps; [ ]; # missing inputs: fastdotcom
+    "feedreader" = ps: with ps; [ ]; # missing inputs: feedparser-homeassistant
+    "ffmpeg" = ps: with ps; [ ha-ffmpeg];
+    "ffmpeg_motion" = ps: with ps; [ ha-ffmpeg];
+    "ffmpeg_noise" = ps: with ps; [ ha-ffmpeg];
+    "fibaro" = ps: with ps; [ ]; # missing inputs: fiblary3
+    "fido" = ps: with ps; [ ]; # missing inputs: pyfido
+    "file" = ps: with ps; [ ];
+    "filesize" = ps: with ps; [ ];
+    "filter" = ps: with ps; [ aiohttp-cors sqlalchemy];
+    "fints" = ps: with ps; [ fints];
+    "fitbit" = ps: with ps; [ aiohttp-cors fitbit];
+    "fixer" = ps: with ps; [ ]; # missing inputs: fixerio
+    "fleetgo" = ps: with ps; [ ]; # missing inputs: ritassist
+    "flexit" = ps: with ps; [ ]; # missing inputs: pyflexit pymodbus
+    "flic" = ps: with ps; [ ]; # missing inputs: pyflic-homeassistant
+    "flock" = ps: with ps; [ ];
+    "flume" = ps: with ps; [ ]; # missing inputs: pyflume
+    "flunearyou" = ps: with ps; [ ]; # missing inputs: pyflunearyou
+    "flux" = ps: with ps; [ ];
+    "flux_led" = ps: with ps; [ flux-led];
+    "folder" = ps: with ps; [ ];
+    "folder_watcher" = ps: with ps; [ watchdog];
+    "foobot" = ps: with ps; [ ]; # missing inputs: foobot_async
+    "fortigate" = ps: with ps; [ ]; # missing inputs: pyfgt
+    "fortios" = ps: with ps; [ ]; # missing inputs: fortiosapi
+    "foscam" = ps: with ps; [ ]; # missing inputs: libpyfoscam
+    "foursquare" = ps: with ps; [ aiohttp-cors];
+    "free_mobile" = ps: with ps; [ ]; # missing inputs: freesms
+    "freebox" = ps: with ps; [ ]; # missing inputs: aiofreepybox
+    "freedns" = ps: with ps; [ ];
+    "fritz" = ps: with ps; [ fritzconnection];
+    "fritzbox" = ps: with ps; [ ]; # missing inputs: pyfritzhome
+    "fritzbox_callmonitor" = ps: with ps; [ fritzconnection];
+    "fritzbox_netmonitor" = ps: with ps; [ fritzconnection];
+    "fronius" = ps: with ps; [ ]; # missing inputs: pyfronius
+    "frontend" = ps: with ps; [ aiohttp-cors]; # missing inputs: home-assistant-frontend
+    "frontier_silicon" = ps: with ps; [ ]; # missing inputs: afsapi
+    "futurenow" = ps: with ps; [ ]; # missing inputs: pyfnip
+    "garadget" = ps: with ps; [ ];
+    "garmin_connect" = ps: with ps; [ ]; # missing inputs: garminconnect
+    "gc100" = ps: with ps; [ ]; # missing inputs: python-gc100
+    "gdacs" = ps: with ps; [ ]; # missing inputs: aio_georss_gdacs
+    "gearbest" = ps: with ps; [ ]; # missing inputs: gearbest_parser
+    "geizhals" = ps: with ps; [ ]; # missing inputs: geizhals
+    "generic" = ps: with ps; [ ];
+    "generic_thermostat" = ps: with ps; [ ];
+    "geniushub" = ps: with ps; [ ]; # missing inputs: geniushub-client
+    "geo_json_events" = ps: with ps; [ ]; # missing inputs: geojson_client
+    "geo_location" = ps: with ps; [ ];
+    "geo_rss_events" = ps: with ps; [ ]; # missing inputs: georss_generic_client
+    "geofency" = ps: with ps; [ aiohttp-cors];
+    "geonetnz_quakes" = ps: with ps; [ ]; # missing inputs: aio_geojson_geonetnz_quakes
+    "geonetnz_volcano" = ps: with ps; [ ]; # missing inputs: aio_geojson_geonetnz_volcano
+    "gios" = ps: with ps; [ ]; # missing inputs: gios
+    "github" = ps: with ps; [ PyGithub];
+    "gitlab_ci" = ps: with ps; [ python-gitlab];
+    "gitter" = ps: with ps; [ ]; # missing inputs: gitterpy
+    "glances" = ps: with ps; [ ]; # missing inputs: glances_api
+    "gntp" = ps: with ps; [ ]; # missing inputs: gntp
+    "goalfeed" = ps: with ps; [ ]; # missing inputs: pysher
+    "gogogate2" = ps: with ps; [ ]; # missing inputs: pygogogate2
+    "google" = ps: with ps; [ google_api_python_client httplib2 oauth2client];
+    "google_assistant" = ps: with ps; [ aiohttp-cors];
+    "google_cloud" = ps: with ps; [ google_cloud_texttospeech];
+    "google_domains" = ps: with ps; [ ];
+    "google_maps" = ps: with ps; [ ]; # missing inputs: locationsharinglib
+    "google_pubsub" = ps: with ps; [ google_cloud_pubsub];
+    "google_translate" = ps: with ps; [ gtts-token];
+    "google_travel_time" = ps: with ps; [ ]; # missing inputs: googlemaps
+    "google_wifi" = ps: with ps; [ ];
+    "gpmdp" = ps: with ps; [ websocket_client];
+    "gpsd" = ps: with ps; [ ]; # missing inputs: gps3
+    "gpslogger" = ps: with ps; [ aiohttp-cors];
+    "graphite" = ps: with ps; [ ];
+    "greeneye_monitor" = ps: with ps; [ ]; # missing inputs: greeneye_monitor
+    "greenwave" = ps: with ps; [ ]; # missing inputs: greenwavereality
+    "group" = ps: with ps; [ ];
+    "growatt_server" = ps: with ps; [ ]; # missing inputs: growattServer
+    "gstreamer" = ps: with ps; [ ]; # missing inputs: gstreamer-player
+    "gtfs" = ps: with ps; [ ]; # missing inputs: pygtfs
+    "habitica" = ps: with ps; [ ]; # missing inputs: habitipy
+    "hangouts" = ps: with ps; [ ]; # missing inputs: hangups
+    "harman_kardon_avr" = ps: with ps; [ ]; # missing inputs: hkavr
+    "harmony" = ps: with ps; [ ]; # missing inputs: aioharmony
+    "hassio" = ps: with ps; [ aiohttp-cors]; # missing inputs: home-assistant-frontend
+    "haveibeenpwned" = ps: with ps; [ ];
+    "hddtemp" = ps: with ps; [ ];
+    "hdmi_cec" = ps: with ps; [ ]; # missing inputs: pyCEC
+    "heatmiser" = ps: with ps; [ ]; # missing inputs: heatmiserV3
+    "heos" = ps: with ps; [ ]; # missing inputs: pyheos
+    "here_travel_time" = ps: with ps; [ ]; # missing inputs: herepy
+    "hikvision" = ps: with ps; [ ]; # missing inputs: pyhik
+    "hikvisioncam" = ps: with ps; [ ]; # missing inputs: hikvision
+    "hisense_aehw4a1" = ps: with ps; [ ]; # missing inputs: pyaehw4a1
+    "history" = ps: with ps; [ aiohttp-cors sqlalchemy];
+    "history_graph" = ps: with ps; [ aiohttp-cors sqlalchemy];
+    "history_stats" = ps: with ps; [ aiohttp-cors sqlalchemy];
+    "hitron_coda" = ps: with ps; [ ];
+    "hive" = ps: with ps; [ ]; # missing inputs: pyhiveapi
+    "hlk_sw16" = ps: with ps; [ ]; # missing inputs: hlk-sw16
+    "homeassistant" = ps: with ps; [ ];
+    "homekit" = ps: with ps; [ ]; # missing inputs: HAP-python
+    "homekit_controller" = ps: with ps; [ ]; # missing inputs: homekit[IP]
+    "homematic" = ps: with ps; [ pyhomematic];
+    "homematicip_cloud" = ps: with ps; [ ]; # missing inputs: homematicip
+    "homeworks" = ps: with ps; [ ]; # missing inputs: pyhomeworks
+    "honeywell" = ps: with ps; [ ]; # missing inputs: somecomfort
+    "horizon" = ps: with ps; [ ]; # missing inputs: horimote
+    "hp_ilo" = ps: with ps; [ ]; # missing inputs: python-hpilo
+    "html5" = ps: with ps; [ aiohttp-cors pywebpush];
+    "http" = ps: with ps; [ aiohttp-cors];
+    "htu21d" = ps: with ps; [ ]; # missing inputs: i2csense smbus-cffi
+    "huawei_lte" = ps: with ps; [ getmac stringcase]; # missing inputs: huawei-lte-api url-normalize
+    "huawei_router" = ps: with ps; [ ];
+    "hue" = ps: with ps; [ aiohue];
+    "hunterdouglas_powerview" = ps: with ps; [ ]; # missing inputs: aiopvapi
+    "hydrawise" = ps: with ps; [ ]; # missing inputs: hydrawiser
+    "hyperion" = ps: with ps; [ ];
+    "ialarm" = ps: with ps; [ ]; # missing inputs: pyialarm
+    "iaqualink" = ps: with ps; [ ]; # missing inputs: iaqualink
+    "icloud" = ps: with ps; [ pyicloud];
+    "idteck_prox" = ps: with ps; [ ]; # missing inputs: rfk101py
+    "ifttt" = ps: with ps; [ aiohttp-cors pyfttt];
+    "iglo" = ps: with ps; [ ]; # missing inputs: iglo
+    "ign_sismologia" = ps: with ps; [ ]; # missing inputs: georss_ign_sismologia_client
+    "ihc" = ps: with ps; [ defusedxml]; # missing inputs: ihcsdk
+    "image_processing" = ps: with ps; [ aiohttp-cors];
+    "imap" = ps: with ps; [ ]; # missing inputs: aioimaplib
+    "imap_email_content" = ps: with ps; [ ];
+    "incomfort" = ps: with ps; [ ]; # missing inputs: incomfort-client
+    "influxdb" = ps: with ps; [ influxdb];
+    "input_boolean" = ps: with ps; [ ];
+    "input_datetime" = ps: with ps; [ ];
+    "input_number" = ps: with ps; [ ];
+    "input_select" = ps: with ps; [ ];
+    "input_text" = ps: with ps; [ ];
+    "insteon" = ps: with ps; [ ]; # missing inputs: insteonplm
+    "integration" = ps: with ps; [ ];
+    "intent" = ps: with ps; [ aiohttp-cors];
+    "intent_script" = ps: with ps; [ ];
+    "intesishome" = ps: with ps; [ ]; # missing inputs: pyintesishome
+    "ios" = ps: with ps; [ aiohttp-cors zeroconf];
+    "iota" = ps: with ps; [ ]; # missing inputs: pyota
+    "iperf3" = ps: with ps; [ ]; # missing inputs: iperf3
+    "ipma" = ps: with ps; [ ]; # missing inputs: pyipma
+    "iqvia" = ps: with ps; [ numpy]; # missing inputs: pyiqvia
+    "irish_rail_transport" = ps: with ps; [ ]; # missing inputs: pyirishrail
+    "islamic_prayer_times" = ps: with ps; [ ]; # missing inputs: prayer_times_calculator
+    "iss" = ps: with ps; [ ]; # missing inputs: pyiss
+    "isy994" = ps: with ps; [ ]; # missing inputs: PyISY
+    "itach" = ps: with ps; [ ]; # missing inputs: pyitachip2ir
+    "itunes" = ps: with ps; [ ];
+    "izone" = ps: with ps; [ ]; # missing inputs: python-izone
+    "jewish_calendar" = ps: with ps; [ ]; # missing inputs: hdate
+    "joaoapps_join" = ps: with ps; [ ]; # missing inputs: python-join-api
+    "juicenet" = ps: with ps; [ ]; # missing inputs: python-juicenet
+    "kaiterra" = ps: with ps; [ ]; # missing inputs: kaiterra-async-client
+    "kankun" = ps: with ps; [ ];
+    "keba" = ps: with ps; [ ]; # missing inputs: keba-kecontact
+    "keenetic_ndms2" = ps: with ps; [ ]; # missing inputs: ndms2_client
+    "kef" = ps: with ps; [ getmac]; # missing inputs: aiokef
+    "keyboard" = ps: with ps; [ ]; # missing inputs: pyuserinput
+    "keyboard_remote" = ps: with ps; [ evdev]; # missing inputs: aionotify
+    "kira" = ps: with ps; [ ]; # missing inputs: pykira
+    "kiwi" = ps: with ps; [ ]; # missing inputs: kiwiki-client
+    "knx" = ps: with ps; [ ]; # missing inputs: xknx
+    "kodi" = ps: with ps; [ jsonrpc-async jsonrpc-websocket];
+    "konnected" = ps: with ps; [ aiohttp-cors]; # missing inputs: konnected
+    "kwb" = ps: with ps; [ ]; # missing inputs: pykwb
+    "lacrosse" = ps: with ps; [ ]; # missing inputs: pylacrosse
+    "lametric" = ps: with ps; [ ]; # missing inputs: lmnotify
+    "lannouncer" = ps: with ps; [ ];
+    "lastfm" = ps: with ps; [ pylast];
+    "launch_library" = ps: with ps; [ ]; # missing inputs: pylaunches
+    "lcn" = ps: with ps; [ ]; # missing inputs: pypck
+    "lg_netcast" = ps: with ps; [ ]; # missing inputs: pylgnetcast-homeassistant
+    "lg_soundbar" = ps: with ps; [ ]; # missing inputs: temescal
+    "life360" = ps: with ps; [ ]; # missing inputs: life360
+    "lifx" = ps: with ps; [ aiolifx aiolifx-effects];
+    "lifx_cloud" = ps: with ps; [ ];
+    "lifx_legacy" = ps: with ps; [ ]; # missing inputs: liffylights
+    "light" = ps: with ps; [ ];
+    "lightwave" = ps: with ps; [ ]; # missing inputs: lightwave
+    "limitlessled" = ps: with ps; [ limitlessled];
+    "linksys_smart" = ps: with ps; [ ];
+    "linky" = ps: with ps; [ ]; # missing inputs: pylinky
+    "linode" = ps: with ps; [ linode-api];
+    "linux_battery" = ps: with ps; [ batinfo];
+    "lirc" = ps: with ps; [ ]; # missing inputs: python-lirc
+    "litejet" = ps: with ps; [ ]; # missing inputs: pylitejet
+    "llamalab_automate" = ps: with ps; [ ];
+    "local_file" = ps: with ps; [ ];
+    "local_ip" = ps: with ps; [ ];
+    "locative" = ps: with ps; [ aiohttp-cors];
+    "lock" = ps: with ps; [ ];
+    "lockitron" = ps: with ps; [ ];
+    "logbook" = ps: with ps; [ aiohttp-cors sqlalchemy]; # missing inputs: home-assistant-frontend
+    "logentries" = ps: with ps; [ ];
+    "logger" = ps: with ps; [ ];
+    "logi_circle" = ps: with ps; [ aiohttp-cors ha-ffmpeg]; # missing inputs: logi_circle
+    "london_air" = ps: with ps; [ ];
+    "london_underground" = ps: with ps; [ ]; # missing inputs: london-tube-status
+    "loopenergy" = ps: with ps; [ ]; # missing inputs: pyloopenergy
+    "lovelace" = ps: with ps; [ ];
+    "luci" = ps: with ps; [ ]; # missing inputs: openwrt-luci-rpc
+    "luftdaten" = ps: with ps; [ luftdaten];
+    "lupusec" = ps: with ps; [ ]; # missing inputs: lupupy
+    "lutron" = ps: with ps; [ ]; # missing inputs: pylutron
+    "lutron_caseta" = ps: with ps; [ ]; # missing inputs: pylutron-caseta
+    "lw12wifi" = ps: with ps; [ ]; # missing inputs: lw12
+    "lyft" = ps: with ps; [ ]; # missing inputs: lyft_rides
+    "magicseaweed" = ps: with ps; [ ]; # missing inputs: magicseaweed
+    "mailbox" = ps: with ps; [ aiohttp-cors];
+    "mailgun" = ps: with ps; [ aiohttp-cors]; # missing inputs: pymailgunner
+    "manual" = ps: with ps; [ ];
+    "manual_mqtt" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt];
+    "map" = ps: with ps; [ aiohttp-cors]; # missing inputs: home-assistant-frontend
+    "marytts" = ps: with ps; [ ]; # missing inputs: speak2mary
+    "mastodon" = ps: with ps; [ ]; # missing inputs: Mastodon.py
+    "matrix" = ps: with ps; [ matrix-client];
+    "maxcube" = ps: with ps; [ ]; # missing inputs: maxcube-api
+    "mcp23017" = ps: with ps; [ ]; # missing inputs: RPi.GPIO adafruit-blinka adafruit-circuitpython-mcp230xx
+    "media_extractor" = ps: with ps; [ aiohttp-cors youtube-dl-light];
+    "media_player" = ps: with ps; [ aiohttp-cors];
+    "mediaroom" = ps: with ps; [ ]; # missing inputs: pymediaroom
+    "melcloud" = ps: with ps; [ ]; # missing inputs: pymelcloud
+    "melissa" = ps: with ps; [ ]; # missing inputs: py-melissa-climate
+    "meraki" = ps: with ps; [ aiohttp-cors];
+    "message_bird" = ps: with ps; [ ]; # missing inputs: messagebird
+    "met" = ps: with ps; [ ]; # missing inputs: pyMetno
+    "meteo_france" = ps: with ps; [ ]; # missing inputs: meteofrance vigilancemeteo
+    "meteoalarm" = ps: with ps; [ ]; # missing inputs: meteoalertapi
+    "metoffice" = ps: with ps; [ ]; # missing inputs: datapoint
+    "mfi" = ps: with ps; [ ]; # missing inputs: mficlient
+    "mhz19" = ps: with ps; [ ]; # missing inputs: pmsensor
+    "microsoft" = ps: with ps; [ ]; # missing inputs: pycsspeechtts
+    "microsoft_face" = ps: with ps; [ aiohttp-cors];
+    "microsoft_face_detect" = ps: with ps; [ aiohttp-cors];
+    "microsoft_face_identify" = ps: with ps; [ aiohttp-cors];
+    "miflora" = ps: with ps; [ ]; # missing inputs: bluepy miflora
+    "mikrotik" = ps: with ps; [ ]; # missing inputs: librouteros
+    "mill" = ps: with ps; [ ]; # missing inputs: millheater
+    "min_max" = ps: with ps; [ ];
+    "minecraft_server" = ps: with ps; [ getmac]; # missing inputs: mcstatus
+    "minio" = ps: with ps; [ minio];
+    "mitemp_bt" = ps: with ps; [ ]; # missing inputs: mitemp_bt
+    "mjpeg" = ps: with ps; [ ];
+    "mobile_app" = ps: with ps; [ pynacl aiohttp-cors];
+    "mochad" = ps: with ps; [ ]; # missing inputs: pymochad
+    "modbus" = ps: with ps; [ ]; # missing inputs: pymodbus
+    "modem_callerid" = ps: with ps; [ ]; # missing inputs: basicmodem
+    "mold_indicator" = ps: with ps; [ ];
+    "monoprice" = ps: with ps; [ ]; # missing inputs: pymonoprice
+    "moon" = ps: with ps; [ ];
+    "mopar" = ps: with ps; [ ]; # missing inputs: motorparts
+    "mpchc" = ps: with ps; [ ];
+    "mpd" = ps: with ps; [ mpd2];
+    "mqtt" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt];
+    "mqtt_eventstream" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt];
+    "mqtt_json" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt];
+    "mqtt_room" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt];
+    "mqtt_statestream" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt];
+    "msteams" = ps: with ps; [ ]; # missing inputs: pymsteams
+    "mvglive" = ps: with ps; [ PyMVGLive];
+    "mychevy" = ps: with ps; [ ]; # missing inputs: mychevy
+    "mycroft" = ps: with ps; [ ]; # missing inputs: mycroftapi
+    "myq" = ps: with ps; [ ]; # missing inputs: pymyq
+    "mysensors" = ps: with ps; [ ]; # missing inputs: pymysensors
+    "mystrom" = ps: with ps; [ aiohttp-cors]; # missing inputs: python-mystrom
+    "mythicbeastsdns" = ps: with ps; [ ]; # missing inputs: mbddns
+    "n26" = ps: with ps; [ ]; # missing inputs: n26
+    "nad" = ps: with ps; [ ]; # missing inputs: nad_receiver
+    "namecheapdns" = ps: with ps; [ defusedxml];
+    "nanoleaf" = ps: with ps; [ ]; # missing inputs: pynanoleaf
+    "neato" = ps: with ps; [ pybotvac];
+    "nederlandse_spoorwegen" = ps: with ps; [ ]; # missing inputs: nsapi
+    "nello" = ps: with ps; [ ]; # missing inputs: pynello
+    "ness_alarm" = ps: with ps; [ ]; # missing inputs: nessclient
+    "nest" = ps: with ps; [ ]; # missing inputs: python-nest
+    "netatmo" = ps: with ps; [ aiohttp-cors pyatmo];
+    "netdata" = ps: with ps; [ ]; # missing inputs: netdata
+    "netgear" = ps: with ps; [ ]; # missing inputs: pynetgear
+    "netgear_lte" = ps: with ps; [ ]; # missing inputs: eternalegypt
+    "netio" = ps: with ps; [ aiohttp-cors]; # missing inputs: pynetio
+    "neurio_energy" = ps: with ps; [ ]; # missing inputs: neurio
+    "nextbus" = ps: with ps; [ ]; # missing inputs: py_nextbusnext
+    "nfandroidtv" = ps: with ps; [ ];
+    "niko_home_control" = ps: with ps; [ ]; # missing inputs: niko-home-control
+    "nilu" = ps: with ps; [ ]; # missing inputs: niluclient
+    "nissan_leaf" = ps: with ps; [ ]; # missing inputs: pycarwings2
+    "nmap_tracker" = ps: with ps; [ getmac]; # missing inputs: python-nmap
+    "nmbs" = ps: with ps; [ ]; # missing inputs: pyrail
+    "no_ip" = ps: with ps; [ ];
+    "noaa_tides" = ps: with ps; [ ]; # missing inputs: py_noaa
+    "norway_air" = ps: with ps; [ ]; # missing inputs: pyMetno
+    "notify" = ps: with ps; [ ];
+    "notion" = ps: with ps; [ ]; # missing inputs: aionotion
+    "nsw_fuel_station" = ps: with ps; [ ]; # missing inputs: nsw-fuel-api-client
+    "nsw_rural_fire_service_feed" = ps: with ps; [ ]; # missing inputs: aio_geojson_nsw_rfs_incidents
+    "nuheat" = ps: with ps; [ ]; # missing inputs: nuheat
+    "nuimo_controller" = ps: with ps; [ ]; # missing inputs: --only-binary=all nuimo
+    "nuki" = ps: with ps; [ ]; # missing inputs: pynuki
+    "nut" = ps: with ps; [ ]; # missing inputs: pynut2
+    "nws" = ps: with ps; [ ]; # missing inputs: pynws
+    "nx584" = ps: with ps; [ ]; # missing inputs: pynx584
+    "nzbget" = ps: with ps; [ ]; # missing inputs: pynzbgetapi
+    "oasa_telematics" = ps: with ps; [ ]; # missing inputs: oasatelematics
+    "obihai" = ps: with ps; [ ]; # missing inputs: pyobihai
+    "octoprint" = ps: with ps; [ ];
+    "oem" = ps: with ps; [ ]; # missing inputs: oemthermostat
+    "ohmconnect" = ps: with ps; [ defusedxml];
+    "ombi" = ps: with ps; [ ]; # missing inputs: pyombi
+    "onboarding" = ps: with ps; [ aiohttp-cors];
+    "onewire" = ps: with ps; [ ]; # missing inputs: pyownet
+    "onkyo" = ps: with ps; [ onkyo-eiscp];
+    "onvif" = ps: with ps; [ ha-ffmpeg]; # missing inputs: onvif-zeep-async
+    "openalpr_cloud" = ps: with ps; [ ];
+    "openalpr_local" = ps: with ps; [ ];
+    "opencv" = ps: with ps; [ numpy]; # missing inputs: opencv-python-headless
+    "openevse" = ps: with ps; [ ]; # missing inputs: openevsewifi
+    "openexchangerates" = ps: with ps; [ ];
+    "opengarage" = ps: with ps; [ ];
+    "openhardwaremonitor" = ps: with ps; [ ];
+    "openhome" = ps: with ps; [ ]; # missing inputs: openhomedevice
+    "opensensemap" = ps: with ps; [ ]; # missing inputs: opensensemap-api
+    "opensky" = ps: with ps; [ ];
+    "opentherm_gw" = ps: with ps; [ ]; # missing inputs: pyotgw
+    "openuv" = ps: with ps; [ ]; # missing inputs: pyopenuv
+    "openweathermap" = ps: with ps; [ pyowm];
+    "opnsense" = ps: with ps; [ ]; # missing inputs: pyopnsense
+    "opple" = ps: with ps; [ ]; # missing inputs: pyoppleio
+    "orangepi_gpio" = ps: with ps; [ ]; # missing inputs: OPi.GPIO
+    "oru" = ps: with ps; [ ]; # missing inputs: oru
+    "orvibo" = ps: with ps; [ ]; # missing inputs: orvibo
+    "osramlightify" = ps: with ps; [ ]; # missing inputs: lightify
+    "otp" = ps: with ps; [ pyotp];
+    "owntracks" = ps: with ps; [ pynacl aiohttp-cors];
+    "panasonic_bluray" = ps: with ps; [ ]; # missing inputs: panacotta
+    "panasonic_viera" = ps: with ps; [ wakeonlan]; # missing inputs: panasonic_viera
+    "pandora" = ps: with ps; [ pexpect];
+    "panel_custom" = ps: with ps; [ aiohttp-cors]; # missing inputs: home-assistant-frontend
+    "panel_iframe" = ps: with ps; [ aiohttp-cors]; # missing inputs: home-assistant-frontend
+    "pcal9535a" = ps: with ps; [ ]; # missing inputs: pcal9535a
+    "pencom" = ps: with ps; [ ]; # missing inputs: pencompy
+    "persistent_notification" = ps: with ps; [ ];
+    "person" = ps: with ps; [ ];
+    "philips_js" = ps: with ps; [ ]; # missing inputs: ha-philipsjs
+    "pi_hole" = ps: with ps; [ ]; # missing inputs: hole
+    "picotts" = ps: with ps; [ ];
+    "piglow" = ps: with ps; [ ]; # missing inputs: piglow
+    "pilight" = ps: with ps; [ ]; # missing inputs: pilight
+    "ping" = ps: with ps; [ ];
+    "pioneer" = ps: with ps; [ ];
+    "pjlink" = ps: with ps; [ ]; # missing inputs: pypjlink2
+    "plaato" = ps: with ps; [ aiohttp-cors];
+    "plant" = ps: with ps; [ ];
+    "plex" = ps: with ps; [ aiohttp-cors plexapi plexauth plexwebsocket];
+    "plugwise" = ps: with ps; [ ]; # missing inputs: haanna
+    "plum_lightpad" = ps: with ps; [ ]; # missing inputs: plumlightpad
+    "pocketcasts" = ps: with ps; [ ]; # missing inputs: pocketcasts
+    "point" = ps: with ps; [ aiohttp-cors]; # missing inputs: pypoint
+    "prezzibenzina" = ps: with ps; [ ]; # missing inputs: prezzibenzina-py
+    "proliphix" = ps: with ps; [ ]; # missing inputs: proliphix
+    "prometheus" = ps: with ps; [ aiohttp-cors prometheus_client];
+    "prowl" = ps: with ps; [ ];
+    "proximity" = ps: with ps; [ ];
+    "proxmoxve" = ps: with ps; [ ]; # missing inputs: proxmoxer
+    "proxy" = ps: with ps; [ pillow];
+    "ps4" = ps: with ps; [ ]; # missing inputs: pyps4-2ndscreen
+    "ptvsd" = ps: with ps; [ ]; # missing inputs: ptvsd
+    "pulseaudio_loopback" = ps: with ps; [ ];
+    "push" = ps: with ps; [ aiohttp-cors];
+    "pushbullet" = ps: with ps; [ pushbullet];
+    "pushetta" = ps: with ps; [ ]; # missing inputs: pushetta
+    "pushover" = ps: with ps; [ pushover-complete];
+    "pushsafer" = ps: with ps; [ ];
+    "pvoutput" = ps: with ps; [ ];
+    "pyload" = ps: with ps; [ ];
+    "python_script" = ps: with ps; [ restrictedpython];
+    "qbittorrent" = ps: with ps; [ ]; # missing inputs: python-qbittorrent
+    "qld_bushfire" = ps: with ps; [ ]; # missing inputs: georss_qld_bushfire_alert_client
+    "qnap" = ps: with ps; [ ]; # missing inputs: qnapstats
+    "qrcode" = ps: with ps; [ pillow]; # missing inputs: pyzbar
+    "quantum_gateway" = ps: with ps; [ ]; # missing inputs: quantum-gateway
+    "qwikswitch" = ps: with ps; [ ]; # missing inputs: pyqwikswitch
+    "rachio" = ps: with ps; [ aiohttp-cors]; # missing inputs: rachiopy
+    "radarr" = ps: with ps; [ ];
+    "radiotherm" = ps: with ps; [ ]; # missing inputs: radiotherm
+    "rainbird" = ps: with ps; [ ]; # missing inputs: pyrainbird
+    "raincloud" = ps: with ps; [ ]; # missing inputs: raincloudy
+    "rainforest_eagle" = ps: with ps; [ ]; # missing inputs: eagle200_reader uEagle
+    "rainmachine" = ps: with ps; [ ]; # missing inputs: regenmaschine
+    "random" = ps: with ps; [ ];
+    "raspihats" = ps: with ps; [ ]; # missing inputs: raspihats smbus-cffi
+    "raspyrfm" = ps: with ps; [ ]; # missing inputs: raspyrfm-client
+    "recollect_waste" = ps: with ps; [ ]; # missing inputs: recollect-waste
+    "recorder" = ps: with ps; [ sqlalchemy];
+    "recswitch" = ps: with ps; [ ]; # missing inputs: pyrecswitch
+    "reddit" = ps: with ps; [ praw];
+    "rejseplanen" = ps: with ps; [ ]; # missing inputs: rjpl
+    "remember_the_milk" = ps: with ps; [ httplib2]; # missing inputs: RtmAPI
+    "remote" = ps: with ps; [ ];
+    "remote_rpi_gpio" = ps: with ps; [ ]; # missing inputs: gpiozero
+    "repetier" = ps: with ps; [ ]; # missing inputs: pyrepetier
+    "rest" = ps: with ps; [ jsonpath xmltodict];
+    "rest_command" = ps: with ps; [ ];
+    "rflink" = ps: with ps; [ ]; # missing inputs: rflink
+    "rfxtrx" = ps: with ps; [ ]; # missing inputs: pyRFXtrx
+    "ring" = ps: with ps; [ ha-ffmpeg]; # missing inputs: ring_doorbell
+    "ripple" = ps: with ps; [ ]; # missing inputs: python-ripple-api
+    "rmvtransport" = ps: with ps; [ ]; # missing inputs: PyRMVtransport
+    "rocketchat" = ps: with ps; [ ]; # missing inputs: rocketchat-API
+    "roku" = ps: with ps; [ ]; # missing inputs: roku
+    "roomba" = ps: with ps; [ ]; # missing inputs: roombapy
+    "route53" = ps: with ps; [ boto3]; # missing inputs: ipify
+    "rova" = ps: with ps; [ ]; # missing inputs: rova
+    "rpi_camera" = ps: with ps; [ ];
+    "rpi_gpio" = ps: with ps; [ ]; # missing inputs: RPi.GPIO
+    "rpi_gpio_pwm" = ps: with ps; [ ]; # missing inputs: pwmled
+    "rpi_pfio" = ps: with ps; [ ]; # missing inputs: pifacecommon pifacedigitalio
+    "rpi_rf" = ps: with ps; [ ]; # missing inputs: rpi-rf
+    "rss_feed_template" = ps: with ps; [ aiohttp-cors];
+    "rtorrent" = ps: with ps; [ ];
+    "russound_rio" = ps: with ps; [ ]; # missing inputs: russound_rio
+    "russound_rnet" = ps: with ps; [ ]; # missing inputs: russound
+    "sabnzbd" = ps: with ps; [ ]; # missing inputs: pysabnzbd
+    "safe_mode" = ps: with ps; [ aiohttp-cors hass-nabucasa]; # missing inputs: home-assistant-frontend
+    "saj" = ps: with ps; [ ]; # missing inputs: pysaj
+    "salt" = ps: with ps; [ ]; # missing inputs: saltbox
+    "samsungtv" = ps: with ps; [ ]; # missing inputs: samsungctl[websocket]
+    "satel_integra" = ps: with ps; [ ]; # missing inputs: satel_integra
+    "scene" = ps: with ps; [ ];
+    "scrape" = ps: with ps; [ beautifulsoup4];
+    "script" = ps: with ps; [ ];
+    "scsgate" = ps: with ps; [ ]; # missing inputs: scsgate
+    "search" = ps: with ps; [ aiohttp-cors];
+    "season" = ps: with ps; [ ephem];
+    "sendgrid" = ps: with ps; [ ]; # missing inputs: sendgrid
+    "sense" = ps: with ps; [ ]; # missing inputs: sense_energy
+    "sensehat" = ps: with ps; [ ]; # missing inputs: sense-hat
+    "sensibo" = ps: with ps; [ ]; # missing inputs: pysensibo
+    "sensor" = ps: with ps; [ ];
+    "sentry" = ps: with ps; [ sentry-sdk];
+    "serial" = ps: with ps; [ pyserial-asyncio];
+    "serial_pm" = ps: with ps; [ ]; # missing inputs: pmsensor
+    "sesame" = ps: with ps; [ ]; # missing inputs: pysesame2
+    "seven_segments" = ps: with ps; [ pillow];
+    "seventeentrack" = ps: with ps; [ ]; # missing inputs: py17track
+    "shell_command" = ps: with ps; [ ];
+    "shiftr" = ps: with ps; [ paho-mqtt];
+    "shodan" = ps: with ps; [ shodan];
+    "shopping_list" = ps: with ps; [ aiohttp-cors];
+    "sht31" = ps: with ps; [ ]; # missing inputs: Adafruit-GPIO Adafruit-SHT31
+    "sigfox" = ps: with ps; [ ];
+    "sighthound" = ps: with ps; [ ]; # missing inputs: simplehound
+    "signal_messenger" = ps: with ps; [ ]; # missing inputs: pysignalclirestapi
+    "simplepush" = ps: with ps; [ ]; # missing inputs: simplepush
+    "simplisafe" = ps: with ps; [ ]; # missing inputs: simplisafe-python
+    "simulated" = ps: with ps; [ ];
+    "sinch" = ps: with ps; [ ]; # missing inputs: clx-sdk-xms
+    "sisyphus" = ps: with ps; [ ]; # missing inputs: sisyphus-control
+    "sky_hub" = ps: with ps; [ ];
+    "skybeacon" = ps: with ps; [ ]; # missing inputs: pygatt[GATTTOOL]
+    "skybell" = ps: with ps; [ ]; # missing inputs: skybellpy
+    "slack" = ps: with ps; [ ]; # missing inputs: slacker
+    "sleepiq" = ps: with ps; [ ]; # missing inputs: sleepyq
+    "slide" = ps: with ps; [ ]; # missing inputs: goslide-api
+    "sma" = ps: with ps; [ ]; # missing inputs: pysma
+    "smappee" = ps: with ps; [ ]; # missing inputs: smappy
+    "smarthab" = ps: with ps; [ ]; # missing inputs: smarthab
+    "smartthings" = ps: with ps; [ aiohttp-cors]; # missing inputs: pysmartapp pysmartthings
+    "smarty" = ps: with ps; [ ]; # missing inputs: pysmarty
+    "smhi" = ps: with ps; [ ]; # missing inputs: smhi-pkg
+    "sms" = ps: with ps; [ ]; # missing inputs: python-gammu
+    "smtp" = ps: with ps; [ ];
+    "snapcast" = ps: with ps; [ snapcast];
+    "snips" = ps: with ps; [ aiohttp-cors hbmqtt paho-mqtt];
+    "snmp" = ps: with ps; [ pysnmp];
+    "sochain" = ps: with ps; [ ]; # missing inputs: python-sochain-api
+    "socialblade" = ps: with ps; [ ]; # missing inputs: socialbladeclient
+    "solaredge" = ps: with ps; [ stringcase]; # missing inputs: solaredge
+    "solaredge_local" = ps: with ps; [ ]; # missing inputs: solaredge-local
+    "solarlog" = ps: with ps; [ ]; # missing inputs: sunwatcher
+    "solax" = ps: with ps; [ ]; # missing inputs: solax
+    "soma" = ps: with ps; [ ]; # missing inputs: pysoma
+    "somfy" = ps: with ps; [ aiohttp-cors]; # missing inputs: pymfy
+    "somfy_mylink" = ps: with ps; [ ]; # missing inputs: somfy-mylink-synergy
+    "sonarr" = ps: with ps; [ ];
+    "songpal" = ps: with ps; [ ]; # missing inputs: python-songpal
+    "sonos" = ps: with ps; [ pysonos];
+    "sony_projector" = ps: with ps; [ ]; # missing inputs: pysdcp
+    "soundtouch" = ps: with ps; [ libsoundtouch];
+    "spaceapi" = ps: with ps; [ aiohttp-cors];
+    "spc" = ps: with ps; [ ]; # missing inputs: pyspcwebgw
+    "speedtestdotnet" = ps: with ps; [ speedtest-cli];
+    "spider" = ps: with ps; [ ]; # missing inputs: spiderpy
+    "splunk" = ps: with ps; [ ];
+    "spotcrime" = ps: with ps; [ ]; # missing inputs: spotcrime
+    "spotify" = ps: with ps; [ aiohttp-cors spotipy];
+    "sql" = ps: with ps; [ sqlalchemy];
+    "squeezebox" = ps: with ps; [ ];
+    "ssdp" = ps: with ps; [ defusedxml netdisco];
+    "starline" = ps: with ps; [ ]; # missing inputs: starline
+    "starlingbank" = ps: with ps; [ ]; # missing inputs: starlingbank
+    "startca" = ps: with ps; [ xmltodict];
+    "statistics" = ps: with ps; [ ];
+    "statsd" = ps: with ps; [ statsd];
+    "steam_online" = ps: with ps; [ ]; # missing inputs: steamodd
+    "stiebel_eltron" = ps: with ps; [ ]; # missing inputs: pymodbus pystiebeleltron
+    "stookalert" = ps: with ps; [ ]; # missing inputs: stookalert
+    "stream" = ps: with ps; [ aiohttp-cors av];
+    "streamlabswater" = ps: with ps; [ ]; # missing inputs: streamlabswater
+    "stt" = ps: with ps; [ aiohttp-cors];
+    "suez_water" = ps: with ps; [ ]; # missing inputs: pysuez
+    "sun" = ps: with ps; [ ];
+    "supervisord" = ps: with ps; [ ];
+    "supla" = ps: with ps; [ ]; # missing inputs: pysupla
+    "surepetcare" = ps: with ps; [ ]; # missing inputs: surepy
+    "swiss_hydrological_data" = ps: with ps; [ ]; # missing inputs: swisshydrodata
+    "swiss_public_transport" = ps: with ps; [ ]; # missing inputs: python_opendata_transport
+    "swisscom" = ps: with ps; [ ];
+    "switch" = ps: with ps; [ ];
+    "switchbot" = ps: with ps; [ ]; # missing inputs: PySwitchbot
+    "switcher_kis" = ps: with ps; [ ]; # missing inputs: aioswitcher
+    "switchmate" = ps: with ps; [ ]; # missing inputs: pySwitchmate
+    "syncthru" = ps: with ps; [ ]; # missing inputs: pysyncthru
+    "synology" = ps: with ps; [ ]; # missing inputs: py-synology
+    "synology_chat" = ps: with ps; [ ];
+    "synology_srm" = ps: with ps; [ ]; # missing inputs: synology-srm
+    "synologydsm" = ps: with ps; [ ]; # missing inputs: python-synology
+    "syslog" = ps: with ps; [ ];
+    "system_health" = ps: with ps; [ aiohttp-cors];
+    "system_log" = ps: with ps; [ aiohttp-cors];
+    "systemmonitor" = ps: with ps; [ psutil];
+    "tado" = ps: with ps; [ ]; # missing inputs: python-tado
+    "tahoma" = ps: with ps; [ ]; # missing inputs: tahoma-api
+    "tank_utility" = ps: with ps; [ ]; # missing inputs: tank_utility
+    "tapsaff" = ps: with ps; [ ]; # missing inputs: tapsaff
+    "tautulli" = ps: with ps; [ ]; # missing inputs: pytautulli
+    "tcp" = ps: with ps; [ ];
+    "ted5000" = ps: with ps; [ xmltodict];
+    "teksavvy" = ps: with ps; [ ];
+    "telegram" = ps: with ps; [ pysocks aiohttp-cors python-telegram-bot];
+    "telegram_bot" = ps: with ps; [ pysocks aiohttp-cors python-telegram-bot];
+    "tellduslive" = ps: with ps; [ ]; # missing inputs: tellduslive
+    "tellstick" = ps: with ps; [ ]; # missing inputs: tellcore-net tellcore-py
+    "telnet" = ps: with ps; [ ];
+    "temper" = ps: with ps; [ ]; # missing inputs: temperusb
+    "template" = ps: with ps; [ ];
+    "tensorflow" = ps: with ps; [ numpy pillow protobuf tensorflow];
+    "tesla" = ps: with ps; [ ]; # missing inputs: teslajsonpy
+    "tfiac" = ps: with ps; [ ]; # missing inputs: pytfiac
+    "thermoworks_smoke" = ps: with ps; [ stringcase]; # missing inputs: thermoworks_smoke
+    "thethingsnetwork" = ps: with ps; [ ];
+    "thingspeak" = ps: with ps; [ ]; # missing inputs: thingspeak
+    "thinkingcleaner" = ps: with ps; [ ]; # missing inputs: pythinkingcleaner
+    "thomson" = ps: with ps; [ ];
+    "threshold" = ps: with ps; [ ];
+    "tibber" = ps: with ps; [ ]; # missing inputs: pyTibber
+    "tikteck" = ps: with ps; [ ]; # missing inputs: tikteck
+    "tile" = ps: with ps; [ ]; # missing inputs: pytile
+    "time_date" = ps: with ps; [ ];
+    "timer" = ps: with ps; [ ];
+    "tmb" = ps: with ps; [ ]; # missing inputs: tmb
+    "tod" = ps: with ps; [ ];
+    "todoist" = ps: with ps; [ todoist];
+    "tof" = ps: with ps; [ ]; # missing inputs: RPi.GPIO VL53L1X2
+    "tomato" = ps: with ps; [ ];
+    "toon" = ps: with ps; [ ]; # missing inputs: toonapilib
+    "torque" = ps: with ps; [ aiohttp-cors];
+    "totalconnect" = ps: with ps; [ ]; # missing inputs: total_connect_client
+    "touchline" = ps: with ps; [ ]; # missing inputs: pytouchline
+    "tplink" = ps: with ps; [ ]; # missing inputs: pyHS100
+    "tplink_lte" = ps: with ps; [ ]; # missing inputs: tp-connected
+    "traccar" = ps: with ps; [ aiohttp-cors stringcase]; # missing inputs: pytraccar
+    "trackr" = ps: with ps; [ ]; # missing inputs: pytrackr
+    "tradfri" = ps: with ps; [ ]; # missing inputs: pytradfri[async]
+    "trafikverket_train" = ps: with ps; [ ]; # missing inputs: pytrafikverket
+    "trafikverket_weatherstation" = ps: with ps; [ ]; # missing inputs: pytrafikverket
+    "transmission" = ps: with ps; [ transmissionrpc];
+    "transport_nsw" = ps: with ps; [ ]; # missing inputs: PyTransportNSW
+    "travisci" = ps: with ps; [ ]; # missing inputs: TravisPy
+    "trend" = ps: with ps; [ numpy];
+    "tts" = ps: with ps; [ aiohttp-cors mutagen];
+    "tuya" = ps: with ps; [ ]; # missing inputs: tuyaha
+    "twentemilieu" = ps: with ps; [ ]; # missing inputs: twentemilieu
+    "twilio" = ps: with ps; [ aiohttp-cors twilio];
+    "twilio_call" = ps: with ps; [ aiohttp-cors twilio];
+    "twilio_sms" = ps: with ps; [ aiohttp-cors twilio];
+    "twitch" = ps: with ps; [ ]; # missing inputs: python-twitch-client
+    "twitter" = ps: with ps; [ ]; # missing inputs: TwitterAPI
+    "ubee" = ps: with ps; [ ]; # missing inputs: pyubee
+    "ubus" = ps: with ps; [ ];
+    "ue_smart_radio" = ps: with ps; [ ];
+    "uk_transport" = ps: with ps; [ ];
+    "unifi" = ps: with ps; [ aiounifi];
+    "unifi_direct" = ps: with ps; [ pexpect];
+    "unifiled" = ps: with ps; [ ]; # missing inputs: unifiled
+    "universal" = ps: with ps; [ ];
+    "upc_connect" = ps: with ps; [ ]; # missing inputs: connect-box
+    "upcloud" = ps: with ps; [ ]; # missing inputs: upcloud-api
+    "updater" = ps: with ps; [ distro];
+    "upnp" = ps: with ps; [ ]; # missing inputs: async-upnp-client
+    "uptime" = ps: with ps; [ ];
+    "uptimerobot" = ps: with ps; [ ]; # missing inputs: pyuptimerobot
+    "uscis" = ps: with ps; [ ]; # missing inputs: uscisstatus
+    "usgs_earthquakes_feed" = ps: with ps; [ ]; # missing inputs: geojson_client
+    "utility_meter" = ps: with ps; [ ];
+    "uvc" = ps: with ps; [ ]; # missing inputs: uvcclient
+    "vacuum" = ps: with ps; [ ];
+    "vallox" = ps: with ps; [ ]; # missing inputs: vallox-websocket-api
+    "vasttrafik" = ps: with ps; [ ]; # missing inputs: vtjp
+    "velbus" = ps: with ps; [ ]; # missing inputs: python-velbus
+    "velux" = ps: with ps; [ ]; # missing inputs: pyvlx
+    "venstar" = ps: with ps; [ ]; # missing inputs: venstarcolortouch
+    "vera" = ps: with ps; [ ]; # missing inputs: pyvera
+    "verisure" = ps: with ps; [ jsonpath]; # missing inputs: vsure
+    "versasense" = ps: with ps; [ ]; # missing inputs: pyversasense
+    "version" = ps: with ps; [ pyhaversion];
+    "vesync" = ps: with ps; [ ]; # missing inputs: pyvesync
+    "viaggiatreno" = ps: with ps; [ ];
+    "vicare" = ps: with ps; [ ]; # missing inputs: PyViCare
+    "vilfo" = ps: with ps; [ ]; # missing inputs: vilfo-api-client
+    "vivotek" = ps: with ps; [ ]; # missing inputs: libpyvivotek
+    "vizio" = ps: with ps; [ ]; # missing inputs: pyvizio
+    "vlc" = ps: with ps; [ python-vlc];
+    "vlc_telnet" = ps: with ps; [ ]; # missing inputs: python-telnet-vlc
+    "voicerss" = ps: with ps; [ ];
+    "volkszaehler" = ps: with ps; [ ]; # missing inputs: volkszaehler
+    "volumio" = ps: with ps; [ ];
+    "volvooncall" = ps: with ps; [ ]; # missing inputs: volvooncall
+    "vultr" = ps: with ps; [ vultr];
+    "w800rf32" = ps: with ps; [ ]; # missing inputs: pyW800rf32
+    "wake_on_lan" = ps: with ps; [ wakeonlan];
+    "waqi" = ps: with ps; [ ]; # missing inputs: waqiasync
+    "water_heater" = ps: with ps; [ ];
+    "waterfurnace" = ps: with ps; [ ]; # missing inputs: waterfurnace
+    "watson_iot" = ps: with ps; [ ]; # missing inputs: ibmiotf
+    "watson_tts" = ps: with ps; [ ]; # missing inputs: ibm-watson
+    "waze_travel_time" = ps: with ps; [ WazeRouteCalculator];
+    "weather" = ps: with ps; [ ];
+    "webhook" = ps: with ps; [ aiohttp-cors];
+    "weblink" = ps: with ps; [ ];
+    "webostv" = ps: with ps; [ ]; # missing inputs: aiopylgtv
+    "websocket_api" = ps: with ps; [ aiohttp-cors];
+    "wemo" = ps: with ps; [ ]; # missing inputs: pywemo
+    "whois" = ps: with ps; [ ]; # missing inputs: python-whois
+    "wink" = ps: with ps; [ aiohttp-cors]; # missing inputs: pubnubsub-handler python-wink
+    "wirelesstag" = ps: with ps; [ ]; # missing inputs: wirelesstagpy
+    "withings" = ps: with ps; [ aiohttp-cors]; # missing inputs: withings-api
+    "wled" = ps: with ps; [ ]; # missing inputs: wled
+    "workday" = ps: with ps; [ holidays];
+    "worldclock" = ps: with ps; [ ];
+    "worldtidesinfo" = ps: with ps; [ ];
+    "worxlandroid" = ps: with ps; [ ];
+    "wsdot" = ps: with ps; [ ];
+    "wunderground" = ps: with ps; [ ];
+    "wunderlist" = ps: with ps; [ ]; # missing inputs: wunderpy2
+    "wwlln" = ps: with ps; [ ]; # missing inputs: aiowwlln
+    "x10" = ps: with ps; [ ];
+    "xbox_live" = ps: with ps; [ ]; # missing inputs: xboxapi
+    "xeoma" = ps: with ps; [ ]; # missing inputs: pyxeoma
+    "xfinity" = ps: with ps; [ ]; # missing inputs: xfinity-gateway
+    "xiaomi" = ps: with ps; [ ha-ffmpeg];
+    "xiaomi_aqara" = ps: with ps; [ ]; # missing inputs: PyXiaomiGateway
+    "xiaomi_miio" = ps: with ps; [ construct python-miio];
+    "xiaomi_tv" = ps: with ps; [ ]; # missing inputs: pymitv
+    "xmpp" = ps: with ps; [ slixmpp];
+    "xs1" = ps: with ps; [ ]; # missing inputs: xs1-api-client
+    "yale_smart_alarm" = ps: with ps; [ ]; # missing inputs: yalesmartalarmclient
+    "yamaha" = ps: with ps; [ rxv];
+    "yamaha_musiccast" = ps: with ps; [ ]; # missing inputs: pymusiccast
+    "yandex_transport" = ps: with ps; [ ]; # missing inputs: ya_ma
+    "yandextts" = ps: with ps; [ ];
+    "yeelight" = ps: with ps; [ ]; # missing inputs: yeelight
+    "yeelightsunflower" = ps: with ps; [ ]; # missing inputs: yeelightsunflower
+    "yessssms" = ps: with ps; [ ]; # missing inputs: YesssSMS
+    "yi" = ps: with ps; [ aioftp ha-ffmpeg];
+    "yr" = ps: with ps; [ xmltodict];
+    "yweather" = ps: with ps; [ yahooweather];
+    "zabbix" = ps: with ps; [ ]; # missing inputs: pyzabbix
+    "zamg" = ps: with ps; [ ];
+    "zengge" = ps: with ps; [ ]; # missing inputs: zengge
+    "zeroconf" = ps: with ps; [ aiohttp-cors zeroconf];
+    "zestimate" = ps: with ps; [ xmltodict];
+    "zha" = ps: with ps; [ zha-quirks zigpy-deconz zigpy]; # missing inputs: bellows-homeassistant zigpy-cc zigpy-xbee-homeassistant zigpy-zigate
+    "zhong_hong" = ps: with ps; [ ]; # missing inputs: zhong_hong_hvac
+    "zigbee" = ps: with ps; [ ]; # missing inputs: xbee-helper
+    "ziggo_mediabox_xl" = ps: with ps; [ ]; # missing inputs: ziggo-mediabox-xl
+    "zone" = ps: with ps; [ ];
+    "zoneminder" = ps: with ps; [ zm-py];
+    "zwave" = ps: with ps; [ homeassistant-pyozw pydispatcher];
   };
 }
diff --git a/pkgs/servers/home-assistant/default.nix b/pkgs/servers/home-assistant/default.nix
index 7d32bf9a0584..2b571fe96bfc 100644
--- a/pkgs/servers/home-assistant/default.nix
+++ b/pkgs/servers/home-assistant/default.nix
@@ -67,7 +67,7 @@ let
   extraBuildInputs = extraPackages py.pkgs;
 
   # Don't forget to run parse-requirements.py after updating
-  hassVersion = "0.104.3";
+  hassVersion = "0.106.6";
 
 in with py.pkgs; buildPythonApplication rec {
   pname = "homeassistant";
@@ -75,6 +75,8 @@ in with py.pkgs; buildPythonApplication rec {
 
   disabled = pythonOlder "3.5";
 
+  patches = [ ./relax-importlib-metadata-pyaml.patch ];
+
   inherit availableComponents;
 
   # PyPI tarball is missing tests/ directory
@@ -82,7 +84,7 @@ in with py.pkgs; buildPythonApplication rec {
     owner = "home-assistant";
     repo = "home-assistant";
     rev = version;
-    sha256 = "06bh9qrpa1d370pvw6in0isg3yw4p7gh9rpy4hm96p0mf53vxfdp";
+    sha256 = "11kv5lmm8nxp7yv3w43mzmgzkafddy0z6wl2878p96iyil1w7qhb";
   };
 
   propagatedBuildInputs = [
@@ -95,7 +97,8 @@ in with py.pkgs; buildPythonApplication rec {
   ] ++ componentBuildInputs ++ extraBuildInputs;
 
   checkInputs = [
-    asynctest pytest pytest-aiohttp requests-mock pydispatcher aiohue netdisco hass-nabucasa
+    asynctest pytest pytest-aiohttp requests-mock pydispatcher aiohue netdisco
+    hass-nabucasa defusedxml
   ];
 
   postPatch = ''
diff --git a/pkgs/servers/home-assistant/frontend.nix b/pkgs/servers/home-assistant/frontend.nix
index 75d02ed06351..1446518fbc5c 100644
--- a/pkgs/servers/home-assistant/frontend.nix
+++ b/pkgs/servers/home-assistant/frontend.nix
@@ -4,11 +4,11 @@ buildPythonPackage rec {
   # the frontend version corresponding to a specific home-assistant version can be found here
   # https://github.com/home-assistant/home-assistant/blob/master/homeassistant/components/frontend/manifest.json
   pname = "home-assistant-frontend";
-  version = "20200108.0";
+  version = "20200220.5";
 
   src = fetchPypi {
     inherit pname version;
-    sha256 = "1h6fgkx8fffzs829893gjbh0wbjgxjzz2ca64v8r5sb938bfayg8";
+    sha256 = "0nc44r5ybq0prsz2yid622i0xr7q0qrc4ymbk69bqg6jrmjpbdl1";
   };
 
   # no Python tests implemented
diff --git a/pkgs/servers/home-assistant/parse-requirements.py b/pkgs/servers/home-assistant/parse-requirements.py
index 96cf1d86050e..a5c6e9d09614 100755
--- a/pkgs/servers/home-assistant/parse-requirements.py
+++ b/pkgs/servers/home-assistant/parse-requirements.py
@@ -1,5 +1,5 @@
 #! /usr/bin/env nix-shell
-#! nix-shell -i python3 -p "python3.withPackages (ps: with ps; [ attrs ])
+#! nix-shell -i python3 -p "python3.withPackages (ps: with ps; [ mypy attrs ])
 #
 # This script downloads Home Assistant's source tarball.
 # Inside the homeassistant/components directory, each integration has an associated manifest.json,
@@ -15,125 +15,168 @@
 # nixpkgs' python3Packages are searched for appropriate names.
 # Then, a Nix attribute set mapping integration name to dependencies is created.
 
-from io import BytesIO
 import json
-import pathlib
 import os
+import pathlib
 import re
 import subprocess
 import sys
-import tempfile
 import tarfile
+import tempfile
+from io import BytesIO
+from typing import Dict, Optional
 from urllib.request import urlopen
 
-COMPONENT_PREFIX = 'homeassistant.components'
-PKG_SET = 'python3Packages'
+COMPONENT_PREFIX = "homeassistant.components"
+PKG_SET = "python3Packages"
 
 # If some requirements are matched by multiple python packages,
 # the following can be used to choose one of them
 PKG_PREFERENCES = {
     # Use python3Packages.youtube-dl-light instead of python3Packages.youtube-dl
-    'youtube-dl': 'youtube-dl-light',
-    'tensorflow-bin': 'tensorflow',
-    'tensorflowWithoutCuda': 'tensorflow'
+    "youtube-dl": "youtube-dl-light",
+    "tensorflow-bin": "tensorflow",
+    "tensorflowWithoutCuda": "tensorflow",
 }
 
+
+def run_mypy() -> None:
+    cmd = ["mypy", "--ignore-missing-imports", __file__]
+    print(f"$ {' '.join(cmd)}")
+    subprocess.run(cmd, check=True)
+
+
 def get_version():
-    with open(os.path.dirname(sys.argv[0]) + '/default.nix') as f:
+    with open(os.path.dirname(sys.argv[0]) + "/default.nix") as f:
         # A version consists of digits, dots, and possibly a "b" (for beta)
         m = re.search('hassVersion = "([\\d\\.b]+)";', f.read())
         return m.group(1)
 
-def parse_components(version='master'):
+
+def parse_components(version: str = "master"):
     components = {}
     with tempfile.TemporaryDirectory() as tmp:
-        with urlopen(f'https://github.com/home-assistant/home-assistant/archive/{version}.tar.gz') as response:
+        with urlopen(
+            f"https://github.com/home-assistant/home-assistant/archive/{version}.tar.gz"
+        ) as response:
             tarfile.open(fileobj=BytesIO(response.read())).extractall(tmp)
         # Use part of a script from the Home Assistant codebase
-        sys.path.append(os.path.join(tmp, f'home-assistant-{version}'))
+        core_path = os.path.join(tmp, f"core-{version}")
+        sys.path.append(core_path)
         from script.hassfest.model import Integration
-        integrations = Integration.load_dir(pathlib.Path(
-            os.path.join(tmp, f'home-assistant-{version}', 'homeassistant/components')
-        ))
+
+        integrations = Integration.load_dir(
+            pathlib.Path(
+                os.path.join(core_path, "homeassistant/components")
+            )
+        )
         for domain in sorted(integrations):
             integration = integrations[domain]
             components[domain] = integration.manifest
     return components
 
+
 # Recursively get the requirements of a component and its dependencies
 def get_reqs(components, component):
-    requirements = set(components[component]['requirements'])
-    for dependency in components[component]['dependencies']:
+    requirements = set(components[component]["requirements"])
+    for dependency in components[component]["dependencies"]:
         requirements.update(get_reqs(components, dependency))
     return requirements
 
-# Store a JSON dump of Nixpkgs' python3Packages
-output = subprocess.check_output(['nix-env', '-f', os.path.dirname(sys.argv[0]) + '/../../..', '-qa', '-A', PKG_SET, '--json'])
-packages = json.loads(output)
 
-def name_to_attr_path(req):
+def dump_packages() -> Dict[str, Dict[str, str]]:
+    # Store a JSON dump of Nixpkgs' python3Packages
+    output = subprocess.check_output(
+        [
+            "nix-env",
+            "-f",
+            os.path.dirname(sys.argv[0]) + "/../../..",
+            "-qa",
+            "-A",
+            PKG_SET,
+            "--json",
+        ]
+    )
+    return json.loads(output)
+
+
+def name_to_attr_path(req: str, packages: Dict[str, Dict[str, str]]) -> Optional[str]:
     attr_paths = set()
     names = [req]
     # E.g. python-mpd2 is actually called python3.6-mpd2
     # instead of python-3.6-python-mpd2 inside Nixpkgs
-    if req.startswith('python-') or req.startswith('python_'):
-        names.append(req[len('python-'):])
+    if req.startswith("python-") or req.startswith("python_"):
+        names.append(req[len("python-") :])
     for name in names:
         # treat "-" and "_" equally
-        name = re.sub('[-_]', '[-_]', name)
-        pattern = re.compile('^python\\d\\.\\d-{}-\\d'.format(name), re.I)
+        name = re.sub("[-_]", "[-_]", name)
+        pattern = re.compile("^python\\d\\.\\d-{}-\\d".format(name), re.I)
         for attr_path, package in packages.items():
-            if pattern.match(package['name']):
+            if pattern.match(package["name"]):
                 attr_paths.add(attr_path)
     if len(attr_paths) > 1:
         for to_replace, replacement in PKG_PREFERENCES.items():
             try:
-                attr_paths.remove(PKG_SET + '.' + to_replace)
-                attr_paths.add(PKG_SET + '.' + replacement)
+                attr_paths.remove(PKG_SET + "." + to_replace)
+                attr_paths.add(PKG_SET + "." + replacement)
             except KeyError:
                 pass
     # Let's hope there's only one derivation with a matching name
-    assert len(attr_paths) <= 1, "{} matches more than one derivation: {}".format(req, attr_paths)
+    assert len(attr_paths) <= 1, "{} matches more than one derivation: {}".format(
+        req, attr_paths
+    )
     if len(attr_paths) == 1:
         return attr_paths.pop()
     else:
         return None
 
-version = get_version()
-print('Generating component-packages.nix for version {}'.format(version))
-components = parse_components(version=version)
-build_inputs = {}
-for component in sorted(components.keys()):
-    attr_paths = []
-    missing_reqs = []
-    reqs = sorted(get_reqs(components, component))
-    for req in reqs:
-        # Some requirements are specified by url, e.g. https://example.org/foobar#xyz==1.0.0
-        # Therefore, if there's a "#" in the line, only take the part after it
-        req = req[req.find('#') + 1:]
-        name = req.split('==')[0]
-        attr_path = name_to_attr_path(name)
-        if attr_path is not None:
-            # Add attribute path without "python3Packages." prefix
-            attr_paths.append(attr_path[len(PKG_SET + '.'):])
+
+def main() -> None:
+    packages = dump_packages()
+    version = get_version()
+    print("Generating component-packages.nix for version {}".format(version))
+    components = parse_components(version=version)
+    build_inputs = {}
+    for component in sorted(components.keys()):
+        attr_paths = []
+        missing_reqs = []
+        reqs = sorted(get_reqs(components, component))
+        for req in reqs:
+            # Some requirements are specified by url, e.g. https://example.org/foobar#xyz==1.0.0
+            # Therefore, if there's a "#" in the line, only take the part after it
+            req = req[req.find("#") + 1 :]
+            name = req.split("==")[0]
+            attr_path = name_to_attr_path(name, packages)
+            if attr_path is not None:
+                # Add attribute path without "python3Packages." prefix
+                attr_paths.append(attr_path[len(PKG_SET + ".") :])
+            else:
+                missing_reqs.append(name)
         else:
-            missing_reqs.append(name)
-    else:
-        build_inputs[component] = attr_paths
-    n_diff = len(reqs) > len(build_inputs[component])
-    if n_diff > 0:
-        print("Component {} is missing {} dependencies".format(component, n_diff))
-        print("missing requirements: {}".format(missing_reqs))
-
-with open(os.path.dirname(sys.argv[0]) + '/component-packages.nix', 'w') as f:
-    f.write('# Generated by parse-requirements.py\n')
-    f.write('# Do not edit!\n\n')
-    f.write('{\n')
-    f.write('  version = "{}";\n'.format(version))
-    f.write('  components = {\n')
-    for component, attr_paths in build_inputs.items():
-        f.write('    "{}" = ps: with ps; [ '.format(component))
-        f.write(' '.join(attr_paths))
-        f.write(' ];\n')
-    f.write('  };\n')
-    f.write('}\n')
+            build_inputs[component] = (attr_paths, missing_reqs)
+        n_diff = len(reqs) > len(build_inputs[component])
+        if n_diff > 0:
+            print("Component {} is missing {} dependencies".format(component, n_diff))
+            print("missing requirements: {}".format(missing_reqs))
+
+    with open(os.path.dirname(sys.argv[0]) + "/component-packages.nix", "w") as f:
+        f.write("# Generated by parse-requirements.py\n")
+        f.write("# Do not edit!\n\n")
+        f.write("{\n")
+        f.write(f'  version = "{version}";\n')
+        f.write("  components = {\n")
+        for component, deps in build_inputs.items():
+            available, missing = deps
+            f.write(f'    "{component}" = ps: with ps; [ ')
+            f.write(" ".join(available))
+            f.write("];")
+            if len(missing) > 0:
+                f.write(f" # missing inputs: {' '.join(missing)}")
+            f.write("\n")
+        f.write("  };\n")
+        f.write("}\n")
+
+
+if __name__ == "__main__":
+    run_mypy()
+    main()
diff --git a/pkgs/servers/home-assistant/relax-importlib-metadata-pyaml.patch b/pkgs/servers/home-assistant/relax-importlib-metadata-pyaml.patch
new file mode 100644
index 000000000000..d35e05c6cd78
--- /dev/null
+++ b/pkgs/servers/home-assistant/relax-importlib-metadata-pyaml.patch
@@ -0,0 +1,22 @@
+diff --git a/setup.py b/setup.py
+index 7f9155d9a..f90a0d965 100755
+--- a/setup.py
++++ b/setup.py
+@@ -38,7 +38,7 @@ REQUIRES = [
+     "attrs==19.3.0",
+     "bcrypt==3.1.7",
+     "certifi>=2019.11.28",
+-    "importlib-metadata==1.5.0",
++    "importlib-metadata>=1.3.0",
+     "jinja2>=2.10.3",
+     "PyJWT==1.7.1",
+     # PyJWT has loose dependency. We want the latest one.
+@@ -46,7 +46,7 @@ REQUIRES = [
+     "pip>=8.0.3",
+     "python-slugify==4.0.0",
+     "pytz>=2019.03",
+-    "pyyaml==5.3",
++    "pyyaml>=5.2",
+     "requests==2.22.0",
+     "ruamel.yaml==0.15.100",
+     "voluptuous==0.11.7",
diff --git a/pkgs/servers/http/unit/default.nix b/pkgs/servers/http/unit/default.nix
index 8b36e7de69fd..c56e994ed54e 100644
--- a/pkgs/servers/http/unit/default.nix
+++ b/pkgs/servers/http/unit/default.nix
@@ -17,14 +17,14 @@
 with stdenv.lib;
 
 stdenv.mkDerivation rec {
-  version = "1.15.0";
+  version = "1.16.0";
   pname = "unit";
 
   src = fetchFromGitHub {
     owner = "nginx";
     repo = "unit";
     rev = version;
-    sha256 = "1dj21fcssrvbspppbhg8684vfcbn0m1abiy1r60h5fzb470k21jb";
+    sha256 = "19gclqhwccpi7y4386ap33ycwhylv4s4kwfc6ik8scmc4pw3sj9l";
   };
 
   patches = [
diff --git a/pkgs/servers/imgproxy/default.nix b/pkgs/servers/imgproxy/default.nix
new file mode 100644
index 000000000000..be78e1aa8316
--- /dev/null
+++ b/pkgs/servers/imgproxy/default.nix
@@ -0,0 +1,32 @@
+{ lib, buildGoModule, fetchFromGitHub, pkg-config, vips, gobject-introspection }:
+
+buildGoModule rec {
+  pname = "imgproxy";
+  version = "2.8.1";
+
+  src = fetchFromGitHub {
+    owner = pname;
+    repo = pname;
+    sha256 = "00hhgh6nrzg2blc6yl8rph5h5w7swlkbh0zgsj7xr0lkm10879pc";
+    rev = "v${version}";
+  };
+
+  modSha256 = "0kgd8lwcdns3skvd4bj4z85mq6hkk79mb0zzwky0wqxni8f73s6w";
+
+  buildInputs = [
+    gobject-introspection
+    pkg-config
+    vips
+  ];
+
+  preBuild = ''
+    export CGO_LDFLAGS_ALLOW='-(s|w)'
+  '';
+
+  meta = with lib; {
+    description = "Fast and secure on-the-fly image processing server written in Go";
+    homepage = "https://imgproxy.net";
+    license = licenses.mit;
+    maintainers = with maintainers; [ paluh ];
+  };
+}
diff --git a/pkgs/servers/jackett/default.nix b/pkgs/servers/jackett/default.nix
index cbac1a423525..9d9ae4e25b43 100644
--- a/pkgs/servers/jackett/default.nix
+++ b/pkgs/servers/jackett/default.nix
@@ -2,11 +2,11 @@
 
 stdenv.mkDerivation rec {
   pname = "jackett";
-  version = "0.12.1301";
+  version = "0.13.467";
 
   src = fetchurl {
     url = "https://github.com/Jackett/Jackett/releases/download/v${version}/Jackett.Binaries.LinuxAMDx64.tar.gz";
-    sha256 = "03glp5qhyb6bldslbhivywcfbxpv374q9aaybz5f2s0r9il5cb35";
+    sha256 = "1hjihafb8w9gcqdi2i8dmimbbg17c5hwwqhav3avfizq2drsrv5c";
   };
 
   buildInputs = [ makeWrapper ];
@@ -32,9 +32,9 @@ stdenv.mkDerivation rec {
 
   meta = with stdenv.lib; {
     description = "API Support for your favorite torrent trackers.";
-    homepage = https://github.com/Jackett/Jackett/;
+    homepage = "https://github.com/Jackett/Jackett/";
     license = licenses.gpl2;
     maintainers = with maintainers; [ edwtjo nyanloutre ];
-    platforms = platforms.all;
+    platforms = platforms.linux;
   };
 }
diff --git a/pkgs/servers/jellyfin/default.nix b/pkgs/servers/jellyfin/default.nix
index 6da342ae8803..6cac79bdd4e2 100644
--- a/pkgs/servers/jellyfin/default.nix
+++ b/pkgs/servers/jellyfin/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, lib, fetchurl, unzip, sqlite, makeWrapper, dotnet-netcore, ffmpeg,
+{ stdenv, lib, fetchurl, unzip, sqlite, makeWrapper, dotnetCorePackages, ffmpeg,
   fontconfig, freetype }:
 
 let
@@ -18,12 +18,12 @@ let
 
 in stdenv.mkDerivation rec {
   pname = "jellyfin";
-  version = "10.4.3";
+  version = "10.5.0";
 
   # Impossible to build anything offline with dotnet
   src = fetchurl {
     url = "https://github.com/jellyfin/jellyfin/releases/download/v${version}/jellyfin_${version}_portable.tar.gz";
-    sha256 = "11scxcwf02h6gvll0jwwac1wcpwz8d2y16yc3da0hrhy34yhysbl";
+    sha256 = "1r6ljl535f8jchm5zvrwfl4aqjk5bg7sqbwr03yyjxgriqgf36lp";
   };
 
   buildInputs = [
@@ -32,7 +32,7 @@ in stdenv.mkDerivation rec {
   ];
 
   propagatedBuildInputs = [
-    dotnet-netcore
+    dotnetCorePackages.aspnetcore_3_1
     sqlite
   ];
 
@@ -42,7 +42,7 @@ in stdenv.mkDerivation rec {
     install -dm 755 "$out/opt/jellyfin"
     cp -r * "$out/opt/jellyfin"
 
-    makeWrapper "${dotnet-netcore}/bin/dotnet" $out/bin/jellyfin \
+    makeWrapper "${dotnetCorePackages.aspnetcore_3_1}/bin/dotnet" $out/bin/jellyfin \
       --prefix LD_LIBRARY_PATH : "${stdenv.lib.makeLibraryPath [
         sqlite fontconfig freetype stdenv.cc.cc.lib
       ]}:$out/opt/jellyfin/runtimes/${runtimeDir}/native/" \
diff --git a/pkgs/servers/mail/dovecot/default.nix b/pkgs/servers/mail/dovecot/default.nix
index 12da51f9f239..fd27d18b5035 100644
--- a/pkgs/servers/mail/dovecot/default.nix
+++ b/pkgs/servers/mail/dovecot/default.nix
@@ -9,7 +9,7 @@
 }:
 
 stdenv.mkDerivation rec {
-  name = "dovecot-2.3.9.3";
+  name = "dovecot-2.3.10";
 
   nativeBuildInputs = [ perl pkgconfig ];
   buildInputs =
@@ -21,7 +21,7 @@ stdenv.mkDerivation rec {
 
   src = fetchurl {
     url = "https://dovecot.org/releases/2.3/${name}.tar.gz";
-    sha256 = "0lcnqib63nv32xr3nr4s3x8k77mbgrhc13swjl2xqnzw4fabd7zq";
+    sha256 = "1ibiz3k2flablkcqbkvfzsjnq5b5kxximhcrplflsjl57mr88ca7";
   };
 
   enableParallelBuilding = true;
@@ -81,7 +81,7 @@ stdenv.mkDerivation rec {
     ++ lib.optional withSQLite "--with-sqlite";
 
   meta = {
-    homepage = https://dovecot.org/;
+    homepage = "https://dovecot.org/";
     description = "Open source IMAP and POP3 email server written with security primarily in mind";
     maintainers = with stdenv.lib.maintainers; [ peti rickynils fpletz globin ];
     platforms = stdenv.lib.platforms.unix;
diff --git a/pkgs/servers/mail/rspamd/default.nix b/pkgs/servers/mail/rspamd/default.nix
index 15a651d8a321..79020ce78488 100644
--- a/pkgs/servers/mail/rspamd/default.nix
+++ b/pkgs/servers/mail/rspamd/default.nix
@@ -10,13 +10,13 @@ assert withHyperscan -> stdenv.isx86_64;
 
 stdenv.mkDerivation rec {
   pname = "rspamd";
-  version = "2.3";
+  version = "2.4";
 
   src = fetchFromGitHub {
     owner = "rspamd";
     repo = "rspamd";
     rev = version;
-    sha256 = "1v4kbvj9r0hs8jaisq3fr0rg0qndpbhc5h8cbpfpprmkbw4nj6pf";
+    sha256 = "15rdxcvnfn3fzjpjz6z2ljrzhlmhn2y4sxz09z2789k442n4m1qv";
   };
 
   nativeBuildInputs = [ cmake pkgconfig perl ];
diff --git a/pkgs/servers/metabase/default.nix b/pkgs/servers/metabase/default.nix
index 583c6b739cdc..2a4ac3e17764 100644
--- a/pkgs/servers/metabase/default.nix
+++ b/pkgs/servers/metabase/default.nix
@@ -2,11 +2,11 @@
 
 stdenv.mkDerivation rec {
   pname = "metabase";
-  version = "0.34.2";
+  version = "0.34.3";
 
   src = fetchurl {
     url = "http://downloads.metabase.com/v${version}/metabase.jar";
-    sha256 = "02hpm8h98dsxyjs736bss3pk253aayf9dr7csj6qn3y68hs67jpk";
+    sha256 = "0kvjqdzr9zb65c2kaqb39x8s71ynpp56aax2h1x37rds4zxdg2yg";
   };
 
   nativeBuildInputs = [ makeWrapper ];
diff --git a/pkgs/servers/monitoring/prometheus/mikrotik-exporter.nix b/pkgs/servers/monitoring/prometheus/mikrotik-exporter.nix
new file mode 100644
index 000000000000..12341eee911e
--- /dev/null
+++ b/pkgs/servers/monitoring/prometheus/mikrotik-exporter.nix
@@ -0,0 +1,22 @@
+{ stdenv, buildGoModule, fetchFromGitHub }:
+
+buildGoModule rec {
+  pname = "mikrotik-exporter-unstable";
+  version = "2020-02-10";
+
+  src = fetchFromGitHub {
+    owner = "nshttpd";
+    repo = "mikrotik-exporter";
+    sha256 = "193zh06rqp9ybsnkxwmv7l4p2h2xisw4f01jjirshsb784j44bh6";
+    rev = "3b33400d24abcfdc07dc31c15ca5ba7b82de444f";
+  };
+
+  modSha256 = "1cqjn6j3dfq51ssjx0qrajprlac1h0lb1r4af44lfpigzmrfyi07";
+
+  meta = with stdenv.lib; {
+    inherit (src.meta) homepage;
+    description = "Prometheus MikroTik device(s) exporter";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ mmilata ];
+  };
+}
diff --git a/pkgs/servers/monitoring/prometheus/nginx-exporter.nix b/pkgs/servers/monitoring/prometheus/nginx-exporter.nix
index ce3ed9ab9d66..70f39418198e 100644
--- a/pkgs/servers/monitoring/prometheus/nginx-exporter.nix
+++ b/pkgs/servers/monitoring/prometheus/nginx-exporter.nix
@@ -2,7 +2,7 @@
 
 buildGoPackage rec {
   pname = "nginx_exporter";
-  version = "0.5.0";
+  version = "0.6.0";
 
   goPackagePath = "github.com/nginxinc/nginx-prometheus-exporter";
 
@@ -14,7 +14,7 @@ buildGoPackage rec {
     rev = "v${version}";
     owner = "nginxinc";
     repo = "nginx-prometheus-exporter";
-    sha256 = "1fyn2bjq80dx4jv1rakrm0vg6i657a5rs7kkg0f9mbv1alir8kkx";
+    sha256 = "1rwafmm9x0sxj4z7x4axhrjgdy15z70a1y00hw6smq30fcpkazhq";
   };
 
   doCheck = true;
diff --git a/pkgs/servers/monitoring/prometheus/pushgateway.nix b/pkgs/servers/monitoring/prometheus/pushgateway.nix
index 48afc610c615..0a707519c64e 100644
--- a/pkgs/servers/monitoring/prometheus/pushgateway.nix
+++ b/pkgs/servers/monitoring/prometheus/pushgateway.nix
@@ -2,7 +2,7 @@
 
 buildGoPackage rec {
   pname = "pushgateway";
-  version = "0.8.0";
+  version = "1.2.0";
   rev = "v${version}";
 
   goPackagePath = "github.com/prometheus/pushgateway";
@@ -11,7 +11,7 @@ buildGoPackage rec {
     inherit rev;
     owner = "prometheus";
     repo = "pushgateway";
-    sha256 = "1mzwkxnznv6wzy7dc8rksa8gr7z92plrzls8gb8rk432zfqcbv6a";
+    sha256 = "0q57pvdfapi1xx8mw7ykvxs64alypyqbxwvrqjcrgv2jidbcd1mm";
   };
 
   buildUser = "nix@nixpkgs";
diff --git a/pkgs/servers/monitoring/prometheus/wireguard-exporter.nix b/pkgs/servers/monitoring/prometheus/wireguard-exporter.nix
index 15802510da3c..1a7a2ebdf211 100644
--- a/pkgs/servers/monitoring/prometheus/wireguard-exporter.nix
+++ b/pkgs/servers/monitoring/prometheus/wireguard-exporter.nix
@@ -11,10 +11,7 @@ rustPlatform.buildRustPackage rec {
     sha256 = "18khym7ygj29w98zf6i1l5c2pz84zla2z34l5jnh595xvwfl94pc";
   };
 
-  # Delete this on next update; see #79975 for details
-  legacyCargoFetcher = true;
-
-  cargoSha256 = "1bi9nr1dhyv322pq6fjrhs12h3wdak53mvwkbyim1hmrp62vky4m";
+  cargoSha256 = "0m7xa610k260gxn2xg6bc2y6fww0p72mvvik7278j2d15044c4yl";
 
   buildInputs = lib.optional stdenv.isDarwin Security;
 
@@ -26,8 +23,8 @@ rustPlatform.buildRustPackage rec {
 
   meta = with lib; {
     description = "A Prometheus exporter for WireGuard, written in Rust.";
+    homepage = "https://github.com/MindFlavor/prometheus_wireguard_exporter";
     license = licenses.mit;
-    homepage = https://github.com/MindFlavor/prometheus_wireguard_exporter;
     maintainers = with maintainers; [ ma27 globin ];
   };
 }
diff --git a/pkgs/servers/monitoring/zabbix/versions.nix b/pkgs/servers/monitoring/zabbix/versions.nix
index aa27b6b18ead..2e7afe5266ea 100644
--- a/pkgs/servers/monitoring/zabbix/versions.nix
+++ b/pkgs/servers/monitoring/zabbix/versions.nix
@@ -1,16 +1,16 @@
 generic: {
   v44 = generic {
-    version = "4.4.5";
-    sha256 = "1snhpqj5p16giplbxa6xfrsairnf0m1qdh378yrifbh6bf19ga4l";
+    version = "4.4.6";
+    sha256 = "03mf4sklnw1x0ixp41vnibkz0794yi9jhws7ixld8jj2czk2ifr2";
   };
 
   v40 = generic {
-    version = "4.0.17";
-    sha256 = "0h699awyw3rhjkm1b84ld0sh7bbpvy4bplmcik36q1303sfrkw21";
+    version = "4.0.18";
+    sha256 = "105f0mifgm56dd1y8vychq8m2f2wx9a7gv380xv0hrs1q038i1ki";
   };
 
   v30 = generic {
-    version = "3.0.29";
-    sha256 = "1d81w68hnkjdj1a00iasg6aidw25syi4lrbsiyc98pdihmxbpiky";
+    version = "3.0.30";
+    sha256 = "0g2qw4ff02gsnmqza1cv9dq6bqyg7w9cdli6hsln07irf0hyrb07";
   };
 }
diff --git a/pkgs/servers/mpd/default.nix b/pkgs/servers/mpd/default.nix
index 7626d487e2ab..e328a79afa69 100644
--- a/pkgs/servers/mpd/default.nix
+++ b/pkgs/servers/mpd/default.nix
@@ -102,13 +102,13 @@ let
 
     in stdenv.mkDerivation rec {
       pname = "mpd";
-      version = "0.21.19";
+      version = "0.21.20";
 
       src = fetchFromGitHub {
         owner  = "MusicPlayerDaemon";
         repo   = "MPD";
         rev    = "v${version}";
-        sha256 = "0awfnhygasww2xbxnc3a81hv2kbw3v3mblav6wjvzz25qipv19dq";
+        sha256 = "05148zwaf1ix369i1n1fx84j66qa1ab1p3m7781lk3dz5hqf185x";
       };
 
       buildInputs = [ glib boost ]
@@ -130,7 +130,7 @@ let
 
       meta = with stdenv.lib; {
         description = "A flexible, powerful daemon for playing music";
-        homepage    = http://mpd.wikia.com/wiki/Music_Player_Daemon_Wiki;
+        homepage    = "https://www.musicpd.org/";
         license     = licenses.gpl2;
         maintainers = with maintainers; [ astsmtl ehmry fpletz tobim ];
         platforms   = platforms.unix;
diff --git a/pkgs/servers/plex/raw.nix b/pkgs/servers/plex/raw.nix
index 24422842e355..666da1363517 100644
--- a/pkgs/servers/plex/raw.nix
+++ b/pkgs/servers/plex/raw.nix
@@ -8,13 +8,13 @@
 # server, and the FHS userenv and corresponding NixOS module should
 # automatically pick up the changes.
 stdenv.mkDerivation rec {
-  version = "1.18.7.2438-f342a5a43";
+  version = "1.18.7.2457-77cb9455c";
   pname = "plexmediaserver";
 
   # Fetch the source
   src = fetchurl {
     url = "https://downloads.plex.tv/plex-media-server-new/${version}/redhat/plexmediaserver-${version}.x86_64.rpm";
-    sha256 = "07lill29ck5h6lnrxj4k709afh36d6giy4jzv1jwcvcq1hdrvmzh";
+    sha256 = "1lhsf4qrq77vqj63a6r0gm90nnlqg50b6v24lrpld1aia9akm9f1";
   };
 
   outputs = [ "out" "basedb" ];
diff --git a/pkgs/servers/radarr/default.nix b/pkgs/servers/radarr/default.nix
index 61fee03a7a18..b0871a99f671 100644
--- a/pkgs/servers/radarr/default.nix
+++ b/pkgs/servers/radarr/default.nix
@@ -2,11 +2,11 @@
 
 stdenv.mkDerivation rec {
   pname = "radarr";
-  version = "0.2.0.1450";
+  version = "0.2.0.1480";
 
   src = fetchurl {
     url = "https://github.com/Radarr/Radarr/releases/download/v${version}/Radarr.develop.${version}.linux.tar.gz";
-    sha256 = "1sknq6fifpmgzryr07dnriaw2x425v2zxdcqzm65viw5p5j9xh00";
+    sha256 = "066kr9fk2ipid11aq057rqzy3b2kgd5qf9msq1fsmxixqg82m64h";
   };
 
   nativeBuildInputs = [ makeWrapper ];
@@ -23,7 +23,7 @@ stdenv.mkDerivation rec {
 
   meta = with stdenv.lib; {
     description = "A Usenet/BitTorrent movie downloader";
-    homepage = https://radarr.video/;
+    homepage = "https://radarr.video/";
     license = licenses.gpl3;
     maintainers = with maintainers; [ edwtjo ];
     platforms = platforms.all;
diff --git a/pkgs/servers/routinator/default.nix b/pkgs/servers/routinator/default.nix
index 906ee07f3556..9c99faca4842 100644
--- a/pkgs/servers/routinator/default.nix
+++ b/pkgs/servers/routinator/default.nix
@@ -11,10 +11,7 @@ rustPlatform.buildRustPackage rec {
     sha256 = "1hbqvjv9h1aghpyrl03w5f4j8gjy6n9lx83rmpsh5p7yd9ahwmf9";
   };
 
-  # Delete this on next update; see #79975 for details
-  legacyCargoFetcher = true;
-
-  cargoSha256 = "08lizhag7aqz3a59gaapsymn7sf9c6im1aw64n0r9a5advhwdh18";
+  cargoSha256 = "1chf1l9jlnhi9cyqpmcz8yfzwzmkn4lfxqhdhclvl8j4b2zvbcgc";
 
   meta = with stdenv.lib; {
     description = "An RPKI Validator written in Rust";
diff --git a/pkgs/servers/sql/mariadb/connector-c/3_1.nix b/pkgs/servers/sql/mariadb/connector-c/3_1.nix
index 257fa93d2b51..e3fc66045301 100644
--- a/pkgs/servers/sql/mariadb/connector-c/3_1.nix
+++ b/pkgs/servers/sql/mariadb/connector-c/3_1.nix
@@ -1,6 +1,6 @@
 { callPackage, ... } @ args:
 
 callPackage ./. (args // {
-  version = "3.1.5";
-  sha256 = "1mfrm595kfnpjladaq6m184npa3rxff9pr1vwa35r057s7nmzpm9";
+  version = "3.1.7";
+  sha256 = "16pmdms454jbralaw6rpx0rjlf2297p6h3q8wfk0n87kbn7vrxv4";
 })
diff --git a/pkgs/servers/sql/mariadb/connector-c/default.nix b/pkgs/servers/sql/mariadb/connector-c/default.nix
index af344d637217..fb41890d4328 100644
--- a/pkgs/servers/sql/mariadb/connector-c/default.nix
+++ b/pkgs/servers/sql/mariadb/connector-c/default.nix
@@ -41,6 +41,7 @@ stdenv.mkDerivation {
     ln -sv mariadb $out/lib/mysql
     ln -sv mariadb $out/include/mysql
     ln -sv mariadb_version.h $out/include/mariadb/mysql_version.h
+    ln -sv libmariadb.pc $out/lib/pkgconfig/mysqlclient.pc
   '';
 
   meta = {
diff --git a/pkgs/servers/sql/postgresql/default.nix b/pkgs/servers/sql/postgresql/default.nix
index b9cd50aa5fe0..129292e88907 100644
--- a/pkgs/servers/sql/postgresql/default.nix
+++ b/pkgs/servers/sql/postgresql/default.nix
@@ -3,7 +3,7 @@ let
   generic =
       # dependencies
       { stdenv, lib, fetchurl, makeWrapper
-      , glibc, zlib, readline, openssl, openssl_1_0_2, icu, systemd, libossp_uuid
+      , glibc, zlib, readline, openssl, icu, systemd, libossp_uuid
       , pkgconfig, libxml2, tzdata
 
       # This is important to obtain a version of `libpq` that does not depend on systemd.
@@ -32,10 +32,9 @@ let
     setOutputFlags = false; # $out retains configureFlags :-/
 
     buildInputs =
-      [ zlib readline libxml2 makeWrapper ]
+      [ zlib readline openssl libxml2 makeWrapper ]
       ++ lib.optionals icuEnabled [ icu ]
       ++ lib.optionals enableSystemd [ systemd ]
-      ++ [ (if atLeast "9.5" then openssl else openssl_1_0_2) ]
       ++ lib.optionals (!stdenv.isDarwin) [ libossp_uuid ];
 
     nativeBuildInputs = lib.optionals icuEnabled [ pkgconfig ];
diff --git a/pkgs/servers/sql/postgresql/ext/pgroonga.nix b/pkgs/servers/sql/postgresql/ext/pgroonga.nix
index 866dd8021d0a..f57a6e8fa508 100644
--- a/pkgs/servers/sql/postgresql/ext/pgroonga.nix
+++ b/pkgs/servers/sql/postgresql/ext/pgroonga.nix
@@ -2,11 +2,11 @@
 
 stdenv.mkDerivation rec {
   pname = "pgroonga";
-  version = "2.2.2";
+  version = "2.2.5";
 
   src = fetchurl {
     url = "https://packages.groonga.org/source/${pname}/${pname}-${version}.tar.gz";
-    sha256 = "0pdz2lpi7g1n9b5rg6kwhh6fr0bwf06zr642brmh53n6mp41186m";
+    sha256 = "0lwj99kdx9kfp4vfd7lfapj183mz235kj1vjfscfnkg5ypj656gz";
   };
 
   nativeBuildInputs = [ pkgconfig ];
diff --git a/pkgs/servers/trezord/default.nix b/pkgs/servers/trezord/default.nix
index e6427e5970fa..7bdee09fca30 100644
--- a/pkgs/servers/trezord/default.nix
+++ b/pkgs/servers/trezord/default.nix
@@ -2,7 +2,7 @@
 
 buildGoPackage rec {
   pname = "trezord-go";
-  version = "2.0.28";
+  version = "2.0.29";
 
   goPackagePath = "github.com/trezor/trezord-go";
 
@@ -10,7 +10,7 @@ buildGoPackage rec {
     owner  = "trezor";
     repo   = "trezord-go";
     rev    = "v${version}";
-    sha256 = "02c1mvn01gcfls37sa0c7v2lwffg14x54np8z7d4hjzxxzwg4gpw";
+    sha256 = "1ks1fa0027s3xp0z6qp0dxmayvrb4dwwscfhbx7da0khp153f2cp";
   };
 
   propagatedBuildInputs = [ trezor-udev-rules ];
diff --git a/pkgs/servers/ums/default.nix b/pkgs/servers/ums/default.nix
index 3fb2817277aa..503ff16caeeb 100644
--- a/pkgs/servers/ums/default.nix
+++ b/pkgs/servers/ums/default.nix
@@ -4,11 +4,11 @@
 
 stdenv.mkDerivation rec {
   pname = "ums";
-  version = "6.2.2";
+  version = "9.1.0";
   
   src = fetchurl {
-    url = "mirror://sourceforge/project/unimediaserver/Official%20Releases/Linux/" + stdenv.lib.toUpper "${pname}-${version}" + "-Java8.tgz";
-    sha256 = "1qa999la9hixy0pdj9phjvr6lwqycgdvm94nc1606vz0ivf95b15";
+    url = "mirror://sourceforge/project/unimediaserver/Official%20Releases/Linux/" + stdenv.lib.toUpper "${pname}-${version}" + ".tgz";
+    sha256 = "07wprjpwqids96v5q5fhwcxqlg8jp1vy585vl2nqbfi1vf5v294s";
     name = "${pname}-${version}.tgz";
   };
 
@@ -19,6 +19,10 @@ stdenv.mkDerivation rec {
     mkdir $out/bin
     mv $out/documentation /$out/doc
 
+    # ums >= 9.0.0 ships its own JRE in the package. if we remove it, the `UMS.sh`
+    # script will correctly fall back to the JRE specified by JAVA_HOME
+    rm -rf $out/linux/jre-x64 $out/linux/jre-x86
+
     makeWrapper "$out/UMS.sh" "$out/bin/ums" \
       --prefix LD_LIBRARY_PATH ":" "${stdenv.lib.makeLibraryPath [ libzen libmediainfo] }" \
       --set JAVA_HOME "${jre8}"
diff --git a/pkgs/servers/unpfs/default.nix b/pkgs/servers/unpfs/default.nix
index dc228c25915d..9b67a901693d 100644
--- a/pkgs/servers/unpfs/default.nix
+++ b/pkgs/servers/unpfs/default.nix
@@ -13,10 +13,7 @@ rustPlatform.buildRustPackage rec {
 
   sourceRoot = "source/example/unpfs";
 
-  # Delete this on next update; see #79975 for details
-  legacyCargoFetcher = true;
-
-  cargoSha256 = "1d33nwj3i333a6ji3r3037mgg553lc3wsawm0pz13kbvhjf336i8";
+  cargoSha256 = "13mk86d8ql2196039qb7z0rx4svwffw1mzpiyxp35gg5fhcphriq";
 
   RUSTC_BOOTSTRAP = 1;
 
diff --git a/pkgs/servers/web-apps/matomo/default.nix b/pkgs/servers/web-apps/matomo/default.nix
index 09a8d21c4ce9..90a9a88986ed 100644
--- a/pkgs/servers/web-apps/matomo/default.nix
+++ b/pkgs/servers/web-apps/matomo/default.nix
@@ -3,16 +3,16 @@
 let
   versions = {
     matomo = {
-      version = "3.13.2";
-      sha256 = "1psysdz60h5rvgbsflkfprygxnh3kq60snqamyss07rk0ahbcb16";
+      version = "3.13.3";
+      sha256 = "11mv7q33nhlz9ylsmwrhs315p14imr7sgr70gdbmi9p8jxc7kxrz";
     };
 
     matomo-beta = {
-      version = "3.13.2";
+      version = "3.13.3";
       # `beta` examples: "b1", "rc1", null
       # TOOD when updating: use null if stable version is >= latest beta or release candidate
       beta = null;
-      sha256 = "1psysdz60h5rvgbsflkfprygxnh3kq60snqamyss07rk0ahbcb16";
+      sha256 = "11mv7q33nhlz9ylsmwrhs315p14imr7sgr70gdbmi9p8jxc7kxrz";
     };
   };
   common = pname: { version, sha256, beta ? null }:
diff --git a/pkgs/servers/web-apps/moodle/default.nix b/pkgs/servers/web-apps/moodle/default.nix
index 3de6005a3cf3..98bd8e0027f4 100644
--- a/pkgs/servers/web-apps/moodle/default.nix
+++ b/pkgs/servers/web-apps/moodle/default.nix
@@ -1,7 +1,7 @@
 { stdenv, fetchurl, writeText }:
 
 let
-  version = "3.8.1";
+  version = "3.8.2";
   stableVersion = builtins.substring 0 2 (builtins.replaceStrings ["."] [""] version);
 in
 
@@ -11,7 +11,7 @@ stdenv.mkDerivation rec {
 
   src = fetchurl {
     url = "https://download.moodle.org/stable${stableVersion}/${pname}-${version}.tgz";
-    sha256 = "1xz2wq16blw9p2b6wlrn9lr524gddm5jyac5prka8kp6lrk0v0y1";
+    sha256 = "134vxsbslk7sfalmgcp744aygaxz2k080d14j8nkivk9zhplds53";
   };
 
   phpConfig = writeText "config.php" ''
diff --git a/pkgs/servers/webmetro/default.nix b/pkgs/servers/webmetro/default.nix
index 4bf329fa5db1..7d0079fca203 100644
--- a/pkgs/servers/webmetro/default.nix
+++ b/pkgs/servers/webmetro/default.nix
@@ -11,10 +11,7 @@ rustPlatform.buildRustPackage rec {
     sha256 = "1n2c7ygs8qsd5zgii6fqqcwg427bsij082bg4ijnzkq5630dx651";
   };
 
-  # Delete this on next update; see #79975 for details
-  legacyCargoFetcher = true;
-
-  cargoSha256 = "03ncwj9bn21590phcnqyclclcird7rikbhxbwhg8i9i0nad81aaa";
+  cargoSha256 = "0xifc3jwj0c6ynx0gzm5zlnfcq023fjpjmdg9x0vs1fh3b42pdsy";
 
   meta = with stdenv.lib; {
     description = "Simple relay server for broadcasting a WebM stream";
diff --git a/pkgs/servers/zoneminder/0001-Don-t-use-file-timestamp-in-cache-filename.patch b/pkgs/servers/zoneminder/0001-Don-t-use-file-timestamp-in-cache-filename.patch
new file mode 100644
index 000000000000..6ca55a147688
--- /dev/null
+++ b/pkgs/servers/zoneminder/0001-Don-t-use-file-timestamp-in-cache-filename.patch
@@ -0,0 +1,32 @@
+From db38a11228eceea10dc97ecc87023b4919caa918 Mon Sep 17 00:00:00 2001
+From: Daniel Fullmer <danielrf12@gmail.com>
+Date: Fri, 21 Feb 2020 21:52:00 -0500
+Subject: [PATCH] Don't use file timestamp in cache filename
+
+Every file in the nix store has a timestamp of "1", meaning that the
+filename would remain constant even when changing zoneminder versions.
+This would mean that newer versions would use the existing symlink to an
+older version of the source file.  We replace SRC_HASH in nix with a
+hash of the source used to build zoneminder to ensure this filename is
+unique.
+---
+ web/includes/functions.php | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/web/includes/functions.php b/web/includes/functions.php
+index 19567a5c1..0242c09bc 100644
+--- a/web/includes/functions.php
++++ b/web/includes/functions.php
+@@ -2223,7 +2223,8 @@ function cache_bust($file) {
+   $parts = pathinfo($file);
+   global $css;
+   $dirname = preg_replace('/\//', '_', $parts['dirname']);
+-  $cacheFile = $dirname.'_'.$parts['filename'].'-'.$css.'-'.filemtime($file).'.'.$parts['extension'];
++  $srcHash = '@srcHash@';
++  $cacheFile = $dirname.'_'.$parts['filename'].'-'.$css.'-'.$srcHash.'.'.$parts['extension'];
+   if ( file_exists(ZM_DIR_CACHE.'/'.$cacheFile) or symlink(ZM_PATH_WEB.'/'.$file, ZM_DIR_CACHE.'/'.$cacheFile) ) {
+     return 'cache/'.$cacheFile;
+   } else {
+-- 
+2.25.1
+
diff --git a/pkgs/servers/zoneminder/default.nix b/pkgs/servers/zoneminder/default.nix
index e536ea0373cf..93f22e77f870 100644
--- a/pkgs/servers/zoneminder/default.nix
+++ b/pkgs/servers/zoneminder/default.nix
@@ -1,4 +1,4 @@
-{ stdenv, lib, fetchFromGitHub, fetchurl, cmake, makeWrapper, pkgconfig
+{ stdenv, lib, fetchFromGitHub, fetchurl, substituteAll, cmake, makeWrapper, pkgconfig
 , curl, ffmpeg, glib, libjpeg, libselinux, libsepol, mp4v2, libmysqlclient, mysql, pcre, perl, perlPackages
 , polkit, utillinuxMinimal, x264, zlib
 , coreutils, procps, psmisc }:
@@ -78,19 +78,18 @@ let
 
 in stdenv.mkDerivation rec {
   pname = "zoneminder";
-  version = "1.32.3";
+  version = "1.34.3";
 
   src = fetchFromGitHub {
     owner  = "ZoneMinder";
     repo   = "zoneminder";
     rev    = version;
-    sha256 = "1sx2fn99861zh0gp8g53ynr1q6yfmymxamn82y54jqj6nv475njz";
+    sha256 = "0jp7950v36gxxzkwdp5i0312s26czhfsl5ixdxfzn21cx31hhlg0";
   };
 
   patches = [
     ./default-to-http-1dot1.patch
-    # Explicitly link with dynamic linking library to fix build
-    ./link-with-libdl.patch
+    ./0001-Don-t-use-file-timestamp-in-cache-filename.patch
   ];
 
   postPatch = ''
@@ -125,6 +124,10 @@ in stdenv.mkDerivation rec {
     substituteInPlace scripts/zmdbbackup.in \
       --replace /usr/bin/mysqldump ${mysql.client}/bin/mysqldump
 
+    substituteInPlace scripts/zmupdate.pl.in \
+      --replace "'mysql'" "'${mysql.client}/bin/mysql'" \
+      --replace "'mysqldump'" "'${mysql.client}/bin/mysqldump'"
+
     for f in scripts/ZoneMinder/lib/ZoneMinder/Config.pm.in \
              scripts/zmupdate.pl.in \
              src/zm_config.h.in \
@@ -133,10 +136,14 @@ in stdenv.mkDerivation rec {
       substituteInPlace $f --replace @ZM_CONFIG_SUBDIR@ /etc/zoneminder
     done
 
-   for f in includes/Event.php views/image.php skins/classic/views/image-ffmpeg.php ; do
-     substituteInPlace web/$f \
-       --replace "'ffmpeg " "'${ffmpeg}/bin/ffmpeg "
-   done
+    for f in includes/Event.php views/image.php ; do
+      substituteInPlace web/$f \
+        --replace "'ffmpeg " "'${ffmpeg}/bin/ffmpeg "
+    done
+
+    substituteInPlace web/includes/functions.php \
+      --replace "'date " "'${coreutils}/bin/date " \
+      --subst-var-by srcHash "`basename $out`"
   '';
 
   buildInputs = [
@@ -147,6 +154,7 @@ in stdenv.mkDerivation rec {
     DateManip DBI DBDmysql LWP SysMmap
     # run-time dependencies not checked at build-time
     ClassStdFast DataDump DeviceSerialPort JSONMaybeXS LWPProtocolHttps NumberBytesHuman SysCPU SysMemInfo TimeDate
+    CryptEksblowfish DataEntropy # zmupdate.pl
   ]);
 
   nativeBuildInputs = [ cmake makeWrapper pkgconfig ];
diff --git a/pkgs/servers/zoneminder/link-with-libdl.patch b/pkgs/servers/zoneminder/link-with-libdl.patch
deleted file mode 100644
index 53aaf9b25f7d..000000000000
--- a/pkgs/servers/zoneminder/link-with-libdl.patch
+++ /dev/null
@@ -1,17 +0,0 @@
---- a/src/CMakeLists.txt
-+++ b/src/CMakeLists.txt
-@@ -20,10 +20,10 @@ add_executable(zms zms.cpp)
- include_directories(libbcrypt/include/bcrypt)
- include_directories(jwt-cpp/include/jwt-cpp)
-
--target_link_libraries(zmc zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS})
--target_link_libraries(zma zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS})
--target_link_libraries(zmu zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS})
--target_link_libraries(zms zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS})
-+target_link_libraries(zmc zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS} ${CMAKE_DL_LIBS})
-+target_link_libraries(zma zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS} ${CMAKE_DL_LIBS})
-+target_link_libraries(zmu zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS} ${CMAKE_DL_LIBS})
-+target_link_libraries(zms zm ${ZM_EXTRA_LIBS} ${ZM_BIN_LIBS} ${CMAKE_DL_LIBS})
-
- # Generate man files for the binaries destined for the bin folder
- FOREACH(CBINARY zma zmc zmu)