diff --git a/app/deps.ts b/app/deps.ts
index 5e02d4d53e134f19b2892816e1d1ba184f01726a..339c7690bc7ff1a0be5909311f52c0ab38397344 100644
--- a/app/deps.ts
+++ b/app/deps.ts
@@ -1,6 +1,6 @@
-export { serve } from "https://deno.land/std@0.156.0/http/server.ts";
 export { createSchema, createYoga } from "npm:graphql-yoga@5.1.1";
 export { useResponseCache } from "npm:@graphql-yoga/plugin-response-cache@1.0.0";
 export { GraphQLError } from "npm:graphql@16.8.1";
 export * as turf from "https://esm.sh/@turf/turf@6.5.0";
 export { Client, type QueryObjectResult } from "https://deno.land/x/postgres/mod.ts";
+export { deadline, DeadlineError } from "https://deno.land/std/async/mod.ts";
diff --git a/app/server.ts b/app/server.ts
index fd74a629dfe3f3655eda08fadab8dee96d08988f..ed0a47cf634d434dfea9f8f7b539faaae1d7a1b4 100644
--- a/app/server.ts
+++ b/app/server.ts
@@ -9,10 +9,10 @@ import {
   TrackEngagementViewParameters,
   TrackEngagementViewResponse,
 } from "./types.ts";
-import { createSchema, createYoga, serve, useResponseCache } from "./deps.ts";
+import { createSchema, createYoga, deadline, DeadlineError, useResponseCache } from "./deps.ts";
 import { fetchCategories, fetchEngagementOpportunities, trackEngagementView } from "./voltastics.ts";
 import { logger } from "./logging.ts";
-import { VolunteeringDB, VolunteeringDBConfig } from "./volunteering_db.ts";
+import { PostgresVolunteeringDB, VolunteeringDB, VolunteeringDBConfig } from "./volunteering_db.ts";
 import { GeoAPIClient } from "./geo_api_client.ts";
 import { Client } from "https://deno.land/x/postgres@v0.19.3/client.ts";
 
@@ -167,7 +167,7 @@ export interface ServerConfig {
   geoAPIEndpointUrl: string;
 }
 
