From 12c7fb3eded4b6104bb40f3b140dd0eda4385015 Mon Sep 17 00:00:00 2001
From: Volker Schukai <volker.schukai@schukai.com>
Date: Sat, 10 May 2025 16:51:49 +0200
Subject: [PATCH] chore: update packages

---
 source/go.mod                                 |   56 +-
 source/go.sum                                 |   60 +-
 .../aws/aws-sdk-go-v2/aws/credential_cache.go |   11 +
 .../aws/aws-sdk-go-v2/aws/credentials.go      |   57 +
 .../aws-sdk-go-v2/aws/go_module_metadata.go   |    2 +-
 .../aws/middleware/user_agent.go              |   57 +
 .../aws/aws-sdk-go-v2/config/CHANGELOG.md     |   33 +
 .../config/go_module_metadata.go              |    2 +-
 .../config/resolve_credentials.go             |  102 +-
 .../aws-sdk-go-v2/credentials/CHANGELOG.md    |   33 +
 .../credentials/ec2rolecreds/provider.go      |   12 +
 .../credentials/endpointcreds/provider.go     |   14 +
 .../credentials/go_module_metadata.go         |    2 +-
 .../credentials/processcreds/provider.go      |   11 +
 .../ssocreds/sso_credentials_provider.go      |   12 +
 .../credentials/static_provider.go            |   10 +
 .../stscreds/assume_role_provider.go          |   12 +
 .../stscreds/web_identity_provider.go         |   12 +
 .../feature/ec2/imds/CHANGELOG.md             |    9 +
 .../feature/ec2/imds/go_module_metadata.go    |    2 +-
 .../internal/configsources/CHANGELOG.md       |    9 +
 .../configsources/go_module_metadata.go       |    2 +-
 .../endpoints/awsrulesfn/partitions.json      |   12 +-
 .../internal/endpoints/v2/CHANGELOG.md        |    9 +
 .../endpoints/v2/go_module_metadata.go        |    2 +-
 .../aws-sdk-go-v2/internal/ini/CHANGELOG.md   |    4 +
 .../internal/ini/go_module_metadata.go        |    2 +-
 .../internal/accept-encoding/CHANGELOG.md     |    4 +
 .../accept-encoding/go_module_metadata.go     |    2 +-
 .../internal/presigned-url/CHANGELOG.md       |    9 +
 .../presigned-url/go_module_metadata.go       |    2 +-
 .../aws-sdk-go-v2/service/sso/CHANGELOG.md    |   22 +
 .../aws-sdk-go-v2/service/sso/api_client.go   |   31 +
 .../service/sso/api_op_GetRoleCredentials.go  |    3 +
 .../service/sso/api_op_ListAccountRoles.go    |    3 +
 .../service/sso/api_op_ListAccounts.go        |    3 +
 .../service/sso/api_op_Logout.go              |    3 +
 .../aws-sdk-go-v2/service/sso/generated.json  |    3 +-
 .../service/sso/go_module_metadata.go         |    2 +-
 .../sso/internal/endpoints/endpoints.go       |   31 +
 .../service/ssooidc/CHANGELOG.md              |   26 +
 .../service/ssooidc/api_client.go             |   31 +
 .../service/ssooidc/api_op_CreateToken.go     |    3 +
 .../ssooidc/api_op_CreateTokenWithIAM.go      |    9 +
 .../service/ssooidc/api_op_RegisterClient.go  |    3 +
 .../api_op_StartDeviceAuthorization.go        |    3 +
 .../service/ssooidc/deserializers.go          |   45 +
 .../service/ssooidc/generated.json            |    3 +-
 .../service/ssooidc/go_module_metadata.go     |    2 +-
 .../ssooidc/internal/endpoints/endpoints.go   |   31 +
 .../service/ssooidc/types/types.go            |   13 +
 .../aws-sdk-go-v2/service/sts/CHANGELOG.md    |   21 +
 .../aws-sdk-go-v2/service/sts/api_client.go   |   31 +
 .../service/sts/api_op_AssumeRole.go          |    3 +
 .../service/sts/api_op_AssumeRoleWithSAML.go  |    3 +
 .../sts/api_op_AssumeRoleWithWebIdentity.go   |    3 +
 .../service/sts/api_op_AssumeRoot.go          |    3 +
 .../sts/api_op_DecodeAuthorizationMessage.go  |    3 +
 .../service/sts/api_op_GetAccessKeyInfo.go    |    3 +
 .../service/sts/api_op_GetCallerIdentity.go   |    3 +
 .../service/sts/api_op_GetFederationToken.go  |    3 +
 .../service/sts/api_op_GetSessionToken.go     |    3 +
 .../aws-sdk-go-v2/service/sts/generated.json  |    3 +-
 .../service/sts/go_module_metadata.go         |    2 +-
 .../sts/internal/endpoints/endpoints.go       |   28 +
 .../service/translate/CHANGELOG.md            |   22 +
 .../service/translate/api_client.go           |   31 +
 .../translate/api_op_CreateParallelData.go    |    3 +
 .../translate/api_op_DeleteParallelData.go    |    3 +
 .../translate/api_op_DeleteTerminology.go     |    3 +
 .../api_op_DescribeTextTranslationJob.go      |    3 +
 .../translate/api_op_GetParallelData.go       |    3 +
 .../translate/api_op_GetTerminology.go        |    3 +
 .../translate/api_op_ImportTerminology.go     |    3 +
 .../service/translate/api_op_ListLanguages.go |    3 +
 .../translate/api_op_ListParallelData.go      |    3 +
 .../translate/api_op_ListTagsForResource.go   |    3 +
 .../translate/api_op_ListTerminologies.go     |    3 +
 .../api_op_ListTextTranslationJobs.go         |    3 +
 .../api_op_StartTextTranslationJob.go         |    3 +
 .../api_op_StopTextTranslationJob.go          |    3 +
 .../service/translate/api_op_TagResource.go   |    3 +
 .../translate/api_op_TranslateDocument.go     |    3 +
 .../service/translate/api_op_TranslateText.go |    3 +
 .../service/translate/api_op_UntagResource.go |    3 +
 .../translate/api_op_UpdateParallelData.go    |    3 +
 .../service/translate/generated.json          |    3 +-
 .../service/translate/go_module_metadata.go   |    2 +-
 .../translate/internal/endpoints/endpoints.go |  155 ++
 .../github.com/aws/smithy-go/CHANGELOG.md     |   10 +
 .../aws/smithy-go/go_module_metadata.go       |    2 +-
 .../charmbracelet/colorprofile/.golangci.yml  |   41 +
 .../charmbracelet/colorprofile/LICENSE        |   21 +
 .../charmbracelet/colorprofile/README.md      |  103 ++
 .../charmbracelet/colorprofile/doc.go         |    4 +
 .../charmbracelet/colorprofile/env.go         |  293 ++++
 .../charmbracelet/colorprofile/env_other.go   |    8 +
 .../charmbracelet/colorprofile/env_windows.go |   45 +
 .../charmbracelet/colorprofile/profile.go     |  399 +++++
 .../charmbracelet/colorprofile/writer.go      |  169 ++
 .../charmbracelet/lipgloss/.gitignore         |    1 +
 .../charmbracelet/lipgloss/.golangci-soft.yml |   40 -
 .../charmbracelet/lipgloss/.golangci.yml      |   13 +
 .../charmbracelet/lipgloss/README.md          |   62 +-
 .../charmbracelet/lipgloss/align.go           |    6 +-
 .../charmbracelet/lipgloss/borders.go         |   75 +-
 .../charmbracelet/lipgloss/color.go           |    2 +-
 .../github.com/charmbracelet/lipgloss/get.go  |   22 +-
 .../charmbracelet/lipgloss/ranges.go          |   48 +
 .../github.com/charmbracelet/lipgloss/set.go  |   18 +-
 .../charmbracelet/lipgloss/style.go           |    5 +-
 .../charmbracelet/log/.golangci.yml           |   11 +-
 .../github.com/charmbracelet/log/json.go      |  180 +-
 .../github.com/charmbracelet/log/level.go     |    6 +-
 .../github.com/charmbracelet/log/level_121.go |   15 -
 .../charmbracelet/log/level_no121.go          |   15 -
 .../github.com/charmbracelet/log/logger.go    |   11 +-
 .../charmbracelet/log/logger_121.go           |   15 +-
 .../charmbracelet/log/logger_no121.go         |   15 +-
 .../github.com/charmbracelet/log/pkg.go       |   25 +-
 .../github.com/charmbracelet/log/stdlog.go    |    2 +-
 .../github.com/charmbracelet/log/text.go      |    2 +-
 .../github.com/charmbracelet/x/ansi/color.go  |  728 +++++++-
 .../github.com/charmbracelet/x/ansi/cursor.go |    6 +-
 .../charmbracelet/x/ansi/finalterm.go         |   67 +
 .../charmbracelet/x/ansi/graphics.go          |   42 +-
 .../github.com/charmbracelet/x/ansi/mode.go   |   15 +
 .../github.com/charmbracelet/x/ansi/modes.go  |    6 -
 .../github.com/charmbracelet/x/ansi/sgr.go    |  128 +-
 .../github.com/charmbracelet/x/ansi/style.go  |   27 +-
 .../github.com/charmbracelet/x/ansi/title.go  |   16 +
 .../charmbracelet/x/ansi/truncate.go          |   41 +-
 .../github.com/charmbracelet/x/ansi/util.go   |    4 +-
 .../charmbracelet/x/cellbuf/LICENSE           |   21 +
 .../charmbracelet/x/cellbuf/buffer.go         |  473 +++++
 .../charmbracelet/x/cellbuf/cell.go           |  508 ++++++
 .../charmbracelet/x/cellbuf/errors.go         |    6 +
 .../charmbracelet/x/cellbuf/geom.go           |   21 +
 .../charmbracelet/x/cellbuf/hardscroll.go     |  272 +++
 .../charmbracelet/x/cellbuf/hashmap.go        |  301 ++++
 .../charmbracelet/x/cellbuf/link.go           |   14 +
 .../charmbracelet/x/cellbuf/screen.go         | 1457 ++++++++++++++++
 .../charmbracelet/x/cellbuf/sequence.go       |  131 ++
 .../charmbracelet/x/cellbuf/style.go          |   31 +
 .../charmbracelet/x/cellbuf/tabstop.go        |  137 ++
 .../charmbracelet/x/cellbuf/utils.go          |   38 +
 .../charmbracelet/x/cellbuf/wrap.go           |  185 ++
 .../charmbracelet/x/cellbuf/writer.go         |  339 ++++
 .../github.com/charmbracelet/x/term/LICENSE   |   21 +
 .../github.com/charmbracelet/x/term/term.go   |   49 +
 .../charmbracelet/x/term/term_other.go        |   39 +
 .../charmbracelet/x/term/term_unix.go         |   96 ++
 .../charmbracelet/x/term/term_unix_bsd.go     |   11 +
 .../charmbracelet/x/term/term_unix_other.go   |   11 +
 .../charmbracelet/x/term/term_windows.go      |   87 +
 .../charmbracelet/x/term/terminal.go          |   12 +
 .../github.com/charmbracelet/x/term/util.go   |   47 +
 .../evanw/esbuild/internal/bundler/bundler.go |   32 +-
 .../esbuild/internal/compat/css_table.go      |    2 +-
 .../evanw/esbuild/internal/compat/js_table.go |    2 +-
 .../internal/css_parser/css_nesting.go        |   43 +-
 .../evanw/esbuild/internal/fs/fs_mock.go      |    2 +-
 .../esbuild/internal/js_parser/js_parser.go   |   63 +
 .../internal/js_parser/js_parser_lower.go     |    5 +-
 .../internal/js_parser/sourcemap_parser.go    |  565 +++---
 .../evanw/esbuild/internal/linker/linker.go   |   94 +-
 .../evanw/esbuild/internal/logger/msg_ids.go  |   10 -
 .../esbuild/internal/resolver/resolver.go     |   66 +-
 .../github.com/evanw/esbuild/pkg/api/api.go   |    6 +
 .../evanw/esbuild/pkg/api/serve_other.go      |   45 +-
 .../muesli/termenv/.golangci-soft.yml         |    6 +-
 .../github.com/muesli/termenv/.golangci.yml   |    1 -
 .../github.com/muesli/termenv/README.md       |    6 +-
 .../github.com/muesli/termenv/ansicolors.go   |    2 +-
 .../vendor/github.com/muesli/termenv/color.go |   17 +-
 .../muesli/termenv/constants_zos.go           |    8 +
 .../github.com/muesli/termenv/output.go       |   34 +-
 .../github.com/muesli/termenv/profile.go      |   25 +-
 .../github.com/muesli/termenv/screen.go       |   90 +-
 .../vendor/github.com/muesli/termenv/style.go |    4 +-
 .../muesli/termenv/templatehelper.go          |    2 +
 .../github.com/muesli/termenv/termenv.go      |   17 +-
 .../muesli/termenv/termenv_posix.go           |    4 +-
 .../github.com/muesli/termenv/termenv_unix.go |   36 +-
 .../muesli/termenv/termenv_windows.go         |    5 +-
 .../github.com/tdewolff/parse/v2/binary.go    |   40 +-
 .../tdewolff/parse/v2/binary_unix.go          |    8 +-
 .../vendor/github.com/xo/terminfo/.gitignore  |    9 +
 source/vendor/github.com/xo/terminfo/LICENSE  |   21 +
 .../vendor/github.com/xo/terminfo/README.md   |  139 ++
 source/vendor/github.com/xo/terminfo/caps.go  |   31 +
 .../vendor/github.com/xo/terminfo/capvals.go  | 1525 +++++++++++++++++
 source/vendor/github.com/xo/terminfo/color.go |   88 +
 source/vendor/github.com/xo/terminfo/dec.go   |  245 +++
 source/vendor/github.com/xo/terminfo/load.go  |   64 +
 source/vendor/github.com/xo/terminfo/param.go |  405 +++++
 source/vendor/github.com/xo/terminfo/stack.go |   48 +
 .../vendor/github.com/xo/terminfo/terminfo.go |  479 ++++++
 .../vendor/golang.org/x/exp/slices/slices.go  |   41 +-
 source/vendor/golang.org/x/exp/slices/sort.go |   25 +-
 .../golang.org/x/net/html/atom/table.go       | 1256 +++++++-------
 source/vendor/golang.org/x/net/html/parse.go  |    4 +-
 source/vendor/golang.org/x/net/html/token.go  |   18 +-
 .../golang.org/x/sys/unix/syscall_darwin.go   |  149 +-
 .../golang.org/x/sys/unix/syscall_linux.go    |   42 +-
 .../x/sys/unix/zsyscall_darwin_amd64.go       |   84 +
 .../x/sys/unix/zsyscall_darwin_amd64.s        |   20 +
 .../x/sys/unix/zsyscall_darwin_arm64.go       |   84 +
 .../x/sys/unix/zsyscall_darwin_arm64.s        |   20 +
 .../x/sys/windows/security_windows.go         |   49 +-
 .../x/sys/windows/syscall_windows.go          |    6 +-
 .../golang.org/x/sys/windows/types_windows.go |  239 +++
 .../x/sys/windows/zsyscall_windows.go         |    9 +
 source/vendor/modules.txt                     |  100 +-
 214 files changed, 13199 insertions(+), 1530 deletions(-)
 create mode 100644 source/vendor/github.com/charmbracelet/colorprofile/.golangci.yml
 create mode 100644 source/vendor/github.com/charmbracelet/colorprofile/LICENSE
 create mode 100644 source/vendor/github.com/charmbracelet/colorprofile/README.md
 create mode 100644 source/vendor/github.com/charmbracelet/colorprofile/doc.go
 create mode 100644 source/vendor/github.com/charmbracelet/colorprofile/env.go
 create mode 100644 source/vendor/github.com/charmbracelet/colorprofile/env_other.go
 create mode 100644 source/vendor/github.com/charmbracelet/colorprofile/env_windows.go
 create mode 100644 source/vendor/github.com/charmbracelet/colorprofile/profile.go
 create mode 100644 source/vendor/github.com/charmbracelet/colorprofile/writer.go
 delete mode 100644 source/vendor/github.com/charmbracelet/lipgloss/.golangci-soft.yml
 create mode 100644 source/vendor/github.com/charmbracelet/lipgloss/ranges.go
 delete mode 100644 source/vendor/github.com/charmbracelet/log/level_121.go
 delete mode 100644 source/vendor/github.com/charmbracelet/log/level_no121.go
 create mode 100644 source/vendor/github.com/charmbracelet/x/ansi/finalterm.go
 create mode 100644 source/vendor/github.com/charmbracelet/x/cellbuf/LICENSE
 create mode 100644 source/vendor/github.com/charmbracelet/x/cellbuf/buffer.go
 create mode 100644 source/vendor/github.com/charmbracelet/x/cellbuf/cell.go
 create mode 100644 source/vendor/github.com/charmbracelet/x/cellbuf/errors.go
 create mode 100644 source/vendor/github.com/charmbracelet/x/cellbuf/geom.go
 create mode 100644 source/vendor/github.com/charmbracelet/x/cellbuf/hardscroll.go
 create mode 100644 source/vendor/github.com/charmbracelet/x/cellbuf/hashmap.go
 create mode 100644 source/vendor/github.com/charmbracelet/x/cellbuf/link.go
 create mode 100644 source/vendor/github.com/charmbracelet/x/cellbuf/screen.go
 create mode 100644 source/vendor/github.com/charmbracelet/x/cellbuf/sequence.go
 create mode 100644 source/vendor/github.com/charmbracelet/x/cellbuf/style.go
 create mode 100644 source/vendor/github.com/charmbracelet/x/cellbuf/tabstop.go
 create mode 100644 source/vendor/github.com/charmbracelet/x/cellbuf/utils.go
 create mode 100644 source/vendor/github.com/charmbracelet/x/cellbuf/wrap.go
 create mode 100644 source/vendor/github.com/charmbracelet/x/cellbuf/writer.go
 create mode 100644 source/vendor/github.com/charmbracelet/x/term/LICENSE
 create mode 100644 source/vendor/github.com/charmbracelet/x/term/term.go
 create mode 100644 source/vendor/github.com/charmbracelet/x/term/term_other.go
 create mode 100644 source/vendor/github.com/charmbracelet/x/term/term_unix.go
 create mode 100644 source/vendor/github.com/charmbracelet/x/term/term_unix_bsd.go
 create mode 100644 source/vendor/github.com/charmbracelet/x/term/term_unix_other.go
 create mode 100644 source/vendor/github.com/charmbracelet/x/term/term_windows.go
 create mode 100644 source/vendor/github.com/charmbracelet/x/term/terminal.go
 create mode 100644 source/vendor/github.com/charmbracelet/x/term/util.go
 create mode 100644 source/vendor/github.com/muesli/termenv/constants_zos.go
 create mode 100644 source/vendor/github.com/xo/terminfo/.gitignore
 create mode 100644 source/vendor/github.com/xo/terminfo/LICENSE
 create mode 100644 source/vendor/github.com/xo/terminfo/README.md
 create mode 100644 source/vendor/github.com/xo/terminfo/caps.go
 create mode 100644 source/vendor/github.com/xo/terminfo/capvals.go
 create mode 100644 source/vendor/github.com/xo/terminfo/color.go
 create mode 100644 source/vendor/github.com/xo/terminfo/dec.go
 create mode 100644 source/vendor/github.com/xo/terminfo/load.go
 create mode 100644 source/vendor/github.com/xo/terminfo/param.go
 create mode 100644 source/vendor/github.com/xo/terminfo/stack.go
 create mode 100644 source/vendor/github.com/xo/terminfo/terminfo.go

diff --git a/source/go.mod b/source/go.mod
index aa33dc8..536064d 100644
--- a/source/go.mod
+++ b/source/go.mod
@@ -1,53 +1,55 @@
 module gitlab.schukai.com/oss/bob
 
-go 1.22.0
-
-toolchain go1.22.4
+go 1.23.0
 
 require (
 	github.com/andybalholm/cascadia v1.3.3
-	github.com/charmbracelet/log v0.4.0
-	github.com/evanw/esbuild v0.25.0
-	github.com/tdewolff/parse/v2 v2.7.20
+	github.com/charmbracelet/log v0.4.1
+	github.com/evanw/esbuild v0.25.4
+	github.com/tdewolff/parse/v2 v2.8.0
 	gitlab.schukai.com/oss/libraries/go/application/xflags.git v1.16.5
 	gitlab.schukai.com/oss/libraries/go/markup/html.git v0.4.7
 	gitlab.schukai.com/oss/libraries/go/utilities/pathfinder.git v0.9.5 // indirect
-	golang.org/x/crypto v0.33.0
-	golang.org/x/net v0.34.0
+	golang.org/x/crypto v0.38.0
+	golang.org/x/net v0.40.0
 	gopkg.in/yaml.v3 v3.0.1
 )
 
 require (
-	github.com/aws/aws-sdk-go-v2 v1.36.1
-	github.com/aws/aws-sdk-go-v2/config v1.29.6
-	github.com/aws/aws-sdk-go-v2/service/translate v1.28.17
+	github.com/aws/aws-sdk-go-v2 v1.36.3
+	github.com/aws/aws-sdk-go-v2/config v1.29.14
+	github.com/aws/aws-sdk-go-v2/service/translate v1.29.2
 )
 
 require (
-	github.com/aws/aws-sdk-go-v2/credentials v1.17.59 // indirect
-	github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.28 // indirect
-	github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.32 // indirect
-	github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.32 // indirect
-	github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2 // indirect
-	github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2 // indirect
-	github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.13 // indirect
-	github.com/aws/aws-sdk-go-v2/service/sso v1.24.15 // indirect
-	github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.14 // indirect
-	github.com/aws/aws-sdk-go-v2/service/sts v1.33.14 // indirect
-	github.com/aws/smithy-go v1.22.2 // indirect
+	github.com/aws/aws-sdk-go-v2/credentials v1.17.67 // indirect
+	github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 // indirect
+	github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 // indirect
+	github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 // indirect
+	github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect
+	github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 // indirect
+	github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 // indirect
+	github.com/aws/aws-sdk-go-v2/service/sso v1.25.3 // indirect
+	github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1 // indirect
+	github.com/aws/aws-sdk-go-v2/service/sts v1.33.19 // indirect
+	github.com/aws/smithy-go v1.22.3 // indirect
 	github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
-	github.com/charmbracelet/lipgloss v1.0.0 // indirect
-	github.com/charmbracelet/x/ansi v0.8.0 // indirect
+	github.com/charmbracelet/colorprofile v0.3.1 // indirect
+	github.com/charmbracelet/lipgloss v1.1.0 // indirect
+	github.com/charmbracelet/x/ansi v0.9.2 // indirect
+	github.com/charmbracelet/x/cellbuf v0.0.13 // indirect
+	github.com/charmbracelet/x/term v0.2.1 // indirect
 	github.com/go-logfmt/logfmt v0.6.0 // indirect
 	github.com/kr/pretty v0.3.0 // indirect
 	github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
 	github.com/mattn/go-isatty v0.0.20 // indirect
 	github.com/mattn/go-runewidth v0.0.16 // indirect
-	github.com/muesli/termenv v0.15.2 // indirect
+	github.com/muesli/termenv v0.16.0 // indirect
 	github.com/rivo/uniseg v0.4.7 // indirect
 	github.com/volker-schukai/tokenizer v1.0.0 // indirect
+	github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
 	gitlab.schukai.com/oss/libraries/go/utilities/data.git v0.2.2 // indirect
-	golang.org/x/exp v0.0.0-20250207012021-f9890c6ad9f3 // indirect
-	golang.org/x/sys v0.30.0 // indirect
+	golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect
+	golang.org/x/sys v0.33.0 // indirect
 	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
 )
diff --git a/source/go.sum b/source/go.sum
index 1e7377e..8d5eae4 100644
--- a/source/go.sum
+++ b/source/go.sum
@@ -2,48 +2,88 @@ github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kk
 github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA=
 github.com/aws/aws-sdk-go-v2 v1.36.1 h1:iTDl5U6oAhkNPba0e1t1hrwAo02ZMqbrGq4k5JBWM5E=
 github.com/aws/aws-sdk-go-v2 v1.36.1/go.mod h1:5PMILGVKiW32oDzjj6RU52yrNrDPUHcbZQYr1sM7qmM=
+github.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM=
+github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg=
 github.com/aws/aws-sdk-go-v2/config v1.29.6 h1:fqgqEKK5HaZVWLQoLiC9Q+xDlSp+1LYidp6ybGE2OGg=
 github.com/aws/aws-sdk-go-v2/config v1.29.6/go.mod h1:Ft+WLODzDQmCTHDvqAH1JfC2xxbZ0MxpZAcJqmE1LTQ=
+github.com/aws/aws-sdk-go-v2/config v1.29.14 h1:f+eEi/2cKCg9pqKBoAIwRGzVb70MRKqWX4dg1BDcSJM=
+github.com/aws/aws-sdk-go-v2/config v1.29.14/go.mod h1:wVPHWcIFv3WO89w0rE10gzf17ZYy+UVS1Geq8Iei34g=
 github.com/aws/aws-sdk-go-v2/credentials v1.17.59 h1:9btwmrt//Q6JcSdgJOLI98sdr5p7tssS9yAsGe8aKP4=
 github.com/aws/aws-sdk-go-v2/credentials v1.17.59/go.mod h1:NM8fM6ovI3zak23UISdWidyZuI1ghNe2xjzUZAyT+08=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.67 h1:9KxtdcIA/5xPNQyZRgUSpYOE6j9Bc4+D7nZua0KGYOM=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.67/go.mod h1:p3C44m+cfnbv763s52gCqrjaqyPikj9Sg47kUVaNZQQ=
 github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.28 h1:KwsodFKVQTlI5EyhRSugALzsV6mG/SGrdjlMXSZSdso=
 github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.28/go.mod h1:EY3APf9MzygVhKuPXAc5H+MkGb8k/DOSQjWS0LgkKqI=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 h1:x793wxmUWVDhshP8WW2mlnXuFrO4cOd3HLBroh1paFw=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30/go.mod h1:Jpne2tDnYiFascUEs2AWHJL9Yp7A5ZVy3TNyxaAjD6M=
 github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.32 h1:BjUcr3X3K0wZPGFg2bxOWW3VPN8rkE3/61zhP+IHviA=
 github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.32/go.mod h1:80+OGC/bgzzFFTUmcuwD0lb4YutwQeKLFpmt6hoWapU=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 h1:ZK5jHhnrioRkUNOc+hOgQKlUL5JeC3S6JgLxtQ+Rm0Q=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34/go.mod h1:p4VfIceZokChbA9FzMbRGz5OV+lekcVtHlPKEO0gSZY=
 github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.32 h1:m1GeXHVMJsRsUAqG6HjZWx9dj7F5TR+cF1bjyfYyBd4=
 github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.32/go.mod h1:IitoQxGfaKdVLNg0hD8/DXmAqNy0H4K2H2Sf91ti8sI=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 h1:SZwFm17ZUNNg5Np0ioo/gq8Mn6u9w19Mri8DnJ15Jf0=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34/go.mod h1:dFZsC0BLo346mvKQLWmoJxT+Sjp+qcVR1tRVHQGOH9Q=
 github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2 h1:Pg9URiobXy85kgFev3og2CuOZ8JZUBENF+dcgWBaYNk=
 github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc=
+github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo=
+github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo=
 github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2 h1:D4oz8/CzT9bAEYtVhSBmFj2dNOtaHOtMKc2vHBwYizA=
 github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2/go.mod h1:Za3IHqTQ+yNcRHxu1OFucBh0ACZT4j4VQFF0BqpZcLY=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 h1:eAh2A4b5IzM/lum78bZ590jy36+d/aFLgKF/4Vd1xPE=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA=
 github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.13 h1:SYVGSFQHlchIcy6e7x12bsrxClCXSP5et8cqVhL8cuw=
 github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.13/go.mod h1:kizuDaLX37bG5WZaoxGPQR/LNFXpxp0vsUnqfkWXfNE=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 h1:dM9/92u2F1JbDaGooxTq18wmmFzbJRfXfVfy96/1CXM=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15/go.mod h1:SwFBy2vjtA0vZbjjaFtfN045boopadnoVPhu4Fv66vY=
 github.com/aws/aws-sdk-go-v2/service/sso v1.24.15 h1:/eE3DogBjYlvlbhd2ssWyeuovWunHLxfgw3s/OJa4GQ=
 github.com/aws/aws-sdk-go-v2/service/sso v1.24.15/go.mod h1:2PCJYpi7EKeA5SkStAmZlF6fi0uUABuhtF8ILHjGc3Y=
+github.com/aws/aws-sdk-go-v2/service/sso v1.25.3 h1:1Gw+9ajCV1jogloEv1RRnvfRFia2cL6c9cuKV2Ps+G8=
+github.com/aws/aws-sdk-go-v2/service/sso v1.25.3/go.mod h1:qs4a9T5EMLl/Cajiw2TcbNt2UNo/Hqlyp+GiuG4CFDI=
 github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.14 h1:M/zwXiL2iXUrHputuXgmO94TVNmcenPHxgLXLutodKE=
 github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.14/go.mod h1:RVwIw3y/IqxC2YEXSIkAzRDdEU1iRabDPaYjpGCbCGQ=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1 h1:hXmVKytPfTy5axZ+fYbR5d0cFmC3JvwLm5kM83luako=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1/go.mod h1:MlYRNmYu/fGPoxBQVvBYr9nyr948aY/WLUvwBMBJubs=
 github.com/aws/aws-sdk-go-v2/service/sts v1.33.14 h1:TzeR06UCMUq+KA3bDkujxK1GVGy+G8qQN/QVYzGLkQE=
 github.com/aws/aws-sdk-go-v2/service/sts v1.33.14/go.mod h1:dspXf/oYWGWo6DEvj98wpaTeqt5+DMidZD0A9BYTizc=
+github.com/aws/aws-sdk-go-v2/service/sts v1.33.19 h1:1XuUZ8mYJw9B6lzAkXhqHlJd/XvaX32evhproijJEZY=
+github.com/aws/aws-sdk-go-v2/service/sts v1.33.19/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4=
 github.com/aws/aws-sdk-go-v2/service/translate v1.28.17 h1:UvmY9iWDzKpare6oig0Clc8toGpejZwwJ8xlBPeYSFM=
 github.com/aws/aws-sdk-go-v2/service/translate v1.28.17/go.mod h1:4+mPpDn+ORl73OTiRK6dgn+s9qQyAswnK2rc81YLVvE=
+github.com/aws/aws-sdk-go-v2/service/translate v1.29.2 h1:Cf84Ri0UJ/PIiNCsZrYidx42U8dzAdh6qwcMOSvCftU=
+github.com/aws/aws-sdk-go-v2/service/translate v1.29.2/go.mod h1:SK7i+llJmeFf2ubUjLp6HRlaeuwv56bihp0bXiFwSiQ=
 github.com/aws/smithy-go v1.22.2 h1:6D9hW43xKFrRx/tXXfAlIZc4JI+yQe6snnWcQyxSyLQ=
 github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
+github.com/aws/smithy-go v1.22.3 h1:Z//5NuZCSW6R4PhQ93hShNbyBbn8BWCmCVCt+Q8Io5k=
+github.com/aws/smithy-go v1.22.3/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI=
 github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
 github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
+github.com/charmbracelet/colorprofile v0.3.1 h1:k8dTHMd7fgw4bnFd7jXTLZrSU/CQrKnL3m+AxCzDz40=
+github.com/charmbracelet/colorprofile v0.3.1/go.mod h1:/GkGusxNs8VB/RSOh3fu0TJmQ4ICMMPApIIVn0KszZ0=
 github.com/charmbracelet/lipgloss v1.0.0 h1:O7VkGDvqEdGi93X+DeqsQ7PKHDgtQfF8j8/O2qFMQNg=
 github.com/charmbracelet/lipgloss v1.0.0/go.mod h1:U5fy9Z+C38obMs+T+tJqst9VGzlOYGj4ri9reL3qUlo=
+github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY=
+github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30=
 github.com/charmbracelet/log v0.4.0 h1:G9bQAcx8rWA2T3pWvx7YtPTPwgqpk7D68BX21IRW8ZM=
 github.com/charmbracelet/log v0.4.0/go.mod h1:63bXt/djrizTec0l11H20t8FDSvA4CRZJ1KH22MdptM=
+github.com/charmbracelet/log v0.4.1 h1:6AYnoHKADkghm/vt4neaNEXkxcXLSV2g1rdyFDOpTyk=
+github.com/charmbracelet/log v0.4.1/go.mod h1:pXgyTsqsVu4N9hGdHmQ0xEA4RsXof402LX9ZgiITn2I=
 github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE=
 github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q=
+github.com/charmbracelet/x/ansi v0.9.2 h1:92AGsQmNTRMzuzHEYfCdjQeUzTrgE1vfO5/7fEVoXdY=
+github.com/charmbracelet/x/ansi v0.9.2/go.mod h1:3RQDQ6lDnROptfpWuUVIUG64bD2g2BgntdxH0Ya5TeE=
+github.com/charmbracelet/x/cellbuf v0.0.13 h1:/KBBKHuVRbq1lYx5BzEHBAFBP8VcQzJejZ/IA3iR28k=
+github.com/charmbracelet/x/cellbuf v0.0.13/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs=
+github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=
+github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=
 github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/evanw/esbuild v0.24.2 h1:PQExybVBrjHjN6/JJiShRGIXh1hWVm6NepVnhZhrt0A=
-github.com/evanw/esbuild v0.24.2/go.mod h1:D2vIQZqV/vIf/VRHtViaUtViZmG7o+kKmlBfVQuRi48=
 github.com/evanw/esbuild v0.25.0 h1:jRR9D1pfdb669VzdN4w0jwsDfrKE098nKMaDMKvMPyU=
 github.com/evanw/esbuild v0.25.0/go.mod h1:D2vIQZqV/vIf/VRHtViaUtViZmG7o+kKmlBfVQuRi48=
+github.com/evanw/esbuild v0.25.4 h1:k1bTSim+usBG27w7BfOCorhgx3tO+6bAfMj5pR+6SKg=
+github.com/evanw/esbuild v0.25.4/go.mod h1:D2vIQZqV/vIf/VRHtViaUtViZmG7o+kKmlBfVQuRi48=
 github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
 github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
 github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
@@ -65,6 +105,8 @@ github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6T
 github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
 github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo=
 github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8=
+github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc=
+github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
@@ -78,10 +120,16 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT
 github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 github.com/tdewolff/parse/v2 v2.7.20 h1:Y33JmRLjyGhX5JRvYh+CO6Sk6pGMw3iO5eKGhUhx8JE=
 github.com/tdewolff/parse/v2 v2.7.20/go.mod h1:3FbJWZp3XT9OWVN3Hmfp0p/a08v4h8J9W1aghka0soA=
+github.com/tdewolff/parse/v2 v2.8.0 h1:jW0afj6zpUGXuZTwJ7/UfP2SddyLalb/SDryjaMTkA4=
+github.com/tdewolff/parse/v2 v2.8.0/go.mod h1:Hwlni2tiVNKyzR1o6nUs4FOF07URA+JLBLd6dlIXYqo=
 github.com/tdewolff/test v1.0.11-0.20231101010635-f1265d231d52 h1:gAQliwn+zJrkjAHVcBEYW/RFvd2St4yYimisvozAYlA=
 github.com/tdewolff/test v1.0.11-0.20231101010635-f1265d231d52/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE=
+github.com/tdewolff/test v1.0.11 h1:FdLbwQVHxqG16SlkGveC0JVyrJN62COWTRyUFzfbtBE=
+github.com/tdewolff/test v1.0.11/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8=
 github.com/volker-schukai/tokenizer v1.0.0 h1:wF4haFoCodq7lgAk8c+th/DZmpFpL2WVD8wDzAGU1mA=
 github.com/volker-schukai/tokenizer v1.0.0/go.mod h1:LPw7lLIxUnZgeg96818N7IvwLE1x8ya31J/Aa0aCq9M=
+github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
+github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 gitlab.schukai.com/oss/libraries/go/application/xflags.git v1.16.5 h1:YD1skbZRu3iUHafIhGIEcZqPHJXA65Zj0AcSgsTQJAk=
 gitlab.schukai.com/oss/libraries/go/application/xflags.git v1.16.5/go.mod h1:6477TWP2W0vWWJ6Ctu/Mdh5SsjKUVVPFDgFfM4YdtcU=
@@ -101,8 +149,12 @@ golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v
 golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
 golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus=
 golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=
+golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
+golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
 golang.org/x/exp v0.0.0-20250207012021-f9890c6ad9f3 h1:qNgPs5exUA+G0C96DrPwNrvLSj7GT/9D+3WMWUcUg34=
 golang.org/x/exp v0.0.0-20250207012021-f9890c6ad9f3/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU=
+golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=
+golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
@@ -119,6 +171,8 @@ golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
 golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
 golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
 golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
+golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
+golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -141,6 +195,8 @@ golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
 golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
+golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
 golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/aws/credential_cache.go b/source/vendor/github.com/aws/aws-sdk-go-v2/aws/credential_cache.go
index 781ac0a..623890e 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/aws/credential_cache.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/aws/credential_cache.go
@@ -172,6 +172,17 @@ func (p *CredentialsCache) getCreds() (Credentials, bool) {
 	return *c, true
 }
 
+// ProviderSources returns a list of where the underlying credential provider
+// has been sourced, if available. Returns empty if the provider doesn't implement
+// the interface
+func (p *CredentialsCache) ProviderSources() []CredentialSource {
+	asSource, ok := p.provider.(CredentialProviderSource)
+	if !ok {
+		return []CredentialSource{}
+	}
+	return asSource.ProviderSources()
+}
+
 // Invalidate will invalidate the cached credentials. The next call to Retrieve
 // will cause the provider's Retrieve method to be called.
 func (p *CredentialsCache) Invalidate() {
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/aws/credentials.go b/source/vendor/github.com/aws/aws-sdk-go-v2/aws/credentials.go
index 98ba770..4ad2ee4 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/aws/credentials.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/aws/credentials.go
@@ -70,6 +70,56 @@ func (AnonymousCredentials) Retrieve(context.Context) (Credentials, error) {
 		fmt.Errorf("the AnonymousCredentials is not a valid credential provider, and cannot be used to sign AWS requests with")
 }
 
+// CredentialSource is the source of the credential provider.
+// A provider can have multiple credential sources: For example, a provider that reads a profile, calls ECS to
+// get credentials and then assumes a role using STS will have all these as part of its provider chain.
+type CredentialSource int
+
+const (
+	// CredentialSourceUndefined is the sentinel zero value
+	CredentialSourceUndefined CredentialSource = iota
+	// CredentialSourceCode credentials resolved from code, cli parameters, session object, or client instance
+	CredentialSourceCode
+	// CredentialSourceEnvVars credentials resolved from environment variables
+	CredentialSourceEnvVars
+	// CredentialSourceEnvVarsSTSWebIDToken credentials resolved from environment variables for assuming a role with STS using a web identity token
+	CredentialSourceEnvVarsSTSWebIDToken
+	// CredentialSourceSTSAssumeRole credentials resolved from STS using AssumeRole
+	CredentialSourceSTSAssumeRole
+	// CredentialSourceSTSAssumeRoleSaml credentials resolved from STS using assume role with SAML
+	CredentialSourceSTSAssumeRoleSaml
+	// CredentialSourceSTSAssumeRoleWebID credentials resolved from STS using assume role with web identity
+	CredentialSourceSTSAssumeRoleWebID
+	// CredentialSourceSTSFederationToken credentials resolved from STS using a federation token
+	CredentialSourceSTSFederationToken
+	// CredentialSourceSTSSessionToken credentials resolved from STS using a session token 	S
+	CredentialSourceSTSSessionToken
+	// CredentialSourceProfile  credentials resolved from a config file(s) profile with static credentials
+	CredentialSourceProfile
+	// CredentialSourceProfileSourceProfile credentials resolved from a source profile in a config file(s) profile
+	CredentialSourceProfileSourceProfile
+	// CredentialSourceProfileNamedProvider credentials resolved from a named provider in a config file(s) profile (like EcsContainer)
+	CredentialSourceProfileNamedProvider
+	// CredentialSourceProfileSTSWebIDToken  credentials resolved from configuration for assuming a role with STS using web identity token in a config file(s) profile
+	CredentialSourceProfileSTSWebIDToken
+	// CredentialSourceProfileSSO credentials resolved from an SSO session in a config file(s) profile
+	CredentialSourceProfileSSO
+	// CredentialSourceSSO credentials resolved from an SSO session
+	CredentialSourceSSO
+	// CredentialSourceProfileSSOLegacy credentials resolved from an SSO session in a config file(s) profile using legacy format
+	CredentialSourceProfileSSOLegacy
+	// CredentialSourceSSOLegacy credentials resolved from an SSO session using legacy format
+	CredentialSourceSSOLegacy
+	// CredentialSourceProfileProcess credentials resolved from a process in a config file(s) profile
+	CredentialSourceProfileProcess
+	// CredentialSourceProcess credentials resolved from a process
+	CredentialSourceProcess
+	// CredentialSourceHTTP credentials resolved from an HTTP endpoint
+	CredentialSourceHTTP
+	// CredentialSourceIMDS credentials resolved from the instance metadata service (IMDS)
+	CredentialSourceIMDS
+)
+
 // A Credentials is the AWS credentials value for individual credential fields.
 type Credentials struct {
 	// AWS Access key ID
@@ -125,6 +175,13 @@ type CredentialsProvider interface {
 	Retrieve(ctx context.Context) (Credentials, error)
 }
 
+// CredentialProviderSource allows any credential provider to track
+// all providers where a credential provider were sourced. For example, if the credentials came from a
+// call to a role specified in the profile, this method will give the whole breadcrumb trail
+type CredentialProviderSource interface {
+	ProviderSources() []CredentialSource
+}
+
 // CredentialsProviderFunc provides a helper wrapping a function value to
 // satisfy the CredentialsProvider interface.
 type CredentialsProviderFunc func(context.Context) (Credentials, error)
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go b/source/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go
index 63642a9..8e930fc 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go
@@ -3,4 +3,4 @@
 package aws
 
 // goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.36.1"
+const goModuleVersion = "1.36.3"
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/user_agent.go b/source/vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/user_agent.go
index 95b6268..6ee3391 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/user_agent.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/user_agent.go
@@ -109,8 +109,57 @@ const (
 	UserAgentFeatureRequestChecksumWhenRequired   = "a"
 	UserAgentFeatureResponseChecksumWhenSupported = "b"
 	UserAgentFeatureResponseChecksumWhenRequired  = "c"
+
+	UserAgentFeatureDynamoDBUserAgent = "d" // not yet implemented
+
+	UserAgentFeatureCredentialsCode                 = "e"
+	UserAgentFeatureCredentialsJvmSystemProperties  = "f" // n/a (this is not a JVM sdk)
+	UserAgentFeatureCredentialsEnvVars              = "g"
+	UserAgentFeatureCredentialsEnvVarsStsWebIDToken = "h"
+	UserAgentFeatureCredentialsStsAssumeRole        = "i"
+	UserAgentFeatureCredentialsStsAssumeRoleSaml    = "j" // not yet implemented
+	UserAgentFeatureCredentialsStsAssumeRoleWebID   = "k"
+	UserAgentFeatureCredentialsStsFederationToken   = "l" // not yet implemented
+	UserAgentFeatureCredentialsStsSessionToken      = "m" // not yet implemented
+	UserAgentFeatureCredentialsProfile              = "n"
+	UserAgentFeatureCredentialsProfileSourceProfile = "o"
+	UserAgentFeatureCredentialsProfileNamedProvider = "p"
+	UserAgentFeatureCredentialsProfileStsWebIDToken = "q"
+	UserAgentFeatureCredentialsProfileSso           = "r"
+	UserAgentFeatureCredentialsSso                  = "s"
+	UserAgentFeatureCredentialsProfileSsoLegacy     = "t"
+	UserAgentFeatureCredentialsSsoLegacy            = "u"
+	UserAgentFeatureCredentialsProfileProcess       = "v"
+	UserAgentFeatureCredentialsProcess              = "w"
+	UserAgentFeatureCredentialsBoto2ConfigFile      = "x" // n/a (this is not boto/Python)
+	UserAgentFeatureCredentialsAwsSdkStore          = "y" // n/a (this is used by .NET based sdk)
+	UserAgentFeatureCredentialsHTTP                 = "z"
+	UserAgentFeatureCredentialsIMDS                 = "0"
 )
 
+var credentialSourceToFeature = map[aws.CredentialSource]UserAgentFeature{
+	aws.CredentialSourceCode:                 UserAgentFeatureCredentialsCode,
+	aws.CredentialSourceEnvVars:              UserAgentFeatureCredentialsEnvVars,
+	aws.CredentialSourceEnvVarsSTSWebIDToken: UserAgentFeatureCredentialsEnvVarsStsWebIDToken,
+	aws.CredentialSourceSTSAssumeRole:        UserAgentFeatureCredentialsStsAssumeRole,
+	aws.CredentialSourceSTSAssumeRoleSaml:    UserAgentFeatureCredentialsStsAssumeRoleSaml,
+	aws.CredentialSourceSTSAssumeRoleWebID:   UserAgentFeatureCredentialsStsAssumeRoleWebID,
+	aws.CredentialSourceSTSFederationToken:   UserAgentFeatureCredentialsStsFederationToken,
+	aws.CredentialSourceSTSSessionToken:      UserAgentFeatureCredentialsStsSessionToken,
+	aws.CredentialSourceProfile:              UserAgentFeatureCredentialsProfile,
+	aws.CredentialSourceProfileSourceProfile: UserAgentFeatureCredentialsProfileSourceProfile,
+	aws.CredentialSourceProfileNamedProvider: UserAgentFeatureCredentialsProfileNamedProvider,
+	aws.CredentialSourceProfileSTSWebIDToken: UserAgentFeatureCredentialsProfileStsWebIDToken,
+	aws.CredentialSourceProfileSSO:           UserAgentFeatureCredentialsProfileSso,
+	aws.CredentialSourceSSO:                  UserAgentFeatureCredentialsSso,
+	aws.CredentialSourceProfileSSOLegacy:     UserAgentFeatureCredentialsProfileSsoLegacy,
+	aws.CredentialSourceSSOLegacy:            UserAgentFeatureCredentialsSsoLegacy,
+	aws.CredentialSourceProfileProcess:       UserAgentFeatureCredentialsProfileProcess,
+	aws.CredentialSourceProcess:              UserAgentFeatureCredentialsProcess,
+	aws.CredentialSourceHTTP:                 UserAgentFeatureCredentialsHTTP,
+	aws.CredentialSourceIMDS:                 UserAgentFeatureCredentialsIMDS,
+}
+
 // RequestUserAgent is a build middleware that set the User-Agent for the request.
 type RequestUserAgent struct {
 	sdkAgent, userAgent *smithyhttp.UserAgentBuilder
@@ -263,6 +312,14 @@ func (u *RequestUserAgent) AddSDKAgentKeyValue(keyType SDKAgentKeyType, key, val
 	u.userAgent.AddKeyValue(keyType.string(), strings.Map(rules, key)+"#"+strings.Map(rules, value))
 }
 
+// AddCredentialsSource adds the credential source as a feature on the User-Agent string
+func (u *RequestUserAgent) AddCredentialsSource(source aws.CredentialSource) {
+	x, ok := credentialSourceToFeature[source]
+	if ok {
+		u.AddUserAgentFeature(x)
+	}
+}
+
 // ID the name of the middleware.
 func (u *RequestUserAgent) ID() string {
 	return "UserAgent"
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md b/source/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md
index e28d917..e7174e0 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md
@@ -1,3 +1,36 @@
+# v1.29.14 (2025-04-10)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.29.13 (2025-04-03)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.29.12 (2025-03-27)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.29.11 (2025-03-25)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.29.10 (2025-03-24)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.29.9 (2025-03-04.2)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.29.8 (2025-02-27)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.29.7 (2025-02-18)
+
+* **Bug Fix**: Bump go version to 1.22
+* **Dependency Update**: Updated to the latest SDK module versions
+
 # v1.29.6 (2025-02-05)
 
 * **Dependency Update**: Updated to the latest SDK module versions
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go b/source/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go
index d30e01d..8be8c01 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go
@@ -3,4 +3,4 @@
 package config
 
 // goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.29.6"
+const goModuleVersion = "1.29.14"
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/config/resolve_credentials.go b/source/vendor/github.com/aws/aws-sdk-go-v2/config/resolve_credentials.go
index 7ae252e..b00259d 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/config/resolve_credentials.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/config/resolve_credentials.go
@@ -112,13 +112,15 @@ func resolveCredentialChain(ctx context.Context, cfg *aws.Config, configs config
 
 	switch {
 	case sharedProfileSet:
-		err = resolveCredsFromProfile(ctx, cfg, envConfig, sharedConfig, other)
+		ctx, err = resolveCredsFromProfile(ctx, cfg, envConfig, sharedConfig, other)
 	case envConfig.Credentials.HasKeys():
-		cfg.Credentials = credentials.StaticCredentialsProvider{Value: envConfig.Credentials}
+		ctx = addCredentialSource(ctx, aws.CredentialSourceEnvVars)
+		cfg.Credentials = credentials.StaticCredentialsProvider{Value: envConfig.Credentials, Source: getCredentialSources(ctx)}
 	case len(envConfig.WebIdentityTokenFilePath) > 0:
+		ctx = addCredentialSource(ctx, aws.CredentialSourceEnvVarsSTSWebIDToken)
 		err = assumeWebIdentity(ctx, cfg, envConfig.WebIdentityTokenFilePath, envConfig.RoleARN, envConfig.RoleSessionName, configs)
 	default:
-		err = resolveCredsFromProfile(ctx, cfg, envConfig, sharedConfig, other)
+		ctx, err = resolveCredsFromProfile(ctx, cfg, envConfig, sharedConfig, other)
 	}
 	if err != nil {
 		return err
@@ -133,53 +135,71 @@ func resolveCredentialChain(ctx context.Context, cfg *aws.Config, configs config
 	return nil
 }
 
-func resolveCredsFromProfile(ctx context.Context, cfg *aws.Config, envConfig *EnvConfig, sharedConfig *SharedConfig, configs configs) (err error) {
-
+func resolveCredsFromProfile(ctx context.Context, cfg *aws.Config, envConfig *EnvConfig, sharedConfig *SharedConfig, configs configs) (ctx2 context.Context, err error) {
 	switch {
 	case sharedConfig.Source != nil:
+		ctx = addCredentialSource(ctx, aws.CredentialSourceProfileSourceProfile)
 		// Assume IAM role with credentials source from a different profile.
-		err = resolveCredsFromProfile(ctx, cfg, envConfig, sharedConfig.Source, configs)
+		ctx, err = resolveCredsFromProfile(ctx, cfg, envConfig, sharedConfig.Source, configs)
 
 	case sharedConfig.Credentials.HasKeys():
 		// Static Credentials from Shared Config/Credentials file.
+		ctx = addCredentialSource(ctx, aws.CredentialSourceProfile)
 		cfg.Credentials = credentials.StaticCredentialsProvider{
-			Value: sharedConfig.Credentials,
+			Value:  sharedConfig.Credentials,
+			Source: getCredentialSources(ctx),
 		}
 
 	case len(sharedConfig.CredentialSource) != 0:
-		err = resolveCredsFromSource(ctx, cfg, envConfig, sharedConfig, configs)
+		ctx = addCredentialSource(ctx, aws.CredentialSourceProfileNamedProvider)
+		ctx, err = resolveCredsFromSource(ctx, cfg, envConfig, sharedConfig, configs)
 
 	case len(sharedConfig.WebIdentityTokenFile) != 0:
 		// Credentials from Assume Web Identity token require an IAM Role, and
 		// that roll will be assumed. May be wrapped with another assume role
 		// via SourceProfile.
-		return assumeWebIdentity(ctx, cfg, sharedConfig.WebIdentityTokenFile, sharedConfig.RoleARN, sharedConfig.RoleSessionName, configs)
+		ctx = addCredentialSource(ctx, aws.CredentialSourceProfileSTSWebIDToken)
+		return ctx, assumeWebIdentity(ctx, cfg, sharedConfig.WebIdentityTokenFile, sharedConfig.RoleARN, sharedConfig.RoleSessionName, configs)
 
 	case sharedConfig.hasSSOConfiguration():
+		if sharedConfig.hasLegacySSOConfiguration() {
+			ctx = addCredentialSource(ctx, aws.CredentialSourceProfileSSOLegacy)
+			ctx = addCredentialSource(ctx, aws.CredentialSourceSSOLegacy)
+		} else {
+			ctx = addCredentialSource(ctx, aws.CredentialSourceSSO)
+		}
+		if sharedConfig.SSOSession != nil {
+			ctx = addCredentialSource(ctx, aws.CredentialSourceProfileSSO)
+		}
 		err = resolveSSOCredentials(ctx, cfg, sharedConfig, configs)
 
 	case len(sharedConfig.CredentialProcess) != 0:
 		// Get credentials from CredentialProcess
+		ctx = addCredentialSource(ctx, aws.CredentialSourceProfileProcess)
+		ctx = addCredentialSource(ctx, aws.CredentialSourceProcess)
 		err = processCredentials(ctx, cfg, sharedConfig, configs)
 
 	case len(envConfig.ContainerCredentialsRelativePath) != 0:
+		ctx = addCredentialSource(ctx, aws.CredentialSourceHTTP)
 		err = resolveHTTPCredProvider(ctx, cfg, ecsContainerURI(envConfig.ContainerCredentialsRelativePath), envConfig.ContainerAuthorizationToken, configs)
 
 	case len(envConfig.ContainerCredentialsEndpoint) != 0:
+		ctx = addCredentialSource(ctx, aws.CredentialSourceHTTP)
 		err = resolveLocalHTTPCredProvider(ctx, cfg, envConfig.ContainerCredentialsEndpoint, envConfig.ContainerAuthorizationToken, configs)
 
 	default:
+		ctx = addCredentialSource(ctx, aws.CredentialSourceIMDS)
 		err = resolveEC2RoleCredentials(ctx, cfg, configs)
 	}
 	if err != nil {
-		return err
+		return ctx, err
 	}
 
 	if len(sharedConfig.RoleARN) > 0 {
-		return credsFromAssumeRole(ctx, cfg, sharedConfig, configs)
+		return ctx, credsFromAssumeRole(ctx, cfg, sharedConfig, configs)
 	}
 
-	return nil
+	return ctx, nil
 }
 
 func resolveSSOCredentials(ctx context.Context, cfg *aws.Config, sharedConfig *SharedConfig, configs configs) error {
@@ -198,6 +218,10 @@ func resolveSSOCredentials(ctx context.Context, cfg *aws.Config, sharedConfig *S
 
 	cfgCopy := cfg.Copy()
 
+	options = append(options, func(o *ssocreds.Options) {
+		o.CredentialSources = getCredentialSources(ctx)
+	})
+
 	if sharedConfig.SSOSession != nil {
 		ssoTokenProviderOptionsFn, found, err := getSSOTokenProviderOptions(ctx, configs)
 		if err != nil {
@@ -242,6 +266,10 @@ func processCredentials(ctx context.Context, cfg *aws.Config, sharedConfig *Shar
 		opts = append(opts, options)
 	}
 
+	opts = append(opts, func(o *processcreds.Options) {
+		o.CredentialSources = getCredentialSources(ctx)
+	})
+
 	cfg.Credentials = processcreds.NewProvider(sharedConfig.CredentialProcess, opts...)
 
 	return nil
@@ -323,6 +351,7 @@ func resolveHTTPCredProvider(ctx context.Context, cfg *aws.Config, url, authToke
 			if cfg.Retryer != nil {
 				options.Retryer = cfg.Retryer()
 			}
+			options.CredentialSources = getCredentialSources(ctx)
 		},
 	}
 
@@ -346,28 +375,31 @@ func resolveHTTPCredProvider(ctx context.Context, cfg *aws.Config, url, authToke
 	return nil
 }
 
-func resolveCredsFromSource(ctx context.Context, cfg *aws.Config, envConfig *EnvConfig, sharedCfg *SharedConfig, configs configs) (err error) {
+func resolveCredsFromSource(ctx context.Context, cfg *aws.Config, envConfig *EnvConfig, sharedCfg *SharedConfig, configs configs) (context.Context, error) {
 	switch sharedCfg.CredentialSource {
 	case credSourceEc2Metadata:
-		return resolveEC2RoleCredentials(ctx, cfg, configs)
+		ctx = addCredentialSource(ctx, aws.CredentialSourceIMDS)
+		return ctx, resolveEC2RoleCredentials(ctx, cfg, configs)
 
 	case credSourceEnvironment:
-		cfg.Credentials = credentials.StaticCredentialsProvider{Value: envConfig.Credentials}
+		ctx = addCredentialSource(ctx, aws.CredentialSourceHTTP)
+		cfg.Credentials = credentials.StaticCredentialsProvider{Value: envConfig.Credentials, Source: getCredentialSources(ctx)}
 
 	case credSourceECSContainer:
+		ctx = addCredentialSource(ctx, aws.CredentialSourceHTTP)
 		if len(envConfig.ContainerCredentialsRelativePath) != 0 {
-			return resolveHTTPCredProvider(ctx, cfg, ecsContainerURI(envConfig.ContainerCredentialsRelativePath), envConfig.ContainerAuthorizationToken, configs)
+			return ctx, resolveHTTPCredProvider(ctx, cfg, ecsContainerURI(envConfig.ContainerCredentialsRelativePath), envConfig.ContainerAuthorizationToken, configs)
 		}
 		if len(envConfig.ContainerCredentialsEndpoint) != 0 {
-			return resolveLocalHTTPCredProvider(ctx, cfg, envConfig.ContainerCredentialsEndpoint, envConfig.ContainerAuthorizationToken, configs)
+			return ctx, resolveLocalHTTPCredProvider(ctx, cfg, envConfig.ContainerCredentialsEndpoint, envConfig.ContainerAuthorizationToken, configs)
 		}
-		return fmt.Errorf("EcsContainer was specified as the credential_source, but neither 'AWS_CONTAINER_CREDENTIALS_RELATIVE_URI' or AWS_CONTAINER_CREDENTIALS_FULL_URI' was set")
+		return ctx, fmt.Errorf("EcsContainer was specified as the credential_source, but neither 'AWS_CONTAINER_CREDENTIALS_RELATIVE_URI' or AWS_CONTAINER_CREDENTIALS_FULL_URI' was set")
 
 	default:
-		return fmt.Errorf("credential_source values must be EcsContainer, Ec2InstanceMetadata, or Environment")
+		return ctx, fmt.Errorf("credential_source values must be EcsContainer, Ec2InstanceMetadata, or Environment")
 	}
 
-	return nil
+	return ctx, nil
 }
 
 func resolveEC2RoleCredentials(ctx context.Context, cfg *aws.Config, configs configs) error {
@@ -386,6 +418,7 @@ func resolveEC2RoleCredentials(ctx context.Context, cfg *aws.Config, configs con
 		if o.Client == nil {
 			o.Client = imds.NewFromConfig(*cfg)
 		}
+		o.CredentialSources = getCredentialSources(ctx)
 	})
 
 	provider := ec2rolecreds.New(optFns...)
@@ -394,7 +427,6 @@ func resolveEC2RoleCredentials(ctx context.Context, cfg *aws.Config, configs con
 	if err != nil {
 		return err
 	}
-
 	return nil
 }
 
@@ -473,6 +505,10 @@ func assumeWebIdentity(ctx context.Context, cfg *aws.Config, filepath string, ro
 		RoleARN: roleARN,
 	}
 
+	optFns = append(optFns, func(options *stscreds.WebIdentityRoleOptions) {
+		options.CredentialSources = getCredentialSources(ctx)
+	})
+
 	for _, fn := range optFns {
 		fn(&opts)
 	}
@@ -494,6 +530,8 @@ func assumeWebIdentity(ctx context.Context, cfg *aws.Config, filepath string, ro
 }
 
 func credsFromAssumeRole(ctx context.Context, cfg *aws.Config, sharedCfg *SharedConfig, configs configs) (err error) {
+	// resolve credentials early
+	credentialSources := getCredentialSources(ctx)
 	optFns := []func(*stscreds.AssumeRoleOptions){
 		func(options *stscreds.AssumeRoleOptions) {
 			options.RoleSessionName = sharedCfg.RoleSessionName
@@ -511,6 +549,9 @@ func credsFromAssumeRole(ctx context.Context, cfg *aws.Config, sharedCfg *Shared
 			if len(sharedCfg.MFASerial) != 0 {
 				options.SerialNumber = aws.String(sharedCfg.MFASerial)
 			}
+
+			// add existing credential chain
+			options.CredentialSources = credentialSources
 		},
 	}
 
@@ -533,7 +574,6 @@ func credsFromAssumeRole(ctx context.Context, cfg *aws.Config, sharedCfg *Shared
 			return AssumeRoleTokenProviderNotSetError{}
 		}
 	}
-
 	cfg.Credentials = stscreds.NewAssumeRoleProvider(sts.NewFromConfig(*cfg), sharedCfg.RoleARN, optFns...)
 
 	return nil
@@ -567,3 +607,21 @@ func wrapWithCredentialsCache(
 
 	return aws.NewCredentialsCache(provider, optFns...), nil
 }
+
+// credentialSource stores the chain of providers that was used to create an instance of
+// a credentials provider on the context
+type credentialSource struct{}
+
+func addCredentialSource(ctx context.Context, source aws.CredentialSource) context.Context {
+	existing, ok := ctx.Value(credentialSource{}).([]aws.CredentialSource)
+	if !ok {
+		existing = []aws.CredentialSource{source}
+	} else {
+		existing = append(existing, source)
+	}
+	return context.WithValue(ctx, credentialSource{}, existing)
+}
+
+func getCredentialSources(ctx context.Context) []aws.CredentialSource {
+	return ctx.Value(credentialSource{}).([]aws.CredentialSource)
+}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md b/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md
index 4ea068d..d4e4090 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md
@@ -1,3 +1,36 @@
+# v1.17.67 (2025-04-10)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.17.66 (2025-04-03)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.17.65 (2025-03-27)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.17.64 (2025-03-25)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.17.63 (2025-03-24)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.17.62 (2025-03-04.2)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.17.61 (2025-02-27)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.17.60 (2025-02-18)
+
+* **Bug Fix**: Bump go version to 1.22
+* **Dependency Update**: Updated to the latest SDK module versions
+
 # v1.17.59 (2025-02-05)
 
 * **Dependency Update**: Updated to the latest SDK module versions
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds/provider.go b/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds/provider.go
index 5c699f1..a95e6c8 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds/provider.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds/provider.go
@@ -47,6 +47,10 @@ type Options struct {
 	//
 	// If nil, the provider will default to the EC2 IMDS client.
 	Client GetMetadataAPIClient
+
+	// The chain of providers that was used to create this provider
+	// These values are for reporting purposes and are not meant to be set up directly
+	CredentialSources []aws.CredentialSource
 }
 
 // New returns an initialized Provider value configured to retrieve
@@ -227,3 +231,11 @@ func requestCred(ctx context.Context, client GetMetadataAPIClient, credsName str
 
 	return respCreds, nil
 }
+
+// ProviderSources returns the credential chain that was used to construct this provider
+func (p *Provider) ProviderSources() []aws.CredentialSource {
+	if p.options.CredentialSources == nil {
+		return []aws.CredentialSource{aws.CredentialSourceIMDS}
+	} // If no source has been set, assume this is used directly which means just call to assume role
+	return p.options.CredentialSources
+}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/provider.go b/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/provider.go
index 2386153..c8ac6d9 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/provider.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/provider.go
@@ -98,6 +98,10 @@ type Options struct {
 	//
 	// Will override AuthorizationToken if configured
 	AuthorizationTokenProvider AuthTokenProvider
+
+	// The chain of providers that was used to create this provider
+	// These values are for reporting purposes and are not meant to be set up directly
+	CredentialSources []aws.CredentialSource
 }
 
 // AuthTokenProvider defines an interface to dynamically load a value to be passed
@@ -191,3 +195,13 @@ func (p *Provider) resolveAuthToken() (string, error) {
 
 	return authToken, nil
 }
+
+var _ aws.CredentialProviderSource = (*Provider)(nil)
+
+// ProviderSources returns the credential chain that was used to construct this provider
+func (p *Provider) ProviderSources() []aws.CredentialSource {
+	if p.options.CredentialSources == nil {
+		return []aws.CredentialSource{aws.CredentialSourceHTTP}
+	}
+	return p.options.CredentialSources
+}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go b/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go
index 280ad9a..96ab3b8 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go
@@ -3,4 +3,4 @@
 package credentials
 
 // goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.17.59"
+const goModuleVersion = "1.17.67"
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/processcreds/provider.go b/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/processcreds/provider.go
index 911fcc3..dfc6b25 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/processcreds/provider.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/processcreds/provider.go
@@ -57,6 +57,9 @@ type Provider struct {
 type Options struct {
 	// Timeout limits the time a process can run.
 	Timeout time.Duration
+	// The chain of providers that was used to create this provider
+	// These values are for reporting purposes and are not meant to be set up directly
+	CredentialSources []aws.CredentialSource
 }
 
 // NewCommandBuilder provides the interface for specifying how command will be
@@ -274,6 +277,14 @@ func (p *Provider) executeCredentialProcess(ctx context.Context) ([]byte, error)
 	return out, nil
 }
 
+// ProviderSources returns the credential chain that was used to construct this provider
+func (p *Provider) ProviderSources() []aws.CredentialSource {
+	if p.options.CredentialSources == nil {
+		return []aws.CredentialSource{aws.CredentialSourceProcess}
+	}
+	return p.options.CredentialSources
+}
+
 func executeCommand(cmd *exec.Cmd, exec chan error) {
 	// Start the command
 	err := cmd.Start()
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/ssocreds/sso_credentials_provider.go b/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/ssocreds/sso_credentials_provider.go
index 8c230be..3ed9cbb 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/ssocreds/sso_credentials_provider.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/ssocreds/sso_credentials_provider.go
@@ -49,6 +49,10 @@ type Options struct {
 	// Used by the SSOCredentialProvider if a token configuration
 	// profile is used in the shared config
 	SSOTokenProvider *SSOTokenProvider
+
+	// The chain of providers that was used to create this provider.
+	// These values are for reporting purposes and are not meant to be set up directly
+	CredentialSources []aws.CredentialSource
 }
 
 // Provider is an AWS credential provider that retrieves temporary AWS
@@ -133,6 +137,14 @@ func (p *Provider) Retrieve(ctx context.Context) (aws.Credentials, error) {
 	}, nil
 }
 
+// ProviderSources returns the credential chain that was used to construct this provider
+func (p *Provider) ProviderSources() []aws.CredentialSource {
+	if p.options.CredentialSources == nil {
+		return []aws.CredentialSource{aws.CredentialSourceSSO}
+	}
+	return p.options.CredentialSources
+}
+
 // InvalidTokenError is the error type that is returned if loaded token has
 // expired or is otherwise invalid. To refresh the SSO session run AWS SSO
 // login with the corresponding profile.
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/static_provider.go b/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/static_provider.go
index d525cac..a469abd 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/static_provider.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/static_provider.go
@@ -22,6 +22,16 @@ func (*StaticCredentialsEmptyError) Error() string {
 // never expire.
 type StaticCredentialsProvider struct {
 	Value aws.Credentials
+	// These values are for reporting purposes and are not meant to be set up directly
+	Source []aws.CredentialSource
+}
+
+// ProviderSources returns the credential chain that was used to construct this provider
+func (s StaticCredentialsProvider) ProviderSources() []aws.CredentialSource {
+	if s.Source == nil {
+		return []aws.CredentialSource{aws.CredentialSourceCode} // If no source has been set, assume this is used directly which means hardcoded creds
+	}
+	return s.Source
 }
 
 // NewStaticCredentialsProvider return a StaticCredentialsProvider initialized with the AWS
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/stscreds/assume_role_provider.go b/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/stscreds/assume_role_provider.go
index 4c7f799..1ccf71e 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/stscreds/assume_role_provider.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/stscreds/assume_role_provider.go
@@ -247,6 +247,10 @@ type AssumeRoleOptions struct {
 	// (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_role-chaining)
 	// in the IAM User Guide. This parameter is optional.
 	TransitiveTagKeys []string
+
+	// The chain of providers that was used to create this provider
+	// These values are for reporting purposes and are not meant to be set up directly
+	CredentialSources []aws.CredentialSource
 }
 
 // NewAssumeRoleProvider constructs and returns a credentials provider that
@@ -324,3 +328,11 @@ func (p *AssumeRoleProvider) Retrieve(ctx context.Context) (aws.Credentials, err
 		AccountID: accountID,
 	}, nil
 }
+
+// ProviderSources returns the credential chain that was used to construct this provider
+func (p *AssumeRoleProvider) ProviderSources() []aws.CredentialSource {
+	if p.options.CredentialSources == nil {
+		return []aws.CredentialSource{aws.CredentialSourceSTSAssumeRole}
+	} // If no source has been set, assume this is used directly which means just call to assume role
+	return append(p.options.CredentialSources, aws.CredentialSourceSTSAssumeRole)
+}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/stscreds/web_identity_provider.go b/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/stscreds/web_identity_provider.go
index b4b7197..5f4286d 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/stscreds/web_identity_provider.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/credentials/stscreds/web_identity_provider.go
@@ -64,6 +64,10 @@ type WebIdentityRoleOptions struct {
 	// want to use as managed session policies.  The policies must exist in the
 	// same account as the role.
 	PolicyARNs []types.PolicyDescriptorType
+
+	// The chain of providers that was used to create this provider
+	// These values are for reporting purposes and are not meant to be set up directly
+	CredentialSources []aws.CredentialSource
 }
 
 // IdentityTokenRetriever is an interface for retrieving a JWT
@@ -167,3 +171,11 @@ func getAccountID(u *types.AssumedRoleUser) string {
 	}
 	return parts[4]
 }
+
+// ProviderSources returns the credential chain that was used to construct this provider
+func (p *WebIdentityRoleProvider) ProviderSources() []aws.CredentialSource {
+	if p.options.CredentialSources == nil {
+		return []aws.CredentialSource{aws.CredentialSourceSTSAssumeRoleWebID}
+	}
+	return p.options.CredentialSources
+}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md b/source/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md
index d3bdd7b..1f69e82 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md
@@ -1,3 +1,12 @@
+# v1.16.30 (2025-02-27)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.16.29 (2025-02-18)
+
+* **Bug Fix**: Bump go version to 1.22
+* **Dependency Update**: Updated to the latest SDK module versions
+
 # v1.16.28 (2025-02-05)
 
 * **Dependency Update**: Updated to the latest SDK module versions
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go b/source/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go
index a6d7e4d..dba9ef6 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go
@@ -3,4 +3,4 @@
 package imds
 
 // goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.16.28"
+const goModuleVersion = "1.16.30"
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md b/source/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md
index 9c48f2e..eae3e16 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md
@@ -1,3 +1,12 @@
+# v1.3.34 (2025-02-27)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.3.33 (2025-02-18)
+
+* **Bug Fix**: Bump go version to 1.22
+* **Dependency Update**: Updated to the latest SDK module versions
+
 # v1.3.32 (2025-02-05)
 
 * **Dependency Update**: Updated to the latest SDK module versions
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go b/source/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go
index 7554df9..eddabe6 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go
@@ -3,4 +3,4 @@
 package configsources
 
 // goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.3.32"
+const goModuleVersion = "1.3.34"
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/partitions.json b/source/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/partitions.json
index 43f6449..e19224f 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/partitions.json
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn/partitions.json
@@ -223,7 +223,17 @@
       "supportsFIPS" : true
     },
     "regionRegex" : "^us\\-isof\\-\\w+\\-\\d+$",
-    "regions" : { }
+    "regions" : {
+      "aws-iso-f-global" : {
+        "description" : "AWS ISOF global region"
+      },
+      "us-isof-east-1" : {
+        "description" : "US ISOF EAST"
+      },
+      "us-isof-south-1" : {
+        "description" : "US ISOF SOUTH"
+      }
+    }
   } ],
   "version" : "1.1"
 }
\ No newline at end of file
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md b/source/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md
index 103e541..83e5bd2 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md
@@ -1,3 +1,12 @@
+# v2.6.34 (2025-02-27)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v2.6.33 (2025-02-18)
+
+* **Bug Fix**: Bump go version to 1.22
+* **Dependency Update**: Updated to the latest SDK module versions
+
 # v2.6.32 (2025-02-05)
 
 * **Dependency Update**: Updated to the latest SDK module versions
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go b/source/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go
index 64106ff..735dba7 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go
@@ -3,4 +3,4 @@
 package endpoints
 
 // goModuleVersion is the tagged release for this module
-const goModuleVersion = "2.6.32"
+const goModuleVersion = "2.6.34"
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/CHANGELOG.md b/source/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/CHANGELOG.md
index 1d23b9b..f729db5 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/CHANGELOG.md
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/CHANGELOG.md
@@ -1,3 +1,7 @@
+# v1.8.3 (2025-02-18)
+
+* **Bug Fix**: Bump go version to 1.22
+
 # v1.8.2 (2025-01-24)
 
 * **Bug Fix**: Refactor filepath.Walk to filepath.WalkDir
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/go_module_metadata.go b/source/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/go_module_metadata.go
index 355ed39..00df0e3 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/go_module_metadata.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/internal/ini/go_module_metadata.go
@@ -3,4 +3,4 @@
 package ini
 
 // goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.8.2"
+const goModuleVersion = "1.8.3"
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md b/source/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md
index ef78753..c81265a 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md
@@ -1,3 +1,7 @@
+# v1.12.3 (2025-02-18)
+
+* **Bug Fix**: Bump go version to 1.22
+
 # v1.12.2 (2025-01-24)
 
 * **Dependency Update**: Upgrade to smithy-go v1.22.2.
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/go_module_metadata.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/go_module_metadata.go
index cbf79b4..d83e533 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/go_module_metadata.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/go_module_metadata.go
@@ -3,4 +3,4 @@
 package acceptencoding
 
 // goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.12.2"
+const goModuleVersion = "1.12.3"
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md b/source/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md
index 3d98e3c..2b5ceb4 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md
@@ -1,3 +1,12 @@
+# v1.12.15 (2025-02-27)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.12.14 (2025-02-18)
+
+* **Bug Fix**: Bump go version to 1.22
+* **Dependency Update**: Updated to the latest SDK module versions
+
 # v1.12.13 (2025-02-05)
 
 * **Dependency Update**: Updated to the latest SDK module versions
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go
index 99ccc6c..a165a10 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go
@@ -3,4 +3,4 @@
 package presignedurl
 
 // goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.12.13"
+const goModuleVersion = "1.12.15"
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md
index ea71c3b..3be25b8 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md
@@ -1,3 +1,25 @@
+# v1.25.3 (2025-04-03)
+
+* No change notes available for this release.
+
+# v1.25.2 (2025-03-25)
+
+* No change notes available for this release.
+
+# v1.25.1 (2025-03-04.2)
+
+* **Bug Fix**: Add assurance test for operation order.
+
+# v1.25.0 (2025-02-27)
+
+* **Feature**: Track credential providers via User-Agent Feature ids
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.24.16 (2025-02-18)
+
+* **Bug Fix**: Bump go version to 1.22
+* **Dependency Update**: Updated to the latest SDK module versions
+
 # v1.24.15 (2025-02-05)
 
 * **Dependency Update**: Updated to the latest SDK module versions
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_client.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_client.go
index 0b244f1..9f10e65 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_client.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_client.go
@@ -761,6 +761,37 @@ func addUserAgentRetryMode(stack *middleware.Stack, options Options) error {
 	return nil
 }
 
+type setCredentialSourceMiddleware struct {
+	ua      *awsmiddleware.RequestUserAgent
+	options Options
+}
+
+func (m setCredentialSourceMiddleware) ID() string { return "SetCredentialSourceMiddleware" }
+
+func (m setCredentialSourceMiddleware) HandleBuild(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) (
+	out middleware.BuildOutput, metadata middleware.Metadata, err error,
+) {
+	asProviderSource, ok := m.options.Credentials.(aws.CredentialProviderSource)
+	if !ok {
+		return next.HandleBuild(ctx, in)
+	}
+	providerSources := asProviderSource.ProviderSources()
+	for _, source := range providerSources {
+		m.ua.AddCredentialsSource(source)
+	}
+	return next.HandleBuild(ctx, in)
+}
+
+func addCredentialSource(stack *middleware.Stack, options Options) error {
+	ua, err := getOrAddRequestUserAgent(stack)
+	if err != nil {
+		return err
+	}
+
+	mw := setCredentialSourceMiddleware{ua: ua, options: options}
+	return stack.Build.Insert(&mw, "UserAgent", middleware.Before)
+}
+
 func resolveTracerProvider(options *Options) {
 	if options.TracerProvider == nil {
 		options.TracerProvider = &tracing.NopTracerProvider{}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_GetRoleCredentials.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_GetRoleCredentials.go
index a656020..b8031ee 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_GetRoleCredentials.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_GetRoleCredentials.go
@@ -123,6 +123,9 @@ func (c *Client) addOperationGetRoleCredentialsMiddlewares(stack *middleware.Sta
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpGetRoleCredentialsValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccountRoles.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccountRoles.go
index 315526e..4294e4d 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccountRoles.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccountRoles.go
@@ -128,6 +128,9 @@ func (c *Client) addOperationListAccountRolesMiddlewares(stack *middleware.Stack
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpListAccountRolesValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccounts.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccounts.go
index d867b78..1db72a9 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccounts.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccounts.go
@@ -127,6 +127,9 @@ func (c *Client) addOperationListAccountsMiddlewares(stack *middleware.Stack, op
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpListAccountsValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_Logout.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_Logout.go
index 434b430..2ca66ca 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_Logout.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_Logout.go
@@ -122,6 +122,9 @@ func (c *Client) addOperationLogoutMiddlewares(stack *middleware.Stack, options
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpLogoutValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/generated.json b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/generated.json
index 936253d..1a88fe4 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/generated.json
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/generated.json
@@ -25,11 +25,12 @@
         "protocol_test.go",
         "serializers.go",
         "snapshot_test.go",
+        "sra_operation_order_test.go",
         "types/errors.go",
         "types/types.go",
         "validators.go"
     ],
-    "go": "1.15",
+    "go": "1.22",
     "module": "github.com/aws/aws-sdk-go-v2/service/sso",
     "unstable": false
 }
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go
index 697a8a8..59aa2ae 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go
@@ -3,4 +3,4 @@
 package sso
 
 // goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.24.15"
+const goModuleVersion = "1.25.3"
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go
index 081867b..0441660 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go
@@ -87,6 +87,7 @@ func New() *Resolver {
 var partitionRegexp = struct {
 	Aws      *regexp.Regexp
 	AwsCn    *regexp.Regexp
+	AwsEusc  *regexp.Regexp
 	AwsIso   *regexp.Regexp
 	AwsIsoB  *regexp.Regexp
 	AwsIsoE  *regexp.Regexp
@@ -96,6 +97,7 @@ var partitionRegexp = struct {
 
 	Aws:      regexp.MustCompile("^(us|eu|ap|sa|ca|me|af|il|mx)\\-\\w+\\-\\d+$"),
 	AwsCn:    regexp.MustCompile("^cn\\-\\w+\\-\\d+$"),
+	AwsEusc:  regexp.MustCompile("^eusc\\-(de)\\-\\w+\\-\\d+$"),
 	AwsIso:   regexp.MustCompile("^us\\-iso\\-\\w+\\-\\d+$"),
 	AwsIsoB:  regexp.MustCompile("^us\\-isob\\-\\w+\\-\\d+$"),
 	AwsIsoE:  regexp.MustCompile("^eu\\-isoe\\-\\w+\\-\\d+$"),
@@ -227,6 +229,14 @@ var defaultPartitions = endpoints.Partitions{
 					Region: "ap-southeast-4",
 				},
 			},
+			endpoints.EndpointKey{
+				Region: "ap-southeast-5",
+			}: endpoints.Endpoint{
+				Hostname: "portal.sso.ap-southeast-5.amazonaws.com",
+				CredentialScope: endpoints.CredentialScope{
+					Region: "ap-southeast-5",
+				},
+			},
 			endpoints.EndpointKey{
 				Region: "ca-central-1",
 			}: endpoints.Endpoint{
@@ -426,6 +436,27 @@ var defaultPartitions = endpoints.Partitions{
 			},
 		},
 	},
+	{
+		ID: "aws-eusc",
+		Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
+			{
+				Variant: endpoints.FIPSVariant,
+			}: {
+				Hostname:          "portal.sso-fips.{region}.amazonaws.eu",
+				Protocols:         []string{"https"},
+				SignatureVersions: []string{"v4"},
+			},
+			{
+				Variant: 0,
+			}: {
+				Hostname:          "portal.sso.{region}.amazonaws.eu",
+				Protocols:         []string{"https"},
+				SignatureVersions: []string{"v4"},
+			},
+		},
+		RegionRegex:    partitionRegexp.AwsEusc,
+		IsRegionalized: true,
+	},
 	{
 		ID: "aws-iso",
 		Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md b/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md
index cd1774e..b4cdac6 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md
@@ -1,3 +1,29 @@
+# v1.30.1 (2025-04-03)
+
+* No change notes available for this release.
+
+# v1.30.0 (2025-03-27)
+
+* **Feature**: This release adds AwsAdditionalDetails in the CreateTokenWithIAM API response.
+
+# v1.29.2 (2025-03-24)
+
+* No change notes available for this release.
+
+# v1.29.1 (2025-03-04.2)
+
+* **Bug Fix**: Add assurance test for operation order.
+
+# v1.29.0 (2025-02-27)
+
+* **Feature**: Track credential providers via User-Agent Feature ids
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.28.15 (2025-02-18)
+
+* **Bug Fix**: Bump go version to 1.22
+* **Dependency Update**: Updated to the latest SDK module versions
+
 # v1.28.14 (2025-02-05)
 
 * **Dependency Update**: Updated to the latest SDK module versions
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_client.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_client.go
index 9b7f4ac..57440b1 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_client.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_client.go
@@ -761,6 +761,37 @@ func addUserAgentRetryMode(stack *middleware.Stack, options Options) error {
 	return nil
 }
 
+type setCredentialSourceMiddleware struct {
+	ua      *awsmiddleware.RequestUserAgent
+	options Options
+}
+
+func (m setCredentialSourceMiddleware) ID() string { return "SetCredentialSourceMiddleware" }
+
+func (m setCredentialSourceMiddleware) HandleBuild(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) (
+	out middleware.BuildOutput, metadata middleware.Metadata, err error,
+) {
+	asProviderSource, ok := m.options.Credentials.(aws.CredentialProviderSource)
+	if !ok {
+		return next.HandleBuild(ctx, in)
+	}
+	providerSources := asProviderSource.ProviderSources()
+	for _, source := range providerSources {
+		m.ua.AddCredentialsSource(source)
+	}
+	return next.HandleBuild(ctx, in)
+}
+
+func addCredentialSource(stack *middleware.Stack, options Options) error {
+	ua, err := getOrAddRequestUserAgent(stack)
+	if err != nil {
+		return err
+	}
+
+	mw := setCredentialSourceMiddleware{ua: ua, options: options}
+	return stack.Build.Insert(&mw, "UserAgent", middleware.Before)
+}
+
 func resolveTracerProvider(options *Options) {
 	if options.TracerProvider == nil {
 		options.TracerProvider = &tracing.NopTracerProvider{}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateToken.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateToken.go
index 2ab3524..4938783 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateToken.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateToken.go
@@ -194,6 +194,9 @@ func (c *Client) addOperationCreateTokenMiddlewares(stack *middleware.Stack, opt
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpCreateTokenValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateTokenWithIAM.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateTokenWithIAM.go
index e5253ce..09f3647 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateTokenWithIAM.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateTokenWithIAM.go
@@ -6,6 +6,7 @@ import (
 	"context"
 	"fmt"
 	awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
+	"github.com/aws/aws-sdk-go-v2/service/ssooidc/types"
 	"github.com/aws/smithy-go/middleware"
 	smithyhttp "github.com/aws/smithy-go/transport/http"
 )
@@ -123,6 +124,11 @@ type CreateTokenWithIAMOutput struct {
 	// to a user.
 	AccessToken *string
 
+	// A structure containing information from the idToken . Only the identityContext
+	// is in it, which is a value extracted from the idToken . This provides direct
+	// access to identity information without requiring JWT parsing.
+	AwsAdditionalDetails *types.AwsAdditionalDetails
+
 	// Indicates the time in seconds when an access token will expire.
 	ExpiresIn int32
 
@@ -226,6 +232,9 @@ func (c *Client) addOperationCreateTokenWithIAMMiddlewares(stack *middleware.Sta
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpCreateTokenWithIAMValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_RegisterClient.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_RegisterClient.go
index 2022270..1e2d382 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_RegisterClient.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_RegisterClient.go
@@ -164,6 +164,9 @@ func (c *Client) addOperationRegisterClientMiddlewares(stack *middleware.Stack,
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpRegisterClientValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_StartDeviceAuthorization.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_StartDeviceAuthorization.go
index 203ca5e..de0108f 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_StartDeviceAuthorization.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_StartDeviceAuthorization.go
@@ -146,6 +146,9 @@ func (c *Client) addOperationStartDeviceAuthorizationMiddlewares(stack *middlewa
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpStartDeviceAuthorizationValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/deserializers.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/deserializers.go
index ae9f145..93f3653 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/deserializers.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/deserializers.go
@@ -435,6 +435,11 @@ func awsRestjson1_deserializeOpDocumentCreateTokenWithIAMOutput(v **CreateTokenW
 				sv.AccessToken = ptr.String(jtv)
 			}
 
+		case "awsAdditionalDetails":
+			if err := awsRestjson1_deserializeDocumentAwsAdditionalDetails(&sv.AwsAdditionalDetails, value); err != nil {
+				return err
+			}
+
 		case "expiresIn":
 			if value != nil {
 				jtv, ok := value.(json.Number)
@@ -1545,6 +1550,46 @@ func awsRestjson1_deserializeDocumentAuthorizationPendingException(v **types.Aut
 	return nil
 }
 
+func awsRestjson1_deserializeDocumentAwsAdditionalDetails(v **types.AwsAdditionalDetails, value interface{}) error {
+	if v == nil {
+		return fmt.Errorf("unexpected nil of type %T", v)
+	}
+	if value == nil {
+		return nil
+	}
+
+	shape, ok := value.(map[string]interface{})
+	if !ok {
+		return fmt.Errorf("unexpected JSON type %v", value)
+	}
+
+	var sv *types.AwsAdditionalDetails
+	if *v == nil {
+		sv = &types.AwsAdditionalDetails{}
+	} else {
+		sv = *v
+	}
+
+	for key, value := range shape {
+		switch key {
+		case "identityContext":
+			if value != nil {
+				jtv, ok := value.(string)
+				if !ok {
+					return fmt.Errorf("expected IdentityContext to be of type string, got %T instead", value)
+				}
+				sv.IdentityContext = ptr.String(jtv)
+			}
+
+		default:
+			_, _ = key, value
+
+		}
+	}
+	*v = sv
+	return nil
+}
+
 func awsRestjson1_deserializeDocumentExpiredTokenException(v **types.ExpiredTokenException, value interface{}) error {
 	if v == nil {
 		return fmt.Errorf("unexpected nil of type %T", v)
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/generated.json b/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/generated.json
index b2a5263..35f1809 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/generated.json
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/generated.json
@@ -25,11 +25,12 @@
         "protocol_test.go",
         "serializers.go",
         "snapshot_test.go",
+        "sra_operation_order_test.go",
         "types/errors.go",
         "types/types.go",
         "validators.go"
     ],
-    "go": "1.15",
+    "go": "1.22",
     "module": "github.com/aws/aws-sdk-go-v2/service/ssooidc",
     "unstable": false
 }
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go
index 3094b12..0462341 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go
@@ -3,4 +3,4 @@
 package ssooidc
 
 // goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.28.14"
+const goModuleVersion = "1.30.1"
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints/endpoints.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints/endpoints.go
index b4c61eb..ba7b4f9 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints/endpoints.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints/endpoints.go
@@ -87,6 +87,7 @@ func New() *Resolver {
 var partitionRegexp = struct {
 	Aws      *regexp.Regexp
 	AwsCn    *regexp.Regexp
+	AwsEusc  *regexp.Regexp
 	AwsIso   *regexp.Regexp
 	AwsIsoB  *regexp.Regexp
 	AwsIsoE  *regexp.Regexp
@@ -96,6 +97,7 @@ var partitionRegexp = struct {
 
 	Aws:      regexp.MustCompile("^(us|eu|ap|sa|ca|me|af|il|mx)\\-\\w+\\-\\d+$"),
 	AwsCn:    regexp.MustCompile("^cn\\-\\w+\\-\\d+$"),
+	AwsEusc:  regexp.MustCompile("^eusc\\-(de)\\-\\w+\\-\\d+$"),
 	AwsIso:   regexp.MustCompile("^us\\-iso\\-\\w+\\-\\d+$"),
 	AwsIsoB:  regexp.MustCompile("^us\\-isob\\-\\w+\\-\\d+$"),
 	AwsIsoE:  regexp.MustCompile("^eu\\-isoe\\-\\w+\\-\\d+$"),
@@ -227,6 +229,14 @@ var defaultPartitions = endpoints.Partitions{
 					Region: "ap-southeast-4",
 				},
 			},
+			endpoints.EndpointKey{
+				Region: "ap-southeast-5",
+			}: endpoints.Endpoint{
+				Hostname: "oidc.ap-southeast-5.amazonaws.com",
+				CredentialScope: endpoints.CredentialScope{
+					Region: "ap-southeast-5",
+				},
+			},
 			endpoints.EndpointKey{
 				Region: "ca-central-1",
 			}: endpoints.Endpoint{
@@ -426,6 +436,27 @@ var defaultPartitions = endpoints.Partitions{
 			},
 		},
 	},
+	{
+		ID: "aws-eusc",
+		Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
+			{
+				Variant: endpoints.FIPSVariant,
+			}: {
+				Hostname:          "oidc-fips.{region}.amazonaws.eu",
+				Protocols:         []string{"https"},
+				SignatureVersions: []string{"v4"},
+			},
+			{
+				Variant: 0,
+			}: {
+				Hostname:          "oidc.{region}.amazonaws.eu",
+				Protocols:         []string{"https"},
+				SignatureVersions: []string{"v4"},
+			},
+		},
+		RegionRegex:    partitionRegexp.AwsEusc,
+		IsRegionalized: true,
+	},
 	{
 		ID: "aws-iso",
 		Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/types/types.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/types/types.go
index 0ec0789..2e8f3ea 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/types/types.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/types/types.go
@@ -6,4 +6,17 @@ import (
 	smithydocument "github.com/aws/smithy-go/document"
 )
 
+// This structure contains Amazon Web Services-specific parameter extensions for
+// the token endpoint responses and includes the identity context.
+type AwsAdditionalDetails struct {
+
+	// STS context assertion that carries a user identifier to the Amazon Web Services
+	// service that it calls and can be used to obtain an identity-enhanced IAM role
+	// session. This value corresponds to the sts:identity_context claim in the ID
+	// token.
+	IdentityContext *string
+
+	noSmithyDocumentSerde
+}
+
 type noSmithyDocumentSerde = smithydocument.NoSerde
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md
index 9f4f530..6656137 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md
@@ -1,3 +1,24 @@
+# v1.33.19 (2025-04-10)
+
+* No change notes available for this release.
+
+# v1.33.18 (2025-04-03)
+
+* No change notes available for this release.
+
+# v1.33.17 (2025-03-04.2)
+
+* **Bug Fix**: Add assurance test for operation order.
+
+# v1.33.16 (2025-02-27)
+
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.33.15 (2025-02-18)
+
+* **Bug Fix**: Bump go version to 1.22
+* **Dependency Update**: Updated to the latest SDK module versions
+
 # v1.33.14 (2025-02-05)
 
 * **Dependency Update**: Updated to the latest SDK module versions
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_client.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_client.go
index 2578732..fca363d 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_client.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_client.go
@@ -765,6 +765,37 @@ func addUserAgentRetryMode(stack *middleware.Stack, options Options) error {
 	return nil
 }
 
+type setCredentialSourceMiddleware struct {
+	ua      *awsmiddleware.RequestUserAgent
+	options Options
+}
+
+func (m setCredentialSourceMiddleware) ID() string { return "SetCredentialSourceMiddleware" }
+
+func (m setCredentialSourceMiddleware) HandleBuild(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) (
+	out middleware.BuildOutput, metadata middleware.Metadata, err error,
+) {
+	asProviderSource, ok := m.options.Credentials.(aws.CredentialProviderSource)
+	if !ok {
+		return next.HandleBuild(ctx, in)
+	}
+	providerSources := asProviderSource.ProviderSources()
+	for _, source := range providerSources {
+		m.ua.AddCredentialsSource(source)
+	}
+	return next.HandleBuild(ctx, in)
+}
+
+func addCredentialSource(stack *middleware.Stack, options Options) error {
+	ua, err := getOrAddRequestUserAgent(stack)
+	if err != nil {
+		return err
+	}
+
+	mw := setCredentialSourceMiddleware{ua: ua, options: options}
+	return stack.Build.Insert(&mw, "UserAgent", middleware.Before)
+}
+
 func resolveTracerProvider(options *Options) {
 	if options.TracerProvider == nil {
 		options.TracerProvider = &tracing.NopTracerProvider{}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRole.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRole.go
index d056327..524e36e 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRole.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRole.go
@@ -478,6 +478,9 @@ func (c *Client) addOperationAssumeRoleMiddlewares(stack *middleware.Stack, opti
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpAssumeRoleValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithSAML.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithSAML.go
index d0e117a..400f809 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithSAML.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithSAML.go
@@ -410,6 +410,9 @@ func (c *Client) addOperationAssumeRoleWithSAMLMiddlewares(stack *middleware.Sta
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpAssumeRoleWithSAMLValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithWebIdentity.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithWebIdentity.go
index 0ae4bc1..e5708cb 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithWebIdentity.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithWebIdentity.go
@@ -430,6 +430,9 @@ func (c *Client) addOperationAssumeRoleWithWebIdentityMiddlewares(stack *middlew
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpAssumeRoleWithWebIdentityValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoot.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoot.go
index cd976e5..a0f7a46 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoot.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoot.go
@@ -175,6 +175,9 @@ func (c *Client) addOperationAssumeRootMiddlewares(stack *middleware.Stack, opti
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpAssumeRootValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_DecodeAuthorizationMessage.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_DecodeAuthorizationMessage.go
index a56840e..9e7cb17 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_DecodeAuthorizationMessage.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_DecodeAuthorizationMessage.go
@@ -147,6 +147,9 @@ func (c *Client) addOperationDecodeAuthorizationMessageMiddlewares(stack *middle
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpDecodeAuthorizationMessageValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetAccessKeyInfo.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetAccessKeyInfo.go
index c80b055..28c05f1 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetAccessKeyInfo.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetAccessKeyInfo.go
@@ -138,6 +138,9 @@ func (c *Client) addOperationGetAccessKeyInfoMiddlewares(stack *middleware.Stack
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpGetAccessKeyInfoValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetCallerIdentity.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetCallerIdentity.go
index 49304bd..de137b7 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetCallerIdentity.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetCallerIdentity.go
@@ -129,6 +129,9 @@ func (c *Client) addOperationGetCallerIdentityMiddlewares(stack *middleware.Stac
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetCallerIdentity(options.Region), middleware.Before); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetFederationToken.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetFederationToken.go
index e2ecc79..67c041b 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetFederationToken.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetFederationToken.go
@@ -351,6 +351,9 @@ func (c *Client) addOperationGetFederationTokenMiddlewares(stack *middleware.Sta
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpGetFederationTokenValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetSessionToken.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetSessionToken.go
index fdc4511..903d151 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetSessionToken.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetSessionToken.go
@@ -200,6 +200,9 @@ func (c *Client) addOperationGetSessionTokenMiddlewares(stack *middleware.Stack,
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetSessionToken(options.Region), middleware.Before); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/generated.json b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/generated.json
index 70a8845..86bb3b7 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/generated.json
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/generated.json
@@ -32,11 +32,12 @@
         "protocol_test.go",
         "serializers.go",
         "snapshot_test.go",
+        "sra_operation_order_test.go",
         "types/errors.go",
         "types/types.go",
         "validators.go"
     ],
-    "go": "1.15",
+    "go": "1.22",
     "module": "github.com/aws/aws-sdk-go-v2/service/sts",
     "unstable": false
 }
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go
index 8e3322f..a984a2a 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go
@@ -3,4 +3,4 @@
 package sts
 
 // goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.33.14"
+const goModuleVersion = "1.33.19"
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints/endpoints.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints/endpoints.go
index 8fc2012..8ee3eed 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints/endpoints.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints/endpoints.go
@@ -87,6 +87,7 @@ func New() *Resolver {
 var partitionRegexp = struct {
 	Aws      *regexp.Regexp
 	AwsCn    *regexp.Regexp
+	AwsEusc  *regexp.Regexp
 	AwsIso   *regexp.Regexp
 	AwsIsoB  *regexp.Regexp
 	AwsIsoE  *regexp.Regexp
@@ -96,6 +97,7 @@ var partitionRegexp = struct {
 
 	Aws:      regexp.MustCompile("^(us|eu|ap|sa|ca|me|af|il|mx)\\-\\w+\\-\\d+$"),
 	AwsCn:    regexp.MustCompile("^cn\\-\\w+\\-\\d+$"),
+	AwsEusc:  regexp.MustCompile("^eusc\\-(de)\\-\\w+\\-\\d+$"),
 	AwsIso:   regexp.MustCompile("^us\\-iso\\-\\w+\\-\\d+$"),
 	AwsIsoB:  regexp.MustCompile("^us\\-isob\\-\\w+\\-\\d+$"),
 	AwsIsoE:  regexp.MustCompile("^eu\\-isoe\\-\\w+\\-\\d+$"),
@@ -348,6 +350,27 @@ var defaultPartitions = endpoints.Partitions{
 			}: endpoints.Endpoint{},
 		},
 	},
+	{
+		ID: "aws-eusc",
+		Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
+			{
+				Variant: endpoints.FIPSVariant,
+			}: {
+				Hostname:          "sts-fips.{region}.amazonaws.eu",
+				Protocols:         []string{"https"},
+				SignatureVersions: []string{"v4"},
+			},
+			{
+				Variant: 0,
+			}: {
+				Hostname:          "sts.{region}.amazonaws.eu",
+				Protocols:         []string{"https"},
+				SignatureVersions: []string{"v4"},
+			},
+		},
+		RegionRegex:    partitionRegexp.AwsEusc,
+		IsRegionalized: true,
+	},
 	{
 		ID: "aws-iso",
 		Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
@@ -423,6 +446,11 @@ var defaultPartitions = endpoints.Partitions{
 		},
 		RegionRegex:    partitionRegexp.AwsIsoE,
 		IsRegionalized: true,
+		Endpoints: endpoints.Endpoints{
+			endpoints.EndpointKey{
+				Region: "eu-isoe-west-1",
+			}: endpoints.Endpoint{},
+		},
 	},
 	{
 		ID: "aws-iso-f",
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/CHANGELOG.md b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/CHANGELOG.md
index 358f12d..645f95b 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/CHANGELOG.md
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/CHANGELOG.md
@@ -1,3 +1,25 @@
+# v1.29.2 (2025-04-03)
+
+* No change notes available for this release.
+
+# v1.29.1 (2025-03-04.2)
+
+* **Bug Fix**: Add assurance test for operation order.
+
+# v1.29.0 (2025-02-27)
+
+* **Feature**: Track credential providers via User-Agent Feature ids
+* **Dependency Update**: Updated to the latest SDK module versions
+
+# v1.28.19 (2025-02-25)
+
+* No change notes available for this release.
+
+# v1.28.18 (2025-02-18)
+
+* **Bug Fix**: Bump go version to 1.22
+* **Dependency Update**: Updated to the latest SDK module versions
+
 # v1.28.17 (2025-02-06)
 
 * No change notes available for this release.
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_client.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_client.go
index 08aa08c..8dff97a 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_client.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_client.go
@@ -772,6 +772,37 @@ func addUserAgentRetryMode(stack *middleware.Stack, options Options) error {
 	return nil
 }
 
+type setCredentialSourceMiddleware struct {
+	ua      *awsmiddleware.RequestUserAgent
+	options Options
+}
+
+func (m setCredentialSourceMiddleware) ID() string { return "SetCredentialSourceMiddleware" }
+
+func (m setCredentialSourceMiddleware) HandleBuild(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) (
+	out middleware.BuildOutput, metadata middleware.Metadata, err error,
+) {
+	asProviderSource, ok := m.options.Credentials.(aws.CredentialProviderSource)
+	if !ok {
+		return next.HandleBuild(ctx, in)
+	}
+	providerSources := asProviderSource.ProviderSources()
+	for _, source := range providerSources {
+		m.ua.AddCredentialsSource(source)
+	}
+	return next.HandleBuild(ctx, in)
+}
+
+func addCredentialSource(stack *middleware.Stack, options Options) error {
+	ua, err := getOrAddRequestUserAgent(stack)
+	if err != nil {
+		return err
+	}
+
+	mw := setCredentialSourceMiddleware{ua: ua, options: options}
+	return stack.Build.Insert(&mw, "UserAgent", middleware.Before)
+}
+
 func resolveTracerProvider(options *Options) {
 	if options.TracerProvider == nil {
 		options.TracerProvider = &tracing.NopTracerProvider{}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_CreateParallelData.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_CreateParallelData.go
index d349f0f..de0c93b 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_CreateParallelData.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_CreateParallelData.go
@@ -144,6 +144,9 @@ func (c *Client) addOperationCreateParallelDataMiddlewares(stack *middleware.Sta
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addIdempotencyToken_opCreateParallelDataMiddleware(stack, options); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_DeleteParallelData.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_DeleteParallelData.go
index 8a10113..3777b6a 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_DeleteParallelData.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_DeleteParallelData.go
@@ -115,6 +115,9 @@ func (c *Client) addOperationDeleteParallelDataMiddlewares(stack *middleware.Sta
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpDeleteParallelDataValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_DeleteTerminology.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_DeleteTerminology.go
index b848b95..a0d022c 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_DeleteTerminology.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_DeleteTerminology.go
@@ -107,6 +107,9 @@ func (c *Client) addOperationDeleteTerminologyMiddlewares(stack *middleware.Stac
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpDeleteTerminologyValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_DescribeTextTranslationJob.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_DescribeTextTranslationJob.go
index caf609d..c63fcc0 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_DescribeTextTranslationJob.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_DescribeTextTranslationJob.go
@@ -116,6 +116,9 @@ func (c *Client) addOperationDescribeTextTranslationJobMiddlewares(stack *middle
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpDescribeTextTranslationJobValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_GetParallelData.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_GetParallelData.go
index e19dc9d..b9493e0 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_GetParallelData.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_GetParallelData.go
@@ -140,6 +140,9 @@ func (c *Client) addOperationGetParallelDataMiddlewares(stack *middleware.Stack,
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpGetParallelDataValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_GetTerminology.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_GetTerminology.go
index 72ff50f..a438856 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_GetTerminology.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_GetTerminology.go
@@ -144,6 +144,9 @@ func (c *Client) addOperationGetTerminologyMiddlewares(stack *middleware.Stack,
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpGetTerminologyValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_ImportTerminology.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_ImportTerminology.go
index 47bcacd..070c6de 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_ImportTerminology.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_ImportTerminology.go
@@ -151,6 +151,9 @@ func (c *Client) addOperationImportTerminologyMiddlewares(stack *middleware.Stac
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpImportTerminologyValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_ListLanguages.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_ListLanguages.go
index ee3731b..3551752 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_ListLanguages.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_ListLanguages.go
@@ -125,6 +125,9 @@ func (c *Client) addOperationListLanguagesMiddlewares(stack *middleware.Stack, o
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListLanguages(options.Region), middleware.Before); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_ListParallelData.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_ListParallelData.go
index 2a081a2..3a074b4 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_ListParallelData.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_ListParallelData.go
@@ -118,6 +118,9 @@ func (c *Client) addOperationListParallelDataMiddlewares(stack *middleware.Stack
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListParallelData(options.Region), middleware.Before); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_ListTagsForResource.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_ListTagsForResource.go
index 4af4800..6f93741 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_ListTagsForResource.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_ListTagsForResource.go
@@ -119,6 +119,9 @@ func (c *Client) addOperationListTagsForResourceMiddlewares(stack *middleware.St
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpListTagsForResourceValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_ListTerminologies.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_ListTerminologies.go
index b8cd6d8..ece5072 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_ListTerminologies.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_ListTerminologies.go
@@ -118,6 +118,9 @@ func (c *Client) addOperationListTerminologiesMiddlewares(stack *middleware.Stac
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListTerminologies(options.Region), middleware.Before); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_ListTextTranslationJobs.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_ListTextTranslationJobs.go
index dc748fe..fa1fbae 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_ListTextTranslationJobs.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_ListTextTranslationJobs.go
@@ -122,6 +122,9 @@ func (c *Client) addOperationListTextTranslationJobsMiddlewares(stack *middlewar
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = stack.Initialize.Add(newServiceMetadataMiddleware_opListTextTranslationJobs(options.Region), middleware.Before); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_StartTextTranslationJob.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_StartTextTranslationJob.go
index d71847b..015a5cf 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_StartTextTranslationJob.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_StartTextTranslationJob.go
@@ -235,6 +235,9 @@ func (c *Client) addOperationStartTextTranslationJobMiddlewares(stack *middlewar
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addIdempotencyToken_opStartTextTranslationJobMiddleware(stack, options); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_StopTextTranslationJob.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_StopTextTranslationJob.go
index 84ab47a..d532796 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_StopTextTranslationJob.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_StopTextTranslationJob.go
@@ -124,6 +124,9 @@ func (c *Client) addOperationStopTextTranslationJobMiddlewares(stack *middleware
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpStopTextTranslationJobValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_TagResource.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_TagResource.go
index 758fe44..fa60575 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_TagResource.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_TagResource.go
@@ -119,6 +119,9 @@ func (c *Client) addOperationTagResourceMiddlewares(stack *middleware.Stack, opt
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpTagResourceValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_TranslateDocument.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_TranslateDocument.go
index be72ca2..2925bca 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_TranslateDocument.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_TranslateDocument.go
@@ -200,6 +200,9 @@ func (c *Client) addOperationTranslateDocumentMiddlewares(stack *middleware.Stac
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpTranslateDocumentValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_TranslateText.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_TranslateText.go
index 18c400f..233ea7e 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_TranslateText.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_TranslateText.go
@@ -182,6 +182,9 @@ func (c *Client) addOperationTranslateTextMiddlewares(stack *middleware.Stack, o
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpTranslateTextValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_UntagResource.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_UntagResource.go
index a91ce75..7e5326e 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_UntagResource.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_UntagResource.go
@@ -118,6 +118,9 @@ func (c *Client) addOperationUntagResourceMiddlewares(stack *middleware.Stack, o
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addOpUntagResourceValidationMiddleware(stack); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_UpdateParallelData.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_UpdateParallelData.go
index 7a7b5a7..d08fb41 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_UpdateParallelData.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/api_op_UpdateParallelData.go
@@ -139,6 +139,9 @@ func (c *Client) addOperationUpdateParallelDataMiddlewares(stack *middleware.Sta
 	if err = addUserAgentRetryMode(stack, options); err != nil {
 		return err
 	}
+	if err = addCredentialSource(stack, options); err != nil {
+		return err
+	}
 	if err = addIdempotencyToken_opUpdateParallelDataMiddleware(stack, options); err != nil {
 		return err
 	}
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/generated.json b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/generated.json
index ab59492..1506c16 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/generated.json
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/generated.json
@@ -40,12 +40,13 @@
         "protocol_test.go",
         "serializers.go",
         "snapshot_test.go",
+        "sra_operation_order_test.go",
         "types/enums.go",
         "types/errors.go",
         "types/types.go",
         "validators.go"
     ],
-    "go": "1.15",
+    "go": "1.22",
     "module": "github.com/aws/aws-sdk-go-v2/service/translate",
     "unstable": false
 }
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/go_module_metadata.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/go_module_metadata.go
index 7f60243..329ddb3 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/go_module_metadata.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/go_module_metadata.go
@@ -3,4 +3,4 @@
 package translate
 
 // goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.28.17"
+const goModuleVersion = "1.29.2"
diff --git a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/internal/endpoints/endpoints.go b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/internal/endpoints/endpoints.go
index cba2595..f35e362 100644
--- a/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/internal/endpoints/endpoints.go
+++ b/source/vendor/github.com/aws/aws-sdk-go-v2/service/translate/internal/endpoints/endpoints.go
@@ -87,6 +87,7 @@ func New() *Resolver {
 var partitionRegexp = struct {
 	Aws      *regexp.Regexp
 	AwsCn    *regexp.Regexp
+	AwsEusc  *regexp.Regexp
 	AwsIso   *regexp.Regexp
 	AwsIsoB  *regexp.Regexp
 	AwsIsoE  *regexp.Regexp
@@ -96,6 +97,7 @@ var partitionRegexp = struct {
 
 	Aws:      regexp.MustCompile("^(us|eu|ap|sa|ca|me|af|il|mx)\\-\\w+\\-\\d+$"),
 	AwsCn:    regexp.MustCompile("^cn\\-\\w+\\-\\d+$"),
+	AwsEusc:  regexp.MustCompile("^eusc\\-(de)\\-\\w+\\-\\d+$"),
 	AwsIso:   regexp.MustCompile("^us\\-iso\\-\\w+\\-\\d+$"),
 	AwsIsoB:  regexp.MustCompile("^us\\-isob\\-\\w+\\-\\d+$"),
 	AwsIsoE:  regexp.MustCompile("^eu\\-isoe\\-\\w+\\-\\d+$"),
@@ -142,39 +144,111 @@ var defaultPartitions = endpoints.Partitions{
 			endpoints.EndpointKey{
 				Region: "ap-east-1",
 			}: endpoints.Endpoint{},
+			endpoints.EndpointKey{
+				Region:  "ap-east-1",
+				Variant: endpoints.DualStackVariant,
+			}: {
+				Hostname: "translate.ap-east-1.api.aws",
+			},
 			endpoints.EndpointKey{
 				Region: "ap-northeast-1",
 			}: endpoints.Endpoint{},
+			endpoints.EndpointKey{
+				Region:  "ap-northeast-1",
+				Variant: endpoints.DualStackVariant,
+			}: {
+				Hostname: "translate.ap-northeast-1.api.aws",
+			},
 			endpoints.EndpointKey{
 				Region: "ap-northeast-2",
 			}: endpoints.Endpoint{},
+			endpoints.EndpointKey{
+				Region:  "ap-northeast-2",
+				Variant: endpoints.DualStackVariant,
+			}: {
+				Hostname: "translate.ap-northeast-2.api.aws",
+			},
 			endpoints.EndpointKey{
 				Region: "ap-south-1",
 			}: endpoints.Endpoint{},
+			endpoints.EndpointKey{
+				Region:  "ap-south-1",
+				Variant: endpoints.DualStackVariant,
+			}: {
+				Hostname: "translate.ap-south-1.api.aws",
+			},
 			endpoints.EndpointKey{
 				Region: "ap-southeast-1",
 			}: endpoints.Endpoint{},
+			endpoints.EndpointKey{
+				Region:  "ap-southeast-1",
+				Variant: endpoints.DualStackVariant,
+			}: {
+				Hostname: "translate.ap-southeast-1.api.aws",
+			},
 			endpoints.EndpointKey{
 				Region: "ap-southeast-2",
 			}: endpoints.Endpoint{},
+			endpoints.EndpointKey{
+				Region:  "ap-southeast-2",
+				Variant: endpoints.DualStackVariant,
+			}: {
+				Hostname: "translate.ap-southeast-2.api.aws",
+			},
 			endpoints.EndpointKey{
 				Region: "ca-central-1",
 			}: endpoints.Endpoint{},
+			endpoints.EndpointKey{
+				Region:  "ca-central-1",
+				Variant: endpoints.DualStackVariant,
+			}: {
+				Hostname: "translate.ca-central-1.api.aws",
+			},
 			endpoints.EndpointKey{
 				Region: "eu-central-1",
 			}: endpoints.Endpoint{},
+			endpoints.EndpointKey{
+				Region:  "eu-central-1",
+				Variant: endpoints.DualStackVariant,
+			}: {
+				Hostname: "translate.eu-central-1.api.aws",
+			},
 			endpoints.EndpointKey{
 				Region: "eu-north-1",
 			}: endpoints.Endpoint{},
+			endpoints.EndpointKey{
+				Region:  "eu-north-1",
+				Variant: endpoints.DualStackVariant,
+			}: {
+				Hostname: "translate.eu-north-1.api.aws",
+			},
 			endpoints.EndpointKey{
 				Region: "eu-west-1",
 			}: endpoints.Endpoint{},
+			endpoints.EndpointKey{
+				Region:  "eu-west-1",
+				Variant: endpoints.DualStackVariant,
+			}: {
+				Hostname: "translate.eu-west-1.api.aws",
+			},
 			endpoints.EndpointKey{
 				Region: "eu-west-2",
 			}: endpoints.Endpoint{},
+			endpoints.EndpointKey{
+				Region:  "eu-west-2",
+				Variant: endpoints.DualStackVariant,
+			}: {
+				Hostname: "translate.eu-west-2.api.aws",
+			},
 			endpoints.EndpointKey{
 				Region: "eu-west-3",
 			}: endpoints.Endpoint{},
+			endpoints.EndpointKey{
+				Region:  "eu-west-3",
+				Variant: endpoints.DualStackVariant,
+			}: {
+				Hostname: "translate.eu-west-3.api.aws",
+			},
 			endpoints.EndpointKey{
 				Region: "us-east-1",
 			}: endpoints.Endpoint{},
@@ -184,6 +258,18 @@ var defaultPartitions = endpoints.Partitions{
 			}: {
 				Hostname: "translate-fips.us-east-1.amazonaws.com",
 			},
+			endpoints.EndpointKey{
+				Region:  "us-east-1",
+				Variant: endpoints.FIPSVariant | endpoints.DualStackVariant,
+			}: {
+				Hostname: "translate-fips.us-east-1.api.aws",
+			},
+			endpoints.EndpointKey{
+				Region:  "us-east-1",
+				Variant: endpoints.DualStackVariant,
+			}: {
+				Hostname: "translate.us-east-1.api.aws",
+			},
 			endpoints.EndpointKey{
 				Region: "us-east-1-fips",
 			}: endpoints.Endpoint{
@@ -202,6 +288,18 @@ var defaultPartitions = endpoints.Partitions{
 			}: {
 				Hostname: "translate-fips.us-east-2.amazonaws.com",
 			},
+			endpoints.EndpointKey{
+				Region:  "us-east-2",
+				Variant: endpoints.FIPSVariant | endpoints.DualStackVariant,
+			}: {
+				Hostname: "translate-fips.us-east-2.api.aws",
+			},
+			endpoints.EndpointKey{
+				Region:  "us-east-2",
+				Variant: endpoints.DualStackVariant,
+			}: {
+				Hostname: "translate.us-east-2.api.aws",
+			},
 			endpoints.EndpointKey{
 				Region: "us-east-2-fips",
 			}: endpoints.Endpoint{
@@ -220,6 +318,18 @@ var defaultPartitions = endpoints.Partitions{
 			}: {
 				Hostname: "translate-fips.us-west-1.amazonaws.com",
 			},
+			endpoints.EndpointKey{
+				Region:  "us-west-1",
+				Variant: endpoints.FIPSVariant | endpoints.DualStackVariant,
+			}: {
+				Hostname: "translate-fips.us-west-1.api.aws",
+			},
+			endpoints.EndpointKey{
+				Region:  "us-west-1",
+				Variant: endpoints.DualStackVariant,
+			}: {
+				Hostname: "translate.us-west-1.api.aws",
+			},
 			endpoints.EndpointKey{
 				Region: "us-west-1-fips",
 			}: endpoints.Endpoint{
@@ -238,6 +348,18 @@ var defaultPartitions = endpoints.Partitions{
 			}: {
 				Hostname: "translate-fips.us-west-2.amazonaws.com",
 			},
+			endpoints.EndpointKey{
+				Region:  "us-west-2",
+				Variant: endpoints.FIPSVariant | endpoints.DualStackVariant,
+			}: {
+				Hostname: "translate-fips.us-west-2.api.aws",
+			},
+			endpoints.EndpointKey{
+				Region:  "us-west-2",
+				Variant: endpoints.DualStackVariant,
+			}: {
+				Hostname: "translate.us-west-2.api.aws",
+			},
 			endpoints.EndpointKey{
 				Region: "us-west-2-fips",
 			}: endpoints.Endpoint{
@@ -284,6 +406,27 @@ var defaultPartitions = endpoints.Partitions{
 		RegionRegex:    partitionRegexp.AwsCn,
 		IsRegionalized: true,
 	},
+	{
+		ID: "aws-eusc",
+		Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
+			{
+				Variant: endpoints.FIPSVariant,
+			}: {
+				Hostname:          "translate-fips.{region}.amazonaws.eu",
+				Protocols:         []string{"https"},
+				SignatureVersions: []string{"v4"},
+			},
+			{
+				Variant: 0,
+			}: {
+				Hostname:          "translate.{region}.amazonaws.eu",
+				Protocols:         []string{"https"},
+				SignatureVersions: []string{"v4"},
+			},
+		},
+		RegionRegex:    partitionRegexp.AwsEusc,
+		IsRegionalized: true,
+	},
 	{
 		ID: "aws-iso",
 		Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{
@@ -440,6 +583,18 @@ var defaultPartitions = endpoints.Partitions{
 			}: {
 				Hostname: "translate-fips.us-gov-west-1.amazonaws.com",
 			},
+			endpoints.EndpointKey{
+				Region:  "us-gov-west-1",
+				Variant: endpoints.FIPSVariant | endpoints.DualStackVariant,
+			}: {
+				Hostname: "translate-fips.us-gov-west-1.api.aws",
+			},
+			endpoints.EndpointKey{
+				Region:  "us-gov-west-1",
+				Variant: endpoints.DualStackVariant,
+			}: {
+				Hostname: "translate.us-gov-west-1.api.aws",
+			},
 			endpoints.EndpointKey{
 				Region: "us-gov-west-1-fips",
 			}: endpoints.Endpoint{
diff --git a/source/vendor/github.com/aws/smithy-go/CHANGELOG.md b/source/vendor/github.com/aws/smithy-go/CHANGELOG.md
index de39171..4df632d 100644
--- a/source/vendor/github.com/aws/smithy-go/CHANGELOG.md
+++ b/source/vendor/github.com/aws/smithy-go/CHANGELOG.md
@@ -1,3 +1,13 @@
+# Release (2025-02-17)
+
+## General Highlights
+* **Dependency Update**: Updated to the latest SDK module versions
+
+## Module Highlights
+* `github.com/aws/smithy-go`: v1.22.3
+  * **Bug Fix**: Fix HTTP metrics data race.
+  * **Bug Fix**: Replace usages of deprecated ioutil package.
+
 # Release (2025-01-21)
 
 ## General Highlights
diff --git a/source/vendor/github.com/aws/smithy-go/go_module_metadata.go b/source/vendor/github.com/aws/smithy-go/go_module_metadata.go
index a51ceca..d12d958 100644
--- a/source/vendor/github.com/aws/smithy-go/go_module_metadata.go
+++ b/source/vendor/github.com/aws/smithy-go/go_module_metadata.go
@@ -3,4 +3,4 @@
 package smithy
 
 // goModuleVersion is the tagged release for this module
-const goModuleVersion = "1.22.2"
+const goModuleVersion = "1.22.3"
diff --git a/source/vendor/github.com/charmbracelet/colorprofile/.golangci.yml b/source/vendor/github.com/charmbracelet/colorprofile/.golangci.yml
new file mode 100644
index 0000000..be61d89
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/colorprofile/.golangci.yml
@@ -0,0 +1,41 @@
+version: "2"
+run:
+  tests: false
+linters:
+  enable:
+    - bodyclose
+    - exhaustive
+    - goconst
+    - godot
+    - godox
+    - gomoddirectives
+    - goprintffuncname
+    - gosec
+    - misspell
+    - nakedret
+    - nestif
+    - nilerr
+    - noctx
+    - nolintlint
+    - prealloc
+    - revive
+    - rowserrcheck
+    - sqlclosecheck
+    - tparallel
+    - unconvert
+    - unparam
+    - whitespace
+    - wrapcheck
+  exclusions:
+    generated: lax
+    presets:
+      - common-false-positives
+issues:
+  max-issues-per-linter: 0
+  max-same-issues: 0
+formatters:
+  enable:
+    - gofumpt
+    - goimports
+  exclusions:
+    generated: lax
diff --git a/source/vendor/github.com/charmbracelet/colorprofile/LICENSE b/source/vendor/github.com/charmbracelet/colorprofile/LICENSE
new file mode 100644
index 0000000..b7974b0
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/colorprofile/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020-2024 Charmbracelet, Inc
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/source/vendor/github.com/charmbracelet/colorprofile/README.md b/source/vendor/github.com/charmbracelet/colorprofile/README.md
new file mode 100644
index 0000000..c72b2f4
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/colorprofile/README.md
@@ -0,0 +1,103 @@
+# Colorprofile
+
+<p>
+    <a href="https://github.com/charmbracelet/colorprofile/releases"><img src="https://img.shields.io/github/release/charmbracelet/colorprofile.svg" alt="Latest Release"></a>
+    <a href="https://pkg.go.dev/github.com/charmbracelet/colorprofile?tab=doc"><img src="https://godoc.org/github.com/charmbracelet/colorprofile?status.svg" alt="GoDoc"></a>
+    <a href="https://github.com/charmbracelet/colorprofile/actions"><img src="https://github.com/charmbracelet/colorprofile/actions/workflows/build.yml/badge.svg" alt="Build Status"></a>
+</p>
+
+A simple, powerful—and at times magical—package for detecting terminal color
+profiles and performing color (and CSI) degradation.
+
+## Detecting the terminal’s color profile
+
+Detecting the terminal’s color profile is easy.
+
+```go
+import "github.com/charmbracelet/colorprofile"
+
+// Detect the color profile. If you’re planning on writing to stderr you'd want
+// to use os.Stderr instead.
+p := colorprofile.Detect(os.Stdout, os.Environ())
+
+// Comment on the profile.
+fmt.Printf("You know, your colors are quite %s.", func() string {
+    switch p {
+    case colorprofile.TrueColor:
+        return "fancy"
+    case colorprofile.ANSI256:
+        return "1990s fancy"
+    case colorprofile.ANSI:
+        return "normcore"
+    case colorprofile.Ascii:
+        return "ancient"
+    case colorprofile.NoTTY:
+        return "naughty!"
+    }
+    return "...IDK" // this should never happen
+}())
+```
+
+## Downsampling colors
+
+When necessary, colors can be downsampled to a given profile, or manually
+downsampled to a specific profile.
+
+```go
+p := colorprofile.Detect(os.Stdout, os.Environ())
+c := color.RGBA{0x6b, 0x50, 0xff, 0xff} // #6b50ff
+
+// Downsample to the detected profile, when necessary.
+convertedColor := p.Convert(c)
+
+// Or manually convert to a given profile.
+ansi256Color := colorprofile.ANSI256.Convert(c)
+ansiColor := colorprofile.ANSI.Convert(c)
+noColor := colorprofile.Ascii.Convert(c)
+noANSI := colorprofile.NoTTY.Convert(c)
+```
+
+## Automatic downsampling with a Writer
+
+You can also magically downsample colors in ANSI output, when necessary. If
+output is not a TTY ANSI will be dropped entirely.
+
+```go
+myFancyANSI := "\x1b[38;2;107;80;255mCute \x1b[1;3mpuppy!!\x1b[m"
+
+// Automatically downsample for the terminal at stdout.
+w := colorprofile.NewWriter(os.Stdout, os.Environ())
+fmt.Fprintf(w, myFancyANSI)
+
+// Downsample to 4-bit ANSI.
+w.Profile = colorprofile.ANSI
+fmt.Fprintf(w, myFancyANSI)
+
+// Ascii-fy, no colors.
+w.Profile = colorprofile.Ascii
+fmt.Fprintf(w, myFancyANSI)
+
+// Strip ANSI altogether.
+w.Profile = colorprofile.NoTTY
+fmt.Fprintf(w, myFancyANSI) // not as fancy
+```
+
+## Feedback
+
+We’d love to hear your thoughts on this project. Feel free to drop us a note!
+
+- [Twitter](https://twitter.com/charmcli)
+- [The Fediverse](https://mastodon.social/@charmcli)
+- [Discord](https://charm.sh/chat)
+
+## License
+
+[MIT](https://github.com/charmbracelet/bubbletea/raw/master/LICENSE)
+
+---
+
+Part of [Charm](https://charm.sh).
+
+<a href="https://charm.sh/"><img alt="The Charm logo" src="https://stuff.charm.sh/charm-badge.jpg" width="400"></a>
+
+Charm热爱开源 • Charm loves open source • نحنُ نحب المصادر المفتوحة
diff --git a/source/vendor/github.com/charmbracelet/colorprofile/doc.go b/source/vendor/github.com/charmbracelet/colorprofile/doc.go
new file mode 100644
index 0000000..bd522e9
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/colorprofile/doc.go
@@ -0,0 +1,4 @@
+// Package colorprofile provides a way to downsample ANSI escape sequence
+// colors and styles automatically based on output, environment variables, and
+// Terminfo databases.
+package colorprofile
diff --git a/source/vendor/github.com/charmbracelet/colorprofile/env.go b/source/vendor/github.com/charmbracelet/colorprofile/env.go
new file mode 100644
index 0000000..749f989
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/colorprofile/env.go
@@ -0,0 +1,293 @@
+package colorprofile
+
+import (
+	"bytes"
+	"io"
+	"os/exec"
+	"runtime"
+	"strconv"
+	"strings"
+
+	"github.com/charmbracelet/x/term"
+	"github.com/xo/terminfo"
+)
+
+const dumbTerm = "dumb"
+
+// Detect returns the color profile based on the terminal output, and
+// environment variables. This respects NO_COLOR, CLICOLOR, and CLICOLOR_FORCE
+// environment variables.
+//
+// The rules as follows:
+//   - TERM=dumb is always treated as NoTTY unless CLICOLOR_FORCE=1 is set.
+//   - If COLORTERM=truecolor, and the profile is not NoTTY, it gest upgraded to TrueColor.
+//   - Using any 256 color terminal (e.g. TERM=xterm-256color) will set the profile to ANSI256.
+//   - Using any color terminal (e.g. TERM=xterm-color) will set the profile to ANSI.
+//   - Using CLICOLOR=1 without TERM defined should be treated as ANSI if the
+//     output is a terminal.
+//   - NO_COLOR takes precedence over CLICOLOR/CLICOLOR_FORCE, and will disable
+//     colors but not text decoration, i.e. bold, italic, faint, etc.
+//
+// See https://no-color.org/ and https://bixense.com/clicolors/ for more information.
+func Detect(output io.Writer, env []string) Profile {
+	out, ok := output.(term.File)
+	environ := newEnviron(env)
+	isatty := isTTYForced(environ) || (ok && term.IsTerminal(out.Fd()))
+	term, ok := environ.lookup("TERM")
+	isDumb := !ok || term == dumbTerm
+	envp := colorProfile(isatty, environ)
+	if envp == TrueColor || envNoColor(environ) {
+		// We already know we have TrueColor, or NO_COLOR is set.
+		return envp
+	}
+
+	if isatty && !isDumb {
+		tip := Terminfo(term)
+		tmuxp := tmux(environ)
+
+		// Color profile is the maximum of env, terminfo, and tmux.
+		return max(envp, max(tip, tmuxp))
+	}
+
+	return envp
+}
+
+// Env returns the color profile based on the terminal environment variables.
+// This respects NO_COLOR, CLICOLOR, and CLICOLOR_FORCE environment variables.
+//
+// The rules as follows:
+//   - TERM=dumb is always treated as NoTTY unless CLICOLOR_FORCE=1 is set.
+//   - If COLORTERM=truecolor, and the profile is not NoTTY, it gest upgraded to TrueColor.
+//   - Using any 256 color terminal (e.g. TERM=xterm-256color) will set the profile to ANSI256.
+//   - Using any color terminal (e.g. TERM=xterm-color) will set the profile to ANSI.
+//   - Using CLICOLOR=1 without TERM defined should be treated as ANSI if the
+//     output is a terminal.
+//   - NO_COLOR takes precedence over CLICOLOR/CLICOLOR_FORCE, and will disable
+//     colors but not text decoration, i.e. bold, italic, faint, etc.
+//
+// See https://no-color.org/ and https://bixense.com/clicolors/ for more information.
+func Env(env []string) (p Profile) {
+	return colorProfile(true, newEnviron(env))
+}
+
+func colorProfile(isatty bool, env environ) (p Profile) {
+	term, ok := env.lookup("TERM")
+	isDumb := (!ok && runtime.GOOS != "windows") || term == dumbTerm
+	envp := envColorProfile(env)
+	if !isatty || isDumb {
+		// Check if the output is a terminal.
+		// Treat dumb terminals as NoTTY
+		p = NoTTY
+	} else {
+		p = envp
+	}
+
+	if envNoColor(env) && isatty {
+		if p > Ascii {
+			p = Ascii
+		}
+		return //nolint:nakedret
+	}
+
+	if cliColorForced(env) {
+		if p < ANSI {
+			p = ANSI
+		}
+		if envp > p {
+			p = envp
+		}
+
+		return //nolint:nakedret
+	}
+
+	if cliColor(env) {
+		if isatty && !isDumb && p < ANSI {
+			p = ANSI
+		}
+	}
+
+	return p
+}
+
+// envNoColor returns true if the environment variables explicitly disable color output
+// by setting NO_COLOR (https://no-color.org/).
+func envNoColor(env environ) bool {
+	noColor, _ := strconv.ParseBool(env.get("NO_COLOR"))
+	return noColor
+}
+
+func cliColor(env environ) bool {
+	cliColor, _ := strconv.ParseBool(env.get("CLICOLOR"))
+	return cliColor
+}
+
+func cliColorForced(env environ) bool {
+	cliColorForce, _ := strconv.ParseBool(env.get("CLICOLOR_FORCE"))
+	return cliColorForce
+}
+
+func isTTYForced(env environ) bool {
+	skip, _ := strconv.ParseBool(env.get("TTY_FORCE"))
+	return skip
+}
+
+func colorTerm(env environ) bool {
+	colorTerm := strings.ToLower(env.get("COLORTERM"))
+	return colorTerm == "truecolor" || colorTerm == "24bit" ||
+		colorTerm == "yes" || colorTerm == "true"
+}
+
+// envColorProfile returns infers the color profile from the environment.
+func envColorProfile(env environ) (p Profile) {
+	term, ok := env.lookup("TERM")
+	if !ok || len(term) == 0 || term == dumbTerm {
+		p = NoTTY
+		if runtime.GOOS == "windows" {
+			// Use Windows API to detect color profile. Windows Terminal and
+			// cmd.exe don't define $TERM.
+			if wcp, ok := windowsColorProfile(env); ok {
+				p = wcp
+			}
+		}
+	} else {
+		p = ANSI
+	}
+
+	parts := strings.Split(term, "-")
+	switch parts[0] {
+	case "alacritty",
+		"contour",
+		"foot",
+		"ghostty",
+		"kitty",
+		"rio",
+		"st",
+		"wezterm":
+		return TrueColor
+	case "xterm":
+		if len(parts) > 1 {
+			switch parts[1] {
+			case "ghostty", "kitty":
+				// These terminals can be defined as xterm-TERMNAME
+				return TrueColor
+			}
+		}
+	case "tmux", "screen":
+		if p < ANSI256 {
+			p = ANSI256
+		}
+	}
+
+	if isCloudShell, _ := strconv.ParseBool(env.get("GOOGLE_CLOUD_SHELL")); isCloudShell {
+		return TrueColor
+	}
+
+	// GNU Screen doesn't support TrueColor
+	// Tmux doesn't support $COLORTERM
+	if colorTerm(env) && !strings.HasPrefix(term, "screen") && !strings.HasPrefix(term, "tmux") {
+		return TrueColor
+	}
+
+	if strings.HasSuffix(term, "256color") && p < ANSI256 {
+		p = ANSI256
+	}
+
+	// Direct color terminals support true colors.
+	if strings.HasSuffix(term, "direct") {
+		return TrueColor
+	}
+
+	return //nolint:nakedret
+}
+
+// Terminfo returns the color profile based on the terminal's terminfo
+// database. This relies on the Tc and RGB capabilities to determine if the
+// terminal supports TrueColor.
+// If term is empty or "dumb", it returns NoTTY.
+func Terminfo(term string) (p Profile) {
+	if len(term) == 0 || term == "dumb" {
+		return NoTTY
+	}
+
+	p = ANSI
+	ti, err := terminfo.Load(term)
+	if err != nil {
+		return
+	}
+
+	extbools := ti.ExtBoolCapsShort()
+	if _, ok := extbools["Tc"]; ok {
+		return TrueColor
+	}
+
+	if _, ok := extbools["RGB"]; ok {
+		return TrueColor
+	}
+
+	return
+}
+
+// Tmux returns the color profile based on `tmux info` output. Tmux supports
+// overriding the terminal's color capabilities, so this function will return
+// the color profile based on the tmux configuration.
+func Tmux(env []string) Profile {
+	return tmux(newEnviron(env))
+}
+
+// tmux returns the color profile based on the tmux environment variables.
+func tmux(env environ) (p Profile) {
+	if tmux, ok := env.lookup("TMUX"); !ok || len(tmux) == 0 {
+		// Not in tmux
+		return NoTTY
+	}
+
+	// Check if tmux has either Tc or RGB capabilities. Otherwise, return
+	// ANSI256.
+	p = ANSI256
+	cmd := exec.Command("tmux", "info")
+	out, err := cmd.Output()
+	if err != nil {
+		return
+	}
+
+	for _, line := range bytes.Split(out, []byte("\n")) {
+		if (bytes.Contains(line, []byte("Tc")) || bytes.Contains(line, []byte("RGB"))) &&
+			bytes.Contains(line, []byte("true")) {
+			return TrueColor
+		}
+	}
+
+	return
+}
+
+// environ is a map of environment variables.
+type environ map[string]string
+
+// newEnviron returns a new environment map from a slice of environment
+// variables.
+func newEnviron(environ []string) environ {
+	m := make(map[string]string, len(environ))
+	for _, e := range environ {
+		parts := strings.SplitN(e, "=", 2)
+		var value string
+		if len(parts) == 2 {
+			value = parts[1]
+		}
+		m[parts[0]] = value
+	}
+	return m
+}
+
+// lookup returns the value of an environment variable and a boolean indicating
+// if it exists.
+func (e environ) lookup(key string) (string, bool) {
+	v, ok := e[key]
+	return v, ok
+}
+
+// get returns the value of an environment variable and empty string if it
+// doesn't exist.
+func (e environ) get(key string) string {
+	v, _ := e.lookup(key)
+	return v
+}
diff --git a/source/vendor/github.com/charmbracelet/colorprofile/env_other.go b/source/vendor/github.com/charmbracelet/colorprofile/env_other.go
new file mode 100644
index 0000000..080994b
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/colorprofile/env_other.go
@@ -0,0 +1,8 @@
+//go:build !windows
+// +build !windows
+
+package colorprofile
+
+func windowsColorProfile(map[string]string) (Profile, bool) {
+	return 0, false
+}
diff --git a/source/vendor/github.com/charmbracelet/colorprofile/env_windows.go b/source/vendor/github.com/charmbracelet/colorprofile/env_windows.go
new file mode 100644
index 0000000..3b9c28f
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/colorprofile/env_windows.go
@@ -0,0 +1,45 @@
+//go:build windows
+// +build windows
+
+package colorprofile
+
+import (
+	"strconv"
+
+	"golang.org/x/sys/windows"
+)
+
+func windowsColorProfile(env map[string]string) (Profile, bool) {
+	if env["ConEmuANSI"] == "ON" {
+		return TrueColor, true
+	}
+
+	if len(env["WT_SESSION"]) > 0 {
+		// Windows Terminal supports TrueColor
+		return TrueColor, true
+	}
+
+	major, _, build := windows.RtlGetNtVersionNumbers()
+	if build < 10586 || major < 10 {
+		// No ANSI support before WindowsNT 10 build 10586
+		if len(env["ANSICON"]) > 0 {
+			ansiconVer := env["ANSICON_VER"]
+			cv, err := strconv.Atoi(ansiconVer)
+			if err != nil || cv < 181 {
+				// No 8 bit color support before ANSICON 1.81
+				return ANSI, true
+			}
+
+			return ANSI256, true
+		}
+
+		return NoTTY, true
+	}
+
+	if build < 14931 {
+		// No true color support before build 14931
+		return ANSI256, true
+	}
+
+	return TrueColor, true
+}
diff --git a/source/vendor/github.com/charmbracelet/colorprofile/profile.go b/source/vendor/github.com/charmbracelet/colorprofile/profile.go
new file mode 100644
index 0000000..2bcb37c
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/colorprofile/profile.go
@@ -0,0 +1,399 @@
+package colorprofile
+
+import (
+	"image/color"
+	"math"
+
+	"github.com/charmbracelet/x/ansi"
+	"github.com/lucasb-eyer/go-colorful"
+)
+
+// Profile is a color profile: NoTTY, Ascii, ANSI, ANSI256, or TrueColor.
+type Profile byte
+
+const (
+	// NoTTY is a profile with no terminal support.
+	NoTTY Profile = iota
+	// Ascii is a profile with no color support.
+	Ascii //nolint:revive
+	// ANSI is a profile with 16 colors (4-bit).
+	ANSI
+	// ANSI256 is a profile with 256 colors (8-bit).
+	ANSI256
+	// TrueColor is a profile with 16 million colors (24-bit).
+	TrueColor
+)
+
+// String returns the string representation of a Profile.
+func (p Profile) String() string {
+	switch p {
+	case TrueColor:
+		return "TrueColor"
+	case ANSI256:
+		return "ANSI256"
+	case ANSI:
+		return "ANSI"
+	case Ascii:
+		return "Ascii"
+	case NoTTY:
+		return "NoTTY"
+	}
+	return "Unknown"
+}
+
+// Convert transforms a given Color to a Color supported within the Profile.
+func (p Profile) Convert(c color.Color) color.Color {
+	if p <= Ascii {
+		return nil
+	}
+
+	switch c := c.(type) {
+	case ansi.BasicColor:
+		return c
+
+	case ansi.ExtendedColor:
+		if p == ANSI {
+			return ansi256ToANSIColor(c)
+		}
+		return c
+
+	case ansi.TrueColor, color.Color:
+		h, ok := colorful.MakeColor(c)
+		if !ok {
+			return nil
+		}
+		if p != TrueColor {
+			ac := hexToANSI256Color(h)
+			if p == ANSI {
+				return ansi256ToANSIColor(ac)
+			}
+			return ac
+		}
+		return c
+	}
+
+	return c
+}
+
+func hexToANSI256Color(c colorful.Color) ansi.ExtendedColor {
+	v2ci := func(v float64) int {
+		if v < 48 {
+			return 0
+		}
+		if v < 115 {
+			return 1
+		}
+		return int((v - 35) / 40)
+	}
+
+	// Calculate the nearest 0-based color index at 16..231
+	r := v2ci(c.R * 255.0) // 0..5 each
+	g := v2ci(c.G * 255.0)
+	b := v2ci(c.B * 255.0)
+	ci := 36*r + 6*g + b /* 0..215 */
+
+	// Calculate the represented colors back from the index
+	i2cv := [6]int{0, 0x5f, 0x87, 0xaf, 0xd7, 0xff}
+	cr := i2cv[r] // r/g/b, 0..255 each
+	cg := i2cv[g]
+	cb := i2cv[b]
+
+	// Calculate the nearest 0-based gray index at 232..255
+	var grayIdx int
+	average := (cr + cg + cb) / 3
+	if average > 238 {
+		grayIdx = 23
+	} else {
+		grayIdx = (average - 3) / 10 // 0..23
+	}
+	gv := 8 + 10*grayIdx // same value for r/g/b, 0..255
+
+	// Return the one which is nearer to the original input rgb value
+	c2 := colorful.Color{R: float64(cr) / 255.0, G: float64(cg) / 255.0, B: float64(cb) / 255.0}
+	g2 := colorful.Color{R: float64(gv) / 255.0, G: float64(gv) / 255.0, B: float64(gv) / 255.0}
+	colorDist := c.DistanceHSLuv(c2)
+	grayDist := c.DistanceHSLuv(g2)
+
+	if colorDist <= grayDist {
+		return ansi.ExtendedColor(16 + ci) //nolint:gosec
+	}
+	return ansi.ExtendedColor(232 + grayIdx) //nolint:gosec
+}
+
+func ansi256ToANSIColor(c ansi.ExtendedColor) ansi.BasicColor {
+	var r int
+	md := math.MaxFloat64
+
+	h, _ := colorful.Hex(ansiHex[c])
+	for i := 0; i <= 15; i++ {
+		hb, _ := colorful.Hex(ansiHex[i])
+		d := h.DistanceHSLuv(hb)
+
+		if d < md {
+			md = d
+			r = i
+		}
+	}
+
+	return ansi.BasicColor(r) //nolint:gosec
+}
+
+// RGB values of ANSI colors (0-255).
+var ansiHex = []string{
+	"#000000",
+	"#800000",
+	"#008000",
+	"#808000",
+	"#000080",
+	"#800080",
+	"#008080",
+	"#c0c0c0",
+	"#808080",
+	"#ff0000",
+	"#00ff00",
+	"#ffff00",
+	"#0000ff",
+	"#ff00ff",
+	"#00ffff",
+	"#ffffff",
+	"#000000",
+	"#00005f",
+	"#000087",
+	"#0000af",
+	"#0000d7",
+	"#0000ff",
+	"#005f00",
+	"#005f5f",
+	"#005f87",
+	"#005faf",
+	"#005fd7",
+	"#005fff",
+	"#008700",
+	"#00875f",
+	"#008787",
+	"#0087af",
+	"#0087d7",
+	"#0087ff",
+	"#00af00",
+	"#00af5f",
+	"#00af87",
+	"#00afaf",
+	"#00afd7",
+	"#00afff",
+	"#00d700",
+	"#00d75f",
+	"#00d787",
+	"#00d7af",
+	"#00d7d7",
+	"#00d7ff",
+	"#00ff00",
+	"#00ff5f",
+	"#00ff87",
+	"#00ffaf",
+	"#00ffd7",
+	"#00ffff",
+	"#5f0000",
+	"#5f005f",
+	"#5f0087",
+	"#5f00af",
+	"#5f00d7",
+	"#5f00ff",
+	"#5f5f00",
+	"#5f5f5f",
+	"#5f5f87",
+	"#5f5faf",
+	"#5f5fd7",
+	"#5f5fff",
+	"#5f8700",
+	"#5f875f",
+	"#5f8787",
+	"#5f87af",
+	"#5f87d7",
+	"#5f87ff",
+	"#5faf00",
+	"#5faf5f",
+	"#5faf87",
+	"#5fafaf",
+	"#5fafd7",
+	"#5fafff",
+	"#5fd700",
+	"#5fd75f",
+	"#5fd787",
+	"#5fd7af",
+	"#5fd7d7",
+	"#5fd7ff",
+	"#5fff00",
+	"#5fff5f",
+	"#5fff87",
+	"#5fffaf",
+	"#5fffd7",
+	"#5fffff",
+	"#870000",
+	"#87005f",
+	"#870087",
+	"#8700af",
+	"#8700d7",
+	"#8700ff",
+	"#875f00",
+	"#875f5f",
+	"#875f87",
+	"#875faf",
+	"#875fd7",
+	"#875fff",
+	"#878700",
+	"#87875f",
+	"#878787",
+	"#8787af",
+	"#8787d7",
+	"#8787ff",
+	"#87af00",
+	"#87af5f",
+	"#87af87",
+	"#87afaf",
+	"#87afd7",
+	"#87afff",
+	"#87d700",
+	"#87d75f",
+	"#87d787",
+	"#87d7af",
+	"#87d7d7",
+	"#87d7ff",
+	"#87ff00",
+	"#87ff5f",
+	"#87ff87",
+	"#87ffaf",
+	"#87ffd7",
+	"#87ffff",
+	"#af0000",
+	"#af005f",
+	"#af0087",
+	"#af00af",
+	"#af00d7",
+	"#af00ff",
+	"#af5f00",
+	"#af5f5f",
+	"#af5f87",
+	"#af5faf",
+	"#af5fd7",
+	"#af5fff",
+	"#af8700",
+	"#af875f",
+	"#af8787",
+	"#af87af",
+	"#af87d7",
+	"#af87ff",
+	"#afaf00",
+	"#afaf5f",
+	"#afaf87",
+	"#afafaf",
+	"#afafd7",
+	"#afafff",
+	"#afd700",
+	"#afd75f",
+	"#afd787",
+	"#afd7af",
+	"#afd7d7",
+	"#afd7ff",
+	"#afff00",
+	"#afff5f",
+	"#afff87",
+	"#afffaf",
+	"#afffd7",
+	"#afffff",
+	"#d70000",
+	"#d7005f",
+	"#d70087",
+	"#d700af",
+	"#d700d7",
+	"#d700ff",
+	"#d75f00",
+	"#d75f5f",
+	"#d75f87",
+	"#d75faf",
+	"#d75fd7",
+	"#d75fff",
+	"#d78700",
+	"#d7875f",
+	"#d78787",
+	"#d787af",
+	"#d787d7",
+	"#d787ff",
+	"#d7af00",
+	"#d7af5f",
+	"#d7af87",
+	"#d7afaf",
+	"#d7afd7",
+	"#d7afff",
+	"#d7d700",
+	"#d7d75f",
+	"#d7d787",
+	"#d7d7af",
+	"#d7d7d7",
+	"#d7d7ff",
+	"#d7ff00",
+	"#d7ff5f",
+	"#d7ff87",
+	"#d7ffaf",
+	"#d7ffd7",
+	"#d7ffff",
+	"#ff0000",
+	"#ff005f",
+	"#ff0087",
+	"#ff00af",
+	"#ff00d7",
+	"#ff00ff",
+	"#ff5f00",
+	"#ff5f5f",
+	"#ff5f87",
+	"#ff5faf",
+	"#ff5fd7",
+	"#ff5fff",
+	"#ff8700",
+	"#ff875f",
+	"#ff8787",
+	"#ff87af",
+	"#ff87d7",
+	"#ff87ff",
+	"#ffaf00",
+	"#ffaf5f",
+	"#ffaf87",
+	"#ffafaf",
+	"#ffafd7",
+	"#ffafff",
+	"#ffd700",
+	"#ffd75f",
+	"#ffd787",
+	"#ffd7af",
+	"#ffd7d7",
+	"#ffd7ff",
+	"#ffff00",
+	"#ffff5f",
+	"#ffff87",
+	"#ffffaf",
+	"#ffffd7",
+	"#ffffff",
+	"#080808",
+	"#121212",
+	"#1c1c1c",
+	"#262626",
+	"#303030",
+	"#3a3a3a",
+	"#444444",
+	"#4e4e4e",
+	"#585858",
+	"#626262",
+	"#6c6c6c",
+	"#767676",
+	"#808080",
+	"#8a8a8a",
+	"#949494",
+	"#9e9e9e",
+	"#a8a8a8",
+	"#b2b2b2",
+	"#bcbcbc",
+	"#c6c6c6",
+	"#d0d0d0",
+	"#dadada",
+	"#e4e4e4",
+	"#eeeeee",
+}
diff --git a/source/vendor/github.com/charmbracelet/colorprofile/writer.go b/source/vendor/github.com/charmbracelet/colorprofile/writer.go
new file mode 100644
index 0000000..47f0c6e
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/colorprofile/writer.go
@@ -0,0 +1,169 @@
+package colorprofile
+
+import (
+	"bytes"
+	"fmt"
+	"image/color"
+	"io"
+	"strconv"
+
+	"github.com/charmbracelet/x/ansi"
+)
+
+// NewWriter creates a new color profile writer that downgrades color sequences
+// based on the detected color profile.
+//
+// If environ is nil, it will use os.Environ() to get the environment variables.
+//
+// It queries the given writer to determine if it supports ANSI escape codes.
+// If it does, along with the given environment variables, it will determine
+// the appropriate color profile to use for color formatting.
+//
+// This respects the NO_COLOR, CLICOLOR, and CLICOLOR_FORCE environment variables.
+func NewWriter(w io.Writer, environ []string) *Writer {
+	return &Writer{
+		Forward: w,
+		Profile: Detect(w, environ),
+	}
+}
+
+// Writer represents a color profile writer that writes ANSI sequences to the
+// underlying writer.
+type Writer struct {
+	Forward io.Writer
+	Profile Profile
+}
+
+// Write writes the given text to the underlying writer.
+func (w *Writer) Write(p []byte) (int, error) {
+	switch w.Profile {
+	case TrueColor:
+		return w.Forward.Write(p) //nolint:wrapcheck
+	case NoTTY:
+		return io.WriteString(w.Forward, ansi.Strip(string(p))) //nolint:wrapcheck
+	case Ascii, ANSI, ANSI256:
+		return w.downsample(p)
+	default:
+		return 0, fmt.Errorf("invalid profile: %v", w.Profile)
+	}
+}
+
+// downsample downgrades the given text to the appropriate color profile.
+func (w *Writer) downsample(p []byte) (int, error) {
+	var buf bytes.Buffer
+	var state byte
+
+	parser := ansi.GetParser()
+	defer ansi.PutParser(parser)
+
+	for len(p) > 0 {
+		parser.Reset()
+		seq, _, read, newState := ansi.DecodeSequence(p, state, parser)
+
+		switch {
+		case ansi.HasCsiPrefix(seq) && parser.Command() == 'm':
+			handleSgr(w, parser, &buf)
+		default:
+			// If we're not a style SGR sequence, just write the bytes.
+			if n, err := buf.Write(seq); err != nil {
+				return n, err //nolint:wrapcheck
+			}
+		}
+
+		p = p[read:]
+		state = newState
+	}
+
+	return w.Forward.Write(buf.Bytes()) //nolint:wrapcheck
+}
+
+// WriteString writes the given text to the underlying writer.
+func (w *Writer) WriteString(s string) (n int, err error) {
+	return w.Write([]byte(s))
+}
+
+func handleSgr(w *Writer, p *ansi.Parser, buf *bytes.Buffer) {
+	var style ansi.Style
+	params := p.Params()
+	for i := 0; i < len(params); i++ {
+		param := params[i]
+
+		switch param := param.Param(0); param {
+		case 0:
+			// SGR default parameter is 0. We use an empty string to reduce the
+			// number of bytes written to the buffer.
+			style = append(style, "")
+		case 30, 31, 32, 33, 34, 35, 36, 37: // 8-bit foreground color
+			if w.Profile < ANSI {
+				continue
+			}
+			style = style.ForegroundColor(
+				w.Profile.Convert(ansi.BasicColor(param - 30))) //nolint:gosec
+		case 38: // 16 or 24-bit foreground color
+			var c color.Color
+			if n := ansi.ReadStyleColor(params[i:], &c); n > 0 {
+				i += n - 1
+			}
+			if w.Profile < ANSI {
+				continue
+			}
+			style = style.ForegroundColor(w.Profile.Convert(c))
+		case 39: // default foreground color
+			if w.Profile < ANSI {
+				continue
+			}
+			style = style.DefaultForegroundColor()
+		case 40, 41, 42, 43, 44, 45, 46, 47: // 8-bit background color
+			if w.Profile < ANSI {
+				continue
+			}
+			style = style.BackgroundColor(
+				w.Profile.Convert(ansi.BasicColor(param - 40))) //nolint:gosec
+		case 48: // 16 or 24-bit background color
+			var c color.Color
+			if n := ansi.ReadStyleColor(params[i:], &c); n > 0 {
+				i += n - 1
+			}
+			if w.Profile < ANSI {
+				continue
+			}
+			style = style.BackgroundColor(w.Profile.Convert(c))
+		case 49: // default background color
+			if w.Profile < ANSI {
+				continue
+			}
+			style = style.DefaultBackgroundColor()
+		case 58: // 16 or 24-bit underline color
+			var c color.Color
+			if n := ansi.ReadStyleColor(params[i:], &c); n > 0 {
+				i += n - 1
+			}
+			if w.Profile < ANSI {
+				continue
+			}
+			style = style.UnderlineColor(w.Profile.Convert(c))
+		case 59: // default underline color
+			if w.Profile < ANSI {
+				continue
+			}
+			style = style.DefaultUnderlineColor()
+		case 90, 91, 92, 93, 94, 95, 96, 97: // 8-bit bright foreground color
+			if w.Profile < ANSI {
+				continue
+			}
+			style = style.ForegroundColor(
+				w.Profile.Convert(ansi.BasicColor(param - 90 + 8))) //nolint:gosec
+		case 100, 101, 102, 103, 104, 105, 106, 107: // 8-bit bright background color
+			if w.Profile < ANSI {
+				continue
+			}
+			style = style.BackgroundColor(
+				w.Profile.Convert(ansi.BasicColor(param - 100 + 8))) //nolint:gosec
+		default:
+			// If this is not a color attribute, just append it to the style.
+			style = append(style, strconv.Itoa(param))
+		}
+	}
+
+	_, _ = buf.WriteString(style.String())
+}
diff --git a/source/vendor/github.com/charmbracelet/lipgloss/.gitignore b/source/vendor/github.com/charmbracelet/lipgloss/.gitignore
index 53e1c2b..db48201 100644
--- a/source/vendor/github.com/charmbracelet/lipgloss/.gitignore
+++ b/source/vendor/github.com/charmbracelet/lipgloss/.gitignore
@@ -1 +1,2 @@
 ssh_example_ed25519*
+dist/
diff --git a/source/vendor/github.com/charmbracelet/lipgloss/.golangci-soft.yml b/source/vendor/github.com/charmbracelet/lipgloss/.golangci-soft.yml
deleted file mode 100644
index 8783713..0000000
--- a/source/vendor/github.com/charmbracelet/lipgloss/.golangci-soft.yml
+++ /dev/null
@@ -1,40 +0,0 @@
-run:
-  tests: false
-
-issues:
-  include:
-    - EXC0001
-    - EXC0005
-    - EXC0011
-    - EXC0012
-    - EXC0013
-
-  max-issues-per-linter: 0
-  max-same-issues: 0
-
-linters:
-  enable:
-    - exhaustive
-    - goconst
-    - godot
-    - godox
-    - mnd
-    - gomoddirectives
-    - goprintffuncname
-    - misspell
-    - nakedret
-    - nestif
-    - noctx
-    - nolintlint
-    - prealloc
-    - wrapcheck
-
-  # disable default linters, they are already enabled in .golangci.yml
-  disable:
-    - errcheck
-    - gosimple
-    - govet
-    - ineffassign
-    - staticcheck
-    - typecheck
-    - unused
diff --git a/source/vendor/github.com/charmbracelet/lipgloss/.golangci.yml b/source/vendor/github.com/charmbracelet/lipgloss/.golangci.yml
index d6789e0..90c5c08 100644
--- a/source/vendor/github.com/charmbracelet/lipgloss/.golangci.yml
+++ b/source/vendor/github.com/charmbracelet/lipgloss/.golangci.yml
@@ -15,10 +15,22 @@ issues:
 linters:
   enable:
     - bodyclose
+    - exhaustive
+    - goconst
+    - godot
+    - godox
     - gofumpt
     - goimports
+    - gomoddirectives
+    - goprintffuncname
     - gosec
+    - misspell
+    - nakedret
+    - nestif
     - nilerr
+    - noctx
+    - nolintlint
+    - prealloc
     - revive
     - rowserrcheck
     - sqlclosecheck
@@ -26,3 +38,4 @@ linters:
     - unconvert
     - unparam
     - whitespace
+    - wrapcheck
diff --git a/source/vendor/github.com/charmbracelet/lipgloss/README.md b/source/vendor/github.com/charmbracelet/lipgloss/README.md
index f171e7d..cee2371 100644
--- a/source/vendor/github.com/charmbracelet/lipgloss/README.md
+++ b/source/vendor/github.com/charmbracelet/lipgloss/README.md
@@ -10,7 +10,7 @@
 
 Style definitions for nice terminal layouts. Built with TUIs in mind.
 
-![Lip Gloss example](https://github.com/user-attachments/assets/99c5c015-551b-4897-8cd1-bcaafa0aad5a)
+![Lip Gloss example](https://github.com/user-attachments/assets/7950b1c1-e0e3-427e-8e7d-6f7f6ad17ca7)
 
 Lip Gloss takes an expressive, declarative approach to terminal rendering.
 Users familiar with CSS will feel at home with Lip Gloss.
@@ -425,17 +425,28 @@ rows := [][]string{
 Use the table package to style and render the table.
 
 ```go
+var (
+    purple    = lipgloss.Color("99")
+    gray      = lipgloss.Color("245")
+    lightGray = lipgloss.Color("241")
+
+    headerStyle  = lipgloss.NewStyle().Foreground(purple).Bold(true).Align(lipgloss.Center)
+    cellStyle    = lipgloss.NewStyle().Padding(0, 1).Width(14)
+    oddRowStyle  = cellStyle.Foreground(gray)
+    evenRowStyle = cellStyle.Foreground(lightGray)
+)
+
 t := table.New().
     Border(lipgloss.NormalBorder()).
-    BorderStyle(lipgloss.NewStyle().Foreground(lipgloss.Color("99"))).
+    BorderStyle(lipgloss.NewStyle().Foreground(purple)).
     StyleFunc(func(row, col int) lipgloss.Style {
         switch {
-        case row == 0:
-            return HeaderStyle
+        case row == table.HeaderRow:
+            return headerStyle
         case row%2 == 0:
-            return EvenRowStyle
+            return evenRowStyle
         default:
-            return OddRowStyle
+            return oddRowStyle
         }
     }).
     Headers("LANGUAGE", "FORMAL", "INFORMAL").
@@ -453,6 +464,45 @@ fmt.Println(t)
 
 ![Table Example](https://github.com/charmbracelet/lipgloss/assets/42545625/6e4b70c4-f494-45da-a467-bdd27df30d5d)
 
+> [!WARNING]
+> Table `Rows` need to be declared before `Offset` otherwise it does nothing.
+
+### Table Borders
+
+There are helpers to generate tables in markdown or ASCII style:
+
+#### Markdown Table
+
+```go
+table.New().Border(lipgloss.MarkdownBorder()).BorderTop(false).BorderBottom(false)
+```
+
+```
+| LANGUAGE |    FORMAL    | INFORMAL  |
+|----------|--------------|-----------|
+| Chinese  | Nǐn hǎo      | Nǐ hǎo    |
+| French   | Bonjour      | Salut     |
+| Russian  | Zdravstvuyte | Privet    |
+| Spanish  | Hola         | ¿Qué tal? |
+```
+
+#### ASCII Table
+
+```go
+table.New().Border(lipgloss.ASCIIBorder())
+```
+
+```
++----------+--------------+-----------+
+| LANGUAGE |    FORMAL    | INFORMAL  |
++----------+--------------+-----------+
+| Chinese  | Nǐn hǎo      | Nǐ hǎo    |
+| French   | Bonjour      | Salut     |
+| Russian  | Zdravstvuyte | Privet    |
+| Spanish  | Hola         | ¿Qué tal? |
++----------+--------------+-----------+
+```
+
 For more on tables see [the docs](https://pkg.go.dev/github.com/charmbracelet/lipgloss?tab=doc) and [examples](https://github.com/charmbracelet/lipgloss/tree/master/examples/table).
 
 ## Rendering Lists
diff --git a/source/vendor/github.com/charmbracelet/lipgloss/align.go b/source/vendor/github.com/charmbracelet/lipgloss/align.go
index 805d1e0..ce654b2 100644
--- a/source/vendor/github.com/charmbracelet/lipgloss/align.go
+++ b/source/vendor/github.com/charmbracelet/lipgloss/align.go
@@ -30,8 +30,8 @@ func alignTextHorizontal(str string, pos Position, width int, style *termenv.Sty
 				l = s + l
 			case Center:
 				// Note: remainder goes on the right.
-				left := shortAmount / 2       //nolint:gomnd
-				right := left + shortAmount%2 //nolint:gomnd
+				left := shortAmount / 2       //nolint:mnd
+				right := left + shortAmount%2 //nolint:mnd
 
 				leftSpaces := strings.Repeat(" ", left)
 				rightSpaces := strings.Repeat(" ", right)
@@ -69,7 +69,7 @@ func alignTextVertical(str string, pos Position, height int, _ *termenv.Style) s
 	case Top:
 		return str + strings.Repeat("\n", height-strHeight)
 	case Center:
-		topPadding, bottomPadding := (height-strHeight)/2, (height-strHeight)/2 //nolint:gomnd
+		topPadding, bottomPadding := (height-strHeight)/2, (height-strHeight)/2 //nolint:mnd
 		if strHeight+topPadding+bottomPadding > height {
 			topPadding--
 		} else if strHeight+topPadding+bottomPadding < height {
diff --git a/source/vendor/github.com/charmbracelet/lipgloss/borders.go b/source/vendor/github.com/charmbracelet/lipgloss/borders.go
index deb6b35..b36f874 100644
--- a/source/vendor/github.com/charmbracelet/lipgloss/borders.go
+++ b/source/vendor/github.com/charmbracelet/lipgloss/borders.go
@@ -100,14 +100,19 @@ var (
 	}
 
 	blockBorder = Border{
-		Top:         "█",
-		Bottom:      "█",
-		Left:        "█",
-		Right:       "█",
-		TopLeft:     "█",
-		TopRight:    "█",
-		BottomLeft:  "█",
-		BottomRight: "█",
+		Top:          "█",
+		Bottom:       "█",
+		Left:         "█",
+		Right:        "█",
+		TopLeft:      "█",
+		TopRight:     "█",
+		BottomLeft:   "█",
+		BottomRight:  "█",
+		MiddleLeft:   "█",
+		MiddleRight:  "█",
+		Middle:       "█",
+		MiddleTop:    "█",
+		MiddleBottom: "█",
 	}
 
 	outerHalfBlockBorder = Border{
@@ -179,6 +184,38 @@ var (
 		MiddleTop:    " ",
 		MiddleBottom: " ",
 	}
+
+	markdownBorder = Border{
+		Top:          "-",
+		Bottom:       "-",
+		Left:         "|",
+		Right:        "|",
+		TopLeft:      "|",
+		TopRight:     "|",
+		BottomLeft:   "|",
+		BottomRight:  "|",
+		MiddleLeft:   "|",
+		MiddleRight:  "|",
+		Middle:       "|",
+		MiddleTop:    "|",
+		MiddleBottom: "|",
+	}
+
+	asciiBorder = Border{
+		Top:          "-",
+		Bottom:       "-",
+		Left:         "|",
+		Right:        "|",
+		TopLeft:      "+",
+		TopRight:     "+",
+		BottomLeft:   "+",
+		BottomRight:  "+",
+		MiddleLeft:   "+",
+		MiddleRight:  "+",
+		Middle:       "+",
+		MiddleTop:    "+",
+		MiddleBottom: "+",
+	}
 )
 
 // NormalBorder returns a standard-type border with a normal weight and 90
@@ -226,13 +263,23 @@ func HiddenBorder() Border {
 	return hiddenBorder
 }
 
+// MarkdownBorder return a table border in markdown style.
+//
+// Make sure to disable top and bottom border for the best result. This will
+// ensure that the output is valid markdown.
+//
+//	table.New().Border(lipgloss.MarkdownBorder()).BorderTop(false).BorderBottom(false)
+func MarkdownBorder() Border {
+	return markdownBorder
+}
+
+// ASCIIBorder returns a table border with ASCII characters.
+func ASCIIBorder() Border {
+	return asciiBorder
+}
+
 func (s Style) applyBorder(str string) string {
 	var (
-		topSet    = s.isSet(borderTopKey)
-		rightSet  = s.isSet(borderRightKey)
-		bottomSet = s.isSet(borderBottomKey)
-		leftSet   = s.isSet(borderLeftKey)
-
 		border    = s.getBorderStyle()
 		hasTop    = s.getAsBool(borderTopKey, false)
 		hasRight  = s.getAsBool(borderRightKey, false)
@@ -252,7 +299,7 @@ func (s Style) applyBorder(str string) string {
 
 	// If a border is set and no sides have been specifically turned on or off
 	// render borders on all sides.
-	if border != noBorder && !(topSet || rightSet || bottomSet || leftSet) {
+	if s.implicitBorders() {
 		hasTop = true
 		hasRight = true
 		hasBottom = true
diff --git a/source/vendor/github.com/charmbracelet/lipgloss/color.go b/source/vendor/github.com/charmbracelet/lipgloss/color.go
index 5dfb3cf..6caf3a3 100644
--- a/source/vendor/github.com/charmbracelet/lipgloss/color.go
+++ b/source/vendor/github.com/charmbracelet/lipgloss/color.go
@@ -35,7 +35,7 @@ func (NoColor) color(*Renderer) termenv.Color {
 //
 // Deprecated.
 func (n NoColor) RGBA() (r, g, b, a uint32) {
-	return 0x0, 0x0, 0x0, 0xFFFF //nolint:gomnd
+	return 0x0, 0x0, 0x0, 0xFFFF //nolint:mnd
 }
 
 // Color specifies a color by hex or ANSI value. For example:
diff --git a/source/vendor/github.com/charmbracelet/lipgloss/get.go b/source/vendor/github.com/charmbracelet/lipgloss/get.go
index 9c2f06f..422b4ce 100644
--- a/source/vendor/github.com/charmbracelet/lipgloss/get.go
+++ b/source/vendor/github.com/charmbracelet/lipgloss/get.go
@@ -300,7 +300,7 @@ func (s Style) GetBorderTopWidth() int {
 // runes of varying widths, the widest rune is returned. If no border exists on
 // the top edge, 0 is returned.
 func (s Style) GetBorderTopSize() int {
-	if !s.getAsBool(borderTopKey, false) {
+	if !s.getAsBool(borderTopKey, false) && !s.implicitBorders() {
 		return 0
 	}
 	return s.getBorderStyle().GetTopSize()
@@ -310,7 +310,7 @@ func (s Style) GetBorderTopSize() int {
 // runes of varying widths, the widest rune is returned. If no border exists on
 // the left edge, 0 is returned.
 func (s Style) GetBorderLeftSize() int {
-	if !s.getAsBool(borderLeftKey, false) {
+	if !s.getAsBool(borderLeftKey, false) && !s.implicitBorders() {
 		return 0
 	}
 	return s.getBorderStyle().GetLeftSize()
@@ -320,7 +320,7 @@ func (s Style) GetBorderLeftSize() int {
 // contain runes of varying widths, the widest rune is returned. If no border
 // exists on the left edge, 0 is returned.
 func (s Style) GetBorderBottomSize() int {
-	if !s.getAsBool(borderBottomKey, false) {
+	if !s.getAsBool(borderBottomKey, false) && !s.implicitBorders() {
 		return 0
 	}
 	return s.getBorderStyle().GetBottomSize()
@@ -330,7 +330,7 @@ func (s Style) GetBorderBottomSize() int {
 // contain runes of varying widths, the widest rune is returned. If no border
 // exists on the right edge, 0 is returned.
 func (s Style) GetBorderRightSize() int {
-	if !s.getAsBool(borderRightKey, false) {
+	if !s.getAsBool(borderRightKey, false) && !s.implicitBorders() {
 		return 0
 	}
 	return s.getBorderStyle().GetRightSize()
@@ -519,6 +519,20 @@ func (s Style) getBorderStyle() Border {
 	return s.borderStyle
 }
 
+// Returns whether or not the style has implicit borders. This happens when
+// a border style has been set but no border sides have been explicitly turned
+// on or off.
+func (s Style) implicitBorders() bool {
+	var (
+		borderStyle = s.getBorderStyle()
+		topSet      = s.isSet(borderTopKey)
+		rightSet    = s.isSet(borderRightKey)
+		bottomSet   = s.isSet(borderBottomKey)
+		leftSet     = s.isSet(borderLeftKey)
+	)
+	return borderStyle != noBorder && !(topSet || rightSet || bottomSet || leftSet)
+}
+
 func (s Style) getAsTransform(propKey) func(string) string {
 	if !s.isSet(transformKey) {
 		return nil
diff --git a/source/vendor/github.com/charmbracelet/lipgloss/ranges.go b/source/vendor/github.com/charmbracelet/lipgloss/ranges.go
new file mode 100644
index 0000000..d171699
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/lipgloss/ranges.go
@@ -0,0 +1,48 @@
+package lipgloss
+
+import (
+	"strings"
+
+	"github.com/charmbracelet/x/ansi"
+)
+
+// StyleRanges allows to, given a string, style ranges of it differently.
+// The function will take into account existing styles.
+// Ranges should not overlap.
+func StyleRanges(s string, ranges ...Range) string {
+	if len(ranges) == 0 {
+		return s
+	}
+
+	var buf strings.Builder
+	lastIdx := 0
+	stripped := ansi.Strip(s)
+
+	// Use Truncate and TruncateLeft to style match.MatchedIndexes without
+	// losing the original option style:
+	for _, rng := range ranges {
+		// Add the text before this match
+		if rng.Start > lastIdx {
+			buf.WriteString(ansi.Cut(s, lastIdx, rng.Start))
+		}
+		// Add the matched range with its highlight
+		buf.WriteString(rng.Style.Render(ansi.Cut(stripped, rng.Start, rng.End)))
+		lastIdx = rng.End
+	}
+
+	// Add any remaining text after the last match
+	buf.WriteString(ansi.TruncateLeft(s, lastIdx, ""))
+
+	return buf.String()
+}
+
+// NewRange returns a range that can be used with [StyleRanges].
+func NewRange(start, end int, style Style) Range {
+	return Range{start, end, style}
+}
+
+// Range to be used with [StyleRanges].
+type Range struct {
+	Start, End int
+	Style      Style
+}
diff --git a/source/vendor/github.com/charmbracelet/lipgloss/set.go b/source/vendor/github.com/charmbracelet/lipgloss/set.go
index ed6e272..fde38fa 100644
--- a/source/vendor/github.com/charmbracelet/lipgloss/set.go
+++ b/source/vendor/github.com/charmbracelet/lipgloss/set.go
@@ -710,19 +710,19 @@ func whichSidesInt(i ...int) (top, right, bottom, left int, ok bool) {
 		left = i[0]
 		right = i[0]
 		ok = true
-	case 2: //nolint:gomnd
+	case 2: //nolint:mnd
 		top = i[0]
 		bottom = i[0]
 		left = i[1]
 		right = i[1]
 		ok = true
-	case 3: //nolint:gomnd
+	case 3: //nolint:mnd
 		top = i[0]
 		left = i[1]
 		right = i[1]
 		bottom = i[2]
 		ok = true
-	case 4: //nolint:gomnd
+	case 4: //nolint:mnd
 		top = i[0]
 		right = i[1]
 		bottom = i[2]
@@ -743,19 +743,19 @@ func whichSidesBool(i ...bool) (top, right, bottom, left bool, ok bool) {
 		left = i[0]
 		right = i[0]
 		ok = true
-	case 2: //nolint:gomnd
+	case 2: //nolint:mnd
 		top = i[0]
 		bottom = i[0]
 		left = i[1]
 		right = i[1]
 		ok = true
-	case 3: //nolint:gomnd
+	case 3: //nolint:mnd
 		top = i[0]
 		left = i[1]
 		right = i[1]
 		bottom = i[2]
 		ok = true
-	case 4: //nolint:gomnd
+	case 4: //nolint:mnd
 		top = i[0]
 		right = i[1]
 		bottom = i[2]
@@ -776,19 +776,19 @@ func whichSidesColor(i ...TerminalColor) (top, right, bottom, left TerminalColor
 		left = i[0]
 		right = i[0]
 		ok = true
-	case 2: //nolint:gomnd
+	case 2: //nolint:mnd
 		top = i[0]
 		bottom = i[0]
 		left = i[1]
 		right = i[1]
 		ok = true
-	case 3: //nolint:gomnd
+	case 3: //nolint:mnd
 		top = i[0]
 		left = i[1]
 		right = i[1]
 		bottom = i[2]
 		ok = true
-	case 4: //nolint:gomnd
+	case 4: //nolint:mnd
 		top = i[0]
 		right = i[1]
 		bottom = i[2]
diff --git a/source/vendor/github.com/charmbracelet/lipgloss/style.go b/source/vendor/github.com/charmbracelet/lipgloss/style.go
index 0eb5c01..59fa3ab 100644
--- a/source/vendor/github.com/charmbracelet/lipgloss/style.go
+++ b/source/vendor/github.com/charmbracelet/lipgloss/style.go
@@ -5,6 +5,7 @@ import (
 	"unicode"
 
 	"github.com/charmbracelet/x/ansi"
+	"github.com/charmbracelet/x/cellbuf"
 	"github.com/muesli/termenv"
 )
 
@@ -364,7 +365,7 @@ func (s Style) Render(strs ...string) string {
 	// Word wrap
 	if !inline && width > 0 {
 		wrapAt := width - leftPadding - rightPadding
-		str = ansi.Wrap(str, wrapAt, "")
+		str = cellbuf.Wrap(str, wrapAt, "")
 	}
 
 	// Render core text
@@ -431,7 +432,7 @@ func (s Style) Render(strs ...string) string {
 	{
 		numLines := strings.Count(str, "\n")
 
-		if !(numLines == 0 && width == 0) {
+		if numLines != 0 || width != 0 {
 			var st *termenv.Style
 			if colorWhitespace || styleWhitespace {
 				st = &teWhitespace
diff --git a/source/vendor/github.com/charmbracelet/log/.golangci.yml b/source/vendor/github.com/charmbracelet/log/.golangci.yml
index 8d9f5fe..90c5c08 100644
--- a/source/vendor/github.com/charmbracelet/log/.golangci.yml
+++ b/source/vendor/github.com/charmbracelet/log/.golangci.yml
@@ -15,20 +15,27 @@ issues:
 linters:
   enable:
     - bodyclose
-    - dupl
-    - exportloopref
+    - exhaustive
     - goconst
     - godot
     - godox
+    - gofumpt
     - goimports
+    - gomoddirectives
     - goprintffuncname
     - gosec
     - misspell
+    - nakedret
+    - nestif
+    - nilerr
+    - noctx
     - nolintlint
     - prealloc
     - revive
     - rowserrcheck
     - sqlclosecheck
+    - tparallel
     - unconvert
     - unparam
     - whitespace
+    - wrapcheck
diff --git a/source/vendor/github.com/charmbracelet/log/json.go b/source/vendor/github.com/charmbracelet/log/json.go
index 5bdc097..19d4ddd 100644
--- a/source/vendor/github.com/charmbracelet/log/json.go
+++ b/source/vendor/github.com/charmbracelet/log/json.go
@@ -1,61 +1,151 @@
 package log
 
 import (
+	"bytes"
 	"encoding/json"
 	"fmt"
 	"time"
 )
 
 func (l *Logger) jsonFormatter(keyvals ...interface{}) {
-	m := make(map[string]interface{}, len(keyvals)/2)
-	for i := 0; i < len(keyvals); i += 2 {
-		switch keyvals[i] {
-		case TimestampKey:
-			if t, ok := keyvals[i+1].(time.Time); ok {
-				m[TimestampKey] = t.Format(l.timeFormat)
-			}
-		case LevelKey:
-			if level, ok := keyvals[i+1].(Level); ok {
-				m[LevelKey] = level.String()
-			}
-		case CallerKey:
-			if caller, ok := keyvals[i+1].(string); ok {
-				m[CallerKey] = caller
-			}
-		case PrefixKey:
-			if prefix, ok := keyvals[i+1].(string); ok {
-				m[PrefixKey] = prefix
-			}
-		case MessageKey:
-			if msg := keyvals[i+1]; msg != nil {
-				m[MessageKey] = fmt.Sprint(msg)
-			}
+	jw := &jsonWriter{w: &l.b}
+	jw.start()
+
+	i := 0
+	for i < len(keyvals) {
+		switch kv := keyvals[i].(type) {
+		case slogAttr:
+			l.jsonFormatterRoot(jw, kv.Key, kv.Value)
+			i++
 		default:
-			var (
-				key string
-				val interface{}
-			)
-			switch k := keyvals[i].(type) {
-			case fmt.Stringer:
-				key = k.String()
-			case error:
-				key = k.Error()
-			default:
-				key = fmt.Sprint(k)
+			if i+1 < len(keyvals) {
+				l.jsonFormatterRoot(jw, keyvals[i], keyvals[i+1])
 			}
-			switch v := keyvals[i+1].(type) {
-			case error:
-				val = v.Error()
-			case fmt.Stringer:
-				val = v.String()
-			default:
-				val = v
-			}
-			m[key] = val
+			i += 2
+		}
+	}
+
+	jw.end()
+	l.b.WriteRune('\n')
+}
+
+func (l *Logger) jsonFormatterRoot(jw *jsonWriter, key, value any) {
+	switch key {
+	case TimestampKey:
+		if t, ok := value.(time.Time); ok {
+			jw.objectItem(TimestampKey, t.Format(l.timeFormat))
+		}
+	case LevelKey:
+		if level, ok := value.(Level); ok {
+			jw.objectItem(LevelKey, level.String())
+		}
+	case CallerKey:
+		if caller, ok := value.(string); ok {
+			jw.objectItem(CallerKey, caller)
+		}
+	case PrefixKey:
+		if prefix, ok := value.(string); ok {
+			jw.objectItem(PrefixKey, prefix)
+		}
+	case MessageKey:
+		if msg := value; msg != nil {
+			jw.objectItem(MessageKey, fmt.Sprint(msg))
+		}
+	default:
+		l.jsonFormatterItem(jw, key, value)
+	}
+}
+
+func (l *Logger) jsonFormatterItem(jw *jsonWriter, key, value any) {
+	switch k := key.(type) {
+	case fmt.Stringer:
+		jw.objectKey(k.String())
+	case error:
+		jw.objectKey(k.Error())
+	default:
+		jw.objectKey(fmt.Sprint(k))
+	}
+	switch v := value.(type) {
+	case error:
+		jw.objectValue(v.Error())
+	case slogLogValuer:
+		l.writeSlogValue(jw, v.LogValue())
+	case slogValue:
+		l.writeSlogValue(jw, v.Resolve())
+	case fmt.Stringer:
+		jw.objectValue(v.String())
+	default:
+		jw.objectValue(v)
+	}
+}
+
+func (l *Logger) writeSlogValue(jw *jsonWriter, v slogValue) {
+	switch v.Kind() { //nolint:exhaustive
+	case slogKindGroup:
+		jw.start()
+		for _, attr := range v.Group() {
+			l.jsonFormatterItem(jw, attr.Key, attr.Value)
 		}
+		jw.end()
+	default:
+		jw.objectValue(v.Any())
+	}
+}
+
+type jsonWriter struct {
+	w *bytes.Buffer
+	d int
+}
+
+func (w *jsonWriter) start() {
+	w.w.WriteRune('{')
+	w.d = 0
+}
+
+func (w *jsonWriter) end() {
+	w.w.WriteRune('}')
+}
+
+func (w *jsonWriter) objectItem(key string, value any) {
+	w.objectKey(key)
+	w.objectValue(value)
+}
+
+func (w *jsonWriter) objectKey(key string) {
+	if w.d > 0 {
+		w.w.WriteRune(',')
+	}
+	w.d++
+
+	pos := w.w.Len()
+	err := w.writeEncoded(key)
+	if err != nil {
+		w.w.Truncate(pos)
+		w.w.WriteString(`"invalid key"`)
 	}
+	w.w.WriteRune(':')
+}
 
-	e := json.NewEncoder(&l.b)
+func (w *jsonWriter) objectValue(value any) {
+	pos := w.w.Len()
+	err := w.writeEncoded(value)
+	if err != nil {
+		w.w.Truncate(pos)
+		w.w.WriteString(`"invalid value"`)
+	}
+}
+
+func (w *jsonWriter) writeEncoded(v any) error {
+	e := json.NewEncoder(w.w)
 	e.SetEscapeHTML(false)
-	_ = e.Encode(m)
+	if err := e.Encode(v); err != nil {
+		return fmt.Errorf("failed to encode value: %w", err)
+	}
+
+	// trailing \n added by json.Encode
+	b := w.w.Bytes()
+	if len(b) > 0 && b[len(b)-1] == '\n' {
+		w.w.Truncate(w.w.Len() - 1)
+	}
+	return nil
 }
diff --git a/source/vendor/github.com/charmbracelet/log/level.go b/source/vendor/github.com/charmbracelet/log/level.go
index cba2297..6876e34 100644
--- a/source/vendor/github.com/charmbracelet/log/level.go
+++ b/source/vendor/github.com/charmbracelet/log/level.go
@@ -8,7 +8,7 @@ import (
 )
 
 // Level is a logging level.
-type Level int32
+type Level int
 
 const (
 	// DebugLevel is the debug level.
@@ -22,12 +22,12 @@ const (
 	// FatalLevel is the fatal level.
 	FatalLevel Level = 12
 	// noLevel is used with log.Print.
-	noLevel Level = math.MaxInt32
+	noLevel Level = math.MaxInt
 )
 
 // String returns the string representation of the level.
 func (l Level) String() string {
-	switch l {
+	switch l { //nolint:exhaustive
 	case DebugLevel:
 		return "debug"
 	case InfoLevel:
diff --git a/source/vendor/github.com/charmbracelet/log/level_121.go b/source/vendor/github.com/charmbracelet/log/level_121.go
deleted file mode 100644
index c602bef..0000000
--- a/source/vendor/github.com/charmbracelet/log/level_121.go
+++ /dev/null
@@ -1,15 +0,0 @@
-//go:build go1.21
-// +build go1.21
-
-package log
-
-import "log/slog"
-
-// fromSlogLevel converts slog.Level to log.Level.
-var fromSlogLevel = map[slog.Level]Level{
-	slog.LevelDebug: DebugLevel,
-	slog.LevelInfo:  InfoLevel,
-	slog.LevelWarn:  WarnLevel,
-	slog.LevelError: ErrorLevel,
-	slog.Level(12):  FatalLevel,
-}
diff --git a/source/vendor/github.com/charmbracelet/log/level_no121.go b/source/vendor/github.com/charmbracelet/log/level_no121.go
deleted file mode 100644
index b505c08..0000000
--- a/source/vendor/github.com/charmbracelet/log/level_no121.go
+++ /dev/null
@@ -1,15 +0,0 @@
-//go:build !go1.21
-// +build !go1.21
-
-package log
-
-import "golang.org/x/exp/slog"
-
-// fromSlogLevel converts slog.Level to log.Level.
-var fromSlogLevel = map[slog.Level]Level{
-	slog.LevelDebug: DebugLevel,
-	slog.LevelInfo:  InfoLevel,
-	slog.LevelWarn:  WarnLevel,
-	slog.LevelError: ErrorLevel,
-	slog.Level(12):  FatalLevel,
-}
diff --git a/source/vendor/github.com/charmbracelet/log/logger.go b/source/vendor/github.com/charmbracelet/log/logger.go
index 2d24060..19ed409 100644
--- a/source/vendor/github.com/charmbracelet/log/logger.go
+++ b/source/vendor/github.com/charmbracelet/log/logger.go
@@ -30,7 +30,7 @@ type Logger struct {
 
 	isDiscard uint32
 
-	level           int32
+	level           int64
 	prefix          string
 	timeFunc        TimeFunction
 	timeFormat      string
@@ -59,7 +59,7 @@ func (l *Logger) Log(level Level, msg interface{}, keyvals ...interface{}) {
 	}
 
 	// check if the level is allowed
-	if atomic.LoadInt32(&l.level) > int32(level) {
+	if atomic.LoadInt64(&l.level) > int64(level) {
 		return
 	}
 
@@ -129,6 +129,8 @@ func (l *Logger) handle(level Level, ts time.Time, frames []runtime.Frame, msg i
 		l.logfmtFormatter(kvs...)
 	case JSONFormatter:
 		l.jsonFormatter(kvs...)
+	case TextFormatter:
+		fallthrough
 	default:
 		l.textFormatter(kvs...)
 	}
@@ -234,7 +236,7 @@ func (l *Logger) GetLevel() Level {
 func (l *Logger) SetLevel(level Level) {
 	l.mu.Lock()
 	defer l.mu.Unlock()
-	atomic.StoreInt32(&l.level, int32(level))
+	atomic.StoreInt64(&l.level, int64(level))
 }
 
 // GetPrefix returns the current prefix.
@@ -334,7 +336,8 @@ func (l *Logger) With(keyvals ...interface{}) *Logger {
 	sl.b = bytes.Buffer{}
 	sl.mu = &sync.RWMutex{}
 	sl.helpers = &sync.Map{}
-	sl.fields = append(l.fields, keyvals...)
+	sl.fields = append(make([]interface{}, 0, len(l.fields)+len(keyvals)), l.fields...)
+	sl.fields = append(sl.fields, keyvals...)
 	sl.styles = &st
 	return &sl
 }
diff --git a/source/vendor/github.com/charmbracelet/log/logger_121.go b/source/vendor/github.com/charmbracelet/log/logger_121.go
index 885b6cf..b5cf956 100644
--- a/source/vendor/github.com/charmbracelet/log/logger_121.go
+++ b/source/vendor/github.com/charmbracelet/log/logger_121.go
@@ -10,11 +10,20 @@ import (
 	"sync/atomic"
 )
 
+// type aliases for slog.
+type (
+	slogAttr      = slog.Attr
+	slogValue     = slog.Value
+	slogLogValuer = slog.LogValuer
+)
+
+const slogKindGroup = slog.KindGroup
+
 // Enabled reports whether the logger is enabled for the given level.
 //
 // Implements slog.Handler.
 func (l *Logger) Enabled(_ context.Context, level slog.Level) bool {
-	return atomic.LoadInt32(&l.level) <= int32(fromSlogLevel[level])
+	return atomic.LoadInt64(&l.level) <= int64(level)
 }
 
 // Handle handles the Record. It will only be called if Enabled returns true.
@@ -27,13 +36,13 @@ func (l *Logger) Handle(ctx context.Context, record slog.Record) error {
 
 	fields := make([]interface{}, 0, record.NumAttrs()*2)
 	record.Attrs(func(a slog.Attr) bool {
-		fields = append(fields, a.Key, a.Value.String())
+		fields = append(fields, a.Key, a.Value)
 		return true
 	})
 	// Get the caller frame using the record's PC.
 	frames := runtime.CallersFrames([]uintptr{record.PC})
 	frame, _ := frames.Next()
-	l.handle(fromSlogLevel[record.Level], l.timeFunc(record.Time), []runtime.Frame{frame}, record.Message, fields...)
+	l.handle(Level(record.Level), l.timeFunc(record.Time), []runtime.Frame{frame}, record.Message, fields...)
 	return nil
 }
 
diff --git a/source/vendor/github.com/charmbracelet/log/logger_no121.go b/source/vendor/github.com/charmbracelet/log/logger_no121.go
index aa602d1..ce8b8a2 100644
--- a/source/vendor/github.com/charmbracelet/log/logger_no121.go
+++ b/source/vendor/github.com/charmbracelet/log/logger_no121.go
@@ -11,11 +11,20 @@ import (
 	"golang.org/x/exp/slog"
 )
 
+// type alises for slog.
+type (
+	slogAttr      = slog.Attr
+	slogValue     = slog.Value
+	slogLogValuer = slog.LogValuer
+)
+
+const slogKindGroup = slog.KindGroup
+
 // Enabled reports whether the logger is enabled for the given level.
 //
 // Implements slog.Handler.
 func (l *Logger) Enabled(_ context.Context, level slog.Level) bool {
-	return atomic.LoadInt32(&l.level) <= int32(fromSlogLevel[level])
+	return atomic.LoadInt64(&l.level) <= int64(level)
 }
 
 // Handle handles the Record. It will only be called if Enabled returns true.
@@ -24,13 +33,13 @@ func (l *Logger) Enabled(_ context.Context, level slog.Level) bool {
 func (l *Logger) Handle(_ context.Context, record slog.Record) error {
 	fields := make([]interface{}, 0, record.NumAttrs()*2)
 	record.Attrs(func(a slog.Attr) bool {
-		fields = append(fields, a.Key, a.Value.String())
+		fields = append(fields, a.Key, a.Value)
 		return true
 	})
 	// Get the caller frame using the record's PC.
 	frames := runtime.CallersFrames([]uintptr{record.PC})
 	frame, _ := frames.Next()
-	l.handle(fromSlogLevel[record.Level], l.timeFunc(record.Time), []runtime.Frame{frame}, record.Message, fields...)
+	l.handle(Level(record.Level), l.timeFunc(record.Time), []runtime.Frame{frame}, record.Message, fields...)
 	return nil
 }
 
diff --git a/source/vendor/github.com/charmbracelet/log/pkg.go b/source/vendor/github.com/charmbracelet/log/pkg.go
index 9100b48..712bb38 100644
--- a/source/vendor/github.com/charmbracelet/log/pkg.go
+++ b/source/vendor/github.com/charmbracelet/log/pkg.go
@@ -7,6 +7,7 @@ import (
 	"log"
 	"os"
 	"sync"
+	"sync/atomic"
 	"time"
 
 	"github.com/muesli/termenv"
@@ -17,25 +18,27 @@ var (
 	registry = sync.Map{}
 
 	// defaultLogger is the default global logger instance.
+	defaultLogger     atomic.Pointer[Logger]
 	defaultLoggerOnce sync.Once
-	defaultLogger     *Logger
 )
 
 // Default returns the default logger. The default logger comes with timestamp enabled.
 func Default() *Logger {
-	defaultLoggerOnce.Do(func() {
-		if defaultLogger != nil {
-			// already set via SetDefault.
-			return
-		}
-		defaultLogger = NewWithOptions(os.Stderr, Options{ReportTimestamp: true})
-	})
-	return defaultLogger
+	dl := defaultLogger.Load()
+	if dl == nil {
+		defaultLoggerOnce.Do(func() {
+			defaultLogger.CompareAndSwap(
+				nil, NewWithOptions(os.Stderr, Options{ReportTimestamp: true}),
+			)
+		})
+		dl = defaultLogger.Load()
+	}
+	return dl
 }
 
 // SetDefault sets the default global logger.
 func SetDefault(logger *Logger) {
-	defaultLogger = logger
+	defaultLogger.Store(logger)
 }
 
 // New returns a new logger with the default options.
@@ -49,7 +52,7 @@ func NewWithOptions(w io.Writer, o Options) *Logger {
 		b:               bytes.Buffer{},
 		mu:              &sync.RWMutex{},
 		helpers:         &sync.Map{},
-		level:           int32(o.Level),
+		level:           int64(o.Level),
 		reportTimestamp: o.ReportTimestamp,
 		reportCaller:    o.ReportCaller,
 		prefix:          o.Prefix,
diff --git a/source/vendor/github.com/charmbracelet/log/stdlog.go b/source/vendor/github.com/charmbracelet/log/stdlog.go
index 7d352c4..3a585c8 100644
--- a/source/vendor/github.com/charmbracelet/log/stdlog.go
+++ b/source/vendor/github.com/charmbracelet/log/stdlog.go
@@ -14,7 +14,7 @@ func (l *stdLogWriter) Write(p []byte) (n int, err error) {
 	str := strings.TrimSuffix(string(p), "\n")
 
 	if l.opt != nil {
-		switch l.opt.ForceLevel {
+		switch l.opt.ForceLevel { //nolint:exhaustive
 		case DebugLevel:
 			l.l.Debug(str)
 		case InfoLevel:
diff --git a/source/vendor/github.com/charmbracelet/log/text.go b/source/vendor/github.com/charmbracelet/log/text.go
index c428866..a3775e8 100644
--- a/source/vendor/github.com/charmbracelet/log/text.go
+++ b/source/vendor/github.com/charmbracelet/log/text.go
@@ -21,7 +21,7 @@ func (l *Logger) writeIndent(w io.Writer, str string, indent string, newline boo
 	// kindly borrowed from hclog
 	for {
 		nl := strings.IndexByte(str, '\n')
-		if nl == -1 {
+		if nl == -1 { //nolint:nestif
 			if str != "" {
 				_, _ = w.Write([]byte(indent))
 				val := escapeStringForOutput(str, false)
diff --git a/source/vendor/github.com/charmbracelet/x/ansi/color.go b/source/vendor/github.com/charmbracelet/x/ansi/color.go
index 77f8a08..09feb97 100644
--- a/source/vendor/github.com/charmbracelet/x/ansi/color.go
+++ b/source/vendor/github.com/charmbracelet/x/ansi/color.go
@@ -2,34 +2,9 @@ package ansi
 
 import (
 	"image/color"
-)
 
-// Technically speaking, the 16 basic ANSI colors are arbitrary and can be
-// customized at the terminal level. Given that, we're returning what we feel
-// are good defaults.
-//
-// This could also be a slice, but we use a map to make the mappings very
-// explicit.
-//
-// See: https://www.ditig.com/publications/256-colors-cheat-sheet
-var lowANSI = map[uint32]uint32{
-	0:  0x000000, // black
-	1:  0x800000, // red
-	2:  0x008000, // green
-	3:  0x808000, // yellow
-	4:  0x000080, // blue
-	5:  0x800080, // magenta
-	6:  0x008080, // cyan
-	7:  0xc0c0c0, // white
-	8:  0x808080, // bright black
-	9:  0xff0000, // bright red
-	10: 0x00ff00, // bright green
-	11: 0xffff00, // bright yellow
-	12: 0x0000ff, // bright blue
-	13: 0xff00ff, // bright magenta
-	14: 0x00ffff, // bright cyan
-	15: 0xffffff, // bright white
-}
+	"github.com/lucasb-eyer/go-colorful"
+)
 
 // Color is a color that can be used in a terminal. ANSI (including
 // ANSI256) and 24-bit "true colors" fall under this category.
@@ -100,28 +75,33 @@ func (c BasicColor) RGBA() (uint32, uint32, uint32, uint32) {
 		return 0, 0, 0, 0xffff
 	}
 
-	r, g, b := ansiToRGB(ansi)
-	return toRGBA(r, g, b)
+	return ansiToRGB(byte(ansi)).RGBA()
 }
 
-// ExtendedColor is an ANSI 256 (8-bit) color with a value from 0 to 255.
-type ExtendedColor uint8
+// IndexedColor is an ANSI 256 (8-bit) color with a value from 0 to 255.
+type IndexedColor uint8
 
-var _ Color = ExtendedColor(0)
+var _ Color = IndexedColor(0)
 
 // RGBA returns the red, green, blue and alpha components of the color. It
 // satisfies the color.Color interface.
-func (c ExtendedColor) RGBA() (uint32, uint32, uint32, uint32) {
-	r, g, b := ansiToRGB(uint32(c))
-	return toRGBA(r, g, b)
+func (c IndexedColor) RGBA() (uint32, uint32, uint32, uint32) {
+	return ansiToRGB(byte(c)).RGBA()
 }
 
+// ExtendedColor is an ANSI 256 (8-bit) color with a value from 0 to 255.
+//
+// Deprecated: use [IndexedColor] instead.
+type ExtendedColor = IndexedColor
+
 // TrueColor is a 24-bit color that can be used in the terminal.
 // This can be used to represent RGB colors.
 //
 // For example, the color red can be represented as:
 //
 //	TrueColor(0xff0000)
+//
+// Deprecated: use [RGBColor] instead.
 type TrueColor uint32
 
 var _ Color = TrueColor(0)
@@ -133,44 +113,25 @@ func (c TrueColor) RGBA() (uint32, uint32, uint32, uint32) {
 	return toRGBA(r, g, b)
 }
 
+// RGBColor is a 24-bit color that can be used in the terminal.
+// This can be used to represent RGB colors.
+type RGBColor struct {
+	R uint8
+	G uint8
+	B uint8
+}
+
+// RGBA returns the red, green, blue and alpha components of the color. It
+// satisfies the color.Color interface.
+func (c RGBColor) RGBA() (uint32, uint32, uint32, uint32) {
+	return toRGBA(uint32(c.R), uint32(c.G), uint32(c.B))
+}
+
 // ansiToRGB converts an ANSI color to a 24-bit RGB color.
 //
 //	r, g, b := ansiToRGB(57)
-func ansiToRGB(ansi uint32) (uint32, uint32, uint32) {
-	// For out-of-range values return black.
-	if ansi > 255 {
-		return 0, 0, 0
-	}
-
-	// Low ANSI.
-	if ansi < 16 {
-		h, ok := lowANSI[ansi]
-		if !ok {
-			return 0, 0, 0
-		}
-		r, g, b := hexToRGB(h)
-		return r, g, b
-	}
-
-	// Grays.
-	if ansi > 231 {
-		s := (ansi-232)*10 + 8
-		return s, s, s
-	}
-
-	// ANSI256.
-	n := ansi - 16
-	b := n % 6
-	g := (n - b) / 6 % 6
-	r := (n - b - g*6) / 36 % 6
-	for _, v := range []*uint32{&r, &g, &b} {
-		if *v > 0 {
-			c := *v*40 + 55
-			*v = c
-		}
-	}
-
-	return r, g, b
+func ansiToRGB(ansi byte) color.Color {
+	return ansiHex[ansi]
 }
 
 // hexToRGB converts a number in hexadecimal format to red, green, and blue
@@ -194,3 +155,630 @@ func toRGBA(r, g, b uint32) (uint32, uint32, uint32, uint32) {
 	b |= b << 8
 	return r, g, b, 0xffff
 }
+
+//nolint:unused
+func distSq(r1, g1, b1, r2, g2, b2 int) int {
+	return ((r1-r2)*(r1-r2) + (g1-g2)*(g1-g2) + (b1-b2)*(b1-b2))
+}
+
+func to6Cube[T int | float64](v T) int {
+	if v < 48 {
+		return 0
+	}
+	if v < 115 {
+		return 1
+	}
+	return int((v - 35) / 40)
+}
+
+// Convert256 converts a [color.Color], usually a 24-bit color, to xterm(1) 256
+// color palette.
+//
+// xterm provides a 6x6x6 color cube (16 - 231) and 24 greys (232 - 255). We
+// map our RGB color to the closest in the cube, also work out the closest
+// grey, and use the nearest of the two based on the lightness of the color.
+//
+// Note that the xterm has much lower resolution for darker colors (they are
+// not evenly spread out), so our 6 levels are not evenly spread: 0x0, 0x5f
+// (95), 0x87 (135), 0xaf (175), 0xd7 (215) and 0xff (255). Greys are more
+// evenly spread (8, 18, 28 ... 238).
+func Convert256(c color.Color) IndexedColor {
+	// If the color is already an IndexedColor, return it.
+	if i, ok := c.(IndexedColor); ok {
+		return i
+	}
+
+	// Note: this is mostly ported from tmux/colour.c.
+	col, ok := colorful.MakeColor(c)
+	if !ok {
+		return IndexedColor(0)
+	}
+
+	r := col.R * 255
+	g := col.G * 255
+	b := col.B * 255
+
+	q2c := [6]int{0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff}
+
+	// Map RGB to 6x6x6 cube.
+	qr := to6Cube(r)
+	cr := q2c[qr]
+	qg := to6Cube(g)
+	cg := q2c[qg]
+	qb := to6Cube(b)
+	cb := q2c[qb]
+
+	// If we have hit the color exactly, return early.
+	ci := (36 * qr) + (6 * qg) + qb
+	if cr == int(r) && cg == int(g) && cb == int(b) {
+		return IndexedColor(16 + ci) //nolint:gosec
+	}
+
+	// Work out the closest grey (average of RGB).
+	greyAvg := int(r+g+b) / 3
+	var greyIdx int
+	if greyAvg > 238 {
+		greyIdx = 23
+	} else {
+		greyIdx = (greyAvg - 3) / 10
+	}
+	grey := 8 + (10 * greyIdx)
+
+	// Return the one which is nearer to the original input rgb value
+	// XXX: This is where it differs from tmux's implementation, we prefer the
+	// closer color to the original in terms of light distances rather than the
+	// cube distance.
+	c2 := colorful.Color{R: float64(cr) / 255.0, G: float64(cg) / 255.0, B: float64(cb) / 255.0}
+	g2 := colorful.Color{R: float64(grey) / 255.0, G: float64(grey) / 255.0, B: float64(grey) / 255.0}
+	colorDist := col.DistanceHSLuv(c2)
+	grayDist := col.DistanceHSLuv(g2)
+
+	if colorDist <= grayDist {
+		return IndexedColor(16 + ci) //nolint:gosec
+	}
+	return IndexedColor(232 + greyIdx) //nolint:gosec
+
+	// // Is grey or 6x6x6 color closest?
+	// d := distSq(cr, cg, cb, int(r), int(g), int(b))
+	// if distSq(grey, grey, grey, int(r), int(g), int(b)) < d {
+	// 	return IndexedColor(232 + greyIdx) //nolint:gosec
+	// }
+	// return IndexedColor(16 + ci) //nolint:gosec
+}
+
+// Convert16 converts a [color.Color] to a 16-color ANSI color. It will first
+// try to find a match in the 256 xterm(1) color palette, and then map that to
+// the 16-color ANSI palette.
+func Convert16(c color.Color) BasicColor {
+	switch c := c.(type) {
+	case BasicColor:
+		// If the color is already a BasicColor, return it.
+		return c
+	case IndexedColor:
+		// If the color is already an IndexedColor, return the corresponding
+		// BasicColor.
+		return ansi256To16[c]
+	default:
+		c256 := Convert256(c)
+		return ansi256To16[c256]
+	}
+}
+
+// RGB values of ANSI colors (0-255).
+var ansiHex = [...]color.RGBA{
+	0:   {R: 0x00, G: 0x00, B: 0x00, A: 0xff}, //   "#000000"
+	1:   {R: 0x80, G: 0x00, B: 0x00, A: 0xff}, //   "#800000"
+	2:   {R: 0x00, G: 0x80, B: 0x00, A: 0xff}, //   "#008000"
+	3:   {R: 0x80, G: 0x80, B: 0x00, A: 0xff}, //   "#808000"
+	4:   {R: 0x00, G: 0x00, B: 0x80, A: 0xff}, //   "#000080"
+	5:   {R: 0x80, G: 0x00, B: 0x80, A: 0xff}, //   "#800080"
+	6:   {R: 0x00, G: 0x80, B: 0x80, A: 0xff}, //   "#008080"
+	7:   {R: 0xc0, G: 0xc0, B: 0xc0, A: 0xff}, //   "#c0c0c0"
+	8:   {R: 0x80, G: 0x80, B: 0x80, A: 0xff}, //   "#808080"
+	9:   {R: 0xff, G: 0x00, B: 0x00, A: 0xff}, //   "#ff0000"
+	10:  {R: 0x00, G: 0xff, B: 0x00, A: 0xff}, //  "#00ff00"
+	11:  {R: 0xff, G: 0xff, B: 0x00, A: 0xff}, //  "#ffff00"
+	12:  {R: 0x00, G: 0x00, B: 0xff, A: 0xff}, //  "#0000ff"
+	13:  {R: 0xff, G: 0x00, B: 0xff, A: 0xff}, //  "#ff00ff"
+	14:  {R: 0x00, G: 0xff, B: 0xff, A: 0xff}, //  "#00ffff"
+	15:  {R: 0xff, G: 0xff, B: 0xff, A: 0xff}, //  "#ffffff"
+	16:  {R: 0x00, G: 0x00, B: 0x00, A: 0xff}, //  "#000000"
+	17:  {R: 0x00, G: 0x00, B: 0x5f, A: 0xff}, //  "#00005f"
+	18:  {R: 0x00, G: 0x00, B: 0x87, A: 0xff}, //  "#000087"
+	19:  {R: 0x00, G: 0x00, B: 0xaf, A: 0xff}, //  "#0000af"
+	20:  {R: 0x00, G: 0x00, B: 0xd7, A: 0xff}, //  "#0000d7"
+	21:  {R: 0x00, G: 0x00, B: 0xff, A: 0xff}, //  "#0000ff"
+	22:  {R: 0x00, G: 0x5f, B: 0x00, A: 0xff}, //  "#005f00"
+	23:  {R: 0x00, G: 0x5f, B: 0x5f, A: 0xff}, //  "#005f5f"
+	24:  {R: 0x00, G: 0x5f, B: 0x87, A: 0xff}, //  "#005f87"
+	25:  {R: 0x00, G: 0x5f, B: 0xaf, A: 0xff}, //  "#005faf"
+	26:  {R: 0x00, G: 0x5f, B: 0xd7, A: 0xff}, //  "#005fd7"
+	27:  {R: 0x00, G: 0x5f, B: 0xff, A: 0xff}, //  "#005fff"
+	28:  {R: 0x00, G: 0x87, B: 0x00, A: 0xff}, //  "#008700"
+	29:  {R: 0x00, G: 0x87, B: 0x5f, A: 0xff}, //  "#00875f"
+	30:  {R: 0x00, G: 0x87, B: 0x87, A: 0xff}, //  "#008787"
+	31:  {R: 0x00, G: 0x87, B: 0xaf, A: 0xff}, //  "#0087af"
+	32:  {R: 0x00, G: 0x87, B: 0xd7, A: 0xff}, //  "#0087d7"
+	33:  {R: 0x00, G: 0x87, B: 0xff, A: 0xff}, //  "#0087ff"
+	34:  {R: 0x00, G: 0xaf, B: 0x00, A: 0xff}, //  "#00af00"
+	35:  {R: 0x00, G: 0xaf, B: 0x5f, A: 0xff}, //  "#00af5f"
+	36:  {R: 0x00, G: 0xaf, B: 0x87, A: 0xff}, //  "#00af87"
+	37:  {R: 0x00, G: 0xaf, B: 0xaf, A: 0xff}, //  "#00afaf"
+	38:  {R: 0x00, G: 0xaf, B: 0xd7, A: 0xff}, //  "#00afd7"
+	39:  {R: 0x00, G: 0xaf, B: 0xff, A: 0xff}, //  "#00afff"
+	40:  {R: 0x00, G: 0xd7, B: 0x00, A: 0xff}, //  "#00d700"
+	41:  {R: 0x00, G: 0xd7, B: 0x5f, A: 0xff}, //  "#00d75f"
+	42:  {R: 0x00, G: 0xd7, B: 0x87, A: 0xff}, //  "#00d787"
+	43:  {R: 0x00, G: 0xd7, B: 0xaf, A: 0xff}, //  "#00d7af"
+	44:  {R: 0x00, G: 0xd7, B: 0xd7, A: 0xff}, //  "#00d7d7"
+	45:  {R: 0x00, G: 0xd7, B: 0xff, A: 0xff}, //  "#00d7ff"
+	46:  {R: 0x00, G: 0xff, B: 0x00, A: 0xff}, //  "#00ff00"
+	47:  {R: 0x00, G: 0xff, B: 0x5f, A: 0xff}, //  "#00ff5f"
+	48:  {R: 0x00, G: 0xff, B: 0x87, A: 0xff}, //  "#00ff87"
+	49:  {R: 0x00, G: 0xff, B: 0xaf, A: 0xff}, //  "#00ffaf"
+	50:  {R: 0x00, G: 0xff, B: 0xd7, A: 0xff}, //  "#00ffd7"
+	51:  {R: 0x00, G: 0xff, B: 0xff, A: 0xff}, //  "#00ffff"
+	52:  {R: 0x5f, G: 0x00, B: 0x00, A: 0xff}, //  "#5f0000"
+	53:  {R: 0x5f, G: 0x00, B: 0x5f, A: 0xff}, //  "#5f005f"
+	54:  {R: 0x5f, G: 0x00, B: 0x87, A: 0xff}, //  "#5f0087"
+	55:  {R: 0x5f, G: 0x00, B: 0xaf, A: 0xff}, //  "#5f00af"
+	56:  {R: 0x5f, G: 0x00, B: 0xd7, A: 0xff}, //  "#5f00d7"
+	57:  {R: 0x5f, G: 0x00, B: 0xff, A: 0xff}, //  "#5f00ff"
+	58:  {R: 0x5f, G: 0x5f, B: 0x00, A: 0xff}, //  "#5f5f00"
+	59:  {R: 0x5f, G: 0x5f, B: 0x5f, A: 0xff}, //  "#5f5f5f"
+	60:  {R: 0x5f, G: 0x5f, B: 0x87, A: 0xff}, //  "#5f5f87"
+	61:  {R: 0x5f, G: 0x5f, B: 0xaf, A: 0xff}, //  "#5f5faf"
+	62:  {R: 0x5f, G: 0x5f, B: 0xd7, A: 0xff}, //  "#5f5fd7"
+	63:  {R: 0x5f, G: 0x5f, B: 0xff, A: 0xff}, //  "#5f5fff"
+	64:  {R: 0x5f, G: 0x87, B: 0x00, A: 0xff}, //  "#5f8700"
+	65:  {R: 0x5f, G: 0x87, B: 0x5f, A: 0xff}, //  "#5f875f"
+	66:  {R: 0x5f, G: 0x87, B: 0x87, A: 0xff}, //  "#5f8787"
+	67:  {R: 0x5f, G: 0x87, B: 0xaf, A: 0xff}, //  "#5f87af"
+	68:  {R: 0x5f, G: 0x87, B: 0xd7, A: 0xff}, //  "#5f87d7"
+	69:  {R: 0x5f, G: 0x87, B: 0xff, A: 0xff}, //  "#5f87ff"
+	70:  {R: 0x5f, G: 0xaf, B: 0x00, A: 0xff}, //  "#5faf00"
+	71:  {R: 0x5f, G: 0xaf, B: 0x5f, A: 0xff}, //  "#5faf5f"
+	72:  {R: 0x5f, G: 0xaf, B: 0x87, A: 0xff}, //  "#5faf87"
+	73:  {R: 0x5f, G: 0xaf, B: 0xaf, A: 0xff}, //  "#5fafaf"
+	74:  {R: 0x5f, G: 0xaf, B: 0xd7, A: 0xff}, //  "#5fafd7"
+	75:  {R: 0x5f, G: 0xaf, B: 0xff, A: 0xff}, //  "#5fafff"
+	76:  {R: 0x5f, G: 0xd7, B: 0x00, A: 0xff}, //  "#5fd700"
+	77:  {R: 0x5f, G: 0xd7, B: 0x5f, A: 0xff}, //  "#5fd75f"
+	78:  {R: 0x5f, G: 0xd7, B: 0x87, A: 0xff}, //  "#5fd787"
+	79:  {R: 0x5f, G: 0xd7, B: 0xaf, A: 0xff}, //  "#5fd7af"
+	80:  {R: 0x5f, G: 0xd7, B: 0xd7, A: 0xff}, //  "#5fd7d7"
+	81:  {R: 0x5f, G: 0xd7, B: 0xff, A: 0xff}, //  "#5fd7ff"
+	82:  {R: 0x5f, G: 0xff, B: 0x00, A: 0xff}, //  "#5fff00"
+	83:  {R: 0x5f, G: 0xff, B: 0x5f, A: 0xff}, //  "#5fff5f"
+	84:  {R: 0x5f, G: 0xff, B: 0x87, A: 0xff}, //  "#5fff87"
+	85:  {R: 0x5f, G: 0xff, B: 0xaf, A: 0xff}, //  "#5fffaf"
+	86:  {R: 0x5f, G: 0xff, B: 0xd7, A: 0xff}, //  "#5fffd7"
+	87:  {R: 0x5f, G: 0xff, B: 0xff, A: 0xff}, //  "#5fffff"
+	88:  {R: 0x87, G: 0x00, B: 0x00, A: 0xff}, //  "#870000"
+	89:  {R: 0x87, G: 0x00, B: 0x5f, A: 0xff}, //  "#87005f"
+	90:  {R: 0x87, G: 0x00, B: 0x87, A: 0xff}, //  "#870087"
+	91:  {R: 0x87, G: 0x00, B: 0xaf, A: 0xff}, //  "#8700af"
+	92:  {R: 0x87, G: 0x00, B: 0xd7, A: 0xff}, //  "#8700d7"
+	93:  {R: 0x87, G: 0x00, B: 0xff, A: 0xff}, //  "#8700ff"
+	94:  {R: 0x87, G: 0x5f, B: 0x00, A: 0xff}, //  "#875f00"
+	95:  {R: 0x87, G: 0x5f, B: 0x5f, A: 0xff}, //  "#875f5f"
+	96:  {R: 0x87, G: 0x5f, B: 0x87, A: 0xff}, //  "#875f87"
+	97:  {R: 0x87, G: 0x5f, B: 0xaf, A: 0xff}, //  "#875faf"
+	98:  {R: 0x87, G: 0x5f, B: 0xd7, A: 0xff}, //  "#875fd7"
+	99:  {R: 0x87, G: 0x5f, B: 0xff, A: 0xff}, //  "#875fff"
+	100: {R: 0x87, G: 0x87, B: 0x00, A: 0xff}, // "#878700"
+	101: {R: 0x87, G: 0x87, B: 0x5f, A: 0xff}, // "#87875f"
+	102: {R: 0x87, G: 0x87, B: 0x87, A: 0xff}, // "#878787"
+	103: {R: 0x87, G: 0x87, B: 0xaf, A: 0xff}, // "#8787af"
+	104: {R: 0x87, G: 0x87, B: 0xd7, A: 0xff}, // "#8787d7"
+	105: {R: 0x87, G: 0x87, B: 0xff, A: 0xff}, // "#8787ff"
+	106: {R: 0x87, G: 0xaf, B: 0x00, A: 0xff}, // "#87af00"
+	107: {R: 0x87, G: 0xaf, B: 0x5f, A: 0xff}, // "#87af5f"
+	108: {R: 0x87, G: 0xaf, B: 0x87, A: 0xff}, // "#87af87"
+	109: {R: 0x87, G: 0xaf, B: 0xaf, A: 0xff}, // "#87afaf"
+	110: {R: 0x87, G: 0xaf, B: 0xd7, A: 0xff}, // "#87afd7"
+	111: {R: 0x87, G: 0xaf, B: 0xff, A: 0xff}, // "#87afff"
+	112: {R: 0x87, G: 0xd7, B: 0x00, A: 0xff}, // "#87d700"
+	113: {R: 0x87, G: 0xd7, B: 0x5f, A: 0xff}, // "#87d75f"
+	114: {R: 0x87, G: 0xd7, B: 0x87, A: 0xff}, // "#87d787"
+	115: {R: 0x87, G: 0xd7, B: 0xaf, A: 0xff}, // "#87d7af"
+	116: {R: 0x87, G: 0xd7, B: 0xd7, A: 0xff}, // "#87d7d7"
+	117: {R: 0x87, G: 0xd7, B: 0xff, A: 0xff}, // "#87d7ff"
+	118: {R: 0x87, G: 0xff, B: 0x00, A: 0xff}, // "#87ff00"
+	119: {R: 0x87, G: 0xff, B: 0x5f, A: 0xff}, // "#87ff5f"
+	120: {R: 0x87, G: 0xff, B: 0x87, A: 0xff}, // "#87ff87"
+	121: {R: 0x87, G: 0xff, B: 0xaf, A: 0xff}, // "#87ffaf"
+	122: {R: 0x87, G: 0xff, B: 0xd7, A: 0xff}, // "#87ffd7"
+	123: {R: 0x87, G: 0xff, B: 0xff, A: 0xff}, // "#87ffff"
+	124: {R: 0xaf, G: 0x00, B: 0x00, A: 0xff}, // "#af0000"
+	125: {R: 0xaf, G: 0x00, B: 0x5f, A: 0xff}, // "#af005f"
+	126: {R: 0xaf, G: 0x00, B: 0x87, A: 0xff}, // "#af0087"
+	127: {R: 0xaf, G: 0x00, B: 0xaf, A: 0xff}, // "#af00af"
+	128: {R: 0xaf, G: 0x00, B: 0xd7, A: 0xff}, // "#af00d7"
+	129: {R: 0xaf, G: 0x00, B: 0xff, A: 0xff}, // "#af00ff"
+	130: {R: 0xaf, G: 0x5f, B: 0x00, A: 0xff}, // "#af5f00"
+	131: {R: 0xaf, G: 0x5f, B: 0x5f, A: 0xff}, // "#af5f5f"
+	132: {R: 0xaf, G: 0x5f, B: 0x87, A: 0xff}, // "#af5f87"
+	133: {R: 0xaf, G: 0x5f, B: 0xaf, A: 0xff}, // "#af5faf"
+	134: {R: 0xaf, G: 0x5f, B: 0xd7, A: 0xff}, // "#af5fd7"
+	135: {R: 0xaf, G: 0x5f, B: 0xff, A: 0xff}, // "#af5fff"
+	136: {R: 0xaf, G: 0x87, B: 0x00, A: 0xff}, // "#af8700"
+	137: {R: 0xaf, G: 0x87, B: 0x5f, A: 0xff}, // "#af875f"
+	138: {R: 0xaf, G: 0x87, B: 0x87, A: 0xff}, // "#af8787"
+	139: {R: 0xaf, G: 0x87, B: 0xaf, A: 0xff}, // "#af87af"
+	140: {R: 0xaf, G: 0x87, B: 0xd7, A: 0xff}, // "#af87d7"
+	141: {R: 0xaf, G: 0x87, B: 0xff, A: 0xff}, // "#af87ff"
+	142: {R: 0xaf, G: 0xaf, B: 0x00, A: 0xff}, // "#afaf00"
+	143: {R: 0xaf, G: 0xaf, B: 0x5f, A: 0xff}, // "#afaf5f"
+	144: {R: 0xaf, G: 0xaf, B: 0x87, A: 0xff}, // "#afaf87"
+	145: {R: 0xaf, G: 0xaf, B: 0xaf, A: 0xff}, // "#afafaf"
+	146: {R: 0xaf, G: 0xaf, B: 0xd7, A: 0xff}, // "#afafd7"
+	147: {R: 0xaf, G: 0xaf, B: 0xff, A: 0xff}, // "#afafff"
+	148: {R: 0xaf, G: 0xd7, B: 0x00, A: 0xff}, // "#afd700"
+	149: {R: 0xaf, G: 0xd7, B: 0x5f, A: 0xff}, // "#afd75f"
+	150: {R: 0xaf, G: 0xd7, B: 0x87, A: 0xff}, // "#afd787"
+	151: {R: 0xaf, G: 0xd7, B: 0xaf, A: 0xff}, // "#afd7af"
+	152: {R: 0xaf, G: 0xd7, B: 0xd7, A: 0xff}, // "#afd7d7"
+	153: {R: 0xaf, G: 0xd7, B: 0xff, A: 0xff}, // "#afd7ff"
+	154: {R: 0xaf, G: 0xff, B: 0x00, A: 0xff}, // "#afff00"
+	155: {R: 0xaf, G: 0xff, B: 0x5f, A: 0xff}, // "#afff5f"
+	156: {R: 0xaf, G: 0xff, B: 0x87, A: 0xff}, // "#afff87"
+	157: {R: 0xaf, G: 0xff, B: 0xaf, A: 0xff}, // "#afffaf"
+	158: {R: 0xaf, G: 0xff, B: 0xd7, A: 0xff}, // "#afffd7"
+	159: {R: 0xaf, G: 0xff, B: 0xff, A: 0xff}, // "#afffff"
+	160: {R: 0xd7, G: 0x00, B: 0x00, A: 0xff}, // "#d70000"
+	161: {R: 0xd7, G: 0x00, B: 0x5f, A: 0xff}, // "#d7005f"
+	162: {R: 0xd7, G: 0x00, B: 0x87, A: 0xff}, // "#d70087"
+	163: {R: 0xd7, G: 0x00, B: 0xaf, A: 0xff}, // "#d700af"
+	164: {R: 0xd7, G: 0x00, B: 0xd7, A: 0xff}, // "#d700d7"
+	165: {R: 0xd7, G: 0x00, B: 0xff, A: 0xff}, // "#d700ff"
+	166: {R: 0xd7, G: 0x5f, B: 0x00, A: 0xff}, // "#d75f00"
+	167: {R: 0xd7, G: 0x5f, B: 0x5f, A: 0xff}, // "#d75f5f"
+	168: {R: 0xd7, G: 0x5f, B: 0x87, A: 0xff}, // "#d75f87"
+	169: {R: 0xd7, G: 0x5f, B: 0xaf, A: 0xff}, // "#d75faf"
+	170: {R: 0xd7, G: 0x5f, B: 0xd7, A: 0xff}, // "#d75fd7"
+	171: {R: 0xd7, G: 0x5f, B: 0xff, A: 0xff}, // "#d75fff"
+	172: {R: 0xd7, G: 0x87, B: 0x00, A: 0xff}, // "#d78700"
+	173: {R: 0xd7, G: 0x87, B: 0x5f, A: 0xff}, // "#d7875f"
+	174: {R: 0xd7, G: 0x87, B: 0x87, A: 0xff}, // "#d78787"
+	175: {R: 0xd7, G: 0x87, B: 0xaf, A: 0xff}, // "#d787af"
+	176: {R: 0xd7, G: 0x87, B: 0xd7, A: 0xff}, // "#d787d7"
+	177: {R: 0xd7, G: 0x87, B: 0xff, A: 0xff}, // "#d787ff"
+	178: {R: 0xd7, G: 0xaf, B: 0x00, A: 0xff}, // "#d7af00"
+	179: {R: 0xd7, G: 0xaf, B: 0x5f, A: 0xff}, // "#d7af5f"
+	180: {R: 0xd7, G: 0xaf, B: 0x87, A: 0xff}, // "#d7af87"
+	181: {R: 0xd7, G: 0xaf, B: 0xaf, A: 0xff}, // "#d7afaf"
+	182: {R: 0xd7, G: 0xaf, B: 0xd7, A: 0xff}, // "#d7afd7"
+	183: {R: 0xd7, G: 0xaf, B: 0xff, A: 0xff}, // "#d7afff"
+	184: {R: 0xd7, G: 0xd7, B: 0x00, A: 0xff}, // "#d7d700"
+	185: {R: 0xd7, G: 0xd7, B: 0x5f, A: 0xff}, // "#d7d75f"
+	186: {R: 0xd7, G: 0xd7, B: 0x87, A: 0xff}, // "#d7d787"
+	187: {R: 0xd7, G: 0xd7, B: 0xaf, A: 0xff}, // "#d7d7af"
+	188: {R: 0xd7, G: 0xd7, B: 0xd7, A: 0xff}, // "#d7d7d7"
+	189: {R: 0xd7, G: 0xd7, B: 0xff, A: 0xff}, // "#d7d7ff"
+	190: {R: 0xd7, G: 0xff, B: 0x00, A: 0xff}, // "#d7ff00"
+	191: {R: 0xd7, G: 0xff, B: 0x5f, A: 0xff}, // "#d7ff5f"
+	192: {R: 0xd7, G: 0xff, B: 0x87, A: 0xff}, // "#d7ff87"
+	193: {R: 0xd7, G: 0xff, B: 0xaf, A: 0xff}, // "#d7ffaf"
+	194: {R: 0xd7, G: 0xff, B: 0xd7, A: 0xff}, // "#d7ffd7"
+	195: {R: 0xd7, G: 0xff, B: 0xff, A: 0xff}, // "#d7ffff"
+	196: {R: 0xff, G: 0x00, B: 0x00, A: 0xff}, // "#ff0000"
+	197: {R: 0xff, G: 0x00, B: 0x5f, A: 0xff}, // "#ff005f"
+	198: {R: 0xff, G: 0x00, B: 0x87, A: 0xff}, // "#ff0087"
+	199: {R: 0xff, G: 0x00, B: 0xaf, A: 0xff}, // "#ff00af"
+	200: {R: 0xff, G: 0x00, B: 0xd7, A: 0xff}, // "#ff00d7"
+	201: {R: 0xff, G: 0x00, B: 0xff, A: 0xff}, // "#ff00ff"
+	202: {R: 0xff, G: 0x5f, B: 0x00, A: 0xff}, // "#ff5f00"
+	203: {R: 0xff, G: 0x5f, B: 0x5f, A: 0xff}, // "#ff5f5f"
+	204: {R: 0xff, G: 0x5f, B: 0x87, A: 0xff}, // "#ff5f87"
+	205: {R: 0xff, G: 0x5f, B: 0xaf, A: 0xff}, // "#ff5faf"
+	206: {R: 0xff, G: 0x5f, B: 0xd7, A: 0xff}, // "#ff5fd7"
+	207: {R: 0xff, G: 0x5f, B: 0xff, A: 0xff}, // "#ff5fff"
+	208: {R: 0xff, G: 0x87, B: 0x00, A: 0xff}, // "#ff8700"
+	209: {R: 0xff, G: 0x87, B: 0x5f, A: 0xff}, // "#ff875f"
+	210: {R: 0xff, G: 0x87, B: 0x87, A: 0xff}, // "#ff8787"
+	211: {R: 0xff, G: 0x87, B: 0xaf, A: 0xff}, // "#ff87af"
+	212: {R: 0xff, G: 0x87, B: 0xd7, A: 0xff}, // "#ff87d7"
+	213: {R: 0xff, G: 0x87, B: 0xff, A: 0xff}, // "#ff87ff"
+	214: {R: 0xff, G: 0xaf, B: 0x00, A: 0xff}, // "#ffaf00"
+	215: {R: 0xff, G: 0xaf, B: 0x5f, A: 0xff}, // "#ffaf5f"
+	216: {R: 0xff, G: 0xaf, B: 0x87, A: 0xff}, // "#ffaf87"
+	217: {R: 0xff, G: 0xaf, B: 0xaf, A: 0xff}, // "#ffafaf"
+	218: {R: 0xff, G: 0xaf, B: 0xd7, A: 0xff}, // "#ffafd7"
+	219: {R: 0xff, G: 0xaf, B: 0xff, A: 0xff}, // "#ffafff"
+	220: {R: 0xff, G: 0xd7, B: 0x00, A: 0xff}, // "#ffd700"
+	221: {R: 0xff, G: 0xd7, B: 0x5f, A: 0xff}, // "#ffd75f"
+	222: {R: 0xff, G: 0xd7, B: 0x87, A: 0xff}, // "#ffd787"
+	223: {R: 0xff, G: 0xd7, B: 0xaf, A: 0xff}, // "#ffd7af"
+	224: {R: 0xff, G: 0xd7, B: 0xd7, A: 0xff}, // "#ffd7d7"
+	225: {R: 0xff, G: 0xd7, B: 0xff, A: 0xff}, // "#ffd7ff"
+	226: {R: 0xff, G: 0xff, B: 0x00, A: 0xff}, // "#ffff00"
+	227: {R: 0xff, G: 0xff, B: 0x5f, A: 0xff}, // "#ffff5f"
+	228: {R: 0xff, G: 0xff, B: 0x87, A: 0xff}, // "#ffff87"
+	229: {R: 0xff, G: 0xff, B: 0xaf, A: 0xff}, // "#ffffaf"
+	230: {R: 0xff, G: 0xff, B: 0xd7, A: 0xff}, // "#ffffd7"
+	231: {R: 0xff, G: 0xff, B: 0xff, A: 0xff}, // "#ffffff"
+	232: {R: 0x08, G: 0x08, B: 0x08, A: 0xff}, // "#080808"
+	233: {R: 0x12, G: 0x12, B: 0x12, A: 0xff}, // "#121212"
+	234: {R: 0x1c, G: 0x1c, B: 0x1c, A: 0xff}, // "#1c1c1c"
+	235: {R: 0x26, G: 0x26, B: 0x26, A: 0xff}, // "#262626"
+	236: {R: 0x30, G: 0x30, B: 0x30, A: 0xff}, // "#303030"
+	237: {R: 0x3a, G: 0x3a, B: 0x3a, A: 0xff}, // "#3a3a3a"
+	238: {R: 0x44, G: 0x44, B: 0x44, A: 0xff}, // "#444444"
+	239: {R: 0x4e, G: 0x4e, B: 0x4e, A: 0xff}, // "#4e4e4e"
+	240: {R: 0x58, G: 0x58, B: 0x58, A: 0xff}, // "#585858"
+	241: {R: 0x62, G: 0x62, B: 0x62, A: 0xff}, // "#626262"
+	242: {R: 0x6c, G: 0x6c, B: 0x6c, A: 0xff}, // "#6c6c6c"
+	243: {R: 0x76, G: 0x76, B: 0x76, A: 0xff}, // "#767676"
+	244: {R: 0x80, G: 0x80, B: 0x80, A: 0xff}, // "#808080"
+	245: {R: 0x8a, G: 0x8a, B: 0x8a, A: 0xff}, // "#8a8a8a"
+	246: {R: 0x94, G: 0x94, B: 0x94, A: 0xff}, // "#949494"
+	247: {R: 0x9e, G: 0x9e, B: 0x9e, A: 0xff}, // "#9e9e9e"
+	248: {R: 0xa8, G: 0xa8, B: 0xa8, A: 0xff}, // "#a8a8a8"
+	249: {R: 0xb2, G: 0xb2, B: 0xb2, A: 0xff}, // "#b2b2b2"
+	250: {R: 0xbc, G: 0xbc, B: 0xbc, A: 0xff}, // "#bcbcbc"
+	251: {R: 0xc6, G: 0xc6, B: 0xc6, A: 0xff}, // "#c6c6c6"
+	252: {R: 0xd0, G: 0xd0, B: 0xd0, A: 0xff}, // "#d0d0d0"
+	253: {R: 0xda, G: 0xda, B: 0xda, A: 0xff}, // "#dadada"
+	254: {R: 0xe4, G: 0xe4, B: 0xe4, A: 0xff}, // "#e4e4e4"
+	255: {R: 0xee, G: 0xee, B: 0xee, A: 0xff}, // "#eeeeee"
+}
+
+var ansi256To16 = [...]BasicColor{
+	0:   0,
+	1:   1,
+	2:   2,
+	3:   3,
+	4:   4,
+	5:   5,
+	6:   6,
+	7:   7,
+	8:   8,
+	9:   9,
+	10:  10,
+	11:  11,
+	12:  12,
+	13:  13,
+	14:  14,
+	15:  15,
+	16:  0,
+	17:  4,
+	18:  4,
+	19:  4,
+	20:  12,
+	21:  12,
+	22:  2,
+	23:  6,
+	24:  4,
+	25:  4,
+	26:  12,
+	27:  12,
+	28:  2,
+	29:  2,
+	30:  6,
+	31:  4,
+	32:  12,
+	33:  12,
+	34:  2,
+	35:  2,
+	36:  2,
+	37:  6,
+	38:  12,
+	39:  12,
+	40:  10,
+	41:  10,
+	42:  10,
+	43:  10,
+	44:  14,
+	45:  12,
+	46:  10,
+	47:  10,
+	48:  10,
+	49:  10,
+	50:  10,
+	51:  14,
+	52:  1,
+	53:  5,
+	54:  4,
+	55:  4,
+	56:  12,
+	57:  12,
+	58:  3,
+	59:  8,
+	60:  4,
+	61:  4,
+	62:  12,
+	63:  12,
+	64:  2,
+	65:  2,
+	66:  6,
+	67:  4,
+	68:  12,
+	69:  12,
+	70:  2,
+	71:  2,
+	72:  2,
+	73:  6,
+	74:  12,
+	75:  12,
+	76:  10,
+	77:  10,
+	78:  10,
+	79:  10,
+	80:  14,
+	81:  12,
+	82:  10,
+	83:  10,
+	84:  10,
+	85:  10,
+	86:  10,
+	87:  14,
+	88:  1,
+	89:  1,
+	90:  5,
+	91:  4,
+	92:  12,
+	93:  12,
+	94:  1,
+	95:  1,
+	96:  5,
+	97:  4,
+	98:  12,
+	99:  12,
+	100: 3,
+	101: 3,
+	102: 8,
+	103: 4,
+	104: 12,
+	105: 12,
+	106: 2,
+	107: 2,
+	108: 2,
+	109: 6,
+	110: 12,
+	111: 12,
+	112: 10,
+	113: 10,
+	114: 10,
+	115: 10,
+	116: 14,
+	117: 12,
+	118: 10,
+	119: 10,
+	120: 10,
+	121: 10,
+	122: 10,
+	123: 14,
+	124: 1,
+	125: 1,
+	126: 1,
+	127: 5,
+	128: 12,
+	129: 12,
+	130: 1,
+	131: 1,
+	132: 1,
+	133: 5,
+	134: 12,
+	135: 12,
+	136: 1,
+	137: 1,
+	138: 1,
+	139: 5,
+	140: 12,
+	141: 12,
+	142: 3,
+	143: 3,
+	144: 3,
+	145: 7,
+	146: 12,
+	147: 12,
+	148: 10,
+	149: 10,
+	150: 10,
+	151: 10,
+	152: 14,
+	153: 12,
+	154: 10,
+	155: 10,
+	156: 10,
+	157: 10,
+	158: 10,
+	159: 14,
+	160: 9,
+	161: 9,
+	162: 9,
+	163: 9,
+	164: 13,
+	165: 12,
+	166: 9,
+	167: 9,
+	168: 9,
+	169: 9,
+	170: 13,
+	171: 12,
+	172: 9,
+	173: 9,
+	174: 9,
+	175: 9,
+	176: 13,
+	177: 12,
+	178: 9,
+	179: 9,
+	180: 9,
+	181: 9,
+	182: 13,
+	183: 12,
+	184: 11,
+	185: 11,
+	186: 11,
+	187: 11,
+	188: 7,
+	189: 12,
+	190: 10,
+	191: 10,
+	192: 10,
+	193: 10,
+	194: 10,
+	195: 14,
+	196: 9,
+	197: 9,
+	198: 9,
+	199: 9,
+	200: 9,
+	201: 13,
+	202: 9,
+	203: 9,
+	204: 9,
+	205: 9,
+	206: 9,
+	207: 13,
+	208: 9,
+	209: 9,
+	210: 9,
+	211: 9,
+	212: 9,
+	213: 13,
+	214: 9,
+	215: 9,
+	216: 9,
+	217: 9,
+	218: 9,
+	219: 13,
+	220: 9,
+	221: 9,
+	222: 9,
+	223: 9,
+	224: 9,
+	225: 13,
+	226: 11,
+	227: 11,
+	228: 11,
+	229: 11,
+	230: 11,
+	231: 15,
+	232: 0,
+	233: 0,
+	234: 0,
+	235: 0,
+	236: 0,
+	237: 0,
+	238: 8,
+	239: 8,
+	240: 8,
+	241: 8,
+	242: 8,
+	243: 8,
+	244: 7,
+	245: 7,
+	246: 7,
+	247: 7,
+	248: 7,
+	249: 7,
+	250: 15,
+	251: 15,
+	252: 15,
+	253: 15,
+	254: 15,
+	255: 15,
+}
diff --git a/source/vendor/github.com/charmbracelet/x/ansi/cursor.go b/source/vendor/github.com/charmbracelet/x/ansi/cursor.go
index 0c364d6..2a74c48 100644
--- a/source/vendor/github.com/charmbracelet/x/ansi/cursor.go
+++ b/source/vendor/github.com/charmbracelet/x/ansi/cursor.go
@@ -1,6 +1,8 @@
 package ansi
 
-import "strconv"
+import (
+	"strconv"
+)
 
 // SaveCursor (DECSC) is an escape sequence that saves the current cursor
 // position.
@@ -260,7 +262,7 @@ func CHA(col int) string {
 // See: https://vt100.net/docs/vt510-rm/CUP.html
 func CursorPosition(col, row int) string {
 	if row <= 0 && col <= 0 {
-		return HomeCursorPosition
+		return CursorHomePosition
 	}
 
 	var r, c string
diff --git a/source/vendor/github.com/charmbracelet/x/ansi/finalterm.go b/source/vendor/github.com/charmbracelet/x/ansi/finalterm.go
new file mode 100644
index 0000000..2c28347
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/ansi/finalterm.go
@@ -0,0 +1,67 @@
+package ansi
+
+import "strings"
+
+// FinalTerm returns an escape sequence that is used for shell integrations.
+// Originally, FinalTerm designed the protocol hence the name.
+//
+//	OSC 133 ; Ps ; Pm ST
+//	OSC 133 ; Ps ; Pm BEL
+//
+// See: https://iterm2.com/documentation-shell-integration.html
+func FinalTerm(pm ...string) string {
+	return "\x1b]133;" + strings.Join(pm, ";") + "\x07"
+}
+
+// FinalTermPrompt returns an escape sequence that is used for shell
+// integrations prompt marks. This is sent just before the start of the shell
+// prompt.
+//
+// This is an alias for FinalTerm("A").
+func FinalTermPrompt(pm ...string) string {
+	if len(pm) == 0 {
+		return FinalTerm("A")
+	}
+	return FinalTerm(append([]string{"A"}, pm...)...)
+}
+
+// FinalTermCmdStart returns an escape sequence that is used for shell
+// integrations command start marks. This is sent just after the end of the
+// shell prompt, before the user enters a command.
+//
+// This is an alias for FinalTerm("B").
+func FinalTermCmdStart(pm ...string) string {
+	if len(pm) == 0 {
+		return FinalTerm("B")
+	}
+	return FinalTerm(append([]string{"B"}, pm...)...)
+}
+
+// FinalTermCmdExecuted returns an escape sequence that is used for shell
+// integrations command executed marks. This is sent just before the start of
+// the command output.
+//
+// This is an alias for FinalTerm("C").
+func FinalTermCmdExecuted(pm ...string) string {
+	if len(pm) == 0 {
+		return FinalTerm("C")
+	}
+	return FinalTerm(append([]string{"C"}, pm...)...)
+}
+
+// FinalTermCmdFinished returns an escape sequence that is used for shell
+// integrations command finished marks.
+//
+// If the command was sent after
+// [FinalTermCmdStart], it indicates that the command was aborted. If the
+// command was sent after [FinalTermCmdExecuted], it indicates the end of the
+// command output. If neither was sent, [FinalTermCmdFinished] should be
+// ignored.
+//
+// This is an alias for FinalTerm("D").
+func FinalTermCmdFinished(pm ...string) string {
+	if len(pm) == 0 {
+		return FinalTerm("D")
+	}
+	return FinalTerm(append([]string{"D"}, pm...)...)
+}
diff --git a/source/vendor/github.com/charmbracelet/x/ansi/graphics.go b/source/vendor/github.com/charmbracelet/x/ansi/graphics.go
index 604fef4..b5b1dc8 100644
--- a/source/vendor/github.com/charmbracelet/x/ansi/graphics.go
+++ b/source/vendor/github.com/charmbracelet/x/ansi/graphics.go
@@ -8,11 +8,49 @@ import (
 	"image"
 	"io"
 	"os"
+	"strconv"
 	"strings"
 
 	"github.com/charmbracelet/x/ansi/kitty"
 )
 
+// SixelGraphics returns a sequence that encodes the given sixel image payload to
+// a DCS sixel sequence.
+//
+//	DCS p1; p2; p3; q [sixel payload] ST
+//
+// p1 = pixel aspect ratio, deprecated and replaced by pixel metrics in the payload
+//
+// p2 = This is supposed to be 0 for transparency, but terminals don't seem to
+// to use it properly. Value 0 leaves an unsightly black bar on all terminals
+// I've tried and looks correct with value 1.
+//
+// p3 = Horizontal grid size parameter. Everyone ignores this and uses a fixed grid
+// size, as far as I can tell.
+//
+// See https://shuford.invisible-island.net/all_about_sixels.txt
+func SixelGraphics(p1, p2, p3 int, payload []byte) string {
+	var buf bytes.Buffer
+
+	buf.WriteString("\x1bP")
+	if p1 >= 0 {
+		buf.WriteString(strconv.Itoa(p1))
+	}
+	buf.WriteByte(';')
+	if p2 >= 0 {
+		buf.WriteString(strconv.Itoa(p2))
+	}
+	if p3 > 0 {
+		buf.WriteByte(';')
+		buf.WriteString(strconv.Itoa(p3))
+	}
+	buf.WriteByte('q')
+	buf.Write(payload)
+	buf.WriteString("\x1b\\")
+
+	return buf.String()
+}
+
 // KittyGraphics returns a sequence that encodes the given image in the Kitty
 // graphics protocol.
 //
@@ -43,7 +81,7 @@ var (
 	KittyGraphicsTempPattern = "tty-graphics-protocol-*"
 )
 
-// WriteKittyGraphics writes an image using the Kitty Graphics protocol with
+// EncodeKittyGraphics writes an image using the Kitty Graphics protocol with
 // the given options to w. It chunks the written data if o.Chunk is true.
 //
 // You can omit m and use nil when rendering an image from a file. In this
@@ -54,7 +92,7 @@ var (
 // the terminal.
 //
 // See https://sw.kovidgoyal.net/kitty/graphics-protocol/
-func WriteKittyGraphics(w io.Writer, m image.Image, o *kitty.Options) error {
+func EncodeKittyGraphics(w io.Writer, m image.Image, o *kitty.Options) error {
 	if o == nil {
 		o = &kitty.Options{}
 	}
diff --git a/source/vendor/github.com/charmbracelet/x/ansi/mode.go b/source/vendor/github.com/charmbracelet/x/ansi/mode.go
index 57f3f0a..b57b09c 100644
--- a/source/vendor/github.com/charmbracelet/x/ansi/mode.go
+++ b/source/vendor/github.com/charmbracelet/x/ansi/mode.go
@@ -243,6 +243,21 @@ const (
 	RequestInsertReplaceMode = "\x1b[4$p"
 )
 
+// BiDirectional Support Mode (BDSM) is a mode that determines whether the
+// terminal supports bidirectional text. When enabled, the terminal supports
+// bidirectional text and is set to implicit bidirectional mode. When disabled,
+// the terminal does not support bidirectional text.
+//
+// See ECMA-48 7.2.1.
+const (
+	BiDirectionalSupportMode = ANSIMode(8)
+	BDSM                     = BiDirectionalSupportMode
+
+	SetBiDirectionalSupportMode     = "\x1b[8h"
+	ResetBiDirectionalSupportMode   = "\x1b[8l"
+	RequestBiDirectionalSupportMode = "\x1b[8$p"
+)
+
 // Send Receive Mode (SRM) or Local Echo Mode is a mode that determines whether
 // the terminal echoes characters back to the host. When enabled, the terminal
 // sends characters to the host as they are typed.
diff --git a/source/vendor/github.com/charmbracelet/x/ansi/modes.go b/source/vendor/github.com/charmbracelet/x/ansi/modes.go
index 1bec5bc..6856d35 100644
--- a/source/vendor/github.com/charmbracelet/x/ansi/modes.go
+++ b/source/vendor/github.com/charmbracelet/x/ansi/modes.go
@@ -4,12 +4,6 @@ package ansi
 // all modes are [ModeNotRecognized].
 type Modes map[Mode]ModeSetting
 
-// NewModes creates a new Modes map. By default, all modes are
-// [ModeNotRecognized].
-func NewModes() Modes {
-	return make(Modes)
-}
-
 // Get returns the setting of a terminal mode. If the mode is not set, it
 // returns [ModeNotRecognized].
 func (m Modes) Get(mode Mode) ModeSetting {
diff --git a/source/vendor/github.com/charmbracelet/x/ansi/sgr.go b/source/vendor/github.com/charmbracelet/x/ansi/sgr.go
index 1a18c98..c4bd2af 100644
--- a/source/vendor/github.com/charmbracelet/x/ansi/sgr.go
+++ b/source/vendor/github.com/charmbracelet/x/ansi/sgr.go
@@ -1,7 +1,5 @@
 package ansi
 
-import "strconv"
-
 // Select Graphic Rendition (SGR) is a command that sets display attributes.
 //
 // Default is 0.
@@ -14,20 +12,7 @@ func SelectGraphicRendition(ps ...Attr) string {
 		return ResetStyle
 	}
 
-	var s Style
-	for _, p := range ps {
-		attr, ok := attrStrings[p]
-		if ok {
-			s = append(s, attr)
-		} else {
-			if p < 0 {
-				p = 0
-			}
-			s = append(s, strconv.Itoa(p))
-		}
-	}
-
-	return s.String()
+	return NewStyle(ps...).String()
 }
 
 // SGR is an alias for [SelectGraphicRendition].
@@ -36,60 +21,59 @@ func SGR(ps ...Attr) string {
 }
 
 var attrStrings = map[int]string{
-	ResetAttr:                        "0",
-	BoldAttr:                         "1",
-	FaintAttr:                        "2",
-	ItalicAttr:                       "3",
-	UnderlineAttr:                    "4",
-	SlowBlinkAttr:                    "5",
-	RapidBlinkAttr:                   "6",
-	ReverseAttr:                      "7",
-	ConcealAttr:                      "8",
-	StrikethroughAttr:                "9",
-	NoBoldAttr:                       "21",
-	NormalIntensityAttr:              "22",
-	NoItalicAttr:                     "23",
-	NoUnderlineAttr:                  "24",
-	NoBlinkAttr:                      "25",
-	NoReverseAttr:                    "27",
-	NoConcealAttr:                    "28",
-	NoStrikethroughAttr:              "29",
-	BlackForegroundColorAttr:         "30",
-	RedForegroundColorAttr:           "31",
-	GreenForegroundColorAttr:         "32",
-	YellowForegroundColorAttr:        "33",
-	BlueForegroundColorAttr:          "34",
-	MagentaForegroundColorAttr:       "35",
-	CyanForegroundColorAttr:          "36",
-	WhiteForegroundColorAttr:         "37",
-	ExtendedForegroundColorAttr:      "38",
-	DefaultForegroundColorAttr:       "39",
-	BlackBackgroundColorAttr:         "40",
-	RedBackgroundColorAttr:           "41",
-	GreenBackgroundColorAttr:         "42",
-	YellowBackgroundColorAttr:        "43",
-	BlueBackgroundColorAttr:          "44",
-	MagentaBackgroundColorAttr:       "45",
-	CyanBackgroundColorAttr:          "46",
-	WhiteBackgroundColorAttr:         "47",
-	ExtendedBackgroundColorAttr:      "48",
-	DefaultBackgroundColorAttr:       "49",
-	ExtendedUnderlineColorAttr:       "58",
-	DefaultUnderlineColorAttr:        "59",
-	BrightBlackForegroundColorAttr:   "90",
-	BrightRedForegroundColorAttr:     "91",
-	BrightGreenForegroundColorAttr:   "92",
-	BrightYellowForegroundColorAttr:  "93",
-	BrightBlueForegroundColorAttr:    "94",
-	BrightMagentaForegroundColorAttr: "95",
-	BrightCyanForegroundColorAttr:    "96",
-	BrightWhiteForegroundColorAttr:   "97",
-	BrightBlackBackgroundColorAttr:   "100",
-	BrightRedBackgroundColorAttr:     "101",
-	BrightGreenBackgroundColorAttr:   "102",
-	BrightYellowBackgroundColorAttr:  "103",
-	BrightBlueBackgroundColorAttr:    "104",
-	BrightMagentaBackgroundColorAttr: "105",
-	BrightCyanBackgroundColorAttr:    "106",
-	BrightWhiteBackgroundColorAttr:   "107",
+	ResetAttr:                        resetAttr,
+	BoldAttr:                         boldAttr,
+	FaintAttr:                        faintAttr,
+	ItalicAttr:                       italicAttr,
+	UnderlineAttr:                    underlineAttr,
+	SlowBlinkAttr:                    slowBlinkAttr,
+	RapidBlinkAttr:                   rapidBlinkAttr,
+	ReverseAttr:                      reverseAttr,
+	ConcealAttr:                      concealAttr,
+	StrikethroughAttr:                strikethroughAttr,
+	NormalIntensityAttr:              normalIntensityAttr,
+	NoItalicAttr:                     noItalicAttr,
+	NoUnderlineAttr:                  noUnderlineAttr,
+	NoBlinkAttr:                      noBlinkAttr,
+	NoReverseAttr:                    noReverseAttr,
+	NoConcealAttr:                    noConcealAttr,
+	NoStrikethroughAttr:              noStrikethroughAttr,
+	BlackForegroundColorAttr:         blackForegroundColorAttr,
+	RedForegroundColorAttr:           redForegroundColorAttr,
+	GreenForegroundColorAttr:         greenForegroundColorAttr,
+	YellowForegroundColorAttr:        yellowForegroundColorAttr,
+	BlueForegroundColorAttr:          blueForegroundColorAttr,
+	MagentaForegroundColorAttr:       magentaForegroundColorAttr,
+	CyanForegroundColorAttr:          cyanForegroundColorAttr,
+	WhiteForegroundColorAttr:         whiteForegroundColorAttr,
+	ExtendedForegroundColorAttr:      extendedForegroundColorAttr,
+	DefaultForegroundColorAttr:       defaultForegroundColorAttr,
+	BlackBackgroundColorAttr:         blackBackgroundColorAttr,
+	RedBackgroundColorAttr:           redBackgroundColorAttr,
+	GreenBackgroundColorAttr:         greenBackgroundColorAttr,
+	YellowBackgroundColorAttr:        yellowBackgroundColorAttr,
+	BlueBackgroundColorAttr:          blueBackgroundColorAttr,
+	MagentaBackgroundColorAttr:       magentaBackgroundColorAttr,
+	CyanBackgroundColorAttr:          cyanBackgroundColorAttr,
+	WhiteBackgroundColorAttr:         whiteBackgroundColorAttr,
+	ExtendedBackgroundColorAttr:      extendedBackgroundColorAttr,
+	DefaultBackgroundColorAttr:       defaultBackgroundColorAttr,
+	ExtendedUnderlineColorAttr:       extendedUnderlineColorAttr,
+	DefaultUnderlineColorAttr:        defaultUnderlineColorAttr,
+	BrightBlackForegroundColorAttr:   brightBlackForegroundColorAttr,
+	BrightRedForegroundColorAttr:     brightRedForegroundColorAttr,
+	BrightGreenForegroundColorAttr:   brightGreenForegroundColorAttr,
+	BrightYellowForegroundColorAttr:  brightYellowForegroundColorAttr,
+	BrightBlueForegroundColorAttr:    brightBlueForegroundColorAttr,
+	BrightMagentaForegroundColorAttr: brightMagentaForegroundColorAttr,
+	BrightCyanForegroundColorAttr:    brightCyanForegroundColorAttr,
+	BrightWhiteForegroundColorAttr:   brightWhiteForegroundColorAttr,
+	BrightBlackBackgroundColorAttr:   brightBlackBackgroundColorAttr,
+	BrightRedBackgroundColorAttr:     brightRedBackgroundColorAttr,
+	BrightGreenBackgroundColorAttr:   brightGreenBackgroundColorAttr,
+	BrightYellowBackgroundColorAttr:  brightYellowBackgroundColorAttr,
+	BrightBlueBackgroundColorAttr:    brightBlueBackgroundColorAttr,
+	BrightMagentaBackgroundColorAttr: brightMagentaBackgroundColorAttr,
+	BrightCyanBackgroundColorAttr:    brightCyanBackgroundColorAttr,
+	BrightWhiteBackgroundColorAttr:   brightWhiteBackgroundColorAttr,
 }
diff --git a/source/vendor/github.com/charmbracelet/x/ansi/style.go b/source/vendor/github.com/charmbracelet/x/ansi/style.go
index 46ddcaa..c8663f3 100644
--- a/source/vendor/github.com/charmbracelet/x/ansi/style.go
+++ b/source/vendor/github.com/charmbracelet/x/ansi/style.go
@@ -17,6 +17,26 @@ type Attr = int
 // Style represents an ANSI SGR (Select Graphic Rendition) style.
 type Style []string
 
+// NewStyle returns a new style with the given attributes.
+func NewStyle(attrs ...Attr) Style {
+	if len(attrs) == 0 {
+		return Style{}
+	}
+	s := make(Style, 0, len(attrs))
+	for _, a := range attrs {
+		attr, ok := attrStrings[a]
+		if ok {
+			s = append(s, attr)
+		} else {
+			if a < 0 {
+				a = 0
+			}
+			s = append(s, strconv.Itoa(a))
+		}
+	}
+	return s
+}
+
 // String returns the ANSI SGR (Select Graphic Rendition) style sequence for
 // the given style.
 func (s Style) String() string {
@@ -127,11 +147,6 @@ func (s Style) Strikethrough() Style {
 	return append(s, strikethroughAttr)
 }
 
-// NoBold appends the no bold style attribute to the style.
-func (s Style) NoBold() Style {
-	return append(s, noBoldAttr)
-}
-
 // NormalIntensity appends the normal intensity style attribute to the style.
 func (s Style) NormalIntensity() Style {
 	return append(s, normalIntensityAttr)
@@ -236,7 +251,6 @@ const (
 	ReverseAttr                      Attr = 7
 	ConcealAttr                      Attr = 8
 	StrikethroughAttr                Attr = 9
-	NoBoldAttr                       Attr = 21 // Some terminals treat this as double underline.
 	NormalIntensityAttr              Attr = 22
 	NoItalicAttr                     Attr = 23
 	NoUnderlineAttr                  Attr = 24
@@ -298,7 +312,6 @@ const (
 	reverseAttr                      = "7"
 	concealAttr                      = "8"
 	strikethroughAttr                = "9"
-	noBoldAttr                       = "21"
 	normalIntensityAttr              = "22"
 	noItalicAttr                     = "23"
 	noUnderlineAttr                  = "24"
diff --git a/source/vendor/github.com/charmbracelet/x/ansi/title.go b/source/vendor/github.com/charmbracelet/x/ansi/title.go
index 8fd8bf9..54ef942 100644
--- a/source/vendor/github.com/charmbracelet/x/ansi/title.go
+++ b/source/vendor/github.com/charmbracelet/x/ansi/title.go
@@ -30,3 +30,19 @@ func SetIconName(s string) string {
 func SetWindowTitle(s string) string {
 	return "\x1b]2;" + s + "\x07"
 }
+
+// DECSWT is a sequence for setting the window title.
+//
+// This is an alias for [SetWindowTitle]("1;<name>").
+// See: EK-VT520-RM 5–156 https://vt100.net/dec/ek-vt520-rm.pdf
+func DECSWT(name string) string {
+	return SetWindowTitle("1;" + name)
+}
+
+// DECSIN is a sequence for setting the icon name.
+//
+// This is an alias for [SetWindowTitle]("L;<name>").
+// See: EK-VT520-RM 5–134 https://vt100.net/dec/ek-vt520-rm.pdf
+func DECSIN(name string) string {
+	return SetWindowTitle("L;" + name)
+}
diff --git a/source/vendor/github.com/charmbracelet/x/ansi/truncate.go b/source/vendor/github.com/charmbracelet/x/ansi/truncate.go
index 1fa3efe..3f541fa 100644
--- a/source/vendor/github.com/charmbracelet/x/ansi/truncate.go
+++ b/source/vendor/github.com/charmbracelet/x/ansi/truncate.go
@@ -10,8 +10,7 @@ import (
 
 // Cut the string, without adding any prefix or tail strings. This function is
 // aware of ANSI escape codes and will not break them, and accounts for
-// wide-characters (such as East-Asian characters and emojis). Note that the
-// [left] parameter is inclusive, while [right] isn't.
+// wide-characters (such as East-Asian characters and emojis).
 // This treats the text as a sequence of graphemes.
 func Cut(s string, left, right int) string {
 	return cut(GraphemeWidth, s, left, right)
@@ -19,8 +18,10 @@ func Cut(s string, left, right int) string {
 
 // CutWc the string, without adding any prefix or tail strings. This function is
 // aware of ANSI escape codes and will not break them, and accounts for
-// wide-characters (such as East-Asian characters and emojis). Note that the
-// [left] parameter is inclusive, while [right] isn't.
+// wide-characters (such as East-Asian characters and emojis).
+// Note that the [left] parameter is inclusive, while [right] isn't,
+// which is to say it'll return `[left, right)`.
+//
 // This treats the text as a sequence of wide characters and runes.
 func CutWc(s string, left, right int) string {
 	return cut(WcWidth, s, left, right)
@@ -41,7 +42,7 @@ func cut(m Method, s string, left, right int) string {
 	if left == 0 {
 		return truncate(s, right, "")
 	}
-	return truncateLeft(Truncate(s, right, ""), left, "")
+	return truncateLeft(truncate(s, right, ""), left, "")
 }
 
 // Truncate truncates a string to a given length, adding a tail to the end if
@@ -99,6 +100,7 @@ func truncate(m Method, s string, length int, tail string) string {
 
 			// increment the index by the length of the cluster
 			i += len(cluster)
+			curWidth += width
 
 			// Are we ignoring? Skip to the next byte
 			if ignoring {
@@ -107,16 +109,15 @@ func truncate(m Method, s string, length int, tail string) string {
 
 			// Is this gonna be too wide?
 			// If so write the tail and stop collecting.
-			if curWidth+width > length && !ignoring {
+			if curWidth > length && !ignoring {
 				ignoring = true
 				buf.WriteString(tail)
 			}
 
-			if curWidth+width > length {
+			if curWidth > length {
 				continue
 			}
 
-			curWidth += width
 			buf.Write(cluster)
 
 			// Done collecting, now we're back in the ground state.
@@ -142,6 +143,14 @@ func truncate(m Method, s string, length int, tail string) string {
 			// collects printable ASCII
 			curWidth++
 			fallthrough
+		case parser.ExecuteAction:
+			// execute action will be things like \n, which, if outside the cut,
+			// should be ignored.
+			if ignoring {
+				i++
+				continue
+			}
+			fallthrough
 		default:
 			buf.WriteByte(b[i])
 			i++
@@ -214,14 +223,14 @@ func truncateLeft(m Method, s string, n int, prefix string) string {
 				buf.WriteString(prefix)
 			}
 
-			if ignoring {
-				continue
-			}
-
 			if curWidth > n {
 				buf.Write(cluster)
 			}
 
+			if ignoring {
+				continue
+			}
+
 			pstate = parser.GroundState
 			continue
 		}
@@ -240,6 +249,14 @@ func truncateLeft(m Method, s string, n int, prefix string) string {
 				continue
 			}
 
+			fallthrough
+		case parser.ExecuteAction:
+			// execute action will be things like \n, which, if outside the cut,
+			// should be ignored.
+			if ignoring {
+				i++
+				continue
+			}
 			fallthrough
 		default:
 			buf.WriteByte(b[i])
diff --git a/source/vendor/github.com/charmbracelet/x/ansi/util.go b/source/vendor/github.com/charmbracelet/x/ansi/util.go
index 301ef15..0f5cea7 100644
--- a/source/vendor/github.com/charmbracelet/x/ansi/util.go
+++ b/source/vendor/github.com/charmbracelet/x/ansi/util.go
@@ -10,7 +10,7 @@ import (
 )
 
 // colorToHexString returns a hex string representation of a color.
-func colorToHexString(c color.Color) string {
+func colorToHexString(c color.Color) string { //nolint:unused
 	if c == nil {
 		return ""
 	}
@@ -28,7 +28,7 @@ func colorToHexString(c color.Color) string {
 // rgbToHex converts red, green, and blue values to a hexadecimal value.
 //
 //	hex := rgbToHex(0, 0, 255) // 0x0000FF
-func rgbToHex(r, g, b uint32) uint32 {
+func rgbToHex(r, g, b uint32) uint32 { //nolint:unused
 	return r<<16 + g<<8 + b
 }
 
diff --git a/source/vendor/github.com/charmbracelet/x/cellbuf/LICENSE b/source/vendor/github.com/charmbracelet/x/cellbuf/LICENSE
new file mode 100644
index 0000000..65a5654
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/cellbuf/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 Charmbracelet, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/source/vendor/github.com/charmbracelet/x/cellbuf/buffer.go b/source/vendor/github.com/charmbracelet/x/cellbuf/buffer.go
new file mode 100644
index 0000000..790d1f7
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/cellbuf/buffer.go
@@ -0,0 +1,473 @@
+package cellbuf
+
+import (
+	"strings"
+
+	"github.com/mattn/go-runewidth"
+	"github.com/rivo/uniseg"
+)
+
+// NewCell returns a new cell. This is a convenience function that initializes a
+// new cell with the given content. The cell's width is determined by the
+// content using [runewidth.RuneWidth].
+// This will only account for the first combined rune in the content. If the
+// content is empty, it will return an empty cell with a width of 0.
+func NewCell(r rune, comb ...rune) (c *Cell) {
+	c = new(Cell)
+	c.Rune = r
+	c.Width = runewidth.RuneWidth(r)
+	for _, r := range comb {
+		if runewidth.RuneWidth(r) > 0 {
+			break
+		}
+		c.Comb = append(c.Comb, r)
+	}
+	c.Comb = comb
+	c.Width = runewidth.StringWidth(string(append([]rune{r}, comb...)))
+	return
+}
+
+// NewCellString returns a new cell with the given string content. This is a
+// convenience function that initializes a new cell with the given content. The
+// cell's width is determined by the content using [runewidth.StringWidth].
+// This will only use the first combined rune in the string. If the string is
+// empty, it will return an empty cell with a width of 0.
+func NewCellString(s string) (c *Cell) {
+	c = new(Cell)
+	for i, r := range s {
+		if i == 0 {
+			c.Rune = r
+			// We only care about the first rune's width
+			c.Width = runewidth.RuneWidth(r)
+		} else {
+			if runewidth.RuneWidth(r) > 0 {
+				break
+			}
+			c.Comb = append(c.Comb, r)
+		}
+	}
+	return
+}
+
+// NewGraphemeCell returns a new cell. This is a convenience function that
+// initializes a new cell with the given content. The cell's width is determined
+// by the content using [uniseg.FirstGraphemeClusterInString].
+// This is used when the content is a grapheme cluster i.e. a sequence of runes
+// that form a single visual unit.
+// This will only return the first grapheme cluster in the string. If the
+// string is empty, it will return an empty cell with a width of 0.
+func NewGraphemeCell(s string) (c *Cell) {
+	g, _, w, _ := uniseg.FirstGraphemeClusterInString(s, -1)
+	return newGraphemeCell(g, w)
+}
+
+func newGraphemeCell(s string, w int) (c *Cell) {
+	c = new(Cell)
+	c.Width = w
+	for i, r := range s {
+		if i == 0 {
+			c.Rune = r
+		} else {
+			c.Comb = append(c.Comb, r)
+		}
+	}
+	return
+}
+
+// Line represents a line in the terminal.
+// A nil cell represents an blank cell, a cell with a space character and a
+// width of 1.
+// If a cell has no content and a width of 0, it is a placeholder for a wide
+// cell.
+type Line []*Cell
+
+// Width returns the width of the line.
+func (l Line) Width() int {
+	return len(l)
+}
+
+// Len returns the length of the line.
+func (l Line) Len() int {
+	return len(l)
+}
+
+// String returns the string representation of the line. Any trailing spaces
+// are removed.
+func (l Line) String() (s string) {
+	for _, c := range l {
+		if c == nil {
+			s += " "
+		} else if c.Empty() {
+			continue
+		} else {
+			s += c.String()
+		}
+	}
+	s = strings.TrimRight(s, " ")
+	return
+}
+
+// At returns the cell at the given x position.
+// If the cell does not exist, it returns nil.
+func (l Line) At(x int) *Cell {
+	if x < 0 || x >= len(l) {
+		return nil
+	}
+
+	c := l[x]
+	if c == nil {
+		newCell := BlankCell
+		return &newCell
+	}
+
+	return c
+}
+
+// Set sets the cell at the given x position. If a wide cell is given, it will
+// set the cell and the following cells to [EmptyCell]. It returns true if the
+// cell was set.
+func (l Line) Set(x int, c *Cell) bool {
+	return l.set(x, c, true)
+}
+
+func (l Line) set(x int, c *Cell, clone bool) bool {
+	width := l.Width()
+	if x < 0 || x >= width {
+		return false
+	}
+
+	// When a wide cell is partially overwritten, we need
+	// to fill the rest of the cell with space cells to
+	// avoid rendering issues.
+	prev := l.At(x)
+	if prev != nil && prev.Width > 1 {
+		// Writing to the first wide cell
+		for j := 0; j < prev.Width && x+j < l.Width(); j++ {
+			l[x+j] = prev.Clone().Blank()
+		}
+	} else if prev != nil && prev.Width == 0 {
+		// Writing to wide cell placeholders
+		for j := 1; j < maxCellWidth && x-j >= 0; j++ {
+			wide := l.At(x - j)
+			if wide != nil && wide.Width > 1 && j < wide.Width {
+				for k := 0; k < wide.Width; k++ {
+					l[x-j+k] = wide.Clone().Blank()
+				}
+				break
+			}
+		}
+	}
+
+	if clone && c != nil {
+		// Clone the cell if not nil.
+		c = c.Clone()
+	}
+
+	if c != nil && x+c.Width > width {
+		// If the cell is too wide, we write blanks with the same style.
+		for i := 0; i < c.Width && x+i < width; i++ {
+			l[x+i] = c.Clone().Blank()
+		}
+	} else {
+		l[x] = c
+
+		// Mark wide cells with an empty cell zero width
+		// We set the wide cell down below
+		if c != nil && c.Width > 1 {
+			for j := 1; j < c.Width && x+j < l.Width(); j++ {
+				var wide Cell
+				l[x+j] = &wide
+			}
+		}
+	}
+
+	return true
+}
+
+// Buffer is a 2D grid of cells representing a screen or terminal.
+type Buffer struct {
+	// Lines holds the lines of the buffer.
+	Lines []Line
+}
+
+// NewBuffer creates a new buffer with the given width and height.
+// This is a convenience function that initializes a new buffer and resizes it.
+func NewBuffer(width int, height int) *Buffer {
+	b := new(Buffer)
+	b.Resize(width, height)
+	return b
+}
+
+// String returns the string representation of the buffer.
+func (b *Buffer) String() (s string) {
+	for i, l := range b.Lines {
+		s += l.String()
+		if i < len(b.Lines)-1 {
+			s += "\r\n"
+		}
+	}
+	return
+}
+
+// Line returns a pointer to the line at the given y position.
+// If the line does not exist, it returns nil.
+func (b *Buffer) Line(y int) Line {
+	if y < 0 || y >= len(b.Lines) {
+		return nil
+	}
+	return b.Lines[y]
+}
+
+// Cell implements Screen.
+func (b *Buffer) Cell(x int, y int) *Cell {
+	if y < 0 || y >= len(b.Lines) {
+		return nil
+	}
+	return b.Lines[y].At(x)
+}
+
+// maxCellWidth is the maximum width a terminal cell can get.
+const maxCellWidth = 4
+
+// SetCell sets the cell at the given x, y position.
+func (b *Buffer) SetCell(x, y int, c *Cell) bool {
+	return b.setCell(x, y, c, true)
+}
+
+// setCell sets the cell at the given x, y position. This will always clone and
+// allocates a new cell if c is not nil.
+func (b *Buffer) setCell(x, y int, c *Cell, clone bool) bool {
+	if y < 0 || y >= len(b.Lines) {
+		return false
+	}
+	return b.Lines[y].set(x, c, clone)
+}
+
+// Height implements Screen.
+func (b *Buffer) Height() int {
+	return len(b.Lines)
+}
+
+// Width implements Screen.
+func (b *Buffer) Width() int {
+	if len(b.Lines) == 0 {
+		return 0
+	}
+	return b.Lines[0].Width()
+}
+
+// Bounds returns the bounds of the buffer.
+func (b *Buffer) Bounds() Rectangle {
+	return Rect(0, 0, b.Width(), b.Height())
+}
+
+// Resize resizes the buffer to the given width and height.
+func (b *Buffer) Resize(width int, height int) {
+	if width == 0 || height == 0 {
+		b.Lines = nil
+		return
+	}
+
+	if width > b.Width() {
+		line := make(Line, width-b.Width())
+		for i := range b.Lines {
+			b.Lines[i] = append(b.Lines[i], line...)
+		}
+	} else if width < b.Width() {
+		for i := range b.Lines {
+			b.Lines[i] = b.Lines[i][:width]
+		}
+	}
+
+	if height > len(b.Lines) {
+		for i := len(b.Lines); i < height; i++ {
+			b.Lines = append(b.Lines, make(Line, width))
+		}
+	} else if height < len(b.Lines) {
+		b.Lines = b.Lines[:height]
+	}
+}
+
+// FillRect fills the buffer with the given cell and rectangle.
+func (b *Buffer) FillRect(c *Cell, rect Rectangle) {
+	cellWidth := 1
+	if c != nil && c.Width > 1 {
+		cellWidth = c.Width
+	}
+	for y := rect.Min.Y; y < rect.Max.Y; y++ {
+		for x := rect.Min.X; x < rect.Max.X; x += cellWidth {
+			b.setCell(x, y, c, false) //nolint:errcheck
+		}
+	}
+}
+
+// Fill fills the buffer with the given cell and rectangle.
+func (b *Buffer) Fill(c *Cell) {
+	b.FillRect(c, b.Bounds())
+}
+
+// Clear clears the buffer with space cells and rectangle.
+func (b *Buffer) Clear() {
+	b.ClearRect(b.Bounds())
+}
+
+// ClearRect clears the buffer with space cells within the specified
+// rectangles. Only cells within the rectangle's bounds are affected.
+func (b *Buffer) ClearRect(rect Rectangle) {
+	b.FillRect(nil, rect)
+}
+
+// InsertLine inserts n lines at the given line position, with the given
+// optional cell, within the specified rectangles. If no rectangles are
+// specified, it inserts lines in the entire buffer. Only cells within the
+// rectangle's horizontal bounds are affected. Lines are pushed out of the
+// rectangle bounds and lost. This follows terminal [ansi.IL] behavior.
+// It returns the pushed out lines.
+func (b *Buffer) InsertLine(y, n int, c *Cell) {
+	b.InsertLineRect(y, n, c, b.Bounds())
+}
+
+// InsertLineRect inserts new lines at the given line position, with the
+// given optional cell, within the rectangle bounds. Only cells within the
+// rectangle's horizontal bounds are affected. Lines are pushed out of the
+// rectangle bounds and lost. This follows terminal [ansi.IL] behavior.
+func (b *Buffer) InsertLineRect(y, n int, c *Cell, rect Rectangle) {
+	if n <= 0 || y < rect.Min.Y || y >= rect.Max.Y || y >= b.Height() {
+		return
+	}
+
+	// Limit number of lines to insert to available space
+	if y+n > rect.Max.Y {
+		n = rect.Max.Y - y
+	}
+
+	// Move existing lines down within the bounds
+	for i := rect.Max.Y - 1; i >= y+n; i-- {
+		for x := rect.Min.X; x < rect.Max.X; x++ {
+			// We don't need to clone c here because we're just moving lines down.
+			b.setCell(x, i, b.Lines[i-n][x], false)
+		}
+	}
+
+	// Clear the newly inserted lines within bounds
+	for i := y; i < y+n; i++ {
+		for x := rect.Min.X; x < rect.Max.X; x++ {
+			b.setCell(x, i, c, true)
+		}
+	}
+}
+
+// DeleteLineRect deletes lines at the given line position, with the given
+// optional cell, within the rectangle bounds. Only cells within the
+// rectangle's bounds are affected. Lines are shifted up within the bounds and
+// new blank lines are created at the bottom. This follows terminal [ansi.DL]
+// behavior.
+func (b *Buffer) DeleteLineRect(y, n int, c *Cell, rect Rectangle) {
+	if n <= 0 || y < rect.Min.Y || y >= rect.Max.Y || y >= b.Height() {
+		return
+	}
+
+	// Limit deletion count to available space in scroll region
+	if n > rect.Max.Y-y {
+		n = rect.Max.Y - y
+	}
+
+	// Shift cells up within the bounds
+	for dst := y; dst < rect.Max.Y-n; dst++ {
+		src := dst + n
+		for x := rect.Min.X; x < rect.Max.X; x++ {
+			// We don't need to clone c here because we're just moving cells up.
+			// b.lines[dst][x] = b.lines[src][x]
+			b.setCell(x, dst, b.Lines[src][x], false)
+		}
+	}
+
+	// Fill the bottom n lines with blank cells
+	for i := rect.Max.Y - n; i < rect.Max.Y; i++ {
+		for x := rect.Min.X; x < rect.Max.X; x++ {
+			b.setCell(x, i, c, true)
+		}
+	}
+}
+
+// DeleteLine deletes n lines at the given line position, with the given
+// optional cell, within the specified rectangles. If no rectangles are
+// specified, it deletes lines in the entire buffer.
+func (b *Buffer) DeleteLine(y, n int, c *Cell) {
+	b.DeleteLineRect(y, n, c, b.Bounds())
+}
+
+// InsertCell inserts new cells at the given position, with the given optional
+// cell, within the specified rectangles. If no rectangles are specified, it
+// inserts cells in the entire buffer. This follows terminal [ansi.ICH]
+// behavior.
+func (b *Buffer) InsertCell(x, y, n int, c *Cell) {
+	b.InsertCellRect(x, y, n, c, b.Bounds())
+}
+
+// InsertCellRect inserts new cells at the given position, with the given
+// optional cell, within the rectangle bounds. Only cells within the
+// rectangle's bounds are affected, following terminal [ansi.ICH] behavior.
+func (b *Buffer) InsertCellRect(x, y, n int, c *Cell, rect Rectangle) {
+	if n <= 0 || y < rect.Min.Y || y >= rect.Max.Y || y >= b.Height() ||
+		x < rect.Min.X || x >= rect.Max.X || x >= b.Width() {
+		return
+	}
+
+	// Limit number of cells to insert to available space
+	if x+n > rect.Max.X {
+		n = rect.Max.X - x
+	}
+
+	// Move existing cells within rectangle bounds to the right
+	for i := rect.Max.X - 1; i >= x+n && i-n >= rect.Min.X; i-- {
+		// We don't need to clone c here because we're just moving cells to the
+		// right.
+		// b.lines[y][i] = b.lines[y][i-n]
+		b.setCell(i, y, b.Lines[y][i-n], false)
+	}
+
+	// Clear the newly inserted cells within rectangle bounds
+	for i := x; i < x+n && i < rect.Max.X; i++ {
+		b.setCell(i, y, c, true)
+	}
+}
+
+// DeleteCell deletes cells at the given position, with the given optional
+// cell, within the specified rectangles. If no rectangles are specified, it
+// deletes cells in the entire buffer. This follows terminal [ansi.DCH]
+// behavior.
+func (b *Buffer) DeleteCell(x, y, n int, c *Cell) {
+	b.DeleteCellRect(x, y, n, c, b.Bounds())
+}
+
+// DeleteCellRect deletes cells at the given position, with the given
+// optional cell, within the rectangle bounds. Only cells within the
+// rectangle's bounds are affected, following terminal [ansi.DCH] behavior.
+func (b *Buffer) DeleteCellRect(x, y, n int, c *Cell, rect Rectangle) {
+	if n <= 0 || y < rect.Min.Y || y >= rect.Max.Y || y >= b.Height() ||
+		x < rect.Min.X || x >= rect.Max.X || x >= b.Width() {
+		return
+	}
+
+	// Calculate how many positions we can actually delete
+	remainingCells := rect.Max.X - x
+	if n > remainingCells {
+		n = remainingCells
+	}
+
+	// Shift the remaining cells to the left
+	for i := x; i < rect.Max.X-n; i++ {
+		if i+n < rect.Max.X {
+			// We don't need to clone c here because we're just moving cells to
+			// the left.
+			// b.lines[y][i] = b.lines[y][i+n]
+			b.setCell(i, y, b.Lines[y][i+n], false)
+		}
+	}
+
+	// Fill the vacated positions with the given cell
+	for i := rect.Max.X - n; i < rect.Max.X; i++ {
+		b.setCell(i, y, c, true)
+	}
+}
diff --git a/source/vendor/github.com/charmbracelet/x/cellbuf/cell.go b/source/vendor/github.com/charmbracelet/x/cellbuf/cell.go
new file mode 100644
index 0000000..4d49d45
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/cellbuf/cell.go
@@ -0,0 +1,508 @@
+package cellbuf
+
+import (
+	"github.com/charmbracelet/x/ansi"
+)
+
+var (
+	// BlankCell is a cell with a single space, width of 1, and no style or link.
+	BlankCell = Cell{Rune: ' ', Width: 1}
+
+	// EmptyCell is just an empty cell used for comparisons and as a placeholder
+	// for wide cells.
+	EmptyCell = Cell{}
+)
+
+// Cell represents a single cell in the terminal screen.
+type Cell struct {
+	// The style of the cell. Nil style means no style. Zero value prints a
+	// reset sequence.
+	Style Style
+
+	// Link is the hyperlink of the cell.
+	Link Link
+
+	// Comb is the combining runes of the cell. This is nil if the cell is a
+	// single rune or if it's a zero width cell that is part of a wider cell.
+	Comb []rune
+
+	// Width is the mono-space width of the grapheme cluster.
+	Width int
+
+	// Rune is the main rune of the cell. This is zero if the cell is part of a
+	// wider cell.
+	Rune rune
+}
+
+// Append appends runes to the cell without changing the width. This is useful
+// when we want to use the cell to store escape sequences or other runes that
+// don't affect the width of the cell.
+func (c *Cell) Append(r ...rune) {
+	for i, r := range r {
+		if i == 0 && c.Rune == 0 {
+			c.Rune = r
+			continue
+		}
+		c.Comb = append(c.Comb, r)
+	}
+}
+
+// String returns the string content of the cell excluding any styles, links,
+// and escape sequences.
+func (c Cell) String() string {
+	if c.Rune == 0 {
+		return ""
+	}
+	if len(c.Comb) == 0 {
+		return string(c.Rune)
+	}
+	return string(append([]rune{c.Rune}, c.Comb...))
+}
+
+// Equal returns whether the cell is equal to the other cell.
+func (c *Cell) Equal(o *Cell) bool {
+	return o != nil &&
+		c.Width == o.Width &&
+		c.Rune == o.Rune &&
+		runesEqual(c.Comb, o.Comb) &&
+		c.Style.Equal(&o.Style) &&
+		c.Link.Equal(&o.Link)
+}
+
+// Empty returns whether the cell is an empty cell. An empty cell is a cell
+// with a width of 0, a rune of 0, and no combining runes.
+func (c Cell) Empty() bool {
+	return c.Width == 0 &&
+		c.Rune == 0 &&
+		len(c.Comb) == 0
+}
+
+// Reset resets the cell to the default state zero value.
+func (c *Cell) Reset() {
+	c.Rune = 0
+	c.Comb = nil
+	c.Width = 0
+	c.Style.Reset()
+	c.Link.Reset()
+}
+
+// Clear returns whether the cell consists of only attributes that don't
+// affect appearance of a space character.
+func (c *Cell) Clear() bool {
+	return c.Rune == ' ' && len(c.Comb) == 0 && c.Width == 1 && c.Style.Clear() && c.Link.Empty()
+}
+
+// Clone returns a copy of the cell.
+func (c *Cell) Clone() (n *Cell) {
+	n = new(Cell)
+	*n = *c
+	return
+}
+
+// Blank makes the cell a blank cell by setting the rune to a space, comb to
+// nil, and the width to 1.
+func (c *Cell) Blank() *Cell {
+	c.Rune = ' '
+	c.Comb = nil
+	c.Width = 1
+	return c
+}
+
+// Link represents a hyperlink in the terminal screen.
+type Link struct {
+	URL    string
+	Params string
+}
+
+// String returns a string representation of the hyperlink.
+func (h Link) String() string {
+	return h.URL
+}
+
+// Reset resets the hyperlink to the default state zero value.
+func (h *Link) Reset() {
+	h.URL = ""
+	h.Params = ""
+}
+
+// Equal returns whether the hyperlink is equal to the other hyperlink.
+func (h *Link) Equal(o *Link) bool {
+	return o != nil && h.URL == o.URL && h.Params == o.Params
+}
+
+// Empty returns whether the hyperlink is empty.
+func (h Link) Empty() bool {
+	return h.URL == "" && h.Params == ""
+}
+
+// AttrMask is a bitmask for text attributes that can change the look of text.
+// These attributes can be combined to create different styles.
+type AttrMask uint8
+
+// These are the available text attributes that can be combined to create
+// different styles.
+const (
+	BoldAttr AttrMask = 1 << iota
+	FaintAttr
+	ItalicAttr
+	SlowBlinkAttr
+	RapidBlinkAttr
+	ReverseAttr
+	ConcealAttr
+	StrikethroughAttr
+
+	ResetAttr AttrMask = 0
+)
+
+// Contains returns whether the attribute mask contains the attribute.
+func (a AttrMask) Contains(attr AttrMask) bool {
+	return a&attr == attr
+}
+
+// UnderlineStyle is the style of underline to use for text.
+type UnderlineStyle = ansi.UnderlineStyle
+
+// These are the available underline styles.
+const (
+	NoUnderline     = ansi.NoUnderlineStyle
+	SingleUnderline = ansi.SingleUnderlineStyle
+	DoubleUnderline = ansi.DoubleUnderlineStyle
+	CurlyUnderline  = ansi.CurlyUnderlineStyle
+	DottedUnderline = ansi.DottedUnderlineStyle
+	DashedUnderline = ansi.DashedUnderlineStyle
+)
+
+// Style represents the Style of a cell.
+type Style struct {
+	Fg      ansi.Color
+	Bg      ansi.Color
+	Ul      ansi.Color
+	Attrs   AttrMask
+	UlStyle UnderlineStyle
+}
+
+// Sequence returns the ANSI sequence that sets the style.
+func (s Style) Sequence() string {
+	if s.Empty() {
+		return ansi.ResetStyle
+	}
+
+	var b ansi.Style
+
+	if s.Attrs != 0 {
+		if s.Attrs&BoldAttr != 0 {
+			b = b.Bold()
+		}
+		if s.Attrs&FaintAttr != 0 {
+			b = b.Faint()
+		}
+		if s.Attrs&ItalicAttr != 0 {
+			b = b.Italic()
+		}
+		if s.Attrs&SlowBlinkAttr != 0 {
+			b = b.SlowBlink()
+		}
+		if s.Attrs&RapidBlinkAttr != 0 {
+			b = b.RapidBlink()
+		}
+		if s.Attrs&ReverseAttr != 0 {
+			b = b.Reverse()
+		}
+		if s.Attrs&ConcealAttr != 0 {
+			b = b.Conceal()
+		}
+		if s.Attrs&StrikethroughAttr != 0 {
+			b = b.Strikethrough()
+		}
+	}
+	if s.UlStyle != NoUnderline {
+		switch s.UlStyle {
+		case SingleUnderline:
+			b = b.Underline()
+		case DoubleUnderline:
+			b = b.DoubleUnderline()
+		case CurlyUnderline:
+			b = b.CurlyUnderline()
+		case DottedUnderline:
+			b = b.DottedUnderline()
+		case DashedUnderline:
+			b = b.DashedUnderline()
+		}
+	}
+	if s.Fg != nil {
+		b = b.ForegroundColor(s.Fg)
+	}
+	if s.Bg != nil {
+		b = b.BackgroundColor(s.Bg)
+	}
+	if s.Ul != nil {
+		b = b.UnderlineColor(s.Ul)
+	}
+
+	return b.String()
+}
+
+// DiffSequence returns the ANSI sequence that sets the style as a diff from
+// another style.
+func (s Style) DiffSequence(o Style) string {
+	if o.Empty() {
+		return s.Sequence()
+	}
+
+	var b ansi.Style
+
+	if !colorEqual(s.Fg, o.Fg) {
+		b = b.ForegroundColor(s.Fg)
+	}
+
+	if !colorEqual(s.Bg, o.Bg) {
+		b = b.BackgroundColor(s.Bg)
+	}
+
+	if !colorEqual(s.Ul, o.Ul) {
+		b = b.UnderlineColor(s.Ul)
+	}
+
+	var (
+		noBlink  bool
+		isNormal bool
+	)
+
+	if s.Attrs != o.Attrs {
+		if s.Attrs&BoldAttr != o.Attrs&BoldAttr {
+			if s.Attrs&BoldAttr != 0 {
+				b = b.Bold()
+			} else if !isNormal {
+				isNormal = true
+				b = b.NormalIntensity()
+			}
+		}
+		if s.Attrs&FaintAttr != o.Attrs&FaintAttr {
+			if s.Attrs&FaintAttr != 0 {
+				b = b.Faint()
+			} else if !isNormal {
+				b = b.NormalIntensity()
+			}
+		}
+		if s.Attrs&ItalicAttr != o.Attrs&ItalicAttr {
+			if s.Attrs&ItalicAttr != 0 {
+				b = b.Italic()
+			} else {
+				b = b.NoItalic()
+			}
+		}
+		if s.Attrs&SlowBlinkAttr != o.Attrs&SlowBlinkAttr {
+			if s.Attrs&SlowBlinkAttr != 0 {
+				b = b.SlowBlink()
+			} else if !noBlink {
+				noBlink = true
+				b = b.NoBlink()
+			}
+		}
+		if s.Attrs&RapidBlinkAttr != o.Attrs&RapidBlinkAttr {
+			if s.Attrs&RapidBlinkAttr != 0 {
+				b = b.RapidBlink()
+			} else if !noBlink {
+				b = b.NoBlink()
+			}
+		}
+		if s.Attrs&ReverseAttr != o.Attrs&ReverseAttr {
+			if s.Attrs&ReverseAttr != 0 {
+				b = b.Reverse()
+			} else {
+				b = b.NoReverse()
+			}
+		}
+		if s.Attrs&ConcealAttr != o.Attrs&ConcealAttr {
+			if s.Attrs&ConcealAttr != 0 {
+				b = b.Conceal()
+			} else {
+				b = b.NoConceal()
+			}
+		}
+		if s.Attrs&StrikethroughAttr != o.Attrs&StrikethroughAttr {
+			if s.Attrs&StrikethroughAttr != 0 {
+				b = b.Strikethrough()
+			} else {
+				b = b.NoStrikethrough()
+			}
+		}
+	}
+
+	if s.UlStyle != o.UlStyle {
+		b = b.UnderlineStyle(s.UlStyle)
+	}
+
+	return b.String()
+}
+
+// Equal returns true if the style is equal to the other style.
+func (s *Style) Equal(o *Style) bool {
+	return s.Attrs == o.Attrs &&
+		s.UlStyle == o.UlStyle &&
+		colorEqual(s.Fg, o.Fg) &&
+		colorEqual(s.Bg, o.Bg) &&
+		colorEqual(s.Ul, o.Ul)
+}
+
+func colorEqual(c, o ansi.Color) bool {
+	if c == nil && o == nil {
+		return true
+	}
+	if c == nil || o == nil {
+		return false
+	}
+	cr, cg, cb, ca := c.RGBA()
+	or, og, ob, oa := o.RGBA()
+	return cr == or && cg == og && cb == ob && ca == oa
+}
+
+// Bold sets the bold attribute.
+func (s *Style) Bold(v bool) *Style {
+	if v {
+		s.Attrs |= BoldAttr
+	} else {
+		s.Attrs &^= BoldAttr
+	}
+	return s
+}
+
+// Faint sets the faint attribute.
+func (s *Style) Faint(v bool) *Style {
+	if v {
+		s.Attrs |= FaintAttr
+	} else {
+		s.Attrs &^= FaintAttr
+	}
+	return s
+}
+
+// Italic sets the italic attribute.
+func (s *Style) Italic(v bool) *Style {
+	if v {
+		s.Attrs |= ItalicAttr
+	} else {
+		s.Attrs &^= ItalicAttr
+	}
+	return s
+}
+
+// SlowBlink sets the slow blink attribute.
+func (s *Style) SlowBlink(v bool) *Style {
+	if v {
+		s.Attrs |= SlowBlinkAttr
+	} else {
+		s.Attrs &^= SlowBlinkAttr
+	}
+	return s
+}
+
+// RapidBlink sets the rapid blink attribute.
+func (s *Style) RapidBlink(v bool) *Style {
+	if v {
+		s.Attrs |= RapidBlinkAttr
+	} else {
+		s.Attrs &^= RapidBlinkAttr
+	}
+	return s
+}
+
+// Reverse sets the reverse attribute.
+func (s *Style) Reverse(v bool) *Style {
+	if v {
+		s.Attrs |= ReverseAttr
+	} else {
+		s.Attrs &^= ReverseAttr
+	}
+	return s
+}
+
+// Conceal sets the conceal attribute.
+func (s *Style) Conceal(v bool) *Style {
+	if v {
+		s.Attrs |= ConcealAttr
+	} else {
+		s.Attrs &^= ConcealAttr
+	}
+	return s
+}
+
+// Strikethrough sets the strikethrough attribute.
+func (s *Style) Strikethrough(v bool) *Style {
+	if v {
+		s.Attrs |= StrikethroughAttr
+	} else {
+		s.Attrs &^= StrikethroughAttr
+	}
+	return s
+}
+
+// UnderlineStyle sets the underline style.
+func (s *Style) UnderlineStyle(style UnderlineStyle) *Style {
+	s.UlStyle = style
+	return s
+}
+
+// Underline sets the underline attribute.
+// This is a syntactic sugar for [UnderlineStyle].
+func (s *Style) Underline(v bool) *Style {
+	if v {
+		return s.UnderlineStyle(SingleUnderline)
+	}
+	return s.UnderlineStyle(NoUnderline)
+}
+
+// Foreground sets the foreground color.
+func (s *Style) Foreground(c ansi.Color) *Style {
+	s.Fg = c
+	return s
+}
+
+// Background sets the background color.
+func (s *Style) Background(c ansi.Color) *Style {
+	s.Bg = c
+	return s
+}
+
+// UnderlineColor sets the underline color.
+func (s *Style) UnderlineColor(c ansi.Color) *Style {
+	s.Ul = c
+	return s
+}
+
+// Reset resets the style to default.
+func (s *Style) Reset() *Style {
+	s.Fg = nil
+	s.Bg = nil
+	s.Ul = nil
+	s.Attrs = ResetAttr
+	s.UlStyle = NoUnderline
+	return s
+}
+
+// Empty returns true if the style is empty.
+func (s *Style) Empty() bool {
+	return s.Fg == nil && s.Bg == nil && s.Ul == nil && s.Attrs == ResetAttr && s.UlStyle == NoUnderline
+}
+
+// Clear returns whether the style consists of only attributes that don't
+// affect appearance of a space character.
+func (s *Style) Clear() bool {
+	return s.UlStyle == NoUnderline &&
+		s.Attrs&^(BoldAttr|FaintAttr|ItalicAttr|SlowBlinkAttr|RapidBlinkAttr) == 0 &&
+		s.Fg == nil &&
+		s.Bg == nil &&
+		s.Ul == nil
+}
+
+func runesEqual(a, b []rune) bool {
+	if len(a) != len(b) {
+		return false
+	}
+	for i, r := range a {
+		if r != b[i] {
+			return false
+		}
+	}
+	return true
+}
diff --git a/source/vendor/github.com/charmbracelet/x/cellbuf/errors.go b/source/vendor/github.com/charmbracelet/x/cellbuf/errors.go
new file mode 100644
index 0000000..64258fe
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/cellbuf/errors.go
@@ -0,0 +1,6 @@
+package cellbuf
+
+import "errors"
+
+// ErrOutOfBounds is returned when the given x, y position is out of bounds.
+var ErrOutOfBounds = errors.New("out of bounds")
diff --git a/source/vendor/github.com/charmbracelet/x/cellbuf/geom.go b/source/vendor/github.com/charmbracelet/x/cellbuf/geom.go
new file mode 100644
index 0000000..c12e6fb
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/cellbuf/geom.go
@@ -0,0 +1,21 @@
+package cellbuf
+
+import (
+	"image"
+)
+
+// Position represents an x, y position.
+type Position = image.Point
+
+// Pos is a shorthand for Position{X: x, Y: y}.
+func Pos(x, y int) Position {
+	return image.Pt(x, y)
+}
+
+// Rectange represents a rectangle.
+type Rectangle = image.Rectangle
+
+// Rect is a shorthand for Rectangle.
+func Rect(x, y, w, h int) Rectangle {
+	return image.Rect(x, y, x+w, y+h)
+}
diff --git a/source/vendor/github.com/charmbracelet/x/cellbuf/hardscroll.go b/source/vendor/github.com/charmbracelet/x/cellbuf/hardscroll.go
new file mode 100644
index 0000000..402ac06
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/cellbuf/hardscroll.go
@@ -0,0 +1,272 @@
+package cellbuf
+
+import (
+	"strings"
+
+	"github.com/charmbracelet/x/ansi"
+)
+
+// scrollOptimize optimizes the screen to transform the old buffer into the new
+// buffer.
+func (s *Screen) scrollOptimize() {
+	height := s.newbuf.Height()
+	if s.oldnum == nil || len(s.oldnum) < height {
+		s.oldnum = make([]int, height)
+	}
+
+	// Calculate the indices
+	s.updateHashmap()
+	if len(s.hashtab) < height {
+		return
+	}
+
+	// Pass 1 - from top to bottom scrolling up
+	for i := 0; i < height; {
+		for i < height && (s.oldnum[i] == newIndex || s.oldnum[i] <= i) {
+			i++
+		}
+		if i >= height {
+			break
+		}
+
+		shift := s.oldnum[i] - i // shift > 0
+		start := i
+
+		i++
+		for i < height && s.oldnum[i] != newIndex && s.oldnum[i]-i == shift {
+			i++
+		}
+		end := i - 1 + shift
+
+		if !s.scrolln(shift, start, end, height-1) {
+			continue
+		}
+	}
+
+	// Pass 2 - from bottom to top scrolling down
+	for i := height - 1; i >= 0; {
+		for i >= 0 && (s.oldnum[i] == newIndex || s.oldnum[i] >= i) {
+			i--
+		}
+		if i < 0 {
+			break
+		}
+
+		shift := s.oldnum[i] - i // shift < 0
+		end := i
+
+		i--
+		for i >= 0 && s.oldnum[i] != newIndex && s.oldnum[i]-i == shift {
+			i--
+		}
+
+		start := i + 1 - (-shift)
+		if !s.scrolln(shift, start, end, height-1) {
+			continue
+		}
+	}
+}
+
+// scrolln scrolls the screen up by n lines.
+func (s *Screen) scrolln(n, top, bot, maxY int) (v bool) { //nolint:unparam
+	const (
+		nonDestScrollRegion = false
+		memoryBelow         = false
+	)
+
+	blank := s.clearBlank()
+	if n > 0 {
+		// Scroll up (forward)
+		v = s.scrollUp(n, top, bot, 0, maxY, blank)
+		if !v {
+			s.buf.WriteString(ansi.SetTopBottomMargins(top+1, bot+1))
+
+			// XXX: How should we handle this in inline mode when not using alternate screen?
+			s.cur.X, s.cur.Y = -1, -1
+			v = s.scrollUp(n, top, bot, top, bot, blank)
+			s.buf.WriteString(ansi.SetTopBottomMargins(1, maxY+1))
+			s.cur.X, s.cur.Y = -1, -1
+		}
+
+		if !v {
+			v = s.scrollIdl(n, top, bot-n+1, blank)
+		}
+
+		// Clear newly shifted-in lines.
+		if v &&
+			(nonDestScrollRegion || (memoryBelow && bot == maxY)) {
+			if bot == maxY {
+				s.move(0, bot-n+1)
+				s.clearToBottom(nil)
+			} else {
+				for i := 0; i < n; i++ {
+					s.move(0, bot-i)
+					s.clearToEnd(nil, false)
+				}
+			}
+		}
+	} else if n < 0 {
+		// Scroll down (backward)
+		v = s.scrollDown(-n, top, bot, 0, maxY, blank)
+		if !v {
+			s.buf.WriteString(ansi.SetTopBottomMargins(top+1, bot+1))
+
+			// XXX: How should we handle this in inline mode when not using alternate screen?
+			s.cur.X, s.cur.Y = -1, -1
+			v = s.scrollDown(-n, top, bot, top, bot, blank)
+			s.buf.WriteString(ansi.SetTopBottomMargins(1, maxY+1))
+			s.cur.X, s.cur.Y = -1, -1
+
+			if !v {
+				v = s.scrollIdl(-n, bot+n+1, top, blank)
+			}
+
+			// Clear newly shifted-in lines.
+			if v &&
+				(nonDestScrollRegion || (memoryBelow && top == 0)) {
+				for i := 0; i < -n; i++ {
+					s.move(0, top+i)
+					s.clearToEnd(nil, false)
+				}
+			}
+		}
+	}
+
+	if !v {
+		return
+	}
+
+	s.scrollBuffer(s.curbuf, n, top, bot, blank)
+
+	// shift hash values too, they can be reused
+	s.scrollOldhash(n, top, bot)
+
+	return true
+}
+
+// scrollBuffer scrolls the buffer by n lines.
+func (s *Screen) scrollBuffer(b *Buffer, n, top, bot int, blank *Cell) {
+	if top < 0 || bot < top || bot >= b.Height() {
+		// Nothing to scroll
+		return
+	}
+
+	if n < 0 {
+		// shift n lines downwards
+		limit := top - n
+		for line := bot; line >= limit && line >= 0 && line >= top; line-- {
+			copy(b.Lines[line], b.Lines[line+n])
+		}
+		for line := top; line < limit && line <= b.Height()-1 && line <= bot; line++ {
+			b.FillRect(blank, Rect(0, line, b.Width(), 1))
+		}
+	}
+
+	if n > 0 {
+		// shift n lines upwards
+		limit := bot - n
+		for line := top; line <= limit && line <= b.Height()-1 && line <= bot; line++ {
+			copy(b.Lines[line], b.Lines[line+n])
+		}
+		for line := bot; line > limit && line >= 0 && line >= top; line-- {
+			b.FillRect(blank, Rect(0, line, b.Width(), 1))
+		}
+	}
+
+	s.touchLine(b.Width(), b.Height(), top, bot-top+1, true)
+}
+
+// touchLine marks the line as touched.
+func (s *Screen) touchLine(width, height, y, n int, changed bool) {
+	if n < 0 || y < 0 || y >= height {
+		return // Nothing to touch
+	}
+
+	for i := y; i < y+n && i < height; i++ {
+		if changed {
+			s.touch[i] = lineData{firstCell: 0, lastCell: width - 1}
+		} else {
+			delete(s.touch, i)
+		}
+	}
+}
+
+// scrollUp scrolls the screen up by n lines.
+func (s *Screen) scrollUp(n, top, bot, minY, maxY int, blank *Cell) bool {
+	if n == 1 && top == minY && bot == maxY {
+		s.move(0, bot)
+		s.updatePen(blank)
+		s.buf.WriteByte('\n')
+	} else if n == 1 && bot == maxY {
+		s.move(0, top)
+		s.updatePen(blank)
+		s.buf.WriteString(ansi.DeleteLine(1))
+	} else if top == minY && bot == maxY {
+		if s.xtermLike {
+			s.move(0, bot)
+		} else {
+			s.move(0, top)
+		}
+		s.updatePen(blank)
+		if s.xtermLike {
+			s.buf.WriteString(ansi.ScrollUp(n))
+		} else {
+			s.buf.WriteString(strings.Repeat("\n", n))
+		}
+	} else if bot == maxY {
+		s.move(0, top)
+		s.updatePen(blank)
+		s.buf.WriteString(ansi.DeleteLine(n))
+	} else {
+		return false
+	}
+	return true
+}
+
+// scrollDown scrolls the screen down by n lines.
+func (s *Screen) scrollDown(n, top, bot, minY, maxY int, blank *Cell) bool {
+	if n == 1 && top == minY && bot == maxY {
+		s.move(0, top)
+		s.updatePen(blank)
+		s.buf.WriteString(ansi.ReverseIndex)
+	} else if n == 1 && bot == maxY {
+		s.move(0, top)
+		s.updatePen(blank)
+		s.buf.WriteString(ansi.InsertLine(1))
+	} else if top == minY && bot == maxY {
+		s.move(0, top)
+		s.updatePen(blank)
+		if s.xtermLike {
+			s.buf.WriteString(ansi.ScrollDown(n))
+		} else {
+			s.buf.WriteString(strings.Repeat(ansi.ReverseIndex, n))
+		}
+	} else if bot == maxY {
+		s.move(0, top)
+		s.updatePen(blank)
+		s.buf.WriteString(ansi.InsertLine(n))
+	} else {
+		return false
+	}
+	return true
+}
+
+// scrollIdl scrolls the screen n lines by using [ansi.DL] at del and using
+// [ansi.IL] at ins.
+func (s *Screen) scrollIdl(n, del, ins int, blank *Cell) bool {
+	if n < 0 {
+		return false
+	}
+
+	// Delete lines
+	s.move(0, del)
+	s.updatePen(blank)
+	s.buf.WriteString(ansi.DeleteLine(n))
+
+	// Insert lines
+	s.move(0, ins)
+	s.updatePen(blank)
+	s.buf.WriteString(ansi.InsertLine(n))
+
+	return true
+}
diff --git a/source/vendor/github.com/charmbracelet/x/cellbuf/hashmap.go b/source/vendor/github.com/charmbracelet/x/cellbuf/hashmap.go
new file mode 100644
index 0000000..0d25b54
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/cellbuf/hashmap.go
@@ -0,0 +1,301 @@
+package cellbuf
+
+import (
+	"github.com/charmbracelet/x/ansi"
+)
+
+// hash returns the hash value of a [Line].
+func hash(l Line) (h uint64) {
+	for _, c := range l {
+		var r rune
+		if c == nil {
+			r = ansi.SP
+		} else {
+			r = c.Rune
+		}
+		h += (h << 5) + uint64(r)
+	}
+	return
+}
+
+// hashmap represents a single [Line] hash.
+type hashmap struct {
+	value              uint64
+	oldcount, newcount int
+	oldindex, newindex int
+}
+
+// The value used to indicate lines created by insertions and scrolls.
+const newIndex = -1
+
+// updateHashmap updates the hashmap with the new hash value.
+func (s *Screen) updateHashmap() {
+	height := s.newbuf.Height()
+	if len(s.oldhash) >= height && len(s.newhash) >= height {
+		// rehash changed lines
+		for i := 0; i < height; i++ {
+			_, ok := s.touch[i]
+			if ok {
+				s.oldhash[i] = hash(s.curbuf.Line(i))
+				s.newhash[i] = hash(s.newbuf.Line(i))
+			}
+		}
+	} else {
+		// rehash all
+		if len(s.oldhash) != height {
+			s.oldhash = make([]uint64, height)
+		}
+		if len(s.newhash) != height {
+			s.newhash = make([]uint64, height)
+		}
+		for i := 0; i < height; i++ {
+			s.oldhash[i] = hash(s.curbuf.Line(i))
+			s.newhash[i] = hash(s.newbuf.Line(i))
+		}
+	}
+
+	s.hashtab = make([]hashmap, height*2)
+	for i := 0; i < height; i++ {
+		hashval := s.oldhash[i]
+
+		// Find matching hash or empty slot
+		idx := 0
+		for idx < len(s.hashtab) && s.hashtab[idx].value != 0 {
+			if s.hashtab[idx].value == hashval {
+				break
+			}
+			idx++
+		}
+
+		s.hashtab[idx].value = hashval // in case this is a new hash
+		s.hashtab[idx].oldcount++
+		s.hashtab[idx].oldindex = i
+	}
+	for i := 0; i < height; i++ {
+		hashval := s.newhash[i]
+
+		// Find matching hash or empty slot
+		idx := 0
+		for idx < len(s.hashtab) && s.hashtab[idx].value != 0 {
+			if s.hashtab[idx].value == hashval {
+				break
+			}
+			idx++
+		}
+
+		s.hashtab[idx].value = hashval // in case this is a new hash
+		s.hashtab[idx].newcount++
+		s.hashtab[idx].newindex = i
+
+		s.oldnum[i] = newIndex // init old indices slice
+	}
+
+	// Mark line pair corresponding to unique hash pairs.
+	for i := 0; i < len(s.hashtab) && s.hashtab[i].value != 0; i++ {
+		hsp := &s.hashtab[i]
+		if hsp.oldcount == 1 && hsp.newcount == 1 && hsp.oldindex != hsp.newindex {
+			s.oldnum[hsp.newindex] = hsp.oldindex
+		}
+	}
+
+	s.growHunks()
+
+	// Eliminate bad or impossible shifts. This includes removing those hunks
+	// which could not grow because of conflicts, as well those which are to be
+	// moved too far, they are likely to destroy more than carry.
+	for i := 0; i < height; {
+		var start, shift, size int
+		for i < height && s.oldnum[i] == newIndex {
+			i++
+		}
+		if i >= height {
+			break
+		}
+		start = i
+		shift = s.oldnum[i] - i
+		i++
+		for i < height && s.oldnum[i] != newIndex && s.oldnum[i]-i == shift {
+			i++
+		}
+		size = i - start
+		if size < 3 || size+min(size/8, 2) < abs(shift) {
+			for start < i {
+				s.oldnum[start] = newIndex
+				start++
+			}
+		}
+	}
+
+	// After clearing invalid hunks, try grow the rest.
+	s.growHunks()
+}
+
+// scrollOldhash
+func (s *Screen) scrollOldhash(n, top, bot int) {
+	if len(s.oldhash) == 0 {
+		return
+	}
+
+	size := bot - top + 1 - abs(n)
+	if n > 0 {
+		// Move existing hashes up
+		copy(s.oldhash[top:], s.oldhash[top+n:top+n+size])
+		// Recalculate hashes for newly shifted-in lines
+		for i := bot; i > bot-n; i-- {
+			s.oldhash[i] = hash(s.curbuf.Line(i))
+		}
+	} else {
+		// Move existing hashes down
+		copy(s.oldhash[top-n:], s.oldhash[top:top+size])
+		// Recalculate hashes for newly shifted-in lines
+		for i := top; i < top-n; i++ {
+			s.oldhash[i] = hash(s.curbuf.Line(i))
+		}
+	}
+}
+
+func (s *Screen) growHunks() {
+	var (
+		backLimit    int // limits for cells to fill
+		backRefLimit int // limit for references
+		i            int
+		nextHunk     int
+	)
+
+	height := s.newbuf.Height()
+	for i < height && s.oldnum[i] == newIndex {
+		i++
+	}
+	for ; i < height; i = nextHunk {
+		var (
+			forwardLimit    int
+			forwardRefLimit int
+			end             int
+			start           = i
+			shift           = s.oldnum[i] - i
+		)
+
+		// get forward limit
+		i = start + 1
+		for i < height &&
+			s.oldnum[i] != newIndex &&
+			s.oldnum[i]-i == shift {
+			i++
+		}
+
+		end = i
+		for i < height && s.oldnum[i] == newIndex {
+			i++
+		}
+
+		nextHunk = i
+		forwardLimit = i
+		if i >= height || s.oldnum[i] >= i {
+			forwardRefLimit = i
+		} else {
+			forwardRefLimit = s.oldnum[i]
+		}
+
+		i = start - 1
+
+		// grow back
+		if shift < 0 {
+			backLimit = backRefLimit + (-shift)
+		}
+		for i >= backLimit {
+			if s.newhash[i] == s.oldhash[i+shift] ||
+				s.costEffective(i+shift, i, shift < 0) {
+				s.oldnum[i] = i + shift
+			} else {
+				break
+			}
+			i--
+		}
+
+		i = end
+		// grow forward
+		if shift > 0 {
+			forwardLimit = forwardRefLimit - shift
+		}
+		for i < forwardLimit {
+			if s.newhash[i] == s.oldhash[i+shift] ||
+				s.costEffective(i+shift, i, shift > 0) {
+				s.oldnum[i] = i + shift
+			} else {
+				break
+			}
+			i++
+		}
+
+		backLimit = i
+		backRefLimit = backLimit
+		if shift > 0 {
+			backRefLimit += shift
+		}
+	}
+}
+
+// costEffective returns true if the cost of moving line 'from' to line 'to' seems to be
+// cost effective. 'blank' indicates whether the line 'to' would become blank.
+func (s *Screen) costEffective(from, to int, blank bool) bool {
+	if from == to {
+		return false
+	}
+
+	newFrom := s.oldnum[from]
+	if newFrom == newIndex {
+		newFrom = from
+	}
+
+	// On the left side of >= is the cost before moving. On the right side --
+	// cost after moving.
+
+	// Calculate costs before moving.
+	var costBeforeMove int
+	if blank {
+		// Cost of updating blank line at destination.
+		costBeforeMove = s.updateCostBlank(s.newbuf.Line(to))
+	} else {
+		// Cost of updating exiting line at destination.
+		costBeforeMove = s.updateCost(s.curbuf.Line(to), s.newbuf.Line(to))
+	}
+
+	// Add cost of updating source line
+	costBeforeMove += s.updateCost(s.curbuf.Line(newFrom), s.newbuf.Line(from))
+
+	// Calculate costs after moving.
+	var costAfterMove int
+	if newFrom == from {
+		// Source becomes blank after move
+		costAfterMove = s.updateCostBlank(s.newbuf.Line(from))
+	} else {
+		// Source gets updated from another line
+		costAfterMove = s.updateCost(s.curbuf.Line(newFrom), s.newbuf.Line(from))
+	}
+
+	// Add cost of moving source line to destination
+	costAfterMove += s.updateCost(s.curbuf.Line(from), s.newbuf.Line(to))
+
+	// Return true if moving is cost effective (costs less or equal)
+	return costBeforeMove >= costAfterMove
+}
+
+func (s *Screen) updateCost(from, to Line) (cost int) {
+	var fidx, tidx int
+	for i := s.newbuf.Width() - 1; i > 0; i, fidx, tidx = i-1, fidx+1, tidx+1 {
+		if !cellEqual(from.At(fidx), to.At(tidx)) {
+			cost++
+		}
+	}
+	return
+}
+
+func (s *Screen) updateCostBlank(to Line) (cost int) {
+	var tidx int
+	for i := s.newbuf.Width() - 1; i > 0; i, tidx = i-1, tidx+1 {
+		if !cellEqual(nil, to.At(tidx)) {
+			cost++
+		}
+	}
+	return
+}
diff --git a/source/vendor/github.com/charmbracelet/x/cellbuf/link.go b/source/vendor/github.com/charmbracelet/x/cellbuf/link.go
new file mode 100644
index 0000000..112f8e8
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/cellbuf/link.go
@@ -0,0 +1,14 @@
+package cellbuf
+
+import (
+	"github.com/charmbracelet/colorprofile"
+)
+
+// Convert converts a hyperlink to respect the given color profile.
+func ConvertLink(h Link, p colorprofile.Profile) Link {
+	if p == colorprofile.NoTTY {
+		return Link{}
+	}
+
+	return h
+}
diff --git a/source/vendor/github.com/charmbracelet/x/cellbuf/screen.go b/source/vendor/github.com/charmbracelet/x/cellbuf/screen.go
new file mode 100644
index 0000000..963b9ca
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/cellbuf/screen.go
@@ -0,0 +1,1457 @@
+package cellbuf
+
+import (
+	"bytes"
+	"errors"
+	"io"
+	"os"
+	"strings"
+	"sync"
+
+	"github.com/charmbracelet/colorprofile"
+	"github.com/charmbracelet/x/ansi"
+	"github.com/charmbracelet/x/term"
+)
+
+// ErrInvalidDimensions is returned when the dimensions of a window are invalid
+// for the operation.
+var ErrInvalidDimensions = errors.New("invalid dimensions")
+
+// notLocal returns whether the coordinates are not considered local movement
+// using the defined thresholds.
+// This takes the number of columns, and the coordinates of the current and
+// target positions.
+func notLocal(cols, fx, fy, tx, ty int) bool {
+	// The typical distance for a [ansi.CUP] sequence. Anything less than this
+	// is considered local movement.
+	const longDist = 8 - 1
+	return (tx > longDist) &&
+		(tx < cols-1-longDist) &&
+		(abs(ty-fy)+abs(tx-fx) > longDist)
+}
+
+// relativeCursorMove returns the relative cursor movement sequence using one or two
+// of the following sequences [ansi.CUU], [ansi.CUD], [ansi.CUF], [ansi.CUB],
+// [ansi.VPA], [ansi.HPA].
+// When overwrite is true, this will try to optimize the sequence by using the
+// screen cells values to move the cursor instead of using escape sequences.
+func relativeCursorMove(s *Screen, fx, fy, tx, ty int, overwrite, useTabs, useBackspace bool) string {
+	var seq strings.Builder
+
+	width, height := s.newbuf.Width(), s.newbuf.Height()
+	if ty != fy {
+		var yseq string
+		if s.xtermLike && !s.opts.RelativeCursor {
+			yseq = ansi.VerticalPositionAbsolute(ty + 1)
+		}
+
+		// OPTIM: Use [ansi.LF] and [ansi.ReverseIndex] as optimizations.
+
+		if ty > fy {
+			n := ty - fy
+			if cud := ansi.CursorDown(n); yseq == "" || len(cud) < len(yseq) {
+				yseq = cud
+			}
+			shouldScroll := !s.opts.AltScreen && fy+n >= s.scrollHeight
+			if lf := strings.Repeat("\n", n); shouldScroll || (fy+n < height && len(lf) < len(yseq)) {
+				// TODO: Ensure we're not unintentionally scrolling the screen down.
+				yseq = lf
+				s.scrollHeight = max(s.scrollHeight, fy+n)
+			}
+		} else if ty < fy {
+			n := fy - ty
+			if cuu := ansi.CursorUp(n); yseq == "" || len(cuu) < len(yseq) {
+				yseq = cuu
+			}
+			if n == 1 && fy-1 > 0 {
+				// TODO: Ensure we're not unintentionally scrolling the screen up.
+				yseq = ansi.ReverseIndex
+			}
+		}
+
+		seq.WriteString(yseq)
+	}
+
+	if tx != fx {
+		var xseq string
+		if s.xtermLike && !s.opts.RelativeCursor {
+			xseq = ansi.HorizontalPositionAbsolute(tx + 1)
+		}
+
+		if tx > fx {
+			n := tx - fx
+			if useTabs {
+				var tabs int
+				var col int
+				for col = fx; s.tabs.Next(col) <= tx; col = s.tabs.Next(col) {
+					tabs++
+					if col == s.tabs.Next(col) || col >= width-1 {
+						break
+					}
+				}
+
+				if tabs > 0 {
+					cht := ansi.CursorHorizontalForwardTab(tabs)
+					tab := strings.Repeat("\t", tabs)
+					if false && s.xtermLike && len(cht) < len(tab) {
+						// TODO: The linux console and some terminals such as
+						// Alacritty don't support [ansi.CHT]. Enable this when
+						// we have a way to detect this, or after 5 years when
+						// we're sure everyone has updated their terminals :P
+						seq.WriteString(cht)
+					} else {
+						seq.WriteString(tab)
+					}
+
+					n = tx - col
+					fx = col
+				}
+			}
+
+			if cuf := ansi.CursorForward(n); xseq == "" || len(cuf) < len(xseq) {
+				xseq = cuf
+			}
+
+			// If we have no attribute and style changes, overwrite is cheaper.
+			var ovw string
+			if overwrite && ty >= 0 {
+				for i := 0; i < n; i++ {
+					cell := s.newbuf.Cell(fx+i, ty)
+					if cell != nil && cell.Width > 0 {
+						i += cell.Width - 1
+						if !cell.Style.Equal(&s.cur.Style) || !cell.Link.Equal(&s.cur.Link) {
+							overwrite = false
+							break
+						}
+					}
+				}
+			}
+
+			if overwrite && ty >= 0 {
+				for i := 0; i < n; i++ {
+					cell := s.newbuf.Cell(fx+i, ty)
+					if cell != nil && cell.Width > 0 {
+						ovw += cell.String()
+						i += cell.Width - 1
+					} else {
+						ovw += " "
+					}
+				}
+			}
+
+			if overwrite && len(ovw) < len(xseq) {
+				xseq = ovw
+			}
+		} else if tx < fx {
+			n := fx - tx
+			if useTabs && s.xtermLike {
+				// VT100 does not support backward tabs [ansi.CBT].
+
+				col := fx
+
+				var cbt int // cursor backward tabs count
+				for s.tabs.Prev(col) >= tx {
+					col = s.tabs.Prev(col)
+					cbt++
+					if col == s.tabs.Prev(col) || col <= 0 {
+						break
+					}
+				}
+
+				if cbt > 0 {
+					seq.WriteString(ansi.CursorBackwardTab(cbt))
+					n = col - tx
+				}
+			}
+
+			if cub := ansi.CursorBackward(n); xseq == "" || len(cub) < len(xseq) {
+				xseq = cub
+			}
+
+			if useBackspace && n < len(xseq) {
+				xseq = strings.Repeat("\b", n)
+			}
+		}
+
+		seq.WriteString(xseq)
+	}
+
+	return seq.String()
+}
+
+// moveCursor moves and returns the cursor movement sequence to move the cursor
+// to the specified position.
+// When overwrite is true, this will try to optimize the sequence by using the
+// screen cells values to move the cursor instead of using escape sequences.
+func moveCursor(s *Screen, x, y int, overwrite bool) (seq string) {
+	fx, fy := s.cur.X, s.cur.Y
+
+	if !s.opts.RelativeCursor {
+		// Method #0: Use [ansi.CUP] if the distance is long.
+		seq = ansi.CursorPosition(x+1, y+1)
+		if fx == -1 || fy == -1 || notLocal(s.newbuf.Width(), fx, fy, x, y) {
+			return
+		}
+	}
+
+	// Optimize based on options.
+	trials := 0
+	if s.opts.HardTabs {
+		trials |= 2 // 0b10 in binary
+	}
+	if s.opts.Backspace {
+		trials |= 1 // 0b01 in binary
+	}
+
+	// Try all possible combinations of hard tabs and backspace optimizations.
+	for i := 0; i <= trials; i++ {
+		// Skip combinations that are not enabled.
+		if i & ^trials != 0 {
+			continue
+		}
+
+		useHardTabs := i&2 != 0
+		useBackspace := i&1 != 0
+
+		// Method #1: Use local movement sequences.
+		nseq := relativeCursorMove(s, fx, fy, x, y, overwrite, useHardTabs, useBackspace)
+		if (i == 0 && len(seq) == 0) || len(nseq) < len(seq) {
+			seq = nseq
+		}
+
+		// Method #2: Use [ansi.CR] and local movement sequences.
+		nseq = "\r" + relativeCursorMove(s, 0, fy, x, y, overwrite, useHardTabs, useBackspace)
+		if len(nseq) < len(seq) {
+			seq = nseq
+		}
+
+		if !s.opts.RelativeCursor {
+			// Method #3: Use [ansi.CursorHomePosition] and local movement sequences.
+			nseq = ansi.CursorHomePosition + relativeCursorMove(s, 0, 0, x, y, overwrite, useHardTabs, useBackspace)
+			if len(nseq) < len(seq) {
+				seq = nseq
+			}
+		}
+	}
+
+	return
+}
+
+// moveCursor moves the cursor to the specified position.
+func (s *Screen) moveCursor(x, y int, overwrite bool) {
+	if !s.opts.AltScreen && s.cur.X == -1 && s.cur.Y == -1 {
+		// First cursor movement in inline mode, move the cursor to the first
+		// column before moving to the target position.
+		s.buf.WriteByte('\r') //nolint:errcheck
+		s.cur.X, s.cur.Y = 0, 0
+	}
+	s.buf.WriteString(moveCursor(s, x, y, overwrite)) //nolint:errcheck
+	s.cur.X, s.cur.Y = x, y
+}
+
+func (s *Screen) move(x, y int) {
+	// XXX: Make sure we use the max height and width of the buffer in case
+	// we're in the middle of a resize operation.
+	width := max(s.newbuf.Width(), s.curbuf.Width())
+	height := max(s.newbuf.Height(), s.curbuf.Height())
+
+	if width > 0 && x >= width {
+		// Handle autowrap
+		y += (x / width)
+		x %= width
+	}
+
+	// XXX: Disable styles if there's any
+	// Some move operations such as [ansi.LF] can apply styles to the new
+	// cursor position, thus, we need to reset the styles before moving the
+	// cursor.
+	blank := s.clearBlank()
+	resetPen := y != s.cur.Y && !blank.Equal(&BlankCell)
+	if resetPen {
+		s.updatePen(nil)
+	}
+
+	// Reset wrap around (phantom cursor) state
+	if s.atPhantom {
+		s.cur.X = 0
+		s.buf.WriteByte('\r') //nolint:errcheck
+		s.atPhantom = false   // reset phantom cell state
+	}
+
+	// TODO: Investigate if we need to handle this case and/or if we need the
+	// following code.
+	//
+	// if width > 0 && s.cur.X >= width {
+	// 	l := (s.cur.X + 1) / width
+	//
+	// 	s.cur.Y += l
+	// 	if height > 0 && s.cur.Y >= height {
+	// 		l -= s.cur.Y - height - 1
+	// 	}
+	//
+	// 	if l > 0 {
+	// 		s.cur.X = 0
+	// 		s.buf.WriteString("\r" + strings.Repeat("\n", l)) //nolint:errcheck
+	// 	}
+	// }
+
+	if height > 0 {
+		if s.cur.Y > height-1 {
+			s.cur.Y = height - 1
+		}
+		if y > height-1 {
+			y = height - 1
+		}
+	}
+
+	if x == s.cur.X && y == s.cur.Y {
+		// We give up later because we need to run checks for the phantom cell
+		// and others before we can determine if we can give up.
+		return
+	}
+
+	// We set the new cursor in [Screen.moveCursor].
+	s.moveCursor(x, y, true) // Overwrite cells if possible
+}
+
+// Cursor represents a terminal Cursor.
+type Cursor struct {
+	Style
+	Link
+	Position
+}
+
+// ScreenOptions are options for the screen.
+type ScreenOptions struct {
+	// Term is the terminal type to use when writing to the screen. When empty,
+	// `$TERM` is used from [os.Getenv].
+	Term string
+	// Profile is the color profile to use when writing to the screen.
+	Profile colorprofile.Profile
+	// RelativeCursor is whether to use relative cursor movements. This is
+	// useful when alt-screen is not used or when using inline mode.
+	RelativeCursor bool
+	// AltScreen is whether to use the alternate screen buffer.
+	AltScreen bool
+	// ShowCursor is whether to show the cursor.
+	ShowCursor bool
+	// HardTabs is whether to use hard tabs to optimize cursor movements.
+	HardTabs bool
+	// Backspace is whether to use backspace characters to move the cursor.
+	Backspace bool
+}
+
+// lineData represents the metadata for a line.
+type lineData struct {
+	// first and last changed cell indices
+	firstCell, lastCell int
+	// old index used for scrolling
+	oldIndex int //nolint:unused
+}
+
+// Screen represents the terminal screen.
+type Screen struct {
+	w                io.Writer
+	buf              *bytes.Buffer // buffer for writing to the screen
+	curbuf           *Buffer       // the current buffer
+	newbuf           *Buffer       // the new buffer
+	tabs             *TabStops
+	touch            map[int]lineData
+	queueAbove       []string  // the queue of strings to write above the screen
+	oldhash, newhash []uint64  // the old and new hash values for each line
+	hashtab          []hashmap // the hashmap table
+	oldnum           []int     // old indices from previous hash
+	cur, saved       Cursor    // the current and saved cursors
+	opts             ScreenOptions
+	mu               sync.Mutex
+	method           ansi.Method
+	scrollHeight     int  // keeps track of how many lines we've scrolled down (inline mode)
+	altScreenMode    bool // whether alternate screen mode is enabled
+	cursorHidden     bool // whether text cursor mode is enabled
+	clear            bool // whether to force clear the screen
+	xtermLike        bool // whether to use xterm-like optimizations, otherwise, it uses vt100 only
+	queuedText       bool // whether we have queued non-zero width text queued up
+	atPhantom        bool // whether the cursor is out of bounds and at a phantom cell
+}
+
+// SetMethod sets the method used to calculate the width of cells.
+func (s *Screen) SetMethod(method ansi.Method) {
+	s.method = method
+}
+
+// UseBackspaces sets whether to use backspace characters to move the cursor.
+func (s *Screen) UseBackspaces(v bool) {
+	s.opts.Backspace = v
+}
+
+// UseHardTabs sets whether to use hard tabs to optimize cursor movements.
+func (s *Screen) UseHardTabs(v bool) {
+	s.opts.HardTabs = v
+}
+
+// SetColorProfile sets the color profile to use when writing to the screen.
+func (s *Screen) SetColorProfile(p colorprofile.Profile) {
+	s.opts.Profile = p
+}
+
+// SetRelativeCursor sets whether to use relative cursor movements.
+func (s *Screen) SetRelativeCursor(v bool) {
+	s.opts.RelativeCursor = v
+}
+
+// EnterAltScreen enters the alternate screen buffer.
+func (s *Screen) EnterAltScreen() {
+	s.opts.AltScreen = true
+	s.clear = true
+	s.saved = s.cur
+}
+
+// ExitAltScreen exits the alternate screen buffer.
+func (s *Screen) ExitAltScreen() {
+	s.opts.AltScreen = false
+	s.clear = true
+	s.cur = s.saved
+}
+
+// ShowCursor shows the cursor.
+func (s *Screen) ShowCursor() {
+	s.opts.ShowCursor = true
+}
+
+// HideCursor hides the cursor.
+func (s *Screen) HideCursor() {
+	s.opts.ShowCursor = false
+}
+
+// Bounds implements Window.
+func (s *Screen) Bounds() Rectangle {
+	// Always return the new buffer bounds.
+	return s.newbuf.Bounds()
+}
+
+// Cell implements Window.
+func (s *Screen) Cell(x int, y int) *Cell {
+	return s.newbuf.Cell(x, y)
+}
+
+// Redraw forces a full redraw of the screen.
+func (s *Screen) Redraw() {
+	s.mu.Lock()
+	s.clear = true
+	s.mu.Unlock()
+}
+
+// Clear clears the screen with blank cells. This is a convenience method for
+// [Screen.Fill] with a nil cell.
+func (s *Screen) Clear() bool {
+	return s.ClearRect(s.newbuf.Bounds())
+}
+
+// ClearRect clears the given rectangle with blank cells. This is a convenience
+// method for [Screen.FillRect] with a nil cell.
+func (s *Screen) ClearRect(r Rectangle) bool {
+	return s.FillRect(nil, r)
+}
+
+// SetCell implements Window.
+func (s *Screen) SetCell(x int, y int, cell *Cell) (v bool) {
+	s.mu.Lock()
+	defer s.mu.Unlock()
+	cellWidth := 1
+	if cell != nil {
+		cellWidth = cell.Width
+	}
+	if prev := s.curbuf.Cell(x, y); !cellEqual(prev, cell) {
+		chg, ok := s.touch[y]
+		if !ok {
+			chg = lineData{firstCell: x, lastCell: x + cellWidth}
+		} else {
+			chg.firstCell = min(chg.firstCell, x)
+			chg.lastCell = max(chg.lastCell, x+cellWidth)
+		}
+		s.touch[y] = chg
+	}
+
+	return s.newbuf.SetCell(x, y, cell)
+}
+
+// Fill implements Window.
+func (s *Screen) Fill(cell *Cell) bool {
+	return s.FillRect(cell, s.newbuf.Bounds())
+}
+
+// FillRect implements Window.
+func (s *Screen) FillRect(cell *Cell, r Rectangle) bool {
+	s.mu.Lock()
+	defer s.mu.Unlock()
+	s.newbuf.FillRect(cell, r)
+	for i := r.Min.Y; i < r.Max.Y; i++ {
+		s.touch[i] = lineData{firstCell: r.Min.X, lastCell: r.Max.X}
+	}
+	return true
+}
+
+// isXtermLike returns whether the terminal is xterm-like. This means that the
+// terminal supports ECMA-48 and ANSI X3.64 escape sequences.
+// TODO: Should this be a lookup table into each $TERM terminfo database? Like
+// we could keep a map of ANSI escape sequence to terminfo capability name and
+// check if the database supports the escape sequence. Instead of keeping a
+// list of terminal names here.
+func isXtermLike(termtype string) (v bool) {
+	parts := strings.Split(termtype, "-")
+	if len(parts) == 0 {
+		return
+	}
+
+	switch parts[0] {
+	case
+		"alacritty",
+		"contour",
+		"foot",
+		"ghostty",
+		"kitty",
+		"linux",
+		"rio",
+		"screen",
+		"st",
+		"tmux",
+		"wezterm",
+		"xterm":
+		v = true
+	}
+
+	return
+}
+
+// NewScreen creates a new Screen.
+func NewScreen(w io.Writer, width, height int, opts *ScreenOptions) (s *Screen) {
+	s = new(Screen)
+	s.w = w
+	if opts != nil {
+		s.opts = *opts
+	}
+
+	if s.opts.Term == "" {
+		s.opts.Term = os.Getenv("TERM")
+	}
+
+	if width <= 0 || height <= 0 {
+		if f, ok := w.(term.File); ok {
+			width, height, _ = term.GetSize(f.Fd())
+		}
+	}
+	if width < 0 {
+		width = 0
+	}
+	if height < 0 {
+		height = 0
+	}
+
+	s.buf = new(bytes.Buffer)
+	s.xtermLike = isXtermLike(s.opts.Term)
+	s.curbuf = NewBuffer(width, height)
+	s.newbuf = NewBuffer(width, height)
+	s.cur = Cursor{Position: Pos(-1, -1)} // start at -1 to force a move
+	s.saved = s.cur
+	s.reset()
+
+	return
+}
+
+// Width returns the width of the screen.
+func (s *Screen) Width() int {
+	return s.newbuf.Width()
+}
+
+// Height returns the height of the screen.
+func (s *Screen) Height() int {
+	return s.newbuf.Height()
+}
+
+// cellEqual returns whether the two cells are equal. A nil cell is considered
+// a [BlankCell].
+func cellEqual(a, b *Cell) bool {
+	if a == b {
+		return true
+	}
+	if a == nil {
+		a = &BlankCell
+	}
+	if b == nil {
+		b = &BlankCell
+	}
+	return a.Equal(b)
+}
+
+// putCell draws a cell at the current cursor position.
+func (s *Screen) putCell(cell *Cell) {
+	width, height := s.newbuf.Width(), s.newbuf.Height()
+	if s.opts.AltScreen && s.cur.X == width-1 && s.cur.Y == height-1 {
+		s.putCellLR(cell)
+	} else {
+		s.putAttrCell(cell)
+	}
+}
+
+// wrapCursor wraps the cursor to the next line.
+//
+//nolint:unused
+func (s *Screen) wrapCursor() {
+	const autoRightMargin = true
+	if autoRightMargin {
+		// Assume we have auto wrap mode enabled.
+		s.cur.X = 0
+		s.cur.Y++
+	} else {
+		s.cur.X--
+	}
+}
+
+func (s *Screen) putAttrCell(cell *Cell) {
+	if cell != nil && cell.Empty() {
+		// XXX: Zero width cells are special and should not be written to the
+		// screen no matter what other attributes they have.
+		// Zero width cells are used for wide characters that are split into
+		// multiple cells.
+		return
+	}
+
+	if cell == nil {
+		cell = s.clearBlank()
+	}
+
+	// We're at pending wrap state (phantom cell), incoming cell should
+	// wrap.
+	if s.atPhantom {
+		s.wrapCursor()
+		s.atPhantom = false
+	}
+
+	s.updatePen(cell)
+	s.buf.WriteRune(cell.Rune) //nolint:errcheck
+	for _, c := range cell.Comb {
+		s.buf.WriteRune(c) //nolint:errcheck
+	}
+
+	s.cur.X += cell.Width
+
+	if cell.Width > 0 {
+		s.queuedText = true
+	}
+
+	if s.cur.X >= s.newbuf.Width() {
+		s.atPhantom = true
+	}
+}
+
+// putCellLR draws a cell at the lower right corner of the screen.
+func (s *Screen) putCellLR(cell *Cell) {
+	// Optimize for the lower right corner cell.
+	curX := s.cur.X
+	if cell == nil || !cell.Empty() {
+		s.buf.WriteString(ansi.ResetAutoWrapMode) //nolint:errcheck
+		s.putAttrCell(cell)
+		// Writing to lower-right corner cell should not wrap.
+		s.atPhantom = false
+		s.cur.X = curX
+		s.buf.WriteString(ansi.SetAutoWrapMode) //nolint:errcheck
+	}
+}
+
+// updatePen updates the cursor pen styles.
+func (s *Screen) updatePen(cell *Cell) {
+	if cell == nil {
+		cell = &BlankCell
+	}
+
+	if s.opts.Profile != 0 {
+		// Downsample colors to the given color profile.
+		cell.Style = ConvertStyle(cell.Style, s.opts.Profile)
+		cell.Link = ConvertLink(cell.Link, s.opts.Profile)
+	}
+
+	if !cell.Style.Equal(&s.cur.Style) {
+		seq := cell.Style.DiffSequence(s.cur.Style)
+		if cell.Style.Empty() && len(seq) > len(ansi.ResetStyle) {
+			seq = ansi.ResetStyle
+		}
+		s.buf.WriteString(seq) //nolint:errcheck
+		s.cur.Style = cell.Style
+	}
+	if !cell.Link.Equal(&s.cur.Link) {
+		s.buf.WriteString(ansi.SetHyperlink(cell.Link.URL, cell.Link.Params)) //nolint:errcheck
+		s.cur.Link = cell.Link
+	}
+}
+
+// emitRange emits a range of cells to the buffer. It it equivalent to calling
+// [Screen.putCell] for each cell in the range. This is optimized to use
+// [ansi.ECH] and [ansi.REP].
+// Returns whether the cursor is at the end of interval or somewhere in the
+// middle.
+func (s *Screen) emitRange(line Line, n int) (eoi bool) {
+	for n > 0 {
+		var count int
+		for n > 1 && !cellEqual(line.At(0), line.At(1)) {
+			s.putCell(line.At(0))
+			line = line[1:]
+			n--
+		}
+
+		cell0 := line[0]
+		if n == 1 {
+			s.putCell(cell0)
+			return false
+		}
+
+		count = 2
+		for count < n && cellEqual(line.At(count), cell0) {
+			count++
+		}
+
+		ech := ansi.EraseCharacter(count)
+		cup := ansi.CursorPosition(s.cur.X+count, s.cur.Y)
+		rep := ansi.RepeatPreviousCharacter(count)
+		if s.xtermLike && count > len(ech)+len(cup) && cell0 != nil && cell0.Clear() {
+			s.updatePen(cell0)
+			s.buf.WriteString(ech) //nolint:errcheck
+
+			// If this is the last cell, we don't need to move the cursor.
+			if count < n {
+				s.move(s.cur.X+count, s.cur.Y)
+			} else {
+				return true // cursor in the middle
+			}
+		} else if s.xtermLike && count > len(rep) &&
+			(cell0 == nil || (len(cell0.Comb) == 0 && cell0.Rune < 256)) {
+			// We only support ASCII characters. Most terminals will handle
+			// non-ASCII characters correctly, but some might not, ahem xterm.
+			//
+			// NOTE: [ansi.REP] only repeats the last rune and won't work
+			// if the last cell contains multiple runes.
+
+			wrapPossible := s.cur.X+count >= s.newbuf.Width()
+			repCount := count
+			if wrapPossible {
+				repCount--
+			}
+
+			s.updatePen(cell0)
+			s.putCell(cell0)
+			repCount-- // cell0 is a single width cell ASCII character
+
+			s.buf.WriteString(ansi.RepeatPreviousCharacter(repCount)) //nolint:errcheck
+			s.cur.X += repCount
+			if wrapPossible {
+				s.putCell(cell0)
+			}
+		} else {
+			for i := 0; i < count; i++ {
+				s.putCell(line.At(i))
+			}
+		}
+
+		line = line[clamp(count, 0, len(line)):]
+		n -= count
+	}
+
+	return
+}
+
+// putRange puts a range of cells from the old line to the new line.
+// Returns whether the cursor is at the end of interval or somewhere in the
+// middle.
+func (s *Screen) putRange(oldLine, newLine Line, y, start, end int) (eoi bool) {
+	inline := min(len(ansi.CursorPosition(start+1, y+1)),
+		min(len(ansi.HorizontalPositionAbsolute(start+1)),
+			len(ansi.CursorForward(start+1))))
+	if (end - start + 1) > inline {
+		var j, same int
+		for j, same = start, 0; j <= end; j++ {
+			oldCell, newCell := oldLine.At(j), newLine.At(j)
+			if same == 0 && oldCell != nil && oldCell.Empty() {
+				continue
+			}
+			if cellEqual(oldCell, newCell) {
+				same++
+			} else {
+				if same > end-start {
+					s.emitRange(newLine[start:], j-same-start)
+					s.move(j, y)
+					start = j
+				}
+				same = 0
+			}
+		}
+
+		i := s.emitRange(newLine[start:], j-same-start)
+
+		// Always return 1 for the next [Screen.move] after a [Screen.putRange] if
+		// we found identical characters at end of interval.
+		if same == 0 {
+			return i
+		}
+		return true
+	}
+
+	return s.emitRange(newLine[start:], end-start+1)
+}
+
+// clearToEnd clears the screen from the current cursor position to the end of
+// line.
+func (s *Screen) clearToEnd(blank *Cell, force bool) { //nolint:unparam
+	if s.cur.Y >= 0 {
+		curline := s.curbuf.Line(s.cur.Y)
+		for j := s.cur.X; j < s.curbuf.Width(); j++ {
+			if j >= 0 {
+				c := curline.At(j)
+				if !cellEqual(c, blank) {
+					curline.Set(j, blank)
+					force = true
+				}
+			}
+		}
+	}
+
+	if force {
+		s.updatePen(blank)
+		count := s.newbuf.Width() - s.cur.X
+		if s.el0Cost() <= count {
+			s.buf.WriteString(ansi.EraseLineRight) //nolint:errcheck
+		} else {
+			for i := 0; i < count; i++ {
+				s.putCell(blank)
+			}
+		}
+	}
+}
+
+// clearBlank returns a blank cell based on the current cursor background color.
+func (s *Screen) clearBlank() *Cell {
+	c := BlankCell
+	if !s.cur.Style.Empty() || !s.cur.Link.Empty() {
+		c.Style = s.cur.Style
+		c.Link = s.cur.Link
+	}
+	return &c
+}
+
+// insertCells inserts the count cells pointed by the given line at the current
+// cursor position.
+func (s *Screen) insertCells(line Line, count int) {
+	if s.xtermLike {
+		// Use [ansi.ICH] as an optimization.
+		s.buf.WriteString(ansi.InsertCharacter(count)) //nolint:errcheck
+	} else {
+		// Otherwise, use [ansi.IRM] mode.
+		s.buf.WriteString(ansi.SetInsertReplaceMode) //nolint:errcheck
+	}
+
+	for i := 0; count > 0; i++ {
+		s.putAttrCell(line[i])
+		count--
+	}
+
+	if !s.xtermLike {
+		s.buf.WriteString(ansi.ResetInsertReplaceMode) //nolint:errcheck
+	}
+}
+
+// el0Cost returns the cost of using [ansi.EL] 0 i.e. [ansi.EraseLineRight]. If
+// this terminal supports background color erase, it can be cheaper to use
+// [ansi.EL] 0 i.e. [ansi.EraseLineRight] to clear
+// trailing spaces.
+func (s *Screen) el0Cost() int {
+	if s.xtermLike {
+		return 0
+	}
+	return len(ansi.EraseLineRight)
+}
+
+// transformLine transforms the given line in the current window to the
+// corresponding line in the new window. It uses [ansi.ICH] and [ansi.DCH] to
+// insert or delete characters.
+func (s *Screen) transformLine(y int) {
+	var firstCell, oLastCell, nLastCell int // first, old last, new last index
+	oldLine := s.curbuf.Line(y)
+	newLine := s.newbuf.Line(y)
+
+	// Find the first changed cell in the line
+	var lineChanged bool
+	for i := 0; i < s.newbuf.Width(); i++ {
+		if !cellEqual(newLine.At(i), oldLine.At(i)) {
+			lineChanged = true
+			break
+		}
+	}
+
+	const ceolStandoutGlitch = false
+	if ceolStandoutGlitch && lineChanged {
+		s.move(0, y)
+		s.clearToEnd(nil, false)
+		s.putRange(oldLine, newLine, y, 0, s.newbuf.Width()-1)
+	} else {
+		blank := newLine.At(0)
+
+		// It might be cheaper to clear leading spaces with [ansi.EL] 1 i.e.
+		// [ansi.EraseLineLeft].
+		if blank == nil || blank.Clear() {
+			var oFirstCell, nFirstCell int
+			for oFirstCell = 0; oFirstCell < s.curbuf.Width(); oFirstCell++ {
+				if !cellEqual(oldLine.At(oFirstCell), blank) {
+					break
+				}
+			}
+			for nFirstCell = 0; nFirstCell < s.newbuf.Width(); nFirstCell++ {
+				if !cellEqual(newLine.At(nFirstCell), blank) {
+					break
+				}
+			}
+
+			if nFirstCell == oFirstCell {
+				firstCell = nFirstCell
+
+				// Find the first differing cell
+				for firstCell < s.newbuf.Width() &&
+					cellEqual(oldLine.At(firstCell), newLine.At(firstCell)) {
+					firstCell++
+				}
+			} else if oFirstCell > nFirstCell {
+				firstCell = nFirstCell
+			} else if oFirstCell < nFirstCell {
+				firstCell = oFirstCell
+				el1Cost := len(ansi.EraseLineLeft)
+				if el1Cost < nFirstCell-oFirstCell {
+					if nFirstCell >= s.newbuf.Width() {
+						s.move(0, y)
+						s.updatePen(blank)
+						s.buf.WriteString(ansi.EraseLineRight) //nolint:errcheck
+					} else {
+						s.move(nFirstCell-1, y)
+						s.updatePen(blank)
+						s.buf.WriteString(ansi.EraseLineLeft) //nolint:errcheck
+					}
+
+					for firstCell < nFirstCell {
+						oldLine.Set(firstCell, blank)
+						firstCell++
+					}
+				}
+			}
+		} else {
+			// Find the first differing cell
+			for firstCell < s.newbuf.Width() && cellEqual(newLine.At(firstCell), oldLine.At(firstCell)) {
+				firstCell++
+			}
+		}
+
+		// If we didn't find one, we're done
+		if firstCell >= s.newbuf.Width() {
+			return
+		}
+
+		blank = newLine.At(s.newbuf.Width() - 1)
+		if blank != nil && !blank.Clear() {
+			// Find the last differing cell
+			nLastCell = s.newbuf.Width() - 1
+			for nLastCell > firstCell && cellEqual(newLine.At(nLastCell), oldLine.At(nLastCell)) {
+				nLastCell--
+			}
+
+			if nLastCell >= firstCell {
+				s.move(firstCell, y)
+				s.putRange(oldLine, newLine, y, firstCell, nLastCell)
+				if firstCell < len(oldLine) && firstCell < len(newLine) {
+					copy(oldLine[firstCell:], newLine[firstCell:])
+				} else {
+					copy(oldLine, newLine)
+				}
+			}
+
+			return
+		}
+
+		// Find last non-blank cell in the old line.
+		oLastCell = s.curbuf.Width() - 1
+		for oLastCell > firstCell && cellEqual(oldLine.At(oLastCell), blank) {
+			oLastCell--
+		}
+
+		// Find last non-blank cell in the new line.
+		nLastCell = s.newbuf.Width() - 1
+		for nLastCell > firstCell && cellEqual(newLine.At(nLastCell), blank) {
+			nLastCell--
+		}
+
+		if nLastCell == firstCell && s.el0Cost() < oLastCell-nLastCell {
+			s.move(firstCell, y)
+			if !cellEqual(newLine.At(firstCell), blank) {
+				s.putCell(newLine.At(firstCell))
+			}
+			s.clearToEnd(blank, false)
+		} else if nLastCell != oLastCell &&
+			!cellEqual(newLine.At(nLastCell), oldLine.At(oLastCell)) {
+			s.move(firstCell, y)
+			if oLastCell-nLastCell > s.el0Cost() {
+				if s.putRange(oldLine, newLine, y, firstCell, nLastCell) {
+					s.move(nLastCell+1, y)
+				}
+				s.clearToEnd(blank, false)
+			} else {
+				n := max(nLastCell, oLastCell)
+				s.putRange(oldLine, newLine, y, firstCell, n)
+			}
+		} else {
+			nLastNonBlank := nLastCell
+			oLastNonBlank := oLastCell
+
+			// Find the last cells that really differ.
+			// Can be -1 if no cells differ.
+			for cellEqual(newLine.At(nLastCell), oldLine.At(oLastCell)) {
+				if !cellEqual(newLine.At(nLastCell-1), oldLine.At(oLastCell-1)) {
+					break
+				}
+				nLastCell--
+				oLastCell--
+				if nLastCell == -1 || oLastCell == -1 {
+					break
+				}
+			}
+
+			n := min(oLastCell, nLastCell)
+			if n >= firstCell {
+				s.move(firstCell, y)
+				s.putRange(oldLine, newLine, y, firstCell, n)
+			}
+
+			if oLastCell < nLastCell {
+				m := max(nLastNonBlank, oLastNonBlank)
+				if n != 0 {
+					for n > 0 {
+						wide := newLine.At(n + 1)
+						if wide == nil || !wide.Empty() {
+							break
+						}
+						n--
+						oLastCell--
+					}
+				} else if n >= firstCell && newLine.At(n) != nil && newLine.At(n).Width > 1 {
+					next := newLine.At(n + 1)
+					for next != nil && next.Empty() {
+						n++
+						oLastCell++
+					}
+				}
+
+				s.move(n+1, y)
+				ichCost := 3 + nLastCell - oLastCell
+				if s.xtermLike && (nLastCell < nLastNonBlank || ichCost > (m-n)) {
+					s.putRange(oldLine, newLine, y, n+1, m)
+				} else {
+					s.insertCells(newLine[n+1:], nLastCell-oLastCell)
+				}
+			} else if oLastCell > nLastCell {
+				s.move(n+1, y)
+				dchCost := 3 + oLastCell - nLastCell
+				if dchCost > len(ansi.EraseLineRight)+nLastNonBlank-(n+1) {
+					if s.putRange(oldLine, newLine, y, n+1, nLastNonBlank) {
+						s.move(nLastNonBlank+1, y)
+					}
+					s.clearToEnd(blank, false)
+				} else {
+					s.updatePen(blank)
+					s.deleteCells(oLastCell - nLastCell)
+				}
+			}
+		}
+	}
+
+	// Update the old line with the new line
+	if firstCell < len(oldLine) && firstCell < len(newLine) {
+		copy(oldLine[firstCell:], newLine[firstCell:])
+	} else {
+		copy(oldLine, newLine)
+	}
+}
+
+// deleteCells deletes the count cells at the current cursor position and moves
+// the rest of the line to the left. This is equivalent to [ansi.DCH].
+func (s *Screen) deleteCells(count int) {
+	// [ansi.DCH] will shift in cells from the right margin so we need to
+	// ensure that they are the right style.
+	s.buf.WriteString(ansi.DeleteCharacter(count)) //nolint:errcheck
+}
+
+// clearToBottom clears the screen from the current cursor position to the end
+// of the screen.
+func (s *Screen) clearToBottom(blank *Cell) {
+	row, col := s.cur.Y, s.cur.X
+	if row < 0 {
+		row = 0
+	}
+
+	s.updatePen(blank)
+	s.buf.WriteString(ansi.EraseScreenBelow) //nolint:errcheck
+	// Clear the rest of the current line
+	s.curbuf.ClearRect(Rect(col, row, s.curbuf.Width()-col, 1))
+	// Clear everything below the current line
+	s.curbuf.ClearRect(Rect(0, row+1, s.curbuf.Width(), s.curbuf.Height()-row-1))
+}
+
+// clearBottom tests if clearing the end of the screen would satisfy part of
+// the screen update. Scan backwards through lines in the screen checking if
+// each is blank and one or more are changed.
+// It returns the top line.
+func (s *Screen) clearBottom(total int) (top int) {
+	if total <= 0 {
+		return
+	}
+
+	top = total
+	last := s.newbuf.Width()
+	blank := s.clearBlank()
+	canClearWithBlank := blank == nil || blank.Clear()
+
+	if canClearWithBlank {
+		var row int
+		for row = total - 1; row >= 0; row-- {
+			oldLine := s.curbuf.Line(row)
+			newLine := s.newbuf.Line(row)
+
+			var col int
+			ok := true
+			for col = 0; ok && col < last; col++ {
+				ok = cellEqual(newLine.At(col), blank)
+			}
+			if !ok {
+				break
+			}
+
+			for col = 0; ok && col < last; col++ {
+				ok = len(oldLine) == last && cellEqual(oldLine.At(col), blank)
+			}
+			if !ok {
+				top = row
+			}
+		}
+
+		if top < total {
+			s.move(0, top-1) // top is 1-based
+			s.clearToBottom(blank)
+			if s.oldhash != nil && s.newhash != nil &&
+				row < len(s.oldhash) && row < len(s.newhash) {
+				for row := top; row < s.newbuf.Height(); row++ {
+					s.oldhash[row] = s.newhash[row]
+				}
+			}
+		}
+	}
+
+	return
+}
+
+// clearScreen clears the screen and put cursor at home.
+func (s *Screen) clearScreen(blank *Cell) {
+	s.updatePen(blank)
+	s.buf.WriteString(ansi.CursorHomePosition) //nolint:errcheck
+	s.buf.WriteString(ansi.EraseEntireScreen)  //nolint:errcheck
+	s.cur.X, s.cur.Y = 0, 0
+	s.curbuf.Fill(blank)
+}
+
+// clearBelow clears everything below and including the row.
+func (s *Screen) clearBelow(blank *Cell, row int) {
+	s.move(0, row)
+	s.clearToBottom(blank)
+}
+
+// clearUpdate forces a screen redraw.
+func (s *Screen) clearUpdate() {
+	blank := s.clearBlank()
+	var nonEmpty int
+	if s.opts.AltScreen {
+		// XXX: We're using the maximum height of the two buffers to ensure
+		// we write newly added lines to the screen in [Screen.transformLine].
+		nonEmpty = max(s.curbuf.Height(), s.newbuf.Height())
+		s.clearScreen(blank)
+	} else {
+		nonEmpty = s.newbuf.Height()
+		s.clearBelow(blank, 0)
+	}
+	nonEmpty = s.clearBottom(nonEmpty)
+	for i := 0; i < nonEmpty; i++ {
+		s.transformLine(i)
+	}
+}
+
+// Flush flushes the buffer to the screen.
+func (s *Screen) Flush() (err error) {
+	s.mu.Lock()
+	defer s.mu.Unlock()
+	return s.flush()
+}
+
+func (s *Screen) flush() (err error) {
+	// Write the buffer
+	if s.buf.Len() > 0 {
+		_, err = s.w.Write(s.buf.Bytes()) //nolint:errcheck
+		if err == nil {
+			s.buf.Reset()
+		}
+	}
+
+	return
+}
+
+// Render renders changes of the screen to the internal buffer. Call
+// [Screen.Flush] to flush pending changes to the screen.
+func (s *Screen) Render() {
+	s.mu.Lock()
+	s.render()
+	s.mu.Unlock()
+}
+
+func (s *Screen) render() {
+	// Do we need to render anything?
+	if s.opts.AltScreen == s.altScreenMode &&
+		!s.opts.ShowCursor == s.cursorHidden &&
+		!s.clear &&
+		len(s.touch) == 0 &&
+		len(s.queueAbove) == 0 {
+		return
+	}
+
+	// TODO: Investigate whether this is necessary. Theoretically, terminals
+	// can add/remove tab stops and we should be able to handle that. We could
+	// use [ansi.DECTABSR] to read the tab stops, but that's not implemented in
+	// most terminals :/
+	// // Are we using hard tabs? If so, ensure tabs are using the
+	// // default interval using [ansi.DECST8C].
+	// if s.opts.HardTabs && !s.initTabs {
+	// 	s.buf.WriteString(ansi.SetTabEvery8Columns)
+	// 	s.initTabs = true
+	// }
+
+	// Do we need alt-screen mode?
+	if s.opts.AltScreen != s.altScreenMode {
+		if s.opts.AltScreen {
+			s.buf.WriteString(ansi.SetAltScreenSaveCursorMode)
+		} else {
+			s.buf.WriteString(ansi.ResetAltScreenSaveCursorMode)
+		}
+		s.altScreenMode = s.opts.AltScreen
+	}
+
+	// Do we need text cursor mode?
+	if !s.opts.ShowCursor != s.cursorHidden {
+		s.cursorHidden = !s.opts.ShowCursor
+		if s.cursorHidden {
+			s.buf.WriteString(ansi.HideCursor)
+		}
+	}
+
+	// Do we have queued strings to write above the screen?
+	if len(s.queueAbove) > 0 {
+		// TODO: Use scrolling region if available.
+		// TODO: Use [Screen.Write] [io.Writer] interface.
+
+		// We need to scroll the screen up by the number of lines in the queue.
+		// We can't use [ansi.SU] because we want the cursor to move down until
+		// it reaches the bottom of the screen.
+		s.move(0, s.newbuf.Height()-1)
+		s.buf.WriteString(strings.Repeat("\n", len(s.queueAbove)))
+		s.cur.Y += len(s.queueAbove)
+		// XXX: Now go to the top of the screen, insert new lines, and write
+		// the queued strings. It is important to use [Screen.moveCursor]
+		// instead of [Screen.move] because we don't want to perform any checks
+		// on the cursor position.
+		s.moveCursor(0, 0, false)
+		s.buf.WriteString(ansi.InsertLine(len(s.queueAbove)))
+		for _, line := range s.queueAbove {
+			s.buf.WriteString(line + "\r\n")
+		}
+
+		// Clear the queue
+		s.queueAbove = s.queueAbove[:0]
+	}
+
+	var nonEmpty int
+
+	// XXX: In inline mode, after a screen resize, we need to clear the extra
+	// lines at the bottom of the screen. This is because in inline mode, we
+	// don't use the full screen height and the current buffer size might be
+	// larger than the new buffer size.
+	partialClear := !s.opts.AltScreen && s.cur.X != -1 && s.cur.Y != -1 &&
+		s.curbuf.Width() == s.newbuf.Width() &&
+		s.curbuf.Height() > 0 &&
+		s.curbuf.Height() > s.newbuf.Height()
+
+	if !s.clear && partialClear {
+		s.clearBelow(nil, s.newbuf.Height()-1)
+	}
+
+	if s.clear {
+		s.clearUpdate()
+		s.clear = false
+	} else if len(s.touch) > 0 {
+		if s.opts.AltScreen {
+			// Optimize scrolling for the alternate screen buffer.
+			// TODO: Should we optimize for inline mode as well? If so, we need
+			// to know the actual cursor position to use [ansi.DECSTBM].
+			s.scrollOptimize()
+		}
+
+		var changedLines int
+		var i int
+
+		if s.opts.AltScreen {
+			nonEmpty = min(s.curbuf.Height(), s.newbuf.Height())
+		} else {
+			nonEmpty = s.newbuf.Height()
+		}
+
+		nonEmpty = s.clearBottom(nonEmpty)
+		for i = 0; i < nonEmpty; i++ {
+			_, ok := s.touch[i]
+			if ok {
+				s.transformLine(i)
+				changedLines++
+			}
+		}
+	}
+
+	// Sync windows and screen
+	s.touch = make(map[int]lineData, s.newbuf.Height())
+
+	if s.curbuf.Width() != s.newbuf.Width() || s.curbuf.Height() != s.newbuf.Height() {
+		// Resize the old buffer to match the new buffer.
+		_, oldh := s.curbuf.Width(), s.curbuf.Height()
+		s.curbuf.Resize(s.newbuf.Width(), s.newbuf.Height())
+		// Sync new lines to old lines
+		for i := oldh - 1; i < s.newbuf.Height(); i++ {
+			copy(s.curbuf.Line(i), s.newbuf.Line(i))
+		}
+	}
+
+	s.updatePen(nil) // nil indicates a blank cell with no styles
+
+	// Do we have enough changes to justify toggling the cursor?
+	if s.buf.Len() > 1 && s.opts.ShowCursor && !s.cursorHidden && s.queuedText {
+		nb := new(bytes.Buffer)
+		nb.Grow(s.buf.Len() + len(ansi.HideCursor) + len(ansi.ShowCursor))
+		nb.WriteString(ansi.HideCursor)
+		nb.Write(s.buf.Bytes())
+		nb.WriteString(ansi.ShowCursor)
+		*s.buf = *nb
+	}
+
+	s.queuedText = false
+}
+
+// Close writes the final screen update and resets the screen.
+func (s *Screen) Close() (err error) {
+	s.mu.Lock()
+	defer s.mu.Unlock()
+
+	s.render()
+	s.updatePen(nil)
+	// Go to the bottom of the screen
+	s.move(0, s.newbuf.Height()-1)
+
+	if s.altScreenMode {
+		s.buf.WriteString(ansi.ResetAltScreenSaveCursorMode)
+		s.altScreenMode = false
+	}
+
+	if s.cursorHidden {
+		s.buf.WriteString(ansi.ShowCursor)
+		s.cursorHidden = false
+	}
+
+	// Write the buffer
+	err = s.flush()
+	if err != nil {
+		return
+	}
+
+	s.reset()
+	return
+}
+
+// reset resets the screen to its initial state.
+func (s *Screen) reset() {
+	s.scrollHeight = 0
+	s.cursorHidden = false
+	s.altScreenMode = false
+	s.touch = make(map[int]lineData, s.newbuf.Height())
+	if s.curbuf != nil {
+		s.curbuf.Clear()
+	}
+	if s.newbuf != nil {
+		s.newbuf.Clear()
+	}
+	s.buf.Reset()
+	s.tabs = DefaultTabStops(s.newbuf.Width())
+	s.oldhash, s.newhash = nil, nil
+
+	// We always disable HardTabs when termtype is "linux".
+	if strings.HasPrefix(s.opts.Term, "linux") {
+		s.opts.HardTabs = false
+	}
+}
+
+// Resize resizes the screen.
+func (s *Screen) Resize(width, height int) bool {
+	oldw := s.newbuf.Width()
+	oldh := s.newbuf.Height()
+
+	if s.opts.AltScreen || width != oldw {
+		// We only clear the whole screen if the width changes. Adding/removing
+		// rows is handled by the [Screen.render] and [Screen.transformLine]
+		// methods.
+		s.clear = true
+	}
+
+	// Clear new columns and lines
+	if width > oldh {
+		s.ClearRect(Rect(max(oldw-1, 0), 0, width-oldw, height))
+	} else if width < oldw {
+		s.ClearRect(Rect(max(width-1, 0), 0, oldw-width, height))
+	}
+
+	if height > oldh {
+		s.ClearRect(Rect(0, max(oldh-1, 0), width, height-oldh))
+	} else if height < oldh {
+		s.ClearRect(Rect(0, max(height-1, 0), width, oldh-height))
+	}
+
+	s.mu.Lock()
+	s.newbuf.Resize(width, height)
+	s.tabs.Resize(width)
+	s.oldhash, s.newhash = nil, nil
+	s.scrollHeight = 0 // reset scroll lines
+	s.mu.Unlock()
+
+	return true
+}
+
+// MoveTo moves the cursor to the given position.
+func (s *Screen) MoveTo(x, y int) {
+	s.mu.Lock()
+	s.move(x, y)
+	s.mu.Unlock()
+}
+
+// InsertAbove inserts string above the screen. The inserted string is not
+// managed by the screen. This does nothing when alternate screen mode is
+// enabled.
+func (s *Screen) InsertAbove(str string) {
+	if s.opts.AltScreen {
+		return
+	}
+	s.mu.Lock()
+	for _, line := range strings.Split(str, "\n") {
+		s.queueAbove = append(s.queueAbove, s.method.Truncate(line, s.Width(), ""))
+	}
+	s.mu.Unlock()
+}
diff --git a/source/vendor/github.com/charmbracelet/x/cellbuf/sequence.go b/source/vendor/github.com/charmbracelet/x/cellbuf/sequence.go
new file mode 100644
index 0000000..613eefe
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/cellbuf/sequence.go
@@ -0,0 +1,131 @@
+package cellbuf
+
+import (
+	"bytes"
+	"image/color"
+
+	"github.com/charmbracelet/x/ansi"
+)
+
+// ReadStyle reads a Select Graphic Rendition (SGR) escape sequences from a
+// list of parameters.
+func ReadStyle(params ansi.Params, pen *Style) {
+	if len(params) == 0 {
+		pen.Reset()
+		return
+	}
+
+	for i := 0; i < len(params); i++ {
+		param, hasMore, _ := params.Param(i, 0)
+		switch param {
+		case 0: // Reset
+			pen.Reset()
+		case 1: // Bold
+			pen.Bold(true)
+		case 2: // Dim/Faint
+			pen.Faint(true)
+		case 3: // Italic
+			pen.Italic(true)
+		case 4: // Underline
+			nextParam, _, ok := params.Param(i+1, 0)
+			if hasMore && ok { // Only accept subparameters i.e. separated by ":"
+				switch nextParam {
+				case 0, 1, 2, 3, 4, 5:
+					i++
+					switch nextParam {
+					case 0: // No Underline
+						pen.UnderlineStyle(NoUnderline)
+					case 1: // Single Underline
+						pen.UnderlineStyle(SingleUnderline)
+					case 2: // Double Underline
+						pen.UnderlineStyle(DoubleUnderline)
+					case 3: // Curly Underline
+						pen.UnderlineStyle(CurlyUnderline)
+					case 4: // Dotted Underline
+						pen.UnderlineStyle(DottedUnderline)
+					case 5: // Dashed Underline
+						pen.UnderlineStyle(DashedUnderline)
+					}
+				}
+			} else {
+				// Single Underline
+				pen.Underline(true)
+			}
+		case 5: // Slow Blink
+			pen.SlowBlink(true)
+		case 6: // Rapid Blink
+			pen.RapidBlink(true)
+		case 7: // Reverse
+			pen.Reverse(true)
+		case 8: // Conceal
+			pen.Conceal(true)
+		case 9: // Crossed-out/Strikethrough
+			pen.Strikethrough(true)
+		case 22: // Normal Intensity (not bold or faint)
+			pen.Bold(false).Faint(false)
+		case 23: // Not italic, not Fraktur
+			pen.Italic(false)
+		case 24: // Not underlined
+			pen.Underline(false)
+		case 25: // Blink off
+			pen.SlowBlink(false).RapidBlink(false)
+		case 27: // Positive (not reverse)
+			pen.Reverse(false)
+		case 28: // Reveal
+			pen.Conceal(false)
+		case 29: // Not crossed out
+			pen.Strikethrough(false)
+		case 30, 31, 32, 33, 34, 35, 36, 37: // Set foreground
+			pen.Foreground(ansi.Black + ansi.BasicColor(param-30)) //nolint:gosec
+		case 38: // Set foreground 256 or truecolor
+			var c color.Color
+			n := ReadStyleColor(params[i:], &c)
+			if n > 0 {
+				pen.Foreground(c)
+				i += n - 1
+			}
+		case 39: // Default foreground
+			pen.Foreground(nil)
+		case 40, 41, 42, 43, 44, 45, 46, 47: // Set background
+			pen.Background(ansi.Black + ansi.BasicColor(param-40)) //nolint:gosec
+		case 48: // Set background 256 or truecolor
+			var c color.Color
+			n := ReadStyleColor(params[i:], &c)
+			if n > 0 {
+				pen.Background(c)
+				i += n - 1
+			}
+		case 49: // Default Background
+			pen.Background(nil)
+		case 58: // Set underline color
+			var c color.Color
+			n := ReadStyleColor(params[i:], &c)
+			if n > 0 {
+				pen.UnderlineColor(c)
+				i += n - 1
+			}
+		case 59: // Default underline color
+			pen.UnderlineColor(nil)
+		case 90, 91, 92, 93, 94, 95, 96, 97: // Set bright foreground
+			pen.Foreground(ansi.BrightBlack + ansi.BasicColor(param-90)) //nolint:gosec
+		case 100, 101, 102, 103, 104, 105, 106, 107: // Set bright background
+			pen.Background(ansi.BrightBlack + ansi.BasicColor(param-100)) //nolint:gosec
+		}
+	}
+}
+
+// ReadLink reads a hyperlink escape sequence from a data buffer.
+func ReadLink(p []byte, link *Link) {
+	params := bytes.Split(p, []byte{';'})
+	if len(params) != 3 {
+		return
+	}
+	link.Params = string(params[1])
+	link.URL = string(params[2])
+}
+
+// ReadStyleColor reads a color from a list of parameters.
+// See [ansi.ReadStyleColor] for more information.
+func ReadStyleColor(params ansi.Params, c *color.Color) int {
+	return ansi.ReadStyleColor(params, c)
+}
diff --git a/source/vendor/github.com/charmbracelet/x/cellbuf/style.go b/source/vendor/github.com/charmbracelet/x/cellbuf/style.go
new file mode 100644
index 0000000..82c4afb
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/cellbuf/style.go
@@ -0,0 +1,31 @@
+package cellbuf
+
+import (
+	"github.com/charmbracelet/colorprofile"
+)
+
+// Convert converts a style to respect the given color profile.
+func ConvertStyle(s Style, p colorprofile.Profile) Style {
+	switch p {
+	case colorprofile.TrueColor:
+		return s
+	case colorprofile.Ascii:
+		s.Fg = nil
+		s.Bg = nil
+		s.Ul = nil
+	case colorprofile.NoTTY:
+		return Style{}
+	}
+
+	if s.Fg != nil {
+		s.Fg = p.Convert(s.Fg)
+	}
+	if s.Bg != nil {
+		s.Bg = p.Convert(s.Bg)
+	}
+	if s.Ul != nil {
+		s.Ul = p.Convert(s.Ul)
+	}
+
+	return s
+}
diff --git a/source/vendor/github.com/charmbracelet/x/cellbuf/tabstop.go b/source/vendor/github.com/charmbracelet/x/cellbuf/tabstop.go
new file mode 100644
index 0000000..24eec44
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/cellbuf/tabstop.go
@@ -0,0 +1,137 @@
+package cellbuf
+
+// DefaultTabInterval is the default tab interval.
+const DefaultTabInterval = 8
+
+// TabStops represents horizontal line tab stops.
+type TabStops struct {
+	stops    []int
+	interval int
+	width    int
+}
+
+// NewTabStops creates a new set of tab stops from a number of columns and an
+// interval.
+func NewTabStops(width, interval int) *TabStops {
+	ts := new(TabStops)
+	ts.interval = interval
+	ts.width = width
+	ts.stops = make([]int, (width+(interval-1))/interval)
+	ts.init(0, width)
+	return ts
+}
+
+// DefaultTabStops creates a new set of tab stops with the default interval.
+func DefaultTabStops(cols int) *TabStops {
+	return NewTabStops(cols, DefaultTabInterval)
+}
+
+// Resize resizes the tab stops to the given width.
+func (ts *TabStops) Resize(width int) {
+	if width == ts.width {
+		return
+	}
+
+	if width < ts.width {
+		size := (width + (ts.interval - 1)) / ts.interval
+		ts.stops = ts.stops[:size]
+	} else {
+		size := (width - ts.width + (ts.interval - 1)) / ts.interval
+		ts.stops = append(ts.stops, make([]int, size)...)
+	}
+
+	ts.init(ts.width, width)
+	ts.width = width
+}
+
+// IsStop returns true if the given column is a tab stop.
+func (ts TabStops) IsStop(col int) bool {
+	mask := ts.mask(col)
+	i := col >> 3
+	if i < 0 || i >= len(ts.stops) {
+		return false
+	}
+	return ts.stops[i]&mask != 0
+}
+
+// Next returns the next tab stop after the given column.
+func (ts TabStops) Next(col int) int {
+	return ts.Find(col, 1)
+}
+
+// Prev returns the previous tab stop before the given column.
+func (ts TabStops) Prev(col int) int {
+	return ts.Find(col, -1)
+}
+
+// Find returns the prev/next tab stop before/after the given column and delta.
+// If delta is positive, it returns the next tab stop after the given column.
+// If delta is negative, it returns the previous tab stop before the given column.
+// If delta is zero, it returns the given column.
+func (ts TabStops) Find(col, delta int) int {
+	if delta == 0 {
+		return col
+	}
+
+	var prev bool
+	count := delta
+	if count < 0 {
+		count = -count
+		prev = true
+	}
+
+	for count > 0 {
+		if !prev {
+			if col >= ts.width-1 {
+				return col
+			}
+
+			col++
+		} else {
+			if col < 1 {
+				return col
+			}
+
+			col--
+		}
+
+		if ts.IsStop(col) {
+			count--
+		}
+	}
+
+	return col
+}
+
+// Set adds a tab stop at the given column.
+func (ts *TabStops) Set(col int) {
+	mask := ts.mask(col)
+	ts.stops[col>>3] |= mask
+}
+
+// Reset removes the tab stop at the given column.
+func (ts *TabStops) Reset(col int) {
+	mask := ts.mask(col)
+	ts.stops[col>>3] &= ^mask
+}
+
+// Clear removes all tab stops.
+func (ts *TabStops) Clear() {
+	ts.stops = make([]int, len(ts.stops))
+}
+
+// mask returns the mask for the given column.
+func (ts *TabStops) mask(col int) int {
+	return 1 << (col & (ts.interval - 1))
+}
+
+// init initializes the tab stops starting from col until width.
+func (ts *TabStops) init(col, width int) {
+	for x := col; x < width; x++ {
+		if x%ts.interval == 0 {
+			ts.Set(x)
+		} else {
+			ts.Reset(x)
+		}
+	}
+}
diff --git a/source/vendor/github.com/charmbracelet/x/cellbuf/utils.go b/source/vendor/github.com/charmbracelet/x/cellbuf/utils.go
new file mode 100644
index 0000000..b0452fa
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/cellbuf/utils.go
@@ -0,0 +1,38 @@
+package cellbuf
+
+import (
+	"strings"
+)
+
+// Height returns the height of a string.
+func Height(s string) int {
+	return strings.Count(s, "\n") + 1
+}
+
+func min(a, b int) int { //nolint:predeclared
+	if a > b {
+		return b
+	}
+	return a
+}
+
+func max(a, b int) int { //nolint:predeclared
+	if a > b {
+		return a
+	}
+	return b
+}
+
+func clamp(v, low, high int) int {
+	if high < low {
+		low, high = high, low
+	}
+	return min(high, max(low, v))
+}
+
+func abs(a int) int {
+	if a < 0 {
+		return -a
+	}
+	return a
+}
diff --git a/source/vendor/github.com/charmbracelet/x/cellbuf/wrap.go b/source/vendor/github.com/charmbracelet/x/cellbuf/wrap.go
new file mode 100644
index 0000000..f89f52f
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/cellbuf/wrap.go
@@ -0,0 +1,185 @@
+package cellbuf
+
+import (
+	"bytes"
+	"unicode"
+	"unicode/utf8"
+
+	"github.com/charmbracelet/x/ansi"
+)
+
+const nbsp = '\u00a0'
+
+// Wrap returns a string that is wrapped to the specified limit applying any
+// ANSI escape sequences in the string. It tries to wrap the string at word
+// boundaries, but will break words if necessary.
+//
+// The breakpoints string is a list of characters that are considered
+// breakpoints for word wrapping. A hyphen (-) is always considered a
+// breakpoint.
+//
+// Note: breakpoints must be a string of 1-cell wide rune characters.
+func Wrap(s string, limit int, breakpoints string) string {
+	if len(s) == 0 {
+		return ""
+	}
+
+	if limit < 1 {
+		return s
+	}
+
+	p := ansi.GetParser()
+	defer ansi.PutParser(p)
+
+	var (
+		buf             bytes.Buffer
+		word            bytes.Buffer
+		space           bytes.Buffer
+		style, curStyle Style
+		link, curLink   Link
+		curWidth        int
+		wordLen         int
+	)
+
+	hasBlankStyle := func() bool {
+		// Only follow reverse attribute, bg color and underline style
+		return !style.Attrs.Contains(ReverseAttr) && style.Bg == nil && style.UlStyle == NoUnderline
+	}
+
+	addSpace := func() {
+		curWidth += space.Len()
+		buf.Write(space.Bytes())
+		space.Reset()
+	}
+
+	addWord := func() {
+		if word.Len() == 0 {
+			return
+		}
+
+		curLink = link
+		curStyle = style
+
+		addSpace()
+		curWidth += wordLen
+		buf.Write(word.Bytes())
+		word.Reset()
+		wordLen = 0
+	}
+
+	addNewline := func() {
+		if !curStyle.Empty() {
+			buf.WriteString(ansi.ResetStyle)
+		}
+		if !curLink.Empty() {
+			buf.WriteString(ansi.ResetHyperlink())
+		}
+		buf.WriteByte('\n')
+		if !curLink.Empty() {
+			buf.WriteString(ansi.SetHyperlink(curLink.URL, curLink.Params))
+		}
+		if !curStyle.Empty() {
+			buf.WriteString(curStyle.Sequence())
+		}
+		curWidth = 0
+		space.Reset()
+	}
+
+	var state byte
+	for len(s) > 0 {
+		seq, width, n, newState := ansi.DecodeSequence(s, state, p)
+		switch width {
+		case 0:
+			if ansi.Equal(seq, "\t") {
+				addWord()
+				space.WriteString(seq)
+				break
+			} else if ansi.Equal(seq, "\n") {
+				if wordLen == 0 {
+					if curWidth+space.Len() > limit {
+						curWidth = 0
+					} else {
+						// preserve whitespaces
+						buf.Write(space.Bytes())
+					}
+					space.Reset()
+				}
+
+				addWord()
+				addNewline()
+				break
+			} else if ansi.HasCsiPrefix(seq) && p.Command() == 'm' {
+				// SGR style sequence [ansi.SGR]
+				ReadStyle(p.Params(), &style)
+			} else if ansi.HasOscPrefix(seq) && p.Command() == 8 {
+				// Hyperlink sequence [ansi.SetHyperlink]
+				ReadLink(p.Data(), &link)
+			}
+
+			word.WriteString(seq)
+		default:
+			if len(seq) == 1 {
+				// ASCII
+				r, _ := utf8.DecodeRuneInString(seq)
+				if r != nbsp && unicode.IsSpace(r) && hasBlankStyle() {
+					addWord()
+					space.WriteRune(r)
+					break
+				} else if r == '-' || runeContainsAny(r, breakpoints) {
+					addSpace()
+					if curWidth+wordLen+width <= limit {
+						addWord()
+						buf.WriteString(seq)
+						curWidth += width
+						break
+					}
+				}
+			}
+
+			if wordLen+width > limit {
+				// Hardwrap the word if it's too long
+				addWord()
+			}
+
+			word.WriteString(seq)
+			wordLen += width
+
+			if curWidth+wordLen+space.Len() > limit {
+				addNewline()
+			}
+		}
+
+		s = s[n:]
+		state = newState
+	}
+
+	if wordLen == 0 {
+		if curWidth+space.Len() > limit {
+			curWidth = 0
+		} else {
+			// preserve whitespaces
+			buf.Write(space.Bytes())
+		}
+		space.Reset()
+	}
+
+	addWord()
+
+	if !curLink.Empty() {
+		buf.WriteString(ansi.ResetHyperlink())
+	}
+	if !curStyle.Empty() {
+		buf.WriteString(ansi.ResetStyle)
+	}
+
+	return buf.String()
+}
+
+func runeContainsAny[T string | []rune](r rune, s T) bool {
+	for _, c := range []rune(s) {
+		if c == r {
+			return true
+		}
+	}
+	return false
+}
diff --git a/source/vendor/github.com/charmbracelet/x/cellbuf/writer.go b/source/vendor/github.com/charmbracelet/x/cellbuf/writer.go
new file mode 100644
index 0000000..ae8b2a8
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/cellbuf/writer.go
@@ -0,0 +1,339 @@
+package cellbuf
+
+import (
+	"bytes"
+	"fmt"
+	"strings"
+
+	"github.com/charmbracelet/x/ansi"
+)
+
+// CellBuffer is a cell buffer that represents a set of cells in a screen or a
+// grid.
+type CellBuffer interface {
+	// Cell returns the cell at the given position.
+	Cell(x, y int) *Cell
+	// SetCell sets the cell at the given position to the given cell. It
+	// returns whether the cell was set successfully.
+	SetCell(x, y int, c *Cell) bool
+	// Bounds returns the bounds of the cell buffer.
+	Bounds() Rectangle
+}
+
+// FillRect fills the rectangle within the cell buffer with the given cell.
+// This will not fill cells outside the bounds of the cell buffer.
+func FillRect(s CellBuffer, c *Cell, rect Rectangle) {
+	for y := rect.Min.Y; y < rect.Max.Y; y++ {
+		for x := rect.Min.X; x < rect.Max.X; x++ {
+			s.SetCell(x, y, c) //nolint:errcheck
+		}
+	}
+}
+
+// Fill fills the cell buffer with the given cell.
+func Fill(s CellBuffer, c *Cell) {
+	FillRect(s, c, s.Bounds())
+}
+
+// ClearRect clears the rectangle within the cell buffer with blank cells.
+func ClearRect(s CellBuffer, rect Rectangle) {
+	FillRect(s, nil, rect)
+}
+
+// Clear clears the cell buffer with blank cells.
+func Clear(s CellBuffer) {
+	Fill(s, nil)
+}
+
+// SetContentRect clears the rectangle within the cell buffer with blank cells,
+// and sets the given string as its content. If the height or width of the
+// string exceeds the height or width of the cell buffer, it will be truncated.
+func SetContentRect(s CellBuffer, str string, rect Rectangle) {
+	// Replace all "\n" with "\r\n" to ensure the cursor is reset to the start
+	// of the line. Make sure we don't replace "\r\n" with "\r\r\n".
+	str = strings.ReplaceAll(str, "\r\n", "\n")
+	str = strings.ReplaceAll(str, "\n", "\r\n")
+	ClearRect(s, rect)
+	printString(s, ansi.GraphemeWidth, rect.Min.X, rect.Min.Y, rect, str, true, "")
+}
+
+// SetContent clears the cell buffer with blank cells, and sets the given string
+// as its content. If the height or width of the string exceeds the height or
+// width of the cell buffer, it will be truncated.
+func SetContent(s CellBuffer, str string) {
+	SetContentRect(s, str, s.Bounds())
+}
+
+// Render returns a string representation of the grid with ANSI escape sequences.
+func Render(d CellBuffer) string {
+	var buf bytes.Buffer
+	height := d.Bounds().Dy()
+	for y := 0; y < height; y++ {
+		_, line := RenderLine(d, y)
+		buf.WriteString(line)
+		if y < height-1 {
+			buf.WriteString("\r\n")
+		}
+	}
+	return buf.String()
+}
+
+// RenderLine returns a string representation of the yth line of the grid along
+// with the width of the line.
+func RenderLine(d CellBuffer, n int) (w int, line string) {
+	var pen Style
+	var link Link
+	var buf bytes.Buffer
+	var pendingLine string
+	var pendingWidth int // this ignores space cells until we hit a non-space cell
+
+	writePending := func() {
+		// If there's no pending line, we don't need to do anything.
+		if len(pendingLine) == 0 {
+			return
+		}
+		buf.WriteString(pendingLine)
+		w += pendingWidth
+		pendingWidth = 0
+		pendingLine = ""
+	}
+
+	for x := 0; x < d.Bounds().Dx(); x++ {
+		if cell := d.Cell(x, n); cell != nil && cell.Width > 0 {
+			// Convert the cell's style and link to the given color profile.
+			cellStyle := cell.Style
+			cellLink := cell.Link
+			if cellStyle.Empty() && !pen.Empty() {
+				writePending()
+				buf.WriteString(ansi.ResetStyle) //nolint:errcheck
+				pen.Reset()
+			}
+			if !cellStyle.Equal(&pen) {
+				writePending()
+				seq := cellStyle.DiffSequence(pen)
+				buf.WriteString(seq) // nolint:errcheck
+				pen = cellStyle
+			}
+
+			// Write the URL escape sequence
+			if cellLink != link && link.URL != "" {
+				writePending()
+				buf.WriteString(ansi.ResetHyperlink()) //nolint:errcheck
+				link.Reset()
+			}
+			if cellLink != link {
+				writePending()
+				buf.WriteString(ansi.SetHyperlink(cellLink.URL, cellLink.Params)) //nolint:errcheck
+				link = cellLink
+			}
+
+			// We only write the cell content if it's not empty. If it is, we
+			// append it to the pending line and width to be evaluated later.
+			if cell.Equal(&BlankCell) {
+				pendingLine += cell.String()
+				pendingWidth += cell.Width
+			} else {
+				writePending()
+				buf.WriteString(cell.String())
+				w += cell.Width
+			}
+		}
+	}
+	if link.URL != "" {
+		buf.WriteString(ansi.ResetHyperlink()) //nolint:errcheck
+	}
+	if !pen.Empty() {
+		buf.WriteString(ansi.ResetStyle) //nolint:errcheck
+	}
+	return w, strings.TrimRight(buf.String(), " ") // Trim trailing spaces
+}
+
+// ScreenWriter represents a writer that writes to a [Screen] parsing ANSI
+// escape sequences and Unicode characters and converting them into cells that
+// can be written to a cell [Buffer].
+type ScreenWriter struct {
+	*Screen
+}
+
+// NewScreenWriter creates a new ScreenWriter that writes to the given Screen.
+// This is a convenience function for creating a ScreenWriter.
+func NewScreenWriter(s *Screen) *ScreenWriter {
+	return &ScreenWriter{s}
+}
+
+// Write writes the given bytes to the screen.
+// This will recognize ANSI [ansi.SGR] style and [ansi.SetHyperlink] escape
+// sequences.
+func (s *ScreenWriter) Write(p []byte) (n int, err error) {
+	printString(s.Screen, s.method,
+		s.cur.X, s.cur.Y, s.Bounds(),
+		p, false, "")
+	return len(p), nil
+}
+
+// SetContent clears the screen with blank cells, and sets the given string as
+// its content. If the height or width of the string exceeds the height or
+// width of the screen, it will be truncated.
+//
+// This will recognize ANSI [ansi.SGR] style and [ansi.SetHyperlink] escape sequences.
+func (s *ScreenWriter) SetContent(str string) {
+	s.SetContentRect(str, s.Bounds())
+}
+
+// SetContentRect clears the rectangle within the screen with blank cells, and
+// sets the given string as its content. If the height or width of the string
+// exceeds the height or width of the screen, it will be truncated.
+//
+// This will recognize ANSI [ansi.SGR] style and [ansi.SetHyperlink] escape
+// sequences.
+func (s *ScreenWriter) SetContentRect(str string, rect Rectangle) {
+	// Replace all "\n" with "\r\n" to ensure the cursor is reset to the start
+	// of the line. Make sure we don't replace "\r\n" with "\r\r\n".
+	str = strings.ReplaceAll(str, "\r\n", "\n")
+	str = strings.ReplaceAll(str, "\n", "\r\n")
+	s.ClearRect(rect)
+	printString(s.Screen, s.method,
+		rect.Min.X, rect.Min.Y, rect,
+		str, true, "")
+}
+
+// Print prints the string at the current cursor position. It will wrap the
+// string to the width of the screen if it exceeds the width of the screen.
+// This will recognize ANSI [ansi.SGR] style and [ansi.SetHyperlink] escape
+// sequences.
+func (s *ScreenWriter) Print(str string, v ...interface{}) {
+	if len(v) > 0 {
+		str = fmt.Sprintf(str, v...)
+	}
+	printString(s.Screen, s.method,
+		s.cur.X, s.cur.Y, s.Bounds(),
+		str, false, "")
+}
+
+// PrintAt prints the string at the given position. It will wrap the string to
+// the width of the screen if it exceeds the width of the screen.
+// This will recognize ANSI [ansi.SGR] style and [ansi.SetHyperlink] escape
+// sequences.
+func (s *ScreenWriter) PrintAt(x, y int, str string, v ...interface{}) {
+	if len(v) > 0 {
+		str = fmt.Sprintf(str, v...)
+	}
+	printString(s.Screen, s.method,
+		x, y, s.Bounds(),
+		str, false, "")
+}
+
+// PrintCrop prints the string at the current cursor position and truncates the
+// text if it exceeds the width of the screen. Use tail to specify a string to
+// append if the string is truncated.
+// This will recognize ANSI [ansi.SGR] style and [ansi.SetHyperlink] escape
+// sequences.
+func (s *ScreenWriter) PrintCrop(str string, tail string) {
+	printString(s.Screen, s.method,
+		s.cur.X, s.cur.Y, s.Bounds(),
+		str, true, tail)
+}
+
+// PrintCropAt prints the string at the given position and truncates the text
+// if it exceeds the width of the screen. Use tail to specify a string to append
+// if the string is truncated.
+// This will recognize ANSI [ansi.SGR] style and [ansi.SetHyperlink] escape
+// sequences.
+func (s *ScreenWriter) PrintCropAt(x, y int, str string, tail string) {
+	printString(s.Screen, s.method,
+		x, y, s.Bounds(),
+		str, true, tail)
+}
+
+// printString draws a string starting at the given position.
+func printString[T []byte | string](
+	s CellBuffer,
+	m ansi.Method,
+	x, y int,
+	bounds Rectangle, str T,
+	truncate bool, tail string,
+) {
+	p := ansi.GetParser()
+	defer ansi.PutParser(p)
+
+	var tailc Cell
+	if truncate && len(tail) > 0 {
+		if m == ansi.WcWidth {
+			tailc = *NewCellString(tail)
+		} else {
+			tailc = *NewGraphemeCell(tail)
+		}
+	}
+
+	decoder := ansi.DecodeSequenceWc[T]
+	if m == ansi.GraphemeWidth {
+		decoder = ansi.DecodeSequence[T]
+	}
+
+	var cell Cell
+	var style Style
+	var link Link
+	var state byte
+	for len(str) > 0 {
+		seq, width, n, newState := decoder(str, state, p)
+
+		switch width {
+		case 1, 2, 3, 4: // wide cells can go up to 4 cells wide
+			cell.Width += width
+			cell.Append([]rune(string(seq))...)
+
+			if !truncate && x+cell.Width > bounds.Max.X && y+1 < bounds.Max.Y {
+				// Wrap the string to the width of the window
+				x = bounds.Min.X
+				y++
+			}
+			if Pos(x, y).In(bounds) {
+				if truncate && tailc.Width > 0 && x+cell.Width > bounds.Max.X-tailc.Width {
+					// Truncate the string and append the tail if any.
+					cell := tailc
+					cell.Style = style
+					cell.Link = link
+					s.SetCell(x, y, &cell)
+					x += tailc.Width
+				} else {
+					// Print the cell to the screen
+					cell.Style = style
+					cell.Link = link
+					s.SetCell(x, y, &cell) //nolint:errcheck
+					x += width
+				}
+			}
+
+			// String is too long for the line, truncate it.
+			// Make sure we reset the cell for the next iteration.
+			cell.Reset()
+		default:
+			// Valid sequences always have a non-zero Cmd.
+			// TODO: Handle cursor movement and other sequences
+			switch {
+			case ansi.HasCsiPrefix(seq) && p.Command() == 'm':
+				// SGR - Select Graphic Rendition
+				ReadStyle(p.Params(), &style)
+			case ansi.HasOscPrefix(seq) && p.Command() == 8:
+				// Hyperlinks
+				ReadLink(p.Data(), &link)
+			case ansi.Equal(seq, T("\n")):
+				y++
+			case ansi.Equal(seq, T("\r")):
+				x = bounds.Min.X
+			default:
+				cell.Append([]rune(string(seq))...)
+			}
+		}
+
+		// Advance the state and data
+		state = newState
+		str = str[n:]
+	}
+
+	// Make sure to set the last cell if it's not empty.
+	if !cell.Empty() {
+		s.SetCell(x, y, &cell) //nolint:errcheck
+		cell.Reset()
+	}
+}
diff --git a/source/vendor/github.com/charmbracelet/x/term/LICENSE b/source/vendor/github.com/charmbracelet/x/term/LICENSE
new file mode 100644
index 0000000..65a5654
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/term/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 Charmbracelet, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/source/vendor/github.com/charmbracelet/x/term/term.go b/source/vendor/github.com/charmbracelet/x/term/term.go
new file mode 100644
index 0000000..58d6522
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/term/term.go
@@ -0,0 +1,49 @@
+package term
+
+// State contains platform-specific state of a terminal.
+type State struct {
+	state
+}
+
+// IsTerminal returns whether the given file descriptor is a terminal.
+func IsTerminal(fd uintptr) bool {
+	return isTerminal(fd)
+}
+
+// MakeRaw puts the terminal connected to the given file descriptor into raw
+// mode and returns the previous state of the terminal so that it can be
+// restored.
+func MakeRaw(fd uintptr) (*State, error) {
+	return makeRaw(fd)
+}
+
+// GetState returns the current state of a terminal which may be useful to
+// restore the terminal after a signal.
+func GetState(fd uintptr) (*State, error) {
+	return getState(fd)
+}
+
+// SetState sets the given state of the terminal.
+func SetState(fd uintptr, state *State) error {
+	return setState(fd, state)
+}
+
+// Restore restores the terminal connected to the given file descriptor to a
+// previous state.
+func Restore(fd uintptr, oldState *State) error {
+	return restore(fd, oldState)
+}
+
+// GetSize returns the visible dimensions of the given terminal.
+//
+// These dimensions don't include any scrollback buffer height.
+func GetSize(fd uintptr) (width, height int, err error) {
+	return getSize(fd)
+}
+
+// ReadPassword reads a line of input from a terminal without local echo.  This
+// is commonly used for inputting passwords and other sensitive data. The slice
+// returned does not include the \n.
+func ReadPassword(fd uintptr) ([]byte, error) {
+	return readPassword(fd)
+}
diff --git a/source/vendor/github.com/charmbracelet/x/term/term_other.go b/source/vendor/github.com/charmbracelet/x/term/term_other.go
new file mode 100644
index 0000000..092c7e9
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/term/term_other.go
@@ -0,0 +1,39 @@
+//go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !zos && !windows && !solaris && !plan9
+// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!zos,!windows,!solaris,!plan9
+
+package term
+
+import (
+	"fmt"
+	"runtime"
+)
+
+type state struct{}
+
+func isTerminal(fd uintptr) bool {
+	return false
+}
+
+func makeRaw(fd uintptr) (*State, error) {
+	return nil, fmt.Errorf("terminal: MakeRaw not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
+}
+
+func getState(fd uintptr) (*State, error) {
+	return nil, fmt.Errorf("terminal: GetState not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
+}
+
+func restore(fd uintptr, state *State) error {
+	return fmt.Errorf("terminal: Restore not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
+}
+
+func getSize(fd uintptr) (width, height int, err error) {
+	return 0, 0, fmt.Errorf("terminal: GetSize not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
+}
+
+func setState(fd uintptr, state *State) error {
+	return fmt.Errorf("terminal: SetState not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
+}
+
+func readPassword(fd uintptr) ([]byte, error) {
+	return nil, fmt.Errorf("terminal: ReadPassword not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
+}
diff --git a/source/vendor/github.com/charmbracelet/x/term/term_unix.go b/source/vendor/github.com/charmbracelet/x/term/term_unix.go
new file mode 100644
index 0000000..1459cb1
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/term/term_unix.go
@@ -0,0 +1,96 @@
+//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos
+// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos
+
+package term
+
+import (
+	"golang.org/x/sys/unix"
+)
+
+type state struct {
+	unix.Termios
+}
+
+func isTerminal(fd uintptr) bool {
+	_, err := unix.IoctlGetTermios(int(fd), ioctlReadTermios)
+	return err == nil
+}
+
+func makeRaw(fd uintptr) (*State, error) {
+	termios, err := unix.IoctlGetTermios(int(fd), ioctlReadTermios)
+	if err != nil {
+		return nil, err
+	}
+
+	oldState := State{state{Termios: *termios}}
+
+	// This attempts to replicate the behaviour documented for cfmakeraw in
+	// the termios(3) manpage.
+	termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON
+	termios.Oflag &^= unix.OPOST
+	termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN
+	termios.Cflag &^= unix.CSIZE | unix.PARENB
+	termios.Cflag |= unix.CS8
+	termios.Cc[unix.VMIN] = 1
+	termios.Cc[unix.VTIME] = 0
+	if err := unix.IoctlSetTermios(int(fd), ioctlWriteTermios, termios); err != nil {
+		return nil, err
+	}
+
+	return &oldState, nil
+}
+
+func setState(fd uintptr, state *State) error {
+	var termios *unix.Termios
+	if state != nil {
+		termios = &state.Termios
+	}
+	return unix.IoctlSetTermios(int(fd), ioctlWriteTermios, termios)
+}
+
+func getState(fd uintptr) (*State, error) {
+	termios, err := unix.IoctlGetTermios(int(fd), ioctlReadTermios)
+	if err != nil {
+		return nil, err
+	}
+
+	return &State{state{Termios: *termios}}, nil
+}
+
+func restore(fd uintptr, state *State) error {
+	return unix.IoctlSetTermios(int(fd), ioctlWriteTermios, &state.Termios)
+}
+
+func getSize(fd uintptr) (width, height int, err error) {
+	ws, err := unix.IoctlGetWinsize(int(fd), unix.TIOCGWINSZ)
+	if err != nil {
+		return 0, 0, err
+	}
+	return int(ws.Col), int(ws.Row), nil
+}
+
+// passwordReader is an io.Reader that reads from a specific file descriptor.
+type passwordReader int
+
+func (r passwordReader) Read(buf []byte) (int, error) {
+	return unix.Read(int(r), buf)
+}
+
+func readPassword(fd uintptr) ([]byte, error) {
+	termios, err := unix.IoctlGetTermios(int(fd), ioctlReadTermios)
+	if err != nil {
+		return nil, err
+	}
+
+	newState := *termios
+	newState.Lflag &^= unix.ECHO
+	newState.Lflag |= unix.ICANON | unix.ISIG
+	newState.Iflag |= unix.ICRNL
+	if err := unix.IoctlSetTermios(int(fd), ioctlWriteTermios, &newState); err != nil {
+		return nil, err
+	}
+
+	defer unix.IoctlSetTermios(int(fd), ioctlWriteTermios, termios)
+
+	return readPasswordLine(passwordReader(fd))
+}
diff --git a/source/vendor/github.com/charmbracelet/x/term/term_unix_bsd.go b/source/vendor/github.com/charmbracelet/x/term/term_unix_bsd.go
new file mode 100644
index 0000000..b435031
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/term/term_unix_bsd.go
@@ -0,0 +1,11 @@
+//go:build darwin || dragonfly || freebsd || netbsd || openbsd
+// +build darwin dragonfly freebsd netbsd openbsd
+
+package term
+
+import "golang.org/x/sys/unix"
+
+const (
+	ioctlReadTermios  = unix.TIOCGETA
+	ioctlWriteTermios = unix.TIOCSETA
+)
diff --git a/source/vendor/github.com/charmbracelet/x/term/term_unix_other.go b/source/vendor/github.com/charmbracelet/x/term/term_unix_other.go
new file mode 100644
index 0000000..ee2a29e
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/term/term_unix_other.go
@@ -0,0 +1,11 @@
+//go:build aix || linux || solaris || zos
+// +build aix linux solaris zos
+
+package term
+
+import "golang.org/x/sys/unix"
+
+const (
+	ioctlReadTermios  = unix.TCGETS
+	ioctlWriteTermios = unix.TCSETS
+)
diff --git a/source/vendor/github.com/charmbracelet/x/term/term_windows.go b/source/vendor/github.com/charmbracelet/x/term/term_windows.go
new file mode 100644
index 0000000..fe7afde
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/term/term_windows.go
@@ -0,0 +1,87 @@
+//go:build windows
+// +build windows
+
+package term
+
+import (
+	"os"
+
+	"golang.org/x/sys/windows"
+)
+
+type state struct {
+	Mode uint32
+}
+
+func isTerminal(fd uintptr) bool {
+	var st uint32
+	err := windows.GetConsoleMode(windows.Handle(fd), &st)
+	return err == nil
+}
+
+func makeRaw(fd uintptr) (*State, error) {
+	var st uint32
+	if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil {
+		return nil, err
+	}
+	raw := st &^ (windows.ENABLE_ECHO_INPUT | windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT)
+	raw |= windows.ENABLE_VIRTUAL_TERMINAL_INPUT
+	if err := windows.SetConsoleMode(windows.Handle(fd), raw); err != nil {
+		return nil, err
+	}
+	return &State{state{st}}, nil
+}
+
+func setState(fd uintptr, state *State) error {
+	var mode uint32
+	if state != nil {
+		mode = state.Mode
+	}
+	return windows.SetConsoleMode(windows.Handle(fd), mode)
+}
+
+func getState(fd uintptr) (*State, error) {
+	var st uint32
+	if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil {
+		return nil, err
+	}
+	return &State{state{st}}, nil
+}
+
+func restore(fd uintptr, state *State) error {
+	return windows.SetConsoleMode(windows.Handle(fd), state.Mode)
+}
+
+func getSize(fd uintptr) (width, height int, err error) {
+	var info windows.ConsoleScreenBufferInfo
+	if err := windows.GetConsoleScreenBufferInfo(windows.Handle(fd), &info); err != nil {
+		return 0, 0, err
+	}
+	return int(info.Window.Right - info.Window.Left + 1), int(info.Window.Bottom - info.Window.Top + 1), nil
+}
+
+func readPassword(fd uintptr) ([]byte, error) {
+	var st uint32
+	if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil {
+		return nil, err
+	}
+	old := st
+
+	st &^= (windows.ENABLE_ECHO_INPUT | windows.ENABLE_LINE_INPUT)
+	st |= (windows.ENABLE_PROCESSED_OUTPUT | windows.ENABLE_PROCESSED_INPUT)
+	if err := windows.SetConsoleMode(windows.Handle(fd), st); err != nil {
+		return nil, err
+	}
+
+	defer windows.SetConsoleMode(windows.Handle(fd), old)
+
+	var h windows.Handle
+	p, _ := windows.GetCurrentProcess()
+	if err := windows.DuplicateHandle(p, windows.Handle(fd), p, &h, 0, false, windows.DUPLICATE_SAME_ACCESS); err != nil {
+		return nil, err
+	}
+
+	f := os.NewFile(uintptr(h), "stdin")
+	defer f.Close()
+	return readPasswordLine(f)
+}
diff --git a/source/vendor/github.com/charmbracelet/x/term/terminal.go b/source/vendor/github.com/charmbracelet/x/term/terminal.go
new file mode 100644
index 0000000..8963163
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/term/terminal.go
@@ -0,0 +1,12 @@
+package term
+
+import (
+	"io"
+)
+
+// File represents a file that has a file descriptor and can be read from,
+// written to, and closed.
+type File interface {
+	io.ReadWriteCloser
+	Fd() uintptr
+}
diff --git a/source/vendor/github.com/charmbracelet/x/term/util.go b/source/vendor/github.com/charmbracelet/x/term/util.go
new file mode 100644
index 0000000..b731341
--- /dev/null
+++ b/source/vendor/github.com/charmbracelet/x/term/util.go
@@ -0,0 +1,47 @@
+package term
+
+import (
+	"io"
+	"runtime"
+)
+
+// readPasswordLine reads from reader until it finds \n or io.EOF.
+// The slice returned does not include the \n.
+// readPasswordLine also ignores any \r it finds.
+// Windows uses \r as end of line. So, on Windows, readPasswordLine
+// reads until it finds \r and ignores any \n it finds during processing.
+func readPasswordLine(reader io.Reader) ([]byte, error) {
+	var buf [1]byte
+	var ret []byte
+
+	for {
+		n, err := reader.Read(buf[:])
+		if n > 0 {
+			switch buf[0] {
+			case '\b':
+				if len(ret) > 0 {
+					ret = ret[:len(ret)-1]
+				}
+			case '\n':
+				if runtime.GOOS != "windows" {
+					return ret, nil
+				}
+				// otherwise ignore \n
+			case '\r':
+				if runtime.GOOS == "windows" {
+					return ret, nil
+				}
+				// otherwise ignore \r
+			default:
+				ret = append(ret, buf[0])
+			}
+			continue
+		}
+		if err != nil {
+			if err == io.EOF && len(ret) > 0 {
+				return ret, nil
+			}
+			return ret, err
+		}
+	}
+}
diff --git a/source/vendor/github.com/evanw/esbuild/internal/bundler/bundler.go b/source/vendor/github.com/evanw/esbuild/internal/bundler/bundler.go
index b4883a2..f773ca3 100644
--- a/source/vendor/github.com/evanw/esbuild/internal/bundler/bundler.go
+++ b/source/vendor/github.com/evanw/esbuild/internal/bundler/bundler.go
@@ -642,8 +642,33 @@ func parseFile(args parseArgs) {
 							sourceMap.SourcesContent = slice
 						}
 
-						// Attempt to fill in null entries using the file system
 						for i, source := range sourceMap.Sources {
+							// Convert absolute paths to "file://" URLs, which is especially important
+							// for Windows where file paths don't look like URLs at all (they use "\"
+							// as a path separator and start with a "C:\" volume label instead of "/").
+							//
+							// The new source map specification (https://tc39.es/ecma426/) says that
+							// each source is "a string that is a (potentially relative) URL". So we
+							// should technically not be finding absolute paths here in the first place.
+							//
+							// However, for a long time source maps was poorly-specified. The old source
+							// map specification (https://sourcemaps.info/spec.html) only says "sources"
+							// is "a list of original sources used by the mappings entry" which could
+							// be anything, really.
+							//
+							// So it makes sense that software which predates the formal specification
+							// of source maps might fill in the sources array with absolute file paths
+							// instead of URLs. Here are some cases where that happened:
+							//
+							// - https://github.com/mozilla/source-map/issues/355
+							// - https://github.com/webpack/webpack/issues/8226
+							//
+							if path.Namespace == "file" && args.fs.IsAbs(source) {
+								source = helpers.FileURLFromFilePath(source).String()
+								sourceMap.Sources[i] = source
+							}
+
+							// Attempt to fill in null entries using the file system
 							if sourceMap.SourcesContent[i].Value == nil {
 								if sourceURL, err := url.Parse(source); err == nil && helpers.IsFileURL(sourceURL) {
 									if contents, err, _ := args.caches.FSCache.ReadFile(args.fs, helpers.FilePathFromFileURL(args.fs, sourceURL)); err == nil {
@@ -816,7 +841,9 @@ func extractSourceMapFromComment(
 				fmt.Sprintf("Unsupported source map comment: %s", err.Error()))
 			return logger.Path{}, nil
 		}
-		return logger.Path{Text: source.PrettyPath, IgnoredSuffix: "#sourceMappingURL"}, &contents
+		path := source.KeyPath
+		path.IgnoredSuffix = "#sourceMappingURL"
+		return path, &contents
 	}
 
 	// Support file URLs of two forms:
@@ -1589,6 +1616,7 @@ func (s *scanner) preprocessInjectedFiles() {
 			KeyPath:        visitedKey,
 			PrettyPath:     resolver.PrettyPath(s.fs, visitedKey),
 			IdentifierName: js_ast.EnsureValidIdentifier(visitedKey.Text),
+			Contents:       define.Source.Contents,
 		}
 
 		// The first "len(InjectedDefine)" injected files intentionally line up
diff --git a/source/vendor/github.com/evanw/esbuild/internal/compat/css_table.go b/source/vendor/github.com/evanw/esbuild/internal/compat/css_table.go
index 0ee1001..951795d 100644
--- a/source/vendor/github.com/evanw/esbuild/internal/compat/css_table.go
+++ b/source/vendor/github.com/evanw/esbuild/internal/compat/css_table.go
@@ -205,7 +205,7 @@ var cssPrefixTable = map[css_ast.D][]prefixData{
 		{engine: Chrome, prefix: WebkitPrefix, withoutPrefix: v{130, 0, 0}},
 		{engine: Edge, prefix: WebkitPrefix, withoutPrefix: v{130, 0, 0}},
 		{engine: IOS, prefix: WebkitPrefix},
-		{engine: Opera, prefix: WebkitPrefix},
+		{engine: Opera, prefix: WebkitPrefix, withoutPrefix: v{116, 0, 0}},
 		{engine: Safari, prefix: WebkitPrefix},
 	},
 	css_ast.DClipPath: {
diff --git a/source/vendor/github.com/evanw/esbuild/internal/compat/js_table.go b/source/vendor/github.com/evanw/esbuild/internal/compat/js_table.go
index 18f2bbe..5cab807 100644
--- a/source/vendor/github.com/evanw/esbuild/internal/compat/js_table.go
+++ b/source/vendor/github.com/evanw/esbuild/internal/compat/js_table.go
@@ -822,7 +822,7 @@ var jsTable = map[JSFeature]map[Engine][]versionRange{
 		// Note: The latest version of "Safari" failed this test: RegExp Unicode Property Escapes: Unicode 16.0
 		ES:      {{start: v{2018, 0, 0}}},
 		Firefox: {{start: v{134, 0, 0}}},
-		Node:    {{start: v{22, 12, 0}, end: v{23, 0, 0}}, {start: v{23, 3, 0}}},
+		Node:    {{start: v{20, 19, 0}, end: v{21, 0, 0}}, {start: v{22, 12, 0}, end: v{23, 0, 0}}, {start: v{23, 3, 0}}},
 	},
 	RestArgument: {
 		// Note: The latest version of "Hermes" failed this test: rest parameters: function 'length' property
diff --git a/source/vendor/github.com/evanw/esbuild/internal/css_parser/css_nesting.go b/source/vendor/github.com/evanw/esbuild/internal/css_parser/css_nesting.go
index f2991f1..f6995a8 100644
--- a/source/vendor/github.com/evanw/esbuild/internal/css_parser/css_nesting.go
+++ b/source/vendor/github.com/evanw/esbuild/internal/css_parser/css_nesting.go
@@ -41,7 +41,7 @@ func (p *parser) lowerNestingInRule(rule css_ast.Rule, results []css_ast.Rule) [
 			// Filter out pseudo elements because they are ignored by nested style
 			// rules. This is because pseudo-elements are not valid within :is():
 			// https://www.w3.org/TR/selectors-4/#matches-pseudo. This restriction
-			// may be relaxed in the future, but this restriction hash shipped so
+			// may be relaxed in the future, but this restriction has shipped so
 			// we're stuck with it: https://github.com/w3c/csswg-drafts/issues/7433.
 			//
 			// Note: This is only for the parent selector list that is used to
@@ -101,6 +101,34 @@ func (p *parser) lowerNestingInRulesAndReturnRemaining(rules []css_ast.Rule, con
 	return rules[:n]
 }
 
+func compoundSelectorTermCount(sel css_ast.CompoundSelector) int {
+	count := 0
+	for _, ss := range sel.SubclassSelectors {
+		count++
+		if list, ok := ss.Data.(*css_ast.SSPseudoClassWithSelectorList); ok {
+			count += complexSelectorTermCount(list.Selectors)
+		}
+	}
+	return count
+}
+
+func complexSelectorTermCount(selectors []css_ast.ComplexSelector) int {
+	count := 0
+	for _, sel := range selectors {
+		for _, inner := range sel.Selectors {
+			count += compoundSelectorTermCount(inner)
+		}
+	}
+	return count
+}
+
+func (p *parser) addExpansionError(loc logger.Loc, n int) {
+	p.log.AddErrorWithNotes(&p.tracker, logger.Range{Loc: loc}, "CSS nesting is causing too much expansion",
+		[]logger.MsgData{{Text: fmt.Sprintf("CSS nesting expansion was terminated because a rule was generated with %d selectors. "+
+			"This limit exists to prevent esbuild from using too much time and/or memory. "+
+			"Please change your CSS to use fewer levels of nesting.", n)}})
+}
+
 type lowerNestingContext struct {
 	parentSelectors []css_ast.ComplexSelector
 	loweredRules    []css_ast.Rule
@@ -109,6 +137,9 @@ type lowerNestingContext struct {
 func (p *parser) lowerNestingInRuleWithContext(rule css_ast.Rule, context *lowerNestingContext) css_ast.Rule {
 	switch r := rule.Data.(type) {
 	case *css_ast.RSelector:
+		oldSelectorsLen := len(r.Selectors)
+		oldSelectorsComplexity := complexSelectorTermCount(r.Selectors)
+
 		// "a { & b {} }" => "a b {}"
 		// "a { &b {} }" => "a:is(b) {}"
 		// "a { &:hover {} }" => "a:hover {}"
@@ -227,6 +258,16 @@ func (p *parser) lowerNestingInRuleWithContext(rule css_ast.Rule, context *lower
 			r.Selectors = selectors
 		}
 
+		// Put limits on the combinatorial explosion to avoid using too much time and/or memory
+		if n := len(r.Selectors); n > oldSelectorsLen && n > 0xFF00 {
+			p.addExpansionError(rule.Loc, n)
+			return css_ast.Rule{}
+		}
+		if n := complexSelectorTermCount(r.Selectors); n > oldSelectorsComplexity && n > 0xFF00 {
+			p.addExpansionError(rule.Loc, n)
+			return css_ast.Rule{}
+		}
+
 		// Lower all child rules using our newly substituted selector
 		context.loweredRules = p.lowerNestingInRule(rule, context.loweredRules)
 		return css_ast.Rule{}
diff --git a/source/vendor/github.com/evanw/esbuild/internal/fs/fs_mock.go b/source/vendor/github.com/evanw/esbuild/internal/fs/fs_mock.go
index 8626b59..f007399 100644
--- a/source/vendor/github.com/evanw/esbuild/internal/fs/fs_mock.go
+++ b/source/vendor/github.com/evanw/esbuild/internal/fs/fs_mock.go
@@ -116,7 +116,7 @@ func (fs *mockFS) ModKey(path string) (ModKey, error) {
 }
 
 func win2unix(p string) string {
-	if strings.HasPrefix(p, "C:\\") {
+	if strings.HasPrefix(p, "C:\\") || strings.HasPrefix(p, "c:\\") {
 		p = p[2:]
 	}
 	p = strings.ReplaceAll(p, "\\", "/")
diff --git a/source/vendor/github.com/evanw/esbuild/internal/js_parser/js_parser.go b/source/vendor/github.com/evanw/esbuild/internal/js_parser/js_parser.go
index cabcd2e..1bda10a 100644
--- a/source/vendor/github.com/evanw/esbuild/internal/js_parser/js_parser.go
+++ b/source/vendor/github.com/evanw/esbuild/internal/js_parser/js_parser.go
@@ -737,6 +737,9 @@ type fnOnlyDataVisit struct {
 	// has been shadowed and is now inaccessible.
 	isThisNested bool
 
+	// If true, "this" is used in current function scope.
+	hasThisUsage bool
+
 	// Do not warn about "this" being undefined for code that the TypeScript
 	// compiler generates that looks like this:
 	//
@@ -7477,11 +7480,14 @@ func (p *parser) parseStmt(opts parseStmtOpts) js_ast.Stmt {
 		p.lexer.Expect(js_lexer.TOpenBrace)
 		cases := []js_ast.Case{}
 		foundDefault := false
+		switchScopeStart := len(p.scopesInOrder)
+		var caseScopeMap map[*js_ast.Scope]struct{}
 
 		for p.lexer.Token != js_lexer.TCloseBrace {
 			var value js_ast.Expr
 			body := []js_ast.Stmt{}
 			caseLoc := p.saveExprCommentsHere()
+			caseScopeStart := len(p.scopesInOrder)
 
 			if p.lexer.Token == js_lexer.TDefault {
 				if foundDefault {
@@ -7497,6 +7503,27 @@ func (p *parser) parseStmt(opts parseStmtOpts) js_ast.Stmt {
 				p.lexer.Expect(js_lexer.TColon)
 			}
 
+			// Keep track of any scopes created by case values. This can happen if
+			// code uses anonymous functions inside a case value. For example:
+			//
+			//   switch (x) {
+			//     case y.map(z => -z).join(':'):
+			//       return y
+			//   }
+			//
+			if caseScopeStart < len(p.scopesInOrder) {
+				if caseScopeMap == nil {
+					caseScopeMap = make(map[*js_ast.Scope]struct{})
+				}
+				for {
+					caseScopeMap[p.scopesInOrder[caseScopeStart].scope] = struct{}{}
+					caseScopeStart++
+					if caseScopeStart == len(p.scopesInOrder) {
+						break
+					}
+				}
+			}
+
 		caseBody:
 			for {
 				switch p.lexer.Token {
@@ -7511,6 +7538,40 @@ func (p *parser) parseStmt(opts parseStmtOpts) js_ast.Stmt {
 			cases = append(cases, js_ast.Case{ValueOrNil: value, Body: body, Loc: caseLoc})
 		}
 
+		// If any case contains values that create a scope, reorder those scopes to
+		// come first before any scopes created by case bodies. This reflects the
+		// order in which we will visit the AST in our second parsing pass. The
+		// second parsing pass visits things in a different order because it uses
+		// case values to determine liveness, and then uses the liveness information
+		// when visiting the case bodies (e.g. avoid "require()" calls in dead code).
+		// For example:
+		//
+		//   switch (1) {
+		//     case y(() => 1):
+		//       z = () => 2;
+		//       break;
+		//
+		//     case y(() => 3):
+		//       z = () => 4;
+		//       break;
+		//   }
+		//
+		// This is parsed in the order 1,2,3,4 but visited in the order 1,3,2,4.
+		if len(caseScopeMap) > 0 {
+			caseScopes := make([]scopeOrder, 0, len(caseScopeMap))
+			bodyScopes := make([]scopeOrder, 0, len(p.scopesInOrder)-switchScopeStart-len(caseScopeMap))
+			for i := switchScopeStart; i < len(p.scopesInOrder); i++ {
+				it := p.scopesInOrder[i]
+				if _, ok := caseScopeMap[it.scope]; ok {
+					caseScopes = append(caseScopes, it)
+				} else {
+					bodyScopes = append(bodyScopes, it)
+				}
+			}
+			copy(p.scopesInOrder[switchScopeStart:switchScopeStart+len(caseScopeMap)], caseScopes)
+			copy(p.scopesInOrder[switchScopeStart+len(caseScopeMap):], bodyScopes)
+		}
+
 		closeBraceLoc := p.lexer.Loc()
 		p.lexer.Expect(js_lexer.TCloseBrace)
 		return js_ast.Stmt{Loc: loc, Data: &js_ast.SSwitch{
@@ -13174,6 +13235,8 @@ func (p *parser) visitExprInOut(expr js_ast.Expr, in exprIn) (js_ast.Expr, exprO
 		isDeleteTarget := e == p.deleteTarget
 		isCallTarget := e == p.callTarget
 
+		p.fnOnlyDataVisit.hasThisUsage = true
+
 		if value, ok := p.valueForThis(expr.Loc, true /* shouldLog */, in.assignTarget, isDeleteTarget, isCallTarget); ok {
 			return value, exprOut{}
 		}
diff --git a/source/vendor/github.com/evanw/esbuild/internal/js_parser/js_parser_lower.go b/source/vendor/github.com/evanw/esbuild/internal/js_parser/js_parser_lower.go
index 22ea92b..89c7721 100644
--- a/source/vendor/github.com/evanw/esbuild/internal/js_parser/js_parser_lower.go
+++ b/source/vendor/github.com/evanw/esbuild/internal/js_parser/js_parser_lower.go
@@ -345,7 +345,10 @@ func (p *parser) lowerFunction(
 			false, /* isCallTarget */
 			false, /* isDeleteTarget */
 		)
-		if !hasThisValue {
+
+		if isArrow && !p.fnOnlyDataVisit.hasThisUsage {
+			thisValue = js_ast.Expr{Loc: bodyLoc, Data: js_ast.ENullShared}
+		} else if !hasThisValue {
 			thisValue = js_ast.Expr{Loc: bodyLoc, Data: js_ast.EThisShared}
 		}
 
diff --git a/source/vendor/github.com/evanw/esbuild/internal/js_parser/sourcemap_parser.go b/source/vendor/github.com/evanw/esbuild/internal/js_parser/sourcemap_parser.go
index 9a39758..49d9de5 100644
--- a/source/vendor/github.com/evanw/esbuild/internal/js_parser/sourcemap_parser.go
+++ b/source/vendor/github.com/evanw/esbuild/internal/js_parser/sourcemap_parser.go
@@ -13,7 +13,8 @@ import (
 	"github.com/evanw/esbuild/internal/sourcemap"
 )
 
-// Specification: https://sourcemaps.info/spec.html
+// New specification: https://tc39.es/ecma426/
+// Old specification: https://sourcemaps.info/spec.html
 func ParseSourceMap(log logger.Log, source logger.Source) *sourcemap.SourceMap {
 	expr, ok := ParseJSON(log, source, JSONOptions{ErrorSuffix: " in source map"})
 	if !ok {
@@ -27,232 +28,382 @@ func ParseSourceMap(log logger.Log, source logger.Source) *sourcemap.SourceMap {
 		return nil
 	}
 
-	var sources []string
-	var sourcesArray []js_ast.Expr
-	var sourcesContent []sourcemap.SourceContent
-	var names []string
-	var mappingsRaw []uint16
-	var mappingsStart int32
-	var sourceRoot string
-	hasVersion := false
-
-	for _, prop := range obj.Properties {
-		keyRange := source.RangeOfString(prop.Key.Loc)
-
-		switch helpers.UTF16ToString(prop.Key.Data.(*js_ast.EString).Value) {
-		case "sections":
-			log.AddID(logger.MsgID_SourceMap_SectionsInSourceMap, logger.Warning, &tracker, keyRange, "Source maps with \"sections\" are not supported")
-			return nil
-
-		case "version":
-			if value, ok := prop.ValueOrNil.Data.(*js_ast.ENumber); ok && value.Value == 3 {
-				hasVersion = true
-			}
+	type sourceMapSection struct {
+		lineOffset   int32
+		columnOffset int32
+		sourceMap    *js_ast.EObject
+	}
 
-		case "mappings":
-			if value, ok := prop.ValueOrNil.Data.(*js_ast.EString); ok {
-				mappingsRaw = value.Value
-				mappingsStart = prop.ValueOrNil.Loc.Start + 1
-			}
+	var sections []sourceMapSection
+	hasSections := false
 
-		case "sourceRoot":
-			if value, ok := prop.ValueOrNil.Data.(*js_ast.EString); ok {
-				sourceRoot = helpers.UTF16ToString(value.Value)
-			}
+	for _, prop := range obj.Properties {
+		if !helpers.UTF16EqualsString(prop.Key.Data.(*js_ast.EString).Value, "sections") {
+			continue
+		}
 
-		case "sources":
-			if value, ok := prop.ValueOrNil.Data.(*js_ast.EArray); ok {
-				sources = make([]string, len(value.Items))
-				sourcesArray = value.Items
-				for i, item := range value.Items {
-					if element, ok := item.Data.(*js_ast.EString); ok {
-						sources[i] = helpers.UTF16ToString(element.Value)
+		if value, ok := prop.ValueOrNil.Data.(*js_ast.EArray); ok {
+			for _, item := range value.Items {
+				if element, ok := item.Data.(*js_ast.EObject); ok {
+					var sectionLineOffset int32
+					var sectionColumnOffset int32
+					var sectionSourceMap *js_ast.EObject
+
+					for _, sectionProp := range element.Properties {
+						switch helpers.UTF16ToString(sectionProp.Key.Data.(*js_ast.EString).Value) {
+						case "offset":
+							if offsetValue, ok := sectionProp.ValueOrNil.Data.(*js_ast.EObject); ok {
+								for _, offsetProp := range offsetValue.Properties {
+									switch helpers.UTF16ToString(offsetProp.Key.Data.(*js_ast.EString).Value) {
+									case "line":
+										if lineValue, ok := offsetProp.ValueOrNil.Data.(*js_ast.ENumber); ok {
+											sectionLineOffset = int32(lineValue.Value)
+										}
+
+									case "column":
+										if columnValue, ok := offsetProp.ValueOrNil.Data.(*js_ast.ENumber); ok {
+											sectionColumnOffset = int32(columnValue.Value)
+										}
+									}
+								}
+							} else {
+								log.AddError(&tracker, logger.Range{Loc: sectionProp.ValueOrNil.Loc}, "Expected \"offset\" to be an object")
+								return nil
+							}
+
+						case "map":
+							if mapValue, ok := sectionProp.ValueOrNil.Data.(*js_ast.EObject); ok {
+								sectionSourceMap = mapValue
+							} else {
+								log.AddError(&tracker, logger.Range{Loc: sectionProp.ValueOrNil.Loc}, "Expected \"map\" to be an object")
+								return nil
+							}
+						}
 					}
-				}
-			}
 
-		case "sourcesContent":
-			if value, ok := prop.ValueOrNil.Data.(*js_ast.EArray); ok {
-				sourcesContent = []sourcemap.SourceContent{}
-				for _, item := range value.Items {
-					if element, ok := item.Data.(*js_ast.EString); ok {
-						sourcesContent = append(sourcesContent, sourcemap.SourceContent{
-							Value:  element.Value,
-							Quoted: source.TextForRange(source.RangeOfString(item.Loc)),
+					if sectionSourceMap != nil {
+						sections = append(sections, sourceMapSection{
+							lineOffset:   sectionLineOffset,
+							columnOffset: sectionColumnOffset,
+							sourceMap:    sectionSourceMap,
 						})
-					} else {
-						sourcesContent = append(sourcesContent, sourcemap.SourceContent{})
-					}
-				}
-			}
-
-		case "names":
-			if value, ok := prop.ValueOrNil.Data.(*js_ast.EArray); ok {
-				names = []string{}
-				for _, item := range value.Items {
-					if element, ok := item.Data.(*js_ast.EString); ok {
-						names = append(names, helpers.UTF16ToString(element.Value))
-					} else {
-						names = append(names, "")
 					}
 				}
 			}
+		} else {
+			log.AddError(&tracker, logger.Range{Loc: prop.ValueOrNil.Loc}, "Expected \"sections\" to be an array")
+			return nil
 		}
-	}
 
-	// Silently fail if the version was missing or incorrect
-	if !hasVersion {
-		return nil
+		hasSections = true
+		break
 	}
 
-	// Silently fail if the source map is pointless (i.e. empty)
-	if len(sources) == 0 || len(mappingsRaw) == 0 {
-		return nil
+	if !hasSections {
+		sections = append(sections, sourceMapSection{
+			sourceMap: obj,
+		})
 	}
 
+	var sources []string
+	var sourcesContent []sourcemap.SourceContent
+	var names []string
 	var mappings mappingArray
-	mappingsLen := len(mappingsRaw)
-	sourcesLen := len(sources)
-	namesLen := len(names)
 	var generatedLine int32
 	var generatedColumn int32
-	var sourceIndex int32
-	var originalLine int32
-	var originalColumn int32
-	var originalName int32
-	current := 0
-	errorText := ""
-	errorLen := 0
 	needSort := false
 
-	// Parse the mappings
-	for current < mappingsLen {
-		// Handle a line break
-		if mappingsRaw[current] == ';' {
-			generatedLine++
-			generatedColumn = 0
-			current++
-			continue
-		}
+	for _, section := range sections {
+		var sourcesArray []js_ast.Expr
+		var sourcesContentArray []js_ast.Expr
+		var namesArray []js_ast.Expr
+		var mappingsRaw []uint16
+		var mappingsStart int32
+		var sourceRoot string
+		hasVersion := false
+
+		for _, prop := range section.sourceMap.Properties {
+			switch helpers.UTF16ToString(prop.Key.Data.(*js_ast.EString).Value) {
+			case "version":
+				if value, ok := prop.ValueOrNil.Data.(*js_ast.ENumber); ok && value.Value == 3 {
+					hasVersion = true
+				}
 
-		// Read the generated column
-		generatedColumnDelta, i, ok := sourcemap.DecodeVLQUTF16(mappingsRaw[current:])
-		if !ok {
-			errorText = "Missing generated column"
-			errorLen = i
-			break
-		}
-		if generatedColumnDelta < 0 {
-			// This would mess up binary search
-			needSort = true
-		}
-		generatedColumn += generatedColumnDelta
-		if generatedColumn < 0 {
-			errorText = fmt.Sprintf("Invalid generated column value: %d", generatedColumn)
-			errorLen = i
-			break
-		}
-		current += i
-
-		// According to the specification, it's valid for a mapping to have 1,
-		// 4, or 5 variable-length fields. Having one field means there's no
-		// original location information, which is pretty useless. Just ignore
-		// those entries.
-		if current == mappingsLen {
-			break
+			case "mappings":
+				if value, ok := prop.ValueOrNil.Data.(*js_ast.EString); ok {
+					mappingsRaw = value.Value
+					mappingsStart = prop.ValueOrNil.Loc.Start + 1
+				}
+
+			case "sourceRoot":
+				if value, ok := prop.ValueOrNil.Data.(*js_ast.EString); ok {
+					sourceRoot = helpers.UTF16ToString(value.Value)
+				}
+
+			case "sources":
+				if value, ok := prop.ValueOrNil.Data.(*js_ast.EArray); ok {
+					sourcesArray = value.Items
+				}
+
+			case "sourcesContent":
+				if value, ok := prop.ValueOrNil.Data.(*js_ast.EArray); ok {
+					sourcesContentArray = value.Items
+				}
+
+			case "names":
+				if value, ok := prop.ValueOrNil.Data.(*js_ast.EArray); ok {
+					namesArray = value.Items
+				}
+			}
 		}
-		switch mappingsRaw[current] {
-		case ',':
-			current++
-			continue
-		case ';':
+
+		// Silently ignore the section if the version was missing or incorrect
+		if !hasVersion {
 			continue
 		}
 
-		// Read the original source
-		sourceIndexDelta, i, ok := sourcemap.DecodeVLQUTF16(mappingsRaw[current:])
-		if !ok {
-			errorText = "Missing source index"
-			errorLen = i
-			break
-		}
-		sourceIndex += sourceIndexDelta
-		if sourceIndex < 0 || sourceIndex >= int32(sourcesLen) {
-			errorText = fmt.Sprintf("Invalid source index value: %d", sourceIndex)
-			errorLen = i
-			break
-		}
-		current += i
-
-		// Read the original line
-		originalLineDelta, i, ok := sourcemap.DecodeVLQUTF16(mappingsRaw[current:])
-		if !ok {
-			errorText = "Missing original line"
-			errorLen = i
-			break
-		}
-		originalLine += originalLineDelta
-		if originalLine < 0 {
-			errorText = fmt.Sprintf("Invalid original line value: %d", originalLine)
-			errorLen = i
-			break
-		}
-		current += i
-
-		// Read the original column
-		originalColumnDelta, i, ok := sourcemap.DecodeVLQUTF16(mappingsRaw[current:])
-		if !ok {
-			errorText = "Missing original column"
-			errorLen = i
-			break
+		mappingsLen := len(mappingsRaw)
+		sourcesLen := len(sourcesArray)
+		namesLen := len(namesArray)
+
+		// Silently ignore the section if the source map is pointless (i.e. empty)
+		if mappingsLen == 0 || sourcesLen == 0 {
+			continue
 		}
-		originalColumn += originalColumnDelta
-		if originalColumn < 0 {
-			errorText = fmt.Sprintf("Invalid original column value: %d", originalColumn)
-			errorLen = i
-			break
+
+		if section.lineOffset < generatedLine || (section.lineOffset == generatedLine && section.columnOffset < generatedColumn) {
+			needSort = true
 		}
-		current += i
-
-		// Read the original name
-		var optionalName ast.Index32
-		if originalNameDelta, i, ok := sourcemap.DecodeVLQUTF16(mappingsRaw[current:]); ok {
-			originalName += originalNameDelta
-			if originalName < 0 || originalName >= int32(namesLen) {
-				errorText = fmt.Sprintf("Invalid name index value: %d", originalName)
+
+		lineOffset := section.lineOffset
+		columnOffset := section.columnOffset
+		sourceOffset := int32(len(sources))
+		nameOffset := int32(len(names))
+
+		generatedLine = lineOffset
+		generatedColumn = columnOffset
+		sourceIndex := sourceOffset
+		var originalLine int32
+		var originalColumn int32
+		originalName := nameOffset
+
+		current := 0
+		errorText := ""
+		errorLen := 0
+
+		// Parse the mappings
+		for current < mappingsLen {
+			// Handle a line break
+			if mappingsRaw[current] == ';' {
+				generatedLine++
+				generatedColumn = 0
+				current++
+				continue
+			}
+
+			// Read the generated column
+			generatedColumnDelta, i, ok := sourcemap.DecodeVLQUTF16(mappingsRaw[current:])
+			if !ok {
+				errorText = "Missing generated column"
+				errorLen = i
+				break
+			}
+			if generatedColumnDelta < 0 {
+				// This would mess up binary search
+				needSort = true
+			}
+			generatedColumn += generatedColumnDelta
+			if (generatedLine == lineOffset && generatedColumn < columnOffset) || generatedColumn < 0 {
+				errorText = fmt.Sprintf("Invalid generated column value: %d", generatedColumn)
 				errorLen = i
 				break
 			}
-			optionalName = ast.MakeIndex32(uint32(originalName))
 			current += i
-		}
 
-		// Handle the next character
-		if current < mappingsLen {
-			if c := mappingsRaw[current]; c == ',' {
+			// According to the specification, it's valid for a mapping to have 1,
+			// 4, or 5 variable-length fields. Having one field means there's no
+			// original location information, which is pretty useless. Just ignore
+			// those entries.
+			if current == mappingsLen {
+				break
+			}
+			switch mappingsRaw[current] {
+			case ',':
 				current++
-			} else if c != ';' {
-				errorText = fmt.Sprintf("Invalid character after mapping: %q",
-					helpers.UTF16ToString(mappingsRaw[current:current+1]))
-				errorLen = 1
+				continue
+			case ';':
+				continue
+			}
+
+			// Read the original source
+			sourceIndexDelta, i, ok := sourcemap.DecodeVLQUTF16(mappingsRaw[current:])
+			if !ok {
+				errorText = "Missing source index"
+				errorLen = i
+				break
+			}
+			sourceIndex += sourceIndexDelta
+			if sourceIndex < sourceOffset || sourceIndex >= sourceOffset+int32(sourcesLen) {
+				errorText = fmt.Sprintf("Invalid source index value: %d", sourceIndex)
+				errorLen = i
+				break
+			}
+			current += i
+
+			// Read the original line
+			originalLineDelta, i, ok := sourcemap.DecodeVLQUTF16(mappingsRaw[current:])
+			if !ok {
+				errorText = "Missing original line"
+				errorLen = i
+				break
+			}
+			originalLine += originalLineDelta
+			if originalLine < 0 {
+				errorText = fmt.Sprintf("Invalid original line value: %d", originalLine)
+				errorLen = i
+				break
+			}
+			current += i
+
+			// Read the original column
+			originalColumnDelta, i, ok := sourcemap.DecodeVLQUTF16(mappingsRaw[current:])
+			if !ok {
+				errorText = "Missing original column"
+				errorLen = i
 				break
 			}
+			originalColumn += originalColumnDelta
+			if originalColumn < 0 {
+				errorText = fmt.Sprintf("Invalid original column value: %d", originalColumn)
+				errorLen = i
+				break
+			}
+			current += i
+
+			// Read the original name
+			var optionalName ast.Index32
+			if originalNameDelta, i, ok := sourcemap.DecodeVLQUTF16(mappingsRaw[current:]); ok {
+				originalName += originalNameDelta
+				if originalName < nameOffset || originalName >= nameOffset+int32(namesLen) {
+					errorText = fmt.Sprintf("Invalid name index value: %d", originalName)
+					errorLen = i
+					break
+				}
+				optionalName = ast.MakeIndex32(uint32(originalName))
+				current += i
+			}
+
+			// Handle the next character
+			if current < mappingsLen {
+				if c := mappingsRaw[current]; c == ',' {
+					current++
+				} else if c != ';' {
+					errorText = fmt.Sprintf("Invalid character after mapping: %q",
+						helpers.UTF16ToString(mappingsRaw[current:current+1]))
+					errorLen = 1
+					break
+				}
+			}
+
+			mappings = append(mappings, sourcemap.Mapping{
+				GeneratedLine:   generatedLine,
+				GeneratedColumn: generatedColumn,
+				SourceIndex:     sourceIndex,
+				OriginalLine:    originalLine,
+				OriginalColumn:  originalColumn,
+				OriginalName:    optionalName,
+			})
 		}
 
-		mappings = append(mappings, sourcemap.Mapping{
-			GeneratedLine:   generatedLine,
-			GeneratedColumn: generatedColumn,
-			SourceIndex:     sourceIndex,
-			OriginalLine:    originalLine,
-			OriginalColumn:  originalColumn,
-			OriginalName:    optionalName,
-		})
+		if errorText != "" {
+			r := logger.Range{Loc: logger.Loc{Start: mappingsStart + int32(current)}, Len: int32(errorLen)}
+			log.AddID(logger.MsgID_SourceMap_InvalidSourceMappings, logger.Warning, &tracker, r,
+				fmt.Sprintf("Bad \"mappings\" data in source map at character %d: %s", current, errorText))
+			return nil
+		}
+
+		// Try resolving relative source URLs into absolute source URLs.
+		// See https://tc39.es/ecma426/#resolving-sources for details.
+		var sourceURLPrefix string
+		var baseURL *url.URL
+		if sourceRoot != "" {
+			if index := strings.LastIndexByte(sourceRoot, '/'); index != -1 {
+				sourceURLPrefix = sourceRoot[:index+1]
+			} else {
+				sourceURLPrefix = sourceRoot + "/"
+			}
+		}
+		if source.KeyPath.Namespace == "file" {
+			baseURL = helpers.FileURLFromFilePath(source.KeyPath.Text)
+		}
+
+		for _, item := range sourcesArray {
+			if element, ok := item.Data.(*js_ast.EString); ok {
+				sourcePath := sourceURLPrefix + helpers.UTF16ToString(element.Value)
+				sourceURL, err := url.Parse(sourcePath)
+
+				// Ignore URL parse errors (such as "%XY" being an invalid escape)
+				if err != nil {
+					sources = append(sources, sourcePath)
+					continue
+				}
+
+				// Resolve this URL relative to the enclosing directory
+				if baseURL != nil {
+					sourceURL = baseURL.ResolveReference(sourceURL)
+				}
+				sources = append(sources, sourceURL.String())
+			} else {
+				sources = append(sources, "")
+			}
+		}
+
+		if len(sourcesContentArray) > 0 {
+			// It's possible that one of the source maps inside "sections" has
+			// different lengths for the "sources" and "sourcesContent" arrays.
+			// This is bad because we need to us a single index to get the name
+			// of the source from "sources[i]" and the content of the source
+			// from "sourcesContent[i]".
+			//
+			// So if a previous source map had a shorter "sourcesContent" array
+			// than its "sources" array (or if the previous source map just had
+			// no "sourcesContent" array), expand our aggregated array to the
+			// right length by padding it out with empty entries.
+			sourcesContent = append(sourcesContent, make([]sourcemap.SourceContent, int(sourceOffset)-len(sourcesContent))...)
+
+			for i, item := range sourcesContentArray {
+				// Make sure we don't ever record more "sourcesContent" entries
+				// than there are "sources" entries, which is possible because
+				// these are two separate arrays in the source map JSON. We need
+				// to avoid this because that would mess up our shared indexing
+				// of the "sources" and "sourcesContent" arrays. See the above
+				// comment for more details.
+				if i == sourcesLen {
+					break
+				}
+
+				if element, ok := item.Data.(*js_ast.EString); ok {
+					sourcesContent = append(sourcesContent, sourcemap.SourceContent{
+						Value:  element.Value,
+						Quoted: source.TextForRange(source.RangeOfString(item.Loc)),
+					})
+				} else {
+					sourcesContent = append(sourcesContent, sourcemap.SourceContent{})
+				}
+			}
+		}
+
+		for _, item := range namesArray {
+			if element, ok := item.Data.(*js_ast.EString); ok {
+				names = append(names, helpers.UTF16ToString(element.Value))
+			} else {
+				names = append(names, "")
+			}
+		}
 	}
 
-	if errorText != "" {
-		r := logger.Range{Loc: logger.Loc{Start: mappingsStart + int32(current)}, Len: int32(errorLen)}
-		log.AddID(logger.MsgID_SourceMap_InvalidSourceMappings, logger.Warning, &tracker, r,
-			fmt.Sprintf("Bad \"mappings\" data in source map at character %d: %s", current, errorText))
+	// Silently fail if the source map is pointless (i.e. empty)
+	if len(sources) == 0 || len(mappings) == 0 {
 		return nil
 	}
 
@@ -264,44 +415,6 @@ func ParseSourceMap(log logger.Log, source logger.Source) *sourcemap.SourceMap {
 		sort.Stable(mappings)
 	}
 
-	// Try resolving relative source URLs into absolute source URLs.
-	// See https://tc39.es/ecma426/#resolving-sources for details.
-	var sourceURLPrefix string
-	var baseURL *url.URL
-	if sourceRoot != "" {
-		if index := strings.LastIndexByte(sourceRoot, '/'); index != -1 {
-			sourceURLPrefix = sourceRoot[:index+1]
-		} else {
-			sourceURLPrefix = sourceRoot + "/"
-		}
-	}
-	if source.KeyPath.Namespace == "file" {
-		baseURL = helpers.FileURLFromFilePath(source.KeyPath.Text)
-	}
-	for i, sourcePath := range sources {
-		if sourcePath == "" {
-			continue // Skip null entries
-		}
-		sourcePath = sourceURLPrefix + sourcePath
-		sourceURL, err := url.Parse(sourcePath)
-
-		// Report URL parse errors (such as "%XY" being an invalid escape)
-		if err != nil {
-			if urlErr, ok := err.(*url.Error); ok {
-				err = urlErr.Err // Use the underlying error to reduce noise
-			}
-			log.AddID(logger.MsgID_SourceMap_InvalidSourceURL, logger.Warning, &tracker, source.RangeOfString(sourcesArray[i].Loc),
-				fmt.Sprintf("Invalid source URL: %s", err.Error()))
-			continue
-		}
-
-		// Resolve this URL relative to the enclosing directory
-		if baseURL != nil {
-			sourceURL = baseURL.ResolveReference(sourceURL)
-		}
-		sources[i] = sourceURL.String()
-	}
-
 	return &sourcemap.SourceMap{
 		Sources:        sources,
 		SourcesContent: sourcesContent,
diff --git a/source/vendor/github.com/evanw/esbuild/internal/linker/linker.go b/source/vendor/github.com/evanw/esbuild/internal/linker/linker.go
index e37ed9a..4607033 100644
--- a/source/vendor/github.com/evanw/esbuild/internal/linker/linker.go
+++ b/source/vendor/github.com/evanw/esbuild/internal/linker/linker.go
@@ -2293,7 +2293,16 @@ func (c *linkerContext) createExportsForFile(sourceIndex uint32) {
 		} else {
 			getter = js_ast.Expr{Data: &js_ast.EArrow{PreferExpr: true, Body: body}}
 		}
+
+		// Special case for __proto__ property: use a computed property
+		// name to avoid it being treated as the object's prototype
+		var flags js_ast.PropertyFlags
+		if alias == "__proto__" && !c.options.UnsupportedJSFeatures.Has(compat.ObjectExtensions) {
+			flags |= js_ast.PropertyIsComputed
+		}
+
 		properties = append(properties, js_ast.Property{
+			Flags:      flags,
 			Key:        js_ast.Expr{Data: &js_ast.EString{Value: helpers.StringToUTF16(alias)}},
 			ValueOrNil: getter,
 		})
@@ -5078,7 +5087,7 @@ func (c *linkerContext) generateEntryPointTailJS(
 
 				// "{if: null}"
 				var valueOrNil js_ast.Expr
-				if _, ok := js_lexer.Keywords[export]; ok {
+				if _, ok := js_lexer.Keywords[export]; ok || !js_ast.IsIdentifier(export) {
 					// Make sure keywords don't cause a syntax error. This has to map to
 					// "null" instead of something shorter like "0" because the library
 					// "cjs-module-lexer" only supports identifiers in this position, and
@@ -6526,8 +6535,8 @@ func (c *linkerContext) maybeAppendLegalComments(
 	}
 
 	type thirdPartyEntry struct {
-		packagePath string
-		comments    []string
+		packagePaths []string
+		comments     []string
 	}
 
 	var uniqueFirstPartyComments []string
@@ -6573,8 +6582,8 @@ func (c *linkerContext) maybeAppendLegalComments(
 
 		if packagePath != "" {
 			thirdPartyComments = append(thirdPartyComments, thirdPartyEntry{
-				packagePath: packagePath,
-				comments:    entry.comments,
+				packagePaths: []string{packagePath},
+				comments:     entry.comments,
 			})
 		} else {
 			for _, comment := range entry.comments {
@@ -6586,6 +6595,22 @@ func (c *linkerContext) maybeAppendLegalComments(
 		}
 	}
 
+	// Merge package paths with identical comments
+	identical := make(map[string]int)
+	end := 0
+	for _, entry := range thirdPartyComments {
+		key := strings.Join(entry.comments, "\x00")
+		if index, ok := identical[key]; ok {
+			existing := &thirdPartyComments[index]
+			existing.packagePaths = append(existing.packagePaths, entry.packagePaths...)
+		} else {
+			identical[key] = end
+			thirdPartyComments[end] = entry
+			end++
+		}
+	}
+	thirdPartyComments = thirdPartyComments[:end]
+
 	switch legalComments {
 	case config.LegalCommentsEndOfFile:
 		for _, comment := range uniqueFirstPartyComments {
@@ -6596,7 +6621,10 @@ func (c *linkerContext) maybeAppendLegalComments(
 		if len(thirdPartyComments) > 0 {
 			j.AddString("/*! Bundled license information:\n")
 			for _, entry := range thirdPartyComments {
-				j.AddString(fmt.Sprintf("\n%s:\n", helpers.EscapeClosingTag(entry.packagePath, slashTag)))
+				j.AddString("\n")
+				for _, packagePath := range entry.packagePaths {
+					j.AddString(fmt.Sprintf("%s:\n", helpers.EscapeClosingTag(packagePath, slashTag)))
+				}
 				for _, comment := range entry.comments {
 					comment = helpers.EscapeClosingTag(comment, slashTag)
 					if strings.HasPrefix(comment, "//") {
@@ -6623,7 +6651,10 @@ func (c *linkerContext) maybeAppendLegalComments(
 			}
 			jComments.AddString("Bundled license information:\n")
 			for _, entry := range thirdPartyComments {
-				jComments.AddString(fmt.Sprintf("\n%s:\n", entry.packagePath))
+				jComments.AddString("\n")
+				for _, packagePath := range entry.packagePaths {
+					jComments.AddString(fmt.Sprintf("%s:\n", packagePath))
+				}
 				for _, comment := range entry.comments {
 					jComments.AddString(fmt.Sprintf("  %s\n", strings.ReplaceAll(comment, "\n", "\n  ")))
 				}
@@ -6963,13 +6994,13 @@ func (c *linkerContext) generateSourceMapForChunk(
 	items := make([]item, 0, len(results))
 	nextSourcesIndex := 0
 	for _, result := range results {
-		if _, ok := sourceIndexToSourcesIndex[result.sourceIndex]; ok {
+		if result.isNullEntry {
 			continue
 		}
-		sourceIndexToSourcesIndex[result.sourceIndex] = nextSourcesIndex
-		if result.isNullEntry {
+		if _, ok := sourceIndexToSourcesIndex[result.sourceIndex]; ok {
 			continue
 		}
+		sourceIndexToSourcesIndex[result.sourceIndex] = nextSourcesIndex
 		file := &c.graph.Files[result.sourceIndex]
 
 		// Simple case: no nested source map
@@ -6980,7 +7011,39 @@ func (c *linkerContext) generateSourceMapForChunk(
 			}
 			source := file.InputFile.Source.KeyPath.Text
 			if file.InputFile.Source.KeyPath.Namespace == "file" {
+				// Serialize the file path as a "file://" URL, since source maps encode
+				// sources as URLs. While we could output absolute "file://" URLs, it
+				// will be turned into a relative path when it's written out below for
+				// better readability and to be independent of build directory.
 				source = helpers.FileURLFromFilePath(source).String()
+			} else {
+				// If the path for this file isn't in the "file" namespace, then write
+				// out something arbitrary instead. Source maps encode sources as URLs
+				// but plugins are allowed to put almost anything in the "namespace"
+				// and "path" fields, so we don't attempt to control whether this forms
+				// a valid URL or not.
+				//
+				// The approach used here is to join the namespace with the path text
+				// using a ":" character. It's important to include the namespace
+				// because esbuild considers paths with different namespaces to have
+				// separate identities. And using a ":" means that the path is more
+				// likely to form a valid URL in the source map.
+				//
+				// For example, you could imagine a plugin that uses the "https"
+				// namespace and path text like "//example.com/foo.js", which would
+				// then be joined into the URL "https://example.com/foo.js" here.
+				//
+				// Note that this logic is currently mostly the same as the pretty-
+				// printed paths that esbuild shows to humans in error messages.
+				// However, this code has been forked below as these source map URLs
+				// are intended for code instead of humans, and we don't want the
+				// changes for humans to unintentionally break code that uses them.
+				//
+				// See https://github.com/evanw/esbuild/issues/4078 for more info.
+				if ns := file.InputFile.Source.KeyPath.Namespace; ns != "" {
+					source = fmt.Sprintf("%s:%s", ns, source)
+				}
+				source += file.InputFile.Source.KeyPath.IgnoredSuffix
 			}
 			items = append(items, item{
 				source:         source,
@@ -7057,7 +7120,16 @@ func (c *linkerContext) generateSourceMapForChunk(
 	for _, result := range results {
 		chunk := result.sourceMapChunk
 		offset := result.generatedOffset
-		sourcesIndex := sourceIndexToSourcesIndex[result.sourceIndex]
+		sourcesIndex, ok := sourceIndexToSourcesIndex[result.sourceIndex]
+		if !ok {
+			// If there's no sourcesIndex, then every mapping for this result's
+			// sourceIndex were null mappings. We still need to emit the null
+			// mapping, but its source index won't matter.
+			sourcesIndex = 0
+			if !result.isNullEntry {
+				panic("Internal error")
+			}
+		}
 
 		// This should have already been checked earlier
 		if chunk.ShouldIgnore {
diff --git a/source/vendor/github.com/evanw/esbuild/internal/logger/msg_ids.go b/source/vendor/github.com/evanw/esbuild/internal/logger/msg_ids.go
index 38f337f..b9a56ed 100644
--- a/source/vendor/github.com/evanw/esbuild/internal/logger/msg_ids.go
+++ b/source/vendor/github.com/evanw/esbuild/internal/logger/msg_ids.go
@@ -69,9 +69,7 @@ const (
 
 	// Source maps
 	MsgID_SourceMap_InvalidSourceMappings
-	MsgID_SourceMap_InvalidSourceURL
 	MsgID_SourceMap_MissingSourceMap
-	MsgID_SourceMap_SectionsInSourceMap
 	MsgID_SourceMap_UnsupportedSourceMapComment
 
 	// package.json
@@ -208,12 +206,8 @@ func StringToMsgIDs(str string, logLevel LogLevel, overrides map[MsgID]LogLevel)
 	// Source maps
 	case "invalid-source-mappings":
 		overrides[MsgID_SourceMap_InvalidSourceMappings] = logLevel
-	case "invalid-source-url":
-		overrides[MsgID_SourceMap_InvalidSourceURL] = logLevel
 	case "missing-source-map":
 		overrides[MsgID_SourceMap_MissingSourceMap] = logLevel
-	case "sections-in-source-map":
-		overrides[MsgID_SourceMap_SectionsInSourceMap] = logLevel
 	case "unsupported-source-map-comment":
 		overrides[MsgID_SourceMap_UnsupportedSourceMapComment] = logLevel
 
@@ -344,12 +338,8 @@ func MsgIDToString(id MsgID) string {
 	// Source maps
 	case MsgID_SourceMap_InvalidSourceMappings:
 		return "invalid-source-mappings"
-	case MsgID_SourceMap_InvalidSourceURL:
-		return "invalid-source-url"
 	case MsgID_SourceMap_MissingSourceMap:
 		return "missing-source-map"
-	case MsgID_SourceMap_SectionsInSourceMap:
-		return "sections-in-source-map"
 	case MsgID_SourceMap_UnsupportedSourceMapComment:
 		return "unsupported-source-map-comment"
 
diff --git a/source/vendor/github.com/evanw/esbuild/internal/resolver/resolver.go b/source/vendor/github.com/evanw/esbuild/internal/resolver/resolver.go
index 5522bb1..5625ea4 100644
--- a/source/vendor/github.com/evanw/esbuild/internal/resolver/resolver.go
+++ b/source/vendor/github.com/evanw/esbuild/internal/resolver/resolver.go
@@ -1000,27 +1000,48 @@ func (r resolverQuery) resolveWithoutSymlinks(sourceDir string, sourceDirInfo *d
 			return &ResolveResult{PathPair: PathPair{Primary: logger.Path{Text: absPath, Namespace: "file"}, IsExternal: true}}
 		}
 
-		// Check the "browser" map
-		if importDirInfo := r.dirInfoCached(r.fs.Dir(absPath)); importDirInfo != nil {
-			if remapped, ok := r.checkBrowserMap(importDirInfo, absPath, absolutePathKind); ok {
-				if remapped == nil {
-					return &ResolveResult{PathPair: PathPair{Primary: logger.Path{Text: absPath, Namespace: "file", Flags: logger.PathDisabled}}}
-				}
-				if remappedResult, ok, diffCase, sideEffects := r.resolveWithoutRemapping(importDirInfo.enclosingBrowserScope, *remapped); ok {
-					result = ResolveResult{PathPair: remappedResult, DifferentCase: diffCase, PrimarySideEffectsData: sideEffects}
-					checkRelative = false
-					checkPackage = false
-				}
-			}
-		}
-
-		if checkRelative {
-			if absolute, ok, diffCase := r.loadAsFileOrDirectory(absPath); ok {
+		// Node's actual behavior deviates from its published algorithm by not
+		// running the "LOAD_AS_FILE" step if the import path looks like it
+		// resolves to a directory instead of a file. Attempt to replicate that
+		// behavior here. This really only matters for intentionally confusing
+		// edge cases where a directory is named the same thing as a file.
+		// Unfortunately people actually create situations like this.
+		hasTrailingSlash := importPath == "." ||
+			importPath == ".." ||
+			strings.HasSuffix(importPath, "/") ||
+			strings.HasSuffix(importPath, "/.") ||
+			strings.HasSuffix(importPath, "/..")
+
+		if hasTrailingSlash {
+			if absolute, ok, diffCase := r.loadAsDirectory(absPath); ok {
 				checkPackage = false
 				result = ResolveResult{PathPair: absolute, DifferentCase: diffCase}
 			} else if !checkPackage {
 				return nil
 			}
+		} else {
+			// Check the "browser" map
+			if importDirInfo := r.dirInfoCached(r.fs.Dir(absPath)); importDirInfo != nil {
+				if remapped, ok := r.checkBrowserMap(importDirInfo, absPath, absolutePathKind); ok {
+					if remapped == nil {
+						return &ResolveResult{PathPair: PathPair{Primary: logger.Path{Text: absPath, Namespace: "file", Flags: logger.PathDisabled}}}
+					}
+					if remappedResult, ok, diffCase, sideEffects := r.resolveWithoutRemapping(importDirInfo.enclosingBrowserScope, *remapped); ok {
+						result = ResolveResult{PathPair: remappedResult, DifferentCase: diffCase, PrimarySideEffectsData: sideEffects}
+						checkRelative = false
+						checkPackage = false
+					}
+				}
+			}
+
+			if checkRelative {
+				if absolute, ok, diffCase := r.loadAsFileOrDirectory(absPath); ok {
+					checkPackage = false
+					result = ResolveResult{PathPair: absolute, DifferentCase: diffCase}
+				} else if !checkPackage {
+					return nil
+				}
+			}
 		}
 	}
 
@@ -1899,6 +1920,19 @@ func (r resolverQuery) loadAsFileOrDirectory(path string) (PathPair, bool, *fs.D
 		return PathPair{Primary: logger.Path{Text: absolute, Namespace: "file"}}, true, diffCase
 	}
 
+	return r.loadAsDirectory(path)
+}
+
+func (r resolverQuery) loadAsDirectory(path string) (PathPair, bool, *fs.DifferentCase) {
+	extensionOrder := r.options.ExtensionOrder
+	if r.kind.MustResolveToCSS() {
+		// Use a special import order for CSS "@import" imports
+		extensionOrder = r.cssExtensionOrder
+	} else if helpers.IsInsideNodeModules(path) {
+		// Use a special import order for imports inside "node_modules"
+		extensionOrder = r.nodeModulesExtensionOrder
+	}
+
 	// Is this a directory?
 	if r.debugLogs != nil {
 		r.debugLogs.addNote(fmt.Sprintf("Attempting to load %q as a directory", path))
diff --git a/source/vendor/github.com/evanw/esbuild/pkg/api/api.go b/source/vendor/github.com/evanw/esbuild/pkg/api/api.go
index 6f426b6..811592a 100644
--- a/source/vendor/github.com/evanw/esbuild/pkg/api/api.go
+++ b/source/vendor/github.com/evanw/esbuild/pkg/api/api.go
@@ -478,9 +478,15 @@ type ServeOptions struct {
 	Keyfile   string
 	Certfile  string
 	Fallback  string
+	CORS      CORSOptions
 	OnRequest func(ServeOnRequestArgs)
 }
 
+// Documentation: https://esbuild.github.io/api/#cors
+type CORSOptions struct {
+	Origin []string
+}
+
 type ServeOnRequestArgs struct {
 	RemoteAddress string
 	Method        string
diff --git a/source/vendor/github.com/evanw/esbuild/pkg/api/serve_other.go b/source/vendor/github.com/evanw/esbuild/pkg/api/serve_other.go
index 9f95da3..e7d180f 100644
--- a/source/vendor/github.com/evanw/esbuild/pkg/api/serve_other.go
+++ b/source/vendor/github.com/evanw/esbuild/pkg/api/serve_other.go
@@ -49,6 +49,7 @@ type apiHandler struct {
 	certfileToLower  string
 	fallback         string
 	hosts            []string
+	corsOrigin       []string
 	serveWaitGroup   sync.WaitGroup
 	activeStreams    []chan serverSentEvent
 	currentHashes    map[string]string
@@ -104,6 +105,25 @@ func errorsToString(errors []Message) string {
 func (h *apiHandler) ServeHTTP(res http.ResponseWriter, req *http.Request) {
 	start := time.Now()
 
+	// Add CORS headers to all relevant requests
+	if origin := req.Header.Get("Origin"); origin != "" {
+		for _, allowed := range h.corsOrigin {
+			if allowed == "*" {
+				res.Header().Set("Access-Control-Allow-Origin", "*")
+				break
+			} else if star := strings.IndexByte(allowed, '*'); star >= 0 {
+				prefix, suffix := allowed[:star], allowed[star+1:]
+				if len(origin) >= len(prefix)+len(suffix) && strings.HasPrefix(origin, prefix) && strings.HasSuffix(origin, suffix) {
+					res.Header().Set("Access-Control-Allow-Origin", origin)
+					break
+				}
+			} else if origin == allowed {
+				res.Header().Set("Access-Control-Allow-Origin", origin)
+				break
+			}
+		}
+	}
+
 	// HEAD requests omit the body
 	maybeWriteResponseBody := func(bytes []byte) { res.Write(bytes) }
 	isHEAD := req.Method == "HEAD"
@@ -736,6 +756,13 @@ func (ctx *internalContext) Serve(serveOptions ServeOptions) (ServeResult, error
 		}
 	}
 
+	// Validate the CORS origins
+	for _, origin := range serveOptions.CORS.Origin {
+		if star := strings.IndexByte(origin, '*'); star >= 0 && strings.ContainsRune(origin[star+1:], '*') {
+			return ServeResult{}, fmt.Errorf("Invalid origin: %s", origin)
+		}
+	}
+
 	// Stuff related to the output directory only matters if there are entry points
 	outdirPathPrefix := ""
 	if len(ctx.args.entryPoints) > 0 {
@@ -774,13 +801,20 @@ func (ctx *internalContext) Serve(serveOptions ServeOptions) (ServeResult, error
 	var listener net.Listener
 	network := "tcp4"
 	host := "0.0.0.0"
+	hostIsIP := true
 	if serveOptions.Host != "" {
 		host = serveOptions.Host
+		ip := net.ParseIP(host)
 
 		// Only use "tcp4" if this is an IPv4 address, otherwise use "tcp"
-		if ip := net.ParseIP(host); ip == nil || ip.To4() == nil {
+		if ip == nil || ip.To4() == nil {
 			network = "tcp"
 		}
+
+		// Remember whether the host is a valid IP address or not
+		if ip == nil {
+			hostIsIP = false
+		}
 	}
 
 	// Pick the port
@@ -833,6 +867,14 @@ func (ctx *internalContext) Serve(serveOptions ServeOptions) (ServeResult, error
 		result.Hosts = append(result.Hosts, boundHost)
 	}
 
+	// If the host isn't a valid IP address, add it to the list of allowed hosts.
+	// For example, mapping "local.example.com" to "127.0.0.1" in "/etc/hosts"
+	// and then using "--serve=local.example.com:8000" should make it possible to
+	// successfully visit "http://local.example.com:8000/" in a browser.
+	if !hostIsIP {
+		result.Hosts = append(result.Hosts, host)
+	}
+
 	// HTTPS-related files should be absolute paths
 	isHTTPS := serveOptions.Keyfile != "" && serveOptions.Certfile != ""
 	if isHTTPS {
@@ -853,6 +895,7 @@ func (ctx *internalContext) Serve(serveOptions ServeOptions) (ServeResult, error
 		certfileToLower:  strings.ToLower(serveOptions.Certfile),
 		fallback:         serveOptions.Fallback,
 		hosts:            append([]string{}, result.Hosts...),
+		corsOrigin:       append([]string{}, serveOptions.CORS.Origin...),
 		rebuild: func() BuildResult {
 			if atomic.LoadInt32(&shouldStop) != 0 {
 				// Don't start more rebuilds if we were told to stop
diff --git a/source/vendor/github.com/muesli/termenv/.golangci-soft.yml b/source/vendor/github.com/muesli/termenv/.golangci-soft.yml
index ef456e0..84e3d41 100644
--- a/source/vendor/github.com/muesli/termenv/.golangci-soft.yml
+++ b/source/vendor/github.com/muesli/termenv/.golangci-soft.yml
@@ -20,10 +20,9 @@ linters:
     - goconst
     - godot
     - godox
-    - gomnd
+    - mnd
     - gomoddirectives
     - goprintffuncname
-    - ifshort
     # - lll
     - misspell
     - nakedret
@@ -35,13 +34,10 @@ linters:
 
   # disable default linters, they are already enabled in .golangci.yml
   disable:
-    - deadcode
     - errcheck
     - gosimple
     - govet
     - ineffassign
     - staticcheck
-    - structcheck
     - typecheck
     - unused
-    - varcheck
diff --git a/source/vendor/github.com/muesli/termenv/.golangci.yml b/source/vendor/github.com/muesli/termenv/.golangci.yml
index a5a91d0..684d54b 100644
--- a/source/vendor/github.com/muesli/termenv/.golangci.yml
+++ b/source/vendor/github.com/muesli/termenv/.golangci.yml
@@ -15,7 +15,6 @@ issues:
 linters:
   enable:
     - bodyclose
-    - exportloopref
     - goimports
     - gosec
     - nilerr
diff --git a/source/vendor/github.com/muesli/termenv/README.md b/source/vendor/github.com/muesli/termenv/README.md
index 29dcf01..fa7929d 100644
--- a/source/vendor/github.com/muesli/termenv/README.md
+++ b/source/vendor/github.com/muesli/termenv/README.md
@@ -307,7 +307,7 @@ termenv.DisableBracketedPaste()
 
 ### Color Support
 
-- 24-bit (RGB): alacritty, foot, iTerm, kitty, Konsole, st, tmux, vte-based, wezterm, Windows Terminal
+- 24-bit (RGB): alacritty, foot, iTerm, kitty, Konsole, st, tmux, vte-based, wezterm, Ghostty, Windows Terminal
 - 8-bit (256): rxvt, screen, xterm, Apple Terminal
 - 4-bit (16): Linux Console
 
@@ -350,7 +350,7 @@ You can help improve this list! Check out [how to](ansi_compat.md) and open an i
 
 | Terminal         | Copy to Clipboard (OSC52) | Hyperlinks (OSC8) | Notifications (OSC777) |
 | ---------------- | :-----------------------: | :---------------: | :--------------------: |
-| alacritty        |            ✅             |  ❌[^alacritty]   |           ❌           |
+| alacritty        |            ✅             |  ✅[^alacritty]   |           ❌           |
 | foot             |            ✅             |        ✅         |           ✅           |
 | kitty            |            ✅             |        ✅         |           ✅           |
 | Konsole          |       ❌[^konsole]        |        ✅         |           ❌           |
@@ -374,7 +374,7 @@ You can help improve this list! Check out [how to](ansi_compat.md) and open an i
 [^apple]: OSC52 works with a [workaround](https://github.com/roy2220/osc52pty).
 [^tmux]: OSC8 is not supported, for more info see [issue#911](https://github.com/tmux/tmux/issues/911).
 [^screen]: OSC8 is not supported, for more info see [bug#50952](https://savannah.gnu.org/bugs/index.php?50952).
-[^alacritty]: OSC8 is not supported, for more info see [issue#922](https://github.com/alacritty/alacritty/issues/922).
+[^alacritty]: OSC8 is supported since [v0.11.0](https://github.com/alacritty/alacritty/releases/tag/v0.11.0)
 
 </details>
 
diff --git a/source/vendor/github.com/muesli/termenv/ansicolors.go b/source/vendor/github.com/muesli/termenv/ansicolors.go
index ee303e2..1a301b0 100644
--- a/source/vendor/github.com/muesli/termenv/ansicolors.go
+++ b/source/vendor/github.com/muesli/termenv/ansicolors.go
@@ -1,6 +1,6 @@
 package termenv
 
-// ANSI color codes
+// ANSI color codes.
 const (
 	ANSIBlack ANSIColor = iota
 	ANSIRed
diff --git a/source/vendor/github.com/muesli/termenv/color.go b/source/vendor/github.com/muesli/termenv/color.go
index 1a216e9..59e639b 100644
--- a/source/vendor/github.com/muesli/termenv/color.go
+++ b/source/vendor/github.com/muesli/termenv/color.go
@@ -9,12 +9,10 @@ import (
 	"github.com/lucasb-eyer/go-colorful"
 )
 
-var (
-	// ErrInvalidColor gets returned when a color is invalid.
-	ErrInvalidColor = errors.New("invalid color")
-)
+// ErrInvalidColor gets returned when a color is invalid.
+var ErrInvalidColor = errors.New("invalid color")
 
-// Foreground and Background sequence codes
+// Foreground and Background sequence codes.
 const (
 	Foreground = "38"
 	Background = "48"
@@ -73,6 +71,8 @@ func (c NoColor) Sequence(_ bool) string {
 }
 
 // Sequence returns the ANSI Sequence for the color.
+//
+//nolint:mnd
 func (c ANSIColor) Sequence(bg bool) string {
 	col := int(c)
 	bgMod := func(c int) int {
@@ -83,9 +83,9 @@ func (c ANSIColor) Sequence(bg bool) string {
 	}
 
 	if col < 8 {
-		return fmt.Sprintf("%d", bgMod(col)+30)
+		return fmt.Sprintf("%d", bgMod(col)+30) //nolint:mnd
 	}
-	return fmt.Sprintf("%d", bgMod(col-8)+90)
+	return fmt.Sprintf("%d", bgMod(col-8)+90) //nolint:mnd
 }
 
 // Sequence returns the ANSI Sequence for the color.
@@ -108,7 +108,7 @@ func (c RGBColor) Sequence(bg bool) string {
 	if bg {
 		prefix = Background
 	}
-	return fmt.Sprintf("%s;2;%d;%d;%d", prefix, uint8(f.R*255), uint8(f.G*255), uint8(f.B*255))
+	return fmt.Sprintf("%s;2;%d;%d;%d", prefix, uint8(f.R*255), uint8(f.G*255), uint8(f.B*255)) //nolint:mnd
 }
 
 func xTermColor(s string) (RGBColor, error) {
@@ -158,6 +158,7 @@ func ansi256ToANSIColor(c ANSI256Color) ANSIColor {
 	return ANSIColor(r)
 }
 
+//nolint:mnd
 func hexToANSI256Color(c colorful.Color) ANSI256Color {
 	v2ci := func(v float64) int {
 		if v < 48 {
diff --git a/source/vendor/github.com/muesli/termenv/constants_zos.go b/source/vendor/github.com/muesli/termenv/constants_zos.go
new file mode 100644
index 0000000..4262f03
--- /dev/null
+++ b/source/vendor/github.com/muesli/termenv/constants_zos.go
@@ -0,0 +1,8 @@
+package termenv
+
+import "golang.org/x/sys/unix"
+
+const (
+	tcgetattr = unix.TCGETS
+	tcsetattr = unix.TCSETS
+)
diff --git a/source/vendor/github.com/muesli/termenv/output.go b/source/vendor/github.com/muesli/termenv/output.go
index e22d369..e4434de 100644
--- a/source/vendor/github.com/muesli/termenv/output.go
+++ b/source/vendor/github.com/muesli/termenv/output.go
@@ -6,12 +6,12 @@ import (
 	"sync"
 )
 
-var (
-	// output is the default global output.
-	output = NewOutput(os.Stdout)
-)
+// output is the default global output.
+var output = NewOutput(os.Stdout)
 
 // File represents a file descriptor.
+//
+// Deprecated: Use *os.File instead.
 type File interface {
 	io.ReadWriter
 	Fd() uintptr
@@ -23,7 +23,7 @@ type OutputOption = func(*Output)
 // Output is a terminal output.
 type Output struct {
 	Profile
-	tty     io.Writer
+	w       io.Writer
 	environ Environ
 
 	assumeTTY bool
@@ -61,10 +61,10 @@ func SetDefaultOutput(o *Output) {
 	output = o
 }
 
-// NewOutput returns a new Output for the given file descriptor.
-func NewOutput(tty io.Writer, opts ...OutputOption) *Output {
+// NewOutput returns a new Output for the given writer.
+func NewOutput(w io.Writer, opts ...OutputOption) *Output {
 	o := &Output{
-		tty:     tty,
+		w:       w,
 		environ: &osEnviron{},
 		Profile: -1,
 		fgSync:  &sync.Once{},
@@ -73,8 +73,8 @@ func NewOutput(tty io.Writer, opts ...OutputOption) *Output {
 		bgColor: NoColor{},
 	}
 
-	if o.tty == nil {
-		o.tty = os.Stdout
+	if o.w == nil {
+		o.w = os.Stdout
 	}
 	for _, opt := range opts {
 		opt(o)
@@ -175,20 +175,28 @@ func (o *Output) BackgroundColor() Color {
 func (o *Output) HasDarkBackground() bool {
 	c := ConvertToRGB(o.BackgroundColor())
 	_, _, l := c.Hsl()
-	return l < 0.5
+	return l < 0.5 //nolint:mnd
 }
 
 // TTY returns the terminal's file descriptor. This may be nil if the output is
 // not a terminal.
+//
+// Deprecated: Use Writer() instead.
 func (o Output) TTY() File {
-	if f, ok := o.tty.(File); ok {
+	if f, ok := o.w.(File); ok {
 		return f
 	}
 	return nil
 }
 
+// Writer returns the underlying writer. This may be of type io.Writer,
+// io.ReadWriter, or *os.File.
+func (o Output) Writer() io.Writer {
+	return o.w
+}
+
 func (o Output) Write(p []byte) (int, error) {
-	return o.tty.Write(p)
+	return o.w.Write(p) //nolint:wrapcheck
 }
 
 // WriteString writes the given string to the output.
diff --git a/source/vendor/github.com/muesli/termenv/profile.go b/source/vendor/github.com/muesli/termenv/profile.go
index fa128e2..7d38f5f 100644
--- a/source/vendor/github.com/muesli/termenv/profile.go
+++ b/source/vendor/github.com/muesli/termenv/profile.go
@@ -12,16 +12,31 @@ import (
 type Profile int
 
 const (
-	// TrueColor, 24-bit color profile
+	// TrueColor, 24-bit color profile.
 	TrueColor = Profile(iota)
-	// ANSI256, 8-bit color profile
+	// ANSI256, 8-bit color profile.
 	ANSI256
-	// ANSI, 4-bit color profile
+	// ANSI, 4-bit color profile.
 	ANSI
-	// Ascii, uncolored profile
+	// Ascii, uncolored profile.
 	Ascii //nolint:revive
 )
 
+// Name returns the profile name as a string.
+func (p Profile) Name() string {
+	switch p {
+	case Ascii:
+		return "Ascii"
+	case ANSI:
+		return "ANSI"
+	case ANSI256:
+		return "ANSI256"
+	case TrueColor:
+		return "TrueColor"
+	}
+	return "Unknown"
+}
+
 // String returns a new Style.
 func (p Profile) String(s ...string) Style {
 	return Style{
@@ -80,7 +95,7 @@ func (p Profile) Color(s string) Color {
 			return nil
 		}
 
-		if i < 16 {
+		if i < 16 { //nolint:mnd
 			c = ANSIColor(i)
 		} else {
 			c = ANSI256Color(i)
diff --git a/source/vendor/github.com/muesli/termenv/screen.go b/source/vendor/github.com/muesli/termenv/screen.go
index a71181b..75c11d0 100644
--- a/source/vendor/github.com/muesli/termenv/screen.go
+++ b/source/vendor/github.com/muesli/termenv/screen.go
@@ -71,234 +71,234 @@ const (
 
 // Reset the terminal to its default style, removing any active styles.
 func (o Output) Reset() {
-	fmt.Fprint(o.tty, CSI+ResetSeq+"m")
+	fmt.Fprint(o.w, CSI+ResetSeq+"m") //nolint:errcheck
 }
 
 // SetForegroundColor sets the default foreground color.
 func (o Output) SetForegroundColor(color Color) {
-	fmt.Fprintf(o.tty, OSC+SetForegroundColorSeq, color)
+	fmt.Fprintf(o.w, OSC+SetForegroundColorSeq, color) //nolint:errcheck
 }
 
 // SetBackgroundColor sets the default background color.
 func (o Output) SetBackgroundColor(color Color) {
-	fmt.Fprintf(o.tty, OSC+SetBackgroundColorSeq, color)
+	fmt.Fprintf(o.w, OSC+SetBackgroundColorSeq, color) //nolint:errcheck
 }
 
 // SetCursorColor sets the cursor color.
 func (o Output) SetCursorColor(color Color) {
-	fmt.Fprintf(o.tty, OSC+SetCursorColorSeq, color)
+	fmt.Fprintf(o.w, OSC+SetCursorColorSeq, color) //nolint:errcheck
 }
 
 // RestoreScreen restores a previously saved screen state.
 func (o Output) RestoreScreen() {
-	fmt.Fprint(o.tty, CSI+RestoreScreenSeq)
+	fmt.Fprint(o.w, CSI+RestoreScreenSeq) //nolint:errcheck
 }
 
 // SaveScreen saves the screen state.
 func (o Output) SaveScreen() {
-	fmt.Fprint(o.tty, CSI+SaveScreenSeq)
+	fmt.Fprint(o.w, CSI+SaveScreenSeq) //nolint:errcheck
 }
 
 // AltScreen switches to the alternate screen buffer. The former view can be
 // restored with ExitAltScreen().
 func (o Output) AltScreen() {
-	fmt.Fprint(o.tty, CSI+AltScreenSeq)
+	fmt.Fprint(o.w, CSI+AltScreenSeq) //nolint:errcheck
 }
 
 // ExitAltScreen exits the alternate screen buffer and returns to the former
 // terminal view.
 func (o Output) ExitAltScreen() {
-	fmt.Fprint(o.tty, CSI+ExitAltScreenSeq)
+	fmt.Fprint(o.w, CSI+ExitAltScreenSeq) //nolint:errcheck
 }
 
 // ClearScreen clears the visible portion of the terminal.
 func (o Output) ClearScreen() {
-	fmt.Fprintf(o.tty, CSI+EraseDisplaySeq, 2)
+	fmt.Fprintf(o.w, CSI+EraseDisplaySeq, 2) //nolint:errcheck,mnd
 	o.MoveCursor(1, 1)
 }
 
 // MoveCursor moves the cursor to a given position.
 func (o Output) MoveCursor(row int, column int) {
-	fmt.Fprintf(o.tty, CSI+CursorPositionSeq, row, column)
+	fmt.Fprintf(o.w, CSI+CursorPositionSeq, row, column) //nolint:errcheck
 }
 
 // HideCursor hides the cursor.
 func (o Output) HideCursor() {
-	fmt.Fprint(o.tty, CSI+HideCursorSeq)
+	fmt.Fprint(o.w, CSI+HideCursorSeq) //nolint:errcheck
 }
 
 // ShowCursor shows the cursor.
 func (o Output) ShowCursor() {
-	fmt.Fprint(o.tty, CSI+ShowCursorSeq)
+	fmt.Fprint(o.w, CSI+ShowCursorSeq) //nolint:errcheck
 }
 
 // SaveCursorPosition saves the cursor position.
 func (o Output) SaveCursorPosition() {
-	fmt.Fprint(o.tty, CSI+SaveCursorPositionSeq)
+	fmt.Fprint(o.w, CSI+SaveCursorPositionSeq) //nolint:errcheck
 }
 
 // RestoreCursorPosition restores a saved cursor position.
 func (o Output) RestoreCursorPosition() {
-	fmt.Fprint(o.tty, CSI+RestoreCursorPositionSeq)
+	fmt.Fprint(o.w, CSI+RestoreCursorPositionSeq) //nolint:errcheck
 }
 
 // CursorUp moves the cursor up a given number of lines.
 func (o Output) CursorUp(n int) {
-	fmt.Fprintf(o.tty, CSI+CursorUpSeq, n)
+	fmt.Fprintf(o.w, CSI+CursorUpSeq, n) //nolint:errcheck
 }
 
 // CursorDown moves the cursor down a given number of lines.
 func (o Output) CursorDown(n int) {
-	fmt.Fprintf(o.tty, CSI+CursorDownSeq, n)
+	fmt.Fprintf(o.w, CSI+CursorDownSeq, n) //nolint:errcheck
 }
 
 // CursorForward moves the cursor up a given number of lines.
 func (o Output) CursorForward(n int) {
-	fmt.Fprintf(o.tty, CSI+CursorForwardSeq, n)
+	fmt.Fprintf(o.w, CSI+CursorForwardSeq, n) //nolint:errcheck
 }
 
 // CursorBack moves the cursor backwards a given number of cells.
 func (o Output) CursorBack(n int) {
-	fmt.Fprintf(o.tty, CSI+CursorBackSeq, n)
+	fmt.Fprintf(o.w, CSI+CursorBackSeq, n) //nolint:errcheck
 }
 
 // CursorNextLine moves the cursor down a given number of lines and places it at
 // the beginning of the line.
 func (o Output) CursorNextLine(n int) {
-	fmt.Fprintf(o.tty, CSI+CursorNextLineSeq, n)
+	fmt.Fprintf(o.w, CSI+CursorNextLineSeq, n) //nolint:errcheck
 }
 
 // CursorPrevLine moves the cursor up a given number of lines and places it at
 // the beginning of the line.
 func (o Output) CursorPrevLine(n int) {
-	fmt.Fprintf(o.tty, CSI+CursorPreviousLineSeq, n)
+	fmt.Fprintf(o.w, CSI+CursorPreviousLineSeq, n) //nolint:errcheck
 }
 
 // ClearLine clears the current line.
 func (o Output) ClearLine() {
-	fmt.Fprint(o.tty, CSI+EraseEntireLineSeq)
+	fmt.Fprint(o.w, CSI+EraseEntireLineSeq) //nolint:errcheck
 }
 
 // ClearLineLeft clears the line to the left of the cursor.
 func (o Output) ClearLineLeft() {
-	fmt.Fprint(o.tty, CSI+EraseLineLeftSeq)
+	fmt.Fprint(o.w, CSI+EraseLineLeftSeq) //nolint:errcheck
 }
 
 // ClearLineRight clears the line to the right of the cursor.
 func (o Output) ClearLineRight() {
-	fmt.Fprint(o.tty, CSI+EraseLineRightSeq)
+	fmt.Fprint(o.w, CSI+EraseLineRightSeq) //nolint:errcheck
 }
 
 // ClearLines clears a given number of lines.
 func (o Output) ClearLines(n int) {
-	clearLine := fmt.Sprintf(CSI+EraseLineSeq, 2)
+	clearLine := fmt.Sprintf(CSI+EraseLineSeq, 2) //nolint:mnd
 	cursorUp := fmt.Sprintf(CSI+CursorUpSeq, 1)
-	fmt.Fprint(o.tty, clearLine+strings.Repeat(cursorUp+clearLine, n))
+	fmt.Fprint(o.w, clearLine+strings.Repeat(cursorUp+clearLine, n)) //nolint:errcheck
 }
 
 // ChangeScrollingRegion sets the scrolling region of the terminal.
 func (o Output) ChangeScrollingRegion(top, bottom int) {
-	fmt.Fprintf(o.tty, CSI+ChangeScrollingRegionSeq, top, bottom)
+	fmt.Fprintf(o.w, CSI+ChangeScrollingRegionSeq, top, bottom) //nolint:errcheck
 }
 
 // InsertLines inserts the given number of lines at the top of the scrollable
 // region, pushing lines below down.
 func (o Output) InsertLines(n int) {
-	fmt.Fprintf(o.tty, CSI+InsertLineSeq, n)
+	fmt.Fprintf(o.w, CSI+InsertLineSeq, n) //nolint:errcheck
 }
 
 // DeleteLines deletes the given number of lines, pulling any lines in
 // the scrollable region below up.
 func (o Output) DeleteLines(n int) {
-	fmt.Fprintf(o.tty, CSI+DeleteLineSeq, n)
+	fmt.Fprintf(o.w, CSI+DeleteLineSeq, n) //nolint:errcheck
 }
 
 // EnableMousePress enables X10 mouse mode. Button press events are sent only.
 func (o Output) EnableMousePress() {
-	fmt.Fprint(o.tty, CSI+EnableMousePressSeq)
+	fmt.Fprint(o.w, CSI+EnableMousePressSeq) //nolint:errcheck
 }
 
 // DisableMousePress disables X10 mouse mode.
 func (o Output) DisableMousePress() {
-	fmt.Fprint(o.tty, CSI+DisableMousePressSeq)
+	fmt.Fprint(o.w, CSI+DisableMousePressSeq) //nolint:errcheck
 }
 
 // EnableMouse enables Mouse Tracking mode.
 func (o Output) EnableMouse() {
-	fmt.Fprint(o.tty, CSI+EnableMouseSeq)
+	fmt.Fprint(o.w, CSI+EnableMouseSeq) //nolint:errcheck
 }
 
 // DisableMouse disables Mouse Tracking mode.
 func (o Output) DisableMouse() {
-	fmt.Fprint(o.tty, CSI+DisableMouseSeq)
+	fmt.Fprint(o.w, CSI+DisableMouseSeq) //nolint:errcheck
 }
 
 // EnableMouseHilite enables Hilite Mouse Tracking mode.
 func (o Output) EnableMouseHilite() {
-	fmt.Fprint(o.tty, CSI+EnableMouseHiliteSeq)
+	fmt.Fprint(o.w, CSI+EnableMouseHiliteSeq) //nolint:errcheck
 }
 
 // DisableMouseHilite disables Hilite Mouse Tracking mode.
 func (o Output) DisableMouseHilite() {
-	fmt.Fprint(o.tty, CSI+DisableMouseHiliteSeq)
+	fmt.Fprint(o.w, CSI+DisableMouseHiliteSeq) //nolint:errcheck
 }
 
 // EnableMouseCellMotion enables Cell Motion Mouse Tracking mode.
 func (o Output) EnableMouseCellMotion() {
-	fmt.Fprint(o.tty, CSI+EnableMouseCellMotionSeq)
+	fmt.Fprint(o.w, CSI+EnableMouseCellMotionSeq) //nolint:errcheck
 }
 
 // DisableMouseCellMotion disables Cell Motion Mouse Tracking mode.
 func (o Output) DisableMouseCellMotion() {
-	fmt.Fprint(o.tty, CSI+DisableMouseCellMotionSeq)
+	fmt.Fprint(o.w, CSI+DisableMouseCellMotionSeq) //nolint:errcheck
 }
 
 // EnableMouseAllMotion enables All Motion Mouse mode.
 func (o Output) EnableMouseAllMotion() {
-	fmt.Fprint(o.tty, CSI+EnableMouseAllMotionSeq)
+	fmt.Fprint(o.w, CSI+EnableMouseAllMotionSeq) //nolint:errcheck
 }
 
 // DisableMouseAllMotion disables All Motion Mouse mode.
 func (o Output) DisableMouseAllMotion() {
-	fmt.Fprint(o.tty, CSI+DisableMouseAllMotionSeq)
+	fmt.Fprint(o.w, CSI+DisableMouseAllMotionSeq) //nolint:errcheck
 }
 
 // EnableMouseExtendedMotion enables Extended Mouse mode (SGR). This should be
 // enabled in conjunction with EnableMouseCellMotion, and EnableMouseAllMotion.
 func (o Output) EnableMouseExtendedMode() {
-	fmt.Fprint(o.tty, CSI+EnableMouseExtendedModeSeq)
+	fmt.Fprint(o.w, CSI+EnableMouseExtendedModeSeq) //nolint:errcheck
 }
 
 // DisableMouseExtendedMotion disables Extended Mouse mode (SGR).
 func (o Output) DisableMouseExtendedMode() {
-	fmt.Fprint(o.tty, CSI+DisableMouseExtendedModeSeq)
+	fmt.Fprint(o.w, CSI+DisableMouseExtendedModeSeq) //nolint:errcheck
 }
 
 // EnableMousePixelsMotion enables Pixel Motion Mouse mode (SGR-Pixels). This
 // should be enabled in conjunction with EnableMouseCellMotion, and
 // EnableMouseAllMotion.
 func (o Output) EnableMousePixelsMode() {
-	fmt.Fprint(o.tty, CSI+EnableMousePixelsModeSeq)
+	fmt.Fprint(o.w, CSI+EnableMousePixelsModeSeq) //nolint:errcheck
 }
 
 // DisableMousePixelsMotion disables Pixel Motion Mouse mode (SGR-Pixels).
 func (o Output) DisableMousePixelsMode() {
-	fmt.Fprint(o.tty, CSI+DisableMousePixelsModeSeq)
+	fmt.Fprint(o.w, CSI+DisableMousePixelsModeSeq) //nolint:errcheck
 }
 
 // SetWindowTitle sets the terminal window title.
 func (o Output) SetWindowTitle(title string) {
-	fmt.Fprintf(o.tty, OSC+SetWindowTitleSeq, title)
+	fmt.Fprintf(o.w, OSC+SetWindowTitleSeq, title) //nolint:errcheck
 }
 
 // EnableBracketedPaste enables bracketed paste.
 func (o Output) EnableBracketedPaste() {
-	fmt.Fprintf(o.tty, CSI+EnableBracketedPasteSeq)
+	fmt.Fprintf(o.w, CSI+EnableBracketedPasteSeq) //nolint:errcheck
 }
 
 // DisableBracketedPaste disables bracketed paste.
 func (o Output) DisableBracketedPaste() {
-	fmt.Fprintf(o.tty, CSI+DisableBracketedPasteSeq)
+	fmt.Fprintf(o.w, CSI+DisableBracketedPasteSeq) //nolint:errcheck
 }
 
 // Legacy functions.
diff --git a/source/vendor/github.com/muesli/termenv/style.go b/source/vendor/github.com/muesli/termenv/style.go
index 83b0b4d..dedc1f9 100644
--- a/source/vendor/github.com/muesli/termenv/style.go
+++ b/source/vendor/github.com/muesli/termenv/style.go
@@ -4,7 +4,7 @@ import (
 	"fmt"
 	"strings"
 
-	"github.com/mattn/go-runewidth"
+	"github.com/rivo/uniseg"
 )
 
 // Sequence definitions.
@@ -122,5 +122,5 @@ func (t Style) CrossOut() Style {
 
 // Width returns the width required to print all runes in Style.
 func (t Style) Width() int {
-	return runewidth.StringWidth(t.string)
+	return uniseg.StringWidth(t.string)
 }
diff --git a/source/vendor/github.com/muesli/termenv/templatehelper.go b/source/vendor/github.com/muesli/termenv/templatehelper.go
index d75b079..4c7c80f 100644
--- a/source/vendor/github.com/muesli/termenv/templatehelper.go
+++ b/source/vendor/github.com/muesli/termenv/templatehelper.go
@@ -10,6 +10,8 @@ func (o Output) TemplateFuncs() template.FuncMap {
 }
 
 // TemplateFuncs contains a few useful template helpers.
+//
+//nolint:mnd
 func TemplateFuncs(p Profile) template.FuncMap {
 	if p == Ascii {
 		return noopTemplateFuncs
diff --git a/source/vendor/github.com/muesli/termenv/termenv.go b/source/vendor/github.com/muesli/termenv/termenv.go
index 4ceb271..d702cd5 100644
--- a/source/vendor/github.com/muesli/termenv/termenv.go
+++ b/source/vendor/github.com/muesli/termenv/termenv.go
@@ -2,6 +2,7 @@ package termenv
 
 import (
 	"errors"
+	"os"
 
 	"github.com/mattn/go-isatty"
 )
@@ -12,15 +13,15 @@ var (
 )
 
 const (
-	// Escape character
+	// Escape character.
 	ESC = '\x1b'
-	// Bell
+	// Bell.
 	BEL = '\a'
-	// Control Sequence Introducer
+	// Control Sequence Introducer.
 	CSI = string(ESC) + "["
-	// Operating System Command
+	// Operating System Command.
 	OSC = string(ESC) + "]"
-	// String Terminator
+	// String Terminator.
 	ST = string(ESC) + `\`
 )
 
@@ -31,11 +32,11 @@ func (o *Output) isTTY() bool {
 	if len(o.environ.Getenv("CI")) > 0 {
 		return false
 	}
-	if o.TTY() == nil {
-		return false
+	if f, ok := o.Writer().(*os.File); ok {
+		return isatty.IsTerminal(f.Fd())
 	}
 
-	return isatty.IsTerminal(o.TTY().Fd())
+	return false
 }
 
 // ColorProfile returns the supported color profile:
diff --git a/source/vendor/github.com/muesli/termenv/termenv_posix.go b/source/vendor/github.com/muesli/termenv/termenv_posix.go
index b2109b7..c971dd9 100644
--- a/source/vendor/github.com/muesli/termenv/termenv_posix.go
+++ b/source/vendor/github.com/muesli/termenv/termenv_posix.go
@@ -1,5 +1,5 @@
-//go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd
-// +build darwin dragonfly freebsd linux netbsd openbsd
+//go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd || zos
+// +build darwin dragonfly freebsd linux netbsd openbsd zos
 
 package termenv
 
diff --git a/source/vendor/github.com/muesli/termenv/termenv_unix.go b/source/vendor/github.com/muesli/termenv/termenv_unix.go
index 24d519a..bef49ca 100644
--- a/source/vendor/github.com/muesli/termenv/termenv_unix.go
+++ b/source/vendor/github.com/muesli/termenv/termenv_unix.go
@@ -1,5 +1,5 @@
-//go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris
-// +build darwin dragonfly freebsd linux netbsd openbsd solaris
+//go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos
+// +build darwin dragonfly freebsd linux netbsd openbsd solaris zos
 
 package termenv
 
@@ -14,7 +14,7 @@ import (
 )
 
 const (
-	// timeout for OSC queries
+	// timeout for OSC queries.
 	OSCTimeout = 5 * time.Second
 )
 
@@ -50,9 +50,15 @@ func (o *Output) ColorProfile() Profile {
 	}
 
 	switch term {
-	case "xterm-kitty", "wezterm":
+	case
+		"alacritty",
+		"contour",
+		"rio",
+		"wezterm",
+		"xterm-ghostty",
+		"xterm-kitty":
 		return TrueColor
-	case "linux":
+	case "linux", "xterm":
 		return ANSI
 	}
 
@@ -69,6 +75,7 @@ func (o *Output) ColorProfile() Profile {
 	return Ascii
 }
 
+//nolint:mnd
 func (o Output) foregroundColor() Color {
 	s, err := o.termStatusReport(10)
 	if err == nil {
@@ -91,6 +98,7 @@ func (o Output) foregroundColor() Color {
 	return ANSIColor(7)
 }
 
+//nolint:mnd
 func (o Output) backgroundColor() Color {
 	s, err := o.termStatusReport(11)
 	if err == nil {
@@ -117,15 +125,15 @@ func (o *Output) waitForData(timeout time.Duration) error {
 	fd := o.TTY().Fd()
 	tv := unix.NsecToTimeval(int64(timeout))
 	var readfds unix.FdSet
-	readfds.Set(int(fd))
+	readfds.Set(int(fd)) //nolint:gosec
 
 	for {
-		n, err := unix.Select(int(fd)+1, &readfds, nil, nil, &tv)
+		n, err := unix.Select(int(fd)+1, &readfds, nil, nil, &tv) //nolint:gosec
 		if err == unix.EINTR {
 			continue
 		}
 		if err != nil {
-			return err
+			return err //nolint:wrapcheck
 		}
 		if n == 0 {
 			return fmt.Errorf("timeout")
@@ -147,7 +155,7 @@ func (o *Output) readNextByte() (byte, error) {
 	var b [1]byte
 	n, err := o.TTY().Read(b[:])
 	if err != nil {
-		return 0, err
+		return 0, err //nolint:wrapcheck
 	}
 
 	if n == 0 {
@@ -215,7 +223,7 @@ func (o *Output) readNextResponse() (response string, isOSC bool, err error) {
 		}
 
 		// both responses have less than 25 bytes, so if we read more, that's an error
-		if len(response) > 25 {
+		if len(response) > 25 { //nolint:mnd
 			break
 		}
 	}
@@ -227,7 +235,7 @@ func (o Output) termStatusReport(sequence int) (string, error) {
 	// screen/tmux can't support OSC, because they can be connected to multiple
 	// terminals concurrently.
 	term := o.environ.Getenv("TERM")
-	if strings.HasPrefix(term, "screen") || strings.HasPrefix(term, "tmux") {
+	if strings.HasPrefix(term, "screen") || strings.HasPrefix(term, "tmux") || strings.HasPrefix(term, "dumb") {
 		return "", ErrStatusReport
 	}
 
@@ -237,7 +245,7 @@ func (o Output) termStatusReport(sequence int) (string, error) {
 	}
 
 	if !o.unsafe {
-		fd := int(tty.Fd())
+		fd := int(tty.Fd()) //nolint:gosec
 		// if in background, we can't control the terminal
 		if !isForeground(fd) {
 			return "", ErrStatusReport
@@ -258,10 +266,10 @@ func (o Output) termStatusReport(sequence int) (string, error) {
 	}
 
 	// first, send OSC query, which is ignored by terminal which do not support it
-	fmt.Fprintf(tty, OSC+"%d;?"+ST, sequence)
+	fmt.Fprintf(tty, OSC+"%d;?"+ST, sequence) //nolint:errcheck
 
 	// then, query cursor position, should be supported by all terminals
-	fmt.Fprintf(tty, CSI+"6n")
+	fmt.Fprintf(tty, CSI+"6n") //nolint:errcheck
 
 	// read the next response
 	res, isOSC, err := o.readNextResponse()
diff --git a/source/vendor/github.com/muesli/termenv/termenv_windows.go b/source/vendor/github.com/muesli/termenv/termenv_windows.go
index 1d9c618..f9b1def 100644
--- a/source/vendor/github.com/muesli/termenv/termenv_windows.go
+++ b/source/vendor/github.com/muesli/termenv/termenv_windows.go
@@ -5,6 +5,7 @@ package termenv
 
 import (
 	"fmt"
+	"os"
 	"strconv"
 
 	"golang.org/x/sys/windows"
@@ -103,8 +104,8 @@ func EnableVirtualTerminalProcessing(o *Output) (restoreFunc func() error, err e
 	}
 
 	// If o is not a tty, then there is nothing to do.
-	tty := o.TTY()
-	if tty == nil {
+	tty, ok := o.Writer().(*os.File)
+	if tty == nil || !ok {
 		return
 	}
 
diff --git a/source/vendor/github.com/tdewolff/parse/v2/binary.go b/source/vendor/github.com/tdewolff/parse/v2/binary.go
index 5343920..7247e6e 100644
--- a/source/vendor/github.com/tdewolff/parse/v2/binary.go
+++ b/source/vendor/github.com/tdewolff/parse/v2/binary.go
@@ -55,6 +55,11 @@ func (r *BinaryReader) Len() uint32 {
 	return uint32(len(r.buf)) - r.pos
 }
 
+// SetLen sets the remaining length of the underlying buffer.
+func (r *BinaryReader) SetLen(n uint32) {
+	r.buf = r.buf[: r.pos+n : r.pos+n]
+}
+
 // EOF returns true if we reached the end-of-file.
 func (r *BinaryReader) EOF() bool {
 	return r.eof
@@ -110,6 +115,18 @@ func (r *BinaryReader) ReadUint16() uint16 {
 	return r.Endianness.Uint16(b)
 }
 
+// ReadUint24 reads a uint24 into a uint32.
+func (r *BinaryReader) ReadUint24() uint32 {
+	b := r.ReadBytes(3)
+	if b == nil {
+		return 0
+	} else if r.Endianness == binary.LittleEndian {
+		return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16
+	} else {
+		return uint32(b[2]) | uint32(b[1])<<8 | uint32(b[0])<<16
+	}
+}
+
 // ReadUint32 reads a uint32.
 func (r *BinaryReader) ReadUint32() uint32 {
 	b := r.ReadBytes(4)
@@ -128,22 +145,27 @@ func (r *BinaryReader) ReadUint64() uint64 {
 	return r.Endianness.Uint64(b)
 }
 
-// ReadInt8 reads a int8.
+// ReadInt8 reads an int8.
 func (r *BinaryReader) ReadInt8() int8 {
 	return int8(r.ReadByte())
 }
 
-// ReadInt16 reads a int16.
+// ReadInt16 reads an int16.
 func (r *BinaryReader) ReadInt16() int16 {
 	return int16(r.ReadUint16())
 }
 
-// ReadInt32 reads a int32.
+// ReadInt24 reads a int24 into an int32.
+func (r *BinaryReader) ReadInt24() int32 {
+	return int32(r.ReadUint24())
+}
+
+// ReadInt32 reads an int32.
 func (r *BinaryReader) ReadInt32() int32 {
 	return int32(r.ReadUint32())
 }
 
-// ReadInt64 reads a int64.
+// ReadInt64 reads an int64.
 func (r *BinaryReader) ReadInt64() int64 {
 	return int64(r.ReadUint64())
 }
@@ -552,6 +574,16 @@ func (r *BinaryReader2) Read(b []byte) (int, error) {
 	return n, err
 }
 
+// ReadAt complies with io.ReaderAt.
+func (r *BinaryReader2) ReadAt(b []byte, off int64) (int, error) {
+	data, err := r.f.Bytes(len(b), off)
+	if err != nil && err != io.EOF {
+		return 0, err
+	}
+	n := copy(b, data)
+	return n, err
+}
+
 // ReadBytes reads n bytes.
 func (r *BinaryReader2) ReadBytes(n int) []byte {
 	data, err := r.f.Bytes(n, r.pos)
diff --git a/source/vendor/github.com/tdewolff/parse/v2/binary_unix.go b/source/vendor/github.com/tdewolff/parse/v2/binary_unix.go
index 4a72186..70bb876 100644
--- a/source/vendor/github.com/tdewolff/parse/v2/binary_unix.go
+++ b/source/vendor/github.com/tdewolff/parse/v2/binary_unix.go
@@ -22,12 +22,12 @@ func newBinaryReaderMmap(filename string) (*binaryReaderMmap, error) {
 	}
 	defer f.Close()
 
-	fi, err := f.Stat()
+	info, err := f.Stat()
 	if err != nil {
 		return nil, err
 	}
 
-	size := fi.Size()
+	size := info.Size()
 	if size == 0 {
 		// Treat (size == 0) as a special case, avoiding the syscall, since
 		// "man 2 mmap" says "the length... must be greater than 0".
@@ -38,9 +38,9 @@ func newBinaryReaderMmap(filename string) (*binaryReaderMmap, error) {
 			data: make([]byte, 0),
 		}, nil
 	} else if size < 0 {
-		return nil, fmt.Errorf("mmap: file %q has negative size", filename)
+		return nil, fmt.Errorf("mmap: file %s has negative size", filename)
 	} else if size != int64(int(size)) {
-		return nil, fmt.Errorf("mmap: file %q is too large", filename)
+		return nil, fmt.Errorf("mmap: file %s is too large", filename)
 	}
 
 	data, err := syscall.Mmap(int(f.Fd()), 0, int(size), syscall.PROT_READ, syscall.MAP_SHARED)
diff --git a/source/vendor/github.com/xo/terminfo/.gitignore b/source/vendor/github.com/xo/terminfo/.gitignore
new file mode 100644
index 0000000..368e0c0
--- /dev/null
+++ b/source/vendor/github.com/xo/terminfo/.gitignore
@@ -0,0 +1,9 @@
+/.cache/
+
+/cmd/infocmp/infocmp
+/cmd/infocmp/.out/
+
+/infocmp
+/.out/
+
+*.txt
diff --git a/source/vendor/github.com/xo/terminfo/LICENSE b/source/vendor/github.com/xo/terminfo/LICENSE
new file mode 100644
index 0000000..197dadb
--- /dev/null
+++ b/source/vendor/github.com/xo/terminfo/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 Anmol Sethi
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/source/vendor/github.com/xo/terminfo/README.md b/source/vendor/github.com/xo/terminfo/README.md
new file mode 100644
index 0000000..e5002d2
--- /dev/null
+++ b/source/vendor/github.com/xo/terminfo/README.md
@@ -0,0 +1,139 @@
+# About terminfo [![GoDoc][1]][2]
+
+Package `terminfo` provides a pure-Go implementation of reading information
+from the terminfo database.
+
+`terminfo` is meant as a replacement for `ncurses` in simple Go programs.
+
+## Installing
+
+Install in the usual Go way:
+
+```sh
+$ go get -u github.com/xo/terminfo
+```
+
+## Using
+
+Please see the [GoDoc API listing][2] for more information on using `terminfo`.
+
+```go
+// _examples/simple/main.go
+package main
+
+import (
+	"bytes"
+	"fmt"
+	"log"
+	"os"
+	"os/signal"
+	"strings"
+	"sync"
+	"syscall"
+
+	"github.com/xo/terminfo"
+)
+
+func main() {
+	//r := rand.New(nil)
+
+	// load terminfo
+	ti, err := terminfo.LoadFromEnv()
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	// cleanup
+	defer func() {
+		err := recover()
+		termreset(ti)
+		if err != nil {
+			log.Fatal(err)
+		}
+	}()
+
+	terminit(ti)
+	termtitle(ti, "simple example!")
+	termputs(ti, 3, 3, "Ctrl-C to exit")
+	maxColors := termcolors(ti)
+	if maxColors > 256 {
+		maxColors = 256
+	}
+	for i := 0; i < maxColors; i++ {
+		termputs(ti, 5+i/16, 5+i%16, ti.Colorf(i, 0, "█"))
+	}
+
+	// wait for signal
+	sigs := make(chan os.Signal, 1)
+	signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
+	<-sigs
+}
+
+// terminit initializes the special CA mode on the terminal, and makes the
+// cursor invisible.
+func terminit(ti *terminfo.Terminfo) {
+	buf := new(bytes.Buffer)
+	// set the cursor invisible
+	ti.Fprintf(buf, terminfo.CursorInvisible)
+	// enter special mode
+	ti.Fprintf(buf, terminfo.EnterCaMode)
+	// clear the screen
+	ti.Fprintf(buf, terminfo.ClearScreen)
+	os.Stdout.Write(buf.Bytes())
+}
+
+// termreset is the inverse of terminit.
+func termreset(ti *terminfo.Terminfo) {
+	buf := new(bytes.Buffer)
+	ti.Fprintf(buf, terminfo.ExitCaMode)
+	ti.Fprintf(buf, terminfo.CursorNormal)
+	os.Stdout.Write(buf.Bytes())
+}
+
+// termputs puts a string at row, col, interpolating v.
+func termputs(ti *terminfo.Terminfo, row, col int, s string, v ...interface{}) {
+	buf := new(bytes.Buffer)
+	ti.Fprintf(buf, terminfo.CursorAddress, row, col)
+	fmt.Fprintf(buf, s, v...)
+	os.Stdout.Write(buf.Bytes())
+}
+
+// sl is the status line terminfo.
+var sl *terminfo.Terminfo
+
+// termtitle sets the window title.
+func termtitle(ti *terminfo.Terminfo, s string) {
+	var once sync.Once
+	once.Do(func() {
+		if ti.Has(terminfo.HasStatusLine) {
+			return
+		}
+		// load the sl xterm if terminal is an xterm or has COLORTERM
+		if strings.Contains(strings.ToLower(os.Getenv("TERM")), "xterm") || os.Getenv("COLORTERM") == "truecolor" {
+			sl, _ = terminfo.Load("xterm+sl")
+		}
+	})
+	if sl != nil {
+		ti = sl
+	}
+	if !ti.Has(terminfo.HasStatusLine) {
+		return
+	}
+	buf := new(bytes.Buffer)
+	ti.Fprintf(buf, terminfo.ToStatusLine)
+	fmt.Fprint(buf, s)
+	ti.Fprintf(buf, terminfo.FromStatusLine)
+	os.Stdout.Write(buf.Bytes())
+}
+
+// termcolors returns the maximum colors available for the terminal.
+func termcolors(ti *terminfo.Terminfo) int {
+	if colors := ti.Num(terminfo.MaxColors); colors > 0 {
+		return colors
+	}
+	return int(terminfo.ColorLevelBasic)
+}
+```
+
+[1]: https://godoc.org/github.com/xo/terminfo?status.svg
+[2]: https://godoc.org/github.com/xo/terminfo
diff --git a/source/vendor/github.com/xo/terminfo/caps.go b/source/vendor/github.com/xo/terminfo/caps.go
new file mode 100644
index 0000000..e5e1d41
--- /dev/null
+++ b/source/vendor/github.com/xo/terminfo/caps.go
@@ -0,0 +1,31 @@
+package terminfo
+
+// BoolCapName returns the bool capability name.
+func BoolCapName(i int) string {
+	return boolCapNames[2*i]
+}
+
+// BoolCapNameShort returns the short bool capability name.
+func BoolCapNameShort(i int) string {
+	return boolCapNames[2*i+1]
+}
+
+// NumCapName returns the num capability name.
+func NumCapName(i int) string {
+	return numCapNames[2*i]
+}
+
+// NumCapNameShort returns the short num capability name.
+func NumCapNameShort(i int) string {
+	return numCapNames[2*i+1]
+}
+
+// StringCapName returns the string capability name.
+func StringCapName(i int) string {
+	return stringCapNames[2*i]
+}
+
+// StringCapNameShort returns the short string capability name.
+func StringCapNameShort(i int) string {
+	return stringCapNames[2*i+1]
+}
diff --git a/source/vendor/github.com/xo/terminfo/capvals.go b/source/vendor/github.com/xo/terminfo/capvals.go
new file mode 100644
index 0000000..0c2274e
--- /dev/null
+++ b/source/vendor/github.com/xo/terminfo/capvals.go
@@ -0,0 +1,1525 @@
+package terminfo
+
+// Code generated by gen.go. DO NOT EDIT.
+// Bool capabilities.
+const (
+	// The AutoLeftMargin [auto_left_margin, bw] bool capability indicates cub1 wraps from column 0 to last column.
+	AutoLeftMargin = iota
+	// The AutoRightMargin [auto_right_margin, am] bool capability indicates terminal has automatic margins.
+	AutoRightMargin
+	// The NoEscCtlc [no_esc_ctlc, xsb] bool capability indicates beehive (f1=escape, f2=ctrl C).
+	NoEscCtlc
+	// The CeolStandoutGlitch [ceol_standout_glitch, xhp] bool capability indicates standout not erased by overwriting (hp).
+	CeolStandoutGlitch
+	// The EatNewlineGlitch [eat_newline_glitch, xenl] bool capability indicates newline ignored after 80 cols (concept).
+	EatNewlineGlitch
+	// The EraseOverstrike [erase_overstrike, eo] bool capability indicates can erase overstrikes with a blank.
+	EraseOverstrike
+	// The GenericType [generic_type, gn] bool capability indicates generic line type.
+	GenericType
+	// The HardCopy [hard_copy, hc] bool capability indicates hardcopy terminal.
+	HardCopy
+	// The HasMetaKey [has_meta_key, km] bool capability indicates Has a meta key (i.e., sets 8th-bit).
+	HasMetaKey
+	// The HasStatusLine [has_status_line, hs] bool capability indicates has extra status line.
+	HasStatusLine
+	// The InsertNullGlitch [insert_null_glitch, in] bool capability indicates insert mode distinguishes nulls.
+	InsertNullGlitch
+	// The MemoryAbove [memory_above, da] bool capability indicates display may be retained above the screen.
+	MemoryAbove
+	// The MemoryBelow [memory_below, db] bool capability indicates display may be retained below the screen.
+	MemoryBelow
+	// The MoveInsertMode [move_insert_mode, mir] bool capability indicates safe to move while in insert mode.
+	MoveInsertMode
+	// The MoveStandoutMode [move_standout_mode, msgr] bool capability indicates safe to move while in standout mode.
+	MoveStandoutMode
+	// The OverStrike [over_strike, os] bool capability indicates terminal can overstrike.
+	OverStrike
+	// The StatusLineEscOk [status_line_esc_ok, eslok] bool capability indicates escape can be used on the status line.
+	StatusLineEscOk
+	// The DestTabsMagicSmso [dest_tabs_magic_smso, xt] bool capability indicates tabs destructive, magic so char (t1061).
+	DestTabsMagicSmso
+	// The TildeGlitch [tilde_glitch, hz] bool capability indicates cannot print ~'s (Hazeltine).
+	TildeGlitch
+	// The TransparentUnderline [transparent_underline, ul] bool capability indicates underline character overstrikes.
+	TransparentUnderline
+	// The XonXoff [xon_xoff, xon] bool capability indicates terminal uses xon/xoff handshaking.
+	XonXoff
+	// The NeedsXonXoff [needs_xon_xoff, nxon] bool capability indicates padding will not work, xon/xoff required.
+	NeedsXonXoff
+	// The PrtrSilent [prtr_silent, mc5i] bool capability indicates printer will not echo on screen.
+	PrtrSilent
+	// The HardCursor [hard_cursor, chts] bool capability indicates cursor is hard to see.
+	HardCursor
+	// The NonRevRmcup [non_rev_rmcup, nrrmc] bool capability indicates smcup does not reverse rmcup.
+	NonRevRmcup
+	// The NoPadChar [no_pad_char, npc] bool capability indicates pad character does not exist.
+	NoPadChar
+	// The NonDestScrollRegion [non_dest_scroll_region, ndscr] bool capability indicates scrolling region is non-destructive.
+	NonDestScrollRegion
+	// The CanChange [can_change, ccc] bool capability indicates terminal can re-define existing colors.
+	CanChange
+	// The BackColorErase [back_color_erase, bce] bool capability indicates screen erased with background color.
+	BackColorErase
+	// The HueLightnessSaturation [hue_lightness_saturation, hls] bool capability indicates terminal uses only HLS color notation (Tektronix).
+	HueLightnessSaturation
+	// The ColAddrGlitch [col_addr_glitch, xhpa] bool capability indicates only positive motion for hpa/mhpa caps.
+	ColAddrGlitch
+	// The CrCancelsMicroMode [cr_cancels_micro_mode, crxm] bool capability indicates using cr turns off micro mode.
+	CrCancelsMicroMode
+	// The HasPrintWheel [has_print_wheel, daisy] bool capability indicates printer needs operator to change character set.
+	HasPrintWheel
+	// The RowAddrGlitch [row_addr_glitch, xvpa] bool capability indicates only positive motion for vpa/mvpa caps.
+	RowAddrGlitch
+	// The SemiAutoRightMargin [semi_auto_right_margin, sam] bool capability indicates printing in last column causes cr.
+	SemiAutoRightMargin
+	// The CpiChangesRes [cpi_changes_res, cpix] bool capability indicates changing character pitch changes resolution.
+	CpiChangesRes
+	// The LpiChangesRes [lpi_changes_res, lpix] bool capability indicates changing line pitch changes resolution.
+	LpiChangesRes
+	// The BackspacesWithBs [backspaces_with_bs, OTbs] bool capability indicates uses ^H to move left.
+	BackspacesWithBs
+	// The CrtNoScrolling [crt_no_scrolling, OTns] bool capability indicates crt cannot scroll.
+	CrtNoScrolling
+	// The NoCorrectlyWorkingCr [no_correctly_working_cr, OTnc] bool capability indicates no way to go to start of line.
+	NoCorrectlyWorkingCr
+	// The GnuHasMetaKey [gnu_has_meta_key, OTMT] bool capability indicates has meta key.
+	GnuHasMetaKey
+	// The LinefeedIsNewline [linefeed_is_newline, OTNL] bool capability indicates move down with \n.
+	LinefeedIsNewline
+	// The HasHardwareTabs [has_hardware_tabs, OTpt] bool capability indicates has 8-char tabs invoked with ^I.
+	HasHardwareTabs
+	// The ReturnDoesClrEol [return_does_clr_eol, OTxr] bool capability indicates return clears the line.
+	ReturnDoesClrEol
+)
+
+// Num capabilities.
+const (
+	// The Columns [columns, cols] num capability is number of columns in a line.
+	Columns = iota
+	// The InitTabs [init_tabs, it] num capability is tabs initially every # spaces.
+	InitTabs
+	// The Lines [lines, lines] num capability is number of lines on screen or page.
+	Lines
+	// The LinesOfMemory [lines_of_memory, lm] num capability is lines of memory if > line. 0 means varies.
+	LinesOfMemory
+	// The MagicCookieGlitch [magic_cookie_glitch, xmc] num capability is number of blank characters left by smso or rmso.
+	MagicCookieGlitch
+	// The PaddingBaudRate [padding_baud_rate, pb] num capability is lowest baud rate where padding needed.
+	PaddingBaudRate
+	// The VirtualTerminal [virtual_terminal, vt] num capability is virtual terminal number (CB/unix).
+	VirtualTerminal
+	// The WidthStatusLine [width_status_line, wsl] num capability is number of columns in status line.
+	WidthStatusLine
+	// The NumLabels [num_labels, nlab] num capability is number of labels on screen.
+	NumLabels
+	// The LabelHeight [label_height, lh] num capability is rows in each label.
+	LabelHeight
+	// The LabelWidth [label_width, lw] num capability is columns in each label.
+	LabelWidth
+	// The MaxAttributes [max_attributes, ma] num capability is maximum combined attributes terminal can handle.
+	MaxAttributes
+	// The MaximumWindows [maximum_windows, wnum] num capability is maximum number of definable windows.
+	MaximumWindows
+	// The MaxColors [max_colors, colors] num capability is maximum number of colors on screen.
+	MaxColors
+	// The MaxPairs [max_pairs, pairs] num capability is maximum number of color-pairs on the screen.
+	MaxPairs
+	// The NoColorVideo [no_color_video, ncv] num capability is video attributes that cannot be used with colors.
+	NoColorVideo
+	// The BufferCapacity [buffer_capacity, bufsz] num capability is numbers of bytes buffered before printing.
+	BufferCapacity
+	// The DotVertSpacing [dot_vert_spacing, spinv] num capability is spacing of pins vertically in pins per inch.
+	DotVertSpacing
+	// The DotHorzSpacing [dot_horz_spacing, spinh] num capability is spacing of dots horizontally in dots per inch.
+	DotHorzSpacing
+	// The MaxMicroAddress [max_micro_address, maddr] num capability is maximum value in micro_..._address.
+	MaxMicroAddress
+	// The MaxMicroJump [max_micro_jump, mjump] num capability is maximum value in parm_..._micro.
+	MaxMicroJump
+	// The MicroColSize [micro_col_size, mcs] num capability is character step size when in micro mode.
+	MicroColSize
+	// The MicroLineSize [micro_line_size, mls] num capability is line step size when in micro mode.
+	MicroLineSize
+	// The NumberOfPins [number_of_pins, npins] num capability is numbers of pins in print-head.
+	NumberOfPins
+	// The OutputResChar [output_res_char, orc] num capability is horizontal resolution in units per line.
+	OutputResChar
+	// The OutputResLine [output_res_line, orl] num capability is vertical resolution in units per line.
+	OutputResLine
+	// The OutputResHorzInch [output_res_horz_inch, orhi] num capability is horizontal resolution in units per inch.
+	OutputResHorzInch
+	// The OutputResVertInch [output_res_vert_inch, orvi] num capability is vertical resolution in units per inch.
+	OutputResVertInch
+	// The PrintRate [print_rate, cps] num capability is print rate in characters per second.
+	PrintRate
+	// The WideCharSize [wide_char_size, widcs] num capability is character step size when in double wide mode.
+	WideCharSize
+	// The Buttons [buttons, btns] num capability is number of buttons on mouse.
+	Buttons
+	// The BitImageEntwining [bit_image_entwining, bitwin] num capability is number of passes for each bit-image row.
+	BitImageEntwining
+	// The BitImageType [bit_image_type, bitype] num capability is type of bit-image device.
+	BitImageType
+	// The MagicCookieGlitchUl [magic_cookie_glitch_ul, OTug] num capability is number of blanks left by ul.
+	MagicCookieGlitchUl
+	// The CarriageReturnDelay [carriage_return_delay, OTdC] num capability is pad needed for CR.
+	CarriageReturnDelay
+	// The NewLineDelay [new_line_delay, OTdN] num capability is pad needed for LF.
+	NewLineDelay
+	// The BackspaceDelay [backspace_delay, OTdB] num capability is padding required for ^H.
+	BackspaceDelay
+	// The HorizontalTabDelay [horizontal_tab_delay, OTdT] num capability is padding required for ^I.
+	HorizontalTabDelay
+	// The NumberOfFunctionKeys [number_of_function_keys, OTkn] num capability is count of function keys.
+	NumberOfFunctionKeys
+)
+
+// String capabilities.
+const (
+	// The BackTab [back_tab, cbt] string capability is the back tab (P).
+	BackTab = iota
+	// The Bell [bell, bel] string capability is the audible signal (bell) (P).
+	Bell
+	// The CarriageReturn [carriage_return, cr] string capability is the carriage return (P*) (P*).
+	CarriageReturn
+	// The ChangeScrollRegion [change_scroll_region, csr] string capability is the change region to line #1 to line #2 (P).
+	ChangeScrollRegion
+	// The ClearAllTabs [clear_all_tabs, tbc] string capability is the clear all tab stops (P).
+	ClearAllTabs
+	// The ClearScreen [clear_screen, clear] string capability is the clear screen and home cursor (P*).
+	ClearScreen
+	// The ClrEol [clr_eol, el] string capability is the clear to end of line (P).
+	ClrEol
+	// The ClrEos [clr_eos, ed] string capability is the clear to end of screen (P*).
+	ClrEos
+	// The ColumnAddress [column_address, hpa] string capability is the horizontal position #1, absolute (P).
+	ColumnAddress
+	// The CommandCharacter [command_character, cmdch] string capability is the terminal settable cmd character in prototype !?.
+	CommandCharacter
+	// The CursorAddress [cursor_address, cup] string capability is the move to row #1 columns #2.
+	CursorAddress
+	// The CursorDown [cursor_down, cud1] string capability is the down one line.
+	CursorDown
+	// The CursorHome [cursor_home, home] string capability is the home cursor (if no cup).
+	CursorHome
+	// The CursorInvisible [cursor_invisible, civis] string capability is the make cursor invisible.
+	CursorInvisible
+	// The CursorLeft [cursor_left, cub1] string capability is the move left one space.
+	CursorLeft
+	// The CursorMemAddress [cursor_mem_address, mrcup] string capability is the memory relative cursor addressing, move to row #1 columns #2.
+	CursorMemAddress
+	// The CursorNormal [cursor_normal, cnorm] string capability is the make cursor appear normal (undo civis/cvvis).
+	CursorNormal
+	// The CursorRight [cursor_right, cuf1] string capability is the non-destructive space (move right one space).
+	CursorRight
+	// The CursorToLl [cursor_to_ll, ll] string capability is the last line, first column (if no cup).
+	CursorToLl
+	// The CursorUp [cursor_up, cuu1] string capability is the up one line.
+	CursorUp
+	// The CursorVisible [cursor_visible, cvvis] string capability is the make cursor very visible.
+	CursorVisible
+	// The DeleteCharacter [delete_character, dch1] string capability is the delete character (P*).
+	DeleteCharacter
+	// The DeleteLine [delete_line, dl1] string capability is the delete line (P*).
+	DeleteLine
+	// The DisStatusLine [dis_status_line, dsl] string capability is the disable status line.
+	DisStatusLine
+	// The DownHalfLine [down_half_line, hd] string capability is the half a line down.
+	DownHalfLine
+	// The EnterAltCharsetMode [enter_alt_charset_mode, smacs] string capability is the start alternate character set (P).
+	EnterAltCharsetMode
+	// The EnterBlinkMode [enter_blink_mode, blink] string capability is the turn on blinking.
+	EnterBlinkMode
+	// The EnterBoldMode [enter_bold_mode, bold] string capability is the turn on bold (extra bright) mode.
+	EnterBoldMode
+	// The EnterCaMode [enter_ca_mode, smcup] string capability is the string to start programs using cup.
+	EnterCaMode
+	// The EnterDeleteMode [enter_delete_mode, smdc] string capability is the enter delete mode.
+	EnterDeleteMode
+	// The EnterDimMode [enter_dim_mode, dim] string capability is the turn on half-bright mode.
+	EnterDimMode
+	// The EnterInsertMode [enter_insert_mode, smir] string capability is the enter insert mode.
+	EnterInsertMode
+	// The EnterSecureMode [enter_secure_mode, invis] string capability is the turn on blank mode (characters invisible).
+	EnterSecureMode
+	// The EnterProtectedMode [enter_protected_mode, prot] string capability is the turn on protected mode.
+	EnterProtectedMode
+	// The EnterReverseMode [enter_reverse_mode, rev] string capability is the turn on reverse video mode.
+	EnterReverseMode
+	// The EnterStandoutMode [enter_standout_mode, smso] string capability is the begin standout mode.
+	EnterStandoutMode
+	// The EnterUnderlineMode [enter_underline_mode, smul] string capability is the begin underline mode.
+	EnterUnderlineMode
+	// The EraseChars [erase_chars, ech] string capability is the erase #1 characters (P).
+	EraseChars
+	// The ExitAltCharsetMode [exit_alt_charset_mode, rmacs] string capability is the end alternate character set (P).
+	ExitAltCharsetMode
+	// The ExitAttributeMode [exit_attribute_mode, sgr0] string capability is the turn off all attributes.
+	ExitAttributeMode
+	// The ExitCaMode [exit_ca_mode, rmcup] string capability is the strings to end programs using cup.
+	ExitCaMode
+	// The ExitDeleteMode [exit_delete_mode, rmdc] string capability is the end delete mode.
+	ExitDeleteMode
+	// The ExitInsertMode [exit_insert_mode, rmir] string capability is the exit insert mode.
+	ExitInsertMode
+	// The ExitStandoutMode [exit_standout_mode, rmso] string capability is the exit standout mode.
+	ExitStandoutMode
+	// The ExitUnderlineMode [exit_underline_mode, rmul] string capability is the exit underline mode.
+	ExitUnderlineMode
+	// The FlashScreen [flash_screen, flash] string capability is the visible bell (may not move cursor).
+	FlashScreen
+	// The FormFeed [form_feed, ff] string capability is the hardcopy terminal page eject (P*).
+	FormFeed
+	// The FromStatusLine [from_status_line, fsl] string capability is the return from status line.
+	FromStatusLine
+	// The Init1string [init_1string, is1] string capability is the initialization string.
+	Init1string
+	// The Init2string [init_2string, is2] string capability is the initialization string.
+	Init2string
+	// The Init3string [init_3string, is3] string capability is the initialization string.
+	Init3string
+	// The InitFile [init_file, if] string capability is the name of initialization file.
+	InitFile
+	// The InsertCharacter [insert_character, ich1] string capability is the insert character (P).
+	InsertCharacter
+	// The InsertLine [insert_line, il1] string capability is the insert line (P*).
+	InsertLine
+	// The InsertPadding [insert_padding, ip] string capability is the insert padding after inserted character.
+	InsertPadding
+	// The KeyBackspace [key_backspace, kbs] string capability is the backspace key.
+	KeyBackspace
+	// The KeyCatab [key_catab, ktbc] string capability is the clear-all-tabs key.
+	KeyCatab
+	// The KeyClear [key_clear, kclr] string capability is the clear-screen or erase key.
+	KeyClear
+	// The KeyCtab [key_ctab, kctab] string capability is the clear-tab key.
+	KeyCtab
+	// The KeyDc [key_dc, kdch1] string capability is the delete-character key.
+	KeyDc
+	// The KeyDl [key_dl, kdl1] string capability is the delete-line key.
+	KeyDl
+	// The KeyDown [key_down, kcud1] string capability is the down-arrow key.
+	KeyDown
+	// The KeyEic [key_eic, krmir] string capability is the sent by rmir or smir in insert mode.
+	KeyEic
+	// The KeyEol [key_eol, kel] string capability is the clear-to-end-of-line key.
+	KeyEol
+	// The KeyEos [key_eos, ked] string capability is the clear-to-end-of-screen key.
+	KeyEos
+	// The KeyF0 [key_f0, kf0] string capability is the F0 function key.
+	KeyF0
+	// The KeyF1 [key_f1, kf1] string capability is the F1 function key.
+	KeyF1
+	// The KeyF10 [key_f10, kf10] string capability is the F10 function key.
+	KeyF10
+	// The KeyF2 [key_f2, kf2] string capability is the F2 function key.
+	KeyF2
+	// The KeyF3 [key_f3, kf3] string capability is the F3 function key.
+	KeyF3
+	// The KeyF4 [key_f4, kf4] string capability is the F4 function key.
+	KeyF4
+	// The KeyF5 [key_f5, kf5] string capability is the F5 function key.
+	KeyF5
+	// The KeyF6 [key_f6, kf6] string capability is the F6 function key.
+	KeyF6
+	// The KeyF7 [key_f7, kf7] string capability is the F7 function key.
+	KeyF7
+	// The KeyF8 [key_f8, kf8] string capability is the F8 function key.
+	KeyF8
+	// The KeyF9 [key_f9, kf9] string capability is the F9 function key.
+	KeyF9
+	// The KeyHome [key_home, khome] string capability is the home key.
+	KeyHome
+	// The KeyIc [key_ic, kich1] string capability is the insert-character key.
+	KeyIc
+	// The KeyIl [key_il, kil1] string capability is the insert-line key.
+	KeyIl
+	// The KeyLeft [key_left, kcub1] string capability is the left-arrow key.
+	KeyLeft
+	// The KeyLl [key_ll, kll] string capability is the lower-left key (home down).
+	KeyLl
+	// The KeyNpage [key_npage, knp] string capability is the next-page key.
+	KeyNpage
+	// The KeyPpage [key_ppage, kpp] string capability is the previous-page key.
+	KeyPpage
+	// The KeyRight [key_right, kcuf1] string capability is the right-arrow key.
+	KeyRight
+	// The KeySf [key_sf, kind] string capability is the scroll-forward key.
+	KeySf
+	// The KeySr [key_sr, kri] string capability is the scroll-backward key.
+	KeySr
+	// The KeyStab [key_stab, khts] string capability is the set-tab key.
+	KeyStab
+	// The KeyUp [key_up, kcuu1] string capability is the up-arrow key.
+	KeyUp
+	// The KeypadLocal [keypad_local, rmkx] string capability is the leave 'keyboard_transmit' mode.
+	KeypadLocal
+	// The KeypadXmit [keypad_xmit, smkx] string capability is the enter 'keyboard_transmit' mode.
+	KeypadXmit
+	// The LabF0 [lab_f0, lf0] string capability is the label on function key f0 if not f0.
+	LabF0
+	// The LabF1 [lab_f1, lf1] string capability is the label on function key f1 if not f1.
+	LabF1
+	// The LabF10 [lab_f10, lf10] string capability is the label on function key f10 if not f10.
+	LabF10
+	// The LabF2 [lab_f2, lf2] string capability is the label on function key f2 if not f2.
+	LabF2
+	// The LabF3 [lab_f3, lf3] string capability is the label on function key f3 if not f3.
+	LabF3
+	// The LabF4 [lab_f4, lf4] string capability is the label on function key f4 if not f4.
+	LabF4
+	// The LabF5 [lab_f5, lf5] string capability is the label on function key f5 if not f5.
+	LabF5
+	// The LabF6 [lab_f6, lf6] string capability is the label on function key f6 if not f6.
+	LabF6
+	// The LabF7 [lab_f7, lf7] string capability is the label on function key f7 if not f7.
+	LabF7
+	// The LabF8 [lab_f8, lf8] string capability is the label on function key f8 if not f8.
+	LabF8
+	// The LabF9 [lab_f9, lf9] string capability is the label on function key f9 if not f9.
+	LabF9
+	// The MetaOff [meta_off, rmm] string capability is the turn off meta mode.
+	MetaOff
+	// The MetaOn [meta_on, smm] string capability is the turn on meta mode (8th-bit on).
+	MetaOn
+	// The Newline [newline, nel] string capability is the newline (behave like cr followed by lf).
+	Newline
+	// The PadChar [pad_char, pad] string capability is the padding char (instead of null).
+	PadChar
+	// The ParmDch [parm_dch, dch] string capability is the delete #1 characters (P*).
+	ParmDch
+	// The ParmDeleteLine [parm_delete_line, dl] string capability is the delete #1 lines (P*).
+	ParmDeleteLine
+	// The ParmDownCursor [parm_down_cursor, cud] string capability is the down #1 lines (P*).
+	ParmDownCursor
+	// The ParmIch [parm_ich, ich] string capability is the insert #1 characters (P*).
+	ParmIch
+	// The ParmIndex [parm_index, indn] string capability is the scroll forward #1 lines (P).
+	ParmIndex
+	// The ParmInsertLine [parm_insert_line, il] string capability is the insert #1 lines (P*).
+	ParmInsertLine
+	// The ParmLeftCursor [parm_left_cursor, cub] string capability is the move #1 characters to the left (P).
+	ParmLeftCursor
+	// The ParmRightCursor [parm_right_cursor, cuf] string capability is the move #1 characters to the right (P*).
+	ParmRightCursor
+	// The ParmRindex [parm_rindex, rin] string capability is the scroll back #1 lines (P).
+	ParmRindex
+	// The ParmUpCursor [parm_up_cursor, cuu] string capability is the up #1 lines (P*).
+	ParmUpCursor
+	// The PkeyKey [pkey_key, pfkey] string capability is the program function key #1 to type string #2.
+	PkeyKey
+	// The PkeyLocal [pkey_local, pfloc] string capability is the program function key #1 to execute string #2.
+	PkeyLocal
+	// The PkeyXmit [pkey_xmit, pfx] string capability is the program function key #1 to transmit string #2.
+	PkeyXmit
+	// The PrintScreen [print_screen, mc0] string capability is the print contents of screen.
+	PrintScreen
+	// The PrtrOff [prtr_off, mc4] string capability is the turn off printer.
+	PrtrOff
+	// The PrtrOn [prtr_on, mc5] string capability is the turn on printer.
+	PrtrOn
+	// The RepeatChar [repeat_char, rep] string capability is the repeat char #1 #2 times (P*).
+	RepeatChar
+	// The Reset1string [reset_1string, rs1] string capability is the reset string.
+	Reset1string
+	// The Reset2string [reset_2string, rs2] string capability is the reset string.
+	Reset2string
+	// The Reset3string [reset_3string, rs3] string capability is the reset string.
+	Reset3string
+	// The ResetFile [reset_file, rf] string capability is the name of reset file.
+	ResetFile
+	// The RestoreCursor [restore_cursor, rc] string capability is the restore cursor to position of last save_cursor.
+	RestoreCursor
+	// The RowAddress [row_address, vpa] string capability is the vertical position #1 absolute (P).
+	RowAddress
+	// The SaveCursor [save_cursor, sc] string capability is the save current cursor position (P).
+	SaveCursor
+	// The ScrollForward [scroll_forward, ind] string capability is the scroll text up (P).
+	ScrollForward
+	// The ScrollReverse [scroll_reverse, ri] string capability is the scroll text down (P).
+	ScrollReverse
+	// The SetAttributes [set_attributes, sgr] string capability is the define video attributes #1-#9 (PG9).
+	SetAttributes
+	// The SetTab [set_tab, hts] string capability is the set a tab in every row, current columns.
+	SetTab
+	// The SetWindow [set_window, wind] string capability is the current window is lines #1-#2 cols #3-#4.
+	SetWindow
+	// The Tab [tab, ht] string capability is the tab to next 8-space hardware tab stop.
+	Tab
+	// The ToStatusLine [to_status_line, tsl] string capability is the move to status line, column #1.
+	ToStatusLine
+	// The UnderlineChar [underline_char, uc] string capability is the underline char and move past it.
+	UnderlineChar
+	// The UpHalfLine [up_half_line, hu] string capability is the half a line up.
+	UpHalfLine
+	// The InitProg [init_prog, iprog] string capability is the path name of program for initialization.
+	InitProg
+	// The KeyA1 [key_a1, ka1] string capability is the upper left of keypad.
+	KeyA1
+	// The KeyA3 [key_a3, ka3] string capability is the upper right of keypad.
+	KeyA3
+	// The KeyB2 [key_b2, kb2] string capability is the center of keypad.
+	KeyB2
+	// The KeyC1 [key_c1, kc1] string capability is the lower left of keypad.
+	KeyC1
+	// The KeyC3 [key_c3, kc3] string capability is the lower right of keypad.
+	KeyC3
+	// The PrtrNon [prtr_non, mc5p] string capability is the turn on printer for #1 bytes.
+	PrtrNon
+	// The CharPadding [char_padding, rmp] string capability is the like ip but when in insert mode.
+	CharPadding
+	// The AcsChars [acs_chars, acsc] string capability is the graphics charset pairs, based on vt100.
+	AcsChars
+	// The PlabNorm [plab_norm, pln] string capability is the program label #1 to show string #2.
+	PlabNorm
+	// The KeyBtab [key_btab, kcbt] string capability is the back-tab key.
+	KeyBtab
+	// The EnterXonMode [enter_xon_mode, smxon] string capability is the turn on xon/xoff handshaking.
+	EnterXonMode
+	// The ExitXonMode [exit_xon_mode, rmxon] string capability is the turn off xon/xoff handshaking.
+	ExitXonMode
+	// The EnterAmMode [enter_am_mode, smam] string capability is the turn on automatic margins.
+	EnterAmMode
+	// The ExitAmMode [exit_am_mode, rmam] string capability is the turn off automatic margins.
+	ExitAmMode
+	// The XonCharacter [xon_character, xonc] string capability is the XON character.
+	XonCharacter
+	// The XoffCharacter [xoff_character, xoffc] string capability is the XOFF character.
+	XoffCharacter
+	// The EnaAcs [ena_acs, enacs] string capability is the enable alternate char set.
+	EnaAcs
+	// The LabelOn [label_on, smln] string capability is the turn on soft labels.
+	LabelOn
+	// The LabelOff [label_off, rmln] string capability is the turn off soft labels.
+	LabelOff
+	// The KeyBeg [key_beg, kbeg] string capability is the begin key.
+	KeyBeg
+	// The KeyCancel [key_cancel, kcan] string capability is the cancel key.
+	KeyCancel
+	// The KeyClose [key_close, kclo] string capability is the close key.
+	KeyClose
+	// The KeyCommand [key_command, kcmd] string capability is the command key.
+	KeyCommand
+	// The KeyCopy [key_copy, kcpy] string capability is the copy key.
+	KeyCopy
+	// The KeyCreate [key_create, kcrt] string capability is the create key.
+	KeyCreate
+	// The KeyEnd [key_end, kend] string capability is the end key.
+	KeyEnd
+	// The KeyEnter [key_enter, kent] string capability is the enter/send key.
+	KeyEnter
+	// The KeyExit [key_exit, kext] string capability is the exit key.
+	KeyExit
+	// The KeyFind [key_find, kfnd] string capability is the find key.
+	KeyFind
+	// The KeyHelp [key_help, khlp] string capability is the help key.
+	KeyHelp
+	// The KeyMark [key_mark, kmrk] string capability is the mark key.
+	KeyMark
+	// The KeyMessage [key_message, kmsg] string capability is the message key.
+	KeyMessage
+	// The KeyMove [key_move, kmov] string capability is the move key.
+	KeyMove
+	// The KeyNext [key_next, knxt] string capability is the next key.
+	KeyNext
+	// The KeyOpen [key_open, kopn] string capability is the open key.
+	KeyOpen
+	// The KeyOptions [key_options, kopt] string capability is the options key.
+	KeyOptions
+	// The KeyPrevious [key_previous, kprv] string capability is the previous key.
+	KeyPrevious
+	// The KeyPrint [key_print, kprt] string capability is the print key.
+	KeyPrint
+	// The KeyRedo [key_redo, krdo] string capability is the redo key.
+	KeyRedo
+	// The KeyReference [key_reference, kref] string capability is the reference key.
+	KeyReference
+	// The KeyRefresh [key_refresh, krfr] string capability is the refresh key.
+	KeyRefresh
+	// The KeyReplace [key_replace, krpl] string capability is the replace key.
+	KeyReplace
+	// The KeyRestart [key_restart, krst] string capability is the restart key.
+	KeyRestart
+	// The KeyResume [key_resume, kres] string capability is the resume key.
+	KeyResume
+	// The KeySave [key_save, ksav] string capability is the save key.
+	KeySave
+	// The KeySuspend [key_suspend, kspd] string capability is the suspend key.
+	KeySuspend
+	// The KeyUndo [key_undo, kund] string capability is the undo key.
+	KeyUndo
+	// The KeySbeg [key_sbeg, kBEG] string capability is the shifted begin key.
+	KeySbeg
+	// The KeyScancel [key_scancel, kCAN] string capability is the shifted cancel key.
+	KeyScancel
+	// The KeyScommand [key_scommand, kCMD] string capability is the shifted command key.
+	KeyScommand
+	// The KeyScopy [key_scopy, kCPY] string capability is the shifted copy key.
+	KeyScopy
+	// The KeyScreate [key_screate, kCRT] string capability is the shifted create key.
+	KeyScreate
+	// The KeySdc [key_sdc, kDC] string capability is the shifted delete-character key.
+	KeySdc
+	// The KeySdl [key_sdl, kDL] string capability is the shifted delete-line key.
+	KeySdl
+	// The KeySelect [key_select, kslt] string capability is the select key.
+	KeySelect
+	// The KeySend [key_send, kEND] string capability is the shifted end key.
+	KeySend
+	// The KeySeol [key_seol, kEOL] string capability is the shifted clear-to-end-of-line key.
+	KeySeol
+	// The KeySexit [key_sexit, kEXT] string capability is the shifted exit key.
+	KeySexit
+	// The KeySfind [key_sfind, kFND] string capability is the shifted find key.
+	KeySfind
+	// The KeyShelp [key_shelp, kHLP] string capability is the shifted help key.
+	KeyShelp
+	// The KeyShome [key_shome, kHOM] string capability is the shifted home key.
+	KeyShome
+	// The KeySic [key_sic, kIC] string capability is the shifted insert-character key.
+	KeySic
+	// The KeySleft [key_sleft, kLFT] string capability is the shifted left-arrow key.
+	KeySleft
+	// The KeySmessage [key_smessage, kMSG] string capability is the shifted message key.
+	KeySmessage
+	// The KeySmove [key_smove, kMOV] string capability is the shifted move key.
+	KeySmove
+	// The KeySnext [key_snext, kNXT] string capability is the shifted next key.
+	KeySnext
+	// The KeySoptions [key_soptions, kOPT] string capability is the shifted options key.
+	KeySoptions
+	// The KeySprevious [key_sprevious, kPRV] string capability is the shifted previous key.
+	KeySprevious
+	// The KeySprint [key_sprint, kPRT] string capability is the shifted print key.
+	KeySprint
+	// The KeySredo [key_sredo, kRDO] string capability is the shifted redo key.
+	KeySredo
+	// The KeySreplace [key_sreplace, kRPL] string capability is the shifted replace key.
+	KeySreplace
+	// The KeySright [key_sright, kRIT] string capability is the shifted right-arrow key.
+	KeySright
+	// The KeySrsume [key_srsume, kRES] string capability is the shifted resume key.
+	KeySrsume
+	// The KeySsave [key_ssave, kSAV] string capability is the shifted save key.
+	KeySsave
+	// The KeySsuspend [key_ssuspend, kSPD] string capability is the shifted suspend key.
+	KeySsuspend
+	// The KeySundo [key_sundo, kUND] string capability is the shifted undo key.
+	KeySundo
+	// The ReqForInput [req_for_input, rfi] string capability is the send next input char (for ptys).
+	ReqForInput
+	// The KeyF11 [key_f11, kf11] string capability is the F11 function key.
+	KeyF11
+	// The KeyF12 [key_f12, kf12] string capability is the F12 function key.
+	KeyF12
+	// The KeyF13 [key_f13, kf13] string capability is the F13 function key.
+	KeyF13
+	// The KeyF14 [key_f14, kf14] string capability is the F14 function key.
+	KeyF14
+	// The KeyF15 [key_f15, kf15] string capability is the F15 function key.
+	KeyF15
+	// The KeyF16 [key_f16, kf16] string capability is the F16 function key.
+	KeyF16
+	// The KeyF17 [key_f17, kf17] string capability is the F17 function key.
+	KeyF17
+	// The KeyF18 [key_f18, kf18] string capability is the F18 function key.
+	KeyF18
+	// The KeyF19 [key_f19, kf19] string capability is the F19 function key.
+	KeyF19
+	// The KeyF20 [key_f20, kf20] string capability is the F20 function key.
+	KeyF20
+	// The KeyF21 [key_f21, kf21] string capability is the F21 function key.
+	KeyF21
+	// The KeyF22 [key_f22, kf22] string capability is the F22 function key.
+	KeyF22
+	// The KeyF23 [key_f23, kf23] string capability is the F23 function key.
+	KeyF23
+	// The KeyF24 [key_f24, kf24] string capability is the F24 function key.
+	KeyF24
+	// The KeyF25 [key_f25, kf25] string capability is the F25 function key.
+	KeyF25
+	// The KeyF26 [key_f26, kf26] string capability is the F26 function key.
+	KeyF26
+	// The KeyF27 [key_f27, kf27] string capability is the F27 function key.
+	KeyF27
+	// The KeyF28 [key_f28, kf28] string capability is the F28 function key.
+	KeyF28
+	// The KeyF29 [key_f29, kf29] string capability is the F29 function key.
+	KeyF29
+	// The KeyF30 [key_f30, kf30] string capability is the F30 function key.
+	KeyF30
+	// The KeyF31 [key_f31, kf31] string capability is the F31 function key.
+	KeyF31
+	// The KeyF32 [key_f32, kf32] string capability is the F32 function key.
+	KeyF32
+	// The KeyF33 [key_f33, kf33] string capability is the F33 function key.
+	KeyF33
+	// The KeyF34 [key_f34, kf34] string capability is the F34 function key.
+	KeyF34
+	// The KeyF35 [key_f35, kf35] string capability is the F35 function key.
+	KeyF35
+	// The KeyF36 [key_f36, kf36] string capability is the F36 function key.
+	KeyF36
+	// The KeyF37 [key_f37, kf37] string capability is the F37 function key.
+	KeyF37
+	// The KeyF38 [key_f38, kf38] string capability is the F38 function key.
+	KeyF38
+	// The KeyF39 [key_f39, kf39] string capability is the F39 function key.
+	KeyF39
+	// The KeyF40 [key_f40, kf40] string capability is the F40 function key.
+	KeyF40
+	// The KeyF41 [key_f41, kf41] string capability is the F41 function key.
+	KeyF41
+	// The KeyF42 [key_f42, kf42] string capability is the F42 function key.
+	KeyF42
+	// The KeyF43 [key_f43, kf43] string capability is the F43 function key.
+	KeyF43
+	// The KeyF44 [key_f44, kf44] string capability is the F44 function key.
+	KeyF44
+	// The KeyF45 [key_f45, kf45] string capability is the F45 function key.
+	KeyF45
+	// The KeyF46 [key_f46, kf46] string capability is the F46 function key.
+	KeyF46
+	// The KeyF47 [key_f47, kf47] string capability is the F47 function key.
+	KeyF47
+	// The KeyF48 [key_f48, kf48] string capability is the F48 function key.
+	KeyF48
+	// The KeyF49 [key_f49, kf49] string capability is the F49 function key.
+	KeyF49
+	// The KeyF50 [key_f50, kf50] string capability is the F50 function key.
+	KeyF50
+	// The KeyF51 [key_f51, kf51] string capability is the F51 function key.
+	KeyF51
+	// The KeyF52 [key_f52, kf52] string capability is the F52 function key.
+	KeyF52
+	// The KeyF53 [key_f53, kf53] string capability is the F53 function key.
+	KeyF53
+	// The KeyF54 [key_f54, kf54] string capability is the F54 function key.
+	KeyF54
+	// The KeyF55 [key_f55, kf55] string capability is the F55 function key.
+	KeyF55
+	// The KeyF56 [key_f56, kf56] string capability is the F56 function key.
+	KeyF56
+	// The KeyF57 [key_f57, kf57] string capability is the F57 function key.
+	KeyF57
+	// The KeyF58 [key_f58, kf58] string capability is the F58 function key.
+	KeyF58
+	// The KeyF59 [key_f59, kf59] string capability is the F59 function key.
+	KeyF59
+	// The KeyF60 [key_f60, kf60] string capability is the F60 function key.
+	KeyF60
+	// The KeyF61 [key_f61, kf61] string capability is the F61 function key.
+	KeyF61
+	// The KeyF62 [key_f62, kf62] string capability is the F62 function key.
+	KeyF62
+	// The KeyF63 [key_f63, kf63] string capability is the F63 function key.
+	KeyF63
+	// The ClrBol [clr_bol, el1] string capability is the Clear to beginning of line.
+	ClrBol
+	// The ClearMargins [clear_margins, mgc] string capability is the clear right and left soft margins.
+	ClearMargins
+	// The SetLeftMargin [set_left_margin, smgl] string capability is the set left soft margin at current column.	 (ML is not in BSD termcap).
+	SetLeftMargin
+	// The SetRightMargin [set_right_margin, smgr] string capability is the set right soft margin at current column.
+	SetRightMargin
+	// The LabelFormat [label_format, fln] string capability is the label format.
+	LabelFormat
+	// The SetClock [set_clock, sclk] string capability is the set clock, #1 hrs #2 mins #3 secs.
+	SetClock
+	// The DisplayClock [display_clock, dclk] string capability is the display clock.
+	DisplayClock
+	// The RemoveClock [remove_clock, rmclk] string capability is the remove clock.
+	RemoveClock
+	// The CreateWindow [create_window, cwin] string capability is the define a window #1 from #2,#3 to #4,#5.
+	CreateWindow
+	// The GotoWindow [goto_window, wingo] string capability is the go to window #1.
+	GotoWindow
+	// The Hangup [hangup, hup] string capability is the hang-up phone.
+	Hangup
+	// The DialPhone [dial_phone, dial] string capability is the dial number #1.
+	DialPhone
+	// The QuickDial [quick_dial, qdial] string capability is the dial number #1 without checking.
+	QuickDial
+	// The Tone [tone, tone] string capability is the select touch tone dialing.
+	Tone
+	// The Pulse [pulse, pulse] string capability is the select pulse dialing.
+	Pulse
+	// The FlashHook [flash_hook, hook] string capability is the flash switch hook.
+	FlashHook
+	// The FixedPause [fixed_pause, pause] string capability is the pause for 2-3 seconds.
+	FixedPause
+	// The WaitTone [wait_tone, wait] string capability is the wait for dial-tone.
+	WaitTone
+	// The User0 [user0, u0] string capability is the User string #0.
+	User0
+	// The User1 [user1, u1] string capability is the User string #1.
+	User1
+	// The User2 [user2, u2] string capability is the User string #2.
+	User2
+	// The User3 [user3, u3] string capability is the User string #3.
+	User3
+	// The User4 [user4, u4] string capability is the User string #4.
+	User4
+	// The User5 [user5, u5] string capability is the User string #5.
+	User5
+	// The User6 [user6, u6] string capability is the User string #6.
+	User6
+	// The User7 [user7, u7] string capability is the User string #7.
+	User7
+	// The User8 [user8, u8] string capability is the User string #8.
+	User8
+	// The User9 [user9, u9] string capability is the User string #9.
+	User9
+	// The OrigPair [orig_pair, op] string capability is the Set default pair to its original value.
+	OrigPair
+	// The OrigColors [orig_colors, oc] string capability is the Set all color pairs to the original ones.
+	OrigColors
+	// The InitializeColor [initialize_color, initc] string capability is the initialize color #1 to (#2,#3,#4).
+	InitializeColor
+	// The InitializePair [initialize_pair, initp] string capability is the Initialize color pair #1 to fg=(#2,#3,#4), bg=(#5,#6,#7).
+	InitializePair
+	// The SetColorPair [set_color_pair, scp] string capability is the Set current color pair to #1.
+	SetColorPair
+	// The SetForeground [set_foreground, setf] string capability is the Set foreground color #1.
+	SetForeground
+	// The SetBackground [set_background, setb] string capability is the Set background color #1.
+	SetBackground
+	// The ChangeCharPitch [change_char_pitch, cpi] string capability is the Change number of characters per inch to #1.
+	ChangeCharPitch
+	// The ChangeLinePitch [change_line_pitch, lpi] string capability is the Change number of lines per inch to #1.
+	ChangeLinePitch
+	// The ChangeResHorz [change_res_horz, chr] string capability is the Change horizontal resolution to #1.
+	ChangeResHorz
+	// The ChangeResVert [change_res_vert, cvr] string capability is the Change vertical resolution to #1.
+	ChangeResVert
+	// The DefineChar [define_char, defc] string capability is the Define a character #1, #2 dots wide, descender #3.
+	DefineChar
+	// The EnterDoublewideMode [enter_doublewide_mode, swidm] string capability is the Enter double-wide mode.
+	EnterDoublewideMode
+	// The EnterDraftQuality [enter_draft_quality, sdrfq] string capability is the Enter draft-quality mode.
+	EnterDraftQuality
+	// The EnterItalicsMode [enter_italics_mode, sitm] string capability is the Enter italic mode.
+	EnterItalicsMode
+	// The EnterLeftwardMode [enter_leftward_mode, slm] string capability is the Start leftward carriage motion.
+	EnterLeftwardMode
+	// The EnterMicroMode [enter_micro_mode, smicm] string capability is the Start micro-motion mode.
+	EnterMicroMode
+	// The EnterNearLetterQuality [enter_near_letter_quality, snlq] string capability is the Enter NLQ mode.
+	EnterNearLetterQuality
+	// The EnterNormalQuality [enter_normal_quality, snrmq] string capability is the Enter normal-quality mode.
+	EnterNormalQuality
+	// The EnterShadowMode [enter_shadow_mode, sshm] string capability is the Enter shadow-print mode.
+	EnterShadowMode
+	// The EnterSubscriptMode [enter_subscript_mode, ssubm] string capability is the Enter subscript mode.
+	EnterSubscriptMode
+	// The EnterSuperscriptMode [enter_superscript_mode, ssupm] string capability is the Enter superscript mode.
+	EnterSuperscriptMode
+	// The EnterUpwardMode [enter_upward_mode, sum] string capability is the Start upward carriage motion.
+	EnterUpwardMode
+	// The ExitDoublewideMode [exit_doublewide_mode, rwidm] string capability is the End double-wide mode.
+	ExitDoublewideMode
+	// The ExitItalicsMode [exit_italics_mode, ritm] string capability is the End italic mode.
+	ExitItalicsMode
+	// The ExitLeftwardMode [exit_leftward_mode, rlm] string capability is the End left-motion mode.
+	ExitLeftwardMode
+	// The ExitMicroMode [exit_micro_mode, rmicm] string capability is the End micro-motion mode.
+	ExitMicroMode
+	// The ExitShadowMode [exit_shadow_mode, rshm] string capability is the End shadow-print mode.
+	ExitShadowMode
+	// The ExitSubscriptMode [exit_subscript_mode, rsubm] string capability is the End subscript mode.
+	ExitSubscriptMode
+	// The ExitSuperscriptMode [exit_superscript_mode, rsupm] string capability is the End superscript mode.
+	ExitSuperscriptMode
+	// The ExitUpwardMode [exit_upward_mode, rum] string capability is the End reverse character motion.
+	ExitUpwardMode
+	// The MicroColumnAddress [micro_column_address, mhpa] string capability is the Like column_address in micro mode.
+	MicroColumnAddress
+	// The MicroDown [micro_down, mcud1] string capability is the Like cursor_down in micro mode.
+	MicroDown
+	// The MicroLeft [micro_left, mcub1] string capability is the Like cursor_left in micro mode.
+	MicroLeft
+	// The MicroRight [micro_right, mcuf1] string capability is the Like cursor_right in micro mode.
+	MicroRight
+	// The MicroRowAddress [micro_row_address, mvpa] string capability is the Like row_address #1 in micro mode.
+	MicroRowAddress
+	// The MicroUp [micro_up, mcuu1] string capability is the Like cursor_up in micro mode.
+	MicroUp
+	// The OrderOfPins [order_of_pins, porder] string capability is the Match software bits to print-head pins.
+	OrderOfPins
+	// The ParmDownMicro [parm_down_micro, mcud] string capability is the Like parm_down_cursor in micro mode.
+	ParmDownMicro
+	// The ParmLeftMicro [parm_left_micro, mcub] string capability is the Like parm_left_cursor in micro mode.
+	ParmLeftMicro
+	// The ParmRightMicro [parm_right_micro, mcuf] string capability is the Like parm_right_cursor in micro mode.
+	ParmRightMicro
+	// The ParmUpMicro [parm_up_micro, mcuu] string capability is the Like parm_up_cursor in micro mode.
+	ParmUpMicro
+	// The SelectCharSet [select_char_set, scs] string capability is the Select character set, #1.
+	SelectCharSet
+	// The SetBottomMargin [set_bottom_margin, smgb] string capability is the Set bottom margin at current line.
+	SetBottomMargin
+	// The SetBottomMarginParm [set_bottom_margin_parm, smgbp] string capability is the Set bottom margin at line #1 or (if smgtp is not given) #2 lines from bottom.
+	SetBottomMarginParm
+	// The SetLeftMarginParm [set_left_margin_parm, smglp] string capability is the Set left (right) margin at column #1.
+	SetLeftMarginParm
+	// The SetRightMarginParm [set_right_margin_parm, smgrp] string capability is the Set right margin at column #1.
+	SetRightMarginParm
+	// The SetTopMargin [set_top_margin, smgt] string capability is the Set top margin at current line.
+	SetTopMargin
+	// The SetTopMarginParm [set_top_margin_parm, smgtp] string capability is the Set top (bottom) margin at row #1.
+	SetTopMarginParm
+	// The StartBitImage [start_bit_image, sbim] string capability is the Start printing bit image graphics.
+	StartBitImage
+	// The StartCharSetDef [start_char_set_def, scsd] string capability is the Start character set definition #1, with #2 characters in the set.
+	StartCharSetDef
+	// The StopBitImage [stop_bit_image, rbim] string capability is the Stop printing bit image graphics.
+	StopBitImage
+	// The StopCharSetDef [stop_char_set_def, rcsd] string capability is the End definition of character set #1.
+	StopCharSetDef
+	// The SubscriptCharacters [subscript_characters, subcs] string capability is the List of subscriptable characters.
+	SubscriptCharacters
+	// The SuperscriptCharacters [superscript_characters, supcs] string capability is the List of superscriptable characters.
+	SuperscriptCharacters
+	// The TheseCauseCr [these_cause_cr, docr] string capability is the Printing any of these characters causes CR.
+	TheseCauseCr
+	// The ZeroMotion [zero_motion, zerom] string capability is the No motion for subsequent character.
+	ZeroMotion
+	// The CharSetNames [char_set_names, csnm] string capability is the Produce #1'th item from list of character set names.
+	CharSetNames
+	// The KeyMouse [key_mouse, kmous] string capability is the Mouse event has occurred.
+	KeyMouse
+	// The MouseInfo [mouse_info, minfo] string capability is the Mouse status information.
+	MouseInfo
+	// The ReqMousePos [req_mouse_pos, reqmp] string capability is the Request mouse position.
+	ReqMousePos
+	// The GetMouse [get_mouse, getm] string capability is the Curses should get button events, parameter #1 not documented.
+	GetMouse
+	// The SetAForeground [set_a_foreground, setaf] string capability is the Set foreground color to #1, using ANSI escape.
+	SetAForeground
+	// The SetABackground [set_a_background, setab] string capability is the Set background color to #1, using ANSI escape.
+	SetABackground
+	// The PkeyPlab [pkey_plab, pfxl] string capability is the Program function key #1 to type string #2 and show string #3.
+	PkeyPlab
+	// The DeviceType [device_type, devt] string capability is the Indicate language/codeset support.
+	DeviceType
+	// The CodeSetInit [code_set_init, csin] string capability is the Init sequence for multiple codesets.
+	CodeSetInit
+	// The Set0DesSeq [set0_des_seq, s0ds] string capability is the Shift to codeset 0 (EUC set 0, ASCII).
+	Set0DesSeq
+	// The Set1DesSeq [set1_des_seq, s1ds] string capability is the Shift to codeset 1.
+	Set1DesSeq
+	// The Set2DesSeq [set2_des_seq, s2ds] string capability is the Shift to codeset 2.
+	Set2DesSeq
+	// The Set3DesSeq [set3_des_seq, s3ds] string capability is the Shift to codeset 3.
+	Set3DesSeq
+	// The SetLrMargin [set_lr_margin, smglr] string capability is the Set both left and right margins to #1, #2.  (ML is not in BSD termcap).
+	SetLrMargin
+	// The SetTbMargin [set_tb_margin, smgtb] string capability is the Sets both top and bottom margins to #1, #2.
+	SetTbMargin
+	// The BitImageRepeat [bit_image_repeat, birep] string capability is the Repeat bit image cell #1 #2 times.
+	BitImageRepeat
+	// The BitImageNewline [bit_image_newline, binel] string capability is the Move to next row of the bit image.
+	BitImageNewline
+	// The BitImageCarriageReturn [bit_image_carriage_return, bicr] string capability is the Move to beginning of same row.
+	BitImageCarriageReturn
+	// The ColorNames [color_names, colornm] string capability is the Give name for color #1.
+	ColorNames
+	// The DefineBitImageRegion [define_bit_image_region, defbi] string capability is the Define rectangular bit image region.
+	DefineBitImageRegion
+	// The EndBitImageRegion [end_bit_image_region, endbi] string capability is the End a bit-image region.
+	EndBitImageRegion
+	// The SetColorBand [set_color_band, setcolor] string capability is the Change to ribbon color #1.
+	SetColorBand
+	// The SetPageLength [set_page_length, slines] string capability is the Set page length to #1 lines.
+	SetPageLength
+	// The DisplayPcChar [display_pc_char, dispc] string capability is the Display PC character #1.
+	DisplayPcChar
+	// The EnterPcCharsetMode [enter_pc_charset_mode, smpch] string capability is the Enter PC character display mode.
+	EnterPcCharsetMode
+	// The ExitPcCharsetMode [exit_pc_charset_mode, rmpch] string capability is the Exit PC character display mode.
+	ExitPcCharsetMode
+	// The EnterScancodeMode [enter_scancode_mode, smsc] string capability is the Enter PC scancode mode.
+	EnterScancodeMode
+	// The ExitScancodeMode [exit_scancode_mode, rmsc] string capability is the Exit PC scancode mode.
+	ExitScancodeMode
+	// The PcTermOptions [pc_term_options, pctrm] string capability is the PC terminal options.
+	PcTermOptions
+	// The ScancodeEscape [scancode_escape, scesc] string capability is the Escape for scancode emulation.
+	ScancodeEscape
+	// The AltScancodeEsc [alt_scancode_esc, scesa] string capability is the Alternate escape for scancode emulation.
+	AltScancodeEsc
+	// The EnterHorizontalHlMode [enter_horizontal_hl_mode, ehhlm] string capability is the Enter horizontal highlight mode.
+	EnterHorizontalHlMode
+	// The EnterLeftHlMode [enter_left_hl_mode, elhlm] string capability is the Enter left highlight mode.
+	EnterLeftHlMode
+	// The EnterLowHlMode [enter_low_hl_mode, elohlm] string capability is the Enter low highlight mode.
+	EnterLowHlMode
+	// The EnterRightHlMode [enter_right_hl_mode, erhlm] string capability is the Enter right highlight mode.
+	EnterRightHlMode
+	// The EnterTopHlMode [enter_top_hl_mode, ethlm] string capability is the Enter top highlight mode.
+	EnterTopHlMode
+	// The EnterVerticalHlMode [enter_vertical_hl_mode, evhlm] string capability is the Enter vertical highlight mode.
+	EnterVerticalHlMode
+	// The SetAAttributes [set_a_attributes, sgr1] string capability is the Define second set of video attributes #1-#6.
+	SetAAttributes
+	// The SetPglenInch [set_pglen_inch, slength] string capability is the Set page length to #1 hundredth of an inch (some implementations use sL for termcap).
+	SetPglenInch
+	// The TermcapInit2 [termcap_init2, OTi2] string capability is the secondary initialization string.
+	TermcapInit2
+	// The TermcapReset [termcap_reset, OTrs] string capability is the terminal reset string.
+	TermcapReset
+	// The LinefeedIfNotLf [linefeed_if_not_lf, OTnl] string capability is the use to move down.
+	LinefeedIfNotLf
+	// The BackspaceIfNotBs [backspace_if_not_bs, OTbc] string capability is the move left, if not ^H.
+	BackspaceIfNotBs
+	// The OtherNonFunctionKeys [other_non_function_keys, OTko] string capability is the list of self-mapped keycaps.
+	OtherNonFunctionKeys
+	// The ArrowKeyMap [arrow_key_map, OTma] string capability is the map motion-keys for vi version 2.
+	ArrowKeyMap
+	// The AcsUlcorner [acs_ulcorner, OTG2] string capability is the single upper left.
+	AcsUlcorner
+	// The AcsLlcorner [acs_llcorner, OTG3] string capability is the single lower left.
+	AcsLlcorner
+	// The AcsUrcorner [acs_urcorner, OTG1] string capability is the single upper right.
+	AcsUrcorner
+	// The AcsLrcorner [acs_lrcorner, OTG4] string capability is the single lower right.
+	AcsLrcorner
+	// The AcsLtee [acs_ltee, OTGR] string capability is the tee pointing right.
+	AcsLtee
+	// The AcsRtee [acs_rtee, OTGL] string capability is the tee pointing left.
+	AcsRtee
+	// The AcsBtee [acs_btee, OTGU] string capability is the tee pointing up.
+	AcsBtee
+	// The AcsTtee [acs_ttee, OTGD] string capability is the tee pointing down.
+	AcsTtee
+	// The AcsHline [acs_hline, OTGH] string capability is the single horizontal line.
+	AcsHline
+	// The AcsVline [acs_vline, OTGV] string capability is the single vertical line.
+	AcsVline
+	// The AcsPlus [acs_plus, OTGC] string capability is the single intersection.
+	AcsPlus
+	// The MemoryLock [memory_lock, meml] string capability is the lock memory above cursor.
+	MemoryLock
+	// The MemoryUnlock [memory_unlock, memu] string capability is the unlock memory.
+	MemoryUnlock
+	// The BoxChars1 [box_chars_1, box1] string capability is the box characters primary set.
+	BoxChars1
+)
+const (
+	// CapCountBool is the count of bool capabilities.
+	CapCountBool = ReturnDoesClrEol + 1
+	// CapCountNum is the count of num capabilities.
+	CapCountNum = NumberOfFunctionKeys + 1
+	// CapCountString is the count of string capabilities.
+	CapCountString = BoxChars1 + 1
+)
+
+// boolCapNames are the bool term cap names.
+var boolCapNames = [...]string{
+	"auto_left_margin", "bw",
+	"auto_right_margin", "am",
+	"no_esc_ctlc", "xsb",
+	"ceol_standout_glitch", "xhp",
+	"eat_newline_glitch", "xenl",
+	"erase_overstrike", "eo",
+	"generic_type", "gn",
+	"hard_copy", "hc",
+	"has_meta_key", "km",
+	"has_status_line", "hs",
+	"insert_null_glitch", "in",
+	"memory_above", "da",
+	"memory_below", "db",
+	"move_insert_mode", "mir",
+	"move_standout_mode", "msgr",
+	"over_strike", "os",
+	"status_line_esc_ok", "eslok",
+	"dest_tabs_magic_smso", "xt",
+	"tilde_glitch", "hz",
+	"transparent_underline", "ul",
+	"xon_xoff", "xon",
+	"needs_xon_xoff", "nxon",
+	"prtr_silent", "mc5i",
+	"hard_cursor", "chts",
+	"non_rev_rmcup", "nrrmc",
+	"no_pad_char", "npc",
+	"non_dest_scroll_region", "ndscr",
+	"can_change", "ccc",
+	"back_color_erase", "bce",
+	"hue_lightness_saturation", "hls",
+	"col_addr_glitch", "xhpa",
+	"cr_cancels_micro_mode", "crxm",
+	"has_print_wheel", "daisy",
+	"row_addr_glitch", "xvpa",
+	"semi_auto_right_margin", "sam",
+	"cpi_changes_res", "cpix",
+	"lpi_changes_res", "lpix",
+	"backspaces_with_bs", "OTbs",
+	"crt_no_scrolling", "OTns",
+	"no_correctly_working_cr", "OTnc",
+	"gnu_has_meta_key", "OTMT",
+	"linefeed_is_newline", "OTNL",
+	"has_hardware_tabs", "OTpt",
+	"return_does_clr_eol", "OTxr",
+}
+
+// numCapNames are the num term cap names.
+var numCapNames = [...]string{
+	"columns", "cols",
+	"init_tabs", "it",
+	"lines", "lines",
+	"lines_of_memory", "lm",
+	"magic_cookie_glitch", "xmc",
+	"padding_baud_rate", "pb",
+	"virtual_terminal", "vt",
+	"width_status_line", "wsl",
+	"num_labels", "nlab",
+	"label_height", "lh",
+	"label_width", "lw",
+	"max_attributes", "ma",
+	"maximum_windows", "wnum",
+	"max_colors", "colors",
+	"max_pairs", "pairs",
+	"no_color_video", "ncv",
+	"buffer_capacity", "bufsz",
+	"dot_vert_spacing", "spinv",
+	"dot_horz_spacing", "spinh",
+	"max_micro_address", "maddr",
+	"max_micro_jump", "mjump",
+	"micro_col_size", "mcs",
+	"micro_line_size", "mls",
+	"number_of_pins", "npins",
+	"output_res_char", "orc",
+	"output_res_line", "orl",
+	"output_res_horz_inch", "orhi",
+	"output_res_vert_inch", "orvi",
+	"print_rate", "cps",
+	"wide_char_size", "widcs",
+	"buttons", "btns",
+	"bit_image_entwining", "bitwin",
+	"bit_image_type", "bitype",
+	"magic_cookie_glitch_ul", "OTug",
+	"carriage_return_delay", "OTdC",
+	"new_line_delay", "OTdN",
+	"backspace_delay", "OTdB",
+	"horizontal_tab_delay", "OTdT",
+	"number_of_function_keys", "OTkn",
+}
+
+// stringCapNames are the string term cap names.
+var stringCapNames = [...]string{
+	"back_tab", "cbt",
+	"bell", "bel",
+	"carriage_return", "cr",
+	"change_scroll_region", "csr",
+	"clear_all_tabs", "tbc",
+	"clear_screen", "clear",
+	"clr_eol", "el",
+	"clr_eos", "ed",
+	"column_address", "hpa",
+	"command_character", "cmdch",
+	"cursor_address", "cup",
+	"cursor_down", "cud1",
+	"cursor_home", "home",
+	"cursor_invisible", "civis",
+	"cursor_left", "cub1",
+	"cursor_mem_address", "mrcup",
+	"cursor_normal", "cnorm",
+	"cursor_right", "cuf1",
+	"cursor_to_ll", "ll",
+	"cursor_up", "cuu1",
+	"cursor_visible", "cvvis",
+	"delete_character", "dch1",
+	"delete_line", "dl1",
+	"dis_status_line", "dsl",
+	"down_half_line", "hd",
+	"enter_alt_charset_mode", "smacs",
+	"enter_blink_mode", "blink",
+	"enter_bold_mode", "bold",
+	"enter_ca_mode", "smcup",
+	"enter_delete_mode", "smdc",
+	"enter_dim_mode", "dim",
+	"enter_insert_mode", "smir",
+	"enter_secure_mode", "invis",
+	"enter_protected_mode", "prot",
+	"enter_reverse_mode", "rev",
+	"enter_standout_mode", "smso",
+	"enter_underline_mode", "smul",
+	"erase_chars", "ech",
+	"exit_alt_charset_mode", "rmacs",
+	"exit_attribute_mode", "sgr0",
+	"exit_ca_mode", "rmcup",
+	"exit_delete_mode", "rmdc",
+	"exit_insert_mode", "rmir",
+	"exit_standout_mode", "rmso",
+	"exit_underline_mode", "rmul",
+	"flash_screen", "flash",
+	"form_feed", "ff",
+	"from_status_line", "fsl",
+	"init_1string", "is1",
+	"init_2string", "is2",
+	"init_3string", "is3",
+	"init_file", "if",
+	"insert_character", "ich1",
+	"insert_line", "il1",
+	"insert_padding", "ip",
+	"key_backspace", "kbs",
+	"key_catab", "ktbc",
+	"key_clear", "kclr",
+	"key_ctab", "kctab",
+	"key_dc", "kdch1",
+	"key_dl", "kdl1",
+	"key_down", "kcud1",
+	"key_eic", "krmir",
+	"key_eol", "kel",
+	"key_eos", "ked",
+	"key_f0", "kf0",
+	"key_f1", "kf1",
+	"key_f10", "kf10",
+	"key_f2", "kf2",
+	"key_f3", "kf3",
+	"key_f4", "kf4",
+	"key_f5", "kf5",
+	"key_f6", "kf6",
+	"key_f7", "kf7",
+	"key_f8", "kf8",
+	"key_f9", "kf9",
+	"key_home", "khome",
+	"key_ic", "kich1",
+	"key_il", "kil1",
+	"key_left", "kcub1",
+	"key_ll", "kll",
+	"key_npage", "knp",
+	"key_ppage", "kpp",
+	"key_right", "kcuf1",
+	"key_sf", "kind",
+	"key_sr", "kri",
+	"key_stab", "khts",
+	"key_up", "kcuu1",
+	"keypad_local", "rmkx",
+	"keypad_xmit", "smkx",
+	"lab_f0", "lf0",
+	"lab_f1", "lf1",
+	"lab_f10", "lf10",
+	"lab_f2", "lf2",
+	"lab_f3", "lf3",
+	"lab_f4", "lf4",
+	"lab_f5", "lf5",
+	"lab_f6", "lf6",
+	"lab_f7", "lf7",
+	"lab_f8", "lf8",
+	"lab_f9", "lf9",
+	"meta_off", "rmm",
+	"meta_on", "smm",
+	"newline", "nel",
+	"pad_char", "pad",
+	"parm_dch", "dch",
+	"parm_delete_line", "dl",
+	"parm_down_cursor", "cud",
+	"parm_ich", "ich",
+	"parm_index", "indn",
+	"parm_insert_line", "il",
+	"parm_left_cursor", "cub",
+	"parm_right_cursor", "cuf",
+	"parm_rindex", "rin",
+	"parm_up_cursor", "cuu",
+	"pkey_key", "pfkey",
+	"pkey_local", "pfloc",
+	"pkey_xmit", "pfx",
+	"print_screen", "mc0",
+	"prtr_off", "mc4",
+	"prtr_on", "mc5",
+	"repeat_char", "rep",
+	"reset_1string", "rs1",
+	"reset_2string", "rs2",
+	"reset_3string", "rs3",
+	"reset_file", "rf",
+	"restore_cursor", "rc",
+	"row_address", "vpa",
+	"save_cursor", "sc",
+	"scroll_forward", "ind",
+	"scroll_reverse", "ri",
+	"set_attributes", "sgr",
+	"set_tab", "hts",
+	"set_window", "wind",
+	"tab", "ht",
+	"to_status_line", "tsl",
+	"underline_char", "uc",
+	"up_half_line", "hu",
+	"init_prog", "iprog",
+	"key_a1", "ka1",
+	"key_a3", "ka3",
+	"key_b2", "kb2",
+	"key_c1", "kc1",
+	"key_c3", "kc3",
+	"prtr_non", "mc5p",
+	"char_padding", "rmp",
+	"acs_chars", "acsc",
+	"plab_norm", "pln",
+	"key_btab", "kcbt",
+	"enter_xon_mode", "smxon",
+	"exit_xon_mode", "rmxon",
+	"enter_am_mode", "smam",
+	"exit_am_mode", "rmam",
+	"xon_character", "xonc",
+	"xoff_character", "xoffc",
+	"ena_acs", "enacs",
+	"label_on", "smln",
+	"label_off", "rmln",
+	"key_beg", "kbeg",
+	"key_cancel", "kcan",
+	"key_close", "kclo",
+	"key_command", "kcmd",
+	"key_copy", "kcpy",
+	"key_create", "kcrt",
+	"key_end", "kend",
+	"key_enter", "kent",
+	"key_exit", "kext",
+	"key_find", "kfnd",
+	"key_help", "khlp",
+	"key_mark", "kmrk",
+	"key_message", "kmsg",
+	"key_move", "kmov",
+	"key_next", "knxt",
+	"key_open", "kopn",
+	"key_options", "kopt",
+	"key_previous", "kprv",
+	"key_print", "kprt",
+	"key_redo", "krdo",
+	"key_reference", "kref",
+	"key_refresh", "krfr",
+	"key_replace", "krpl",
+	"key_restart", "krst",
+	"key_resume", "kres",
+	"key_save", "ksav",
+	"key_suspend", "kspd",
+	"key_undo", "kund",
+	"key_sbeg", "kBEG",
+	"key_scancel", "kCAN",
+	"key_scommand", "kCMD",
+	"key_scopy", "kCPY",
+	"key_screate", "kCRT",
+	"key_sdc", "kDC",
+	"key_sdl", "kDL",
+	"key_select", "kslt",
+	"key_send", "kEND",
+	"key_seol", "kEOL",
+	"key_sexit", "kEXT",
+	"key_sfind", "kFND",
+	"key_shelp", "kHLP",
+	"key_shome", "kHOM",
+	"key_sic", "kIC",
+	"key_sleft", "kLFT",
+	"key_smessage", "kMSG",
+	"key_smove", "kMOV",
+	"key_snext", "kNXT",
+	"key_soptions", "kOPT",
+	"key_sprevious", "kPRV",
+	"key_sprint", "kPRT",
+	"key_sredo", "kRDO",
+	"key_sreplace", "kRPL",
+	"key_sright", "kRIT",
+	"key_srsume", "kRES",
+	"key_ssave", "kSAV",
+	"key_ssuspend", "kSPD",
+	"key_sundo", "kUND",
+	"req_for_input", "rfi",
+	"key_f11", "kf11",
+	"key_f12", "kf12",
+	"key_f13", "kf13",
+	"key_f14", "kf14",
+	"key_f15", "kf15",
+	"key_f16", "kf16",
+	"key_f17", "kf17",
+	"key_f18", "kf18",
+	"key_f19", "kf19",
+	"key_f20", "kf20",
+	"key_f21", "kf21",
+	"key_f22", "kf22",
+	"key_f23", "kf23",
+	"key_f24", "kf24",
+	"key_f25", "kf25",
+	"key_f26", "kf26",
+	"key_f27", "kf27",
+	"key_f28", "kf28",
+	"key_f29", "kf29",
+	"key_f30", "kf30",
+	"key_f31", "kf31",
+	"key_f32", "kf32",
+	"key_f33", "kf33",
+	"key_f34", "kf34",
+	"key_f35", "kf35",
+	"key_f36", "kf36",
+	"key_f37", "kf37",
+	"key_f38", "kf38",
+	"key_f39", "kf39",
+	"key_f40", "kf40",
+	"key_f41", "kf41",
+	"key_f42", "kf42",
+	"key_f43", "kf43",
+	"key_f44", "kf44",
+	"key_f45", "kf45",
+	"key_f46", "kf46",
+	"key_f47", "kf47",
+	"key_f48", "kf48",
+	"key_f49", "kf49",
+	"key_f50", "kf50",
+	"key_f51", "kf51",
+	"key_f52", "kf52",
+	"key_f53", "kf53",
+	"key_f54", "kf54",
+	"key_f55", "kf55",
+	"key_f56", "kf56",
+	"key_f57", "kf57",
+	"key_f58", "kf58",
+	"key_f59", "kf59",
+	"key_f60", "kf60",
+	"key_f61", "kf61",
+	"key_f62", "kf62",
+	"key_f63", "kf63",
+	"clr_bol", "el1",
+	"clear_margins", "mgc",
+	"set_left_margin", "smgl",
+	"set_right_margin", "smgr",
+	"label_format", "fln",
+	"set_clock", "sclk",
+	"display_clock", "dclk",
+	"remove_clock", "rmclk",
+	"create_window", "cwin",
+	"goto_window", "wingo",
+	"hangup", "hup",
+	"dial_phone", "dial",
+	"quick_dial", "qdial",
+	"tone", "tone",
+	"pulse", "pulse",
+	"flash_hook", "hook",
+	"fixed_pause", "pause",
+	"wait_tone", "wait",
+	"user0", "u0",
+	"user1", "u1",
+	"user2", "u2",
+	"user3", "u3",
+	"user4", "u4",
+	"user5", "u5",
+	"user6", "u6",
+	"user7", "u7",
+	"user8", "u8",
+	"user9", "u9",
+	"orig_pair", "op",
+	"orig_colors", "oc",
+	"initialize_color", "initc",
+	"initialize_pair", "initp",
+	"set_color_pair", "scp",
+	"set_foreground", "setf",
+	"set_background", "setb",
+	"change_char_pitch", "cpi",
+	"change_line_pitch", "lpi",
+	"change_res_horz", "chr",
+	"change_res_vert", "cvr",
+	"define_char", "defc",
+	"enter_doublewide_mode", "swidm",
+	"enter_draft_quality", "sdrfq",
+	"enter_italics_mode", "sitm",
+	"enter_leftward_mode", "slm",
+	"enter_micro_mode", "smicm",
+	"enter_near_letter_quality", "snlq",
+	"enter_normal_quality", "snrmq",
+	"enter_shadow_mode", "sshm",
+	"enter_subscript_mode", "ssubm",
+	"enter_superscript_mode", "ssupm",
+	"enter_upward_mode", "sum",
+	"exit_doublewide_mode", "rwidm",
+	"exit_italics_mode", "ritm",
+	"exit_leftward_mode", "rlm",
+	"exit_micro_mode", "rmicm",
+	"exit_shadow_mode", "rshm",
+	"exit_subscript_mode", "rsubm",
+	"exit_superscript_mode", "rsupm",
+	"exit_upward_mode", "rum",
+	"micro_column_address", "mhpa",
+	"micro_down", "mcud1",
+	"micro_left", "mcub1",
+	"micro_right", "mcuf1",
+	"micro_row_address", "mvpa",
+	"micro_up", "mcuu1",
+	"order_of_pins", "porder",
+	"parm_down_micro", "mcud",
+	"parm_left_micro", "mcub",
+	"parm_right_micro", "mcuf",
+	"parm_up_micro", "mcuu",
+	"select_char_set", "scs",
+	"set_bottom_margin", "smgb",
+	"set_bottom_margin_parm", "smgbp",
+	"set_left_margin_parm", "smglp",
+	"set_right_margin_parm", "smgrp",
+	"set_top_margin", "smgt",
+	"set_top_margin_parm", "smgtp",
+	"start_bit_image", "sbim",
+	"start_char_set_def", "scsd",
+	"stop_bit_image", "rbim",
+	"stop_char_set_def", "rcsd",
+	"subscript_characters", "subcs",
+	"superscript_characters", "supcs",
+	"these_cause_cr", "docr",
+	"zero_motion", "zerom",
+	"char_set_names", "csnm",
+	"key_mouse", "kmous",
+	"mouse_info", "minfo",
+	"req_mouse_pos", "reqmp",
+	"get_mouse", "getm",
+	"set_a_foreground", "setaf",
+	"set_a_background", "setab",
+	"pkey_plab", "pfxl",
+	"device_type", "devt",
+	"code_set_init", "csin",
+	"set0_des_seq", "s0ds",
+	"set1_des_seq", "s1ds",
+	"set2_des_seq", "s2ds",
+	"set3_des_seq", "s3ds",
+	"set_lr_margin", "smglr",
+	"set_tb_margin", "smgtb",
+	"bit_image_repeat", "birep",
+	"bit_image_newline", "binel",
+	"bit_image_carriage_return", "bicr",
+	"color_names", "colornm",
+	"define_bit_image_region", "defbi",
+	"end_bit_image_region", "endbi",
+	"set_color_band", "setcolor",
+	"set_page_length", "slines",
+	"display_pc_char", "dispc",
+	"enter_pc_charset_mode", "smpch",
+	"exit_pc_charset_mode", "rmpch",
+	"enter_scancode_mode", "smsc",
+	"exit_scancode_mode", "rmsc",
+	"pc_term_options", "pctrm",
+	"scancode_escape", "scesc",
+	"alt_scancode_esc", "scesa",
+	"enter_horizontal_hl_mode", "ehhlm",
+	"enter_left_hl_mode", "elhlm",
+	"enter_low_hl_mode", "elohlm",
+	"enter_right_hl_mode", "erhlm",
+	"enter_top_hl_mode", "ethlm",
+	"enter_vertical_hl_mode", "evhlm",
+	"set_a_attributes", "sgr1",
+	"set_pglen_inch", "slength",
+	"termcap_init2", "OTi2",
+	"termcap_reset", "OTrs",
+	"linefeed_if_not_lf", "OTnl",
+	"backspace_if_not_bs", "OTbc",
+	"other_non_function_keys", "OTko",
+	"arrow_key_map", "OTma",
+	"acs_ulcorner", "OTG2",
+	"acs_llcorner", "OTG3",
+	"acs_urcorner", "OTG1",
+	"acs_lrcorner", "OTG4",
+	"acs_ltee", "OTGR",
+	"acs_rtee", "OTGL",
+	"acs_btee", "OTGU",
+	"acs_ttee", "OTGD",
+	"acs_hline", "OTGH",
+	"acs_vline", "OTGV",
+	"acs_plus", "OTGC",
+	"memory_lock", "meml",
+	"memory_unlock", "memu",
+	"box_chars_1", "box1",
+}
diff --git a/source/vendor/github.com/xo/terminfo/color.go b/source/vendor/github.com/xo/terminfo/color.go
new file mode 100644
index 0000000..76c439f
--- /dev/null
+++ b/source/vendor/github.com/xo/terminfo/color.go
@@ -0,0 +1,88 @@
+package terminfo
+
+import (
+	"os"
+	"strconv"
+	"strings"
+)
+
+// ColorLevel is the color level supported by a terminal.
+type ColorLevel uint
+
+// ColorLevel values.
+const (
+	ColorLevelNone ColorLevel = iota
+	ColorLevelBasic
+	ColorLevelHundreds
+	ColorLevelMillions
+)
+
+// String satisfies the Stringer interface.
+func (c ColorLevel) String() string {
+	switch c {
+	case ColorLevelBasic:
+		return "basic"
+	case ColorLevelHundreds:
+		return "hundreds"
+	case ColorLevelMillions:
+		return "millions"
+	}
+	return "none"
+}
+
+// ChromaFormatterName returns the github.com/alecthomas/chroma compatible
+// formatter name for the color level.
+func (c ColorLevel) ChromaFormatterName() string {
+	switch c {
+	case ColorLevelBasic:
+		return "terminal"
+	case ColorLevelHundreds:
+		return "terminal256"
+	case ColorLevelMillions:
+		return "terminal16m"
+	}
+	return "noop"
+}
+
+// ColorLevelFromEnv returns the color level COLORTERM, FORCE_COLOR,
+// TERM_PROGRAM, or determined from the TERM environment variable.
+func ColorLevelFromEnv() (ColorLevel, error) {
+	// check for overriding environment variables
+	colorTerm, termProg, forceColor := os.Getenv("COLORTERM"), os.Getenv("TERM_PROGRAM"), os.Getenv("FORCE_COLOR")
+	switch {
+	case strings.Contains(colorTerm, "truecolor") || strings.Contains(colorTerm, "24bit") || termProg == "Hyper":
+		return ColorLevelMillions, nil
+	case colorTerm != "" || forceColor != "":
+		return ColorLevelBasic, nil
+	case termProg == "Apple_Terminal":
+		return ColorLevelHundreds, nil
+	case termProg == "iTerm.app":
+		ver := os.Getenv("TERM_PROGRAM_VERSION")
+		if ver == "" {
+			return ColorLevelHundreds, nil
+		}
+		i, err := strconv.Atoi(strings.Split(ver, ".")[0])
+		if err != nil {
+			return ColorLevelNone, ErrInvalidTermProgramVersion
+		}
+		if i == 3 {
+			return ColorLevelMillions, nil
+		}
+		return ColorLevelHundreds, nil
+	}
+	// otherwise determine from TERM's max_colors capability
+	if term := os.Getenv("TERM"); term != "" {
+		ti, err := Load(term)
+		if err != nil {
+			return ColorLevelNone, err
+		}
+		v, ok := ti.Nums[MaxColors]
+		switch {
+		case !ok || v <= 16:
+			return ColorLevelNone, nil
+		case ok && v >= 256:
+			return ColorLevelHundreds, nil
+		}
+	}
+	return ColorLevelBasic, nil
+}
diff --git a/source/vendor/github.com/xo/terminfo/dec.go b/source/vendor/github.com/xo/terminfo/dec.go
new file mode 100644
index 0000000..dacc88e
--- /dev/null
+++ b/source/vendor/github.com/xo/terminfo/dec.go
@@ -0,0 +1,245 @@
+package terminfo
+
+import (
+	"sort"
+)
+
+const (
+	// maxFileLength is the max file length.
+	maxFileLength = 4096
+	// magic is the file magic for terminfo files.
+	magic = 0o432
+	// magicExtended is the file magic for terminfo files with the extended
+	// number format.
+	magicExtended = 0o1036
+)
+
+// header fields.
+const (
+	fieldMagic = iota
+	fieldNameSize
+	fieldBoolCount
+	fieldNumCount
+	fieldStringCount
+	fieldTableSize
+)
+
+// header extended fields.
+const (
+	fieldExtBoolCount = iota
+	fieldExtNumCount
+	fieldExtStringCount
+	fieldExtOffsetCount
+	fieldExtTableSize
+)
+
+// hasInvalidCaps determines if the capabilities in h are invalid.
+func hasInvalidCaps(h []int) bool {
+	return h[fieldBoolCount] > CapCountBool ||
+		h[fieldNumCount] > CapCountNum ||
+		h[fieldStringCount] > CapCountString
+}
+
+// capLength returns the total length of the capabilities in bytes.
+func capLength(h []int) int {
+	return h[fieldNameSize] +
+		h[fieldBoolCount] +
+		(h[fieldNameSize]+h[fieldBoolCount])%2 + // account for word align
+		h[fieldNumCount]*2 +
+		h[fieldStringCount]*2 +
+		h[fieldTableSize]
+}
+
+// hasInvalidExtOffset determines if the extended offset field is valid.
+func hasInvalidExtOffset(h []int) bool {
+	return h[fieldExtBoolCount]+
+		h[fieldExtNumCount]+
+		h[fieldExtStringCount]*2 != h[fieldExtOffsetCount]
+}
+
+// extCapLength returns the total length of extended capabilities in bytes.
+func extCapLength(h []int, numWidth int) int {
+	return h[fieldExtBoolCount] +
+		h[fieldExtBoolCount]%2 + // account for word align
+		h[fieldExtNumCount]*(numWidth/8) +
+		h[fieldExtOffsetCount]*2 +
+		h[fieldExtTableSize]
+}
+
+// findNull finds the position of null in buf.
+func findNull(buf []byte, i int) int {
+	for ; i < len(buf); i++ {
+		if buf[i] == 0 {
+			return i
+		}
+	}
+	return -1
+}
+
+// readStrings decodes n strings from string data table buf using the indexes in idx.
+func readStrings(idx []int, buf []byte, n int) (map[int][]byte, int, error) {
+	var last int
+	m := make(map[int][]byte)
+	for i := 0; i < n; i++ {
+		start := idx[i]
+		if start < 0 {
+			continue
+		}
+		if end := findNull(buf, start); end != -1 {
+			m[i], last = buf[start:end], end+1
+		} else {
+			return nil, 0, ErrInvalidStringTable
+		}
+	}
+	return m, last, nil
+}
+
+// decoder holds state info while decoding a terminfo file.
+type decoder struct {
+	buf []byte
+	pos int
+	n   int
+}
+
+// readBytes reads the next n bytes of buf, incrementing pos by n.
+func (d *decoder) readBytes(n int) ([]byte, error) {
+	if d.n < d.pos+n {
+		return nil, ErrUnexpectedFileEnd
+	}
+	n, d.pos = d.pos, d.pos+n
+	return d.buf[n:d.pos], nil
+}
+
+// readInts reads n number of ints with width w.
+func (d *decoder) readInts(n, w int) ([]int, error) {
+	w /= 8
+	l := n * w
+	buf, err := d.readBytes(l)
+	if err != nil {
+		return nil, err
+	}
+	// align
+	d.pos += d.pos % 2
+	z := make([]int, n)
+	for i, j := 0, 0; i < l; i, j = i+w, j+1 {
+		switch w {
+		case 1:
+			z[i] = int(buf[i])
+		case 2:
+			z[j] = int(int16(buf[i+1])<<8 | int16(buf[i]))
+		case 4:
+			z[j] = int(buf[i+3])<<24 | int(buf[i+2])<<16 | int(buf[i+1])<<8 | int(buf[i])
+		}
+	}
+	return z, nil
+}
+
+// readBools reads the next n bools.
+func (d *decoder) readBools(n int) (map[int]bool, map[int]bool, error) {
+	buf, err := d.readInts(n, 8)
+	if err != nil {
+		return nil, nil, err
+	}
+	// process
+	bools, boolsM := make(map[int]bool), make(map[int]bool)
+	for i, b := range buf {
+		bools[i] = b == 1
+		if int8(b) == -2 {
+			boolsM[i] = true
+		}
+	}
+	return bools, boolsM, nil
+}
+
+// readNums reads the next n nums.
+func (d *decoder) readNums(n, w int) (map[int]int, map[int]bool, error) {
+	buf, err := d.readInts(n, w)
+	if err != nil {
+		return nil, nil, err
+	}
+	// process
+	nums, numsM := make(map[int]int), make(map[int]bool)
+	for i := 0; i < n; i++ {
+		nums[i] = buf[i]
+		if buf[i] == -2 {
+			numsM[i] = true
+		}
+	}
+	return nums, numsM, nil
+}
+
+// readStringTable reads the string data for n strings and the accompanying data
+// table of length sz.
+func (d *decoder) readStringTable(n, sz int) ([][]byte, []int, error) {
+	buf, err := d.readInts(n, 16)
+	if err != nil {
+		return nil, nil, err
+	}
+	// read string data table
+	data, err := d.readBytes(sz)
+	if err != nil {
+		return nil, nil, err
+	}
+	// align
+	d.pos += d.pos % 2
+	// process
+	s := make([][]byte, n)
+	var m []int
+	for i := 0; i < n; i++ {
+		start := buf[i]
+		if start == -2 {
+			m = append(m, i)
+		} else if start >= 0 {
+			if end := findNull(data, start); end != -1 {
+				s[i] = data[start:end]
+			} else {
+				return nil, nil, ErrInvalidStringTable
+			}
+		}
+	}
+	return s, m, nil
+}
+
+// readStrings reads the next n strings and processes the string data table of
+// length sz.
+func (d *decoder) readStrings(n, sz int) (map[int][]byte, map[int]bool, error) {
+	s, m, err := d.readStringTable(n, sz)
+	if err != nil {
+		return nil, nil, err
+	}
+	strs := make(map[int][]byte)
+	for k, v := range s {
+		if k == AcsChars {
+			v = canonicalizeAscChars(v)
+		}
+		strs[k] = v
+	}
+	strsM := make(map[int]bool, len(m))
+	for _, k := range m {
+		strsM[k] = true
+	}
+	return strs, strsM, nil
+}
+
+// canonicalizeAscChars reorders chars to be unique, in order.
+//
+// see repair_ascc in ncurses-6.3/progs/dump_entry.c
+func canonicalizeAscChars(z []byte) []byte {
+	var c []byte
+	enc := make(map[byte]byte, len(z)/2)
+	for i := 0; i < len(z); i += 2 {
+		if _, ok := enc[z[i]]; !ok {
+			a, b := z[i], z[i+1]
+			// log.Printf(">>> a: %d %c, b: %d %c", a, a, b, b)
+			c, enc[a] = append(c, b), b
+		}
+	}
+	sort.Slice(c, func(i, j int) bool {
+		return c[i] < c[j]
+	})
+	r := make([]byte, 2*len(c))
+	for i := 0; i < len(c); i++ {
+		r[i*2], r[i*2+1] = c[i], enc[c[i]]
+	}
+	return r
+}
diff --git a/source/vendor/github.com/xo/terminfo/load.go b/source/vendor/github.com/xo/terminfo/load.go
new file mode 100644
index 0000000..d7cd266
--- /dev/null
+++ b/source/vendor/github.com/xo/terminfo/load.go
@@ -0,0 +1,64 @@
+package terminfo
+
+import (
+	"os"
+	"os/user"
+	"path"
+	"strings"
+	"sync"
+)
+
+// termCache is the terminfo cache.
+var termCache = struct {
+	db map[string]*Terminfo
+	sync.RWMutex
+}{
+	db: make(map[string]*Terminfo),
+}
+
+// Load follows the behavior described in terminfo(5) to find correct the
+// terminfo file using the name, reads the file and then returns a Terminfo
+// struct that describes the file.
+func Load(name string) (*Terminfo, error) {
+	if name == "" {
+		return nil, ErrEmptyTermName
+	}
+	termCache.RLock()
+	ti, ok := termCache.db[name]
+	termCache.RUnlock()
+	if ok {
+		return ti, nil
+	}
+	var checkDirs []string
+	// check $TERMINFO
+	if dir := os.Getenv("TERMINFO"); dir != "" {
+		checkDirs = append(checkDirs, dir)
+	}
+	// check $HOME/.terminfo
+	u, err := user.Current()
+	if err != nil {
+		return nil, err
+	}
+	checkDirs = append(checkDirs, path.Join(u.HomeDir, ".terminfo"))
+	// check $TERMINFO_DIRS
+	if dirs := os.Getenv("TERMINFO_DIRS"); dirs != "" {
+		checkDirs = append(checkDirs, strings.Split(dirs, ":")...)
+	}
+	// check fallback directories
+	checkDirs = append(checkDirs, "/etc/terminfo", "/lib/terminfo", "/usr/share/terminfo")
+	for _, dir := range checkDirs {
+		ti, err = Open(dir, name)
+		if err != nil && err != ErrFileNotFound && !os.IsNotExist(err) {
+			return nil, err
+		} else if err == nil {
+			return ti, nil
+		}
+	}
+	return nil, ErrDatabaseDirectoryNotFound
+}
+
+// LoadFromEnv loads the terminal info based on the name contained in
+// environment variable TERM.
+func LoadFromEnv() (*Terminfo, error) {
+	return Load(os.Getenv("TERM"))
+}
diff --git a/source/vendor/github.com/xo/terminfo/param.go b/source/vendor/github.com/xo/terminfo/param.go
new file mode 100644
index 0000000..ed4cb86
--- /dev/null
+++ b/source/vendor/github.com/xo/terminfo/param.go
@@ -0,0 +1,405 @@
+package terminfo
+
+import (
+	"bytes"
+	"fmt"
+	"io"
+	"strconv"
+	"strings"
+	"sync"
+)
+
+// parametizer represents the a scan state for a parameterized string.
+type parametizer struct {
+	// z is the string to parameterize
+	z []byte
+	// pos is the current position in s.
+	pos int
+	// nest is the current nest level.
+	nest int
+	// s is the variable stack.
+	s stack
+	// skipElse keeps the state of skipping else.
+	skipElse bool
+	// buf is the result buffer.
+	buf *bytes.Buffer
+	// params are the parameters to interpolate.
+	params [9]interface{}
+	// vars are dynamic variables.
+	vars [26]interface{}
+}
+
+// staticVars are the static, global variables.
+var staticVars = struct {
+	vars [26]interface{}
+	sync.Mutex
+}{}
+
+var parametizerPool = sync.Pool{
+	New: func() interface{} {
+		p := new(parametizer)
+		p.buf = bytes.NewBuffer(make([]byte, 0, 45))
+		return p
+	},
+}
+
+// newParametizer returns a new initialized parametizer from the pool.
+func newParametizer(z []byte) *parametizer {
+	p := parametizerPool.Get().(*parametizer)
+	p.z = z
+	return p
+}
+
+// reset resets the parametizer.
+func (p *parametizer) reset() {
+	p.pos, p.nest = 0, 0
+	p.s.reset()
+	p.buf.Reset()
+	p.params, p.vars = [9]interface{}{}, [26]interface{}{}
+	parametizerPool.Put(p)
+}
+
+// stateFn represents the state of the scanner as a function that returns the
+// next state.
+type stateFn func() stateFn
+
+// exec executes the parameterizer, interpolating the supplied parameters.
+func (p *parametizer) exec() string {
+	for state := p.scanTextFn; state != nil; {
+		state = state()
+	}
+	return p.buf.String()
+}
+
+// peek returns the next byte.
+func (p *parametizer) peek() (byte, error) {
+	if p.pos >= len(p.z) {
+		return 0, io.EOF
+	}
+	return p.z[p.pos], nil
+}
+
+// writeFrom writes the characters from ppos to pos to the buffer.
+func (p *parametizer) writeFrom(ppos int) {
+	if p.pos > ppos {
+		// append remaining characters.
+		p.buf.Write(p.z[ppos:p.pos])
+	}
+}
+
+func (p *parametizer) scanTextFn() stateFn {
+	ppos := p.pos
+	for {
+		ch, err := p.peek()
+		if err != nil {
+			p.writeFrom(ppos)
+			return nil
+		}
+		if ch == '%' {
+			p.writeFrom(ppos)
+			p.pos++
+			return p.scanCodeFn
+		}
+		p.pos++
+	}
+}
+
+func (p *parametizer) scanCodeFn() stateFn {
+	ch, err := p.peek()
+	if err != nil {
+		return nil
+	}
+	switch ch {
+	case '%':
+		p.buf.WriteByte('%')
+	case ':':
+		// this character is used to avoid interpreting "%-" and "%+" as operators.
+		// the next character is where the format really begins.
+		p.pos++
+		_, err = p.peek()
+		if err != nil {
+			return nil
+		}
+		return p.scanFormatFn
+	case '#', ' ', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.':
+		return p.scanFormatFn
+	case 'o':
+		p.buf.WriteString(strconv.FormatInt(int64(p.s.popInt()), 8))
+	case 'd':
+		p.buf.WriteString(strconv.Itoa(p.s.popInt()))
+	case 'x':
+		p.buf.WriteString(strconv.FormatInt(int64(p.s.popInt()), 16))
+	case 'X':
+		p.buf.WriteString(strings.ToUpper(strconv.FormatInt(int64(p.s.popInt()), 16)))
+	case 's':
+		p.buf.WriteString(p.s.popString())
+	case 'c':
+		p.buf.WriteByte(p.s.popByte())
+	case 'p':
+		p.pos++
+		return p.pushParamFn
+	case 'P':
+		p.pos++
+		return p.setDsVarFn
+	case 'g':
+		p.pos++
+		return p.getDsVarFn
+	case '\'':
+		p.pos++
+		ch, err = p.peek()
+		if err != nil {
+			return nil
+		}
+		p.s.push(ch)
+		// skip the '\''
+		p.pos++
+	case '{':
+		p.pos++
+		return p.pushIntfn
+	case 'l':
+		p.s.push(len(p.s.popString()))
+	case '+':
+		bi, ai := p.s.popInt(), p.s.popInt()
+		p.s.push(ai + bi)
+	case '-':
+		bi, ai := p.s.popInt(), p.s.popInt()
+		p.s.push(ai - bi)
+	case '*':
+		bi, ai := p.s.popInt(), p.s.popInt()
+		p.s.push(ai * bi)
+	case '/':
+		bi, ai := p.s.popInt(), p.s.popInt()
+		if bi != 0 {
+			p.s.push(ai / bi)
+		} else {
+			p.s.push(0)
+		}
+	case 'm':
+		bi, ai := p.s.popInt(), p.s.popInt()
+		if bi != 0 {
+			p.s.push(ai % bi)
+		} else {
+			p.s.push(0)
+		}
+	case '&':
+		bi, ai := p.s.popInt(), p.s.popInt()
+		p.s.push(ai & bi)
+	case '|':
+		bi, ai := p.s.popInt(), p.s.popInt()
+		p.s.push(ai | bi)
+	case '^':
+		bi, ai := p.s.popInt(), p.s.popInt()
+		p.s.push(ai ^ bi)
+	case '=':
+		bi, ai := p.s.popInt(), p.s.popInt()
+		p.s.push(ai == bi)
+	case '>':
+		bi, ai := p.s.popInt(), p.s.popInt()
+		p.s.push(ai > bi)
+	case '<':
+		bi, ai := p.s.popInt(), p.s.popInt()
+		p.s.push(ai < bi)
+	case 'A':
+		bi, ai := p.s.popBool(), p.s.popBool()
+		p.s.push(ai && bi)
+	case 'O':
+		bi, ai := p.s.popBool(), p.s.popBool()
+		p.s.push(ai || bi)
+	case '!':
+		p.s.push(!p.s.popBool())
+	case '~':
+		p.s.push(^p.s.popInt())
+	case 'i':
+		for i := range p.params[:2] {
+			if n, ok := p.params[i].(int); ok {
+				p.params[i] = n + 1
+			}
+		}
+	case '?', ';':
+	case 't':
+		return p.scanThenFn
+	case 'e':
+		p.skipElse = true
+		return p.skipTextFn
+	}
+	p.pos++
+	return p.scanTextFn
+}
+
+func (p *parametizer) scanFormatFn() stateFn {
+	// the character was already read, so no need to check the error.
+	ch, _ := p.peek()
+	// 6 should be the maximum length of a format string, for example "%:-9.9d".
+	f := []byte{'%', ch, 0, 0, 0, 0}
+	var err error
+	for {
+		p.pos++
+		ch, err = p.peek()
+		if err != nil {
+			return nil
+		}
+		f = append(f, ch)
+		switch ch {
+		case 'o', 'd', 'x', 'X':
+			fmt.Fprintf(p.buf, string(f), p.s.popInt())
+			break
+		case 's':
+			fmt.Fprintf(p.buf, string(f), p.s.popString())
+			break
+		case 'c':
+			fmt.Fprintf(p.buf, string(f), p.s.popByte())
+			break
+		}
+	}
+	p.pos++
+	return p.scanTextFn
+}
+
+func (p *parametizer) pushParamFn() stateFn {
+	ch, err := p.peek()
+	if err != nil {
+		return nil
+	}
+	if ai := int(ch - '1'); ai >= 0 && ai < len(p.params) {
+		p.s.push(p.params[ai])
+	} else {
+		p.s.push(0)
+	}
+	// skip the '}'
+	p.pos++
+	return p.scanTextFn
+}
+
+func (p *parametizer) setDsVarFn() stateFn {
+	ch, err := p.peek()
+	if err != nil {
+		return nil
+	}
+	if ch >= 'A' && ch <= 'Z' {
+		staticVars.Lock()
+		staticVars.vars[int(ch-'A')] = p.s.pop()
+		staticVars.Unlock()
+	} else if ch >= 'a' && ch <= 'z' {
+		p.vars[int(ch-'a')] = p.s.pop()
+	}
+	p.pos++
+	return p.scanTextFn
+}
+
+func (p *parametizer) getDsVarFn() stateFn {
+	ch, err := p.peek()
+	if err != nil {
+		return nil
+	}
+	var a byte
+	if ch >= 'A' && ch <= 'Z' {
+		a = 'A'
+	} else if ch >= 'a' && ch <= 'z' {
+		a = 'a'
+	}
+	staticVars.Lock()
+	p.s.push(staticVars.vars[int(ch-a)])
+	staticVars.Unlock()
+	p.pos++
+	return p.scanTextFn
+}
+
+func (p *parametizer) pushIntfn() stateFn {
+	var ai int
+	for {
+		ch, err := p.peek()
+		if err != nil {
+			return nil
+		}
+		p.pos++
+		if ch < '0' || ch > '9' {
+			p.s.push(ai)
+			return p.scanTextFn
+		}
+		ai = (ai * 10) + int(ch-'0')
+	}
+}
+
+func (p *parametizer) scanThenFn() stateFn {
+	p.pos++
+	if p.s.popBool() {
+		return p.scanTextFn
+	}
+	p.skipElse = false
+	return p.skipTextFn
+}
+
+func (p *parametizer) skipTextFn() stateFn {
+	for {
+		ch, err := p.peek()
+		if err != nil {
+			return nil
+		}
+		p.pos++
+		if ch == '%' {
+			break
+		}
+	}
+	if p.skipElse {
+		return p.skipElseFn
+	}
+	return p.skipThenFn
+}
+
+func (p *parametizer) skipThenFn() stateFn {
+	ch, err := p.peek()
+	if err != nil {
+		return nil
+	}
+	p.pos++
+	switch ch {
+	case ';':
+		if p.nest == 0 {
+			return p.scanTextFn
+		}
+		p.nest--
+	case '?':
+		p.nest++
+	case 'e':
+		if p.nest == 0 {
+			return p.scanTextFn
+		}
+	}
+	return p.skipTextFn
+}
+
+func (p *parametizer) skipElseFn() stateFn {
+	ch, err := p.peek()
+	if err != nil {
+		return nil
+	}
+	p.pos++
+	switch ch {
+	case ';':
+		if p.nest == 0 {
+			return p.scanTextFn
+		}
+		p.nest--
+	case '?':
+		p.nest++
+	}
+	return p.skipTextFn
+}
+
+// Printf evaluates a parameterized terminfo value z, interpolating params.
+func Printf(z []byte, params ...interface{}) string {
+	p := newParametizer(z)
+	defer p.reset()
+	// make sure we always have 9 parameters -- makes it easier
+	// later to skip checks and its faster
+	for i := 0; i < len(p.params) && i < len(params); i++ {
+		p.params[i] = params[i]
+	}
+	return p.exec()
+}
+
+// Fprintf evaluates a parameterized terminfo value z, interpolating params and
+// writing to w.
+func Fprintf(w io.Writer, z []byte, params ...interface{}) {
+	w.Write([]byte(Printf(z, params...)))
+}
diff --git a/source/vendor/github.com/xo/terminfo/stack.go b/source/vendor/github.com/xo/terminfo/stack.go
new file mode 100644
index 0000000..a6de395
--- /dev/null
+++ b/source/vendor/github.com/xo/terminfo/stack.go
@@ -0,0 +1,48 @@
+package terminfo
+
+type stack []interface{}
+
+func (s *stack) push(v interface{}) {
+	*s = append(*s, v)
+}
+
+func (s *stack) pop() interface{} {
+	if len(*s) == 0 {
+		return nil
+	}
+	v := (*s)[len(*s)-1]
+	*s = (*s)[:len(*s)-1]
+	return v
+}
+
+func (s *stack) popInt() int {
+	if i, ok := s.pop().(int); ok {
+		return i
+	}
+	return 0
+}
+
+func (s *stack) popBool() bool {
+	if b, ok := s.pop().(bool); ok {
+		return b
+	}
+	return false
+}
+
+func (s *stack) popByte() byte {
+	if b, ok := s.pop().(byte); ok {
+		return b
+	}
+	return 0
+}
+
+func (s *stack) popString() string {
+	if a, ok := s.pop().(string); ok {
+		return a
+	}
+	return ""
+}
+
+func (s *stack) reset() {
+	*s = (*s)[:0]
+}
diff --git a/source/vendor/github.com/xo/terminfo/terminfo.go b/source/vendor/github.com/xo/terminfo/terminfo.go
new file mode 100644
index 0000000..69e3b60
--- /dev/null
+++ b/source/vendor/github.com/xo/terminfo/terminfo.go
@@ -0,0 +1,479 @@
+// Package terminfo implements reading terminfo files in pure go.
+package terminfo
+
+//go:generate go run gen.go
+
+import (
+	"io"
+	"io/ioutil"
+	"path"
+	"strconv"
+	"strings"
+)
+
+// Error is a terminfo error.
+type Error string
+
+// Error satisfies the error interface.
+func (err Error) Error() string {
+	return string(err)
+}
+
+const (
+	// ErrInvalidFileSize is the invalid file size error.
+	ErrInvalidFileSize Error = "invalid file size"
+	// ErrUnexpectedFileEnd is the unexpected file end error.
+	ErrUnexpectedFileEnd Error = "unexpected file end"
+	// ErrInvalidStringTable is the invalid string table error.
+	ErrInvalidStringTable Error = "invalid string table"
+	// ErrInvalidMagic is the invalid magic error.
+	ErrInvalidMagic Error = "invalid magic"
+	// ErrInvalidHeader is the invalid header error.
+	ErrInvalidHeader Error = "invalid header"
+	// ErrInvalidNames is the invalid names error.
+	ErrInvalidNames Error = "invalid names"
+	// ErrInvalidExtendedHeader is the invalid extended header error.
+	ErrInvalidExtendedHeader Error = "invalid extended header"
+	// ErrEmptyTermName is the empty term name error.
+	ErrEmptyTermName Error = "empty term name"
+	// ErrDatabaseDirectoryNotFound is the database directory not found error.
+	ErrDatabaseDirectoryNotFound Error = "database directory not found"
+	// ErrFileNotFound is the file not found error.
+	ErrFileNotFound Error = "file not found"
+	// ErrInvalidTermProgramVersion is the invalid TERM_PROGRAM_VERSION error.
+	ErrInvalidTermProgramVersion Error = "invalid TERM_PROGRAM_VERSION"
+)
+
+// Terminfo describes a terminal's capabilities.
+type Terminfo struct {
+	// File is the original source file.
+	File string
+	// Names are the provided cap names.
+	Names []string
+	// Bools are the bool capabilities.
+	Bools map[int]bool
+	// BoolsM are the missing bool capabilities.
+	BoolsM map[int]bool
+	// Nums are the num capabilities.
+	Nums map[int]int
+	// NumsM are the missing num capabilities.
+	NumsM map[int]bool
+	// Strings are the string capabilities.
+	Strings map[int][]byte
+	// StringsM are the missing string capabilities.
+	StringsM map[int]bool
+	// ExtBools are the extended bool capabilities.
+	ExtBools map[int]bool
+	// ExtBoolsNames is the map of extended bool capabilities to their index.
+	ExtBoolNames map[int][]byte
+	// ExtNums are the extended num capabilities.
+	ExtNums map[int]int
+	// ExtNumsNames is the map of extended num capabilities to their index.
+	ExtNumNames map[int][]byte
+	// ExtStrings are the extended string capabilities.
+	ExtStrings map[int][]byte
+	// ExtStringsNames is the map of extended string capabilities to their index.
+	ExtStringNames map[int][]byte
+}
+
+// Decode decodes the terminfo data contained in buf.
+func Decode(buf []byte) (*Terminfo, error) {
+	var err error
+	// check max file length
+	if len(buf) >= maxFileLength {
+		return nil, ErrInvalidFileSize
+	}
+	d := &decoder{
+		buf: buf,
+		n:   len(buf),
+	}
+	// read header
+	h, err := d.readInts(6, 16)
+	if err != nil {
+		return nil, err
+	}
+	var numWidth int
+	// check magic
+	switch {
+	case h[fieldMagic] == magic:
+		numWidth = 16
+	case h[fieldMagic] == magicExtended:
+		numWidth = 32
+	default:
+		return nil, ErrInvalidMagic
+	}
+	// check header
+	if hasInvalidCaps(h) {
+		return nil, ErrInvalidHeader
+	}
+	// check remaining length
+	if d.n-d.pos < capLength(h) {
+		return nil, ErrUnexpectedFileEnd
+	}
+	// read names
+	names, err := d.readBytes(h[fieldNameSize])
+	if err != nil {
+		return nil, err
+	}
+	// check name is terminated properly
+	i := findNull(names, 0)
+	if i == -1 {
+		return nil, ErrInvalidNames
+	}
+	names = names[:i]
+	// read bool caps
+	bools, boolsM, err := d.readBools(h[fieldBoolCount])
+	if err != nil {
+		return nil, err
+	}
+	// read num caps
+	nums, numsM, err := d.readNums(h[fieldNumCount], numWidth)
+	if err != nil {
+		return nil, err
+	}
+	// read string caps
+	strs, strsM, err := d.readStrings(h[fieldStringCount], h[fieldTableSize])
+	if err != nil {
+		return nil, err
+	}
+	ti := &Terminfo{
+		Names:    strings.Split(string(names), "|"),
+		Bools:    bools,
+		BoolsM:   boolsM,
+		Nums:     nums,
+		NumsM:    numsM,
+		Strings:  strs,
+		StringsM: strsM,
+	}
+	// at the end of file, so no extended caps
+	if d.pos >= d.n {
+		return ti, nil
+	}
+	// decode extended header
+	eh, err := d.readInts(5, 16)
+	if err != nil {
+		return nil, err
+	}
+	// check extended offset field
+	if hasInvalidExtOffset(eh) {
+		return nil, ErrInvalidExtendedHeader
+	}
+	// check extended cap lengths
+	if d.n-d.pos != extCapLength(eh, numWidth) {
+		return nil, ErrInvalidExtendedHeader
+	}
+	// read extended bool caps
+	ti.ExtBools, _, err = d.readBools(eh[fieldExtBoolCount])
+	if err != nil {
+		return nil, err
+	}
+	// read extended num caps
+	ti.ExtNums, _, err = d.readNums(eh[fieldExtNumCount], numWidth)
+	if err != nil {
+		return nil, err
+	}
+	// read extended string data table indexes
+	extIndexes, err := d.readInts(eh[fieldExtOffsetCount], 16)
+	if err != nil {
+		return nil, err
+	}
+	// read string data table
+	extData, err := d.readBytes(eh[fieldExtTableSize])
+	if err != nil {
+		return nil, err
+	}
+	// precautionary check that exactly at end of file
+	if d.pos != d.n {
+		return nil, ErrUnexpectedFileEnd
+	}
+	var last int
+	// read extended string caps
+	ti.ExtStrings, last, err = readStrings(extIndexes, extData, eh[fieldExtStringCount])
+	if err != nil {
+		return nil, err
+	}
+	extIndexes, extData = extIndexes[eh[fieldExtStringCount]:], extData[last:]
+	// read extended bool names
+	ti.ExtBoolNames, _, err = readStrings(extIndexes, extData, eh[fieldExtBoolCount])
+	if err != nil {
+		return nil, err
+	}
+	extIndexes = extIndexes[eh[fieldExtBoolCount]:]
+	// read extended num names
+	ti.ExtNumNames, _, err = readStrings(extIndexes, extData, eh[fieldExtNumCount])
+	if err != nil {
+		return nil, err
+	}
+	extIndexes = extIndexes[eh[fieldExtNumCount]:]
+	// read extended string names
+	ti.ExtStringNames, _, err = readStrings(extIndexes, extData, eh[fieldExtStringCount])
+	if err != nil {
+		return nil, err
+	}
+	// extIndexes = extIndexes[eh[fieldExtStringCount]:]
+	return ti, nil
+}
+
+// Open reads the terminfo file name from the specified directory dir.
+func Open(dir, name string) (*Terminfo, error) {
+	var err error
+	var buf []byte
+	var filename string
+	for _, f := range []string{
+		path.Join(dir, name[0:1], name),
+		path.Join(dir, strconv.FormatUint(uint64(name[0]), 16), name),
+	} {
+		buf, err = ioutil.ReadFile(f)
+		if err == nil {
+			filename = f
+			break
+		}
+	}
+	if buf == nil {
+		return nil, ErrFileNotFound
+	}
+	// decode
+	ti, err := Decode(buf)
+	if err != nil {
+		return nil, err
+	}
+	// save original file name
+	ti.File = filename
+	// add to cache
+	termCache.Lock()
+	for _, n := range ti.Names {
+		termCache.db[n] = ti
+	}
+	termCache.Unlock()
+	return ti, nil
+}
+
+// boolCaps returns all bool and extended capabilities using f to format the
+// index key.
+func (ti *Terminfo) boolCaps(f func(int) string, extended bool) map[string]bool {
+	m := make(map[string]bool, len(ti.Bools)+len(ti.ExtBools))
+	if !extended {
+		for k, v := range ti.Bools {
+			m[f(k)] = v
+		}
+	} else {
+		for k, v := range ti.ExtBools {
+			m[string(ti.ExtBoolNames[k])] = v
+		}
+	}
+	return m
+}
+
+// BoolCaps returns all bool capabilities.
+func (ti *Terminfo) BoolCaps() map[string]bool {
+	return ti.boolCaps(BoolCapName, false)
+}
+
+// BoolCapsShort returns all bool capabilities, using the short name as the
+// index.
+func (ti *Terminfo) BoolCapsShort() map[string]bool {
+	return ti.boolCaps(BoolCapNameShort, false)
+}
+
+// ExtBoolCaps returns all extended bool capabilities.
+func (ti *Terminfo) ExtBoolCaps() map[string]bool {
+	return ti.boolCaps(BoolCapName, true)
+}
+
+// ExtBoolCapsShort returns all extended bool capabilities, using the short
+// name as the index.
+func (ti *Terminfo) ExtBoolCapsShort() map[string]bool {
+	return ti.boolCaps(BoolCapNameShort, true)
+}
+
+// numCaps returns all num and extended capabilities using f to format the
+// index key.
+func (ti *Terminfo) numCaps(f func(int) string, extended bool) map[string]int {
+	m := make(map[string]int, len(ti.Nums)+len(ti.ExtNums))
+	if !extended {
+		for k, v := range ti.Nums {
+			m[f(k)] = v
+		}
+	} else {
+		for k, v := range ti.ExtNums {
+			m[string(ti.ExtNumNames[k])] = v
+		}
+	}
+	return m
+}
+
+// NumCaps returns all num capabilities.
+func (ti *Terminfo) NumCaps() map[string]int {
+	return ti.numCaps(NumCapName, false)
+}
+
+// NumCapsShort returns all num capabilities, using the short name as the
+// index.
+func (ti *Terminfo) NumCapsShort() map[string]int {
+	return ti.numCaps(NumCapNameShort, false)
+}
+
+// ExtNumCaps returns all extended num capabilities.
+func (ti *Terminfo) ExtNumCaps() map[string]int {
+	return ti.numCaps(NumCapName, true)
+}
+
+// ExtNumCapsShort returns all extended num capabilities, using the short
+// name as the index.
+func (ti *Terminfo) ExtNumCapsShort() map[string]int {
+	return ti.numCaps(NumCapNameShort, true)
+}
+
+// stringCaps returns all string and extended capabilities using f to format the
+// index key.
+func (ti *Terminfo) stringCaps(f func(int) string, extended bool) map[string][]byte {
+	m := make(map[string][]byte, len(ti.Strings)+len(ti.ExtStrings))
+	if !extended {
+		for k, v := range ti.Strings {
+			m[f(k)] = v
+		}
+	} else {
+		for k, v := range ti.ExtStrings {
+			m[string(ti.ExtStringNames[k])] = v
+		}
+	}
+	return m
+}
+
+// StringCaps returns all string capabilities.
+func (ti *Terminfo) StringCaps() map[string][]byte {
+	return ti.stringCaps(StringCapName, false)
+}
+
+// StringCapsShort returns all string capabilities, using the short name as the
+// index.
+func (ti *Terminfo) StringCapsShort() map[string][]byte {
+	return ti.stringCaps(StringCapNameShort, false)
+}
+
+// ExtStringCaps returns all extended string capabilities.
+func (ti *Terminfo) ExtStringCaps() map[string][]byte {
+	return ti.stringCaps(StringCapName, true)
+}
+
+// ExtStringCapsShort returns all extended string capabilities, using the short
+// name as the index.
+func (ti *Terminfo) ExtStringCapsShort() map[string][]byte {
+	return ti.stringCaps(StringCapNameShort, true)
+}
+
+// Has determines if the bool cap i is present.
+func (ti *Terminfo) Has(i int) bool {
+	return ti.Bools[i]
+}
+
+// Num returns the num cap i, or -1 if not present.
+func (ti *Terminfo) Num(i int) int {
+	n, ok := ti.Nums[i]
+	if !ok {
+		return -1
+	}
+	return n
+}
+
+// Printf formats the string cap i, interpolating parameters v.
+func (ti *Terminfo) Printf(i int, v ...interface{}) string {
+	return Printf(ti.Strings[i], v...)
+}
+
+// Fprintf prints the string cap i to writer w, interpolating parameters v.
+func (ti *Terminfo) Fprintf(w io.Writer, i int, v ...interface{}) {
+	Fprintf(w, ti.Strings[i], v...)
+}
+
+// Color takes a foreground and background color and returns string that sets
+// them for this terminal.
+func (ti *Terminfo) Colorf(fg, bg int, str string) string {
+	maxColors := int(ti.Nums[MaxColors])
+	// map bright colors to lower versions if the color table only holds 8.
+	if maxColors == 8 {
+		if fg > 7 && fg < 16 {
+			fg -= 8
+		}
+		if bg > 7 && bg < 16 {
+			bg -= 8
+		}
+	}
+	var s string
+	if maxColors > fg && fg >= 0 {
+		s += ti.Printf(SetAForeground, fg)
+	}
+	if maxColors > bg && bg >= 0 {
+		s += ti.Printf(SetABackground, bg)
+	}
+	return s + str + ti.Printf(ExitAttributeMode)
+}
+
+// Goto returns a string suitable for addressing the cursor at the given
+// row and column. The origin 0, 0 is in the upper left corner of the screen.
+func (ti *Terminfo) Goto(row, col int) string {
+	return Printf(ti.Strings[CursorAddress], row, col)
+}
+
+// Puts emits the string to the writer, but expands inline padding indications
+// (of the form $<[delay]> where [delay] is msec) to a suitable number of
+// padding characters (usually null bytes) based upon the supplied baud. At
+// high baud rates, more padding characters will be inserted.
+/*func (ti *Terminfo) Puts(w io.Writer, s string, lines, baud int) (int, error) {
+	var err error
+	for {
+		start := strings.Index(s, "$<")
+		if start == -1 {
+			// most strings don't need padding, which is good news!
+			return io.WriteString(w, s)
+		}
+		end := strings.Index(s, ">")
+		if end == -1 {
+			// unterminated... just emit bytes unadulterated.
+			return io.WriteString(w, "$<"+s)
+		}
+		var c int
+		c, err = io.WriteString(w, s[:start])
+		if err != nil {
+			return n + c, err
+		}
+		n += c
+		s = s[start+2:]
+		val := s[:end]
+		s = s[end+1:]
+		var ms int
+		var dot, mandatory, asterisk bool
+		unit := 1000
+		for _, ch := range val {
+			switch {
+			case ch >= '0' && ch <= '9':
+				ms = (ms * 10) + int(ch-'0')
+				if dot {
+					unit *= 10
+				}
+			case ch == '.' && !dot:
+				dot = true
+			case ch == '*' && !asterisk:
+				ms *= lines
+				asterisk = true
+			case ch == '/':
+				mandatory = true
+			default:
+				break
+			}
+		}
+		z, pad := ((baud/8)/unit)*ms, ti.Strings[PadChar]
+		b := make([]byte, len(pad)*z)
+		for bp := copy(b, pad); bp < len(b); bp *= 2 {
+			copy(b[bp:], b[:bp])
+		}
+		if (!ti.Bools[XonXoff] && baud > int(ti.Nums[PaddingBaudRate])) || mandatory {
+			c, err = w.Write(b)
+			if err != nil {
+				return n + c, err
+			}
+			n += c
+		}
+	}
+	return n, nil
+}*/
diff --git a/source/vendor/golang.org/x/exp/slices/slices.go b/source/vendor/golang.org/x/exp/slices/slices.go
index 757383e..da0df37 100644
--- a/source/vendor/golang.org/x/exp/slices/slices.go
+++ b/source/vendor/golang.org/x/exp/slices/slices.go
@@ -10,16 +10,13 @@ import (
 	"slices"
 )
 
-// TODO(adonovan): when https://go.dev/issue/32816 is accepted, all of
-// these functions should be annotated (provisionally with "//go:fix
-// inline") so that tools can safely and automatically replace calls
-// to exp/slices with calls to std slices by inlining them.
-
 // Equal reports whether two slices are equal: the same length and all
 // elements equal. If the lengths are different, Equal returns false.
 // Otherwise, the elements are compared in increasing index order, and the
 // comparison stops at the first unequal pair.
 // Floating point NaNs are not considered equal.
+//
+//go:fix inline
 func Equal[S ~[]E, E comparable](s1, s2 S) bool {
 	return slices.Equal(s1, s2)
 }
@@ -29,6 +26,8 @@ func Equal[S ~[]E, E comparable](s1, s2 S) bool {
 // EqualFunc returns false. Otherwise, the elements are compared in
 // increasing index order, and the comparison stops at the first index
 // for which eq returns false.
+//
+//go:fix inline
 func EqualFunc[S1 ~[]E1, S2 ~[]E2, E1, E2 any](s1 S1, s2 S2, eq func(E1, E2) bool) bool {
 	return slices.EqualFunc(s1, s2, eq)
 }
@@ -40,6 +39,8 @@ func EqualFunc[S1 ~[]E1, S2 ~[]E2, E1, E2 any](s1 S1, s2 S2, eq func(E1, E2) boo
 // If both slices are equal until one of them ends, the shorter slice is
 // considered less than the longer one.
 // The result is 0 if s1 == s2, -1 if s1 < s2, and +1 if s1 > s2.
+//
+//go:fix inline
 func Compare[S ~[]E, E cmp.Ordered](s1, s2 S) int {
 	return slices.Compare(s1, s2)
 }
@@ -49,29 +50,39 @@ func Compare[S ~[]E, E cmp.Ordered](s1, s2 S) int {
 // The result is the first non-zero result of cmp; if cmp always
 // returns 0 the result is 0 if len(s1) == len(s2), -1 if len(s1) < len(s2),
 // and +1 if len(s1) > len(s2).
+//
+//go:fix inline
 func CompareFunc[S1 ~[]E1, S2 ~[]E2, E1, E2 any](s1 S1, s2 S2, cmp func(E1, E2) int) int {
 	return slices.CompareFunc(s1, s2, cmp)
 }
 
 // Index returns the index of the first occurrence of v in s,
 // or -1 if not present.
+//
+//go:fix inline
 func Index[S ~[]E, E comparable](s S, v E) int {
 	return slices.Index(s, v)
 }
 
 // IndexFunc returns the first index i satisfying f(s[i]),
 // or -1 if none do.
+//
+//go:fix inline
 func IndexFunc[S ~[]E, E any](s S, f func(E) bool) int {
 	return slices.IndexFunc(s, f)
 }
 
 // Contains reports whether v is present in s.
+//
+//go:fix inline
 func Contains[S ~[]E, E comparable](s S, v E) bool {
 	return slices.Contains(s, v)
 }
 
 // ContainsFunc reports whether at least one
 // element e of s satisfies f(e).
+//
+//go:fix inline
 func ContainsFunc[S ~[]E, E any](s S, f func(E) bool) bool {
 	return slices.ContainsFunc(s, f)
 }
@@ -83,6 +94,8 @@ func ContainsFunc[S ~[]E, E any](s S, f func(E) bool) bool {
 // and r[i+len(v)] == value originally at r[i].
 // Insert panics if i is out of range.
 // This function is O(len(s) + len(v)).
+//
+//go:fix inline
 func Insert[S ~[]E, E any](s S, i int, v ...E) S {
 	return slices.Insert(s, i, v...)
 }
@@ -92,6 +105,8 @@ func Insert[S ~[]E, E any](s S, i int, v ...E) S {
 // Delete is O(len(s)-i), so if many items must be deleted, it is better to
 // make a single call deleting them all together than to delete one at a time.
 // Delete zeroes the elements s[len(s)-(j-i):len(s)].
+//
+//go:fix inline
 func Delete[S ~[]E, E any](s S, i, j int) S {
 	return slices.Delete(s, i, j)
 }
@@ -99,6 +114,8 @@ func Delete[S ~[]E, E any](s S, i, j int) S {
 // DeleteFunc removes any elements from s for which del returns true,
 // returning the modified slice.
 // DeleteFunc zeroes the elements between the new length and the original length.
+//
+//go:fix inline
 func DeleteFunc[S ~[]E, E any](s S, del func(E) bool) S {
 	return slices.DeleteFunc(s, del)
 }
@@ -106,12 +123,16 @@ func DeleteFunc[S ~[]E, E any](s S, del func(E) bool) S {
 // Replace replaces the elements s[i:j] by the given v, and returns the
 // modified slice. Replace panics if s[i:j] is not a valid slice of s.
 // When len(v) < (j-i), Replace zeroes the elements between the new length and the original length.
+//
+//go:fix inline
 func Replace[S ~[]E, E any](s S, i, j int, v ...E) S {
 	return slices.Replace(s, i, j, v...)
 }
 
 // Clone returns a copy of the slice.
 // The elements are copied using assignment, so this is a shallow clone.
+//
+//go:fix inline
 func Clone[S ~[]E, E any](s S) S {
 	return slices.Clone(s)
 }
@@ -121,6 +142,8 @@ func Clone[S ~[]E, E any](s S) S {
 // Compact modifies the contents of the slice s and returns the modified slice,
 // which may have a smaller length.
 // Compact zeroes the elements between the new length and the original length.
+//
+//go:fix inline
 func Compact[S ~[]E, E comparable](s S) S {
 	return slices.Compact(s)
 }
@@ -128,6 +151,8 @@ func Compact[S ~[]E, E comparable](s S) S {
 // CompactFunc is like [Compact] but uses an equality function to compare elements.
 // For runs of elements that compare equal, CompactFunc keeps the first one.
 // CompactFunc zeroes the elements between the new length and the original length.
+//
+//go:fix inline
 func CompactFunc[S ~[]E, E any](s S, eq func(E, E) bool) S {
 	return slices.CompactFunc(s, eq)
 }
@@ -136,16 +161,22 @@ func CompactFunc[S ~[]E, E any](s S, eq func(E, E) bool) S {
 // another n elements. After Grow(n), at least n elements can be appended
 // to the slice without another allocation. If n is negative or too large to
 // allocate the memory, Grow panics.
+//
+//go:fix inline
 func Grow[S ~[]E, E any](s S, n int) S {
 	return slices.Grow(s, n)
 }
 
 // Clip removes unused capacity from the slice, returning s[:len(s):len(s)].
+//
+//go:fix inline
 func Clip[S ~[]E, E any](s S) S {
 	return slices.Clip(s)
 }
 
 // Reverse reverses the elements of the slice in place.
+//
+//go:fix inline
 func Reverse[S ~[]E, E any](s S) {
 	slices.Reverse(s)
 }
diff --git a/source/vendor/golang.org/x/exp/slices/sort.go b/source/vendor/golang.org/x/exp/slices/sort.go
index e270a74..bd91a8d 100644
--- a/source/vendor/golang.org/x/exp/slices/sort.go
+++ b/source/vendor/golang.org/x/exp/slices/sort.go
@@ -9,11 +9,10 @@ import (
 	"slices"
 )
 
-// TODO(adonovan): add a "//go:fix inline" annotation to each function
-// in this file; see https://go.dev/issue/32816.
-
 // Sort sorts a slice of any ordered type in ascending order.
 // When sorting floating-point numbers, NaNs are ordered before other values.
+//
+//go:fix inline
 func Sort[S ~[]E, E cmp.Ordered](x S) {
 	slices.Sort(x)
 }
@@ -27,23 +26,31 @@ func Sort[S ~[]E, E cmp.Ordered](x S) {
 // SortFunc requires that cmp is a strict weak ordering.
 // See https://en.wikipedia.org/wiki/Weak_ordering#Strict_weak_orderings.
 // To indicate 'uncomparable', return 0 from the function.
+//
+//go:fix inline
 func SortFunc[S ~[]E, E any](x S, cmp func(a, b E) int) {
 	slices.SortFunc(x, cmp)
 }
 
 // SortStableFunc sorts the slice x while keeping the original order of equal
 // elements, using cmp to compare elements in the same way as [SortFunc].
+//
+//go:fix inline
 func SortStableFunc[S ~[]E, E any](x S, cmp func(a, b E) int) {
 	slices.SortStableFunc(x, cmp)
 }
 
 // IsSorted reports whether x is sorted in ascending order.
+//
+//go:fix inline
 func IsSorted[S ~[]E, E cmp.Ordered](x S) bool {
 	return slices.IsSorted(x)
 }
 
 // IsSortedFunc reports whether x is sorted in ascending order, with cmp as the
 // comparison function as defined by [SortFunc].
+//
+//go:fix inline
 func IsSortedFunc[S ~[]E, E any](x S, cmp func(a, b E) int) bool {
 	return slices.IsSortedFunc(x, cmp)
 }
@@ -51,6 +58,8 @@ func IsSortedFunc[S ~[]E, E any](x S, cmp func(a, b E) int) bool {
 // Min returns the minimal value in x. It panics if x is empty.
 // For floating-point numbers, Min propagates NaNs (any NaN value in x
 // forces the output to be NaN).
+//
+//go:fix inline
 func Min[S ~[]E, E cmp.Ordered](x S) E {
 	return slices.Min(x)
 }
@@ -58,6 +67,8 @@ func Min[S ~[]E, E cmp.Ordered](x S) E {
 // MinFunc returns the minimal value in x, using cmp to compare elements.
 // It panics if x is empty. If there is more than one minimal element
 // according to the cmp function, MinFunc returns the first one.
+//
+//go:fix inline
 func MinFunc[S ~[]E, E any](x S, cmp func(a, b E) int) E {
 	return slices.MinFunc(x, cmp)
 }
@@ -65,6 +76,8 @@ func MinFunc[S ~[]E, E any](x S, cmp func(a, b E) int) E {
 // Max returns the maximal value in x. It panics if x is empty.
 // For floating-point E, Max propagates NaNs (any NaN value in x
 // forces the output to be NaN).
+//
+//go:fix inline
 func Max[S ~[]E, E cmp.Ordered](x S) E {
 	return slices.Max(x)
 }
@@ -72,6 +85,8 @@ func Max[S ~[]E, E cmp.Ordered](x S) E {
 // MaxFunc returns the maximal value in x, using cmp to compare elements.
 // It panics if x is empty. If there is more than one maximal element
 // according to the cmp function, MaxFunc returns the first one.
+//
+//go:fix inline
 func MaxFunc[S ~[]E, E any](x S, cmp func(a, b E) int) E {
 	return slices.MaxFunc(x, cmp)
 }
@@ -80,6 +95,8 @@ func MaxFunc[S ~[]E, E any](x S, cmp func(a, b E) int) E {
 // where target is found, or the position where target would appear in the
 // sort order; it also returns a bool saying whether the target is really found
 // in the slice. The slice must be sorted in increasing order.
+//
+//go:fix inline
 func BinarySearch[S ~[]E, E cmp.Ordered](x S, target E) (int, bool) {
 	return slices.BinarySearch(x, target)
 }
@@ -91,6 +108,8 @@ func BinarySearch[S ~[]E, E cmp.Ordered](x S, target E) (int, bool) {
 // or a positive number if the slice element follows the target.
 // cmp must implement the same ordering as the slice, such that if
 // cmp(a, t) < 0 and cmp(b, t) >= 0, then a must precede b in the slice.
+//
+//go:fix inline
 func BinarySearchFunc[S ~[]E, E, T any](x S, target T, cmp func(E, T) int) (int, bool) {
 	return slices.BinarySearchFunc(x, target, cmp)
 }
diff --git a/source/vendor/golang.org/x/net/html/atom/table.go b/source/vendor/golang.org/x/net/html/atom/table.go
index 2a93886..b460e6f 100644
--- a/source/vendor/golang.org/x/net/html/atom/table.go
+++ b/source/vendor/golang.org/x/net/html/atom/table.go
@@ -11,23 +11,23 @@ const (
 	AcceptCharset             Atom = 0x1a0e
 	Accesskey                 Atom = 0x2c09
 	Acronym                   Atom = 0xaa07
-	Action                    Atom = 0x27206
-	Address                   Atom = 0x6f307
+	Action                    Atom = 0x26506
+	Address                   Atom = 0x6f107
 	Align                     Atom = 0xb105
-	Allowfullscreen           Atom = 0x2080f
+	Allowfullscreen           Atom = 0x3280f
 	Allowpaymentrequest       Atom = 0xc113
 	Allowusermedia            Atom = 0xdd0e
 	Alt                       Atom = 0xf303
 	Annotation                Atom = 0x1c90a
 	AnnotationXml             Atom = 0x1c90e
-	Applet                    Atom = 0x31906
-	Area                      Atom = 0x35604
-	Article                   Atom = 0x3fc07
+	Applet                    Atom = 0x30806
+	Area                      Atom = 0x35004
+	Article                   Atom = 0x3f607
 	As                        Atom = 0x3c02
 	Aside                     Atom = 0x10705
 	Async                     Atom = 0xff05
 	Audio                     Atom = 0x11505
-	Autocomplete              Atom = 0x2780c
+	Autocomplete              Atom = 0x26b0c
 	Autofocus                 Atom = 0x12109
 	Autoplay                  Atom = 0x13c08
 	B                         Atom = 0x101
@@ -43,34 +43,34 @@ const (
 	Br                        Atom = 0x202
 	Button                    Atom = 0x19106
 	Canvas                    Atom = 0x10306
-	Caption                   Atom = 0x23107
-	Center                    Atom = 0x22006
-	Challenge                 Atom = 0x29b09
+	Caption                   Atom = 0x22407
+	Center                    Atom = 0x21306
+	Challenge                 Atom = 0x28e09
 	Charset                   Atom = 0x2107
-	Checked                   Atom = 0x47907
+	Checked                   Atom = 0x5b507
 	Cite                      Atom = 0x19c04
-	Class                     Atom = 0x56405
-	Code                      Atom = 0x5c504
+	Class                     Atom = 0x55805
+	Code                      Atom = 0x5ee04
 	Col                       Atom = 0x1ab03
 	Colgroup                  Atom = 0x1ab08
 	Color                     Atom = 0x1bf05
 	Cols                      Atom = 0x1c404
 	Colspan                   Atom = 0x1c407
 	Command                   Atom = 0x1d707
-	Content                   Atom = 0x58b07
-	Contenteditable           Atom = 0x58b0f
-	Contextmenu               Atom = 0x3800b
+	Content                   Atom = 0x57b07
+	Contenteditable           Atom = 0x57b0f
+	Contextmenu               Atom = 0x37a0b
 	Controls                  Atom = 0x1de08
-	Coords                    Atom = 0x1ea06
-	Crossorigin               Atom = 0x1fb0b
-	Data                      Atom = 0x4a504
-	Datalist                  Atom = 0x4a508
-	Datetime                  Atom = 0x2b808
-	Dd                        Atom = 0x2d702
+	Coords                    Atom = 0x1f006
+	Crossorigin               Atom = 0x1fa0b
+	Data                      Atom = 0x49904
+	Datalist                  Atom = 0x49908
+	Datetime                  Atom = 0x2ab08
+	Dd                        Atom = 0x2bf02
 	Default                   Atom = 0x10a07
-	Defer                     Atom = 0x5c705
-	Del                       Atom = 0x45203
-	Desc                      Atom = 0x56104
+	Defer                     Atom = 0x5f005
+	Del                       Atom = 0x44c03
+	Desc                      Atom = 0x55504
 	Details                   Atom = 0x7207
 	Dfn                       Atom = 0x8703
 	Dialog                    Atom = 0xbb06
@@ -78,106 +78,106 @@ const (
 	Dirname                   Atom = 0x9307
 	Disabled                  Atom = 0x16408
 	Div                       Atom = 0x16b03
-	Dl                        Atom = 0x5e602
-	Download                  Atom = 0x46308
+	Dl                        Atom = 0x5d602
+	Download                  Atom = 0x45d08
 	Draggable                 Atom = 0x17a09
-	Dropzone                  Atom = 0x40508
-	Dt                        Atom = 0x64b02
+	Dropzone                  Atom = 0x3ff08
+	Dt                        Atom = 0x64002
 	Em                        Atom = 0x6e02
 	Embed                     Atom = 0x6e05
-	Enctype                   Atom = 0x28d07
-	Face                      Atom = 0x21e04
-	Fieldset                  Atom = 0x22608
-	Figcaption                Atom = 0x22e0a
-	Figure                    Atom = 0x24806
+	Enctype                   Atom = 0x28007
+	Face                      Atom = 0x21104
+	Fieldset                  Atom = 0x21908
+	Figcaption                Atom = 0x2210a
+	Figure                    Atom = 0x23b06
 	Font                      Atom = 0x3f04
 	Footer                    Atom = 0xf606
-	For                       Atom = 0x25403
-	ForeignObject             Atom = 0x2540d
-	Foreignobject             Atom = 0x2610d
-	Form                      Atom = 0x26e04
-	Formaction                Atom = 0x26e0a
-	Formenctype               Atom = 0x2890b
-	Formmethod                Atom = 0x2a40a
-	Formnovalidate            Atom = 0x2ae0e
-	Formtarget                Atom = 0x2c00a
+	For                       Atom = 0x24703
+	ForeignObject             Atom = 0x2470d
+	Foreignobject             Atom = 0x2540d
+	Form                      Atom = 0x26104
+	Formaction                Atom = 0x2610a
+	Formenctype               Atom = 0x27c0b
+	Formmethod                Atom = 0x2970a
+	Formnovalidate            Atom = 0x2a10e
+	Formtarget                Atom = 0x2b30a
 	Frame                     Atom = 0x8b05
 	Frameset                  Atom = 0x8b08
 	H1                        Atom = 0x15c02
-	H2                        Atom = 0x2de02
-	H3                        Atom = 0x30d02
-	H4                        Atom = 0x34502
-	H5                        Atom = 0x34f02
-	H6                        Atom = 0x64d02
-	Head                      Atom = 0x33104
-	Header                    Atom = 0x33106
-	Headers                   Atom = 0x33107
+	H2                        Atom = 0x56102
+	H3                        Atom = 0x2cd02
+	H4                        Atom = 0x2fc02
+	H5                        Atom = 0x33f02
+	H6                        Atom = 0x34902
+	Head                      Atom = 0x32004
+	Header                    Atom = 0x32006
+	Headers                   Atom = 0x32007
 	Height                    Atom = 0x5206
-	Hgroup                    Atom = 0x2ca06
-	Hidden                    Atom = 0x2d506
-	High                      Atom = 0x2db04
+	Hgroup                    Atom = 0x64206
+	Hidden                    Atom = 0x2bd06
+	High                      Atom = 0x2ca04
 	Hr                        Atom = 0x15702
-	Href                      Atom = 0x2e004
-	Hreflang                  Atom = 0x2e008
+	Href                      Atom = 0x2cf04
+	Hreflang                  Atom = 0x2cf08
 	Html                      Atom = 0x5604
-	HttpEquiv                 Atom = 0x2e80a
+	HttpEquiv                 Atom = 0x2d70a
 	I                         Atom = 0x601
-	Icon                      Atom = 0x58a04
+	Icon                      Atom = 0x57a04
 	Id                        Atom = 0x10902
-	Iframe                    Atom = 0x2fc06
-	Image                     Atom = 0x30205
-	Img                       Atom = 0x30703
-	Input                     Atom = 0x44b05
-	Inputmode                 Atom = 0x44b09
-	Ins                       Atom = 0x20403
-	Integrity                 Atom = 0x23f09
+	Iframe                    Atom = 0x2eb06
+	Image                     Atom = 0x2f105
+	Img                       Atom = 0x2f603
+	Input                     Atom = 0x44505
+	Inputmode                 Atom = 0x44509
+	Ins                       Atom = 0x20303
+	Integrity                 Atom = 0x23209
 	Is                        Atom = 0x16502
-	Isindex                   Atom = 0x30f07
-	Ismap                     Atom = 0x31605
-	Itemid                    Atom = 0x38b06
+	Isindex                   Atom = 0x2fe07
+	Ismap                     Atom = 0x30505
+	Itemid                    Atom = 0x38506
 	Itemprop                  Atom = 0x19d08
-	Itemref                   Atom = 0x3cd07
-	Itemscope                 Atom = 0x67109
-	Itemtype                  Atom = 0x31f08
+	Itemref                   Atom = 0x3c707
+	Itemscope                 Atom = 0x66f09
+	Itemtype                  Atom = 0x30e08
 	Kbd                       Atom = 0xb903
 	Keygen                    Atom = 0x3206
 	Keytype                   Atom = 0xd607
 	Kind                      Atom = 0x17704
 	Label                     Atom = 0x5905
-	Lang                      Atom = 0x2e404
+	Lang                      Atom = 0x2d304
 	Legend                    Atom = 0x18106
 	Li                        Atom = 0xb202
 	Link                      Atom = 0x17404
-	List                      Atom = 0x4a904
-	Listing                   Atom = 0x4a907
+	List                      Atom = 0x49d04
+	Listing                   Atom = 0x49d07
 	Loop                      Atom = 0x5d04
 	Low                       Atom = 0xc303
 	Main                      Atom = 0x1004
 	Malignmark                Atom = 0xb00a
-	Manifest                  Atom = 0x6d708
-	Map                       Atom = 0x31803
+	Manifest                  Atom = 0x6d508
+	Map                       Atom = 0x30703
 	Mark                      Atom = 0xb604
-	Marquee                   Atom = 0x32707
-	Math                      Atom = 0x32e04
-	Max                       Atom = 0x33d03
-	Maxlength                 Atom = 0x33d09
+	Marquee                   Atom = 0x31607
+	Math                      Atom = 0x31d04
+	Max                       Atom = 0x33703
+	Maxlength                 Atom = 0x33709
 	Media                     Atom = 0xe605
 	Mediagroup                Atom = 0xe60a
-	Menu                      Atom = 0x38704
-	Menuitem                  Atom = 0x38708
-	Meta                      Atom = 0x4b804
+	Menu                      Atom = 0x38104
+	Menuitem                  Atom = 0x38108
+	Meta                      Atom = 0x4ac04
 	Meter                     Atom = 0x9805
-	Method                    Atom = 0x2a806
-	Mglyph                    Atom = 0x30806
-	Mi                        Atom = 0x34702
-	Min                       Atom = 0x34703
-	Minlength                 Atom = 0x34709
-	Mn                        Atom = 0x2b102
+	Method                    Atom = 0x29b06
+	Mglyph                    Atom = 0x2f706
+	Mi                        Atom = 0x34102
+	Min                       Atom = 0x34103
+	Minlength                 Atom = 0x34109
+	Mn                        Atom = 0x2a402
 	Mo                        Atom = 0xa402
-	Ms                        Atom = 0x67402
-	Mtext                     Atom = 0x35105
-	Multiple                  Atom = 0x35f08
-	Muted                     Atom = 0x36705
+	Ms                        Atom = 0x67202
+	Mtext                     Atom = 0x34b05
+	Multiple                  Atom = 0x35908
+	Muted                     Atom = 0x36105
 	Name                      Atom = 0x9604
 	Nav                       Atom = 0x1303
 	Nobr                      Atom = 0x3704
@@ -185,101 +185,101 @@ const (
 	Noframes                  Atom = 0x8908
 	Nomodule                  Atom = 0xa208
 	Nonce                     Atom = 0x1a605
-	Noscript                  Atom = 0x21608
-	Novalidate                Atom = 0x2b20a
-	Object                    Atom = 0x26806
+	Noscript                  Atom = 0x2c208
+	Novalidate                Atom = 0x2a50a
+	Object                    Atom = 0x25b06
 	Ol                        Atom = 0x13702
 	Onabort                   Atom = 0x19507
-	Onafterprint              Atom = 0x2360c
-	Onautocomplete            Atom = 0x2760e
-	Onautocompleteerror       Atom = 0x27613
-	Onauxclick                Atom = 0x61f0a
-	Onbeforeprint             Atom = 0x69e0d
-	Onbeforeunload            Atom = 0x6e70e
-	Onblur                    Atom = 0x56d06
+	Onafterprint              Atom = 0x2290c
+	Onautocomplete            Atom = 0x2690e
+	Onautocompleteerror       Atom = 0x26913
+	Onauxclick                Atom = 0x6140a
+	Onbeforeprint             Atom = 0x69c0d
+	Onbeforeunload            Atom = 0x6e50e
+	Onblur                    Atom = 0x1ea06
 	Oncancel                  Atom = 0x11908
 	Oncanplay                 Atom = 0x14d09
 	Oncanplaythrough          Atom = 0x14d10
-	Onchange                  Atom = 0x41b08
-	Onclick                   Atom = 0x2f507
-	Onclose                   Atom = 0x36c07
-	Oncontextmenu             Atom = 0x37e0d
-	Oncopy                    Atom = 0x39106
-	Oncuechange               Atom = 0x3970b
-	Oncut                     Atom = 0x3a205
-	Ondblclick                Atom = 0x3a70a
-	Ondrag                    Atom = 0x3b106
-	Ondragend                 Atom = 0x3b109
-	Ondragenter               Atom = 0x3ba0b
-	Ondragexit                Atom = 0x3c50a
-	Ondragleave               Atom = 0x3df0b
-	Ondragover                Atom = 0x3ea0a
-	Ondragstart               Atom = 0x3f40b
-	Ondrop                    Atom = 0x40306
-	Ondurationchange          Atom = 0x41310
-	Onemptied                 Atom = 0x40a09
-	Onended                   Atom = 0x42307
-	Onerror                   Atom = 0x42a07
-	Onfocus                   Atom = 0x43107
-	Onhashchange              Atom = 0x43d0c
-	Oninput                   Atom = 0x44907
-	Oninvalid                 Atom = 0x45509
-	Onkeydown                 Atom = 0x45e09
-	Onkeypress                Atom = 0x46b0a
-	Onkeyup                   Atom = 0x48007
-	Onlanguagechange          Atom = 0x48d10
-	Onload                    Atom = 0x49d06
-	Onloadeddata              Atom = 0x49d0c
-	Onloadedmetadata          Atom = 0x4b010
-	Onloadend                 Atom = 0x4c609
-	Onloadstart               Atom = 0x4cf0b
-	Onmessage                 Atom = 0x4da09
-	Onmessageerror            Atom = 0x4da0e
-	Onmousedown               Atom = 0x4e80b
-	Onmouseenter              Atom = 0x4f30c
-	Onmouseleave              Atom = 0x4ff0c
-	Onmousemove               Atom = 0x50b0b
-	Onmouseout                Atom = 0x5160a
-	Onmouseover               Atom = 0x5230b
-	Onmouseup                 Atom = 0x52e09
-	Onmousewheel              Atom = 0x53c0c
-	Onoffline                 Atom = 0x54809
-	Ononline                  Atom = 0x55108
-	Onpagehide                Atom = 0x5590a
-	Onpageshow                Atom = 0x5730a
-	Onpaste                   Atom = 0x57f07
-	Onpause                   Atom = 0x59a07
-	Onplay                    Atom = 0x5a406
-	Onplaying                 Atom = 0x5a409
-	Onpopstate                Atom = 0x5ad0a
-	Onprogress                Atom = 0x5b70a
-	Onratechange              Atom = 0x5cc0c
-	Onrejectionhandled        Atom = 0x5d812
-	Onreset                   Atom = 0x5ea07
-	Onresize                  Atom = 0x5f108
-	Onscroll                  Atom = 0x60008
-	Onsecuritypolicyviolation Atom = 0x60819
-	Onseeked                  Atom = 0x62908
-	Onseeking                 Atom = 0x63109
-	Onselect                  Atom = 0x63a08
-	Onshow                    Atom = 0x64406
-	Onsort                    Atom = 0x64f06
-	Onstalled                 Atom = 0x65909
-	Onstorage                 Atom = 0x66209
-	Onsubmit                  Atom = 0x66b08
-	Onsuspend                 Atom = 0x67b09
+	Onchange                  Atom = 0x41508
+	Onclick                   Atom = 0x2e407
+	Onclose                   Atom = 0x36607
+	Oncontextmenu             Atom = 0x3780d
+	Oncopy                    Atom = 0x38b06
+	Oncuechange               Atom = 0x3910b
+	Oncut                     Atom = 0x39c05
+	Ondblclick                Atom = 0x3a10a
+	Ondrag                    Atom = 0x3ab06
+	Ondragend                 Atom = 0x3ab09
+	Ondragenter               Atom = 0x3b40b
+	Ondragexit                Atom = 0x3bf0a
+	Ondragleave               Atom = 0x3d90b
+	Ondragover                Atom = 0x3e40a
+	Ondragstart               Atom = 0x3ee0b
+	Ondrop                    Atom = 0x3fd06
+	Ondurationchange          Atom = 0x40d10
+	Onemptied                 Atom = 0x40409
+	Onended                   Atom = 0x41d07
+	Onerror                   Atom = 0x42407
+	Onfocus                   Atom = 0x42b07
+	Onhashchange              Atom = 0x4370c
+	Oninput                   Atom = 0x44307
+	Oninvalid                 Atom = 0x44f09
+	Onkeydown                 Atom = 0x45809
+	Onkeypress                Atom = 0x4650a
+	Onkeyup                   Atom = 0x47407
+	Onlanguagechange          Atom = 0x48110
+	Onload                    Atom = 0x49106
+	Onloadeddata              Atom = 0x4910c
+	Onloadedmetadata          Atom = 0x4a410
+	Onloadend                 Atom = 0x4ba09
+	Onloadstart               Atom = 0x4c30b
+	Onmessage                 Atom = 0x4ce09
+	Onmessageerror            Atom = 0x4ce0e
+	Onmousedown               Atom = 0x4dc0b
+	Onmouseenter              Atom = 0x4e70c
+	Onmouseleave              Atom = 0x4f30c
+	Onmousemove               Atom = 0x4ff0b
+	Onmouseout                Atom = 0x50a0a
+	Onmouseover               Atom = 0x5170b
+	Onmouseup                 Atom = 0x52209
+	Onmousewheel              Atom = 0x5300c
+	Onoffline                 Atom = 0x53c09
+	Ononline                  Atom = 0x54508
+	Onpagehide                Atom = 0x54d0a
+	Onpageshow                Atom = 0x5630a
+	Onpaste                   Atom = 0x56f07
+	Onpause                   Atom = 0x58a07
+	Onplay                    Atom = 0x59406
+	Onplaying                 Atom = 0x59409
+	Onpopstate                Atom = 0x59d0a
+	Onprogress                Atom = 0x5a70a
+	Onratechange              Atom = 0x5bc0c
+	Onrejectionhandled        Atom = 0x5c812
+	Onreset                   Atom = 0x5da07
+	Onresize                  Atom = 0x5e108
+	Onscroll                  Atom = 0x5f508
+	Onsecuritypolicyviolation Atom = 0x5fd19
+	Onseeked                  Atom = 0x61e08
+	Onseeking                 Atom = 0x62609
+	Onselect                  Atom = 0x62f08
+	Onshow                    Atom = 0x63906
+	Onsort                    Atom = 0x64d06
+	Onstalled                 Atom = 0x65709
+	Onstorage                 Atom = 0x66009
+	Onsubmit                  Atom = 0x66908
+	Onsuspend                 Atom = 0x67909
 	Ontimeupdate              Atom = 0x400c
-	Ontoggle                  Atom = 0x68408
-	Onunhandledrejection      Atom = 0x68c14
-	Onunload                  Atom = 0x6ab08
-	Onvolumechange            Atom = 0x6b30e
-	Onwaiting                 Atom = 0x6c109
-	Onwheel                   Atom = 0x6ca07
+	Ontoggle                  Atom = 0x68208
+	Onunhandledrejection      Atom = 0x68a14
+	Onunload                  Atom = 0x6a908
+	Onvolumechange            Atom = 0x6b10e
+	Onwaiting                 Atom = 0x6bf09
+	Onwheel                   Atom = 0x6c807
 	Open                      Atom = 0x1a304
 	Optgroup                  Atom = 0x5f08
-	Optimum                   Atom = 0x6d107
-	Option                    Atom = 0x6e306
-	Output                    Atom = 0x51d06
+	Optimum                   Atom = 0x6cf07
+	Option                    Atom = 0x6e106
+	Output                    Atom = 0x51106
 	P                         Atom = 0xc01
 	Param                     Atom = 0xc05
 	Pattern                   Atom = 0x6607
@@ -288,466 +288,468 @@ const (
 	Placeholder               Atom = 0x1310b
 	Plaintext                 Atom = 0x1b209
 	Playsinline               Atom = 0x1400b
-	Poster                    Atom = 0x2cf06
-	Pre                       Atom = 0x47003
-	Preload                   Atom = 0x48607
-	Progress                  Atom = 0x5b908
-	Prompt                    Atom = 0x53606
-	Public                    Atom = 0x58606
+	Poster                    Atom = 0x64706
+	Pre                       Atom = 0x46a03
+	Preload                   Atom = 0x47a07
+	Progress                  Atom = 0x5a908
+	Prompt                    Atom = 0x52a06
+	Public                    Atom = 0x57606
 	Q                         Atom = 0xcf01
 	Radiogroup                Atom = 0x30a
 	Rb                        Atom = 0x3a02
-	Readonly                  Atom = 0x35708
-	Referrerpolicy            Atom = 0x3d10e
-	Rel                       Atom = 0x48703
-	Required                  Atom = 0x24c08
+	Readonly                  Atom = 0x35108
+	Referrerpolicy            Atom = 0x3cb0e
+	Rel                       Atom = 0x47b03
+	Required                  Atom = 0x23f08
 	Reversed                  Atom = 0x8008
 	Rows                      Atom = 0x9c04
 	Rowspan                   Atom = 0x9c07
-	Rp                        Atom = 0x23c02
+	Rp                        Atom = 0x22f02
 	Rt                        Atom = 0x19a02
 	Rtc                       Atom = 0x19a03
 	Ruby                      Atom = 0xfb04
 	S                         Atom = 0x2501
 	Samp                      Atom = 0x7804
 	Sandbox                   Atom = 0x12907
-	Scope                     Atom = 0x67505
-	Scoped                    Atom = 0x67506
-	Script                    Atom = 0x21806
-	Seamless                  Atom = 0x37108
-	Section                   Atom = 0x56807
-	Select                    Atom = 0x63c06
-	Selected                  Atom = 0x63c08
-	Shape                     Atom = 0x1e505
-	Size                      Atom = 0x5f504
-	Sizes                     Atom = 0x5f505
-	Slot                      Atom = 0x1ef04
-	Small                     Atom = 0x20605
-	Sortable                  Atom = 0x65108
-	Sorted                    Atom = 0x33706
-	Source                    Atom = 0x37806
-	Spacer                    Atom = 0x43706
+	Scope                     Atom = 0x67305
+	Scoped                    Atom = 0x67306
+	Script                    Atom = 0x2c406
+	Seamless                  Atom = 0x36b08
+	Search                    Atom = 0x55c06
+	Section                   Atom = 0x1e507
+	Select                    Atom = 0x63106
+	Selected                  Atom = 0x63108
+	Shape                     Atom = 0x1f505
+	Size                      Atom = 0x5e504
+	Sizes                     Atom = 0x5e505
+	Slot                      Atom = 0x20504
+	Small                     Atom = 0x32605
+	Sortable                  Atom = 0x64f08
+	Sorted                    Atom = 0x37206
+	Source                    Atom = 0x43106
+	Spacer                    Atom = 0x46e06
 	Span                      Atom = 0x9f04
-	Spellcheck                Atom = 0x4740a
-	Src                       Atom = 0x5c003
-	Srcdoc                    Atom = 0x5c006
-	Srclang                   Atom = 0x5f907
-	Srcset                    Atom = 0x6f906
-	Start                     Atom = 0x3fa05
-	Step                      Atom = 0x58304
+	Spellcheck                Atom = 0x5b00a
+	Src                       Atom = 0x5e903
+	Srcdoc                    Atom = 0x5e906
+	Srclang                   Atom = 0x6f707
+	Srcset                    Atom = 0x6fe06
+	Start                     Atom = 0x3f405
+	Step                      Atom = 0x57304
 	Strike                    Atom = 0xd206
-	Strong                    Atom = 0x6dd06
-	Style                     Atom = 0x6ff05
-	Sub                       Atom = 0x66d03
-	Summary                   Atom = 0x70407
-	Sup                       Atom = 0x70b03
-	Svg                       Atom = 0x70e03
-	System                    Atom = 0x71106
-	Tabindex                  Atom = 0x4be08
-	Table                     Atom = 0x59505
-	Target                    Atom = 0x2c406
+	Strong                    Atom = 0x6db06
+	Style                     Atom = 0x70405
+	Sub                       Atom = 0x66b03
+	Summary                   Atom = 0x70907
+	Sup                       Atom = 0x71003
+	Svg                       Atom = 0x71303
+	System                    Atom = 0x71606
+	Tabindex                  Atom = 0x4b208
+	Table                     Atom = 0x58505
+	Target                    Atom = 0x2b706
 	Tbody                     Atom = 0x2705
 	Td                        Atom = 0x9202
-	Template                  Atom = 0x71408
-	Textarea                  Atom = 0x35208
+	Template                  Atom = 0x71908
+	Textarea                  Atom = 0x34c08
 	Tfoot                     Atom = 0xf505
 	Th                        Atom = 0x15602
-	Thead                     Atom = 0x33005
+	Thead                     Atom = 0x31f05
 	Time                      Atom = 0x4204
 	Title                     Atom = 0x11005
 	Tr                        Atom = 0xcc02
 	Track                     Atom = 0x1ba05
-	Translate                 Atom = 0x1f209
+	Translate                 Atom = 0x20809
 	Tt                        Atom = 0x6802
 	Type                      Atom = 0xd904
-	Typemustmatch             Atom = 0x2900d
+	Typemustmatch             Atom = 0x2830d
 	U                         Atom = 0xb01
 	Ul                        Atom = 0xa702
 	Updateviacache            Atom = 0x460e
-	Usemap                    Atom = 0x59e06
+	Usemap                    Atom = 0x58e06
 	Value                     Atom = 0x1505
 	Var                       Atom = 0x16d03
-	Video                     Atom = 0x2f105
-	Wbr                       Atom = 0x57c03
-	Width                     Atom = 0x64905
-	Workertype                Atom = 0x71c0a
-	Wrap                      Atom = 0x72604
+	Video                     Atom = 0x2e005
+	Wbr                       Atom = 0x56c03
+	Width                     Atom = 0x63e05
+	Workertype                Atom = 0x7210a
+	Wrap                      Atom = 0x72b04
 	Xmp                       Atom = 0x12f03
 )
 
-const hash0 = 0x81cdf10e
+const hash0 = 0x84f70e16
 
 const maxAtomLen = 25
 
 var table = [1 << 9]Atom{
-	0x1:   0xe60a,  // mediagroup
-	0x2:   0x2e404, // lang
-	0x4:   0x2c09,  // accesskey
-	0x5:   0x8b08,  // frameset
-	0x7:   0x63a08, // onselect
-	0x8:   0x71106, // system
-	0xa:   0x64905, // width
-	0xc:   0x2890b, // formenctype
-	0xd:   0x13702, // ol
-	0xe:   0x3970b, // oncuechange
-	0x10:  0x14b03, // bdo
-	0x11:  0x11505, // audio
-	0x12:  0x17a09, // draggable
-	0x14:  0x2f105, // video
-	0x15:  0x2b102, // mn
-	0x16:  0x38704, // menu
-	0x17:  0x2cf06, // poster
-	0x19:  0xf606,  // footer
-	0x1a:  0x2a806, // method
-	0x1b:  0x2b808, // datetime
-	0x1c:  0x19507, // onabort
-	0x1d:  0x460e,  // updateviacache
-	0x1e:  0xff05,  // async
-	0x1f:  0x49d06, // onload
-	0x21:  0x11908, // oncancel
-	0x22:  0x62908, // onseeked
-	0x23:  0x30205, // image
-	0x24:  0x5d812, // onrejectionhandled
-	0x26:  0x17404, // link
-	0x27:  0x51d06, // output
-	0x28:  0x33104, // head
-	0x29:  0x4ff0c, // onmouseleave
-	0x2a:  0x57f07, // onpaste
-	0x2b:  0x5a409, // onplaying
-	0x2c:  0x1c407, // colspan
-	0x2f:  0x1bf05, // color
-	0x30:  0x5f504, // size
-	0x31:  0x2e80a, // http-equiv
-	0x33:  0x601,   // i
-	0x34:  0x5590a, // onpagehide
-	0x35:  0x68c14, // onunhandledrejection
-	0x37:  0x42a07, // onerror
-	0x3a:  0x3b08,  // basefont
-	0x3f:  0x1303,  // nav
-	0x40:  0x17704, // kind
-	0x41:  0x35708, // readonly
-	0x42:  0x30806, // mglyph
-	0x44:  0xb202,  // li
-	0x46:  0x2d506, // hidden
-	0x47:  0x70e03, // svg
-	0x48:  0x58304, // step
-	0x49:  0x23f09, // integrity
-	0x4a:  0x58606, // public
-	0x4c:  0x1ab03, // col
-	0x4d:  0x1870a, // blockquote
-	0x4e:  0x34f02, // h5
-	0x50:  0x5b908, // progress
-	0x51:  0x5f505, // sizes
-	0x52:  0x34502, // h4
-	0x56:  0x33005, // thead
-	0x57:  0xd607,  // keytype
-	0x58:  0x5b70a, // onprogress
-	0x59:  0x44b09, // inputmode
-	0x5a:  0x3b109, // ondragend
-	0x5d:  0x3a205, // oncut
-	0x5e:  0x43706, // spacer
-	0x5f:  0x1ab08, // colgroup
-	0x62:  0x16502, // is
-	0x65:  0x3c02,  // as
-	0x66:  0x54809, // onoffline
-	0x67:  0x33706, // sorted
-	0x69:  0x48d10, // onlanguagechange
-	0x6c:  0x43d0c, // onhashchange
-	0x6d:  0x9604,  // name
-	0x6e:  0xf505,  // tfoot
-	0x6f:  0x56104, // desc
-	0x70:  0x33d03, // max
-	0x72:  0x1ea06, // coords
-	0x73:  0x30d02, // h3
-	0x74:  0x6e70e, // onbeforeunload
-	0x75:  0x9c04,  // rows
-	0x76:  0x63c06, // select
-	0x77:  0x9805,  // meter
-	0x78:  0x38b06, // itemid
-	0x79:  0x53c0c, // onmousewheel
-	0x7a:  0x5c006, // srcdoc
-	0x7d:  0x1ba05, // track
-	0x7f:  0x31f08, // itemtype
-	0x82:  0xa402,  // mo
-	0x83:  0x41b08, // onchange
-	0x84:  0x33107, // headers
-	0x85:  0x5cc0c, // onratechange
-	0x86:  0x60819, // onsecuritypolicyviolation
-	0x88:  0x4a508, // datalist
-	0x89:  0x4e80b, // onmousedown
-	0x8a:  0x1ef04, // slot
-	0x8b:  0x4b010, // onloadedmetadata
-	0x8c:  0x1a06,  // accept
-	0x8d:  0x26806, // object
-	0x91:  0x6b30e, // onvolumechange
-	0x92:  0x2107,  // charset
-	0x93:  0x27613, // onautocompleteerror
-	0x94:  0xc113,  // allowpaymentrequest
-	0x95:  0x2804,  // body
-	0x96:  0x10a07, // default
-	0x97:  0x63c08, // selected
-	0x98:  0x21e04, // face
-	0x99:  0x1e505, // shape
-	0x9b:  0x68408, // ontoggle
-	0x9e:  0x64b02, // dt
-	0x9f:  0xb604,  // mark
-	0xa1:  0xb01,   // u
-	0xa4:  0x6ab08, // onunload
-	0xa5:  0x5d04,  // loop
-	0xa6:  0x16408, // disabled
-	0xaa:  0x42307, // onended
-	0xab:  0xb00a,  // malignmark
-	0xad:  0x67b09, // onsuspend
-	0xae:  0x35105, // mtext
-	0xaf:  0x64f06, // onsort
-	0xb0:  0x19d08, // itemprop
-	0xb3:  0x67109, // itemscope
-	0xb4:  0x17305, // blink
-	0xb6:  0x3b106, // ondrag
-	0xb7:  0xa702,  // ul
-	0xb8:  0x26e04, // form
-	0xb9:  0x12907, // sandbox
-	0xba:  0x8b05,  // frame
-	0xbb:  0x1505,  // value
-	0xbc:  0x66209, // onstorage
-	0xbf:  0xaa07,  // acronym
-	0xc0:  0x19a02, // rt
-	0xc2:  0x202,   // br
-	0xc3:  0x22608, // fieldset
-	0xc4:  0x2900d, // typemustmatch
-	0xc5:  0xa208,  // nomodule
-	0xc6:  0x6c07,  // noembed
-	0xc7:  0x69e0d, // onbeforeprint
-	0xc8:  0x19106, // button
-	0xc9:  0x2f507, // onclick
-	0xca:  0x70407, // summary
-	0xcd:  0xfb04,  // ruby
-	0xce:  0x56405, // class
-	0xcf:  0x3f40b, // ondragstart
-	0xd0:  0x23107, // caption
-	0xd4:  0xdd0e,  // allowusermedia
-	0xd5:  0x4cf0b, // onloadstart
-	0xd9:  0x16b03, // div
-	0xda:  0x4a904, // list
-	0xdb:  0x32e04, // math
-	0xdc:  0x44b05, // input
-	0xdf:  0x3ea0a, // ondragover
-	0xe0:  0x2de02, // h2
-	0xe2:  0x1b209, // plaintext
-	0xe4:  0x4f30c, // onmouseenter
-	0xe7:  0x47907, // checked
-	0xe8:  0x47003, // pre
-	0xea:  0x35f08, // multiple
-	0xeb:  0xba03,  // bdi
-	0xec:  0x33d09, // maxlength
-	0xed:  0xcf01,  // q
-	0xee:  0x61f0a, // onauxclick
-	0xf0:  0x57c03, // wbr
-	0xf2:  0x3b04,  // base
-	0xf3:  0x6e306, // option
-	0xf5:  0x41310, // ondurationchange
-	0xf7:  0x8908,  // noframes
-	0xf9:  0x40508, // dropzone
-	0xfb:  0x67505, // scope
-	0xfc:  0x8008,  // reversed
-	0xfd:  0x3ba0b, // ondragenter
-	0xfe:  0x3fa05, // start
-	0xff:  0x12f03, // xmp
-	0x100: 0x5f907, // srclang
-	0x101: 0x30703, // img
-	0x104: 0x101,   // b
-	0x105: 0x25403, // for
-	0x106: 0x10705, // aside
-	0x107: 0x44907, // oninput
-	0x108: 0x35604, // area
-	0x109: 0x2a40a, // formmethod
-	0x10a: 0x72604, // wrap
-	0x10c: 0x23c02, // rp
-	0x10d: 0x46b0a, // onkeypress
-	0x10e: 0x6802,  // tt
-	0x110: 0x34702, // mi
-	0x111: 0x36705, // muted
-	0x112: 0xf303,  // alt
-	0x113: 0x5c504, // code
-	0x114: 0x6e02,  // em
-	0x115: 0x3c50a, // ondragexit
-	0x117: 0x9f04,  // span
-	0x119: 0x6d708, // manifest
-	0x11a: 0x38708, // menuitem
-	0x11b: 0x58b07, // content
-	0x11d: 0x6c109, // onwaiting
-	0x11f: 0x4c609, // onloadend
-	0x121: 0x37e0d, // oncontextmenu
-	0x123: 0x56d06, // onblur
-	0x124: 0x3fc07, // article
-	0x125: 0x9303,  // dir
-	0x126: 0xef04,  // ping
-	0x127: 0x24c08, // required
-	0x128: 0x45509, // oninvalid
-	0x129: 0xb105,  // align
-	0x12b: 0x58a04, // icon
-	0x12c: 0x64d02, // h6
-	0x12d: 0x1c404, // cols
-	0x12e: 0x22e0a, // figcaption
-	0x12f: 0x45e09, // onkeydown
-	0x130: 0x66b08, // onsubmit
-	0x131: 0x14d09, // oncanplay
-	0x132: 0x70b03, // sup
-	0x133: 0xc01,   // p
-	0x135: 0x40a09, // onemptied
-	0x136: 0x39106, // oncopy
-	0x137: 0x19c04, // cite
-	0x138: 0x3a70a, // ondblclick
-	0x13a: 0x50b0b, // onmousemove
-	0x13c: 0x66d03, // sub
-	0x13d: 0x48703, // rel
-	0x13e: 0x5f08,  // optgroup
-	0x142: 0x9c07,  // rowspan
-	0x143: 0x37806, // source
-	0x144: 0x21608, // noscript
-	0x145: 0x1a304, // open
-	0x146: 0x20403, // ins
-	0x147: 0x2540d, // foreignObject
-	0x148: 0x5ad0a, // onpopstate
-	0x14a: 0x28d07, // enctype
-	0x14b: 0x2760e, // onautocomplete
-	0x14c: 0x35208, // textarea
-	0x14e: 0x2780c, // autocomplete
-	0x14f: 0x15702, // hr
-	0x150: 0x1de08, // controls
-	0x151: 0x10902, // id
-	0x153: 0x2360c, // onafterprint
-	0x155: 0x2610d, // foreignobject
-	0x156: 0x32707, // marquee
-	0x157: 0x59a07, // onpause
-	0x158: 0x5e602, // dl
-	0x159: 0x5206,  // height
-	0x15a: 0x34703, // min
-	0x15b: 0x9307,  // dirname
-	0x15c: 0x1f209, // translate
-	0x15d: 0x5604,  // html
-	0x15e: 0x34709, // minlength
-	0x15f: 0x48607, // preload
-	0x160: 0x71408, // template
-	0x161: 0x3df0b, // ondragleave
-	0x162: 0x3a02,  // rb
-	0x164: 0x5c003, // src
-	0x165: 0x6dd06, // strong
-	0x167: 0x7804,  // samp
-	0x168: 0x6f307, // address
-	0x169: 0x55108, // ononline
-	0x16b: 0x1310b, // placeholder
-	0x16c: 0x2c406, // target
-	0x16d: 0x20605, // small
-	0x16e: 0x6ca07, // onwheel
-	0x16f: 0x1c90a, // annotation
-	0x170: 0x4740a, // spellcheck
-	0x171: 0x7207,  // details
-	0x172: 0x10306, // canvas
-	0x173: 0x12109, // autofocus
-	0x174: 0xc05,   // param
-	0x176: 0x46308, // download
-	0x177: 0x45203, // del
-	0x178: 0x36c07, // onclose
-	0x179: 0xb903,  // kbd
-	0x17a: 0x31906, // applet
-	0x17b: 0x2e004, // href
-	0x17c: 0x5f108, // onresize
-	0x17e: 0x49d0c, // onloadeddata
-	0x180: 0xcc02,  // tr
-	0x181: 0x2c00a, // formtarget
-	0x182: 0x11005, // title
-	0x183: 0x6ff05, // style
-	0x184: 0xd206,  // strike
-	0x185: 0x59e06, // usemap
-	0x186: 0x2fc06, // iframe
-	0x187: 0x1004,  // main
-	0x189: 0x7b07,  // picture
-	0x18c: 0x31605, // ismap
-	0x18e: 0x4a504, // data
-	0x18f: 0x5905,  // label
-	0x191: 0x3d10e, // referrerpolicy
-	0x192: 0x15602, // th
-	0x194: 0x53606, // prompt
-	0x195: 0x56807, // section
-	0x197: 0x6d107, // optimum
-	0x198: 0x2db04, // high
-	0x199: 0x15c02, // h1
-	0x19a: 0x65909, // onstalled
-	0x19b: 0x16d03, // var
-	0x19c: 0x4204,  // time
-	0x19e: 0x67402, // ms
-	0x19f: 0x33106, // header
-	0x1a0: 0x4da09, // onmessage
-	0x1a1: 0x1a605, // nonce
-	0x1a2: 0x26e0a, // formaction
-	0x1a3: 0x22006, // center
-	0x1a4: 0x3704,  // nobr
-	0x1a5: 0x59505, // table
-	0x1a6: 0x4a907, // listing
-	0x1a7: 0x18106, // legend
-	0x1a9: 0x29b09, // challenge
-	0x1aa: 0x24806, // figure
-	0x1ab: 0xe605,  // media
-	0x1ae: 0xd904,  // type
-	0x1af: 0x3f04,  // font
-	0x1b0: 0x4da0e, // onmessageerror
-	0x1b1: 0x37108, // seamless
-	0x1b2: 0x8703,  // dfn
-	0x1b3: 0x5c705, // defer
-	0x1b4: 0xc303,  // low
-	0x1b5: 0x19a03, // rtc
-	0x1b6: 0x5230b, // onmouseover
-	0x1b7: 0x2b20a, // novalidate
-	0x1b8: 0x71c0a, // workertype
-	0x1ba: 0x3cd07, // itemref
-	0x1bd: 0x1,     // a
-	0x1be: 0x31803, // map
-	0x1bf: 0x400c,  // ontimeupdate
-	0x1c0: 0x15e07, // bgsound
-	0x1c1: 0x3206,  // keygen
-	0x1c2: 0x2705,  // tbody
-	0x1c5: 0x64406, // onshow
-	0x1c7: 0x2501,  // s
-	0x1c8: 0x6607,  // pattern
-	0x1cc: 0x14d10, // oncanplaythrough
-	0x1ce: 0x2d702, // dd
-	0x1cf: 0x6f906, // srcset
-	0x1d0: 0x17003, // big
-	0x1d2: 0x65108, // sortable
-	0x1d3: 0x48007, // onkeyup
-	0x1d5: 0x5a406, // onplay
-	0x1d7: 0x4b804, // meta
-	0x1d8: 0x40306, // ondrop
-	0x1da: 0x60008, // onscroll
-	0x1db: 0x1fb0b, // crossorigin
-	0x1dc: 0x5730a, // onpageshow
-	0x1dd: 0x4,     // abbr
-	0x1de: 0x9202,  // td
-	0x1df: 0x58b0f, // contenteditable
-	0x1e0: 0x27206, // action
-	0x1e1: 0x1400b, // playsinline
-	0x1e2: 0x43107, // onfocus
-	0x1e3: 0x2e008, // hreflang
-	0x1e5: 0x5160a, // onmouseout
-	0x1e6: 0x5ea07, // onreset
-	0x1e7: 0x13c08, // autoplay
-	0x1e8: 0x63109, // onseeking
-	0x1ea: 0x67506, // scoped
-	0x1ec: 0x30a,   // radiogroup
-	0x1ee: 0x3800b, // contextmenu
-	0x1ef: 0x52e09, // onmouseup
-	0x1f1: 0x2ca06, // hgroup
-	0x1f2: 0x2080f, // allowfullscreen
-	0x1f3: 0x4be08, // tabindex
-	0x1f6: 0x30f07, // isindex
-	0x1f7: 0x1a0e,  // accept-charset
-	0x1f8: 0x2ae0e, // formnovalidate
-	0x1fb: 0x1c90e, // annotation-xml
-	0x1fc: 0x6e05,  // embed
-	0x1fd: 0x21806, // script
-	0x1fe: 0xbb06,  // dialog
-	0x1ff: 0x1d707, // command
+	0x1:   0x3ff08, // dropzone
+	0x2:   0x3b08,  // basefont
+	0x3:   0x23209, // integrity
+	0x4:   0x43106, // source
+	0x5:   0x2c09,  // accesskey
+	0x6:   0x1a06,  // accept
+	0x7:   0x6c807, // onwheel
+	0xb:   0x47407, // onkeyup
+	0xc:   0x32007, // headers
+	0xd:   0x67306, // scoped
+	0xe:   0x67909, // onsuspend
+	0xf:   0x8908,  // noframes
+	0x10:  0x1fa0b, // crossorigin
+	0x11:  0x2e407, // onclick
+	0x12:  0x3f405, // start
+	0x13:  0x37a0b, // contextmenu
+	0x14:  0x5e903, // src
+	0x15:  0x1c404, // cols
+	0x16:  0xbb06,  // dialog
+	0x17:  0x47a07, // preload
+	0x18:  0x3c707, // itemref
+	0x1b:  0x2f105, // image
+	0x1d:  0x4ba09, // onloadend
+	0x1e:  0x45d08, // download
+	0x1f:  0x46a03, // pre
+	0x23:  0x2970a, // formmethod
+	0x24:  0x71303, // svg
+	0x25:  0xcf01,  // q
+	0x26:  0x64002, // dt
+	0x27:  0x1de08, // controls
+	0x2a:  0x2804,  // body
+	0x2b:  0xd206,  // strike
+	0x2c:  0x3910b, // oncuechange
+	0x2d:  0x4c30b, // onloadstart
+	0x2e:  0x2fe07, // isindex
+	0x2f:  0xb202,  // li
+	0x30:  0x1400b, // playsinline
+	0x31:  0x34102, // mi
+	0x32:  0x30806, // applet
+	0x33:  0x4ce09, // onmessage
+	0x35:  0x13702, // ol
+	0x36:  0x1a304, // open
+	0x39:  0x14d09, // oncanplay
+	0x3a:  0x6bf09, // onwaiting
+	0x3b:  0x11908, // oncancel
+	0x3c:  0x6a908, // onunload
+	0x3e:  0x53c09, // onoffline
+	0x3f:  0x1a0e,  // accept-charset
+	0x40:  0x32004, // head
+	0x42:  0x3ab09, // ondragend
+	0x43:  0x1310b, // placeholder
+	0x44:  0x2b30a, // formtarget
+	0x45:  0x2540d, // foreignobject
+	0x47:  0x400c,  // ontimeupdate
+	0x48:  0xdd0e,  // allowusermedia
+	0x4a:  0x69c0d, // onbeforeprint
+	0x4b:  0x5604,  // html
+	0x4c:  0x9f04,  // span
+	0x4d:  0x64206, // hgroup
+	0x4e:  0x16408, // disabled
+	0x4f:  0x4204,  // time
+	0x51:  0x42b07, // onfocus
+	0x53:  0xb00a,  // malignmark
+	0x55:  0x4650a, // onkeypress
+	0x56:  0x55805, // class
+	0x57:  0x1ab08, // colgroup
+	0x58:  0x33709, // maxlength
+	0x59:  0x5a908, // progress
+	0x5b:  0x70405, // style
+	0x5c:  0x2a10e, // formnovalidate
+	0x5e:  0x38b06, // oncopy
+	0x60:  0x26104, // form
+	0x61:  0xf606,  // footer
+	0x64:  0x30a,   // radiogroup
+	0x66:  0xfb04,  // ruby
+	0x67:  0x4ff0b, // onmousemove
+	0x68:  0x19d08, // itemprop
+	0x69:  0x2d70a, // http-equiv
+	0x6a:  0x15602, // th
+	0x6c:  0x6e02,  // em
+	0x6d:  0x38108, // menuitem
+	0x6e:  0x63106, // select
+	0x6f:  0x48110, // onlanguagechange
+	0x70:  0x31f05, // thead
+	0x71:  0x15c02, // h1
+	0x72:  0x5e906, // srcdoc
+	0x75:  0x9604,  // name
+	0x76:  0x19106, // button
+	0x77:  0x55504, // desc
+	0x78:  0x17704, // kind
+	0x79:  0x1bf05, // color
+	0x7c:  0x58e06, // usemap
+	0x7d:  0x30e08, // itemtype
+	0x7f:  0x6d508, // manifest
+	0x81:  0x5300c, // onmousewheel
+	0x82:  0x4dc0b, // onmousedown
+	0x84:  0xc05,   // param
+	0x85:  0x2e005, // video
+	0x86:  0x4910c, // onloadeddata
+	0x87:  0x6f107, // address
+	0x8c:  0xef04,  // ping
+	0x8d:  0x24703, // for
+	0x8f:  0x62f08, // onselect
+	0x90:  0x30703, // map
+	0x92:  0xc01,   // p
+	0x93:  0x8008,  // reversed
+	0x94:  0x54d0a, // onpagehide
+	0x95:  0x3206,  // keygen
+	0x96:  0x34109, // minlength
+	0x97:  0x3e40a, // ondragover
+	0x98:  0x42407, // onerror
+	0x9a:  0x2107,  // charset
+	0x9b:  0x29b06, // method
+	0x9c:  0x101,   // b
+	0x9d:  0x68208, // ontoggle
+	0x9e:  0x2bd06, // hidden
+	0xa0:  0x3f607, // article
+	0xa2:  0x63906, // onshow
+	0xa3:  0x64d06, // onsort
+	0xa5:  0x57b0f, // contenteditable
+	0xa6:  0x66908, // onsubmit
+	0xa8:  0x44f09, // oninvalid
+	0xaa:  0x202,   // br
+	0xab:  0x10902, // id
+	0xac:  0x5d04,  // loop
+	0xad:  0x5630a, // onpageshow
+	0xb0:  0x2cf04, // href
+	0xb2:  0x2210a, // figcaption
+	0xb3:  0x2690e, // onautocomplete
+	0xb4:  0x49106, // onload
+	0xb6:  0x9c04,  // rows
+	0xb7:  0x1a605, // nonce
+	0xb8:  0x68a14, // onunhandledrejection
+	0xbb:  0x21306, // center
+	0xbc:  0x59406, // onplay
+	0xbd:  0x33f02, // h5
+	0xbe:  0x49d07, // listing
+	0xbf:  0x57606, // public
+	0xc2:  0x23b06, // figure
+	0xc3:  0x57a04, // icon
+	0xc4:  0x1ab03, // col
+	0xc5:  0x47b03, // rel
+	0xc6:  0xe605,  // media
+	0xc7:  0x12109, // autofocus
+	0xc8:  0x19a02, // rt
+	0xca:  0x2d304, // lang
+	0xcc:  0x49908, // datalist
+	0xce:  0x2eb06, // iframe
+	0xcf:  0x36105, // muted
+	0xd0:  0x6140a, // onauxclick
+	0xd2:  0x3c02,  // as
+	0xd6:  0x3fd06, // ondrop
+	0xd7:  0x1c90a, // annotation
+	0xd8:  0x21908, // fieldset
+	0xdb:  0x2cf08, // hreflang
+	0xdc:  0x4e70c, // onmouseenter
+	0xdd:  0x2a402, // mn
+	0xde:  0xe60a,  // mediagroup
+	0xdf:  0x9805,  // meter
+	0xe0:  0x56c03, // wbr
+	0xe2:  0x63e05, // width
+	0xe3:  0x2290c, // onafterprint
+	0xe4:  0x30505, // ismap
+	0xe5:  0x1505,  // value
+	0xe7:  0x1303,  // nav
+	0xe8:  0x54508, // ononline
+	0xe9:  0xb604,  // mark
+	0xea:  0xc303,  // low
+	0xeb:  0x3ee0b, // ondragstart
+	0xef:  0x12f03, // xmp
+	0xf0:  0x22407, // caption
+	0xf1:  0xd904,  // type
+	0xf2:  0x70907, // summary
+	0xf3:  0x6802,  // tt
+	0xf4:  0x20809, // translate
+	0xf5:  0x1870a, // blockquote
+	0xf8:  0x15702, // hr
+	0xfa:  0x2705,  // tbody
+	0xfc:  0x7b07,  // picture
+	0xfd:  0x5206,  // height
+	0xfe:  0x19c04, // cite
+	0xff:  0x2501,  // s
+	0x101: 0xff05,  // async
+	0x102: 0x56f07, // onpaste
+	0x103: 0x19507, // onabort
+	0x104: 0x2b706, // target
+	0x105: 0x14b03, // bdo
+	0x106: 0x1f006, // coords
+	0x107: 0x5e108, // onresize
+	0x108: 0x71908, // template
+	0x10a: 0x3a02,  // rb
+	0x10b: 0x2a50a, // novalidate
+	0x10c: 0x460e,  // updateviacache
+	0x10d: 0x71003, // sup
+	0x10e: 0x6c07,  // noembed
+	0x10f: 0x16b03, // div
+	0x110: 0x6f707, // srclang
+	0x111: 0x17a09, // draggable
+	0x112: 0x67305, // scope
+	0x113: 0x5905,  // label
+	0x114: 0x22f02, // rp
+	0x115: 0x23f08, // required
+	0x116: 0x3780d, // oncontextmenu
+	0x117: 0x5e504, // size
+	0x118: 0x5b00a, // spellcheck
+	0x119: 0x3f04,  // font
+	0x11a: 0x9c07,  // rowspan
+	0x11b: 0x10a07, // default
+	0x11d: 0x44307, // oninput
+	0x11e: 0x38506, // itemid
+	0x11f: 0x5ee04, // code
+	0x120: 0xaa07,  // acronym
+	0x121: 0x3b04,  // base
+	0x125: 0x2470d, // foreignObject
+	0x126: 0x2ca04, // high
+	0x127: 0x3cb0e, // referrerpolicy
+	0x128: 0x33703, // max
+	0x129: 0x59d0a, // onpopstate
+	0x12a: 0x2fc02, // h4
+	0x12b: 0x4ac04, // meta
+	0x12c: 0x17305, // blink
+	0x12e: 0x5f508, // onscroll
+	0x12f: 0x59409, // onplaying
+	0x130: 0xc113,  // allowpaymentrequest
+	0x131: 0x19a03, // rtc
+	0x132: 0x72b04, // wrap
+	0x134: 0x8b08,  // frameset
+	0x135: 0x32605, // small
+	0x137: 0x32006, // header
+	0x138: 0x40409, // onemptied
+	0x139: 0x34902, // h6
+	0x13a: 0x35908, // multiple
+	0x13c: 0x52a06, // prompt
+	0x13f: 0x28e09, // challenge
+	0x141: 0x4370c, // onhashchange
+	0x142: 0x57b07, // content
+	0x143: 0x1c90e, // annotation-xml
+	0x144: 0x36607, // onclose
+	0x145: 0x14d10, // oncanplaythrough
+	0x148: 0x5170b, // onmouseover
+	0x149: 0x64f08, // sortable
+	0x14a: 0xa402,  // mo
+	0x14b: 0x2cd02, // h3
+	0x14c: 0x2c406, // script
+	0x14d: 0x41d07, // onended
+	0x14f: 0x64706, // poster
+	0x150: 0x7210a, // workertype
+	0x153: 0x1f505, // shape
+	0x154: 0x4,     // abbr
+	0x155: 0x1,     // a
+	0x156: 0x2bf02, // dd
+	0x157: 0x71606, // system
+	0x158: 0x4ce0e, // onmessageerror
+	0x159: 0x36b08, // seamless
+	0x15a: 0x2610a, // formaction
+	0x15b: 0x6e106, // option
+	0x15c: 0x31d04, // math
+	0x15d: 0x62609, // onseeking
+	0x15e: 0x39c05, // oncut
+	0x15f: 0x44c03, // del
+	0x160: 0x11005, // title
+	0x161: 0x11505, // audio
+	0x162: 0x63108, // selected
+	0x165: 0x3b40b, // ondragenter
+	0x166: 0x46e06, // spacer
+	0x167: 0x4a410, // onloadedmetadata
+	0x168: 0x44505, // input
+	0x16a: 0x58505, // table
+	0x16b: 0x41508, // onchange
+	0x16e: 0x5f005, // defer
+	0x171: 0x50a0a, // onmouseout
+	0x172: 0x20504, // slot
+	0x175: 0x3704,  // nobr
+	0x177: 0x1d707, // command
+	0x17a: 0x7207,  // details
+	0x17b: 0x38104, // menu
+	0x17c: 0xb903,  // kbd
+	0x17d: 0x57304, // step
+	0x17e: 0x20303, // ins
+	0x17f: 0x13c08, // autoplay
+	0x182: 0x34103, // min
+	0x183: 0x17404, // link
+	0x185: 0x40d10, // ondurationchange
+	0x186: 0x9202,  // td
+	0x187: 0x8b05,  // frame
+	0x18a: 0x2ab08, // datetime
+	0x18b: 0x44509, // inputmode
+	0x18c: 0x35108, // readonly
+	0x18d: 0x21104, // face
+	0x18f: 0x5e505, // sizes
+	0x191: 0x4b208, // tabindex
+	0x192: 0x6db06, // strong
+	0x193: 0xba03,  // bdi
+	0x194: 0x6fe06, // srcset
+	0x196: 0x67202, // ms
+	0x197: 0x5b507, // checked
+	0x198: 0xb105,  // align
+	0x199: 0x1e507, // section
+	0x19b: 0x6e05,  // embed
+	0x19d: 0x15e07, // bgsound
+	0x1a2: 0x49d04, // list
+	0x1a3: 0x61e08, // onseeked
+	0x1a4: 0x66009, // onstorage
+	0x1a5: 0x2f603, // img
+	0x1a6: 0xf505,  // tfoot
+	0x1a9: 0x26913, // onautocompleteerror
+	0x1aa: 0x5fd19, // onsecuritypolicyviolation
+	0x1ad: 0x9303,  // dir
+	0x1ae: 0x9307,  // dirname
+	0x1b0: 0x5a70a, // onprogress
+	0x1b2: 0x65709, // onstalled
+	0x1b5: 0x66f09, // itemscope
+	0x1b6: 0x49904, // data
+	0x1b7: 0x3d90b, // ondragleave
+	0x1b8: 0x56102, // h2
+	0x1b9: 0x2f706, // mglyph
+	0x1ba: 0x16502, // is
+	0x1bb: 0x6e50e, // onbeforeunload
+	0x1bc: 0x2830d, // typemustmatch
+	0x1bd: 0x3ab06, // ondrag
+	0x1be: 0x5da07, // onreset
+	0x1c0: 0x51106, // output
+	0x1c1: 0x12907, // sandbox
+	0x1c2: 0x1b209, // plaintext
+	0x1c4: 0x34c08, // textarea
+	0x1c7: 0xd607,  // keytype
+	0x1c8: 0x34b05, // mtext
+	0x1c9: 0x6b10e, // onvolumechange
+	0x1ca: 0x1ea06, // onblur
+	0x1cb: 0x58a07, // onpause
+	0x1cd: 0x5bc0c, // onratechange
+	0x1ce: 0x10705, // aside
+	0x1cf: 0x6cf07, // optimum
+	0x1d1: 0x45809, // onkeydown
+	0x1d2: 0x1c407, // colspan
+	0x1d3: 0x1004,  // main
+	0x1d4: 0x66b03, // sub
+	0x1d5: 0x25b06, // object
+	0x1d6: 0x55c06, // search
+	0x1d7: 0x37206, // sorted
+	0x1d8: 0x17003, // big
+	0x1d9: 0xb01,   // u
+	0x1db: 0x26b0c, // autocomplete
+	0x1dc: 0xcc02,  // tr
+	0x1dd: 0xf303,  // alt
+	0x1df: 0x7804,  // samp
+	0x1e0: 0x5c812, // onrejectionhandled
+	0x1e1: 0x4f30c, // onmouseleave
+	0x1e2: 0x28007, // enctype
+	0x1e3: 0xa208,  // nomodule
+	0x1e5: 0x3280f, // allowfullscreen
+	0x1e6: 0x5f08,  // optgroup
+	0x1e8: 0x27c0b, // formenctype
+	0x1e9: 0x18106, // legend
+	0x1ea: 0x10306, // canvas
+	0x1eb: 0x6607,  // pattern
+	0x1ec: 0x2c208, // noscript
+	0x1ed: 0x601,   // i
+	0x1ee: 0x5d602, // dl
+	0x1ef: 0xa702,  // ul
+	0x1f2: 0x52209, // onmouseup
+	0x1f4: 0x1ba05, // track
+	0x1f7: 0x3a10a, // ondblclick
+	0x1f8: 0x3bf0a, // ondragexit
+	0x1fa: 0x8703,  // dfn
+	0x1fc: 0x26506, // action
+	0x1fd: 0x35004, // area
+	0x1fe: 0x31607, // marquee
+	0x1ff: 0x16d03, // var
 }
 
 const atomText = "abbradiogrouparamainavalueaccept-charsetbodyaccesskeygenobrb" +
@@ -758,26 +760,26 @@ const atomText = "abbradiogrouparamainavalueaccept-charsetbodyaccesskeygenobrb"
 	"dboxmplaceholderautoplaysinlinebdoncanplaythrough1bgsoundisa" +
 	"bledivarbigblinkindraggablegendblockquotebuttonabortcitempro" +
 	"penoncecolgrouplaintextrackcolorcolspannotation-xmlcommandco" +
-	"ntrolshapecoordslotranslatecrossoriginsmallowfullscreenoscri" +
-	"ptfacenterfieldsetfigcaptionafterprintegrityfigurequiredfore" +
-	"ignObjectforeignobjectformactionautocompleteerrorformenctype" +
-	"mustmatchallengeformmethodformnovalidatetimeformtargethgroup" +
-	"osterhiddenhigh2hreflanghttp-equivideonclickiframeimageimgly" +
-	"ph3isindexismappletitemtypemarqueematheadersortedmaxlength4m" +
-	"inlength5mtextareadonlymultiplemutedoncloseamlessourceoncont" +
-	"extmenuitemidoncopyoncuechangeoncutondblclickondragendondrag" +
-	"enterondragexitemreferrerpolicyondragleaveondragoverondragst" +
-	"articleondropzonemptiedondurationchangeonendedonerroronfocus" +
-	"paceronhashchangeoninputmodeloninvalidonkeydownloadonkeypres" +
-	"spellcheckedonkeyupreloadonlanguagechangeonloadeddatalisting" +
-	"onloadedmetadatabindexonloadendonloadstartonmessageerroronmo" +
-	"usedownonmouseenteronmouseleaveonmousemoveonmouseoutputonmou" +
-	"seoveronmouseupromptonmousewheelonofflineononlineonpagehides" +
-	"classectionbluronpageshowbronpastepublicontenteditableonpaus" +
-	"emaponplayingonpopstateonprogressrcdocodeferonratechangeonre" +
-	"jectionhandledonresetonresizesrclangonscrollonsecuritypolicy" +
-	"violationauxclickonseekedonseekingonselectedonshowidth6onsor" +
-	"tableonstalledonstorageonsubmitemscopedonsuspendontoggleonun" +
-	"handledrejectionbeforeprintonunloadonvolumechangeonwaitingon" +
-	"wheeloptimumanifestrongoptionbeforeunloaddressrcsetstylesumm" +
-	"arysupsvgsystemplateworkertypewrap"
+	"ntrolsectionblurcoordshapecrossoriginslotranslatefacenterfie" +
+	"ldsetfigcaptionafterprintegrityfigurequiredforeignObjectfore" +
+	"ignobjectformactionautocompleteerrorformenctypemustmatchalle" +
+	"ngeformmethodformnovalidatetimeformtargethiddenoscripthigh3h" +
+	"reflanghttp-equivideonclickiframeimageimglyph4isindexismappl" +
+	"etitemtypemarqueematheadersmallowfullscreenmaxlength5minleng" +
+	"th6mtextareadonlymultiplemutedoncloseamlessortedoncontextmen" +
+	"uitemidoncopyoncuechangeoncutondblclickondragendondragentero" +
+	"ndragexitemreferrerpolicyondragleaveondragoverondragstarticl" +
+	"eondropzonemptiedondurationchangeonendedonerroronfocusourceo" +
+	"nhashchangeoninputmodeloninvalidonkeydownloadonkeypresspacer" +
+	"onkeyupreloadonlanguagechangeonloadeddatalistingonloadedmeta" +
+	"databindexonloadendonloadstartonmessageerroronmousedownonmou" +
+	"seenteronmouseleaveonmousemoveonmouseoutputonmouseoveronmous" +
+	"eupromptonmousewheelonofflineononlineonpagehidesclassearch2o" +
+	"npageshowbronpastepublicontenteditableonpausemaponplayingonp" +
+	"opstateonprogresspellcheckedonratechangeonrejectionhandledon" +
+	"resetonresizesrcdocodeferonscrollonsecuritypolicyviolationau" +
+	"xclickonseekedonseekingonselectedonshowidthgrouposteronsorta" +
+	"bleonstalledonstorageonsubmitemscopedonsuspendontoggleonunha" +
+	"ndledrejectionbeforeprintonunloadonvolumechangeonwaitingonwh" +
+	"eeloptimumanifestrongoptionbeforeunloaddressrclangsrcsetstyl" +
+	"esummarysupsvgsystemplateworkertypewrap"
diff --git a/source/vendor/golang.org/x/net/html/parse.go b/source/vendor/golang.org/x/net/html/parse.go
index 643c674..518ee4c 100644
--- a/source/vendor/golang.org/x/net/html/parse.go
+++ b/source/vendor/golang.org/x/net/html/parse.go
@@ -924,7 +924,7 @@ func inBodyIM(p *parser) bool {
 			p.addElement()
 			p.im = inFramesetIM
 			return true
-		case a.Address, a.Article, a.Aside, a.Blockquote, a.Center, a.Details, a.Dialog, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Main, a.Menu, a.Nav, a.Ol, a.P, a.Section, a.Summary, a.Ul:
+		case a.Address, a.Article, a.Aside, a.Blockquote, a.Center, a.Details, a.Dialog, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Main, a.Menu, a.Nav, a.Ol, a.P, a.Search, a.Section, a.Summary, a.Ul:
 			p.popUntil(buttonScope, a.P)
 			p.addElement()
 		case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6:
@@ -1136,7 +1136,7 @@ func inBodyIM(p *parser) bool {
 				return false
 			}
 			return true
-		case a.Address, a.Article, a.Aside, a.Blockquote, a.Button, a.Center, a.Details, a.Dialog, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Listing, a.Main, a.Menu, a.Nav, a.Ol, a.Pre, a.Section, a.Summary, a.Ul:
+		case a.Address, a.Article, a.Aside, a.Blockquote, a.Button, a.Center, a.Details, a.Dialog, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Listing, a.Main, a.Menu, a.Nav, a.Ol, a.Pre, a.Search, a.Section, a.Summary, a.Ul:
 			p.popUntil(defaultScope, p.tok.DataAtom)
 		case a.Form:
 			if p.oe.contains(a.Template) {
diff --git a/source/vendor/golang.org/x/net/html/token.go b/source/vendor/golang.org/x/net/html/token.go
index 3c57880..6598c1f 100644
--- a/source/vendor/golang.org/x/net/html/token.go
+++ b/source/vendor/golang.org/x/net/html/token.go
@@ -839,8 +839,22 @@ func (z *Tokenizer) readStartTag() TokenType {
 	if raw {
 		z.rawTag = strings.ToLower(string(z.buf[z.data.start:z.data.end]))
 	}
-	// Look for a self-closing token like "<br/>".
-	if z.err == nil && z.buf[z.raw.end-2] == '/' {
+	// Look for a self-closing token (e.g. <br/>).
+	//
+	// Originally, we did this by just checking that the last character of the
+	// tag (ignoring the closing bracket) was a solidus (/) character, but this
+	// is not always accurate.
+	//
+	// We need to be careful that we don't misinterpret a non-self-closing tag
+	// as self-closing, as can happen if the tag contains unquoted attribute
+	// values (i.e. <p a=/>).
+	//
+	// To avoid this, we check that the last non-bracket character of the tag
+	// (z.raw.end-2) isn't the same character as the last non-quote character of
+	// the last attribute of the tag (z.pendingAttr[1].end-1), if the tag has
+	// attributes.
+	nAttrs := len(z.attr)
+	if z.err == nil && z.buf[z.raw.end-2] == '/' && (nAttrs == 0 || z.raw.end-2 != z.attr[nAttrs-1][1].end-1) {
 		return SelfClosingTagToken
 	}
 	return StartTagToken
diff --git a/source/vendor/golang.org/x/sys/unix/syscall_darwin.go b/source/vendor/golang.org/x/sys/unix/syscall_darwin.go
index 099867d..798f61a 100644
--- a/source/vendor/golang.org/x/sys/unix/syscall_darwin.go
+++ b/source/vendor/golang.org/x/sys/unix/syscall_darwin.go
@@ -602,7 +602,150 @@ func Connectx(fd int, srcIf uint32, srcAddr, dstAddr Sockaddr, associd SaeAssocI
 	return
 }
 
-//sys	connectx(fd int, endpoints *SaEndpoints, associd SaeAssocID, flags uint32, iov []Iovec, n *uintptr, connid *SaeConnID) (err error)
+// sys	connectx(fd int, endpoints *SaEndpoints, associd SaeAssocID, flags uint32, iov []Iovec, n *uintptr, connid *SaeConnID) (err error)
+const minIovec = 8
+
+func Readv(fd int, iovs [][]byte) (n int, err error) {
+	if !darwinKernelVersionMin(11, 0, 0) {
+		return 0, ENOSYS
+	}
+
+	iovecs := make([]Iovec, 0, minIovec)
+	iovecs = appendBytes(iovecs, iovs)
+	n, err = readv(fd, iovecs)
+	readvRacedetect(iovecs, n, err)
+	return n, err
+}
+
+func Preadv(fd int, iovs [][]byte, offset int64) (n int, err error) {
+	if !darwinKernelVersionMin(11, 0, 0) {
+		return 0, ENOSYS
+	}
+	iovecs := make([]Iovec, 0, minIovec)
+	iovecs = appendBytes(iovecs, iovs)
+	n, err = preadv(fd, iovecs, offset)
+	readvRacedetect(iovecs, n, err)
+	return n, err
+}
+
+func Writev(fd int, iovs [][]byte) (n int, err error) {
+	if !darwinKernelVersionMin(11, 0, 0) {
+		return 0, ENOSYS
+	}
+
+	iovecs := make([]Iovec, 0, minIovec)
+	iovecs = appendBytes(iovecs, iovs)
+	if raceenabled {
+		raceReleaseMerge(unsafe.Pointer(&ioSync))
+	}
+	n, err = writev(fd, iovecs)
+	writevRacedetect(iovecs, n)
+	return n, err
+}
+
+func Pwritev(fd int, iovs [][]byte, offset int64) (n int, err error) {
+	if !darwinKernelVersionMin(11, 0, 0) {
+		return 0, ENOSYS
+	}
+
+	iovecs := make([]Iovec, 0, minIovec)
+	iovecs = appendBytes(iovecs, iovs)
+	if raceenabled {
+		raceReleaseMerge(unsafe.Pointer(&ioSync))
+	}
+	n, err = pwritev(fd, iovecs, offset)
+	writevRacedetect(iovecs, n)
+	return n, err
+}
+
+func appendBytes(vecs []Iovec, bs [][]byte) []Iovec {
+	for _, b := range bs {
+		var v Iovec
+		v.SetLen(len(b))
+		if len(b) > 0 {
+			v.Base = &b[0]
+		} else {
+			v.Base = (*byte)(unsafe.Pointer(&_zero))
+		}
+		vecs = append(vecs, v)
+	}
+	return vecs
+}
+
+func writevRacedetect(iovecs []Iovec, n int) {
+	if !raceenabled {
+		return
+	}
+	for i := 0; n > 0 && i < len(iovecs); i++ {
+		m := int(iovecs[i].Len)
+		if m > n {
+			m = n
+		}
+		n -= m
+		if m > 0 {
+			raceReadRange(unsafe.Pointer(iovecs[i].Base), m)
+		}
+	}
+}
+
+func readvRacedetect(iovecs []Iovec, n int, err error) {
+	if !raceenabled {
+		return
+	}
+	for i := 0; n > 0 && i < len(iovecs); i++ {
+		m := int(iovecs[i].Len)
+		if m > n {
+			m = n
+		}
+		n -= m
+		if m > 0 {
+			raceWriteRange(unsafe.Pointer(iovecs[i].Base), m)
+		}
+	}
+	if err == nil {
+		raceAcquire(unsafe.Pointer(&ioSync))
+	}
+}
+
+func darwinMajorMinPatch() (maj, min, patch int, err error) {
+	var un Utsname
+	err = Uname(&un)
+	if err != nil {
+		return
+	}
+
+	var mmp [3]int
+	c := 0
+Loop:
+	for _, b := range un.Release[:] {
+		switch {
+		case b >= '0' && b <= '9':
+			mmp[c] = 10*mmp[c] + int(b-'0')
+		case b == '.':
+			c++
+			if c > 2 {
+				return 0, 0, 0, ENOTSUP
+			}
+		case b == 0:
+			break Loop
+		default:
+			return 0, 0, 0, ENOTSUP
+		}
+	}
+	if c != 2 {
+		return 0, 0, 0, ENOTSUP
+	}
+	return mmp[0], mmp[1], mmp[2], nil
+}
+
+func darwinKernelVersionMin(maj, min, patch int) bool {
+	actualMaj, actualMin, actualPatch, err := darwinMajorMinPatch()
+	if err != nil {
+		return false
+	}
+	return actualMaj > maj || actualMaj == maj && (actualMin > min || actualMin == min && actualPatch >= patch)
+}
+
 //sys	sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error)
 
 //sys	shmat(id int, addr uintptr, flag int) (ret uintptr, err error)
@@ -705,3 +848,7 @@ func Connectx(fd int, srcIf uint32, srcAddr, dstAddr Sockaddr, associd SaeAssocI
 //sys	write(fd int, p []byte) (n int, err error)
 //sys	mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error)
 //sys	munmap(addr uintptr, length uintptr) (err error)
+//sys	readv(fd int, iovecs []Iovec) (n int, err error)
+//sys	preadv(fd int, iovecs []Iovec, offset int64) (n int, err error)
+//sys	writev(fd int, iovecs []Iovec) (n int, err error)
+//sys	pwritev(fd int, iovecs []Iovec, offset int64) (n int, err error)
diff --git a/source/vendor/golang.org/x/sys/unix/syscall_linux.go b/source/vendor/golang.org/x/sys/unix/syscall_linux.go
index 230a945..4958a65 100644
--- a/source/vendor/golang.org/x/sys/unix/syscall_linux.go
+++ b/source/vendor/golang.org/x/sys/unix/syscall_linux.go
@@ -13,6 +13,7 @@ package unix
 
 import (
 	"encoding/binary"
+	"slices"
 	"strconv"
 	"syscall"
 	"time"
@@ -417,7 +418,7 @@ func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) {
 		return nil, 0, EINVAL
 	}
 	sa.raw.Family = AF_UNIX
-	for i := 0; i < n; i++ {
+	for i := range n {
 		sa.raw.Path[i] = int8(name[i])
 	}
 	// length is family (uint16), name, NUL.
@@ -507,7 +508,7 @@ func (sa *SockaddrL2) sockaddr() (unsafe.Pointer, _Socklen, error) {
 	psm := (*[2]byte)(unsafe.Pointer(&sa.raw.Psm))
 	psm[0] = byte(sa.PSM)
 	psm[1] = byte(sa.PSM >> 8)
-	for i := 0; i < len(sa.Addr); i++ {
+	for i := range len(sa.Addr) {
 		sa.raw.Bdaddr[i] = sa.Addr[len(sa.Addr)-1-i]
 	}
 	cid := (*[2]byte)(unsafe.Pointer(&sa.raw.Cid))
@@ -589,11 +590,11 @@ func (sa *SockaddrCAN) sockaddr() (unsafe.Pointer, _Socklen, error) {
 	sa.raw.Family = AF_CAN
 	sa.raw.Ifindex = int32(sa.Ifindex)
 	rx := (*[4]byte)(unsafe.Pointer(&sa.RxID))
-	for i := 0; i < 4; i++ {
+	for i := range 4 {
 		sa.raw.Addr[i] = rx[i]
 	}
 	tx := (*[4]byte)(unsafe.Pointer(&sa.TxID))
-	for i := 0; i < 4; i++ {
+	for i := range 4 {
 		sa.raw.Addr[i+4] = tx[i]
 	}
 	return unsafe.Pointer(&sa.raw), SizeofSockaddrCAN, nil
@@ -618,11 +619,11 @@ func (sa *SockaddrCANJ1939) sockaddr() (unsafe.Pointer, _Socklen, error) {
 	sa.raw.Family = AF_CAN
 	sa.raw.Ifindex = int32(sa.Ifindex)
 	n := (*[8]byte)(unsafe.Pointer(&sa.Name))
-	for i := 0; i < 8; i++ {
+	for i := range 8 {
 		sa.raw.Addr[i] = n[i]
 	}
 	p := (*[4]byte)(unsafe.Pointer(&sa.PGN))
-	for i := 0; i < 4; i++ {
+	for i := range 4 {
 		sa.raw.Addr[i+8] = p[i]
 	}
 	sa.raw.Addr[12] = sa.Addr
@@ -911,7 +912,7 @@ func (sa *SockaddrIUCV) sockaddr() (unsafe.Pointer, _Socklen, error) {
 	// These are EBCDIC encoded by the kernel, but we still need to pad them
 	// with blanks. Initializing with blanks allows the caller to feed in either
 	// a padded or an unpadded string.
-	for i := 0; i < 8; i++ {
+	for i := range 8 {
 		sa.raw.Nodeid[i] = ' '
 		sa.raw.User_id[i] = ' '
 		sa.raw.Name[i] = ' '
@@ -1148,7 +1149,7 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) {
 		var user [8]byte
 		var name [8]byte
 
-		for i := 0; i < 8; i++ {
+		for i := range 8 {
 			user[i] = byte(pp.User_id[i])
 			name[i] = byte(pp.Name[i])
 		}
@@ -1173,11 +1174,11 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) {
 				Ifindex: int(pp.Ifindex),
 			}
 			name := (*[8]byte)(unsafe.Pointer(&sa.Name))
-			for i := 0; i < 8; i++ {
+			for i := range 8 {
 				name[i] = pp.Addr[i]
 			}
 			pgn := (*[4]byte)(unsafe.Pointer(&sa.PGN))
-			for i := 0; i < 4; i++ {
+			for i := range 4 {
 				pgn[i] = pp.Addr[i+8]
 			}
 			addr := (*[1]byte)(unsafe.Pointer(&sa.Addr))
@@ -1188,11 +1189,11 @@ func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) {
 				Ifindex: int(pp.Ifindex),
 			}
 			rx := (*[4]byte)(unsafe.Pointer(&sa.RxID))
-			for i := 0; i < 4; i++ {
+			for i := range 4 {
 				rx[i] = pp.Addr[i]
 			}
 			tx := (*[4]byte)(unsafe.Pointer(&sa.TxID))
-			for i := 0; i < 4; i++ {
+			for i := range 4 {
 				tx[i] = pp.Addr[i+4]
 			}
 			return sa, nil
@@ -2216,10 +2217,7 @@ func readvRacedetect(iovecs []Iovec, n int, err error) {
 		return
 	}
 	for i := 0; n > 0 && i < len(iovecs); i++ {
-		m := int(iovecs[i].Len)
-		if m > n {
-			m = n
-		}
+		m := min(int(iovecs[i].Len), n)
 		n -= m
 		if m > 0 {
 			raceWriteRange(unsafe.Pointer(iovecs[i].Base), m)
@@ -2270,10 +2268,7 @@ func writevRacedetect(iovecs []Iovec, n int) {
 		return
 	}
 	for i := 0; n > 0 && i < len(iovecs); i++ {
-		m := int(iovecs[i].Len)
-		if m > n {
-			m = n
-		}
+		m := min(int(iovecs[i].Len), n)
 		n -= m
 		if m > 0 {
 			raceReadRange(unsafe.Pointer(iovecs[i].Base), m)
@@ -2320,12 +2315,7 @@ func isGroupMember(gid int) bool {
 		return false
 	}
 
-	for _, g := range groups {
-		if g == gid {
-			return true
-		}
-	}
-	return false
+	return slices.Contains(groups, gid)
 }
 
 func isCapDacOverrideSet() bool {
diff --git a/source/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/source/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go
index 24b346e..813c05b 100644
--- a/source/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go
+++ b/source/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go
@@ -2512,6 +2512,90 @@ var libc_munmap_trampoline_addr uintptr
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func readv(fd int, iovecs []Iovec) (n int, err error) {
+	var _p0 unsafe.Pointer
+	if len(iovecs) > 0 {
+		_p0 = unsafe.Pointer(&iovecs[0])
+	} else {
+		_p0 = unsafe.Pointer(&_zero)
+	}
+	r0, _, e1 := syscall_syscall(libc_readv_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(iovecs)))
+	n = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+var libc_readv_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_readv readv "/usr/lib/libSystem.B.dylib"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func preadv(fd int, iovecs []Iovec, offset int64) (n int, err error) {
+	var _p0 unsafe.Pointer
+	if len(iovecs) > 0 {
+		_p0 = unsafe.Pointer(&iovecs[0])
+	} else {
+		_p0 = unsafe.Pointer(&_zero)
+	}
+	r0, _, e1 := syscall_syscall6(libc_preadv_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(iovecs)), uintptr(offset), 0, 0)
+	n = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+var libc_preadv_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_preadv preadv "/usr/lib/libSystem.B.dylib"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func writev(fd int, iovecs []Iovec) (n int, err error) {
+	var _p0 unsafe.Pointer
+	if len(iovecs) > 0 {
+		_p0 = unsafe.Pointer(&iovecs[0])
+	} else {
+		_p0 = unsafe.Pointer(&_zero)
+	}
+	r0, _, e1 := syscall_syscall(libc_writev_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(iovecs)))
+	n = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+var libc_writev_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_writev writev "/usr/lib/libSystem.B.dylib"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func pwritev(fd int, iovecs []Iovec, offset int64) (n int, err error) {
+	var _p0 unsafe.Pointer
+	if len(iovecs) > 0 {
+		_p0 = unsafe.Pointer(&iovecs[0])
+	} else {
+		_p0 = unsafe.Pointer(&_zero)
+	}
+	r0, _, e1 := syscall_syscall6(libc_pwritev_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(iovecs)), uintptr(offset), 0, 0)
+	n = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+var libc_pwritev_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_pwritev pwritev "/usr/lib/libSystem.B.dylib"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Fstat(fd int, stat *Stat_t) (err error) {
 	_, _, e1 := syscall_syscall(libc_fstat64_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)
 	if e1 != 0 {
diff --git a/source/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s b/source/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s
index ebd2131..fda3285 100644
--- a/source/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s
+++ b/source/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s
@@ -738,6 +738,26 @@ TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0
 GLOBL	·libc_munmap_trampoline_addr(SB), RODATA, $8
 DATA	·libc_munmap_trampoline_addr(SB)/8, $libc_munmap_trampoline<>(SB)
 
+TEXT libc_readv_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_readv(SB)
+GLOBL	·libc_readv_trampoline_addr(SB), RODATA, $8
+DATA	·libc_readv_trampoline_addr(SB)/8, $libc_readv_trampoline<>(SB)
+
+TEXT libc_preadv_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_preadv(SB)
+GLOBL	·libc_preadv_trampoline_addr(SB), RODATA, $8
+DATA	·libc_preadv_trampoline_addr(SB)/8, $libc_preadv_trampoline<>(SB)
+
+TEXT libc_writev_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_writev(SB)
+GLOBL	·libc_writev_trampoline_addr(SB), RODATA, $8
+DATA	·libc_writev_trampoline_addr(SB)/8, $libc_writev_trampoline<>(SB)
+
+TEXT libc_pwritev_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_pwritev(SB)
+GLOBL	·libc_pwritev_trampoline_addr(SB), RODATA, $8
+DATA	·libc_pwritev_trampoline_addr(SB)/8, $libc_pwritev_trampoline<>(SB)
+
 TEXT libc_fstat64_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fstat64(SB)
 GLOBL	·libc_fstat64_trampoline_addr(SB), RODATA, $8
diff --git a/source/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/source/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go
index 824b9c2..e6f58f3 100644
--- a/source/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go
+++ b/source/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go
@@ -2512,6 +2512,90 @@ var libc_munmap_trampoline_addr uintptr
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func readv(fd int, iovecs []Iovec) (n int, err error) {
+	var _p0 unsafe.Pointer
+	if len(iovecs) > 0 {
+		_p0 = unsafe.Pointer(&iovecs[0])
+	} else {
+		_p0 = unsafe.Pointer(&_zero)
+	}
+	r0, _, e1 := syscall_syscall(libc_readv_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(iovecs)))
+	n = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+var libc_readv_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_readv readv "/usr/lib/libSystem.B.dylib"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func preadv(fd int, iovecs []Iovec, offset int64) (n int, err error) {
+	var _p0 unsafe.Pointer
+	if len(iovecs) > 0 {
+		_p0 = unsafe.Pointer(&iovecs[0])
+	} else {
+		_p0 = unsafe.Pointer(&_zero)
+	}
+	r0, _, e1 := syscall_syscall6(libc_preadv_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(iovecs)), uintptr(offset), 0, 0)
+	n = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+var libc_preadv_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_preadv preadv "/usr/lib/libSystem.B.dylib"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func writev(fd int, iovecs []Iovec) (n int, err error) {
+	var _p0 unsafe.Pointer
+	if len(iovecs) > 0 {
+		_p0 = unsafe.Pointer(&iovecs[0])
+	} else {
+		_p0 = unsafe.Pointer(&_zero)
+	}
+	r0, _, e1 := syscall_syscall(libc_writev_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(iovecs)))
+	n = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+var libc_writev_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_writev writev "/usr/lib/libSystem.B.dylib"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
+func pwritev(fd int, iovecs []Iovec, offset int64) (n int, err error) {
+	var _p0 unsafe.Pointer
+	if len(iovecs) > 0 {
+		_p0 = unsafe.Pointer(&iovecs[0])
+	} else {
+		_p0 = unsafe.Pointer(&_zero)
+	}
+	r0, _, e1 := syscall_syscall6(libc_pwritev_trampoline_addr, uintptr(fd), uintptr(_p0), uintptr(len(iovecs)), uintptr(offset), 0, 0)
+	n = int(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+var libc_pwritev_trampoline_addr uintptr
+
+//go:cgo_import_dynamic libc_pwritev pwritev "/usr/lib/libSystem.B.dylib"
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func Fstat(fd int, stat *Stat_t) (err error) {
 	_, _, e1 := syscall_syscall(libc_fstat_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0)
 	if e1 != 0 {
diff --git a/source/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s b/source/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s
index 4f178a2..7f8998b 100644
--- a/source/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s
+++ b/source/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s
@@ -738,6 +738,26 @@ TEXT libc_munmap_trampoline<>(SB),NOSPLIT,$0-0
 GLOBL	·libc_munmap_trampoline_addr(SB), RODATA, $8
 DATA	·libc_munmap_trampoline_addr(SB)/8, $libc_munmap_trampoline<>(SB)
 
+TEXT libc_readv_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_readv(SB)
+GLOBL	·libc_readv_trampoline_addr(SB), RODATA, $8
+DATA	·libc_readv_trampoline_addr(SB)/8, $libc_readv_trampoline<>(SB)
+
+TEXT libc_preadv_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_preadv(SB)
+GLOBL	·libc_preadv_trampoline_addr(SB), RODATA, $8
+DATA	·libc_preadv_trampoline_addr(SB)/8, $libc_preadv_trampoline<>(SB)
+
+TEXT libc_writev_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_writev(SB)
+GLOBL	·libc_writev_trampoline_addr(SB), RODATA, $8
+DATA	·libc_writev_trampoline_addr(SB)/8, $libc_writev_trampoline<>(SB)
+
+TEXT libc_pwritev_trampoline<>(SB),NOSPLIT,$0-0
+	JMP	libc_pwritev(SB)
+GLOBL	·libc_pwritev_trampoline_addr(SB), RODATA, $8
+DATA	·libc_pwritev_trampoline_addr(SB)/8, $libc_pwritev_trampoline<>(SB)
+
 TEXT libc_fstat_trampoline<>(SB),NOSPLIT,$0-0
 	JMP	libc_fstat(SB)
 GLOBL	·libc_fstat_trampoline_addr(SB), RODATA, $8
diff --git a/source/vendor/golang.org/x/sys/windows/security_windows.go b/source/vendor/golang.org/x/sys/windows/security_windows.go
index b6e1ab7..a8b0364 100644
--- a/source/vendor/golang.org/x/sys/windows/security_windows.go
+++ b/source/vendor/golang.org/x/sys/windows/security_windows.go
@@ -1303,7 +1303,10 @@ func (selfRelativeSD *SECURITY_DESCRIPTOR) ToAbsolute() (absoluteSD *SECURITY_DE
 		return nil, err
 	}
 	if absoluteSDSize > 0 {
-		absoluteSD = (*SECURITY_DESCRIPTOR)(unsafe.Pointer(&make([]byte, absoluteSDSize)[0]))
+		absoluteSD = new(SECURITY_DESCRIPTOR)
+		if unsafe.Sizeof(*absoluteSD) < uintptr(absoluteSDSize) {
+			panic("sizeof(SECURITY_DESCRIPTOR) too small")
+		}
 	}
 	var (
 		dacl  *ACL
@@ -1312,19 +1315,55 @@ func (selfRelativeSD *SECURITY_DESCRIPTOR) ToAbsolute() (absoluteSD *SECURITY_DE
 		group *SID
 	)
 	if daclSize > 0 {
-		dacl = (*ACL)(unsafe.Pointer(&make([]byte, daclSize)[0]))
+		dacl = (*ACL)(unsafe.Pointer(unsafe.SliceData(make([]byte, daclSize))))
 	}
 	if saclSize > 0 {
-		sacl = (*ACL)(unsafe.Pointer(&make([]byte, saclSize)[0]))
+		sacl = (*ACL)(unsafe.Pointer(unsafe.SliceData(make([]byte, saclSize))))
 	}
 	if ownerSize > 0 {
-		owner = (*SID)(unsafe.Pointer(&make([]byte, ownerSize)[0]))
+		owner = (*SID)(unsafe.Pointer(unsafe.SliceData(make([]byte, ownerSize))))
 	}
 	if groupSize > 0 {
-		group = (*SID)(unsafe.Pointer(&make([]byte, groupSize)[0]))
+		group = (*SID)(unsafe.Pointer(unsafe.SliceData(make([]byte, groupSize))))
 	}
+	// We call into Windows via makeAbsoluteSD, which sets up
+	// pointers within absoluteSD that point to other chunks of memory
+	// we pass into makeAbsoluteSD, and that happens outside the view of the GC.
+	// We therefore take some care here to then verify the pointers are as we expect
+	// and set them explicitly in view of the GC. See https://go.dev/issue/73199.
+	// TODO: consider weak pointers once Go 1.24 is appropriate. See suggestion in https://go.dev/cl/663575.
 	err = makeAbsoluteSD(selfRelativeSD, absoluteSD, &absoluteSDSize,
 		dacl, &daclSize, sacl, &saclSize, owner, &ownerSize, group, &groupSize)
+	if err != nil {
+		// Don't return absoluteSD, which might be partially initialized.
+		return nil, err
+	}
+	// Before using any fields, verify absoluteSD is in the format we expect according to Windows.
+	// See https://learn.microsoft.com/en-us/windows/win32/secauthz/absolute-and-self-relative-security-descriptors
+	absControl, _, err := absoluteSD.Control()
+	if err != nil {
+		panic("absoluteSD: " + err.Error())
+	}
+	if absControl&SE_SELF_RELATIVE != 0 {
+		panic("absoluteSD not in absolute format")
+	}
+	if absoluteSD.dacl != dacl {
+		panic("dacl pointer mismatch")
+	}
+	if absoluteSD.sacl != sacl {
+		panic("sacl pointer mismatch")
+	}
+	if absoluteSD.owner != owner {
+		panic("owner pointer mismatch")
+	}
+	if absoluteSD.group != group {
+		panic("group pointer mismatch")
+	}
+	absoluteSD.dacl = dacl
+	absoluteSD.sacl = sacl
+	absoluteSD.owner = owner
+	absoluteSD.group = group
+
 	return
 }
 
diff --git a/source/vendor/golang.org/x/sys/windows/syscall_windows.go b/source/vendor/golang.org/x/sys/windows/syscall_windows.go
index 4a32543..640f6b1 100644
--- a/source/vendor/golang.org/x/sys/windows/syscall_windows.go
+++ b/source/vendor/golang.org/x/sys/windows/syscall_windows.go
@@ -870,6 +870,7 @@ const socket_error = uintptr(^uint32(0))
 //sys	WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32,  from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecvFrom
 //sys	WSASendTo(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to *RawSockaddrAny, tolen int32,  overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASendTo
 //sys	WSASocket(af int32, typ int32, protocol int32, protoInfo *WSAProtocolInfo, group uint32, flags uint32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.WSASocketW
+//sys	WSADuplicateSocket(s Handle, processID uint32, info *WSAProtocolInfo) (err error) [failretval!=0] = ws2_32.WSADuplicateSocketW
 //sys	GetHostByName(name string) (h *Hostent, err error) [failretval==nil] = ws2_32.gethostbyname
 //sys	GetServByName(name string, proto string) (s *Servent, err error) [failretval==nil] = ws2_32.getservbyname
 //sys	Ntohs(netshort uint16) (u uint16) = ws2_32.ntohs
@@ -1698,8 +1699,9 @@ func NewNTUnicodeString(s string) (*NTUnicodeString, error) {
 
 // Slice returns a uint16 slice that aliases the data in the NTUnicodeString.
 func (s *NTUnicodeString) Slice() []uint16 {
-	slice := unsafe.Slice(s.Buffer, s.MaximumLength)
-	return slice[:s.Length]
+	// Note: this rounds the length down, if it happens
+	// to (incorrectly) be odd. Probably safer than rounding up.
+	return unsafe.Slice(s.Buffer, s.MaximumLength/2)[:s.Length/2]
 }
 
 func (s *NTUnicodeString) String() string {
diff --git a/source/vendor/golang.org/x/sys/windows/types_windows.go b/source/vendor/golang.org/x/sys/windows/types_windows.go
index 9d138de..958bcf4 100644
--- a/source/vendor/golang.org/x/sys/windows/types_windows.go
+++ b/source/vendor/golang.org/x/sys/windows/types_windows.go
@@ -1074,6 +1074,7 @@ const (
 	IP_ADD_MEMBERSHIP  = 0xc
 	IP_DROP_MEMBERSHIP = 0xd
 	IP_PKTINFO         = 0x13
+	IP_MTU_DISCOVER    = 0x47
 
 	IPV6_V6ONLY         = 0x1b
 	IPV6_UNICAST_HOPS   = 0x4
@@ -1083,6 +1084,7 @@ const (
 	IPV6_JOIN_GROUP     = 0xc
 	IPV6_LEAVE_GROUP    = 0xd
 	IPV6_PKTINFO        = 0x13
+	IPV6_MTU_DISCOVER   = 0x47
 
 	MSG_OOB       = 0x1
 	MSG_PEEK      = 0x2
@@ -1132,6 +1134,15 @@ const (
 	WSASYS_STATUS_LEN  = 128
 )
 
+// enum PMTUD_STATE from ws2ipdef.h
+const (
+	IP_PMTUDISC_NOT_SET = 0
+	IP_PMTUDISC_DO      = 1
+	IP_PMTUDISC_DONT    = 2
+	IP_PMTUDISC_PROBE   = 3
+	IP_PMTUDISC_MAX     = 4
+)
+
 type WSABuf struct {
 	Len uint32
 	Buf *byte
@@ -1146,6 +1157,22 @@ type WSAMsg struct {
 	Flags       uint32
 }
 
+type WSACMSGHDR struct {
+	Len   uintptr
+	Level int32
+	Type  int32
+}
+
+type IN_PKTINFO struct {
+	Addr    [4]byte
+	Ifindex uint32
+}
+
+type IN6_PKTINFO struct {
+	Addr    [16]byte
+	Ifindex uint32
+}
+
 // Flags for WSASocket
 const (
 	WSA_FLAG_OVERLAPPED             = 0x01
@@ -2673,6 +2700,8 @@ type CommTimeouts struct {
 
 // NTUnicodeString is a UTF-16 string for NT native APIs, corresponding to UNICODE_STRING.
 type NTUnicodeString struct {
+	// Note: Length and MaximumLength are in *bytes*, not uint16s.
+	// They should always be even.
 	Length        uint16
 	MaximumLength uint16
 	Buffer        *uint16
@@ -3601,3 +3630,213 @@ const (
 	KLF_NOTELLSHELL   = 0x00000080
 	KLF_SETFORPROCESS = 0x00000100
 )
+
+// Virtual Key codes
+// https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
+const (
+	VK_LBUTTON             = 0x01
+	VK_RBUTTON             = 0x02
+	VK_CANCEL              = 0x03
+	VK_MBUTTON             = 0x04
+	VK_XBUTTON1            = 0x05
+	VK_XBUTTON2            = 0x06
+	VK_BACK                = 0x08
+	VK_TAB                 = 0x09
+	VK_CLEAR               = 0x0C
+	VK_RETURN              = 0x0D
+	VK_SHIFT               = 0x10
+	VK_CONTROL             = 0x11
+	VK_MENU                = 0x12
+	VK_PAUSE               = 0x13
+	VK_CAPITAL             = 0x14
+	VK_KANA                = 0x15
+	VK_HANGEUL             = 0x15
+	VK_HANGUL              = 0x15
+	VK_IME_ON              = 0x16
+	VK_JUNJA               = 0x17
+	VK_FINAL               = 0x18
+	VK_HANJA               = 0x19
+	VK_KANJI               = 0x19
+	VK_IME_OFF             = 0x1A
+	VK_ESCAPE              = 0x1B
+	VK_CONVERT             = 0x1C
+	VK_NONCONVERT          = 0x1D
+	VK_ACCEPT              = 0x1E
+	VK_MODECHANGE          = 0x1F
+	VK_SPACE               = 0x20
+	VK_PRIOR               = 0x21
+	VK_NEXT                = 0x22
+	VK_END                 = 0x23
+	VK_HOME                = 0x24
+	VK_LEFT                = 0x25
+	VK_UP                  = 0x26
+	VK_RIGHT               = 0x27
+	VK_DOWN                = 0x28
+	VK_SELECT              = 0x29
+	VK_PRINT               = 0x2A
+	VK_EXECUTE             = 0x2B
+	VK_SNAPSHOT            = 0x2C
+	VK_INSERT              = 0x2D
+	VK_DELETE              = 0x2E
+	VK_HELP                = 0x2F
+	VK_LWIN                = 0x5B
+	VK_RWIN                = 0x5C
+	VK_APPS                = 0x5D
+	VK_SLEEP               = 0x5F
+	VK_NUMPAD0             = 0x60
+	VK_NUMPAD1             = 0x61
+	VK_NUMPAD2             = 0x62
+	VK_NUMPAD3             = 0x63
+	VK_NUMPAD4             = 0x64
+	VK_NUMPAD5             = 0x65
+	VK_NUMPAD6             = 0x66
+	VK_NUMPAD7             = 0x67
+	VK_NUMPAD8             = 0x68
+	VK_NUMPAD9             = 0x69
+	VK_MULTIPLY            = 0x6A
+	VK_ADD                 = 0x6B
+	VK_SEPARATOR           = 0x6C
+	VK_SUBTRACT            = 0x6D
+	VK_DECIMAL             = 0x6E
+	VK_DIVIDE              = 0x6F
+	VK_F1                  = 0x70
+	VK_F2                  = 0x71
+	VK_F3                  = 0x72
+	VK_F4                  = 0x73
+	VK_F5                  = 0x74
+	VK_F6                  = 0x75
+	VK_F7                  = 0x76
+	VK_F8                  = 0x77
+	VK_F9                  = 0x78
+	VK_F10                 = 0x79
+	VK_F11                 = 0x7A
+	VK_F12                 = 0x7B
+	VK_F13                 = 0x7C
+	VK_F14                 = 0x7D
+	VK_F15                 = 0x7E
+	VK_F16                 = 0x7F
+	VK_F17                 = 0x80
+	VK_F18                 = 0x81
+	VK_F19                 = 0x82
+	VK_F20                 = 0x83
+	VK_F21                 = 0x84
+	VK_F22                 = 0x85
+	VK_F23                 = 0x86
+	VK_F24                 = 0x87
+	VK_NUMLOCK             = 0x90
+	VK_SCROLL              = 0x91
+	VK_OEM_NEC_EQUAL       = 0x92
+	VK_OEM_FJ_JISHO        = 0x92
+	VK_OEM_FJ_MASSHOU      = 0x93
+	VK_OEM_FJ_TOUROKU      = 0x94
+	VK_OEM_FJ_LOYA         = 0x95
+	VK_OEM_FJ_ROYA         = 0x96
+	VK_LSHIFT              = 0xA0
+	VK_RSHIFT              = 0xA1
+	VK_LCONTROL            = 0xA2
+	VK_RCONTROL            = 0xA3
+	VK_LMENU               = 0xA4
+	VK_RMENU               = 0xA5
+	VK_BROWSER_BACK        = 0xA6
+	VK_BROWSER_FORWARD     = 0xA7
+	VK_BROWSER_REFRESH     = 0xA8
+	VK_BROWSER_STOP        = 0xA9
+	VK_BROWSER_SEARCH      = 0xAA
+	VK_BROWSER_FAVORITES   = 0xAB
+	VK_BROWSER_HOME        = 0xAC
+	VK_VOLUME_MUTE         = 0xAD
+	VK_VOLUME_DOWN         = 0xAE
+	VK_VOLUME_UP           = 0xAF
+	VK_MEDIA_NEXT_TRACK    = 0xB0
+	VK_MEDIA_PREV_TRACK    = 0xB1
+	VK_MEDIA_STOP          = 0xB2
+	VK_MEDIA_PLAY_PAUSE    = 0xB3
+	VK_LAUNCH_MAIL         = 0xB4
+	VK_LAUNCH_MEDIA_SELECT = 0xB5
+	VK_LAUNCH_APP1         = 0xB6
+	VK_LAUNCH_APP2         = 0xB7
+	VK_OEM_1               = 0xBA
+	VK_OEM_PLUS            = 0xBB
+	VK_OEM_COMMA           = 0xBC
+	VK_OEM_MINUS           = 0xBD
+	VK_OEM_PERIOD          = 0xBE
+	VK_OEM_2               = 0xBF
+	VK_OEM_3               = 0xC0
+	VK_OEM_4               = 0xDB
+	VK_OEM_5               = 0xDC
+	VK_OEM_6               = 0xDD
+	VK_OEM_7               = 0xDE
+	VK_OEM_8               = 0xDF
+	VK_OEM_AX              = 0xE1
+	VK_OEM_102             = 0xE2
+	VK_ICO_HELP            = 0xE3
+	VK_ICO_00              = 0xE4
+	VK_PROCESSKEY          = 0xE5
+	VK_ICO_CLEAR           = 0xE6
+	VK_OEM_RESET           = 0xE9
+	VK_OEM_JUMP            = 0xEA
+	VK_OEM_PA1             = 0xEB
+	VK_OEM_PA2             = 0xEC
+	VK_OEM_PA3             = 0xED
+	VK_OEM_WSCTRL          = 0xEE
+	VK_OEM_CUSEL           = 0xEF
+	VK_OEM_ATTN            = 0xF0
+	VK_OEM_FINISH          = 0xF1
+	VK_OEM_COPY            = 0xF2
+	VK_OEM_AUTO            = 0xF3
+	VK_OEM_ENLW            = 0xF4
+	VK_OEM_BACKTAB         = 0xF5
+	VK_ATTN                = 0xF6
+	VK_CRSEL               = 0xF7
+	VK_EXSEL               = 0xF8
+	VK_EREOF               = 0xF9
+	VK_PLAY                = 0xFA
+	VK_ZOOM                = 0xFB
+	VK_NONAME              = 0xFC
+	VK_PA1                 = 0xFD
+	VK_OEM_CLEAR           = 0xFE
+)
+
+// Mouse button constants.
+// https://docs.microsoft.com/en-us/windows/console/mouse-event-record-str
+const (
+	FROM_LEFT_1ST_BUTTON_PRESSED = 0x0001
+	RIGHTMOST_BUTTON_PRESSED     = 0x0002
+	FROM_LEFT_2ND_BUTTON_PRESSED = 0x0004
+	FROM_LEFT_3RD_BUTTON_PRESSED = 0x0008
+	FROM_LEFT_4TH_BUTTON_PRESSED = 0x0010
+)
+
+// Control key state constaints.
+// https://docs.microsoft.com/en-us/windows/console/key-event-record-str
+// https://docs.microsoft.com/en-us/windows/console/mouse-event-record-str
+const (
+	CAPSLOCK_ON        = 0x0080
+	ENHANCED_KEY       = 0x0100
+	LEFT_ALT_PRESSED   = 0x0002
+	LEFT_CTRL_PRESSED  = 0x0008
+	NUMLOCK_ON         = 0x0020
+	RIGHT_ALT_PRESSED  = 0x0001
+	RIGHT_CTRL_PRESSED = 0x0004
+	SCROLLLOCK_ON      = 0x0040
+	SHIFT_PRESSED      = 0x0010
+)
+
+// Mouse event record event flags.
+// https://docs.microsoft.com/en-us/windows/console/mouse-event-record-str
+const (
+	MOUSE_MOVED    = 0x0001
+	DOUBLE_CLICK   = 0x0002
+	MOUSE_WHEELED  = 0x0004
+	MOUSE_HWHEELED = 0x0008
+)
+
+// Input Record Event Types
+// https://learn.microsoft.com/en-us/windows/console/input-record-str
+const (
+	FOCUS_EVENT              = 0x0010
+	KEY_EVENT                = 0x0001
+	MENU_EVENT               = 0x0008
+	MOUSE_EVENT              = 0x0002
+	WINDOW_BUFFER_SIZE_EVENT = 0x0004
+)
diff --git a/source/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/source/vendor/golang.org/x/sys/windows/zsyscall_windows.go
index 01c0716..a58bc48 100644
--- a/source/vendor/golang.org/x/sys/windows/zsyscall_windows.go
+++ b/source/vendor/golang.org/x/sys/windows/zsyscall_windows.go
@@ -511,6 +511,7 @@ var (
 	procFreeAddrInfoW                                        = modws2_32.NewProc("FreeAddrInfoW")
 	procGetAddrInfoW                                         = modws2_32.NewProc("GetAddrInfoW")
 	procWSACleanup                                           = modws2_32.NewProc("WSACleanup")
+	procWSADuplicateSocketW                                  = modws2_32.NewProc("WSADuplicateSocketW")
 	procWSAEnumProtocolsW                                    = modws2_32.NewProc("WSAEnumProtocolsW")
 	procWSAGetOverlappedResult                               = modws2_32.NewProc("WSAGetOverlappedResult")
 	procWSAIoctl                                             = modws2_32.NewProc("WSAIoctl")
@@ -4391,6 +4392,14 @@ func WSACleanup() (err error) {
 	return
 }
 
+func WSADuplicateSocket(s Handle, processID uint32, info *WSAProtocolInfo) (err error) {
+	r1, _, e1 := syscall.Syscall(procWSADuplicateSocketW.Addr(), 3, uintptr(s), uintptr(processID), uintptr(unsafe.Pointer(info)))
+	if r1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
 func WSAEnumProtocols(protocols *int32, protocolBuffer *WSAProtocolInfo, bufferLength *uint32) (n int32, err error) {
 	r0, _, e1 := syscall.Syscall(procWSAEnumProtocolsW.Addr(), 3, uintptr(unsafe.Pointer(protocols)), uintptr(unsafe.Pointer(protocolBuffer)), uintptr(unsafe.Pointer(bufferLength)))
 	n = int32(r0)
diff --git a/source/vendor/modules.txt b/source/vendor/modules.txt
index be3d7a6..2f6df74 100644
--- a/source/vendor/modules.txt
+++ b/source/vendor/modules.txt
@@ -1,8 +1,8 @@
 # github.com/andybalholm/cascadia v1.3.3
 ## explicit; go 1.16
 github.com/andybalholm/cascadia
-# github.com/aws/aws-sdk-go-v2 v1.36.1
-## explicit; go 1.21
+# github.com/aws/aws-sdk-go-v2 v1.36.3
+## explicit; go 1.22
 github.com/aws/aws-sdk-go-v2/aws
 github.com/aws/aws-sdk-go-v2/aws/defaults
 github.com/aws/aws-sdk-go-v2/aws/middleware
@@ -27,11 +27,11 @@ github.com/aws/aws-sdk-go-v2/internal/shareddefaults
 github.com/aws/aws-sdk-go-v2/internal/strings
 github.com/aws/aws-sdk-go-v2/internal/sync/singleflight
 github.com/aws/aws-sdk-go-v2/internal/timeconv
-# github.com/aws/aws-sdk-go-v2/config v1.29.6
-## explicit; go 1.21
+# github.com/aws/aws-sdk-go-v2/config v1.29.14
+## explicit; go 1.22
 github.com/aws/aws-sdk-go-v2/config
-# github.com/aws/aws-sdk-go-v2/credentials v1.17.59
-## explicit; go 1.21
+# github.com/aws/aws-sdk-go-v2/credentials v1.17.67
+## explicit; go 1.22
 github.com/aws/aws-sdk-go-v2/credentials
 github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds
 github.com/aws/aws-sdk-go-v2/credentials/endpointcreds
@@ -39,47 +39,47 @@ github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/internal/client
 github.com/aws/aws-sdk-go-v2/credentials/processcreds
 github.com/aws/aws-sdk-go-v2/credentials/ssocreds
 github.com/aws/aws-sdk-go-v2/credentials/stscreds
-# github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.28
-## explicit; go 1.21
+# github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30
+## explicit; go 1.22
 github.com/aws/aws-sdk-go-v2/feature/ec2/imds
 github.com/aws/aws-sdk-go-v2/feature/ec2/imds/internal/config
-# github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.32
-## explicit; go 1.21
+# github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34
+## explicit; go 1.22
 github.com/aws/aws-sdk-go-v2/internal/configsources
-# github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.32
-## explicit; go 1.21
+# github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34
+## explicit; go 1.22
 github.com/aws/aws-sdk-go-v2/internal/endpoints/v2
-# github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2
-## explicit; go 1.21
+# github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3
+## explicit; go 1.22
 github.com/aws/aws-sdk-go-v2/internal/ini
-# github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2
-## explicit; go 1.21
+# github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3
+## explicit; go 1.22
 github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding
-# github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.13
-## explicit; go 1.21
+# github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15
+## explicit; go 1.22
 github.com/aws/aws-sdk-go-v2/service/internal/presigned-url
-# github.com/aws/aws-sdk-go-v2/service/sso v1.24.15
-## explicit; go 1.21
+# github.com/aws/aws-sdk-go-v2/service/sso v1.25.3
+## explicit; go 1.22
 github.com/aws/aws-sdk-go-v2/service/sso
 github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints
 github.com/aws/aws-sdk-go-v2/service/sso/types
-# github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.14
-## explicit; go 1.21
+# github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1
+## explicit; go 1.22
 github.com/aws/aws-sdk-go-v2/service/ssooidc
 github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints
 github.com/aws/aws-sdk-go-v2/service/ssooidc/types
-# github.com/aws/aws-sdk-go-v2/service/sts v1.33.14
-## explicit; go 1.21
+# github.com/aws/aws-sdk-go-v2/service/sts v1.33.19
+## explicit; go 1.22
 github.com/aws/aws-sdk-go-v2/service/sts
 github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints
 github.com/aws/aws-sdk-go-v2/service/sts/types
-# github.com/aws/aws-sdk-go-v2/service/translate v1.28.17
-## explicit; go 1.21
+# github.com/aws/aws-sdk-go-v2/service/translate v1.29.2
+## explicit; go 1.22
 github.com/aws/aws-sdk-go-v2/service/translate
 github.com/aws/aws-sdk-go-v2/service/translate/internal/endpoints
 github.com/aws/aws-sdk-go-v2/service/translate/types
-# github.com/aws/smithy-go v1.22.2
-## explicit; go 1.21
+# github.com/aws/smithy-go v1.22.3
+## explicit; go 1.22
 github.com/aws/smithy-go
 github.com/aws/smithy-go/auth
 github.com/aws/smithy-go/auth/bearer
@@ -105,18 +105,27 @@ github.com/aws/smithy-go/transport/http/internal/io
 # github.com/aymanbagabas/go-osc52/v2 v2.0.1
 ## explicit; go 1.16
 github.com/aymanbagabas/go-osc52/v2
-# github.com/charmbracelet/lipgloss v1.0.0
+# github.com/charmbracelet/colorprofile v0.3.1
+## explicit; go 1.23.0
+github.com/charmbracelet/colorprofile
+# github.com/charmbracelet/lipgloss v1.1.0
 ## explicit; go 1.18
 github.com/charmbracelet/lipgloss
-# github.com/charmbracelet/log v0.4.0
+# github.com/charmbracelet/log v0.4.1
 ## explicit; go 1.19
 github.com/charmbracelet/log
-# github.com/charmbracelet/x/ansi v0.8.0
-## explicit; go 1.18
+# github.com/charmbracelet/x/ansi v0.9.2
+## explicit; go 1.23.0
 github.com/charmbracelet/x/ansi
 github.com/charmbracelet/x/ansi/kitty
 github.com/charmbracelet/x/ansi/parser
-# github.com/evanw/esbuild v0.25.0
+# github.com/charmbracelet/x/cellbuf v0.0.13
+## explicit; go 1.18
+github.com/charmbracelet/x/cellbuf
+# github.com/charmbracelet/x/term v0.2.1
+## explicit; go 1.18
+github.com/charmbracelet/x/term
+# github.com/evanw/esbuild v0.25.4
 ## explicit; go 1.13
 github.com/evanw/esbuild/internal/api_helpers
 github.com/evanw/esbuild/internal/ast
@@ -157,20 +166,23 @@ github.com/mattn/go-isatty
 # github.com/mattn/go-runewidth v0.0.16
 ## explicit; go 1.9
 github.com/mattn/go-runewidth
-# github.com/muesli/termenv v0.15.2
+# github.com/muesli/termenv v0.16.0
 ## explicit; go 1.17
 github.com/muesli/termenv
 # github.com/rivo/uniseg v0.4.7
 ## explicit; go 1.18
 github.com/rivo/uniseg
-# github.com/tdewolff/parse/v2 v2.7.20
-## explicit; go 1.13
+# github.com/tdewolff/parse/v2 v2.8.0
+## explicit; go 1.11
 github.com/tdewolff/parse/v2
 github.com/tdewolff/parse/v2/buffer
 github.com/tdewolff/parse/v2/css
 # github.com/volker-schukai/tokenizer v1.0.0
 ## explicit; go 1.13
 github.com/volker-schukai/tokenizer
+# github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e
+## explicit; go 1.19
+github.com/xo/terminfo
 # gitlab.schukai.com/oss/libraries/go/application/xflags.git v1.16.5
 ## explicit; go 1.22
 gitlab.schukai.com/oss/libraries/go/application/xflags.git
@@ -183,22 +195,22 @@ gitlab.schukai.com/oss/libraries/go/utilities/data.git
 # gitlab.schukai.com/oss/libraries/go/utilities/pathfinder.git v0.9.5
 ## explicit; go 1.21
 gitlab.schukai.com/oss/libraries/go/utilities/pathfinder.git
-# golang.org/x/crypto v0.33.0
-## explicit; go 1.20
+# golang.org/x/crypto v0.38.0
+## explicit; go 1.23.0
 golang.org/x/crypto/bcrypt
 golang.org/x/crypto/blowfish
-# golang.org/x/exp v0.0.0-20250207012021-f9890c6ad9f3
-## explicit; go 1.22.0
+# golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6
+## explicit; go 1.23.0
 golang.org/x/exp/slices
 golang.org/x/exp/slog
 golang.org/x/exp/slog/internal
 golang.org/x/exp/slog/internal/buffer
-# golang.org/x/net v0.34.0
-## explicit; go 1.18
+# golang.org/x/net v0.40.0
+## explicit; go 1.23.0
 golang.org/x/net/html
 golang.org/x/net/html/atom
-# golang.org/x/sys v0.30.0
-## explicit; go 1.18
+# golang.org/x/sys v0.33.0
+## explicit; go 1.23.0
 golang.org/x/sys/unix
 golang.org/x/sys/windows
 # gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c
-- 
GitLab