Move SSD URL encoding helper to typed Kotlin

ober

5bbfff7dbe7f94d0ca07d3ee20d0aa898396dc8c

diff --git a/.build.yml b/.build.yml
index fb6e792..6d4eb81 100644
--- a/.build.yml
+++ b/.build.yml
@@ -5,7 +5,7 @@ packages:
   - make=4.4.1-r4
 sources:
   # Build dependency: full immutable commit, mirrored in dependencies.lock.json.
-  - "https://git.sr.ht/~lisp/jerboa#56ba1dba04d4335c565d2cf50fb6b1846c5e5dec"
+  - "https://git.sr.ht/~lisp/jerboa#beef0c004ba40d64aa2a00afb510e31cdfdda9e7"
   # The second source is the build subject selected by the SourceHut submitter.
   - https://git.sr.ht/~lisp/jerboa-android
 tasks:
@@ -14,6 +14,6 @@ tasks:
       test "$(apk info -v chez-scheme)" = chez-scheme-10.3.0-r2
       test "$(apk info -v git)" = git-2.54.0-r0
       test "$(apk info -v make)" = make-4.4.1-r4
-      test "$(git -C ../jerboa rev-parse HEAD)" = 56ba1dba04d4335c565d2cf50fb6b1846c5e5dec
-      test "$(git -C ../jerboa rev-parse 'HEAD^{tree}')" = 580aa2171465ceb07ff8a972b20d071675ce1453
+      test "$(git -C ../jerboa rev-parse HEAD)" = beef0c004ba40d64aa2a00afb510e31cdfdda9e7
+      test "$(git -C ../jerboa rev-parse 'HEAD^{tree}')" = a215813fdd7e2648ebf385ca0af397af73b73b3e
       JERBOA="chez --libdirs .:../jerboa/lib --script" make test
diff --git a/dependencies.lock.json b/dependencies.lock.json
index d7893c0..75ac3c6 100644
--- a/dependencies.lock.json
+++ b/dependencies.lock.json
@@ -11,8 +11,8 @@
   "generator_runtime": {
     "name": "jerboa",
     "repository": "https://git.sr.ht/~lisp/jerboa",
-    "commit": "56ba1dba04d4335c565d2cf50fb6b1846c5e5dec",
-    "tree": "580aa2171465ceb07ff8a972b20d071675ce1453"
+    "commit": "beef0c004ba40d64aa2a00afb510e31cdfdda9e7",
+    "tree": "a215813fdd7e2648ebf385ca0af397af73b73b3e"
   },
   "assurance_tools": {
     "osv_scanner": {
diff --git a/scripts/verify-supply-chain.sh b/scripts/verify-supply-chain.sh
index 614d25c..9825052 100755
--- a/scripts/verify-supply-chain.sh
+++ b/scripts/verify-supply-chain.sh
@@ -3,8 +3,8 @@ set -eu
 
 repo=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd -P)
 lock="$repo/dependencies.lock.json"
-jerboa_commit=56ba1dba04d4335c565d2cf50fb6b1846c5e5dec # gitsafe:ignore
-jerboa_tree=580aa2171465ceb07ff8a972b20d071675ce1453 # gitsafe:ignore
+jerboa_commit=beef0c004ba40d64aa2a00afb510e31cdfdda9e7 # gitsafe:ignore
+jerboa_tree=a215813fdd7e2648ebf385ca0af397af73b73b3e # gitsafe:ignore
 gradle_sha=20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78
 jdk_macos_sha=8fa1eff40bb637a33613b2ccb8b12c70dc3661cc22cf8e784943715769a05336
 jdk_linux_sha=d8afc263758141a66e0e3aafc321e783f7016696f4eaea067d340a269037d331
diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index 874cb13..86303d5 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -759,7 +759,7 @@
 
     (typed-kotlin-file "com/sfb/ssdreview/NetworkSafety.kt"
       (typed-library (com sfb ssdreview)
-        (export normalizeRemoteEndpointValue normalizeRemoteEndpoint localTruthHttpAllowed)
+        (export normalizeRemoteEndpointValue normalizeRemoteEndpoint urlEncode localTruthHttpAllowed)
         (def (normalizeRemoteEndpointValue (value : String) (defaultEndpoint : String)) : String
           (let ((trimmed (string-trim value)))
             (let ((base (if (string-blank? trimmed) defaultEndpoint trimmed)))
@@ -778,6 +778,8 @@
                       (string-append stripped "/api"))))))))
         (def (normalizeRemoteEndpoint (value : String)) : String
           (normalizeRemoteEndpointValue value "https://10.66.60.2:8797/api"))
+        (def (urlEncode (value : String)) : String
+          (url-encode-utf8 value))
         (def (localTruthHttpAllowed (host : String)) : Bool
           (let ((lower (string-lowercase host)))
             (if (or (or (equal? lower "localhost")
@@ -3989,7 +3991,6 @@
        "import java.io.InputStream"
        "import java.io.OutputStream"
        "import java.net.URL"
-       "import java.net.URLEncoder"
        "import java.nio.channels.FileChannel"
        "import java.nio.file.Files"
        "import java.nio.file.LinkOption"
@@ -4991,9 +4992,6 @@
        "        else -> null"
        "    }"
        ""
-       "    private fun urlEncode(value: String): String ="
-       "        URLEncoder.encode(value, \"UTF-8\")"
-       ""
        "    private fun appendJsonLine(file: File, json: JSONObject) {"
        "        val previous = if (file.exists()) readLocalText(file) else \"\""
        "        val next = previous + json.toString() + \"\\n\""