-export const createGraphQLServer = (config: ServerConfig): GraphQLServer => {
+export const createGraphQLServer = (config: ServerConfig, volunteeringDB: VolunteeringDB): GraphQLServer => {
   const plugins = config.cacheEnabled
     ? [
       useResponseCache({
@@ -182,6 +182,36 @@ export const createGraphQLServer = (config: ServerConfig): GraphQLServer => {
       }),
     ]
     : [];
+  const resolvers = createResolvers(config, volunteeringDB);
+  return createYoga({
+    schema: createSchema({ resolvers, typeDefs }),
+    graphiql: true,
+    plugins,
+  });
+};
+
+// deno-lint-ignore no-explicit-any
+export type GraphQLServer = any;
+
+const isDbConnectionAlive = async (client: Client): Promise<Response> => {
+  const timeout = 10_000;
+  try {
+    const resultP = client.queryObject<{ db_connection_is_alive: boolean }>`SELECT true as db_connection_is_alive`;
+    const result = await deadline(resultP, timeout);
+    const alive = result.rowCount && result.rowCount > 0 && result.rows[0].db_connection_is_alive || false;
+    return new Response(`${alive}`);
+  } catch (e) {
+    if (e instanceof DeadlineError) {
+      console.error(`Liveness check timed out after ${timeout} ms`);
+      return new Response(null, { status: 503 });
+    } else {
+      console.error("Liveness check failed, reason: ", e);
+      return new Response(null, { status: 500 });
+    }
+  }
+};
+
+export const startServer = (config: ServerConfig): Deno.HttpServer<Deno.NetAddr> => {
   const client = new Client({
     hostname: config.volunteeringDB.hostname,
     port: config.volunteeringDB.port,
@@ -201,26 +231,21 @@ export const createGraphQLServer = (config: ServerConfig): GraphQLServer => {
     },
   });
   const geoAPIClient = new GeoAPIClient(config.geoAPIEndpointUrl);
-  const volunteeringDB = new VolunteeringDB(
+  const volunteeringDB = new PostgresVolunteeringDB(
     client,
     config.imageProxyBaseUrl,
     geoAPIClient,
   );
-  const resolvers = createResolvers(config, volunteeringDB);
-  return createYoga({
-    schema: createSchema({ resolvers, typeDefs }),
-    graphiql: true,
-    plugins,
-  });
-};
-
-// deno-lint-ignore no-explicit-any
-export type GraphQLServer = any;
-
-export const startServer = (config: ServerConfig): Promise<void> => {
-  const graphQLServer: GraphQLServer = createGraphQLServer(config);
-  return serve(graphQLServer.handleRequest, {
+  const graphQLServer: GraphQLServer = createGraphQLServer(config, volunteeringDB);
+  return Deno.serve({
     port: config.port,
+    hostname: "0.0.0.0",
+    handler: (req: Request) => {
+      const url = new URL(req.url);
+      console.debug(url.pathname);
+      if (url.pathname.startsWith("/liveness")) return isDbConnectionAlive(client);
+      else return graphQLServer.handleRequest(req);
+    },
     onListen({ port, hostname }) {
       logger.info(
         `Server started at http://${hostname === "0.0.0.0" ? "localhost" : hostname}:${port}/graphql`,
diff --git a/app/voltastics_test.ts b/app/voltastics_test.ts
index 7ed991ecdf2f8df4a253ece456f163cc45c3567a..4ee4ae5f80b04e1cab201ed0a0a5ada7a035e664 100644
--- a/app/voltastics_test.ts
+++ b/app/voltastics_test.ts
@@ -11,7 +11,14 @@ import {
 } from "./dev_deps.ts";
 import { processGqlRequest, stubFetch } from "./common_test.ts";
 
-import { CategoriesResponse, EngagementsResponse } from "./types.ts";
+import {
+  CategoriesResponse,
+  EngagementParameters,
+  EngagementRecommendationsParameters,
+  EngagementResponse,
+  EngagementsResponse,
+  FilteredEngagementsParameters,
+} from "./types.ts";
 import { createGraphQLServer, GraphQLServer, ServerConfig, VoltasticsConfig } from "./server.ts";
 
 import {
@@ -22,6 +29,7 @@ import {
   Munich,
 } from "./voltastics_test_data.ts";
 import { fetchCategories, fetchEngagementOpportunities } from "./voltastics.ts";
+import { VolunteeringDB } from "./volunteering_db.ts";
 
 const emptyResponse = {
   success: true,
@@ -135,6 +143,18 @@ const noCacheServerConfig = {
   geoAPIEndpointUrl: "fakeUrl",
 };
 
+const fakeVolunteeringDB = new (class implements VolunteeringDB {
+  public engagementById(_params: EngagementParameters): Promise<EngagementResponse> {
+    return Promise.reject(new Error("should not have been called"));
+  }
+  findRecommendations(_params: EngagementRecommendationsParameters): Promise<EngagementsResponse> {
+    return Promise.reject(new Error("should not have been called"));
+  }
+  filterEngagements(_params: FilteredEngagementsParameters): Promise<EngagementsResponse> {
+    return Promise.reject(new Error("should not have been called"));
+  }
+})();
+
 describe("voltastics", () => {
   let fetchStub: Stub;
 
@@ -196,7 +216,7 @@ describe("voltastics", () => {
     it("correctly parses engagement list", async () => {
       fetchStub = stubFetch(validEngagementsResponse);
 
-      const graphQLServer = createGraphQLServer(noCacheServerConfig);
+      const graphQLServer = createGraphQLServer(noCacheServerConfig, fakeVolunteeringDB);
 
       const result = await queryEngagementOpportunities(graphQLServer);
 
@@ -224,7 +244,7 @@ describe("voltastics", () => {
     it("correctly parses category list", async () => {
       fetchStub = stubFetch(apiCategoriesResponse);
 
-      const graphQLServer = createGraphQLServer(noCacheServerConfig);
+      const graphQLServer = createGraphQLServer(noCacheServerConfig, fakeVolunteeringDB);
 
       const result = await queryCategories(graphQLServer);
 
diff --git a/app/volunteering_db.ts b/app/volunteering_db.ts
index 6891fca9a31c831e1ee4e47facb45859c73dc01b..0544f68e242ef515f942a7f4a0ac0aea60c5db1b 100644
--- a/app/volunteering_db.ts
+++ b/app/volunteering_db.ts
@@ -293,7 +293,13 @@ const extractTotalResultCount = (
 
 const ERROR_CODE_NOT_FOUND = "NOT_FOUND";
 
-export class VolunteeringDB {
+export interface VolunteeringDB {
+  engagementById(params: EngagementParameters): Promise<EngagementResponse>;
+  findRecommendations(params: EngagementRecommendationsParameters): Promise<EngagementsResponse>;
+  filterEngagements(params: FilteredEngagementsParameters): Promise<EngagementsResponse>;
+}
+
+export class PostgresVolunteeringDB implements VolunteeringDB {
   private client: Client;
   private readonly imageProxyBaseUrl: string;
   private geoAPIClient: GeoAPIClient;
diff --git a/app/volunteering_db_test.ts b/app/volunteering_db_test.ts
index a75b7bc4cf1348f4ec8ba0d06f86361bd6b0f507..7aad07da1b1f08249076594dc7f5d273c1de05a2 100644
--- a/app/volunteering_db_test.ts
+++ b/app/volunteering_db_test.ts
@@ -9,7 +9,7 @@ import {
   Stub,
   stub,
 } from "./dev_deps.ts";
-import { exportedForTesting, VolunteeringDB, VolunteeringDBRow } from "./volunteering_db.ts";
+import { exportedForTesting, PostgresVolunteeringDB, VolunteeringDB, VolunteeringDBRow } from "./volunteering_db.ts";
 import { Client, GraphQLError } from "./deps.ts";
 import { GeoAPIClient } from "./geo_api_client.ts";
 
@@ -58,7 +58,7 @@ const withMockedDependencies = (queryObjectResult: VolunteeringDBRow[] = []) =>
     "resolveGeometry",
     returnsNext([Promise.resolve(testGeometry)]),
   );
-  const volunteeringDB = new VolunteeringDB(
+  const volunteeringDB = new PostgresVolunteeringDB(
     mockClient,
     "mock-image-proxy-base-url",
     mockedGeoApiClient,
diff --git a/deno.json b/deno.json
index 31f7928cca9237bcc5a6a611695c53e83b627d92..9a2211ac36358f48238fa62fe239096a5834e681 100644
--- a/deno.json
+++ b/deno.json
@@ -13,7 +13,7 @@
       "docker": "docker build -t volunteering-api . && docker run -it --init -p 8004:8004 volunteering-api",
       "coverage": "deno test --coverage=coverage && deno coverage coverage",
       "pre-commit": {
-        "cmd": "vr lint && vr fmt:check && deno test",
+        "cmd": "vr fmt && vr lint && vr test",
         "gitHook": "pre-commit"
       }
     }
diff --git a/deno.lock b/deno.lock
index 7d0c01c3a34bc40b1dafb22afd4398cc0849a44c..fa5e40111d6cdfe2a7f08d05f0f0e6f559be70ae 100644
--- a/deno.lock
+++ b/deno.lock
@@ -12,14 +12,14 @@
         "integrity": "sha512-06t1xCPXq6QFN7W1JUEf68aCwYN0OUDNAIoJe7bAqhaoa2vn7NCcuX1VHkJ/OWpmElUgCsRO6RiBbIru1in0Ig==",
         "dependencies": {
           "@envelop/types": "@envelop/types@3.0.2",
-          "tslib": "tslib@2.6.2"
+          "tslib": "tslib@2.7.0"
         }
       },
-      "@envelop/core@5.0.0": {
-        "integrity": "sha512-aJdnH/ptv+cvwfvciCBe7TSvccBwo9g0S5f6u35TBVzRVqIGkK03lFlIL+x1cnfZgN9EfR2b1PH2galrT1CdCQ==",
+      "@envelop/core@5.0.2": {
+        "integrity": "sha512-tVL6OrMe6UjqLosiE+EH9uxh2TQC0469GwF4tE014ugRaDDKKVWwFwZe0TBMlcyHKh5MD4ZxktWo/1hqUxIuhw==",
         "dependencies": {
           "@envelop/types": "@envelop/types@5.0.0",
-          "tslib": "tslib@2.6.2"
+          "tslib": "tslib@2.7.0"
         }
       },
       "@envelop/response-cache@4.0.3_@envelop+core@3.0.6_graphql@16.8.1": {
@@ -30,19 +30,19 @@
           "fast-json-stable-stringify": "fast-json-stable-stringify@2.1.0",
           "graphql": "graphql@16.8.1",
           "lru-cache": "lru-cache@6.0.0",
-          "tslib": "tslib@2.6.2"
+          "tslib": "tslib@2.7.0"
         }
       },
       "@envelop/types@3.0.2": {
         "integrity": "sha512-pOFea9ha0EkURWxJ/35axoH9fDGP5S2cUu/5Mmo9pb8zUf+TaEot8vB670XXihFEn/92759BMjLJNWBKmNhyng==",
         "dependencies": {
-          "tslib": "tslib@2.6.2"
+          "tslib": "tslib@2.7.0"
         }
       },
       "@envelop/types@5.0.0": {
         "integrity": "sha512-IPjmgSc4KpQRlO4qbEDnBEixvtb06WDmjKfi/7fkZaryh5HuOmTtixe1EupQI5XfXO8joc3d27uUZ0QdC++euA==",
         "dependencies": {
-          "tslib": "tslib@2.6.2"
+          "tslib": "tslib@2.7.0"
         }
       },
       "@envelop/validation-cache@5.1.3_@envelop+core@3.0.6_graphql@16.8.1": {
@@ -52,7 +52,7 @@
           "graphql": "graphql@16.8.1",
           "hash-it": "hash-it@6.0.0",
           "lru-cache": "lru-cache@6.0.0",
-          "tslib": "tslib@2.6.2"
+          "tslib": "tslib@2.7.0"
         }
       },
       "@graphql-tools/executor@0.0.18_graphql@16.8.1": {
@@ -62,18 +62,18 @@
           "@graphql-typed-document-node/core": "@graphql-typed-document-node/core@3.2.0_graphql@16.8.1",
           "@repeaterjs/repeater": "@repeaterjs/repeater@3.0.4",
           "graphql": "graphql@16.8.1",
-          "tslib": "tslib@2.6.2",
+          "tslib": "tslib@2.7.0",
           "value-or-promise": "value-or-promise@1.0.12"
         }
       },
-      "@graphql-tools/executor@1.2.0_graphql@16.8.1": {
-        "integrity": "sha512-SKlIcMA71Dha5JnEWlw4XxcaJ+YupuXg0QCZgl2TOLFz4SkGCwU/geAsJvUJFwK2RbVLpQv/UMq67lOaBuwDtg==",
+      "@graphql-tools/executor@1.3.1_graphql@16.8.1": {
+        "integrity": "sha512-tgJDdGf9SCAm64ofEMZdv925u6/J+eTmv36TGNLxgP2DpCJsZ6gnJ4A+0D28EazDXqJIvMiPd+3d+o3cCRCAnQ==",
         "dependencies": {
-          "@graphql-tools/utils": "@graphql-tools/utils@10.0.13_graphql@16.8.1",
+          "@graphql-tools/utils": "@graphql-tools/utils@10.5.4_graphql@16.8.1",
           "@graphql-typed-document-node/core": "@graphql-typed-document-node/core@3.2.0_graphql@16.8.1",
-          "@repeaterjs/repeater": "@repeaterjs/repeater@3.0.5",
+          "@repeaterjs/repeater": "@repeaterjs/repeater@3.0.6",
           "graphql": "graphql@16.8.1",
-          "tslib": "tslib@2.6.2",
+          "tslib": "tslib@2.7.0",
           "value-or-promise": "value-or-promise@1.0.12"
         }
       },
@@ -82,24 +82,24 @@
         "dependencies": {
           "@graphql-tools/utils": "@graphql-tools/utils@9.2.1_graphql@16.8.1",
           "graphql": "graphql@16.8.1",
-          "tslib": "tslib@2.6.2"
+          "tslib": "tslib@2.7.0"
         }
       },
-      "@graphql-tools/merge@9.0.1_graphql@16.8.1": {
-        "integrity": "sha512-hIEExWO9fjA6vzsVjJ3s0cCQ+Q/BEeMVJZtMXd7nbaVefVy0YDyYlEkeoYYNV3NVVvu1G9lr6DM1Qd0DGo9Caw==",
+      "@graphql-tools/merge@9.0.7_graphql@16.8.1": {
+        "integrity": "sha512-lbTrIuXIbUSmSumHkPRY1QX0Z8JEtmRhnIrkH7vkfeEmf0kNn/nCWvJwqokm5U7L+a+DA1wlRM4slIlbfXjJBA==",
         "dependencies": {
-          "@graphql-tools/utils": "@graphql-tools/utils@10.0.13_graphql@16.8.1",
+          "@graphql-tools/utils": "@graphql-tools/utils@10.5.4_graphql@16.8.1",
           "graphql": "graphql@16.8.1",
-          "tslib": "tslib@2.6.2"
+          "tslib": "tslib@2.7.0"
         }
       },
-      "@graphql-tools/schema@10.0.2_graphql@16.8.1": {
-        "integrity": "sha512-TbPsIZnWyDCLhgPGnDjt4hosiNU2mF/rNtSk5BVaXWnZqvKJ6gzJV4fcHcvhRIwtscDMW2/YTnK6dLVnk8pc4w==",
+      "@graphql-tools/schema@10.0.6_graphql@16.8.1": {
+        "integrity": "sha512-EIJgPRGzpvDFEjVp+RF1zNNYIC36BYuIeZ514jFoJnI6IdxyVyIRDLx/ykgMdaa1pKQerpfdqDnsF4JnZoDHSQ==",
         "dependencies": {
-          "@graphql-tools/merge": "@graphql-tools/merge@9.0.1_graphql@16.8.1",
-          "@graphql-tools/utils": "@graphql-tools/utils@10.0.13_graphql@16.8.1",
+          "@graphql-tools/merge": "@graphql-tools/merge@9.0.7_graphql@16.8.1",
+          "@graphql-tools/utils": "@graphql-tools/utils@10.5.4_graphql@16.8.1",
           "graphql": "graphql@16.8.1",
-          "tslib": "tslib@2.6.2",
+          "tslib": "tslib@2.7.0",
           "value-or-promise": "value-or-promise@1.0.12"
         }
       },
@@ -109,25 +109,25 @@
           "@graphql-tools/merge": "@graphql-tools/merge@8.4.2_graphql@16.8.1",
           "@graphql-tools/utils": "@graphql-tools/utils@9.2.1_graphql@16.8.1",
           "graphql": "graphql@16.8.1",
-          "tslib": "tslib@2.6.2",
+          "tslib": "tslib@2.7.0",
           "value-or-promise": "value-or-promise@1.0.12"
         }
       },
-      "@graphql-tools/utils@10.0.13_graphql@16.8.1": {
-        "integrity": "sha512-fMILwGr5Dm2zefNItjQ6C2rauigklv69LIwppccICuGTnGaOp3DspLt/6Lxj72cbg5d9z60Sr+Egco3CJKLsNg==",
+      "@graphql-tools/utils@10.5.4_graphql@16.8.1": {
+        "integrity": "sha512-XHnyCWSlg1ccsD8s0y6ugo5GZ5TpkTiFVNPSYms5G0s6Z/xTuSmiLBfeqgkfaCwLmLaQnRCmNDL2JRnqc2R5bQ==",
         "dependencies": {
           "@graphql-typed-document-node/core": "@graphql-typed-document-node/core@3.2.0_graphql@16.8.1",
-          "cross-inspect": "cross-inspect@1.0.0",
+          "cross-inspect": "cross-inspect@1.0.1",
           "dset": "dset@3.1.3",
           "graphql": "graphql@16.8.1",
-          "tslib": "tslib@2.6.2"
+          "tslib": "tslib@2.7.0"
         }
       },
       "@graphql-tools/utils@8.13.1_graphql@16.8.1": {
         "integrity": "sha512-qIh9yYpdUFmctVqovwMdheVNJqFh+DQNWIhX87FJStfXYnmweBUDATok9fWPleKeFwxnW8IapKmY8m8toJEkAw==",
         "dependencies": {
           "graphql": "graphql@16.8.1",
-          "tslib": "tslib@2.6.2"
+          "tslib": "tslib@2.7.0"
         }
       },
       "@graphql-tools/utils@9.2.1_graphql@16.8.1": {
@@ -135,7 +135,7 @@
         "dependencies": {
           "@graphql-typed-document-node/core": "@graphql-typed-document-node/core@3.2.0_graphql@16.8.1",
           "graphql": "graphql@16.8.1",
-          "tslib": "tslib@2.6.2"
+          "tslib": "tslib@2.7.0"
         }
       },
       "@graphql-typed-document-node/core@3.2.0_graphql@16.8.1": {
@@ -147,13 +147,13 @@
       "@graphql-yoga/logger@0.0.1": {
         "integrity": "sha512-6npFz7eZz33mXgSm1waBLMjUNG0D5hTc/p5Hcs1mojkT3KsLpCOFokzTEKboNsBhKevYcaVa/xeA7WBj4UYMLg==",
         "dependencies": {
-          "tslib": "tslib@2.6.2"
+          "tslib": "tslib@2.7.0"
         }
       },
       "@graphql-yoga/logger@2.0.0": {
         "integrity": "sha512-Mg8psdkAp+YTG1OGmvU+xa6xpsAmSir0hhr3yFYPyLNwzUj95DdIwsMpKadDj9xDpYgJcH3Hp/4JMal9DhQimA==",
         "dependencies": {
-          "tslib": "tslib@2.6.2"
+          "tslib": "tslib@2.7.0"
         }
       },
       "@graphql-yoga/plugin-response-cache@1.0.0_graphql@16.8.1_graphql-yoga@3.9.1__graphql@16.8.1__@envelop+core@3.0.6": {
@@ -168,68 +168,68 @@
         "integrity": "sha512-Vc9lh8KzIHyS3n4jBlCbz7zCjcbtQnOBpsymcRvHhFr2cuH+knmRn0EmzimMQ58jQ8kxoRXXC3KJS3RIxSdPIg==",
         "dependencies": {
           "@graphql-yoga/typed-event-target": "@graphql-yoga/typed-event-target@1.0.0",
-          "@repeaterjs/repeater": "@repeaterjs/repeater@3.0.5",
+          "@repeaterjs/repeater": "@repeaterjs/repeater@3.0.6",
           "@whatwg-node/events": "@whatwg-node/events@0.0.2",
-          "tslib": "tslib@2.6.2"
+          "tslib": "tslib@2.7.0"
         }
       },
-      "@graphql-yoga/subscription@5.0.0": {
-        "integrity": "sha512-Ri7sK8hmxd/kwaEa0YT8uqQUb2wOLsmBMxI90QDyf96lzOMJRgBuNYoEkU1pSgsgmW2glceZ96sRYfaXqwVxUw==",
+      "@graphql-yoga/subscription@5.0.1": {
+        "integrity": "sha512-1wCB1DfAnaLzS+IdoOzELGGnx1ODEg9nzQXFh4u2j02vAnne6d+v4A7HIH9EqzVdPLoAaMKXCZUUdKs+j3z1fg==",
         "dependencies": {
           "@graphql-yoga/typed-event-target": "@graphql-yoga/typed-event-target@3.0.0",
-          "@repeaterjs/repeater": "@repeaterjs/repeater@3.0.5",
-          "@whatwg-node/events": "@whatwg-node/events@0.1.1",
-          "tslib": "tslib@2.6.2"
+          "@repeaterjs/repeater": "@repeaterjs/repeater@3.0.6",
+          "@whatwg-node/events": "@whatwg-node/events@0.1.2",
+          "tslib": "tslib@2.7.0"
         }
       },
       "@graphql-yoga/typed-event-target@1.0.0": {
         "integrity": "sha512-Mqni6AEvl3VbpMtKw+TIjc9qS9a8hKhiAjFtqX488yq5oJtj9TkNlFTIacAVS3vnPiswNsmDiQqvwUOcJgi1DA==",
         "dependencies": {
-          "@repeaterjs/repeater": "@repeaterjs/repeater@3.0.5",
-          "tslib": "tslib@2.6.2"
+          "@repeaterjs/repeater": "@repeaterjs/repeater@3.0.6",
+          "tslib": "tslib@2.7.0"
         }
       },
       "@graphql-yoga/typed-event-target@3.0.0": {
         "integrity": "sha512-w+liuBySifrstuHbFrHoHAEyVnDFVib+073q8AeAJ/qqJfvFvAwUPLLtNohR/WDVRgSasfXtl3dcNuVJWN+rjg==",
         "dependencies": {
-          "@repeaterjs/repeater": "@repeaterjs/repeater@3.0.5",
-          "tslib": "tslib@2.6.2"
+          "@repeaterjs/repeater": "@repeaterjs/repeater@3.0.6",
+          "tslib": "tslib@2.7.0"
         }
       },
       "@kamilkisiela/fast-url-parser@1.1.4": {
         "integrity": "sha512-gbkePEBupNydxCelHCESvFSFM8XPh1Zs/OAVRW/rKpEqPAl5PbOM90Si8mv9bvnR53uPD2s/FiRxdvSejpRJew==",
         "dependencies": {}
       },
-      "@peculiar/asn1-schema@2.3.8": {
-        "integrity": "sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==",
+      "@peculiar/asn1-schema@2.3.13": {
+        "integrity": "sha512-3Xq3a01WkHRZL8X04Zsfg//mGaA21xlL4tlVn4v2xGT0JStiztATRkMwa5b+f/HXmY2smsiLXYK46Gwgzvfg3g==",
         "dependencies": {
           "asn1js": "asn1js@3.0.5",
           "pvtsutils": "pvtsutils@1.3.5",
-          "tslib": "tslib@2.6.2"
+          "tslib": "tslib@2.7.0"
         }
       },
       "@peculiar/json-schema@1.1.12": {
         "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==",
         "dependencies": {
-          "tslib": "tslib@2.6.2"
+          "tslib": "tslib@2.7.0"
         }
       },
-      "@peculiar/webcrypto@1.4.5": {
-        "integrity": "sha512-oDk93QCDGdxFRM8382Zdminzs44dg3M2+E5Np+JWkpqLDyJC9DviMh8F8mEJkYuUcUOGA5jHO5AJJ10MFWdbZw==",
+      "@peculiar/webcrypto@1.5.0": {
+        "integrity": "sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==",
         "dependencies": {
-          "@peculiar/asn1-schema": "@peculiar/asn1-schema@2.3.8",
+          "@peculiar/asn1-schema": "@peculiar/asn1-schema@2.3.13",
           "@peculiar/json-schema": "@peculiar/json-schema@1.1.12",
           "pvtsutils": "pvtsutils@1.3.5",
-          "tslib": "tslib@2.6.2",
-          "webcrypto-core": "webcrypto-core@1.7.8"
+          "tslib": "tslib@2.7.0",
+          "webcrypto-core": "webcrypto-core@1.8.0"
         }
       },
       "@repeaterjs/repeater@3.0.4": {
         "integrity": "sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA==",
         "dependencies": {}
       },
-      "@repeaterjs/repeater@3.0.5": {
-        "integrity": "sha512-l3YHBLAol6d/IKnB9LhpD0cEZWAoe3eFKUyTYWmFmCO2Q/WOckxLQAUyMZWwZV2M/m3+4vgRoaolFqaII82/TA==",
+      "@repeaterjs/repeater@3.0.6": {
+        "integrity": "sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==",
         "dependencies": {}
       },
       "@types/node@18.16.19": {
@@ -244,24 +244,26 @@
         "integrity": "sha512-IqnKIDWfXBJkvy/k6tzskWTc2NK3LcqHlb+KHGCrjOCH4jfQckRX0NAiIcC/vIqQkzLYw2r2CTSwAxcrtcD6lA==",
         "dependencies": {}
       },
-      "@whatwg-node/events@0.1.1": {
-        "integrity": "sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==",
-        "dependencies": {}
+      "@whatwg-node/events@0.1.2": {
+        "integrity": "sha512-ApcWxkrs1WmEMS2CaLLFUEem/49erT3sxIVjpzU5f6zmVcnijtDSrhoK2zVobOIikZJdH63jdAXOrvjf6eOUNQ==",
+        "dependencies": {
+          "tslib": "tslib@2.7.0"
+        }
       },
       "@whatwg-node/fetch@0.8.8": {
         "integrity": "sha512-CdcjGC2vdKhc13KKxgsc6/616BQ7ooDIgPeTuAiE8qfCnS0mGzcfCOoZXypQSz73nxI+GWc7ZReIAVhxoE1KCg==",
         "dependencies": {
-          "@peculiar/webcrypto": "@peculiar/webcrypto@1.4.5",
+          "@peculiar/webcrypto": "@peculiar/webcrypto@1.5.0",
           "@whatwg-node/node-fetch": "@whatwg-node/node-fetch@0.3.6",
           "busboy": "busboy@1.6.0",
           "urlpattern-polyfill": "urlpattern-polyfill@8.0.2",
-          "web-streams-polyfill": "web-streams-polyfill@3.3.2"
+          "web-streams-polyfill": "web-streams-polyfill@3.3.3"
         }
       },
-      "@whatwg-node/fetch@0.9.16": {
-        "integrity": "sha512-mqasZiUNquRe3ea9+aCAuo81BR6vq5opUKprPilIHTnrg8a21Z1T1OrI+KiMFX8OmwO5HUJe/vro47lpj2JPWQ==",
+      "@whatwg-node/fetch@0.9.21": {
+        "integrity": "sha512-Wt0jPb+04JjobK0pAAN7mEHxVHcGA9HoP3OyCsZtyAecNQeADXCZ1MihFwVwjsgaRYuGVmNlsCmLxlG6mor8Gw==",
         "dependencies": {
-          "@whatwg-node/node-fetch": "@whatwg-node/node-fetch@0.5.6",
+          "@whatwg-node/node-fetch": "@whatwg-node/node-fetch@0.5.26",
           "urlpattern-polyfill": "urlpattern-polyfill@10.0.0"
         }
       },
@@ -272,31 +274,30 @@
           "busboy": "busboy@1.6.0",
           "fast-querystring": "fast-querystring@1.1.2",
           "fast-url-parser": "fast-url-parser@1.1.3",
-          "tslib": "tslib@2.6.2"
+          "tslib": "tslib@2.7.0"
         }
       },
-      "@whatwg-node/node-fetch@0.5.6": {
-        "integrity": "sha512-cmAsGMHoI0S3AHi3CmD3ma1Q234ZI2JNmXyDyM9rLtbXejBKxU3ZWdhS+mzRIAyUxZCMGlFW1tHmROv0MDdxpw==",
+      "@whatwg-node/node-fetch@0.5.26": {
+        "integrity": "sha512-4jXDeZ4IH4bylZ6wu14VEx0aDXXhrN4TC279v9rPmn08g4EYekcYf8wdcOOnS9STjDkb6x77/6xBUTqxGgjr8g==",
         "dependencies": {
           "@kamilkisiela/fast-url-parser": "@kamilkisiela/fast-url-parser@1.1.4",
-          "@whatwg-node/events": "@whatwg-node/events@0.1.1",
           "busboy": "busboy@1.6.0",
           "fast-querystring": "fast-querystring@1.1.2",
-          "tslib": "tslib@2.6.2"
+          "tslib": "tslib@2.7.0"
         }
       },
       "@whatwg-node/server@0.7.7": {
         "integrity": "sha512-aHURgNDFm/48WVV3vhTMfnEKCYwYgdaRdRhZsQZx4UVFjGGkGay7Ys0+AYu9QT/jpoImv2oONkstoTMUprDofg==",
         "dependencies": {
           "@whatwg-node/fetch": "@whatwg-node/fetch@0.8.8",
-          "tslib": "tslib@2.6.2"
+          "tslib": "tslib@2.7.0"
         }
       },
-      "@whatwg-node/server@0.9.25": {
-        "integrity": "sha512-DlPqPPcfyzh4/9Lz1fl4c5bZsGp/1wCh7B+cK8FE1bWoW7tlZkVguvGn/XnYPKthGzEIwo/fLdHwevH44z+eeg==",
+      "@whatwg-node/server@0.9.49": {
+        "integrity": "sha512-3KzLXw80gWnTsQ746G/LFdCThTPfDodjQs4PnmoNuPa6XUOl4HWq8TlJpxtmnEEB+y+UYLal+3VQ68dtYlbUDQ==",
         "dependencies": {
-          "@whatwg-node/fetch": "@whatwg-node/fetch@0.9.16",
-          "tslib": "tslib@2.6.2"
+          "@whatwg-node/fetch": "@whatwg-node/fetch@0.9.21",
+          "tslib": "tslib@2.7.0"
         }
       },
       "asn1js@3.0.5": {
@@ -304,7 +305,7 @@
         "dependencies": {
           "pvtsutils": "pvtsutils@1.3.5",
           "pvutils": "pvutils@1.1.3",
-          "tslib": "tslib@2.6.2"
+          "tslib": "tslib@2.7.0"
         }
       },
       "busboy@1.6.0": {
@@ -313,10 +314,10 @@
           "streamsearch": "streamsearch@1.1.0"
         }
       },
-      "cross-inspect@1.0.0": {
-        "integrity": "sha512-4PFfn4b5ZN6FMNGSZlyb7wUhuN8wvj8t/VQHZdM4JsDcruGJ8L2kf9zao98QIrBPFCpdk27qst/AGTl7pL3ypQ==",
+      "cross-inspect@1.0.1": {
+        "integrity": "sha512-Pcw1JTvZLSJH83iiGWt6fRcT+BjZlCDRVwYLbUcHzv/CRpB7r0MlSrGbIyQvVSNyGnbt7G4AXuyCiDR3POvZ1A==",
         "dependencies": {
-          "tslib": "tslib@2.6.2"
+          "tslib": "tslib@2.7.0"
         }
       },
       "dset@3.1.3": {
@@ -358,24 +359,24 @@
           "dset": "dset@3.1.3",
           "graphql": "graphql@16.8.1",
           "lru-cache": "lru-cache@7.18.3",
-          "tslib": "tslib@2.6.2"
+          "tslib": "tslib@2.7.0"
         }
       },
       "graphql-yoga@5.1.1_graphql@16.8.1": {
         "integrity": "sha512-oak5nVKTHpqJgpA1aT3cJPOlCidrW7l6nbc5L6w07VdFul16ielGI2ZnQDAXO+qQih09/4WspD5x0SsSZH+hkg==",
         "dependencies": {
-          "@envelop/core": "@envelop/core@5.0.0",
-          "@graphql-tools/executor": "@graphql-tools/executor@1.2.0_graphql@16.8.1",
-          "@graphql-tools/schema": "@graphql-tools/schema@10.0.2_graphql@16.8.1",
-          "@graphql-tools/utils": "@graphql-tools/utils@10.0.13_graphql@16.8.1",
+          "@envelop/core": "@envelop/core@5.0.2",
+          "@graphql-tools/executor": "@graphql-tools/executor@1.3.1_graphql@16.8.1",
+          "@graphql-tools/schema": "@graphql-tools/schema@10.0.6_graphql@16.8.1",
+          "@graphql-tools/utils": "@graphql-tools/utils@10.5.4_graphql@16.8.1",
           "@graphql-yoga/logger": "@graphql-yoga/logger@2.0.0",
-          "@graphql-yoga/subscription": "@graphql-yoga/subscription@5.0.0",
-          "@whatwg-node/fetch": "@whatwg-node/fetch@0.9.16",
-          "@whatwg-node/server": "@whatwg-node/server@0.9.25",
+          "@graphql-yoga/subscription": "@graphql-yoga/subscription@5.0.1",
+          "@whatwg-node/fetch": "@whatwg-node/fetch@0.9.21",
+          "@whatwg-node/server": "@whatwg-node/server@0.9.49",
           "dset": "dset@3.1.3",
           "graphql": "graphql@16.8.1",
-          "lru-cache": "lru-cache@10.2.0",
-          "tslib": "tslib@2.6.2"
+          "lru-cache": "lru-cache@10.4.3",
+          "tslib": "tslib@2.7.0"
         }
       },
       "graphql@16.8.1": {
@@ -386,8 +387,8 @@
         "integrity": "sha512-KHzmSFx1KwyMPw0kXeeUD752q/Kfbzhy6dAZrjXV9kAIXGqzGvv8vhkUqj+2MGZldTo0IBpw6v7iWE7uxsvH0w==",
         "dependencies": {}
       },
-      "lru-cache@10.2.0": {
-        "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==",
+      "lru-cache@10.4.3": {
+        "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
         "dependencies": {}
       },
       "lru-cache@6.0.0": {
@@ -407,7 +408,7 @@
       "pvtsutils@1.3.5": {
         "integrity": "sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==",
         "dependencies": {
-          "tslib": "tslib@2.6.2"
+          "tslib": "tslib@2.7.0"
         }
       },
       "pvutils@1.1.3": {
@@ -418,8 +419,8 @@
         "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
         "dependencies": {}
       },
-      "tslib@2.6.2": {
-        "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
+      "tslib@2.7.0": {
+        "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==",
         "dependencies": {}
       },
       "urlpattern-polyfill@10.0.0": {
@@ -434,18 +435,18 @@
         "integrity": "sha512-Z6Uz+TYwEqE7ZN50gwn+1LCVo9ZVrpxRPOhOLnncYkY1ZzOYtrX8Fwf/rFktZ8R5mJms6EZf5TqNOMeZmnPq9Q==",
         "dependencies": {}
       },
-      "web-streams-polyfill@3.3.2": {
-        "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==",
+      "web-streams-polyfill@3.3.3": {
+        "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
         "dependencies": {}
       },
-      "webcrypto-core@1.7.8": {
-        "integrity": "sha512-eBR98r9nQXTqXt/yDRtInszPMjTaSAMJAFDg2AHsgrnczawT1asx9YNBX6k5p+MekbPF4+s/UJJrr88zsTqkSg==",
+      "webcrypto-core@1.8.0": {
+        "integrity": "sha512-kR1UQNH8MD42CYuLzvibfakG5Ew5seG85dMMoAM/1LqvckxaF6pUiidLuraIu4V+YCIFabYecUZAW0TuxAoaqw==",
         "dependencies": {
-          "@peculiar/asn1-schema": "@peculiar/asn1-schema@2.3.8",
+          "@peculiar/asn1-schema": "@peculiar/asn1-schema@2.3.13",
           "@peculiar/json-schema": "@peculiar/json-schema@1.1.12",
           "asn1js": "asn1js@3.0.5",
           "pvtsutils": "pvtsutils@1.3.5",
-          "tslib": "tslib@2.6.2"
+          "tslib": "tslib@2.7.0"
         }
       },
       "yallist@4.0.0": {
@@ -455,6 +456,7 @@
     }
   },
   "redirects": {
+    "https://deno.land/std/async/mod.ts": "https://deno.land/std@0.224.0/async/mod.ts",
     "https://deno.land/x/postgres/mod.ts": "https://deno.land/x/postgres@v0.19.3/mod.ts"
   },
   "remote": {
@@ -475,7 +477,6 @@
     "https://deno.land/std@0.156.0/async/pool.ts": "ef9eb97b388543acbf0ac32647121e4dbe629236899586c4d4311a8770fbb239",
     "https://deno.land/std@0.156.0/async/tee.ts": "d27680d911816fcb3d231e16d690e7588079e66a9b2e5ce8cc354db94fdce95f",
     "https://deno.land/std@0.156.0/http/server.ts": "c1bce1cbf4060055f622d5c3f0e406fd553e5dca111ca836d28c6268f170ebeb",
-    "https://deno.land/std@0.170.0/encoding/base64.ts": "8605e018e49211efc767686f6f687827d7f5fd5217163e981d8d693105640d7a",
     "https://deno.land/std@0.214.0/assert/assert.ts": "bec068b2fccdd434c138a555b19a2c2393b71dfaada02b7d568a01541e67cdc5",
     "https://deno.land/std@0.214.0/assert/assertion_error.ts": "9f689a101ee586c4ce92f52fa7ddd362e86434ffdf1f848e45987dc7689976b8",
     "https://deno.land/std@0.214.0/async/delay.ts": "8e1d18fe8b28ff95885e2bc54eccec1713f57f756053576d8228e6ca110793ad",
@@ -576,8 +577,18 @@
     "https://deno.land/std@0.214.0/path/windows/separator.ts": "e51c5522140eff4f8402617c5c68a201fdfa3a1a8b28dc23587cff931b665e43",
     "https://deno.land/std@0.214.0/path/windows/to_file_url.ts": "1cd63fd35ec8d1370feaa4752eccc4cc05ea5362a878be8dc7db733650995484",
     "https://deno.land/std@0.214.0/path/windows/to_namespaced_path.ts": "4ffa4fb6fae321448d5fe810b3ca741d84df4d7897e61ee29be961a6aac89a4c",
-    "https://deno.land/x/cliffy@v0.25.7/ansi/ansi_escapes.ts": "885f61f343223f27b8ec69cc138a54bea30542924eacd0f290cd84edcf691387",
-    "https://deno.land/x/cliffy@v0.25.7/ansi/deps.ts": "0f35cb7e91868ce81561f6a77426ea8bc55dc15e13f84c7352f211023af79053",
+    "https://deno.land/std@0.224.0/assert/assert.ts": "09d30564c09de846855b7b071e62b5974b001bb72a4b797958fe0660e7849834",
+    "https://deno.land/std@0.224.0/assert/assertion_error.ts": "ba8752bd27ebc51f723702fac2f54d3e94447598f54264a6653d6413738a8917",
+    "https://deno.land/std@0.224.0/async/_util.ts": "3e94e674c974c5c9277f6b3ba2d4e8403c320ba5cebb891f50afa3af4b8e0ac9",
+    "https://deno.land/std@0.224.0/async/abortable.ts": "ea6ddb98c1c6f066d5b26c8fd030e2d5afa54571182674aa07929c39dfa8c5b2",
+    "https://deno.land/std@0.224.0/async/deadline.ts": "008929d69b1efdd11b1fa55784bb4882add6adf8722868b26e87f68e35efc573",
+    "https://deno.land/std@0.224.0/async/debounce.ts": "e7bcccb17b6fe34646ac5d37c2a6d3830ca049e7e3534d2aace4001596f42eff",
+    "https://deno.land/std@0.224.0/async/delay.ts": "f90dd685b97c2f142b8069082993e437b1602b8e2561134827eeb7c12b95c499",
+    "https://deno.land/std@0.224.0/async/mod.ts": "ae2b6869ad7563f825e037e02c263507da4a55563b4a0bcd9079d2c3eb2670a2",
+    "https://deno.land/std@0.224.0/async/mux_async_iterator.ts": "8d960e951c7bf6cb682522c2ebf5bd3e738b27c6a7ac9500ab64d27054930972",
+    "https://deno.land/std@0.224.0/async/pool.ts": "2b972e3643444b73f6a8bcdd19799a2d0821b28a45fbe47fd333223eb84327f0",
+    "https://deno.land/std@0.224.0/async/retry.ts": "29025b09259c22123c599b8c957aeff2755854272954776dc9a5846c72ea4cfe",
+    "https://deno.land/std@0.224.0/async/tee.ts": "34373c58950b7ac5950632dc8c9908076abeefcc9032d6299fff92194c284fbd",
     "https://deno.land/x/postgres@v0.19.3/client.ts": "d141c65c20484c545a1119c9af7a52dcc24f75c1a5633de2b9617b0f4b2ed5c1",
     "https://deno.land/x/postgres@v0.19.3/client/error.ts": "05b0e35d65caf0ba21f7f6fab28c0811da83cd8b4897995a2f411c2c83391036",
     "https://deno.land/x/postgres@v0.19.3/connection/auth.ts": "db15c1659742ef4d2791b32834950278dc7a40cb931f8e434e6569298e58df51",
@@ -602,154 +613,6 @@
     "https://deno.land/x/postgres@v0.19.3/utils/deferred.ts": "5420531adb6c3ea29ca8aac57b9b59bd3e4b9a938a4996bbd0947a858f611080",
     "https://deno.land/x/postgres@v0.19.3/utils/utils.ts": "ca47193ea03ff5b585e487a06f106d367e509263a960b787197ce0c03113a738",
     "https://esm.sh/@turf/turf@6.5.0": "1b89eb65070928dd870eb2317386f35192ccc1145242946ba7725432eb5fe547",
-    "https://esm.sh/@turf/turf@6.5.0?pin=v129": "7f21ae610c2aec13c5be97bf136d4a181fdf28b24388af159d06bcf875f1c077",
-    "https://esm.sh/v129/@turf/along@6.5.0/denonext/along.mjs": "44414b0849204c9af40fa921158b10bae68b342ee8211d29fdbb79ad5b254f7b",
-    "https://esm.sh/v129/@turf/angle@6.5.0/denonext/angle.mjs": "c9b09724eedf7bea2a4f250cf6ab7f19873b5c5c1e34ccf678f810128711eaee",
-    "https://esm.sh/v129/@turf/area@6.5.0/denonext/area.mjs": "403cd9e934e2943d3415cd8edd93bd3da80869ab5af66b8d7057d90082842066",
-    "https://esm.sh/v129/@turf/bbox-clip@6.5.0/denonext/bbox-clip.mjs": "545a95113194f7d5d2ea98812d2b2eebbf67ed598269a4b0dd2d6e362d10b6a6",
-    "https://esm.sh/v129/@turf/bbox-polygon@6.5.0/denonext/bbox-polygon.mjs": "77fd123ae75b6b5e567e3eebec40fbbfdc4ce107c8fee6b07b1c8142e1dfcb81",
-    "https://esm.sh/v129/@turf/bbox@6.5.0/denonext/bbox.mjs": "6542931c9150d0ed060e00838ccdebe91ed40a66b529325df547ca63ce261bd5",
-    "https://esm.sh/v129/@turf/bearing@6.5.0/denonext/bearing.mjs": "d675a86d42facf1bde45b298c695a23afdaa6dbaa5ed7a06c7455e6727f33b17",
-    "https://esm.sh/v129/@turf/bezier-spline@6.5.0/denonext/bezier-spline.mjs": "635b13a77e535398c7eb845eec9d066b8751f3778cdfdaa7cbe7cac7054a247b",
-    "https://esm.sh/v129/@turf/boolean-clockwise@6.5.0/denonext/boolean-clockwise.mjs": "f7b70463a9f9c67617b9f4a5dbaba847bcdecc5ea91e8613f3dbc318e6d9278c",
-    "https://esm.sh/v129/@turf/boolean-contains@6.5.0/denonext/boolean-contains.mjs": "6c22ccc6a770d80faa1a4d2a52da81d6a480ac4a81b11c388409a0b2cb7d0afd",
-    "https://esm.sh/v129/@turf/boolean-crosses@6.5.0/denonext/boolean-crosses.mjs": "3bde85b4a96aa38c8d16be59f2bd3d9aee6666dcdc1878eb804cbdbc48dadb1d",
-    "https://esm.sh/v129/@turf/boolean-disjoint@6.5.0/denonext/boolean-disjoint.mjs": "fc4f8c5c3b2d013b088141791b2167e95d47fe10395bfbfe614f5f5e0d726202",
-    "https://esm.sh/v129/@turf/boolean-equal@6.5.0/denonext/boolean-equal.mjs": "9df7a9ceceb5a5056280d04c4560680b2b82b3f27e7d839a6bf7183c80a47ecb",
-    "https://esm.sh/v129/@turf/boolean-intersects@6.5.0/denonext/boolean-intersects.mjs": "9a9799ada0099a5f04e2302f83c8c8b48bd6289ea7fb7d302fb06804ae09bec3",
-    "https://esm.sh/v129/@turf/boolean-overlap@6.5.0/denonext/boolean-overlap.mjs": "8622709d7184a3f886a301ba8a553beb02f77dbc40ee622b731ad0acedbac70e",
-    "https://esm.sh/v129/@turf/boolean-parallel@6.5.0/denonext/boolean-parallel.mjs": "7f94e3751b6639762d87a0fafc6ee2d3b7d49d3b64a2167907d8c4ad871226db",
-    "https://esm.sh/v129/@turf/boolean-point-in-polygon@6.5.0/denonext/boolean-point-in-polygon.mjs": "e7b8e0a4e83fcdffba4f90ccdb032ce764e4bd9e3f698aafbb3d9d1a0e93ef4f",
-    "https://esm.sh/v129/@turf/boolean-point-on-line@6.5.0/denonext/boolean-point-on-line.mjs": "6c940922cedf1f6c00722312a79cf278be54d75179314a1593ad1d87ab4b0f94",
-    "https://esm.sh/v129/@turf/boolean-within@6.5.0/denonext/boolean-within.mjs": "b6c11e7a2bda52a8d91c0e561c4c5f11fc64c8bbb0f877a5f729f80752a04b3e",
-    "https://esm.sh/v129/@turf/buffer@6.5.0/denonext/buffer.mjs": "568d6a67715899f792e3bf48703bec13fb2e99b0a3569a5cebd2d1b359a44e93",
-    "https://esm.sh/v129/@turf/center-mean@6.5.0/denonext/center-mean.mjs": "f0dc4e039337e88283f6e6fe18d947c852168107e3bce46a2be2c9fc479cd109",
-    "https://esm.sh/v129/@turf/center-median@6.5.0/denonext/center-median.mjs": "14c886ec35a2ac54371a3c51cb88f8292a00c817980da19d53ba4c5f87fd28fe",
-    "https://esm.sh/v129/@turf/center-of-mass@6.5.0/denonext/center-of-mass.mjs": "cde4b7ff17ca1bf109b24177d467ccd8e7449d8b76b6c9d8614bf4e69177be2f",
-    "https://esm.sh/v129/@turf/center@6.5.0/denonext/center.mjs": "a80050a48a9d3c872d5187dd861f55590c244c08a301279cfa4d45a3e1ed2185",
-    "https://esm.sh/v129/@turf/centroid@6.5.0/denonext/centroid.mjs": "23ae0d310225330464fbba9c636c6aad2d06980850552e197325870eb3affc37",
-    "https://esm.sh/v129/@turf/circle@6.5.0/denonext/circle.mjs": "c03ed4041e91321d01aa7c0633debac471e1c39d708de83680e95260808610b0",
-    "https://esm.sh/v129/@turf/clean-coords@6.5.0/denonext/clean-coords.mjs": "fa19c67ef4671ed8cf6948b98b43d9399d3b02e661733dc7dd05c98c51b6811b",
-    "https://esm.sh/v129/@turf/clone@6.5.0/denonext/clone.mjs": "f9dcf99c95e00476bb006f9ac2aaa5ebaa3c2360002869c1dbae9ba708a08071",
-    "https://esm.sh/v129/@turf/clusters-dbscan@6.5.0/denonext/clusters-dbscan.mjs": "03ad688734c7b5e0dff9b67a77b239a80e61b70861606178e37392165a44af2d",
-    "https://esm.sh/v129/@turf/clusters-kmeans@6.5.0/denonext/clusters-kmeans.mjs": "a7e825bb00ae84f6fff65093ba530188e37d903d3f4e94a0ce7ea54a78dc0461",
-    "https://esm.sh/v129/@turf/clusters@6.5.0/denonext/clusters.mjs": "ac41f3f572813ecd7d945e9ebebe9b6e76531c541f90edc201563ee06c2cf87e",
-    "https://esm.sh/v129/@turf/collect@6.5.0/denonext/collect.mjs": "cf4efee3268bf5b6c004ca5a749a5ec0d003483ee89e544e026b49e9eb4d40b1",
-    "https://esm.sh/v129/@turf/combine@6.5.0/denonext/combine.mjs": "dccfdb227ef2cd7df996f32f142e6bc19f9d1171fb478030ce836a512e216c0a",
-    "https://esm.sh/v129/@turf/concave@6.5.0/denonext/concave.mjs": "19da00579571e61504fd6dd31ea1df58f3824b3d0dea24403eb5855741450efc",
-    "https://esm.sh/v129/@turf/convex@6.5.0/denonext/convex.mjs": "2400dda4ae59660e4615e548674cbbaa8b5b6d3ebb44caae642a9c74b5b97809",
-    "https://esm.sh/v129/@turf/destination@6.5.0/denonext/destination.mjs": "f0c17b8bef1cb915750aa9fd4e04a29357244e9e1fde9147098e43853a89094e",
-    "https://esm.sh/v129/@turf/difference@6.5.0/denonext/difference.mjs": "015601f93aae5c3e79b55aa27b57cfbf74ddbfff5413864dd02c6c62e6346ebb",
-    "https://esm.sh/v129/@turf/dissolve@6.5.0/denonext/dissolve.mjs": "f6241adb4b61cd2bb7ba90399b71da5230c1db8321803bbb55f3a9aa2137b4ef",
-    "https://esm.sh/v129/@turf/distance-weight@6.5.0/denonext/distance-weight.mjs": "4820ca7173a7122885a62e7fa3c82ea04a3e6f6f8061a6a24de83c2646e9c84f",
-    "https://esm.sh/v129/@turf/distance@6.5.0/denonext/distance.mjs": "64638e5bcee0dfa28af53c8ba1615282eb555328a8773184a98b5bc8bf097475",
-    "https://esm.sh/v129/@turf/ellipse@6.5.0/denonext/ellipse.mjs": "127266a576d672f6663262ad58dc8d0280a37497448473d5856ab62b663573c0",
-    "https://esm.sh/v129/@turf/envelope@6.5.0/denonext/envelope.mjs": "87b5da57a3cb92cacd1baff8cd81bc7f28f603cb05c836f4a350aa07f76b111d",
-    "https://esm.sh/v129/@turf/explode@6.5.0/denonext/explode.mjs": "f2addac95236611695042fb6c57350ad915b8e329df7a1b499e86ff8b0da48f8",
-    "https://esm.sh/v129/@turf/flatten@6.5.0/denonext/flatten.mjs": "78fe2fafca48cf1e5de83092653393bcdb5df0adb656fc4533be2b63d5aff641",
-    "https://esm.sh/v129/@turf/flip@6.5.0/denonext/flip.mjs": "057d9c921cbc25e20e38f5322687bfd49ad28e2151f1f93a6c4bdd42a6527552",
-    "https://esm.sh/v129/@turf/great-circle@6.5.0/denonext/great-circle.mjs": "aafe10d6d804e6cf4de0999840b4344eec81fc30dc5d757d01024db0acae868c",
-    "https://esm.sh/v129/@turf/helpers@6.5.0/denonext/helpers.mjs": "3fdabda7695d541fd0715ed5930ff747f9b2149c917b4530665ac8cc0c769d5c",
-    "https://esm.sh/v129/@turf/hex-grid@6.5.0/denonext/hex-grid.mjs": "0e075fe14fcdf13e2fbeaaf910aeb7ff51885edd3c6a94e7d8855067d2009760",
-    "https://esm.sh/v129/@turf/interpolate@6.5.0/denonext/interpolate.mjs": "2b5f9e25a6ad170b7da27c4365ab3319f31c3a92a28fd96cbf48bd142bc497c9",
-    "https://esm.sh/v129/@turf/intersect@6.5.0/denonext/intersect.mjs": "577e7471fb711a7e8840f2c36a91cc28591d97ba27c904e73e225398febd090b",
-    "https://esm.sh/v129/@turf/invariant@6.5.0/denonext/invariant.mjs": "b95db9d9a995a94ada069b4c6e62da04b90eeda521300fd5f6959176640d6f09",
-    "https://esm.sh/v129/@turf/isobands@6.5.0/denonext/isobands.mjs": "c288f0582d22545e5181fd5d67b65abf3b20452e782ef4903320fbe6931871e1",
-    "https://esm.sh/v129/@turf/isolines@6.5.0/denonext/isolines.mjs": "bcc99c57d1598e84a16ef5925fe2726e44e500fe777878a8f6dac79849ed4ded",
-    "https://esm.sh/v129/@turf/kinks@6.5.0/denonext/kinks.mjs": "370c66f62a1ab9be45b2ca08e5fcd535e197b7d8aac1bcc1e6d1968e4411f162",
-    "https://esm.sh/v129/@turf/length@6.5.0/denonext/length.mjs": "3ae387f3f62ac526cb7c0dfa96fd2d8f5e7f3db888aed12ed697461e6ff35ed2",
-    "https://esm.sh/v129/@turf/line-arc@6.5.0/denonext/line-arc.mjs": "67500316840fc25529104bcc3a3c89785755e5265d33c692d24868f902166936",
-    "https://esm.sh/v129/@turf/line-chunk@6.5.0/denonext/line-chunk.mjs": "2dc3ab5661734aa020be8edf4cd6c1cbabe35d883613bb446a3159ac7ff22139",
-    "https://esm.sh/v129/@turf/line-intersect@6.5.0/denonext/line-intersect.mjs": "93fe77c2406b0ef81a455a89e9b21ad1ccd4a311782c894d65c19c88f60747b7",
-    "https://esm.sh/v129/@turf/line-offset@6.5.0/denonext/line-offset.mjs": "d4e15ae69b65e1809062970fa710b93e2da385e6f6b7b5209a63ddc41ff2da55",
-    "https://esm.sh/v129/@turf/line-overlap@6.5.0/denonext/line-overlap.mjs": "d2f10cfa6fa7acc580a91c6bb2587293573b9a204f465b1ff91ed68f77760315",
-    "https://esm.sh/v129/@turf/line-segment@6.5.0/denonext/line-segment.mjs": "84036250318905cc4c7916c2a879a966c71aca2659aaf794e14a0d724030f425",
-    "https://esm.sh/v129/@turf/line-slice-along@6.5.0/denonext/line-slice-along.mjs": "58469549cb2dca8d00645667174fe033e47c437b0b1bfda74cbd2f1c2c58c1c1",
-    "https://esm.sh/v129/@turf/line-slice@6.5.0/denonext/line-slice.mjs": "3b492f5dc0c19419eef3f3b2a7c51fc33f0362aeec06ed6376d9ac67ce32506b",
-    "https://esm.sh/v129/@turf/line-split@6.5.0/denonext/line-split.mjs": "06e0e52b4ff7d74bc0c0fc0c21bdbe5410dace9765d8806786f52728f44603b8",
-    "https://esm.sh/v129/@turf/line-to-polygon@6.5.0/denonext/line-to-polygon.mjs": "99e53e7af0eb7515aab9de5d61a952547075b85f465043032cebbdb0f908cddd",
-    "https://esm.sh/v129/@turf/mask@6.5.0/denonext/mask.mjs": "c997ffa17373ac7c353e55cb2938f1825e855a3af2290c81c9b3762189972d02",
-    "https://esm.sh/v129/@turf/meta@6.5.0/denonext/meta.mjs": "c952de931f49cf1a123bbb0361a3d7646f2da96facd984e1fd01a39b6bb6d338",
-    "https://esm.sh/v129/@turf/midpoint@6.5.0/denonext/midpoint.mjs": "4b699b9bcbfd67d67beab4fa2bfe6e048ad8ec719af3dd8136e08f04d1936a9f",
-    "https://esm.sh/v129/@turf/moran-index@6.5.0/denonext/moran-index.mjs": "0e11787d4dba15fce94ecf711f4d4f5af68919bb957a89735704079c451361d6",
-    "https://esm.sh/v129/@turf/nearest-point-on-line@6.5.0/denonext/nearest-point-on-line.mjs": "c531dae2b4da8be9c530cbeac63fd07d19e2d11f7586a992414b6b8e132543c4",
-    "https://esm.sh/v129/@turf/nearest-point-to-line@6.5.0/denonext/nearest-point-to-line.mjs": "db7162ca6ed4d900e41ce3792aa25c74673f06f475259558bc839527142c3869",
-    "https://esm.sh/v129/@turf/nearest-point@6.5.0/denonext/nearest-point.mjs": "eda341fd2d8145dcf7c659d38bdb3c39cd436ab738d25a9bbc4eaf8c8b5f8dd6",
-    "https://esm.sh/v129/@turf/planepoint@6.5.0/denonext/planepoint.mjs": "1e63bb4297acafe776666d000f39c59be3681f6d579429aa8287504f7e9af207",
-    "https://esm.sh/v129/@turf/point-grid@6.5.0/denonext/point-grid.mjs": "2e77e6ac87757311c856b91b5d3ded5715f710c0cbec0e9747c51980dea072d5",
-    "https://esm.sh/v129/@turf/point-on-feature@6.5.0/denonext/point-on-feature.mjs": "f7562baf344c5eddfa83aeab61a1c109ca9149084e35f184f111b0f8c5737c35",
-    "https://esm.sh/v129/@turf/point-to-line-distance@6.5.0/denonext/point-to-line-distance.mjs": "5dd083ac1bbcf3cfca2fc35931d3fdd8fb9630982c873caeb28463274b9e4aed",
-    "https://esm.sh/v129/@turf/points-within-polygon@6.5.0/denonext/points-within-polygon.mjs": "b83a1b2f1e1ac67c5ba63a37fbf767af28f877532bdee3cc7f35f69af1ca0fa1",
-    "https://esm.sh/v129/@turf/polygon-smooth@6.5.0/denonext/polygon-smooth.mjs": "8d8181536d096c3e0a73b8b87b3baa889cdd3ec59e7679d0c44022595781b8f9",
-    "https://esm.sh/v129/@turf/polygon-tangents@6.5.0/denonext/polygon-tangents.mjs": "074621c2528ace81daf21332647c15fd21ff0787692c571d19314d6cb37059ad",
-    "https://esm.sh/v129/@turf/polygon-to-line@6.5.0/denonext/polygon-to-line.mjs": "6eab9436703a8a7082eea9bc16767bbdb3bb9b56d8de4b6a03c6b2a7dd4f1083",
-    "https://esm.sh/v129/@turf/polygonize@6.5.0/denonext/polygonize.mjs": "c001bb5bf1133e44397a2723c1bf11705c08c6d3ac4b0dee5ee75289cfc96a1d",
-    "https://esm.sh/v129/@turf/projection@6.5.0/denonext/projection.mjs": "774d67079ac20c177a4ee0596b336a133a97b923b43892293603bc4e431e31d7",
-    "https://esm.sh/v129/@turf/random@6.5.0/denonext/random.mjs": "31037b7d83d420fc49dab383c7b44a1e102ef65e9d3559307c1c2734741c79a6",
-    "https://esm.sh/v129/@turf/rectangle-grid@6.5.0/denonext/rectangle-grid.mjs": "1229f5e52208e91ac521e1d6864053226bcc55ec550896d18ed1677db6bd01a1",
-    "https://esm.sh/v129/@turf/rewind@6.5.0/denonext/rewind.mjs": "b396dcc12c12d38f12decf0e46de65f8f61d8f4050ffbdb39903c99d6d5c299d",
-    "https://esm.sh/v129/@turf/rhumb-bearing@6.5.0/denonext/rhumb-bearing.mjs": "c56524a4bfba12013cee26c1f5df1450140bc8d1b329aa358f4614dded2f210d",
-    "https://esm.sh/v129/@turf/rhumb-destination@6.5.0/denonext/rhumb-destination.mjs": "673561a3934415c366848b007bc8758f74184bdd77a08a30f6f75cf106e6970b",
-    "https://esm.sh/v129/@turf/rhumb-distance@6.5.0/denonext/rhumb-distance.mjs": "c6150adf0b77ddf572d18736bd9a4d1c6a1ea1cc29a3e0ed2e366a1b38c5e5dc",
-    "https://esm.sh/v129/@turf/sample@6.5.0/denonext/sample.mjs": "44bd79393b4311aaed9e28fb480e88ee9e3ecb9322f7ef79ff3bdb793c517264",
-    "https://esm.sh/v129/@turf/sector@6.5.0/denonext/sector.mjs": "4fe647c990e9a21c87f1cf49d79d49a8bd748beeec5166bdfbc66cd2f1a65ff8",
-    "https://esm.sh/v129/@turf/shortest-path@6.5.0/denonext/shortest-path.mjs": "234f71e103b6739250ac9c74f2801b34ae52d512cb3952d1ef840e4547cbea44",
-    "https://esm.sh/v129/@turf/simplify@6.5.0/denonext/simplify.mjs": "12d1210caec54f0d4c787e182543e2d2afd83703a6f885138081f9775c6f1a64",
-    "https://esm.sh/v129/@turf/square-grid@6.5.0/denonext/square-grid.mjs": "e1ac9f165fac9ff76a365dc7c17f8d57d6952d6c7a7b7247a5bb0009b08db679",
-    "https://esm.sh/v129/@turf/square@6.5.0/denonext/square.mjs": "a3d4569fb8ec0da99e7c9f0a5d0b12afa8ad7fcc1c1aa442f6ed7137b6852148",
-    "https://esm.sh/v129/@turf/standard-deviational-ellipse@6.5.0/denonext/standard-deviational-ellipse.mjs": "49eebd6815ed06d045c9701ebfafcd7628cfd40f874e1b8e5bb038f3c28416dd",
-    "https://esm.sh/v129/@turf/tag@6.5.0/denonext/tag.mjs": "ebcb5f1d9133b7ff0237592207704f8937fafb4733272d2e5bee6824c4e7fa40",
-    "https://esm.sh/v129/@turf/tesselate@6.5.0/denonext/tesselate.mjs": "b76e7111eae4dcc190e9105e974eab693b269c14822a34543729faa05dae1931",
-    "https://esm.sh/v129/@turf/tin@6.5.0/denonext/tin.mjs": "4410275f2b9eedaa66b1b94618d73aca682e60102cfc62c51b945666ac1a93f2",
-    "https://esm.sh/v129/@turf/transform-rotate@6.5.0/denonext/transform-rotate.mjs": "3f7a0374168366b022fc4a97b56f5b04d2beab3dbe54da53e6595ace2d59ec4f",
-    "https://esm.sh/v129/@turf/transform-scale@6.5.0/denonext/transform-scale.mjs": "1ad5eb86b9f7deb9a826152b4b11b54b40a5bfc02e302e4dee800a1fa69fc9f0",
-    "https://esm.sh/v129/@turf/transform-translate@6.5.0/denonext/transform-translate.mjs": "1067833dbd2293ac94941c6c34d82e7d6643e42408b85e154142cdfaf3fefaea",
-    "https://esm.sh/v129/@turf/triangle-grid@6.5.0/denonext/triangle-grid.mjs": "7d05363d8011e7a00dfdc4ed0d7c242c3f73c31b0a4c47b49b123b6e0f23a32d",
-    "https://esm.sh/v129/@turf/truncate@6.5.0/denonext/truncate.mjs": "7e829c8670e4d677e27c7e69004c141e5ce34b2d8c8a2e7f57fc953fee3f369f",
-    "https://esm.sh/v129/@turf/turf@6.5.0/denonext/turf.mjs": "e4ce111932cc95c818ae47af1e5d294868374af479124acf691a6c6625e94af7",
-    "https://esm.sh/v129/@turf/union@6.5.0/denonext/union.mjs": "a1a4c4d90a16c4debf159f411d1290ff3dc86748d367631dd085c66f96a9ac92",
-    "https://esm.sh/v129/@turf/unkink-polygon@6.5.0/denonext/unkink-polygon.mjs": "a23d0a2f1ad0c4edc26ef23969a728340656249e42d6b2714234a54489ab450f",
-    "https://esm.sh/v129/@turf/voronoi@6.5.0/denonext/voronoi.mjs": "8d738d7b304d4950787980f64531a70a2625b1486733a1e1ebd2a529155ce68e",
-    "https://esm.sh/v129/call-bind@1.0.2/denonext/call-bind.mjs": "42034a5e30e96e84ae767d59b41cb2342e43ee23b21d2d48a2629cd5f0541928",
-    "https://esm.sh/v129/call-bind@1.0.2/denonext/callBound.js": "62d697155528545fdb7473bc0033e6a9fe314f52dffd4aeda3618075874d1a31",
-    "https://esm.sh/v129/concaveman@1.2.1/denonext/concaveman.mjs": "4b3ae6c4cf95fae00cd4f0582386882c7f4713e3b60775ad640a14526b7c859b",
-    "https://esm.sh/v129/d3-array@1.2.4/denonext/d3-array.mjs": "ee413c9d8dc04471c774e641ca8d616a00e4452c62d3126011ddb8e2e3fdf97d",
-    "https://esm.sh/v129/d3-geo@1.7.1/denonext/d3-geo.mjs": "930c1a0d229ad046751c0a062107f4480cd85b2616e5e35c2a30a9bbb628a132",
-    "https://esm.sh/v129/d3-voronoi@1.1.2/denonext/d3-voronoi.mjs": "ced9affdd5f2d08f534856e4ebd1b6cef85d0bbf352a57a96758cd5e520932b3",
-    "https://esm.sh/v129/deep-equal@1.1.1/denonext/deep-equal.mjs": "3a360e6c89682ba33e59163727631ee91b8ff665e89ea33357e8802db3305cb1",
-    "https://esm.sh/v129/define-properties@1.2.0/denonext/define-properties.mjs": "2cfbf67fd79fc6b2005f385376e8f642af050f73286813dcc91c691f239306d0",
-    "https://esm.sh/v129/density-clustering@1.3.0/denonext/density-clustering.mjs": "e78d979f0ad641b6a8acecd76cc23a14a981a5878048cfa06f89e29274da7868",
-    "https://esm.sh/v129/earcut@2.2.4/denonext/earcut.mjs": "e119e9d83d550927aed5f7e2dbbf173436feed9553b2ae6113cf71b3e9e9180c",
-    "https://esm.sh/v129/function-bind@1.1.1/denonext/function-bind.mjs": "331f5d2a5830a67a767be946331716b1b9db05125891100a16e24114dba8ef87",
-    "https://esm.sh/v129/functions-have-names@1.2.3/denonext/functions-have-names.mjs": "c35b1012e1b731a55763a9da124a4be8c64a66e11cfb6837ccd17f8dace84de2",
-    "https://esm.sh/v129/geojson-equality@0.1.6/denonext/geojson-equality.mjs": "3bb6f72db6f73617c3b4901ad985bd3efefb5da96747e260c557d4629e9b1ec6",
-    "https://esm.sh/v129/geojson-rbush@3.2.0/denonext/geojson-rbush.mjs": "1f5ad12d678891f511951ac8616e1d8a8c743341aeaefc6dc83388de1815dbd1",
-    "https://esm.sh/v129/get-intrinsic@1.2.1/denonext/get-intrinsic.mjs": "2ca59cc159364c8916b80ad4a53d4f6e6f9670463c75629bb399e651511c65db",
-    "https://esm.sh/v129/has-property-descriptors@1.0.0/denonext/has-property-descriptors.mjs": "022ed691c4191f0a5ac50aaf416cb66d3b12a749f9793fe8964d3e3ff6bd58ec",
-    "https://esm.sh/v129/has-proto@1.0.1/denonext/has-proto.mjs": "443f9773e464b39534dbecaee040e5de8384e8efaeea7a6d3e333df4069d1f85",
-    "https://esm.sh/v129/has-symbols@1.0.3/denonext/has-symbols.mjs": "452727b5dbec94d538c5e8e062ed82bee701c3b752eb21e6189978e92292b7c6",
-    "https://esm.sh/v129/has-symbols@1.0.3/denonext/shams.js": "c2cefbc68690dfe7e9590c7720b1ff22d5b09251e936019d27e1b8d319c8fa9d",
-    "https://esm.sh/v129/has-tostringtag@1.0.0/denonext/shams.js": "11a0e4da09f747f03cc0f154700541d1b4ddd41db789a785ab40283e73e18394",
-    "https://esm.sh/v129/has@1.0.3/denonext/has.mjs": "d4107cf41c308ef1f7325986a947fd5d663179faaca6c8781971fccf1259e236",
-    "https://esm.sh/v129/is-arguments@1.1.1/denonext/is-arguments.mjs": "5e4deb2c366d57358e71b9aa27633d01751c679ef36c82a0c7d20c5c5894538c",
-    "https://esm.sh/v129/is-date-object@1.0.5/denonext/is-date-object.mjs": "0bb7269aca92d4bb9db1af11fdfc5f86c5215ea7d1c518e83a8d592d6e00c2f0",
-    "https://esm.sh/v129/is-regex@1.1.4/denonext/is-regex.mjs": "5a3fad5f885852f371ba3f9c5b0714f228aa39cd5cc11556452d44f69c2b9716",
-    "https://esm.sh/v129/object-is@1.1.5/denonext/object-is.mjs": "46ba00df36481ec575a6de76216ef3cc350ccdcdfbb3a44f9cb6373b30243d2b",
-    "https://esm.sh/v129/object-keys@1.1.1/denonext/object-keys.mjs": "9b1c41ea017ff80bc11f70885530199fbca620a7ac9b5b2bef20c8fb9829a4de",
-    "https://esm.sh/v129/point-in-polygon@1.1.0/denonext/point-in-polygon.mjs": "a123e6c7dbc3be3746b5b1f47e87e659ad6f26bcd02fff7611d5e4b83c9c324c",
-    "https://esm.sh/v129/polygon-clipping@0.15.3/denonext/polygon-clipping.mjs": "a96de0c21d577b7497c5063b961acd0fa3a4642d2592865cf18c1fdc87249e2c",
-    "https://esm.sh/v129/quickselect@1.1.1/denonext/quickselect.mjs": "9c5b4f3f1de466e3e6ebf9ca4dd281a01b91ed259e449088dc26ad0e034fcaf1",
-    "https://esm.sh/v129/quickselect@2.0.0/denonext/quickselect.mjs": "e03ef0934526ae4bdadb9f90f89e766294739f11ea62a7b2afc2e53069e8619b",
-    "https://esm.sh/v129/rbush@2.0.2/denonext/rbush.mjs": "df5e7d0b81145bd1afe368ca5b74d4c0e00d3ecbc2d6ee96f3e9a23ed2c1abfe",
-    "https://esm.sh/v129/rbush@3.0.1/denonext/rbush.mjs": "e3251aea1d308b6aa0237acc8278624ef437900e15510a6d78b2be69faac5516",
-    "https://esm.sh/v129/regexp.prototype.flags@1.5.0/denonext/regexp.prototype.flags.mjs": "488c2f56012b3f52fe47b7d6356dfc6f8fde44871ba0fe0760ab6e80f506dc92",
-    "https://esm.sh/v129/robust-predicates@2.0.4/denonext/umd/orient2d.min.js": "890b58754301e6c6931cf93ce6c66eec71babae0d34e30d0d24e5037772102aa",
-    "https://esm.sh/v129/skmeans@0.9.7/denonext/skmeans.mjs": "496ed2a88b6cf00e67de70aa6d01ab0e9dcb532b2db275f52fc45881553461e9",
-    "https://esm.sh/v129/splaytree@3.1.2/denonext/splaytree.mjs": "0bb044d03031466d8c51fa8f7d54783659e486588665323b33a5120aecd3ba9d",
-    "https://esm.sh/v129/tinyqueue@2.0.3/denonext/tinyqueue.mjs": "923c24576a6f8f7a152117f311f83b97b6f5e4cc925312e6cc6a15a290b8ecea",
-    "https://esm.sh/v129/topojson-client@3.1.0/denonext/topojson-client.mjs": "be4dd835dee50439be15521a32978e851181d3a8b8b61b1c040a5981d04dab6f",
-    "https://esm.sh/v129/topojson-server@3.0.1/denonext/topojson-server.mjs": "7290cfe0abbf0b77b94224971d136370c25919c3dc6a7b36c49b552e1a4ed473",
-    "https://esm.sh/v129/turf-jsts@1.2.3/denonext/turf-jsts.mjs": "2239465c9e5f3efc2d45a3349206ee320f7c54f1e6a85145fee4e91735757995",
     "https://esm.sh/v135/@turf/along@6.5.0/denonext/along.mjs": "c0b37a23533598d200708d3f036820ac40979b430b5f0bc28611a7348e2a7c94",
     "https://esm.sh/v135/@turf/angle@6.5.0/denonext/angle.mjs": "347a7b8ad0bd322092d0625bc59e19df1fa066f78f51182c22d070eb705a0e20",
     "https://esm.sh/v135/@turf/area@6.5.0/denonext/area.mjs": "d18a1d9118c7c82103587b5d305dce399992190fe3bb40c9bd7b1333b4044cbd",
diff --git a/terraform/environments/deployment.tf b/terraform/environments/deployment.tf
index 0b4f8cf0873f106697768043e0c20ff5ff172810..00cc1e712dd31727eb0532e48a639df3d98e5298 100644
--- a/terraform/environments/deployment.tf
+++ b/terraform/environments/deployment.tf
@@ -54,6 +54,13 @@ resource "google_cloud_run_service" "volunteering_api" {
         ports {
           container_port = 8004
         }
+        liveness_probe {
+          http_get {
+            path = "/liveness"
+          }
+          timeout_seconds = 10
+          period_seconds = 60
+        }
         env {
           name  = "ENVIRONMENT"
           value = local.environment